From d1affc4340ecb55a8d5251aaab0de7a106bc375c Mon Sep 17 00:00:00 2001 From: Rat Date: Sun, 20 Nov 2011 18:28:18 +0100 Subject: Initial Commit for client version change to 4.2.2 (14545) - added known opcodes (handlers are commented till not updated) - added bitstream support to bytebuffer - updated realm auth for 14545 - updated world auth - fixed char_enum,create,delete handlers - added DB2 reader - added opcode logging to debuglogmask (ignores loglevel) - fixed compile in win64, others not yet tested - using db2 values for item models at char_enum to prevent client crash Lots of Thanks to All SingularityCore Members --- src/server/scripts/Commands/cs_debug.cpp | 2 +- src/server/scripts/Commands/cs_gm.cpp | 2 +- src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp | 4 ++-- .../EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp | 6 ++---- src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp | 6 ++---- 5 files changed, 8 insertions(+), 12 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 9e1d5717f1f..d47b04f3bcb 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -307,7 +307,7 @@ public: uint32 opcode; parsedStream >> opcode; - WorldPacket data(opcode, 0); + WorldPacket data(Opcodes(opcode), 0); while (!parsedStream.eof()) { diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index ab077af0863..6135e231c24 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -95,7 +95,7 @@ public: if (!target) target = handler->GetSession()->GetPlayer(); - WorldPacket data(12); + WorldPacket data; if (strncmp(args, "on", 3) == 0) data.SetOpcode(SMSG_MOVE_SET_CAN_FLY); else if (strncmp(args, "off", 4) == 0) diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index ae0042dcfa5..ad1da3896c5 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -236,7 +236,7 @@ class instance_deadmines : public InstanceMapScript void DoPlaySound(GameObject* unit, uint32 sound) { - WorldPacket data(4); + WorldPacket data; data.SetOpcode(SMSG_PLAY_SOUND); data << uint32(sound); unit->SendMessageToSet(&data, false); @@ -244,7 +244,7 @@ class instance_deadmines : public InstanceMapScript void DoPlaySoundCreature(Unit* unit, uint32 sound) { - WorldPacket data(4); + WorldPacket data; data.SetOpcode(SMSG_PLAY_SOUND); data << uint32(sound); unit->SendMessageToSet(&data, false); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index c64fc6f2dab..cc3a8ca7109 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -241,8 +241,7 @@ public: // Also needs an exception in spell system. unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_FLY, true, 0, 0, me->GetGUID()); // Use packet hack - WorldPacket data(12); - data.SetOpcode(SMSG_MOVE_SET_CAN_FLY); + WorldPacket data(SMSG_MOVE_SET_CAN_FLY, 12); data.append(unit->GetPackGUID()); data << uint32(0); unit->SendMessageToSet(&data, true); @@ -261,8 +260,7 @@ public: unit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); unit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT); - WorldPacket data(12); - data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); + WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY, 12); data.append(unit->GetPackGUID()); data << uint32(0); unit->SendMessageToSet(&data, true); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index d987601c5bd..0a91828024c 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -922,8 +922,7 @@ class boss_kaelthas : public CreatureScript unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_AURA, true, 0, 0, me->GetGUID()); //Using packet workaround - WorldPacket data(12); - data.SetOpcode(SMSG_MOVE_SET_CAN_FLY); + WorldPacket data(SMSG_MOVE_SET_CAN_FLY, 12); data.append(unit->GetPackGUID()); data << uint32(0); unit->SendMessageToSet(&data, true); @@ -949,8 +948,7 @@ class boss_kaelthas : public CreatureScript if (Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid())) { //Using packet workaround - WorldPacket data(12); - data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); + WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY, 12); data.append(unit->GetPackGUID()); data << uint32(0); unit->SendMessageToSet(&data, true); -- cgit v1.2.3 From 05880cc748cfd5d4d44d15631aacacee1645a512 Mon Sep 17 00:00:00 2001 From: Rat Date: Thu, 24 Nov 2011 13:43:41 +0100 Subject: Core/DataStores: -dropped dbcstring/db2string, use simple nonconstant char* (will be useable when loading custom data from db to dbc) -fixed most dbc string related errors (you can now turn on logging) --- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 2 +- src/server/game/Chat/ChatLink.cpp | 47 +++--- src/server/game/Chat/ChatLink.h | 2 +- src/server/game/Chat/Commands/Level1.cpp | 4 +- src/server/game/Chat/Commands/Level2.cpp | 6 +- src/server/game/Chat/Commands/Level3.cpp | 12 +- src/server/game/DataStores/DB2Structure.h | 10 +- src/server/game/DataStores/DBCStores.cpp | 2 +- src/server/game/DataStores/DBCStructure.h | 158 ++++++++++----------- src/server/game/Entities/Pet/Pet.cpp | 4 +- src/server/game/Entities/Player/Player.cpp | 6 +- src/server/game/Maps/Map.cpp | 2 +- src/server/game/Maps/MapManager.cpp | 2 +- .../game/Server/Protocol/Handlers/MailHandler.cpp | 2 +- src/server/game/Spells/SpellInfo.h | 4 +- src/server/scripts/Commands/cs_gps.cpp | 6 +- src/server/scripts/Commands/cs_titles.cpp | 4 +- src/server/shared/Define.h | 5 +- 18 files changed, 130 insertions(+), 148 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 761d1335608..4fb3f395387 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -618,7 +618,7 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPacket& data, Player* player if (itemRandProp) { - DBCString temp = itemRandProp->nameSuffix; + char* temp = itemRandProp->nameSuffix; //char* temp = itemRandProp->nameSuffix; // dbc local name diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 8a91de1969c..dade99c7dc7 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -165,7 +165,7 @@ bool ItemChatLink::Initialize(std::istringstream& iss) return true; } -inline std::string ItemChatLink::FormatName(uint8 index, ItemLocale const *locale, DBCString suffixStrings) const +inline std::string ItemChatLink::FormatName(uint8 index, ItemLocale const *locale, char* suffixStrings) const { std::stringstream ss; if (locale == NULL || index >= locale->Name.size()) @@ -181,7 +181,7 @@ bool ItemChatLink::ValidateName(char* buffer, const char* context) { ChatLink::ValidateName(buffer, context); - DBCString suffixStrings = _suffix ? _suffix->nameSuffix : (_property ? _property->nameSuffix : NULL); + char* suffixStrings = _suffix ? _suffix->nameSuffix : (_property ? _property->nameSuffix : NULL); bool res = (FormatName(LOCALE_enUS, NULL, suffixStrings) == buffer); if (!res) @@ -304,30 +304,21 @@ bool SpellChatLink::ValidateName(char* buffer, const char* context) return false; } - for (uint8 i = 0; i < TOTAL_LOCALES; ++i) + uint32 skillLineNameLength = strlen(skillLine->name); + if (skillLineNameLength > 0 && strncmp(skillLine->name, buffer, skillLineNameLength) == 0) { - uint32 skillLineNameLength = strlen(skillLine->name[i]); - if (skillLineNameLength > 0 && strncmp(skillLine->name[i], buffer, skillLineNameLength) == 0) - { - // found the prefix, remove it to perform spellname validation below - // -2 = strlen(": ") - uint32 spellNameLength = strlen(buffer) - skillLineNameLength - 2; - memcpy(buffer, buffer + skillLineNameLength + 2, spellNameLength + 1); - } + // found the prefix, remove it to perform spellname validation below + // -2 = strlen(": ") + uint32 spellNameLength = strlen(buffer) - skillLineNameLength - 2; + memcpy(buffer, buffer + skillLineNameLength + 2, spellNameLength + 1); } } - bool res = false; - for (uint8 i = 0; i < TOTAL_LOCALES; ++i) - if (*_spell->SpellName[i] && strcmp(_spell->SpellName[i], buffer) == 0) - { - res = true; - break; - } + if (*_spell->SpellName && strcmp(_spell->SpellName, buffer) == 0) + return true; - if (!res) - sLog->outDebug(LOG_FILTER_CHATSYS, "ChatHandler::isValidChatMessage('%s'): linked spell (id: %u) name wasn't found in any localization", context, _spell->Id); - return res; + sLog->outDebug(LOG_FILTER_CHATSYS, "ChatHandler::isValidChatMessage('%s'): linked spell (id: %u) name wasn't found in any localization", context, _spell->Id); + return false; } // |color|Hachievement:achievement_id:player_guid:0:0:0:0:0:0:0:0|h[name]|h|r @@ -379,17 +370,11 @@ bool AchievementChatLink::ValidateName(char* buffer, const char* context) { ChatLink::ValidateName(buffer, context); - bool res = false; - for (uint8 i = 0; i < TOTAL_LOCALES; ++i) - if (*_achievement->name[i] && strcmp(_achievement->name[i], buffer) == 0) - { - res = true; - break; - } + if (*_achievement->name && strcmp(_achievement->name, buffer) == 0) + return true; - if (!res) - sLog->outDebug(LOG_FILTER_CHATSYS, "ChatHandler::isValidChatMessage('%s'): linked achievement (id: %u) name wasn't found in any localization", context, _achievement->ID); - return res; + sLog->outDebug(LOG_FILTER_CHATSYS, "ChatHandler::isValidChatMessage('%s'): linked achievement (id: %u) name wasn't found in any localization", context, _achievement->ID); + return false; } // |color|Htrade:spell_id:cur_value:max_value:player_guid:base64_data|h[name]|h|r diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h index 1eb6c9b03f7..51cc023f0d4 100644 --- a/src/server/game/Chat/ChatLink.h +++ b/src/server/game/Chat/ChatLink.h @@ -61,7 +61,7 @@ public: virtual bool ValidateName(char* buffer, const char* context); protected: - std::string FormatName(uint8 index, ItemLocale const* locale, DBCString suffixStrings) const; + std::string FormatName(uint8 index, ItemLocale const* locale, char* suffixStrings) const; ItemTemplate const* _item; int32 _data[8]; diff --git a/src/server/game/Chat/Commands/Level1.cpp b/src/server/game/Chat/Commands/Level1.cpp index f06f8a7e89c..042630409e3 100755 --- a/src/server/game/Chat/Commands/Level1.cpp +++ b/src/server/game/Chat/Commands/Level1.cpp @@ -480,7 +480,7 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) if (areaEntry) { int loc = GetSessionDbcLocale (); - std::string name = areaEntry->area_name[loc]; + std::string name = areaEntry->area_name; if (name.empty()) continue; @@ -492,7 +492,7 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) if (loc == GetSessionDbcLocale ()) continue; - name = areaEntry->area_name[loc]; + name = areaEntry->area_name; if (name.empty ()) continue; diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp index 295ab1fbf99..a5dc27c233a 100755 --- a/src/server/game/Chat/Commands/Level2.cpp +++ b/src/server/game/Chat/Commands/Level2.cpp @@ -566,7 +566,7 @@ bool ChatHandler::HandleCharacterReputationCommand(const char* args) { const FactionState& faction = itr->second; FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction.ID); - char const* factionName = factionEntry ? factionEntry->name[loc] : "#Not found#"; + char const* factionName = factionEntry ? factionEntry->name : "#Not found#"; ReputationRank rank = target->GetReputationMgr().GetRank(factionEntry); std::string rankName = GetTrinityString(ReputationRankStrIndex[rank]); std::ostringstream ss; @@ -1007,7 +1007,7 @@ bool ChatHandler::HandleLookupTitleCommand(const char* args) if (titleInfo) { int loc = GetSessionDbcLocale(); - std::string name = titleInfo->name[loc]; + std::string name = titleInfo->name; if (name.empty()) continue; @@ -1079,7 +1079,7 @@ bool ChatHandler::HandleCharacterTitlesCommand(const char* args) CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(id); if (titleInfo && target->HasTitle(titleInfo)) { - std::string name = titleInfo->name[loc]; + std::string name = titleInfo->name; if (name.empty()) continue; diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index f4f5892b587..54f4ae4bdeb 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -846,7 +846,7 @@ bool ChatHandler::HandleLookupItemSetCommand(const char *args) if (set) { int loc = GetSessionDbcLocale(); - std::string name = set->name[loc]; + std::string name = set->name; if (name.empty()) continue; @@ -919,7 +919,7 @@ bool ChatHandler::HandleLookupSkillCommand(const char *args) if (skillInfo) { int loc = GetSessionDbcLocale(); - std::string name = skillInfo->name[loc]; + std::string name = skillInfo->name; if (name.empty()) continue; @@ -1006,7 +1006,7 @@ bool ChatHandler::HandleLookupSpellCommand(const char *args) if (spellInfo) { int loc = GetSessionDbcLocale(); - std::string name = spellInfo->SpellName[loc]; + std::string name = spellInfo->SpellName; if (name.empty()) continue; @@ -1393,7 +1393,7 @@ bool ChatHandler::HandleLookupFactionCommand(const char *args) FactionState const* repState = target ? target->GetReputationMgr().GetState(factionEntry) : NULL; int loc = GetSessionDbcLocale(); - std::string name = factionEntry->name[loc]; + std::string name = factionEntry->name; if (name.empty()) continue; @@ -1491,7 +1491,7 @@ bool ChatHandler::HandleLookupTaxiNodeCommand(const char * args) if (nodeEntry) { int loc = GetSessionDbcLocale(); - std::string name = nodeEntry->name[loc]; + std::string name = nodeEntry->name; if (name.empty()) continue; @@ -2415,7 +2415,7 @@ bool ChatHandler::HandleListAurasCommand (const char * /*args*/) AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); - char const* name = aura->GetSpellInfo()->SpellName[GetSessionDbcLocale()]; + char const* name = aura->GetSpellInfo()->SpellName; std::ostringstream ss_name; ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r"; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 59dbfc710c3..1681bdfaae1 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -81,11 +81,11 @@ struct ItemSparseEntry int32 SpellCategory[MAX_ITEM_PROTO_SPELLS]; // 85 - 89 int32 SpellCategoryCooldown[MAX_ITEM_PROTO_SPELLS]; // 90 - 94 uint32 Bonding; // 95 - DB2String Name; // 96 - DB2String Name2; // 97 - DB2String Name3; // 98 - DB2String Name4; // 99 - DB2String Description; // 100 + char* Name; // 96 + char* Name2; // 97 + char* Name3; // 98 + char* Name4; // 99 + char* Description; // 100 uint32 PageText; // 101 uint32 LanguageID; // 102 uint32 PageMaterial; // 103 diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 4202b3fc2d4..82910d296af 100755 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -738,7 +738,7 @@ char const* GetPetName(uint32 petfamily, uint32 dbclang) CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(petfamily); if (!pet_family) return NULL; - return pet_family->Name[dbclang]?pet_family->Name[dbclang]:NULL; + return pet_family->Name ? pet_family->Name : NULL; } SpellEffectEntry const* GetSpellEffectEntry(uint32 spellId, uint32 effect) diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 208099a5cb2..6af4504f52a 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -44,14 +44,14 @@ struct AchievementEntry int32 requiredFaction; // 1 -1=all, 0=horde, 1=alliance int32 mapID; // 2 -1=none //uint32 parentAchievement; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) - DBCString name; // 4 - //DBCString description; // 5 + char* name; // 4 + //char* description; // 5 uint32 categoryId; // 6 uint32 points; // 7 reward points //uint32 OrderInCategory; // 8 uint32 flags; // 9 //uint32 icon; // 10 icon (from SpellIcon.dbc) - //DBCString reward; // 11 + //char* reward; // 11 uint32 count; // 12 - need this count of completed criterias (own or referenced achievement criterias) uint32 refAchievement; // 13 - referenced achievement (counting of all completed criterias) }; @@ -60,7 +60,7 @@ struct AchievementCategoryEntry { uint32 ID; // 0 uint32 parentCategory; // 1 -1 for main category - //DBCString name; // 2 + //char* name; // 2 //uint32 sortOrder; // 3 }; @@ -532,7 +532,7 @@ struct AreaTableEntry uint32 flags; // 4, unknown value but 312 for all cities // 5-9 unused int32 area_level; // 10 - DBCString area_name; // 11 + char* area_name; // 11 uint32 team; // 12 // 13-19 unknown //uint32 unk20; // 20 4.0.0 @@ -569,8 +569,8 @@ struct AreaPOIEntry uint32 mapId; //14 //uint32 val1; //15 uint32 zoneId; //16 - //DBCString name; //17 - name - //DBCString name2; //18 - name2 + //char* name; //17 - name + //char* name2; //18 - name2 uint32 worldState; //19 //uint32 val2; //20 //uint32 unk; //21 @@ -605,7 +605,7 @@ struct AuctionHouseEntry uint32 faction; // 1 id of faction.dbc for player factions associated with city uint32 depositPercent; // 2 1/3 from real uint32 cutPercent; // 3 - //DBCString name; // 4 + //char* name; // 4 }; struct BankBagSlotPricesEntry @@ -618,7 +618,7 @@ struct BarberShopStyleEntry { uint32 Id; // 0 uint32 type; // 1 value 0 -> hair, value 2 -> facialhair - //DBCString name; // 2 m_DisplayName_lang + //char* name; // 2 m_DisplayName_lang //uint32 unk_name; // 3 m_Description_lang //float CostMultiplier; // 4 m_Cost_Modifier uint32 race; // 5 m_race @@ -632,7 +632,7 @@ struct BattlemasterListEntry int32 mapid[8]; // 1-8 mapid uint32 type; // 9 (3 - BG, 4 - arena) //uint32 canJoinAsGroup; // 10 (0 or 1) - DBCString name; // 11 + char* name; // 11 uint32 maxGroupSize; // 12 maxGroupSize, used for checking if queue as group uint32 HolidayWorldStateId; // 13 new 3.1 uint32 minLevel; // 14, min level (sync with PvPDifficulty.dbc content) @@ -663,7 +663,7 @@ struct CharTitlesEntry { uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId() //uint32 unk1; // 1 flags? - DBCString name; // 2 m_name_lang + char* name; // 2 m_name_lang //char* name2; // 3 m_name1_lang uint32 bit_index; // 4 m_mask_ID used in PLAYER_CHOSEN_TITLE and 1<GetDisplayId()); if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family)) - SetName(cFamily->Name[sWorld->GetDefaultDbcLocale()]); + SetName(cFamily->Name); else SetName(creature->GetNameForLocaleIdx(sObjectMgr->GetDBCLocaleIndex())); @@ -729,7 +729,7 @@ bool Pet::CreateBaseAtCreatureInfo(CreatureTemplate const* cinfo, Unit* owner) return false; if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family)) - SetName(cFamily->Name[sWorld->GetDefaultDbcLocale()]); + SetName(cFamily->Name); Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation()); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d67324271ad..4550f9c6e58 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5619,7 +5619,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (!cMgr) return; - std::string current_zone_name = current_zone->area_name[GetSession()->GetSessionDbcLocale()]; + std::string current_zone_name = current_zone->area_name; for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i) { @@ -5655,7 +5655,7 @@ void Player::UpdateLocalChannels(uint32 newZone) else currentNameExt = current_zone_name.c_str(); - snprintf(new_channel_name_buf, 100, channel->pattern[m_session->GetSessionDbcLocale()], currentNameExt); + snprintf(new_channel_name_buf, 100, channel->pattern, currentNameExt); joinChannel = cMgr->GetJoinChannel(new_channel_name_buf, channel->ChannelID); if (usedChannel) @@ -5670,7 +5670,7 @@ void Player::UpdateLocalChannels(uint32 newZone) } } else - joinChannel = cMgr->GetJoinChannel(channel->pattern[m_session->GetSessionDbcLocale()], channel->ChannelID); + joinChannel = cMgr->GetJoinChannel(channel->pattern, channel->ChannelID); } else removeChannel = usedChannel; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index bd419482b5b..8e81f25ca9e 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1824,7 +1824,7 @@ bool Map::CheckGridIntegrity(Creature* c, bool moved) const const char* Map::GetMapName() const { - return i_mapEntry ? i_mapEntry->name[sWorld->GetDefaultDbcLocale()] : "UNNAMEDMAP\x0"; + return i_mapEntry ? i_mapEntry->name : "UNNAMEDMAP\x0"; } void Map::UpdateObjectVisibility(WorldObject* obj, Cell cell, CellCoord cellpair) diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index f31f1348b44..6131783c42c 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -181,7 +181,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck) if (player->isGameMaster()) return true; - char const* mapName = entry->name[player->GetSession()->GetSessionDbcLocale()]; + char const* mapName = entry->name; Group* group = player->GetGroup(); if (entry->IsRaid()) diff --git a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp index 785fcdbf067..26a9bd6c3aa 100755 --- a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp @@ -684,7 +684,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data) return; } - bodyItem->SetText(mailTemplateEntry->content[GetSessionDbcLocale()]); + bodyItem->SetText(mailTemplateEntry->content); } else bodyItem->SetText(m->body); diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index c6947372b0f..2414730fc75 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -374,8 +374,8 @@ public: uint32 SpellVisual[2]; uint32 SpellIconID; uint32 ActiveIconID; - DBCString SpellName; - DBCString Rank; + char* SpellName; + char* Rank; uint32 MaxTargetLevel; uint32 MaxAffectedTargets; uint32 SpellFamilyName; diff --git a/src/server/scripts/Commands/cs_gps.cpp b/src/server/scripts/Commands/cs_gps.cpp index bafaae465ef..6e67eebc5bc 100644 --- a/src/server/scripts/Commands/cs_gps.cpp +++ b/src/server/scripts/Commands/cs_gps.cpp @@ -110,9 +110,9 @@ public: handler->PSendSysMessage("no VMAP available for area info"); handler->PSendSysMessage(LANG_MAP_POSITION, - object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : ""), - zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : ""), - areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : ""), + object->GetMapId(), (mapEntry ? mapEntry->name : ""), + zoneId, (zoneEntry ? zoneEntry->area_name : ""), + areaId, (areaEntry ? areaEntry->area_name : ""), object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index 2fb22e0090d..2ffeea78575 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -138,7 +138,7 @@ public: char const* targetName = target->GetName(); char titleNameStr[80]; - snprintf(titleNameStr, 80, titleInfo->name[handler->GetSessionDbcLocale()], targetName); + snprintf(titleNameStr, 80, titleInfo->name, targetName); target->SetTitle(titleInfo); handler->PSendSysMessage(LANG_TITLE_ADD_RES, id, titleNameStr, tNameLink.c_str()); @@ -187,7 +187,7 @@ public: char const* targetName = target->GetName(); char titleNameStr[80]; - snprintf(titleNameStr, 80, titleInfo->name[handler->GetSessionDbcLocale()], targetName); + snprintf(titleNameStr, 80, titleInfo->name, targetName); handler->PSendSysMessage(LANG_TITLE_REMOVE_RES, id, titleNameStr, tNameLink.c_str()); diff --git a/src/server/shared/Define.h b/src/server/shared/Define.h index c590c3bf918..e86069948ba 100755 --- a/src/server/shared/Define.h +++ b/src/server/shared/Define.h @@ -79,10 +79,7 @@ typedef ACE_UINT32 uint32; typedef ACE_UINT16 uint16; typedef ACE_UINT8 uint8; -typedef char const* const* DBCString; //char* DBCStrings[MAX_LOCALE]; -typedef char const* const* DB2String; //char* DB2Strings[MAX_LOCALE]; - -enum +enum DBCFormer { FT_NA='x', //not used or unknown, 4 byte size FT_NA_BYTE='X', //not used or unknown, byte -- cgit v1.2.3 From ec54bb48952fb0f766c61976f736ad727f9aadd0 Mon Sep 17 00:00:00 2001 From: kaelima Date: Fri, 25 Nov 2011 18:54:59 +0100 Subject: Core/Misc: Clearing compile errors since UpdateFields were changed: - Completely remove ammo (Cataclysm change) - Revert some changes with power/maxpower and only store the 5 needed powers in db (the rest is useless) - Remove GuildId from corpse - Move PLAYER_GUILDID to character db (removed updatefield) Note: Compile is still not working as we need to change currency handling --- .../2011_11_25_03_characters_character_stats.sql | 7 + .../2011_11_25_03_characters_characters.sql | 9 + .../characters/2011_11_25_03_characters_corpse.sql | 1 + src/server/game/AI/EventAI/CreatureEventAI.cpp | 2 +- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 2 +- src/server/game/DataStores/DB2Stores.cpp | 2 +- src/server/game/Entities/Corpse/Corpse.cpp | 56 +++--- .../game/Entities/Object/Updates/UpdateFields.h | 12 -- src/server/game/Entities/Player/Player.cpp | 199 +++------------------ src/server/game/Entities/Player/Player.h | 29 ++- src/server/game/Entities/Unit/StatSystem.cpp | 10 -- src/server/game/Entities/Unit/Unit.cpp | 4 +- src/server/game/Globals/ObjectMgr.cpp | 2 +- src/server/game/Miscellaneous/SharedDefines.h | 2 + src/server/game/Spells/Auras/SpellAuraEffects.cpp | 10 +- src/server/game/Spells/Spell.cpp | 124 ------------- src/server/game/Spells/Spell.h | 3 +- src/server/game/Spells/SpellEffects.cpp | 2 +- src/server/game/World/World.cpp | 2 +- .../IcecrownCitadel/boss_lady_deathwhisper.cpp | 2 +- .../Database/Implementation/CharacterDatabase.cpp | 17 +- .../Database/Implementation/CharacterDatabase.h | 2 + 22 files changed, 116 insertions(+), 383 deletions(-) create mode 100644 sql/updates/characters/2011_11_25_03_characters_character_stats.sql create mode 100644 sql/updates/characters/2011_11_25_03_characters_characters.sql create mode 100644 sql/updates/characters/2011_11_25_03_characters_corpse.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2011_11_25_03_characters_character_stats.sql b/sql/updates/characters/2011_11_25_03_characters_character_stats.sql new file mode 100644 index 00000000000..5f41b6e40db --- /dev/null +++ b/sql/updates/characters/2011_11_25_03_characters_character_stats.sql @@ -0,0 +1,7 @@ +ALTER TABLE `character_stats` +DROP COLUMN `maxpower6`, +DROP COLUMN `maxpower7`, +DROP COLUMN `maxpower8`, +DROP COLUMN `maxpower9`, +DROP COLUMN `maxpower10`, +DROP COLUMN `maxpower11`; diff --git a/sql/updates/characters/2011_11_25_03_characters_characters.sql b/sql/updates/characters/2011_11_25_03_characters_characters.sql new file mode 100644 index 00000000000..cede344b6bf --- /dev/null +++ b/sql/updates/characters/2011_11_25_03_characters_characters.sql @@ -0,0 +1,9 @@ +ALTER TABLE `characters` +DROP COLUMN `power6`, +DROP COLUMN `power7`, +DROP COLUMN `power8`, +DROP COLUMN `power9`, +DROP COLUMN `power10`, +DROP COLUMN `power11`, +DROP COLUMN `ammoId`, +ADD COLUMN `guildId` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `grantableLevels`; diff --git a/sql/updates/characters/2011_11_25_03_characters_corpse.sql b/sql/updates/characters/2011_11_25_03_characters_corpse.sql new file mode 100644 index 00000000000..e1823602b65 --- /dev/null +++ b/sql/updates/characters/2011_11_25_03_characters_corpse.sql @@ -0,0 +1 @@ +ALTER TABLE `corpse` DROP COLUMN `guildId`; diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp index be0dd8c3679..08f8d7a3d77 100755 --- a/src/server/game/AI/EventAI/CreatureEventAI.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp @@ -1312,7 +1312,7 @@ bool CreatureEventAI::CanCast(Unit* target, SpellInfo const* spell, bool trigger return false; //Check for power - if (!triggered && me->GetPower((Powers)spell->PowerType) < spell->CalcPowerCost(me, spell->GetSchoolMask())) + if (!triggered && (uint32)me->GetPower((Powers)spell->PowerType) < spell->CalcPowerCost(me, spell->GetSchoolMask())) return false; //Unit is out of range of this spell diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 953bbf7521a..e9a9c1fdcf2 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -237,7 +237,7 @@ SpellInfo const* ScriptedAI::SelectSpell(Unit* target, uint32 school, uint32 mec continue; //Continue if we don't have the mana to actually cast this spell - if (tempSpell->ManaCost > me->GetPower(Powers(tempSpell->PowerType))) + if (tempSpell->ManaCost > (uint32)me->GetPower(Powers(tempSpell->PowerType))) continue; //Check if the spell meets our range requirements diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 7919a3fba16..77d16501415 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -87,7 +87,7 @@ void LoadDB2Stores(const std::string& dataPath) LoadDB2(availableDb2Locales, bad_db2_files, sItemStore, db2Path, "Item.db2"); LoadDB2(availableDb2Locales, bad_db2_files, sItemSparseStore, db2Path, "Item-sparse.db2"); - LoadDB2(availableDb2Locales, bad_db2_files, sItemExtendedCostStore, db2Path, "ItemExtendedCost.db2"); + LoadDB2(availableDb2Locales, bad_db2_files, sItemExtendedCostStore, db2Path, "ItemExtendedCost.db2"); // error checks if (bad_db2_files.size() >= DB2FilesCount) { diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 31cc21659c9..ff8c93ec404 100755 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -106,25 +106,25 @@ void Corpse::SaveToDB() SQLTransaction trans = CharacterDatabase.BeginTransaction(); DeleteFromDB(trans); + uint16 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_CORPSE); - stmt->setUInt32(0, GetGUIDLow()); // corpseGuid - stmt->setUInt32(1, GUID_LOPART(GetOwnerGUID())); // guid - stmt->setFloat (2, GetPositionX()); // posX - stmt->setFloat (3, GetPositionY()); // posY - stmt->setFloat (4, GetPositionZ()); // posZ - stmt->setFloat (5, GetOrientation()); // orientation - stmt->setUInt16(6, GetMapId()); // mapId - stmt->setUInt32(7, GetUInt32Value(CORPSE_FIELD_DISPLAY_ID)); // displayId - stmt->setString(8, _ConcatFields(CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END)); // itemCache - stmt->setUInt32(9, GetUInt32Value(CORPSE_FIELD_BYTES_1)); // bytes1 - stmt->setUInt32(10, GetUInt32Value(CORPSE_FIELD_BYTES_2)); // bytes2 - stmt->setUInt32(11, GetUInt32Value(CORPSE_FIELD_GUILD)); // guildId - stmt->setUInt8 (12, GetUInt32Value(CORPSE_FIELD_FLAGS)); // flags - stmt->setUInt8 (13, GetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS)); // dynFlags - stmt->setUInt32(14, uint32(m_time)); // time - stmt->setUInt8 (15, GetType()); // corpseType - stmt->setUInt32(16, GetInstanceId()); // instanceId - stmt->setUInt16(17, GetPhaseMask()); // phaseMask + stmt->setUInt32(index, GetGUIDLow()); // corpseGuid + stmt->setUInt32(index++, GUID_LOPART(GetOwnerGUID())); // guid + stmt->setFloat (index++, GetPositionX()); // posX + stmt->setFloat (index++, GetPositionY()); // posY + stmt->setFloat (index++, GetPositionZ()); // posZ + stmt->setFloat (index++, GetOrientation()); // orientation + stmt->setUInt16(index++, GetMapId()); // mapId + stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_DISPLAY_ID)); // displayId + stmt->setString(index++, _ConcatFields(CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END)); // itemCache + stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_1)); // bytes1 + stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_2)); // bytes2 + stmt->setUInt8 (index++, GetUInt32Value(CORPSE_FIELD_FLAGS)); // flags + stmt->setUInt8 (index++, GetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS)); // dynFlags + stmt->setUInt32(index++, uint32(m_time)); // time + stmt->setUInt8 (index++, GetType()); // corpseType + stmt->setUInt32(index++, GetInstanceId()); // instanceId + stmt->setUInt16(index++, GetPhaseMask()); // phaseMask trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); @@ -164,10 +164,11 @@ void Corpse::DeleteFromDB(SQLTransaction& trans) bool Corpse::LoadFromDB(uint32 guid, Field* fields) { - uint32 ownerGuid = fields[17].GetUInt32(); - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0 - m_type = CorpseType(fields[13].GetUInt8()); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0 + + uint32 ownerGuid = fields[16].GetUInt32(); + m_type = CorpseType(fields[12].GetUInt8()); if (m_type >= MAX_CORPSE_TYPE) { sLog->outError("Corpse (guid: %u, owner: %u) have wrong corpse type (%u), not loading.", guid, ownerGuid, m_type); @@ -188,15 +189,14 @@ bool Corpse::LoadFromDB(uint32 guid, Field* fields) _LoadIntoDataField(fields[6].GetCString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END); SetUInt32Value(CORPSE_FIELD_BYTES_1, fields[7].GetUInt32()); SetUInt32Value(CORPSE_FIELD_BYTES_2, fields[8].GetUInt32()); - SetUInt32Value(CORPSE_FIELD_GUILD, fields[9].GetUInt32()); - SetUInt32Value(CORPSE_FIELD_FLAGS, fields[10].GetUInt8()); - SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, fields[11].GetUInt8()); + SetUInt32Value(CORPSE_FIELD_FLAGS, fields[9].GetUInt8()); + SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, fields[10].GetUInt8()); SetUInt64Value(CORPSE_FIELD_OWNER, MAKE_NEW_GUID(ownerGuid, 0, HIGHGUID_PLAYER)); - m_time = time_t(fields[12].GetUInt32()); + m_time = time_t(fields[11].GetUInt32()); - uint32 instanceId = fields[14].GetUInt32(); - uint32 phaseMask = fields[15].GetUInt16(); + uint32 instanceId = fields[13].GetUInt32(); + uint32 phaseMask = fields[14].GetUInt16(); // place SetLocationInstanceId(instanceId); diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 03e83496297..ce063f4f2f1 100755 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -105,24 +105,12 @@ enum EUnitFields UNIT_FIELD_POWER3 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER4 = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER5 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER6 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER7 = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER8 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER9 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER10 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER11 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x0024, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0025, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER8 = OBJECT_END + 0x0026, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER9 = OBJECT_END + 0x0027, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER10 = OBJECT_END + 0x0028, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER11 = OBJECT_END + 0x0029, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x001E, // Size: 5, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_MEMBER UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0023, // Size: 5, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_MEMBER UNIT_FIELD_LEVEL = OBJECT_END + 0x0028, // Size: 1, Type: INT, Flags: PUBLIC diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f3dc392f569..b75f3f07d55 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -787,6 +787,8 @@ Player::Player (WorldSession* session): Unit(), m_achievementMgr(this), m_reputa m_activeSpec = 0; m_specsCount = 1; + m_freeTalentPoints = 0; + for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i) { for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g) @@ -978,7 +980,6 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender); SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1) - SetUInt32Value(PLAYER_GUILDID, 0); SetUInt32Value(PLAYER_GUILDRANK, 0); SetUInt32Value(PLAYER_GUILD_TIMESTAMP, 0); @@ -1165,7 +1166,7 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) RemoveItem(INVENTORY_SLOT_BAG_0, i, true); EquipItem(eDest, pItem, true); } - // move other items to more appropriate slots (ammo not equipped in special bag) + // move other items to more appropriate slots else { ItemPosCountVec sDest; @@ -1175,11 +1176,6 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) RemoveItem(INVENTORY_SLOT_BAG_0, i, true); pItem = StoreItem(sDest, pItem, true); } - - // if this is ammo then use it - msg = CanUseAmmo(pItem->GetEntry()); - if (msg == EQUIP_ERR_OK) - SetAmmo(pItem->GetEntry()); } } } @@ -3111,7 +3107,7 @@ void Player::GiveLevel(uint8 level) SetFullHealth(); SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); - if (GetPower(POWER_RAGE) > GetMaxPower(POWER_RAGE)) + if ((uint32)GetPower(POWER_RAGE) > GetMaxPower(POWER_RAGE)) SetPower(POWER_RAGE, GetMaxPower(POWER_RAGE)); SetPower(POWER_FOCUS, 0); @@ -3250,10 +3246,8 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, 0.0f); SetInt32Value(UNIT_FIELD_ATTACK_POWER, 0); - SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, 0); SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, 0.0f); SetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER, 0); - SetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0); SetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, 0.0f); // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset @@ -3334,7 +3328,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFullHealth(); SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); - if (GetPower(POWER_RAGE) > GetMaxPower(POWER_RAGE)) + if ((uint32)GetPower(POWER_RAGE) > GetMaxPower(POWER_RAGE)) SetPower(POWER_RAGE, GetMaxPower(POWER_RAGE)); SetPower(POWER_FOCUS, GetMaxPower(POWER_FOCUS)); SetPower(POWER_RUNIC_POWER, 0); @@ -4502,12 +4496,6 @@ bool Player::resetTalents(bool no_cost) return true; } -void Player::SetFreeTalentPoints(uint32 points) -{ - sScriptMgr->OnPlayerFreeTalentPointsChanged(this, points); - SetUInt32Value(PLAYER_CHARACTER_POINTS1, points); -} - Mail* Player::GetMail(uint32 id) { for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) @@ -4565,16 +4553,12 @@ void Player::InitVisibleBits() updateVisualBits.SetBit(UNIT_FIELD_POWER3); updateVisualBits.SetBit(UNIT_FIELD_POWER4); updateVisualBits.SetBit(UNIT_FIELD_POWER5); - updateVisualBits.SetBit(UNIT_FIELD_POWER6); - updateVisualBits.SetBit(UNIT_FIELD_POWER7); updateVisualBits.SetBit(UNIT_FIELD_MAXHEALTH); updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER1); updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER2); updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER3); updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER4); updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER5); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER6); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER7); updateVisualBits.SetBit(UNIT_FIELD_LEVEL); updateVisualBits.SetBit(UNIT_FIELD_FACTIONTEMPLATE); updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 0); @@ -4603,7 +4587,6 @@ void Player::InitVisibleBits() updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 0); updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 1); updateVisualBits.SetBit(PLAYER_FLAGS); - updateVisualBits.SetBit(PLAYER_GUILDID); updateVisualBits.SetBit(PLAYER_GUILDRANK); updateVisualBits.SetBit(PLAYER_BYTES); updateVisualBits.SetBit(PLAYER_BYTES_2); @@ -5290,12 +5273,10 @@ void Player::CreateCorpse() flags |= CORPSE_FLAG_HIDE_CLOAK; if (InBattleground() && !InArena()) flags |= CORPSE_FLAG_LOOTABLE; // to be able to remove insignia - corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags); + corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags); corpse->SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, GetNativeDisplayId()); - corpse->SetUInt32Value(CORPSE_FIELD_GUILD, GetGuildId()); - uint32 iDisplayID; uint32 iIventoryType; uint32 _cfi; @@ -7856,10 +7837,6 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply) _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply); _ApplyItemBonuses(proto, slot, apply); - - if (slot == EQUIPMENT_SLOT_RANGED) - _ApplyAmmoBonuses(); - ApplyItemEquipSpell(item, apply); ApplyEnchantment(item, apply); @@ -8649,9 +8626,6 @@ void Player::_RemoveAllItemMods() _ApplyWeaponDependentAuraMods(m_items[i], WeaponAttackType(attacktype), false); _ApplyItemBonuses(proto, i, false); - - if (i == EQUIPMENT_SLOT_RANGED) - _ApplyAmmoBonuses(); } } @@ -8678,9 +8652,6 @@ void Player::_ApplyAllItemMods() _ApplyWeaponDependentAuraMods(m_items[i], WeaponAttackType(attacktype), true); _ApplyItemBonuses(proto, i, true); - - if (i == EQUIPMENT_SLOT_RANGED) - _ApplyAmmoBonuses(); } } @@ -8725,63 +8696,6 @@ void Player::_ApplyAllLevelScaleItemMods(bool apply) } } -void Player::_ApplyAmmoBonuses() -{ - // check ammo - uint32 ammo_id = GetUInt32Value(PLAYER_AMMO_ID); - if (!ammo_id) - return; - - float currentAmmoDPS; - - ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id); - if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto)) - currentAmmoDPS = 0.0f; - else - currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2; - - if (currentAmmoDPS == GetAmmoDPS()) - return; - - m_ammoDPS = currentAmmoDPS; - - if (CanModifyStats()) - UpdateDamagePhysical(RANGED_ATTACK); -} - -bool Player::CheckAmmoCompatibility(const ItemTemplate* ammo_proto) const -{ - if (!ammo_proto) - return false; - - // check ranged weapon - Item* weapon = GetWeaponForAttack(RANGED_ATTACK); - if (!weapon || weapon->IsBroken()) - return false; - - ItemTemplate const* weapon_proto = weapon->GetTemplate(); - if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON) - return false; - - // check ammo ws. weapon compatibility - switch (weapon_proto->SubClass) - { - case ITEM_SUBCLASS_WEAPON_BOW: - case ITEM_SUBCLASS_WEAPON_CROSSBOW: - if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW) - return false; - break; - case ITEM_SUBCLASS_WEAPON_GUN: - if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET) - return false; - break; - default: - return false; - } - - return true; -} - /* If in a battleground a player dies, and an enemy removes the insignia, the player's bones is lootable Called by remove insignia spell effect */ void Player::RemovedInsignia(Player* looterPlr) @@ -11999,71 +11913,6 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const return EQUIP_ERR_ITEM_NOT_FOUND; } -InventoryResult Player::CanUseAmmo(uint32 item) const -{ - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanUseAmmo item = %u", item); - if (!isAlive()) - return EQUIP_ERR_YOU_ARE_DEAD; - //if (isStunned()) - // return EQUIP_ERR_YOU_ARE_STUNNED; - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item); - if (pProto) - { - if (pProto->InventoryType!= INVTYPE_AMMO) - return EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE; - - InventoryResult res = CanUseItem(pProto); - if (res != EQUIP_ERR_OK) - return res; - - /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation) - return EQUIP_ERR_CANT_EQUIP_REPUTATION; - */ - - // Requires No Ammo - if (HasAura(46699)) - return EQUIP_ERR_BAG_FULL6; - - return EQUIP_ERR_OK; - } - return EQUIP_ERR_ITEM_NOT_FOUND; -} - -void Player::SetAmmo(uint32 item) -{ - if (!item) - return; - - // already set - if (GetUInt32Value(PLAYER_AMMO_ID) == item) - return; - - // check ammo - if (item) - { - InventoryResult msg = CanUseAmmo(item); - if (msg != EQUIP_ERR_OK) - { - SendEquipError(msg, NULL, NULL, item); - return; - } - } - - SetUInt32Value(PLAYER_AMMO_ID, item); - - _ApplyAmmoBonuses(); -} - -void Player::RemoveAmmo() -{ - SetUInt32Value(PLAYER_AMMO_ID, 0); - - m_ammoDPS = 0.0f; - - if (CanModifyStats()) - UpdateDamagePhysical(RANGED_ATTACK); -} - Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update, int32 randomPropertyId) { AllowedLooterSet allowedLooters; @@ -16645,10 +16494,10 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " // 39 40 41 42 43 44 45 46 47 48 49 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 - //"health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, power11, instance_id, speccount, activespec, exploredZones, equipmentCache, " - // 67 68 69 70 - //"ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid); + // 50 51 52 53 54 55 56 57 58 59 60 + //"health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, " + // 61 62 63 64 + //"knownTitles, actionBars, grantableLevels, guildId FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADFROM); if (!result) @@ -16707,8 +16556,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[65].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[68].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); + _LoadIntoDataField(fields[59].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[61].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE); SetFloatValue(UNIT_FIELD_COMBATREACH, 1.5f); @@ -16730,10 +16579,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[47].GetUInt64()); - SetUInt32Value(PLAYER_AMMO_ID, fields[67].GetUInt32()); - // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(PLAYER_FIELD_BYTES, 2, fields[69].GetUInt8()); + SetByteValue(PLAYER_FIELD_BYTES, 2, fields[62].GetUInt8()); InitDisplayIds(); @@ -16764,7 +16611,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) uint32 transGUID = uint32(fields[30].GetUInt64()); // field type is uint64 but lowguid is saved Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat()); uint32 mapId = fields[15].GetUInt16(); - uint32 instanceId = fields[62].GetUInt8(); + uint32 instanceId = fields[56].GetUInt8(); uint32 dungeonDiff = fields[38].GetUInt32() & 0x0F; if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY) @@ -17126,8 +16973,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) //mails are loaded only when needed ;-) - when player in game click on mailbox. //_LoadMail(); - m_specsCount = fields[63].GetUInt8(); - m_activeSpec = fields[64].GetUInt8(); + m_specsCount = fields[57].GetUInt8(); + m_activeSpec = fields[58].GetUInt8(); // sanity check if (m_specsCount > MAX_TALENT_SPECS || m_activeSpec > MAX_TALENT_SPEC || m_specsCount < MIN_TALENT_SPECS) @@ -17199,7 +17046,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // restore remembered power/health values (but not more max values) uint32 savedHealth = fields[50].GetUInt32(); SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); - for (uint8 i = 0; i < MAX_POWERS; ++i) + for (uint8 i = 0; i < MAX_STORED_POWERS; ++i) { uint32 savedPower = fields[51+i].GetUInt32(); SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower); @@ -17257,7 +17104,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[70].GetUInt32(); + m_grantableLevels = fields[63].GetUInt32(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -18524,7 +18371,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt16(index++, (uint16)(GetUInt32Value(PLAYER_BYTES_3) & 0xFFFE)); stmt->setUInt32(index++, GetHealth()); - for (uint32 i = 0; i < MAX_POWERS; ++i) + for (uint32 i = 0; i < MAX_STORED_POWERS; ++i) stmt->setUInt32(index++, GetPower(Powers(i))); stmt->setUInt32(index++, GetSession()->GetLatency()); @@ -18555,7 +18402,6 @@ void Player::SaveToDB(bool create /*=false*/) } stmt->setString(index++, ss.str()); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_AMMO_ID)); ss.str().clear(); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) @@ -18637,7 +18483,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt16(index++, (uint16)(GetUInt32Value(PLAYER_BYTES_3) & 0xFFFE)); stmt->setUInt32(index++, GetHealth()); - for (uint32 i = 0; i < MAX_POWERS; ++i) + for (uint32 i = 0; i < MAX_STORED_POWERS; ++i) stmt->setUInt32(index++, GetPower(Powers(i))); stmt->setUInt32(index++, GetSession()->GetLatency()); @@ -18668,7 +18514,6 @@ void Player::SaveToDB(bool create /*=false*/) } stmt->setString(index++, ss.str()); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_AMMO_ID)); ss.str().clear(); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) @@ -19142,12 +18987,12 @@ void Player::_SaveStats(SQLTransaction& trans) trans->PAppend("DELETE FROM character_stats WHERE guid = '%u'", GetGUIDLow()); std::ostringstream ss; - ss << "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, maxpower8, maxpower9, maxpower10, maxpower11, " + ss << "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, " "strength, agility, stamina, intellect, spirit, armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, " "blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, spellPower, resilience) VALUES (" << GetGUIDLow() << ',' << GetMaxHealth() << ','; - for (uint8 i = 0; i < MAX_POWERS; ++i) + for (uint8 i = 0; i < MAX_STORED_POWERS; ++i) ss << GetMaxPower(Powers(i)) << ','; for (uint8 i = 0; i < MAX_STATS; ++i) ss << GetStat(Stats(i)) << ','; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index abbbe31b3ff..b2457a87e82 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1689,8 +1689,8 @@ class Player : public Unit, public GridObject void SetReputation(uint32 factionentry, uint32 value); uint32 GetReputation(uint32 factionentry); std::string GetGuildName(); - uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); } - void SetFreeTalentPoints(uint32 points); + uint32 GetFreeTalentPoints() const { return m_freeTalentPoints; } + void SetFreeTalentPoints(uint32 points) { m_freeTalentPoints = points; } bool resetTalents(bool no_cost = false); uint32 resetTalentsCost() const; void InitTalentForLevel(); @@ -1723,8 +1723,8 @@ class Player : public Unit, public GridObject } uint32 GetGlyph(uint8 slot) { return m_Glyphs[m_activeSpec][slot]; } - uint32 GetFreePrimaryProfessionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS2); } - void SetFreePrimaryProfessions(uint16 profs) { SetUInt32Value(PLAYER_CHARACTER_POINTS2, profs); } + uint32 GetFreePrimaryProfessionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS); } + void SetFreePrimaryProfessions(uint16 profs) { SetUInt32Value(PLAYER_CHARACTER_POINTS, profs); } void InitPrimaryProfessions(); PlayerSpellMap const& GetSpellMap() const { return m_spells; } @@ -1844,11 +1844,24 @@ class Player : public Unit, public GridObject void RemoveFromGroup(RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT) { RemoveFromGroup(GetGroup(), GetGUID(), method); } void SendUpdateToOutOfRangeGroupMembers(); - void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); } + void SetInGuild(uint32 GuildId) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SET_GUILD_ID); + stmt->setUInt32(0, GuildId); + stmt->setUInt64(1, GetGUID()); + CharacterDatabase.Execute(stmt); + } + + uint32 GetGuildId() + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_GUILD_ID); + stmt->setUInt64(0, GetGUIDLow()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + return result ? (*result)[0].GetUInt32() : 0; + } void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); } uint8 GetRank() { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); } void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; } - uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); } static uint32 GetGuildIdFromDB(uint64 guid); static uint8 GetRankFromDB(uint64 guid); int GetGuildIdInvited() { return m_GuildIdInvited; } @@ -2075,6 +2088,7 @@ class Player : public Unit, public GridObject /*********************************************************/ /*** PVP SYSTEM ***/ /*********************************************************/ + // TODO: Properly implement correncies as of Cataclysm void UpdateHonorFields(); bool RewardHonor(Unit* pVictim, uint32 groupsize, int32 honor = -1, bool pvptoken = false); uint32 GetHonorPoints() const { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); } @@ -2128,7 +2142,6 @@ class Player : public Unit, public GridObject void _ApplyAllLevelScaleItemMods(bool apply); void _ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply, bool only_level_scale = false); void _ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv, bool apply); - void _ApplyAmmoBonuses(); bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot); void ToggleMetaGemsActive(uint8 exceptslot, bool apply); void CorrectMetaGemEnchants(uint8 slot, bool apply); @@ -2705,6 +2718,8 @@ class Player : public Unit, public GridObject uint8 m_activeSpec; uint8 m_specsCount; + uint32 m_freeTalentPoints; + uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]; ActionButtonList m_actionButtons; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 459379ac11a..aa5d783323a 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -287,13 +287,11 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER; uint16 index = UNIT_FIELD_ATTACK_POWER; - uint16 index_mod = UNIT_FIELD_ATTACK_POWER_MODS; uint16 index_mult = UNIT_FIELD_ATTACK_POWER_MULTIPLIER; if (ranged) { index = UNIT_FIELD_RANGED_ATTACK_POWER; - index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MODS; index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER; switch (getClass()) @@ -437,10 +435,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) } float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f; - SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field - SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field Pet* pet = GetPet(); //update pet's AP //automatically update weapon damage after attack power modification @@ -968,13 +963,11 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged) UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER; uint16 index = UNIT_FIELD_ATTACK_POWER; - uint16 index_mod = UNIT_FIELD_ATTACK_POWER_MODS; uint16 index_mult = UNIT_FIELD_ATTACK_POWER_MULTIPLIER; if (ranged) { index = UNIT_FIELD_RANGED_ATTACK_POWER; - index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MODS; index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER; } @@ -983,7 +976,6 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged) float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f; SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field //automatically update weapon damage after attack power modification @@ -1336,8 +1328,6 @@ void Guardian::UpdateAttackPowerAndDamage(bool ranged) //UNIT_FIELD_(RANGED)_ATTACK_POWER field SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)base_attPower); - //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field - SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, attPowerMultiplier); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 00471c420ce..545ba676091 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13524,14 +13524,14 @@ float Unit::GetTotalAttackPowerValue(WeaponAttackType attType) const { if (attType == RANGED_ATTACK) { - int32 ap = GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER) + GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS); + int32 ap = GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER); if (ap < 0) return 0.0f; return ap * (1.0f + GetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER)); } else { - int32 ap = GetInt32Value(UNIT_FIELD_ATTACK_POWER) + GetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS); + int32 ap = GetInt32Value(UNIT_FIELD_ATTACK_POWER); if (ap < 0) return 0.0f; return ap * (1.0f + GetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER)); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 93f58003f6d..f2553b3ace5 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2184,7 +2184,7 @@ void ObjectMgr::LoadItemTemplates() } itemTemplate.ScalingStatDistribution = uint32(fields[48].GetUInt16()); - itemTemplate.ScalingStatValue = fields[49].GetInt32(); + //itemTemplate.ScalingStatValue = fields[49].GetInt32(); for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 9bca1c15423..197c12ac519 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -186,6 +186,8 @@ enum Powers POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value) }; +#define MAX_STORED_POWERS 5 + enum SpellSchools { SPELL_SCHOOL_NORMAL = 0, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b7cc673962c..20ee5ce39e4 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1984,7 +1984,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo case FORM_DIREBEAR: { // get furor proc chance - uint32 FurorChance = 0; + int32 FurorChance = 0; if (AuraEffect const* dummy = target->GetDummyAuraEffect(SPELLFAMILY_DRUID, 238, 0)) FurorChance = std::max(dummy->GetAmount(), 0); @@ -2003,7 +2003,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo target->CastSpell(target, 17057, true); default: { - uint32 newEnergy = std::min(target->GetPower(POWER_ENERGY), FurorChance); + int32 newEnergy = std::min(target->GetPower(POWER_ENERGY), FurorChance); target->SetPower(POWER_ENERGY, newEnergy); } break; @@ -2056,7 +2056,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo case FORM_DEFENSIVESTANCE: case FORM_BERSERKERSTANCE: { - uint32 Rage_val = 0; + int32 Rage_val = 0; // Defensive Tactics if (form == FORM_DEFENSIVESTANCE) { @@ -4757,10 +4757,6 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool target->GetMotionMaster()->MoveFall(currentGroundLevel); } break; - case 46699: // Requires No Ammo - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->RemoveAmmo(); // not use ammo and not allow use - break; case 49028: if (caster) if (AuraEffect* aurEff = caster->GetAuraEffect(63330, 0)) // glyph of Dancing Rune Weapon diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4003f2f3b36..c1749867945 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3738,8 +3738,6 @@ void Spell::SendSpellStart() if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) castFlags |= CAST_FLAG_PENDING; - if (m_spellInfo->Attributes & SPELL_ATTR0_REQ_AMMO) - castFlags |= CAST_FLAG_AMMO; if ((m_caster->GetTypeId() == TYPEID_PLAYER || (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->isPet())) && m_spellInfo->PowerType != POWER_HEALTH) @@ -3765,9 +3763,6 @@ void Spell::SendSpellStart() if (castFlags & CAST_FLAG_POWER_LEFT_SELF) data << uint32(m_caster->GetPower((Powers)m_spellInfo->PowerType)); - if (castFlags & CAST_FLAG_AMMO) - WriteAmmoToPacket(&data); - if (castFlags & CAST_FLAG_UNKNOWN_23) { data << uint32(0); @@ -3791,8 +3786,6 @@ void Spell::SendSpellGo() if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) castFlags |= CAST_FLAG_PENDING; - if (m_spellInfo->Attributes & SPELL_ATTR0_REQ_AMMO) - castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual if ((m_caster->GetTypeId() == TYPEID_PLAYER || (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->isPet())) && m_spellInfo->PowerType != POWER_HEALTH) @@ -3863,9 +3856,6 @@ void Spell::SendSpellGo() data << uint32(0); } - if (castFlags & CAST_FLAG_AMMO) - WriteAmmoToPacket(&data); - if (castFlags & CAST_FLAG_UNKNOWN_20) // unknown wotlk { data << uint32(0); @@ -3880,78 +3870,6 @@ void Spell::SendSpellGo() m_caster->SendMessageToSet(&data, true); } -void Spell::WriteAmmoToPacket(WorldPacket* data) -{ - uint32 ammoInventoryType = 0; - uint32 ammoDisplayID = 0; - - if (m_caster->GetTypeId() == TYPEID_PLAYER) - { - Item* pItem = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK); - if (pItem) - { - ammoInventoryType = pItem->GetTemplate()->InventoryType; - if (ammoInventoryType == INVTYPE_THROWN) - ammoDisplayID = pItem->GetTemplate()->DisplayInfoID; - else - { - uint32 ammoID = m_caster->ToPlayer()->GetUInt32Value(PLAYER_AMMO_ID); - if (ammoID) - { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(ammoID); - if (pProto) - { - ammoDisplayID = pProto->DisplayInfoID; - ammoInventoryType = pProto->InventoryType; - } - } - else if (m_caster->HasAura(46699)) // Requires No Ammo - { - ammoDisplayID = 5996; // normal arrow - ammoInventoryType = INVTYPE_AMMO; - } - } - } - } - else - { - for (uint8 i = 0; i < 3; ++i) - { - if (uint32 item_id = m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i)) - { - if (ItemEntry const* itemEntry = sItemStore.LookupEntry(item_id)) - { - if (itemEntry->Class == ITEM_CLASS_WEAPON) - { - switch (itemEntry->SubClass) - { - case ITEM_SUBCLASS_WEAPON_THROWN: - ammoDisplayID = itemEntry->DisplayId; - ammoInventoryType = itemEntry->InventoryType; - break; - case ITEM_SUBCLASS_WEAPON_BOW: - case ITEM_SUBCLASS_WEAPON_CROSSBOW: - ammoDisplayID = 5996; // is this need fixing? - ammoInventoryType = INVTYPE_AMMO; - break; - case ITEM_SUBCLASS_WEAPON_GUN: - ammoDisplayID = 5998; // is this need fixing? - ammoInventoryType = INVTYPE_AMMO; - break; - } - - if (ammoDisplayID) - break; - } - } - } - } - } - - *data << uint32(ammoDisplayID); - *data << uint32(ammoInventoryType); -} - void Spell::WriteSpellGoTargets(WorldPacket* data) { // This function also fill data for channeled spells: @@ -4319,8 +4237,6 @@ void Spell::TakeAmmo() m_caster->ToPlayer()->DestroyItemCount(pItem, count, true); } } - else if (uint32 ammo = m_caster->ToPlayer()->GetUInt32Value(PLAYER_AMMO_ID)) - m_caster->ToPlayer()->DestroyItemCount(ammo, 1, true); } } @@ -6136,46 +6052,6 @@ SpellCastResult Spell::CheckItems() case ITEM_SUBCLASS_WEAPON_GUN: case ITEM_SUBCLASS_WEAPON_BOW: case ITEM_SUBCLASS_WEAPON_CROSSBOW: - { - uint32 ammo = m_caster->ToPlayer()->GetUInt32Value(PLAYER_AMMO_ID); - if (!ammo) - { - // Requires No Ammo - if (m_caster->HasAura(46699)) - break; // skip other checks - - return SPELL_FAILED_NO_AMMO; - } - - ItemTemplate const* ammoProto = sObjectMgr->GetItemTemplate(ammo); - if (!ammoProto) - return SPELL_FAILED_NO_AMMO; - - if (ammoProto->Class != ITEM_CLASS_PROJECTILE) - return SPELL_FAILED_NO_AMMO; - - // check ammo ws. weapon compatibility - switch (pItem->GetTemplate()->SubClass) - { - case ITEM_SUBCLASS_WEAPON_BOW: - case ITEM_SUBCLASS_WEAPON_CROSSBOW: - if (ammoProto->SubClass != ITEM_SUBCLASS_ARROW) - return SPELL_FAILED_NO_AMMO; - break; - case ITEM_SUBCLASS_WEAPON_GUN: - if (ammoProto->SubClass != ITEM_SUBCLASS_BULLET) - return SPELL_FAILED_NO_AMMO; - break; - default: - return SPELL_FAILED_NO_AMMO; - } - - if (!m_caster->ToPlayer()->HasItemCount(ammo, 1)) - { - m_caster->ToPlayer()->SetUInt32Value(PLAYER_AMMO_ID, 0); - return SPELL_FAILED_NO_AMMO; - } - }; break; case ITEM_SUBCLASS_WEAPON_WAND: break; default: diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 624c3b9b9b3..02f415e88c3 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -43,7 +43,7 @@ enum SpellCastFlags CAST_FLAG_UNKNOWN_3 = 0x00000004, CAST_FLAG_UNKNOWN_4 = 0x00000008, // ignore AOE visual CAST_FLAG_UNKNOWN_5 = 0x00000010, - CAST_FLAG_AMMO = 0x00000020, // Projectiles visual + CAST_FLAG_UNKNOWN_6 = 0x00000020, CAST_FLAG_UNKNOWN_7 = 0x00000040, CAST_FLAG_UNKNOWN_8 = 0x00000080, CAST_FLAG_UNKNOWN_9 = 0x00000100, @@ -402,7 +402,6 @@ class Spell void DoCreateItem(uint32 i, uint32 itemtype); void WriteSpellGoTargets(WorldPacket* data); - void WriteAmmoToPacket(WorldPacket* data); void InitExplicitTargets(SpellCastTargets const& targets); void SelectSpellTargets(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 8cb001ed0ac..a3ff66f7b5b 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -7344,7 +7344,7 @@ void Spell::EffectCastButtons(SpellEffIndex effIndex) if (!(spellInfo->AttributesEx7 & SPELL_ATTR7_SUMMON_PLAYER_TOTEM)) continue; - uint32 cost = spellInfo->CalcPowerCost(m_caster, spellInfo->GetSchoolMask()); + int32 cost = spellInfo->CalcPowerCost(m_caster, spellInfo->GetSchoolMask()); if (m_caster->GetPower(POWER_MANA) < cost) continue; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 9a5a8d6f5fe..e4ee17e324d 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1258,7 +1258,7 @@ void World::SetInitialWorldSettings() ///- Load the DBC files sLog->outString("Initialize data stores..."); LoadDBCStores(m_dataPath); - LoadDB2Stores(m_dataPath); + LoadDB2Stores(m_dataPath); DetectDBCLang(); sLog->outString("Loading spell dbc data corrections..."); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index ae6f3feb57f..fe307932988 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -357,7 +357,7 @@ class boss_lady_deathwhisper : public CreatureScript void DamageTaken(Unit* /*damageDealer*/, uint32& damage) { // phase transition - if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > me->GetPower(POWER_MANA)) + if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > (uint32)me->GetPower(POWER_MANA)) { Talk(SAY_PHASE_2); Talk(EMOTE_PHASE_2); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 94b4ca16d7f..536db9dcd30 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -42,7 +42,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, power11, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = ?", CONNECTION_ASYNC) + "health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, guildId FROM characters WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_GROUP, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_BOUNDINSTANCES, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, " @@ -116,6 +116,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() // 0: uint32, 1: string, 2: uint32, 3: string, 4: string, 5: uint64, 6-10: uint32, 11: uint64 PREPARE_STATEMENT(CHAR_ADD_GUILD, "INSERT INTO guild (guildid, name, leaderguid, info, motd, createdate, EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, BankMoney) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_GUILD, "DELETE FROM guild WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32 + // 0: uint32 + PREPARE_STATEMENT(CHAR_SET_GUILD_ID, "UPDATE characters SET guildId = ? WHERE guid = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_GET_GUILD_ID, "SELECT guildId FROM characters WHERE guid = ?", CONNECTION_SYNCH) // 0: uint32, 1: uint32, 2: uint8, 4: string, 5: string PREPARE_STATEMENT(CHAR_ADD_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?", CONNECTION_ASYNC) // 0: uint32 @@ -262,8 +265,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC) // Corpse - PREPARE_STATEMENT(CHAR_LOAD_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0", CONNECTION_SYNCH) - PREPARE_STATEMENT(CHAR_ADD_CORPSE, "INSERT INTO corpse (corpseGuid, guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_LOAD_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_ADD_CORPSE, "INSERT INTO corpse (corpseGuid, guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, phaseMask) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC) @@ -308,12 +311,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() "extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, " "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "power4, power5, latency, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, guildId) VALUES " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?," "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?," - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,speccount=?,activespec=?,exploredZones=?," - "equipmentCache=?,ammoId=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC); + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,latency=?,speccount=?,activespec=?,exploredZones=?," + "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,guildId=?,online=? WHERE guid=?", CONNECTION_ASYNC); } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index f06a17aa924..c84ea5544fa 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -123,6 +123,8 @@ enum CharacterDatabaseStatements CHAR_ADD_GUILD, CHAR_DEL_GUILD, + CHAR_SET_GUILD_ID, + CHAR_GET_GUILD_ID, CHAR_ADD_GUILD_MEMBER, CHAR_DEL_GUILD_MEMBER, CHAR_DEL_GUILD_MEMBERS, -- cgit v1.2.3 From aa215e5e8083c045662151eed67caeb2a7f8caa5 Mon Sep 17 00:00:00 2001 From: kaelima Date: Sat, 26 Nov 2011 01:46:41 +0100 Subject: Core/Misc: Fix compile and char creation - Added very basic honor/conquest support, no idea if its works even a little since there's no possibility of testing yet --- .../2011_11_26_00_characters_characters.sql | 5 + src/server/game/Battlegrounds/ArenaTeamMgr.cpp | 4 +- src/server/game/Battlegrounds/Battleground.cpp | 4 +- src/server/game/Chat/Commands/Level3.cpp | 4 +- src/server/game/Entities/Creature/Creature.cpp | 8 +- src/server/game/Entities/Player/Player.cpp | 168 ++++++--------------- src/server/game/Entities/Player/Player.h | 19 +-- src/server/game/Entities/Unit/StatSystem.cpp | 8 +- .../game/Server/Protocol/Handlers/MiscHandler.cpp | 8 +- src/server/game/Server/Protocol/Opcodes.cpp | 1 - src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 +- src/server/game/Spells/SpellEffects.cpp | 2 +- src/server/scripts/Commands/cs_modify.cpp | 10 +- .../Database/Implementation/CharacterDatabase.cpp | 12 +- 14 files changed, 87 insertions(+), 170 deletions(-) create mode 100644 sql/updates/characters/2011_11_26_00_characters_characters.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2011_11_26_00_characters_characters.sql b/sql/updates/characters/2011_11_26_00_characters_characters.sql new file mode 100644 index 00000000000..9fe2b4c804e --- /dev/null +++ b/sql/updates/characters/2011_11_26_00_characters_characters.sql @@ -0,0 +1,5 @@ +ALTER TABLE `characters` +DROP COLUMN `todayHonorPoints`, +DROP COLUMN `yesterdayHonorPoints`, +DROP COLUMN `knownCurrencies`, +CHANGE COLUMN `arenaPoints` `conquestPoints` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `taxi_path`; diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index cf335ec1971..6357612607f 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -154,14 +154,16 @@ void ArenaTeamMgr::DistributeArenaPoints() SQLTransaction trans = CharacterDatabase.BeginTransaction(); // Cycle that gives points to all players + /* for (std::map::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) { // Add points to player if online if (Player* player = HashMapHolder::Find(playerItr->first)) - player->ModifyArenaPoints(playerItr->second, &trans); + player->ModifyConquestPoints(playerItr->second, &trans); else // Update database trans->PAppend("UPDATE characters SET arenaPoints=arenaPoints+%u WHERE guid=%u", playerItr->second, playerItr->first); } + */ CharacterDatabase.CommitTransaction(trans); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index af350ac39d6..7cfd4dec28e 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -842,8 +842,8 @@ void Battleground::EndBattleground(uint32 winner) if (IsRandom() || BattlegroundMgr::IsBGWeekend(GetTypeID())) { UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winner_kills)); - if (CanAwardArenaPoints()) - player->ModifyArenaPoints(winner_arena); + /*if (CanAwardArenaPoints()) + player->ModifyConquestPoints(winner_arena);*/ if (!player->GetRandomWinner()) player->SetRandomWinner(true); } diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 54f4ae4bdeb..aecf9122f5b 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -2461,11 +2461,9 @@ bool ChatHandler::HandleResetHonorCommand (const char * args) if (!extractPlayerTarget((char*)args, &target)) return false; - target->SetHonorPoints(0); + target->SetCurrency(CURRENCY_TYPE_HONOR_POINTS, 0); target->SetUInt32Value(PLAYER_FIELD_KILLS, 0); target->SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0); - target->SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0); - target->SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0); target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL); return true; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 922db88bcd0..b1a353dcb88 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1687,9 +1687,11 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* pVictim) break; } } - if (bcontinue) continue; - if (spellInfo->ManaCost > GetPower(POWER_MANA)) + if (bcontinue) + continue; + + if (spellInfo->ManaCost > (uint32)GetPower(POWER_MANA)) continue; float range = spellInfo->GetMaxRange(false); float minrange = spellInfo->GetMinRange(false); @@ -1732,7 +1734,7 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* pVictim) } if (bcontinue) continue; - if (spellInfo->ManaCost > GetPower(POWER_MANA)) + if (spellInfo->ManaCost > (uint32)GetPower(POWER_MANA)) continue; float range = spellInfo->GetMaxRange(true); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3017a618a20..5f9c900b39c 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -742,7 +742,6 @@ Player::Player (WorldSession* session): Unit(), m_achievementMgr(this), m_reputa m_canBlock = false; m_canDualWield = false; m_canTitanGrip = false; - m_ammoDPS = 0.0f; m_temporaryUnsummonedPetNumber = 0; //cache for UNIT_CREATED_BY_SPELL to allow @@ -989,8 +988,6 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) SetUInt32Value(PLAYER_FIELD_KILLS, 0); SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0); - SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0); - SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0); // set starting level uint32 start_level = getClass() != CLASS_DEATH_KNIGHT @@ -1009,8 +1006,8 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) InitRunes(); SetUInt32Value(PLAYER_FIELD_COINAGE, sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)); - SetHonorPoints(sWorld->getIntConfig(CONFIG_START_HONOR_POINTS)); - SetArenaPoints(sWorld->getIntConfig(CONFIG_START_ARENA_POINTS)); + SetCurrency(CURRENCY_TYPE_HONOR_POINTS, sWorld->getIntConfig(CONFIG_START_HONOR_POINTS)); + SetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, sWorld->getIntConfig(CONFIG_START_ARENA_POINTS)); // start with every map explored if (sWorld->getBoolConfig(CONFIG_START_ALL_EXPLORED)) @@ -7088,16 +7085,12 @@ void Player::UpdateHonorFields() // update yesterday's contribution if (m_lastHonorUpdateTime >= yesterday) { - SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, GetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION)); - // this is the first update today, reset today's contribution - SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0); SetUInt32Value(PLAYER_FIELD_KILLS, MAKE_PAIR32(0, kills_today)); } else { // no honor/kills yesterday or today, reset - SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0); SetUInt32Value(PLAYER_FIELD_KILLS, 0); } } @@ -7108,15 +7101,15 @@ void Player::UpdateHonorFields() ///Calculate the amount of honor gained based on the victim ///and the size of the group for which the honor is divided ///An exact honor value can also be given (overriding the calcs) -bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvptoken) +bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvptoken) { // do not reward honor in arenas, but enable onkill spellproc if (InArena()) { - if (!uVictim || uVictim == this || uVictim->GetTypeId() != TYPEID_PLAYER) + if (!victim || victim == this || victim->GetTypeId() != TYPEID_PLAYER) return false; - if (GetBGTeam() == uVictim->ToPlayer()->GetBGTeam()) + if (GetBGTeam() == victim->ToPlayer()->GetBGTeam()) return false; return true; @@ -7141,21 +7134,19 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvpt if (honor_f <= 0) { - if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT)) + if (!victim || victim == this || victim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT)) return false; - victim_guid = uVictim->GetGUID(); + victim_guid = victim->GetGUID(); - if (uVictim->GetTypeId() == TYPEID_PLAYER) + if (Player* plrVictim = victim->ToPlayer()) { - Player* pVictim = uVictim->ToPlayer(); - - if (GetTeam() == pVictim->GetTeam() && !sWorld->IsFFAPvPRealm()) + if (GetTeam() == plrVictim->GetTeam() && !sWorld->IsFFAPvPRealm()) return false; uint8 k_level = getLevel(); uint8 k_grey = Trinity::XP::GetGrayLevel(k_level); - uint8 v_level = pVictim->getLevel(); + uint8 v_level = plrVictim->getLevel(); if (v_level <= k_grey) return false; @@ -7166,7 +7157,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvpt // [15..28] Horde honor titles and player name // [29..38] Other title and player name // [39+] Nothing - uint32 victim_title = pVictim->GetUInt32Value(PLAYER_CHOSEN_TITLE); + uint32 victim_title = plrVictim->GetUInt32Value(PLAYER_CHOSEN_TITLE); // Get Killer titles, CharTitlesEntry::bit_index // Ranks: // title[1..14] -> rank[5..18] @@ -7188,14 +7179,14 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvpt // and those in a lifetime ApplyModUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 1, true); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL); - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, pVictim->getClass()); - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, pVictim->getRace()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, plrVictim->getClass()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, plrVictim->getRace()); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId()); - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, pVictim); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, plrVictim); } else { - if (!uVictim->ToCreature()->isRacialLeader()) + if (!victim->ToCreature()->isRacialLeader()) return false; honor_f = 100.0f; // ??? need more info @@ -7203,7 +7194,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvpt } } - if (uVictim != NULL) + if (victim != NULL) { if (groupsize > 1) honor_f /= groupsize; @@ -7228,9 +7219,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvpt GetSession()->SendPacket(&data); // add honor points - ModifyHonorPoints(honor); - - ApplyModUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, honor, true); + ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, int32(honor)); if (InBattleground() && honor > 0) { @@ -7242,10 +7231,10 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool pvpt if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE) && pvptoken) { - if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT)) + if (!victim || victim == this || victim ->HasAuraType(SPELL_AURA_NO_PVP_CREDIT)) return true; - if (uVictim->GetTypeId() == TYPEID_PLAYER) + if (victim->GetTypeId() == TYPEID_PLAYER) { // Check if allowed to receive it in current map uint8 MapType = sWorld->getIntConfig(CONFIG_PVP_TOKEN_MAP_TYPE); @@ -7273,7 +7262,7 @@ void Player::SendCurrencies() const for (PlayerCurrenciesMap::const_iterator itr = m_currencies.begin(); itr != m_currencies.end(); ++itr) { - const CurrencyTypesEntry* entry = sCurrencyTypesStore.LookupEntry(itr->first); + CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(itr->first); packet << uint32(itr->second.weekCount / PLAYER_CURRENCY_PRECISION); packet << uint8(0); // unknown packet << uint32(entry->ID); @@ -7302,7 +7291,7 @@ void Player::ModifyCurrency(uint32 id, int32 count) if (!count) return; - const CurrencyTypesEntry* currency = sCurrencyTypesStore.LookupEntry(id); + CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id); ASSERT(currency); uint32 oldTotalCount = 0; @@ -7413,46 +7402,6 @@ uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const return cap; } -void Player::SetHonorPoints(uint32 value) -{ - if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS)) - value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS); - SetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY, value); - if (value) - AddKnownCurrency(ITEM_HONOR_POINTS_ID); -} - -void Player::SetArenaPoints(uint32 value) -{ - if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS)) - value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS); - SetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY, value); - if (value) - AddKnownCurrency(ITEM_ARENA_POINTS_ID); -} - -void Player::ModifyHonorPoints(int32 value, SQLTransaction* trans /*=NULL*/) -{ - int32 newValue = int32(GetHonorPoints()) + value; - if (newValue < 0) - newValue = 0; - SetHonorPoints(uint32(newValue)); - - if (trans && !trans->null()) - (*trans)->PAppend("UPDATE characters SET totalHonorPoints=%u WHERE guid=%u", newValue, GetGUIDLow()); -} - -void Player::ModifyArenaPoints(int32 value, SQLTransaction* trans /*=NULL*/) -{ - int32 newValue = int32(GetArenaPoints()) + value; - if (newValue < 0) - newValue = 0; - SetArenaPoints(uint32(newValue)); - - if (trans && !trans->null()) - (*trans)->PAppend("UPDATE characters SET arenaPoints=%u WHERE guid=%u", newValue, GetGUIDLow()); -} - uint32 Player::GetGuildIdFromDB(uint64 guid) { QueryResult result = CharacterDatabase.PQuery("SELECT guildid FROM guild_member WHERE guid='%u'", GUID_LOPART(guid)); @@ -14975,9 +14924,6 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, InitTalentForLevel(); } - if (quest->GetRewArenaPoints()) - ModifyArenaPoints(quest->GetRewArenaPoints()); - // Send reward mail if (uint32 mail_template_id = quest->GetRewMailTemplateId()) { @@ -16489,11 +16435,11 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " // 25 26 27 28 29 30 31 32 33 34 35 36 37 38 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " - // 39 40 41 42 43 44 45 46 47 48 49 - //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - // 50 51 52 53 54 55 56 57 58 59 60 + // 39 40 41 42 43 44 45 46 47 + //"conquestPoints, totalHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " + // 48 49 50 51 52 53 54 55 56 57 58 //"health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, " - // 61 62 63 64 + // 59 60 61 62 //"knownTitles, actionBars, grantableLevels, guildId FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADFROM); @@ -16553,8 +16499,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[59].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[61].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); + _LoadIntoDataField(fields[57].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[59].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE); SetFloatValue(UNIT_FIELD_COMBATREACH, 1.5f); @@ -16570,12 +16516,10 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetUInt32Value(PLAYER_BYTES, fields[9].GetUInt32()); SetUInt32Value(PLAYER_BYTES_2, fields[10].GetUInt32()); - SetUInt32Value(PLAYER_BYTES_3, (fields[49].GetUInt16() & 0xFFFE) | fields[5].GetUInt8()); + SetUInt32Value(PLAYER_BYTES_3, (fields[47].GetUInt16() & 0xFFFE) | fields[5].GetUInt8()); SetUInt32Value(PLAYER_FLAGS, fields[11].GetUInt32()); SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[48].GetUInt32()); - SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[47].GetUInt64()); - // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) SetByteValue(PLAYER_FIELD_BYTES, 2, fields[62].GetUInt8()); @@ -16608,7 +16552,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) uint32 transGUID = uint32(fields[30].GetUInt64()); // field type is uint64 but lowguid is saved Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat()); uint32 mapId = fields[15].GetUInt16(); - uint32 instanceId = fields[56].GetUInt8(); + uint32 instanceId = fields[54].GetUInt8(); uint32 dungeonDiff = fields[38].GetUInt32() & 0x0F; if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY) @@ -16627,8 +16571,6 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) _LoadArenaTeamInfo(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADARENAINFO)); - SetArenaPoints(fields[39].GetUInt32()); - // check arena teams integrity for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot) { @@ -16645,12 +16587,11 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetArenaTeamInfoField(arena_slot, ArenaTeamInfoType(j), 0); } - SetHonorPoints(fields[40].GetUInt32()); - SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[41].GetUInt32()); - SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[42].GetUInt32()); - SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[43].GetUInt32()); - SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[44].GetUInt16()); - SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[45].GetUInt16()); + SetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, fields[39].GetUInt32()); + SetCurrency(CURRENCY_TYPE_HONOR_POINTS, fields[40].GetUInt32()); + SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[41].GetUInt32()); + SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[42].GetUInt16()); + SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[43].GetUInt16()); _LoadBoundInstances(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADBOUNDINSTANCES)); _LoadInstanceTimeRestrictions(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADINSTANCELOCKTIMES)); @@ -16970,8 +16911,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) //mails are loaded only when needed ;-) - when player in game click on mailbox. //_LoadMail(); - m_specsCount = fields[57].GetUInt8(); - m_activeSpec = fields[58].GetUInt8(); + m_specsCount = fields[55].GetUInt8(); + m_activeSpec = fields[56].GetUInt8(); // sanity check if (m_specsCount > MAX_TALENT_SPECS || m_activeSpec > MAX_TALENT_SPEC || m_specsCount < MIN_TALENT_SPECS) @@ -17018,7 +16959,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded - uint32 curTitle = fields[46].GetUInt32(); + uint32 curTitle = fields[44].GetUInt32(); if (curTitle && !HasTitle(curTitle)) curTitle = 0; @@ -17041,11 +16982,11 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) UpdateAllStats(); // restore remembered power/health values (but not more max values) - uint32 savedHealth = fields[50].GetUInt32(); + uint32 savedHealth = fields[48].GetUInt32(); SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); for (uint8 i = 0; i < MAX_STORED_POWERS; ++i) { - uint32 savedPower = fields[51+i].GetUInt32(); + uint32 savedPower = fields[49+i].GetUInt32(); SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower); } @@ -17101,7 +17042,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[63].GetUInt32(); + m_grantableLevels = fields[61].GetUInt32(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -18355,15 +18296,12 @@ void Player::SaveToDB(bool create /*=false*/) ss << m_taxi.SaveTaxiDestinationsToString(); stmt->setString(index++, ss.str()); - stmt->setUInt32(index++, GetArenaPoints()); - stmt->setUInt32(index++, GetHonorPoints()); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION)); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION)); + stmt->setUInt32(index++, GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS)); + stmt->setUInt32(index++, GetCurrency(CURRENCY_TYPE_HONOR_POINTS)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS)); stmt->setUInt16(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0)); stmt->setUInt16(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_CHOSEN_TITLE)); - stmt->setUInt64(index++, GetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX)); stmt->setUInt16(index++, (uint16)(GetUInt32Value(PLAYER_BYTES_3) & 0xFFFE)); stmt->setUInt32(index++, GetHealth()); @@ -18385,9 +18323,7 @@ void Player::SaveToDB(bool create /*=false*/) // cache equipment... for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i) ss << GetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + i) << ' '; - stmt->setString(index++, ss.str()); - ss.str().clear(); // ...and bags for enum opcode for (uint32 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) { @@ -18397,14 +18333,13 @@ void Player::SaveToDB(bool create /*=false*/) ss << '0'; ss << " 0 "; } - stmt->setString(index++, ss.str()); ss.str().clear(); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) ss << GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES + i); - stmt->setString(index++, ss.str()); + stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, 2)); stmt->setUInt32(index++, m_grantableLevels); } @@ -18467,15 +18402,12 @@ void Player::SaveToDB(bool create /*=false*/) ss << m_taxi.SaveTaxiDestinationsToString(); stmt->setString(index++, ss.str()); - stmt->setUInt32(index++, GetArenaPoints()); - stmt->setUInt32(index++, GetHonorPoints()); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION)); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION)); + stmt->setUInt32(index++, GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS)); + stmt->setUInt32(index++, GetCurrency(CURRENCY_TYPE_HONOR_POINTS)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS)); stmt->setUInt16(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0)); stmt->setUInt16(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_CHOSEN_TITLE)); - stmt->setUInt64(index++, GetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX)); stmt->setUInt16(index++, (uint16)(GetUInt32Value(PLAYER_BYTES_3) & 0xFFFE)); stmt->setUInt32(index++, GetHealth()); @@ -21575,6 +21507,7 @@ void Player::SendInitialPacketsBeforeAddToMap() // SMSG_PET_GUIDS // SMSG_UPDATE_WORLD_STATE // SMSG_POWER_UPDATE + SendCurrencies(); } void Player::SendInitialPacketsAfterAddToMap() @@ -21983,6 +21916,7 @@ void Player::ResetWeeklyQuestStatus() m_weeklyquests.clear(); // DB data deleted in caller m_WeeklyQuestChanged = false; + } Battleground* Player::GetBattleground() const @@ -24735,13 +24669,7 @@ void Player::RefundItem(Item* item) if (moneyRefund) ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB - // Grant back Honor points - //if (uint32 honorRefund = iece->reqhonorpoints) - // ModifyHonorPoints(honorRefund, &trans); - - // Grant back Arena points - //if (uint32 arenaRefund = iece->reqarenapoints) - // ModifyArenaPoints(arenaRefund, &trans); + // Grant back Arena and Honor points ? SaveInventoryAndGoldToDB(trans); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index efe9dd487d5..75c99ec0eff 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -895,12 +895,6 @@ enum CharDeleteMethod // the name gets freed up and appears as deleted ingame }; -enum CurrencyItems -{ - ITEM_HONOR_POINTS_ID = 43308, - ITEM_ARENA_POINTS_ID = 43307 -}; - enum ReferAFriendError { ERR_REFER_A_FRIEND_NONE = 0x00, @@ -1320,10 +1314,6 @@ class Player : public Unit, public GridObject void ModifyCurrency(uint32 id, int32 count); void ApplyEquipCooldown(Item* pItem); - void SetAmmo(uint32 item); - void RemoveAmmo(); - float GetAmmoDPS() const { return m_ammoDPS; } - bool CheckAmmoCompatibility(const ItemTemplate* ammo_proto) const; void QuickEquipItem(uint16 pos, Item* pItem); void VisualizeItem(uint8 slot, Item* pItem); void SetVisibleItemSlot(uint8 slot, Item* pItem); @@ -2090,14 +2080,8 @@ class Player : public Unit, public GridObject /*********************************************************/ // TODO: Properly implement correncies as of Cataclysm void UpdateHonorFields(); - bool RewardHonor(Unit* pVictim, uint32 groupsize, int32 honor = -1, bool pvptoken = false); - uint32 GetHonorPoints() const { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); } - uint32 GetArenaPoints() const { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); } - void ModifyHonorPoints(int32 value, SQLTransaction* trans = NULL); //! If trans is specified, honor save query will be added to trans - void ModifyArenaPoints(int32 value, SQLTransaction* trans = NULL); //! If trans is specified, arena point save query will be added to trans + bool RewardHonor(Unit* victim, uint32 groupsize, int32 honor = -1, bool pvptoken = false); uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const; - void SetHonorPoints(uint32 value); - void SetArenaPoints(uint32 value); //End of PvP System @@ -2780,7 +2764,6 @@ class Player : public Unit, public GridObject bool m_canBlock; bool m_canTitanGrip; uint8 m_swingErrorMsg; - float m_ammoDPS; ////////////////////Rest System///////////////////// time_t time_inn_enter; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index aa5d783323a..d263b37e6ef 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -512,11 +512,13 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo weapon_mindamage = BASE_MINDAMAGE; weapon_maxdamage = BASE_MAXDAMAGE; } + /* + TODO: Is this still needed after ammo has been removed? else if (attType == RANGED_ATTACK) //add ammo DPS to ranged damage { - weapon_mindamage += GetAmmoDPS() * att_speed; - weapon_maxdamage += GetAmmoDPS() * att_speed; - } + weapon_mindamage += ammo * att_speed; + weapon_maxdamage += ammo * att_speed; + }*/ min_damage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct; max_damage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct; diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp index bf40b048151..63ea359755d 100755 --- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp @@ -1227,13 +1227,11 @@ void WorldSession::HandleInspectHonorStatsOpcode(WorldPacket& recv_data) return; } - WorldPacket data(SMSG_INSPECT_HONOR_STATS, 8+1+4*4); - data << uint64(player->GetGUID()); - data << uint8(player->GetHonorPoints()); + WorldPacket data(SMSG_INSPECT_HONOR_STATS, 4+1+4+8); data << uint32(player->GetUInt32Value(PLAYER_FIELD_KILLS)); - data << uint32(player->GetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION)); - data << uint32(player->GetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION)); + data << uint8(0); // rank data << uint32(player->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS)); + data << uint64(player->GetGUID()); SendPacket(&data); } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ad182b4120a..3152d19e744 100755 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -658,7 +658,6 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_LIST_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_SET_AMMO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_PET_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCancelAuraOpcode ); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 867ae80319f..bd9a0159c72 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1972,7 +1972,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo if (PowerType != POWER_MANA) { - uint32 oldPower = target->GetPower(PowerType); + int32 oldPower = target->GetPower(PowerType); // reset power to default values only at power change if (target->getPowerType() != PowerType) target->setPowerType(PowerType); @@ -1999,7 +1999,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo break; case FORM_BEAR: case FORM_DIREBEAR: - if (urand(0, 99) < FurorChance) + if (irand(0, 99) < FurorChance) target->CastSpell(target, 17057, true); default: { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index f98d0ab3e46..e95203d97be 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -700,7 +700,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) damage += int32(dmg_min); else damage += irand(int32(dmg_min), int32(dmg_max)); - damage += int32(m_caster->ToPlayer()->GetAmmoDPS()*item->GetTemplate()->Delay*0.001f); + damage += int32(item->GetTemplate()->Delay*0.001f); } } } diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 28bc17a7450..ed97cbf7659 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1093,7 +1093,7 @@ public: return true; } - static bool HandleModifyHonorCommand (ChatHandler* handler, const char* args) + static bool HandleModifyHonorCommand(ChatHandler* handler, const char* args) { if (!*args) return false; @@ -1112,9 +1112,9 @@ public: int32 amount = (uint32)atoi(args); - target->ModifyHonorPoints(amount); + target->ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, amount); - handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetHonorPoints()); + handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_HONOR_POINTS)); return true; } @@ -1302,9 +1302,9 @@ public: int32 amount = (uint32)atoi(args); - target->ModifyArenaPoints(amount); + target->ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, amount); - handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetArenaPoints()); + handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS)); return true; } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 41e9a1c8220..b5ea47d1a53 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -41,8 +41,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_LOAD_PLAYER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, " "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " - "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, guildId FROM characters WHERE guid = ?", CONNECTION_ASYNC) + "conquestPoints, totalHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + "health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_GROUP, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_BOUNDINSTANCES, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, " @@ -309,14 +309,14 @@ void CharacterDatabaseConnection::DoPrepareStatements() "taximask, cinematic, " "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, " "extra_flags, stable_slots, at_login, zone, " - "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, " - "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, " + "death_expire_time, taxi_path, conquestPoints, totalHonorPoints, totalKills, " + "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " "power4, power5, latency, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, guildId) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?," "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," - "arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?," + "conquestPoints=?,totalHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,latency=?,speccount=?,activespec=?,exploredZones=?," "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,guildId=?,online=? WHERE guid=?", CONNECTION_ASYNC); } -- cgit v1.2.3 From 996364752c96b80b3903177693277ef3fbf6dab8 Mon Sep 17 00:00:00 2001 From: Spp Date: Wed, 28 Dec 2011 10:42:43 +0100 Subject: Core/Scripts: Replace rand with urand in most cases (using regexp) Used: perl -pi -e 's/([0-9]+) \+ rand\(\)\%([0-9]+)/"urand(".$1.", ".($1+$2).")"/ge' --- .../BlackwingLair/boss_flamegor.cpp | 2 +- .../EasternKingdoms/Karazhan/bosses_opera.cpp | 2 +- .../MagistersTerrace/boss_priestess_delrissa.cpp | 2 +- .../MagistersTerrace/boss_selin_fireheart.cpp | 10 +++---- .../EasternKingdoms/ScarletEnclave/chapter2.cpp | 6 ++-- .../EasternKingdoms/ScarletEnclave/chapter5.cpp | 12 ++++---- .../ScarletMonastery/boss_arcanist_doan.cpp | 2 +- .../ScarletMonastery/boss_bloodmage_thalnos.cpp | 2 +- .../ScarletMonastery/boss_interrogator_vishas.cpp | 2 +- .../Scholomance/boss_darkmaster_gandling.cpp | 6 ++-- .../Scholomance/boss_jandice_barov.cpp | 4 +-- .../Stratholme/boss_dathrohan_balnazzar.cpp | 4 +-- .../SunwellPlateau/boss_kalecgos.cpp | 2 +- .../EasternKingdoms/ZulAman/boss_akilzon.cpp | 8 +++--- .../EasternKingdoms/ZulAman/boss_halazzi.cpp | 2 +- .../EasternKingdoms/ZulAman/boss_nalorakk.cpp | 32 +++++++++++----------- .../EasternKingdoms/ZulAman/boss_zuljin.cpp | 6 ++-- .../EasternKingdoms/ZulGurub/boss_gahzranka.cpp | 6 ++-- .../EasternKingdoms/ZulGurub/boss_grilek.cpp | 8 +++--- .../EasternKingdoms/ZulGurub/boss_hakkar.cpp | 10 +++---- .../EasternKingdoms/ZulGurub/boss_hazzarah.cpp | 12 ++++---- .../EasternKingdoms/ZulGurub/boss_jeklik.cpp | 14 +++++----- .../EasternKingdoms/ZulGurub/boss_jindo.cpp | 10 +++---- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 2 +- .../EasternKingdoms/ZulGurub/boss_marli.cpp | 6 ++-- .../EasternKingdoms/ZulGurub/boss_renataki.cpp | 12 ++++---- .../EasternKingdoms/ZulGurub/boss_thekal.cpp | 10 +++---- .../EasternKingdoms/ZulGurub/boss_wushoolay.cpp | 8 +++--- .../scripts/EasternKingdoms/eversong_woods.cpp | 6 ++-- .../CavernsOfTime/BattleForMountHyjal/hyjal.cpp | 10 +++---- .../boss_captain_skarloc.cpp | 8 +++--- .../EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp | 6 ++-- .../boss_amnennar_the_coldbringer.cpp | 2 +- .../Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp | 20 +++++++------- .../Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp | 12 ++++---- .../Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp | 14 +++++----- .../Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp | 22 +++++++-------- .../Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp | 26 +++++++++--------- .../Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp | 8 +++--- .../TempleOfAhnQiraj/boss_twinemperors.cpp | 14 +++++----- src/server/scripts/Kalimdor/azuremyst_isle.cpp | 4 +-- src/server/scripts/Kalimdor/boss_azuregos.cpp | 16 +++++------ .../Northrend/Naxxramas/boss_anubrekhan.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_noth.cpp | 8 +++--- .../Ulduar/HallsOfLightning/boss_bjarngrim.cpp | 30 ++++++++++---------- .../Ulduar/HallsOfLightning/boss_loken.cpp | 4 +-- .../Ulduar/HallsOfStone/boss_krystallus.cpp | 16 +++++------ .../Ulduar/HallsOfStone/boss_maiden_of_grief.cpp | 12 ++++---- .../Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp | 14 +++++----- .../Ulduar/HallsOfStone/halls_of_stone.cpp | 4 +-- .../Northrend/Ulduar/Ulduar/boss_algalon.cpp | 2 +- .../AuchenaiCrypts/boss_exarch_maladaar.cpp | 2 +- .../ManaTombs/boss_nexusprince_shaffar.cpp | 10 +++---- .../SethekkHalls/boss_darkweaver_syth.cpp | 8 +++--- .../ShadowLabyrinth/boss_ambassador_hellmaw.cpp | 8 +++--- .../boss_blackheart_the_inciter.cpp | 4 +-- .../ShadowLabyrinth/boss_grandmaster_vorpil.cpp | 4 +-- .../Auchindoun/ShadowLabyrinth/boss_murmur.cpp | 6 ++-- .../scripts/Outland/BlackTemple/boss_illidan.cpp | 24 ++++++++-------- .../Outland/BlackTemple/boss_mother_shahraz.cpp | 6 ++-- .../BlackTemple/boss_reliquary_of_souls.cpp | 4 +-- .../Outland/BlackTemple/boss_teron_gorefiend.cpp | 8 +++--- .../Outland/BlackTemple/illidari_council.cpp | 14 +++++----- .../SerpentShrine/boss_leotheras_the_blind.cpp | 8 +++--- .../scripts/Outland/GruulsLair/boss_gruul.cpp | 2 +- .../Outland/GruulsLair/boss_high_king_maulgar.cpp | 10 +++---- .../MagtheridonsLair/boss_magtheridon.cpp | 14 +++++----- .../Mechanar/boss_gatewatcher_ironhand.cpp | 4 +-- .../Mechanar/boss_nethermancer_sepethrea.cpp | 14 +++++----- .../Mechanar/boss_pathaleon_the_calculator.cpp | 22 +++++++-------- .../TempestKeep/botanica/boss_warp_splinter.cpp | 8 +++--- 71 files changed, 321 insertions(+), 321 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp index 4e44a70475f..a7c984fa536 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp @@ -70,7 +70,7 @@ public: if (ShadowFlame_Timer <= diff) { DoCast(me->getVictim(), SPELL_SHADOWFLAME); - ShadowFlame_Timer = 15000 + rand()%7000; + ShadowFlame_Timer = urand(15000, 22000); } else ShadowFlame_Timer -= diff; //WingBuffet_Timer diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index 8454150d830..389f0d0a959 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -824,7 +824,7 @@ public: void Reset() { ChaseTimer = 30000; - FearTimer = 25000 + rand()%10000; + FearTimer = urand(25000, 35000); SwipeTimer = 5000; HoodGUID = 0; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 55254a3b8ee..bf58d6f2853 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -467,7 +467,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI if (ResetThreatTimer <= diff) { DoResetThreat(); - ResetThreatTimer = 5000 + rand()%15000; + ResetThreatTimer = urand(5000, 20000); } else ResetThreatTimer -= diff; } }; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index 305ce97687a..93b0b45a3e3 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -122,13 +122,13 @@ public: instance->SetData(DATA_SELIN_EVENT, NOT_STARTED); } else sLog->outError(ERROR_INST_DATA); - DrainLifeTimer = 3000 + rand()%4000; + DrainLifeTimer = urand(3000, 7000); DrainManaTimer = DrainLifeTimer + 5000; FelExplosionTimer = 2100; if (IsHeroic()) - DrainCrystalTimer = 10000 + rand()%5000; + DrainCrystalTimer = urand(10000, 15000); else - DrainCrystalTimer = 20000 + rand()%5000; + DrainCrystalTimer = urand(20000, 25000); EmpowerTimer = 10000; IsDraining = false; @@ -285,9 +285,9 @@ public: { SelectNearestCrystal(); if (IsHeroic()) - DrainCrystalTimer = 10000 + rand()%5000; + DrainCrystalTimer = urand(10000, 15000); else - DrainCrystalTimer = 20000 + rand()%5000; + DrainCrystalTimer = urand(20000, 25000); } else DrainCrystalTimer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 8179c9fccaa..6d316eff94f 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -482,21 +482,21 @@ public: { Shout(); DoCast(me, SPELL_RENEW); - uiRenew_timer = 1000 + rand()%5000; + uiRenew_timer = urand(1000, 6000); } else uiRenew_timer -= diff; if (uiInquisitor_Penance_timer <= diff) { Shout(); DoCast(me->getVictim(), SPELL_INQUISITOR_PENANCE); - uiInquisitor_Penance_timer = 2000 + rand()%5000; + uiInquisitor_Penance_timer = urand(2000, 7000); } else uiInquisitor_Penance_timer -= diff; if (uiValroth_Smite_timer <= diff) { Shout(); DoCast(me->getVictim(), SPELL_VALROTH_SMITE); - uiValroth_Smite_timer = 1000 + rand()%5000; + uiValroth_Smite_timer = urand(1000, 6000); } else uiValroth_Smite_timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 3ee71ce3609..5b89651f2b0 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -1352,31 +1352,31 @@ public: if (uiAnti_magic_zone <= diff) { DoCast(me, SPELL_ANTI_MAGIC_ZONE1); - uiAnti_magic_zone = 25000 + rand()%5000; + uiAnti_magic_zone = urand(25000, 30000); } else uiAnti_magic_zone -= diff; if (uiDeath_strike <= diff) { DoCast(me->getVictim(), SPELL_DEATH_STRIKE); - uiDeath_strike = 5000 + rand()%5000; + uiDeath_strike = urand(5000, 10000); } else uiDeath_strike -= diff; if (uiDeath_embrace <= diff) { DoCast(me->getVictim(), SPELL_DEATH_EMBRACE); - uiDeath_embrace = 5000 + rand()%5000; + uiDeath_embrace = urand(5000, 10000); } else uiDeath_embrace -= diff; if (uiIcy_touch <= diff) { DoCast(me->getVictim(), SPELL_ICY_TOUCH1); - uiIcy_touch = 5000 + rand()%5000; + uiIcy_touch = urand(5000, 10000); } else uiIcy_touch -= diff; if (uiUnholy_blight <= diff) { DoCast(me->getVictim(), SPELL_UNHOLY_BLIGHT); - uiUnholy_blight = 5000 + rand()%5000; + uiUnholy_blight = urand(5000, 10000); } else uiUnholy_blight -= diff; if (uiFight_speech <= diff) @@ -1387,7 +1387,7 @@ public: SAY_LIGHT_OF_DAWN18, SAY_LIGHT_OF_DAWN19, SAY_LIGHT_OF_DAWN20, SAY_LIGHT_OF_DAWN21, SAY_LIGHT_OF_DAWN22, SAY_LIGHT_OF_DAWN23, SAY_LIGHT_OF_DAWN24), me); - uiFight_speech = 15000 + rand()%5000; + uiFight_speech = urand(15000, 20000); } else uiFight_speech -= diff; // Check spawns diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp index a5fe8a5c6db..25295e62ff3 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp @@ -111,7 +111,7 @@ public: if (AoESilence_Timer <= diff) { DoCast(me->getVictim(), SPELL_AOESILENCE); - AoESilence_Timer = 15000 + rand()%5000; + AoESilence_Timer = urand(15000, 20000); } else AoESilence_Timer -= diff; //ArcaneExplosion_Timer diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp index 16875dce85f..733b3a91f93 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp @@ -92,7 +92,7 @@ public: if (FlameShock_Timer <= diff) { DoCast(me->getVictim(), SPELL_FLAMESHOCK); - FlameShock_Timer = 10000 + rand()%5000; + FlameShock_Timer = urand(10000, 15000); } else FlameShock_Timer -= diff; //FlameSpike_Timer diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp index 2277d867455..e66c639896e 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp @@ -107,7 +107,7 @@ public: if (ShadowWordPain_Timer <= diff) { DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN); - ShadowWordPain_Timer = 5000 + rand()%10000; + ShadowWordPain_Timer = urand(5000, 15000); } else ShadowWordPain_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 12dd67e009d..d930dd4a14c 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -108,14 +108,14 @@ public: if (ShadowShield_Timer <= diff) { DoCast(me, SPELL_SHADOWSHIELD); - ShadowShield_Timer = 14000 + rand()%14000; + ShadowShield_Timer = urand(14000, 28000); } else ShadowShield_Timer -= diff; //Curse_Timer if (Curse_Timer <= diff) { DoCast(me->getVictim(), SPELL_CURSE); - Curse_Timer = 15000 + rand()%12000; + Curse_Timer = urand(15000, 27000); } else Curse_Timer -= diff; //Teleporting Random Target to one of the six pre boss rooms and spawn 3-4 skeletons near the gamer. @@ -214,7 +214,7 @@ public: break; } } - Teleport_Timer = 20000 + rand()%15000; + Teleport_Timer = urand(20000, 35000); } else Teleport_Timer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 9dd9f1fedb5..2d1d78193ed 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -171,7 +171,7 @@ public: void Reset() { - Cleave_Timer = 2000 + rand()%6000; + Cleave_Timer = urand(2000, 8000); me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); } @@ -192,7 +192,7 @@ public: DoCast(me->getVictim(), SPELL_CLEAVE); //5-8 seconds - Cleave_Timer = 5000 + rand()%3000; + Cleave_Timer = urand(5000, 8000); } else Cleave_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp index 17ea8a04293..3cbf00f291d 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp @@ -131,7 +131,7 @@ public: if (m_uiMindBlast_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_MINDBLAST); - m_uiMindBlast_Timer = 15000 + rand()%5000; + m_uiMindBlast_Timer = urand(15000, 20000); } else m_uiMindBlast_Timer -= uiDiff; //CrusadersHammer @@ -173,7 +173,7 @@ public: if (m_uiMindBlast_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_MINDBLAST); - m_uiMindBlast_Timer = 15000 + rand()%5000; + m_uiMindBlast_Timer = urand(15000, 20000); } else m_uiMindBlast_Timer -= uiDiff; //ShadowShock diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index df3bb5d4525..747d9e29ec1 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -612,7 +612,7 @@ public: KalecGUID = 0; } - ShadowBoltTimer = 7000 + rand()%3 * 1000; + ShadowBoltTimer = urand(7, 10) * 1000; AgonyCurseTimer = 20000; CorruptionStrikeTimer = 13000; CheckTimer = 1000; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 413897c94e8..ffccfbce2b6 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -296,13 +296,13 @@ class boss_akilzon : public CreatureScript Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); if (!target) target = me->getVictim(); DoCast(target, SPELL_GUST_OF_WIND); - GustOfWind_Timer = (20+rand()%10)*1000; //20 to 30 seconds(bosskillers) + GustOfWind_Timer = urand(20, 30) * 1000; //20 to 30 seconds(bosskillers) } else GustOfWind_Timer -= diff; if (CallLighting_Timer <= diff) { DoCast(me->getVictim(), SPELL_CALL_LIGHTNING); - CallLighting_Timer = (12 + rand()%5)*1000; //totaly random timer. can't find any info on this + CallLighting_Timer = urand(12, 17) * 1000; //totaly random timer. can't find any info on this } else CallLighting_Timer -= diff; if (!isRaining && ElectricalStorm_Timer < uint32(8000 + rand() % 5000)) @@ -406,7 +406,7 @@ class mob_akilzon_eagle : public CreatureScript void Reset() { - EagleSwoop_Timer = 5000 + rand()%5000; + EagleSwoop_Timer = urand(5000, 10000); arrived = true; TargetGUID = 0; me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); @@ -425,7 +425,7 @@ class mob_akilzon_eagle : public CreatureScript DoCast(target, SPELL_EAGLE_SWOOP, true); TargetGUID = 0; me->SetSpeed(MOVE_RUN, 1.2f); - EagleSwoop_Timer = 5000 + rand()%5000; + EagleSwoop_Timer = urand(5000, 10000); } } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp index a3c7aae4132..80c31d42a46 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp @@ -263,7 +263,7 @@ class boss_halazzi : public CreatureScript DoCast(target, SPELL_EARTHSHOCK); else DoCast(target, SPELL_FLAMESHOCK); - ShockTimer = 10000 + rand()%5000; + ShockTimer = urand(10000, 15000); } } else ShockTimer -= diff; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 3ff465a3c1d..0ae8a9bc5c4 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -145,10 +145,10 @@ class boss_nalorakk : public CreatureScript if (instance) instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED); - Surge_Timer = 15000 + rand()%5000; - BrutalSwipe_Timer = 7000 + rand()%5000; - Mangle_Timer = 10000 + rand()%5000; - ShapeShift_Timer = 45000 + rand()%5000; + Surge_Timer = urand(15000, 20000); + BrutalSwipe_Timer = urand(7000, 12000); + Mangle_Timer = urand(10000, 15000); + ShapeShift_Timer = urand(45000, 50000); Berserk_Timer = 600000; inBearForm = false; @@ -371,10 +371,10 @@ class boss_nalorakk : public CreatureScript me->MonsterYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_YELL_TOTROLL); me->RemoveAurasDueToSpell(SPELL_BEARFORM); - Surge_Timer = 15000 + rand()%5000; - BrutalSwipe_Timer = 7000 + rand()%5000; - Mangle_Timer = 10000 + rand()%5000; - ShapeShift_Timer = 45000 + rand()%5000; + Surge_Timer = urand(15000, 20000); + BrutalSwipe_Timer = urand(7000, 12000); + Mangle_Timer = urand(10000, 15000); + ShapeShift_Timer = urand(45000, 50000); inBearForm = false; } else @@ -385,8 +385,8 @@ class boss_nalorakk : public CreatureScript DoCast(me, SPELL_BEARFORM, true); LaceratingSlash_Timer = 2000; // dur 18s RendFlesh_Timer = 3000; // dur 5s - DeafeningRoar_Timer = 5000 + rand()%5000; // dur 2s - ShapeShift_Timer = 20000 + rand()%5000; // dur 30s + DeafeningRoar_Timer = urand(5000, 10000); // dur 2s + ShapeShift_Timer = urand(20000, 25000); // dur 30s inBearForm = true; } } else ShapeShift_Timer -= diff; @@ -396,7 +396,7 @@ class boss_nalorakk : public CreatureScript if (BrutalSwipe_Timer <= diff) { DoCast(me->getVictim(), SPELL_BRUTALSWIPE); - BrutalSwipe_Timer = 7000 + rand()%5000; + BrutalSwipe_Timer = urand(7000, 12000); } else BrutalSwipe_Timer -= diff; if (Mangle_Timer <= diff) @@ -406,7 +406,7 @@ class boss_nalorakk : public CreatureScript DoCast(me->getVictim(), SPELL_MANGLE); Mangle_Timer = 1000; } - else Mangle_Timer = 10000 + rand()%5000; + else Mangle_Timer = urand(10000, 15000); } else Mangle_Timer -= diff; if (Surge_Timer <= diff) @@ -416,7 +416,7 @@ class boss_nalorakk : public CreatureScript Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true); if (target) DoCast(target, SPELL_SURGE); - Surge_Timer = 15000 + rand()%5000; + Surge_Timer = urand(15000, 20000); } else Surge_Timer -= diff; } else @@ -424,19 +424,19 @@ class boss_nalorakk : public CreatureScript if (LaceratingSlash_Timer <= diff) { DoCast(me->getVictim(), SPELL_LACERATINGSLASH); - LaceratingSlash_Timer = 18000 + rand()%5000; + LaceratingSlash_Timer = urand(18000, 23000); } else LaceratingSlash_Timer -= diff; if (RendFlesh_Timer <= diff) { DoCast(me->getVictim(), SPELL_RENDFLESH); - RendFlesh_Timer = 5000 + rand()%5000; + RendFlesh_Timer = urand(5000, 10000); } else RendFlesh_Timer -= diff; if (DeafeningRoar_Timer <= diff) { DoCast(me->getVictim(), SPELL_DEAFENINGROAR); - DeafeningRoar_Timer = 15000 + rand()%5000; + DeafeningRoar_Timer = urand(15000, 20000); } else DeafeningRoar_Timer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index ae6a25d2c17..5dbe3fc9409 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -430,7 +430,7 @@ class boss_zuljin : public CreatureScript if (Whirlwind_Timer <= diff) { DoCast(me, SPELL_WHIRLWIND); - Whirlwind_Timer = 15000 + rand()%5000; + Whirlwind_Timer = urand(15000, 20000); } else Whirlwind_Timer -= diff; if (Grievous_Throw_Timer <= diff) @@ -489,7 +489,7 @@ class boss_zuljin : public CreatureScript ++Claw_Counter; if (Claw_Counter == 12) { - Claw_Rage_Timer = 15000 + rand()%5000; + Claw_Rage_Timer = urand(15000, 20000); me->SetSpeed(MOVE_RUN, 1.2f); AttackStart(Unit::GetUnit(*me, TankGUID)); TankGUID = 0; @@ -537,7 +537,7 @@ class boss_zuljin : public CreatureScript ++Claw_Counter; if (Claw_Counter == 9) { - Lynx_Rush_Timer = 15000 + rand()%5000; + Lynx_Rush_Timer = urand(15000, 20000); me->SetSpeed(MOVE_RUN, 1.2f); AttackStart(Unit::GetUnit(*me, TankGUID)); TankGUID = 0; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp index c515b625e6f..5ca43e9268e 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp @@ -66,7 +66,7 @@ class boss_gahzranka : public CreatureScript if (Frostbreath_Timer <= diff) { DoCast(me->getVictim(), SPELL_FROSTBREATH); - Frostbreath_Timer = 7000 + rand()%4000; + Frostbreath_Timer = urand(7000, 11000); } else Frostbreath_Timer -= diff; //MassiveGeyser_Timer @@ -75,14 +75,14 @@ class boss_gahzranka : public CreatureScript DoCast(me->getVictim(), SPELL_MASSIVEGEYSER); DoResetThreat(); - MassiveGeyser_Timer = 22000 + rand()%10000; + MassiveGeyser_Timer = urand(22000, 32000); } else MassiveGeyser_Timer -= diff; //Slam_Timer if (Slam_Timer <= diff) { DoCast(me->getVictim(), SPELL_SLAM); - Slam_Timer = 12000 + rand()%8000; + Slam_Timer = urand(12000, 20000); } else Slam_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index e01dafd4777..d3922602a17 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -47,8 +47,8 @@ class boss_grilek : public CreatureScript void Reset() { - Avartar_Timer = 15000 + rand()%10000; - GroundTremor_Timer = 8000 + rand()%8000; + Avartar_Timer = urand(15000, 25000); + GroundTremor_Timer = urand(8000, 16000); } void EnterCombat(Unit* /*who*/) @@ -75,14 +75,14 @@ class boss_grilek : public CreatureScript if (target) AttackStart(target); - Avartar_Timer = 25000 + rand()%10000; + Avartar_Timer = urand(25000, 35000); } else Avartar_Timer -= diff; //GroundTremor_Timer if (GroundTremor_Timer <= diff) { DoCast(me->getVictim(), SPELL_GROUNDTREMOR); - GroundTremor_Timer = 12000 + rand()%4000; + GroundTremor_Timer = urand(12000, 16000); } else GroundTremor_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp index 77b8955158a..484499b1567 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp @@ -126,7 +126,7 @@ class boss_hakkar : public CreatureScript if (CorruptedBlood_Timer <= diff) { DoCast(me->getVictim(), SPELL_CORRUPTEDBLOOD); - CorruptedBlood_Timer = 30000 + rand()%15000; + CorruptedBlood_Timer = urand(30000, 45000); } else CorruptedBlood_Timer -= diff; //CauseInsanity_Timer @@ -135,7 +135,7 @@ class boss_hakkar : public CreatureScript if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_CAUSEINSANITY); - CauseInsanity_Timer = 35000 + rand()%8000; + CauseInsanity_Timer = urand(35000, 43000); } else CauseInsanity_Timer -= diff;*/ //WillOfHakkar_Timer @@ -144,7 +144,7 @@ class boss_hakkar : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_WILLOFHAKKAR); - WillOfHakkar_Timer = 25000 + rand()%10000; + WillOfHakkar_Timer = urand(25000, 35000); } else WillOfHakkar_Timer -= diff; if (!Enraged && Enrage_Timer <= diff) @@ -163,7 +163,7 @@ class boss_hakkar : public CreatureScript if (AspectOfJeklik_Timer <= diff) { DoCast(me->getVictim(), SPELL_ASPECT_OF_JEKLIK); - AspectOfJeklik_Timer = 10000 + rand()%4000; + AspectOfJeklik_Timer = urand(10000, 14000); } else AspectOfJeklik_Timer -= diff; } } @@ -234,7 +234,7 @@ class boss_hakkar : public CreatureScript DoCast(me, SPELL_ASPECT_OF_ARLOKK); DoResetThreat(); - AspectOfArlokk_Timer = 10000 + rand()%5000; + AspectOfArlokk_Timer = urand(10000, 15000); } else AspectOfArlokk_Timer -= diff; } } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index b8f4b0a50a1..73fa91dbdd8 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -48,9 +48,9 @@ class boss_hazzarah : public CreatureScript void Reset() { - ManaBurn_Timer = 4000 + rand()%6000; - Sleep_Timer = 10000 + rand()%8000; - Illusions_Timer = 10000 + rand()%8000; + ManaBurn_Timer = urand(4000, 10000); + Sleep_Timer = urand(10000, 18000); + Illusions_Timer = urand(10000, 18000); } void EnterCombat(Unit* /*who*/) @@ -66,14 +66,14 @@ class boss_hazzarah : public CreatureScript if (ManaBurn_Timer <= diff) { DoCast(me->getVictim(), SPELL_MANABURN); - ManaBurn_Timer = 8000 + rand()%8000; + ManaBurn_Timer = urand(8000, 16000); } else ManaBurn_Timer -= diff; //Sleep_Timer if (Sleep_Timer <= diff) { DoCast(me->getVictim(), SPELL_SLEEP); - Sleep_Timer = 12000 + rand()%8000; + Sleep_Timer = urand(12000, 20000); } else Sleep_Timer -= diff; //Illusions_Timer @@ -93,7 +93,7 @@ class boss_hazzarah : public CreatureScript Illusion->AI()->AttackStart(target); } - Illusions_Timer = 15000 + rand()%10000; + Illusions_Timer = urand(15000, 25000); } else Illusions_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index fcb492d47f7..87dc0e372f6 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -119,19 +119,19 @@ class boss_jeklik : public CreatureScript AttackStart(target); } - Charge_Timer = 15000 + rand()%15000; + Charge_Timer = urand(15000, 30000); } else Charge_Timer -= diff; if (SonicBurst_Timer <= diff) { DoCast(me->getVictim(), SPELL_SONICBURST); - SonicBurst_Timer = 8000 + rand()%5000; + SonicBurst_Timer = urand(8000, 13000); } else SonicBurst_Timer -= diff; if (Screech_Timer <= diff) { DoCast(me->getVictim(), SPELL_SCREECH); - Screech_Timer = 18000 + rand()%8000; + Screech_Timer = urand(18000, 26000); } else Screech_Timer -= diff; if (SpawnBats_Timer <= diff) @@ -168,7 +168,7 @@ class boss_jeklik : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_SHADOW_WORD_PAIN); - ShadowWordPain_Timer = 12000 + rand()%6000; + ShadowWordPain_Timer = urand(12000, 18000); } }ShadowWordPain_Timer -=diff; @@ -182,14 +182,14 @@ class boss_jeklik : public CreatureScript { me->InterruptNonMeleeSpells(false); DoCast(me->getVictim(), SPELL_CHAIN_MIND_FLAY); - ChainMindFlay_Timer = 15000 + rand()%15000; + ChainMindFlay_Timer = urand(15000, 30000); }ChainMindFlay_Timer -=diff; if (GreaterHeal_Timer <= diff) { me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_GREATERHEAL); - GreaterHeal_Timer = 25000 + rand()%10000; + GreaterHeal_Timer = urand(25000, 35000); }GreaterHeal_Timer -=diff; if (SpawnFlyingBats_Timer <= diff) @@ -202,7 +202,7 @@ class boss_jeklik : public CreatureScript if (FlyingBat) FlyingBat->AI()->AttackStart(target); - SpawnFlyingBats_Timer = 10000 + rand()%5000; + SpawnFlyingBats_Timer = urand(10000, 15000); } else SpawnFlyingBats_Timer -=diff; } else diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp index 7c8e53038ab..9c82c3eddfb 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp @@ -83,7 +83,7 @@ class boss_jindo : public CreatureScript if (BrainWashTotem_Timer <= diff) { DoCast(me, SPELL_BRAINWASHTOTEM); - BrainWashTotem_Timer = 18000 + rand()%8000; + BrainWashTotem_Timer = urand(18000, 26000); } else BrainWashTotem_Timer -= diff; //HealingWard_Timer @@ -91,7 +91,7 @@ class boss_jindo : public CreatureScript { //DoCast(me, SPELL_POWERFULLHEALINGWARD); me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); - HealingWard_Timer = 14000 + rand()%6000; + HealingWard_Timer = urand(14000, 20000); } else HealingWard_Timer -= diff; //Hex_Timer @@ -102,7 +102,7 @@ class boss_jindo : public CreatureScript if (DoGetThreat(me->getVictim())) DoModifyThreatPercent(me->getVictim(), -80); - Hex_Timer = 12000 + rand()%8000; + Hex_Timer = urand(12000, 20000); } else Hex_Timer -= diff; //Casting the delusion curse with a shade. So shade will attack the same target with the curse. @@ -117,7 +117,7 @@ class boss_jindo : public CreatureScript Shade->AI()->AttackStart(target); } - Delusions_Timer = 4000 + rand()%8000; + Delusions_Timer = urand(4000, 12000); } else Delusions_Timer -= diff; //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer @@ -162,7 +162,7 @@ class boss_jindo : public CreatureScript Skeletons->AI()->AttackStart(target); } - Teleport_Timer = 15000 + rand()%8000; + Teleport_Timer = urand(15000, 23000); } else Teleport_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 7dc357f692a..06ae34b79b2 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -325,7 +325,7 @@ class mob_ohgan : public CreatureScript if (SunderArmor_Timer <= diff) { DoCast(me->getVictim(), SPELL_SUNDERARMOR); - SunderArmor_Timer = 10000 + rand()%5000; + SunderArmor_Timer = urand(10000, 15000); } else SunderArmor_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index f6704a50e6f..5dafa54a2ba 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -105,13 +105,13 @@ class boss_marli : public CreatureScript if (PoisonVolley_Timer <= diff) { DoCast(me->getVictim(), SPELL_POISONVOLLEY); - PoisonVolley_Timer = 10000 + rand()%10000; + PoisonVolley_Timer = urand(10000, 20000); } else PoisonVolley_Timer -= diff; if (!PhaseTwo && Aspect_Timer <= diff) { DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); - Aspect_Timer = 13000 + rand()%5000; + Aspect_Timer = urand(13000, 18000); } else Aspect_Timer -= diff; if (!Spawned && SpawnStartSpiders_Timer <= diff) @@ -149,7 +149,7 @@ class boss_marli : public CreatureScript Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Spider) Spider->AI()->AttackStart(target); - SpawnSpider_Timer = 12000 + rand()%5000; + SpawnSpider_Timer = urand(12000, 17000); } else SpawnSpider_Timer -= diff; if (!PhaseTwo && Transform_Timer <= diff) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index bbff6a55ffb..c3bf09ee28d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -55,11 +55,11 @@ class boss_renataki : public CreatureScript void Reset() { - Invisible_Timer = 8000 + rand()%10000; + Invisible_Timer = urand(8000, 18000); Ambush_Timer = 3000; Visible_Timer = 4000; - Aggro_Timer = 15000 + rand()%10000; - ThousandBlades_Timer = 4000 + rand()%4000; + Aggro_Timer = urand(15000, 25000); + ThousandBlades_Timer = urand(4000, 8000); Invisible = false; Ambushed = false; @@ -85,7 +85,7 @@ class boss_renataki : public CreatureScript me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Invisible = true; - Invisible_Timer = 15000 + rand()%15000; + Invisible_Timer = urand(15000, 30000); } else Invisible_Timer -= diff; if (Invisible) @@ -135,13 +135,13 @@ class boss_renataki : public CreatureScript if (target) AttackStart(target); - Aggro_Timer = 7000 + rand()%13000; + Aggro_Timer = urand(7000, 20000); } else Aggro_Timer -= diff; if (ThousandBlades_Timer <= diff) { DoCast(me->getVictim(), SPELL_THOUSANDBLADES); - ThousandBlades_Timer = 7000 + rand()%5000; + ThousandBlades_Timer = urand(7000, 12000); } else ThousandBlades_Timer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp index 4fbb5cd1109..743ec211529 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp @@ -167,13 +167,13 @@ class boss_thekal : public CreatureScript if (!PhaseTwo && MortalCleave_Timer <= diff) { DoCast(me->getVictim(), SPELL_MORTALCLEAVE); - MortalCleave_Timer = 15000 + rand()%5000; + MortalCleave_Timer = urand(15000, 20000); } else MortalCleave_Timer -= diff; if (!PhaseTwo && Silence_Timer <= diff) { DoCast(me->getVictim(), SPELL_SILENCE); - Silence_Timer = 20000 + rand()%5000; + Silence_Timer = urand(20000, 25000); } else Silence_Timer -= diff; if (!PhaseTwo && !WasDead && !HealthAbovePct(5)) @@ -226,7 +226,7 @@ class boss_thekal : public CreatureScript AttackStart(target); } - Charge_Timer = 15000 + rand()%7000; + Charge_Timer = urand(15000, 22000); } else Charge_Timer -= diff; if (Frenzy_Timer <= diff) @@ -238,13 +238,13 @@ class boss_thekal : public CreatureScript if (ForcePunch_Timer <= diff) { DoCast(me->getVictim(), SPELL_SILENCE); - ForcePunch_Timer = 16000 + rand()%5000; + ForcePunch_Timer = urand(16000, 21000); } else ForcePunch_Timer -= diff; if (SummonTigers_Timer <= diff) { DoCast(me->getVictim(), SPELL_SUMMONTIGERS); - SummonTigers_Timer = 10000 + rand()%4000; + SummonTigers_Timer = urand(10000, 14000); } else SummonTigers_Timer -= diff; if (HealthBelowPct(11) && !Enraged) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp index 7288d063c21..179935524a8 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -47,8 +47,8 @@ class boss_wushoolay : public CreatureScript void Reset() { - LightningCloud_Timer = 5000 + rand()%5000; - LightningWave_Timer = 8000 + rand()%8000; + LightningCloud_Timer = urand(5000, 10000); + LightningWave_Timer = urand(8000, 16000); } void EnterCombat(Unit* /*who*/) @@ -64,7 +64,7 @@ class boss_wushoolay : public CreatureScript if (LightningCloud_Timer <= diff) { DoCast(me->getVictim(), SPELL_LIGHTNINGCLOUD); - LightningCloud_Timer = 15000 + rand()%5000; + LightningCloud_Timer = urand(15000, 20000); } else LightningCloud_Timer -= diff; //LightningWave_Timer @@ -74,7 +74,7 @@ class boss_wushoolay : public CreatureScript target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (target) DoCast(target, SPELL_LIGHTNINGWAVE); - LightningWave_Timer = 12000 + rand()%4000; + LightningWave_Timer = urand(12000, 16000); } else LightningWave_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/eversong_woods.cpp b/src/server/scripts/EasternKingdoms/eversong_woods.cpp index d02cce3f17c..d9171308ba6 100644 --- a/src/server/scripts/EasternKingdoms/eversong_woods.cpp +++ b/src/server/scripts/EasternKingdoms/eversong_woods.cpp @@ -204,7 +204,7 @@ public: if (timerJustice <= diff) { DoCast(me, SPELL_SEAL_OF_JUSTICE); - timerJustice = 10000 + rand()%10000; + timerJustice = urand(10000, 20000); } else timerJustice -= diff; @@ -215,7 +215,7 @@ public: if (timerJudLight <= diff) { DoCast(me, SPELL_JUDGEMENT_OF_LIGHT); - timerJudLight = 10000 + rand()%10000; + timerJudLight = urand(10000, 20000); } else timerJudLight -= diff; @@ -226,7 +226,7 @@ public: if (timerCommand <= diff) { DoCast(me, SPELL_SEAL_OF_COMMAND); - timerCommand = 20000 + rand()%20000; + timerCommand = urand(20000, 40000); } else timerCommand -= diff; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index f681b245a42..35de4c70214 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -105,15 +105,15 @@ public: ai->EnterEvadeMode(); ai->Spells[0].SpellId = SPELL_BLIZZARD; - ai->Spells[0].Cooldown = 15000 + rand()%20000; + ai->Spells[0].Cooldown = urand(15000, 35000); ai->Spells[0].TargetType = TARGETTYPE_RANDOM; ai->Spells[1].SpellId = SPELL_PYROBLAST; - ai->Spells[1].Cooldown = 5500 + rand()%4000; + ai->Spells[1].Cooldown = urand(5500, 9500); ai->Spells[1].TargetType = TARGETTYPE_RANDOM; ai->Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS; - ai->Spells[2].Cooldown = 15000 + rand()%30000; + ai->Spells[2].Cooldown = urand(15000, 45000); ai->Spells[2].TargetType = TARGETTYPE_SELF; return ai; @@ -187,11 +187,11 @@ public: ai->EnterEvadeMode(); ai->Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; - ai->Spells[0].Cooldown = 3000 + rand()%5000; + ai->Spells[0].Cooldown = urand(3000, 8000); ai->Spells[0].TargetType = TARGETTYPE_VICTIM; ai->Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; - ai->Spells[1].Cooldown = 6000 + rand()%35000; + ai->Spells[1].Cooldown = urand(6000, 41000); ai->Spells[1].TargetType = TARGETTYPE_RANDOM; return ai; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp index f09308a6724..488c7195534 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -68,9 +68,9 @@ public: void Reset() { - Holy_Light_Timer = 20000 + rand()%10000; + Holy_Light_Timer = urand(20000, 30000); Cleanse_Timer = 10000; - HammerOfJustice_Timer = 20000 + rand()%15000; + HammerOfJustice_Timer = urand(20000, 35000); HolyShield_Timer = 240000; DevotionAura_Timer = 3000; Consecration_Timer = 8000; @@ -134,14 +134,14 @@ public: if (DevotionAura_Timer <= diff) { DoCast(me, SPELL_DEVOTION_AURA); - DevotionAura_Timer = 45000 + rand()%10000; + DevotionAura_Timer = urand(45000, 55000); } else DevotionAura_Timer -= diff; //Consecration if (Consecration_Timer <= diff) { //DoCast(me->getVictim(), SPELL_CONSECRATION); - Consecration_Timer = 5000 + rand()%5000; + Consecration_Timer = urand(5000, 10000); } else Consecration_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp index 5b201e50bcb..9e6957a5e0c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp @@ -68,8 +68,8 @@ public: void Reset() { - SandBreath_Timer = 8000 + rand()%8000; - ImpendingDeath_Timer = 25000 + rand()%5000; + SandBreath_Timer = urand(8000, 16000); + ImpendingDeath_Timer = urand(25000, 30000); WingBuffet_Timer = 35000; Mda_Timer = 40000; } @@ -108,7 +108,7 @@ public: DoScriptText(RAND(SAY_BREATH1, SAY_BREATH2), me); - SandBreath_Timer = 10000 + rand()%10000; + SandBreath_Timer = urand(10000, 20000); } else SandBreath_Timer -= diff; if (ImpendingDeath_Timer <= diff) diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp index 7ade38dba8e..fd1966d106c 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp @@ -61,7 +61,7 @@ public: { AmnenarsWrath_Timer = 8000; FrostBolt_Timer = 1000; - FrostNova_Timer = 10000 + rand()%5000; + FrostNova_Timer = urand(10000, 15000); Spectrals30 = false; Spectrals60 = false; Hp = false; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 1a9d3f7a557..34b481c97f4 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -65,8 +65,8 @@ public: void Reset() { - Cleave_Timer = 4000 + rand()%4000; - ToxicVolley_Timer = 6000 + rand()%6000; + Cleave_Timer = urand(4000, 8000); + ToxicVolley_Timer = urand(6000, 12000); Check_Timer = 2000; VemDead = false; @@ -98,14 +98,14 @@ public: if (Cleave_Timer <= diff) { DoCast(me->getVictim(), SPELL_CLEAVE); - Cleave_Timer = 5000 + rand()%7000; + Cleave_Timer = urand(5000, 12000); } else Cleave_Timer -= diff; //ToxicVolley_Timer if (ToxicVolley_Timer <= diff) { DoCast(me->getVictim(), SPELL_TOXIC_VOLLEY); - ToxicVolley_Timer = 10000 + rand()%5000; + ToxicVolley_Timer = urand(10000, 15000); } else ToxicVolley_Timer -= diff; if (!HealthAbovePct(5) && !Death) @@ -161,8 +161,8 @@ public: void Reset() { - Charge_Timer = 15000 + rand()%12000; - KnockBack_Timer = 8000 + rand()%12000; + Charge_Timer = urand(15000, 27000); + KnockBack_Timer = urand(8000, 20000); Enrage_Timer = 120000; Enraged = false; @@ -202,7 +202,7 @@ public: AttackStart(target); } - Charge_Timer = 8000 + rand()%8000; + Charge_Timer = urand(8000, 16000); } else Charge_Timer -= diff; //KnockBack_Timer @@ -211,7 +211,7 @@ public: DoCast(me->getVictim(), SPELL_KNOCKBACK); if (DoGetThreat(me->getVictim())) DoModifyThreatPercent(me->getVictim(), -80); - KnockBack_Timer = 15000 + rand()%10000; + KnockBack_Timer = urand(15000, 25000); } else KnockBack_Timer -= diff; //Enrage_Timer @@ -254,8 +254,8 @@ public: void Reset() { - Heal_Timer = 25000 + rand()%15000; - Fear_Timer = 12000 + rand()%12000; + Heal_Timer = urand(25000, 40000); + Fear_Timer = urand(12000, 24000); Check_Timer = 2000; VemDead = false; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp index 9d83bfea866..505907cd0f5 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp @@ -63,9 +63,9 @@ public: void Reset() { - MortalWound_Timer = 10000 + rand()%5000; - SpawnHatchlings_Timer = 6000 + rand()%6000; - SpawnSpawns_Timer = 15000 + rand()%30000; + MortalWound_Timer = urand(10000, 15000); + SpawnHatchlings_Timer = urand(6000, 12000); + SpawnSpawns_Timer = urand(15000, 45000); } void SummonSpawn(Unit* victim) @@ -106,7 +106,7 @@ public: if (MortalWound_Timer <= diff) { DoCast(me->getVictim(), SPELL_MORTAL_WOUND); - MortalWound_Timer = 10000 + rand()%10000; + MortalWound_Timer = urand(10000, 20000); } else MortalWound_Timer -= diff; //Summon 1-3 Spawns of Fankriss at random time. @@ -127,7 +127,7 @@ public: SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); break; } - SpawnSpawns_Timer = 30000 + rand()%30000; + SpawnSpawns_Timer = urand(30000, 60000); } else SpawnSpawns_Timer -= diff; // Teleporting Random Target to one of the three tunnels and spawn 4 hatchlings near the gamer. @@ -194,7 +194,7 @@ public: break; } } - SpawnHatchlings_Timer = 45000 + rand()%15000; + SpawnHatchlings_Timer = urand(45000, 60000); } else SpawnHatchlings_Timer -= diff; } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index f8cafea0ef2..d6d23cf7426 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -61,11 +61,11 @@ public: void Reset() { - Frenzy_Timer = 25000 + rand()%10000; - Wyvern_Timer = 18000 + rand()%10000; + Frenzy_Timer = urand(25000, 35000); + Wyvern_Timer = urand(18000, 28000); Spit_Timer = 8000; PoisonBolt_Timer = 4000; - NoxiousPoison_Timer = 10000 + rand()%10000; + NoxiousPoison_Timer = urand(10000, 20000); FrenzyBack_Timer = 15000; Frenzy = false; @@ -89,7 +89,7 @@ public: DoScriptText(EMOTE_GENERIC_FRENZY_KILL, me); Frenzy = true; PoisonBolt_Timer = 3000; - Frenzy_Timer = 25000 + rand()%10000; + Frenzy_Timer = urand(25000, 35000); } else Frenzy_Timer -= diff; // Wyvern Timer @@ -97,21 +97,21 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_WYVERNSTING); - Wyvern_Timer = 15000 + rand()%17000; + Wyvern_Timer = urand(15000, 32000); } else Wyvern_Timer -= diff; //Spit Timer if (Spit_Timer <= diff) { DoCast(me->getVictim(), SPELL_ACIDSPIT); - Spit_Timer = 5000 + rand()%5000; + Spit_Timer = urand(5000, 10000); } else Spit_Timer -= diff; //NoxiousPoison_Timer if (NoxiousPoison_Timer <= diff) { DoCast(me->getVictim(), SPELL_NOXIOUSPOISON); - NoxiousPoison_Timer = 12000 + rand()%12000; + NoxiousPoison_Timer = urand(12000, 24000); } else NoxiousPoison_Timer -= diff; //PoisonBolt only if frenzy or berserk diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index 01d26ed7726..4595e4e5095 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -59,12 +59,12 @@ public: void Reset() { - Sweep_Timer = 5000 + rand()%5000; - SandBlast_Timer = 20000 + rand()%15000; - Submerge_Timer = 90000 + rand()%60000; - Back_Timer = 30000 + rand()%15000; - ChangeTarget_Timer = 5000 + rand()%3000; - Spawn_Timer = 10000 + rand()%10000; + Sweep_Timer = urand(5000, 10000); + SandBlast_Timer = urand(20000, 35000); + Submerge_Timer = urand(90000, 150000); + Back_Timer = urand(30000, 45000); + ChangeTarget_Timer = urand(5000, 8000); + Spawn_Timer = urand(10000, 20000); Enrage = false; Submerged = false; @@ -85,14 +85,14 @@ public: if (!Submerged && Sweep_Timer <= diff) { DoCast(me->getVictim(), SPELL_SWEEP); - Sweep_Timer = 15000 + rand()%15000; + Sweep_Timer = urand(15000, 30000); } else Sweep_Timer -= diff; //SandBlast_Timer if (!Submerged && SandBlast_Timer <= diff) { DoCast(me->getVictim(), SPELL_SANDBLAST); - SandBlast_Timer = 20000 + rand()%15000; + SandBlast_Timer = urand(20000, 35000); } else SandBlast_Timer -= diff; //Submerge_Timer @@ -105,7 +105,7 @@ public: DoCast(me, SPELL_DIRTMOUND_PASSIVE); Submerged = true; - Back_Timer = 30000 + rand()%15000; + Back_Timer = urand(30000, 45000); } else Submerge_Timer -= diff; //ChangeTarget_Timer @@ -117,7 +117,7 @@ public: if (target) DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); - ChangeTarget_Timer = 10000 + rand()%10000; + ChangeTarget_Timer = urand(10000, 20000); } else ChangeTarget_Timer -= diff; //Back_Timer @@ -129,7 +129,7 @@ public: DoCast(me->getVictim(), SPELL_GROUND_RUPTURE); Submerged = false; - Submerge_Timer = 60000 + rand()%60000; + Submerge_Timer = urand(60000, 120000); } else Back_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp index fb16d2b7319..27aa72d3e55 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp @@ -66,9 +66,9 @@ public: void Reset() { WhirlWind_Timer = 30000; - WhirlWindRandom_Timer = 3000 + rand()%4000; + WhirlWindRandom_Timer = urand(3000, 7000); WhirlWindEnd_Timer = 15000; - AggroReset_Timer = 45000 + rand()%10000; + AggroReset_Timer = urand(45000, 55000); AggroResetEnd_Timer = 5000; EnrageHard_Timer = 10*60000; @@ -111,13 +111,13 @@ public: me->TauntApply(target); AttackStart(target); } - WhirlWindRandom_Timer = 3000 + rand()%4000; + WhirlWindRandom_Timer = urand(3000, 7000); } else WhirlWindRandom_Timer -= diff; if (WhirlWindEnd_Timer <= diff) { WhirlWind = false; - WhirlWind_Timer = 25000 + rand()%15000; + WhirlWind_Timer = urand(25000, 40000); } else WhirlWindEnd_Timer -= diff; } @@ -140,7 +140,7 @@ public: AttackStart(target); } AggroReset = true; - AggroReset_Timer = 2000 + rand()%3000; + AggroReset_Timer = urand(2000, 5000); } else AggroReset_Timer -= diff; if (AggroReset) @@ -149,7 +149,7 @@ public: { AggroReset = false; AggroResetEnd_Timer = 5000; - AggroReset_Timer = 35000 + rand()%10000; + AggroReset_Timer = urand(35000, 45000); } else AggroResetEnd_Timer -= diff; } @@ -207,9 +207,9 @@ public: void Reset() { WhirlWind_Timer = 30000; - WhirlWindRandom_Timer = 3000 + rand()%4000; + WhirlWindRandom_Timer = urand(3000, 7000); WhirlWindEnd_Timer = 15000; - AggroReset_Timer = 45000 + rand()%10000; + AggroReset_Timer = urand(45000, 55000); AggroResetEnd_Timer = 5000; KnockBack_Timer = 10000; @@ -231,7 +231,7 @@ public: { DoCast(me, SPELL_WHIRLWINDADD); WhirlWind = true; - WhirlWind_Timer = 25000 + rand()%15000; + WhirlWind_Timer = urand(25000, 40000); WhirlWindEnd_Timer = 15000; } else WhirlWind_Timer -= diff; @@ -247,7 +247,7 @@ public: AttackStart(target); } - WhirlWindRandom_Timer = 3000 + rand()%4000; + WhirlWindRandom_Timer = urand(3000, 7000); } else WhirlWindRandom_Timer -= diff; if (WhirlWindEnd_Timer <= diff) @@ -269,13 +269,13 @@ public: } AggroReset = true; - AggroReset_Timer = 2000 + rand()%3000; + AggroReset_Timer = urand(2000, 5000); } else AggroReset_Timer -= diff; if (KnockBack_Timer <= diff) { DoCast(me, SPELL_WHIRLWINDADD); - KnockBack_Timer = 10000 + rand()%10000; + KnockBack_Timer = urand(10000, 20000); } else KnockBack_Timer -= diff; } @@ -285,7 +285,7 @@ public: { AggroReset = false; AggroResetEnd_Timer = 5000; - AggroReset_Timer = 30000 + rand()%10000; + AggroReset_Timer = urand(30000, 40000); } else AggroResetEnd_Timer -= diff; } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp index 0ba6bdb1154..c9a9865e36e 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp @@ -82,10 +82,10 @@ public: void Reset() { - ArcaneExplosion_Timer = 6000 + rand()%6000; + ArcaneExplosion_Timer = urand(6000, 12000); EarthShock_Timer = 2000; FullFillment_Timer = 15000; - Blink_Timer = 8000 + rand()%12000; + Blink_Timer = urand(8000, 20000); Invisible_Timer = 500; Images75 = false; @@ -128,7 +128,7 @@ public: if (ArcaneExplosion_Timer <= diff) { DoCast(me->getVictim(), SPELL_ARCANE_EXPLOSION); - ArcaneExplosion_Timer = 8000 + rand()%10000; + ArcaneExplosion_Timer = urand(8000, 18000); } else ArcaneExplosion_Timer -= diff; //If we are within range melee the target @@ -171,7 +171,7 @@ public: } DoStopAttack(); - Blink_Timer= 20000 + rand()%20000; + Blink_Timer= urand(20000, 40000); } else Blink_Timer -= diff; int procent = (int) (me->GetHealthPct() + 0.5f); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 29b92957ace..b005f9d0953 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -88,7 +88,7 @@ struct boss_twinemperorsAI : public ScriptedAI AfterTeleport = false; tspellcasted = false; AfterTeleportTimer = 0; - Abuse_Bug_Timer = 10000 + rand()%7000; + Abuse_Bug_Timer = urand(10000, 17000); BugsTimer = 2000; me->ClearUnitState(UNIT_STAT_STUNNED); DontYellWhenDead = false; @@ -347,7 +347,7 @@ struct boss_twinemperorsAI : public ScriptedAI if (c) { CastSpellOnBug(c); - Abuse_Bug_Timer = 10000 + rand()%7000; + Abuse_Bug_Timer = urand(10000, 17000); } else { @@ -407,9 +407,9 @@ public: void Reset() { TwinReset(); - UpperCut_Timer = 14000 + rand()%15000; - UnbalancingStrike_Timer = 8000 + rand()%10000; - Scarabs_Timer = 7000 + rand()%7000; + UpperCut_Timer = urand(14000, 29000); + UnbalancingStrike_Timer = urand(8000, 18000); + Scarabs_Timer = urand(7000, 14000); //Added. Can be removed if its included in DB. me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); @@ -495,9 +495,9 @@ public: { TwinReset(); ShadowBolt_Timer = 0; - Blizzard_Timer = 15000 + rand()%5000; + Blizzard_Timer = urand(15000, 20000); ArcaneBurst_Timer = 1000; - Scorpions_Timer = 7000 + rand()%7000; + Scorpions_Timer = urand(7000, 14000); //Added. Can be removed if its included in DB. me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); diff --git a/src/server/scripts/Kalimdor/azuremyst_isle.cpp b/src/server/scripts/Kalimdor/azuremyst_isle.cpp index 57ff1448a7e..1898186f615 100644 --- a/src/server/scripts/Kalimdor/azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/azuremyst_isle.cpp @@ -243,7 +243,7 @@ public: void Reset() { Dynamite_Timer = 8000; - Emote_Timer = 120000 + rand()%30000; + Emote_Timer = urand(120000, 150000); me->setFaction(NormFaction); me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags); @@ -264,7 +264,7 @@ public: { DoScriptText(SAY_TEXT, me); DoScriptText(SAY_EMOTE, me); - Emote_Timer = 120000 + rand()%30000; + Emote_Timer = urand(120000, 150000); } else Emote_Timer -= diff; } else if (IsTreeEvent) diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp index 6bbc29dcc56..19b5e36e113 100644 --- a/src/server/scripts/Kalimdor/boss_azuregos.cpp +++ b/src/server/scripts/Kalimdor/boss_azuregos.cpp @@ -62,11 +62,11 @@ public: void Reset() { MarkOfFrost_Timer = 35000; - ManaStorm_Timer = 5000 + rand()%12000; - Chill_Timer = 10000 + rand()%20000; - Breath_Timer = 2000 + rand()%6000; + ManaStorm_Timer = urand(5000, 17000); + Chill_Timer = urand(10000, 30000); + Breath_Timer = urand(2000, 8000); Teleport_Timer = 30000; - Reflect_Timer = 15000 + rand()%15000; + Reflect_Timer = urand(15000, 30000); Cleave_Timer = 7000; Enrage_Timer = 0; Enraged = false; @@ -109,14 +109,14 @@ public: if (Chill_Timer <= diff) { DoCast(me->getVictim(), SPELL_CHILL); - Chill_Timer = 13000 + rand()%12000; + Chill_Timer = urand(13000, 25000); } else Chill_Timer -= diff; //Breath_Timer if (Breath_Timer <= diff) { DoCast(me->getVictim(), SPELL_FROSTBREATH); - Breath_Timer = 10000 + rand()%5000; + Breath_Timer = urand(10000, 15000); } else Breath_Timer -= diff; //ManaStorm_Timer @@ -124,14 +124,14 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_MANASTORM); - ManaStorm_Timer = 7500 + rand()%5000; + ManaStorm_Timer = urand(7500, 12500); } else ManaStorm_Timer -= diff; //Reflect_Timer if (Reflect_Timer <= diff) { DoCast(me, SPELL_REFLECT); - Reflect_Timer = 20000 + rand()%15000; + Reflect_Timer = urand(20000, 35000); } else Reflect_Timer -= diff; //Cleave_Timer diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index c2107e88b2e..9096282c3f6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -111,7 +111,7 @@ public: { _EnterCombat(); DoScriptText(SAY_AGGRO, me); - events.ScheduleEvent(EVENT_IMPALE, 10000 + rand()%10000); + events.ScheduleEvent(EVENT_IMPALE, urand(10000, 20000)); events.ScheduleEvent(EVENT_LOCUST, 90000); events.ScheduleEvent(EVENT_BERSERK, 600000); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 04627981ef3..b7d74c02dd8 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -107,7 +107,7 @@ public: events.ScheduleEvent(EVENT_CURSE, 10000+rand()%15000); events.ScheduleEvent(EVENT_WARRIOR, 30000); if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) - events.ScheduleEvent(EVENT_BLINK, 20000 + rand()%20000); + events.ScheduleEvent(EVENT_BLINK, urand(20000, 40000)); } } @@ -153,7 +153,7 @@ public: { case EVENT_CURSE: DoCastAOE(SPELL_CURSE_PLAGUEBRINGER); - events.ScheduleEvent(EVENT_CURSE, 50000 + rand()%10000); + events.ScheduleEvent(EVENT_CURSE, urand(50000, 60000)); return; case EVENT_WARRIOR: DoScriptText(SAY_SUMMON, me); @@ -173,7 +173,7 @@ public: me->RemoveAllAuras(); me->NearTeleportTo(TELE_X, TELE_Y, TELE_Z, TELE_O); events.Reset(); - events.ScheduleEvent(EVENT_WAVE, 2000 + rand()%3000); + events.ScheduleEvent(EVENT_WAVE, urand(2000, 5000)); waveCount = 0; return; case EVENT_WAVE: @@ -188,7 +188,7 @@ public: SummonUndead(MOB_GUARDIAN, RAID_MODE(5, 10));break; } ++waveCount; - events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, 30000 + rand()%15000); + events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, urand(30000, 45000)); return; case EVENT_GROUND: { diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 8c97766f787..5e2b6551f84 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -131,7 +131,7 @@ public: m_uiChargingStatus = 0; m_uiCharge_Timer = 1000; - m_uiChangeStance_Timer = 20000 + rand()%5000; + m_uiChangeStance_Timer = urand(20000, 25000); m_uiReflection_Timer = 8000; m_uiKnockAway_Timer = 20000; @@ -252,7 +252,7 @@ public: break; } - m_uiChangeStance_Timer = 20000 + rand()%5000; + m_uiChangeStance_Timer = urand(20000, 25000); return; } else @@ -265,7 +265,7 @@ public: if (m_uiReflection_Timer <= uiDiff) { DoCast(me, SPELL_SPELL_REFLECTION); - m_uiReflection_Timer = 8000 + rand()%1000; + m_uiReflection_Timer = urand(8000, 9000); } else m_uiReflection_Timer -= uiDiff; @@ -273,7 +273,7 @@ public: if (m_uiKnockAway_Timer <= uiDiff) { DoCast(me, SPELL_KNOCK_AWAY); - m_uiKnockAway_Timer = 20000 + rand()%1000; + m_uiKnockAway_Timer = urand(20000, 21000); } else m_uiKnockAway_Timer -= uiDiff; @@ -281,7 +281,7 @@ public: if (m_uiPummel_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_PUMMEL); - m_uiPummel_Timer = 10000 + rand()%1000; + m_uiPummel_Timer = urand(10000, 11000); } else m_uiPummel_Timer -= uiDiff; @@ -289,7 +289,7 @@ public: if (m_uiIronform_Timer <= uiDiff) { DoCast(me, SPELL_IRONFORM); - m_uiIronform_Timer = 25000 + rand()%1000; + m_uiIronform_Timer = urand(25000, 26000); } else m_uiIronform_Timer -= uiDiff; @@ -302,7 +302,7 @@ public: { //not much point is this, better random target and more often? DoCast(me->getVictim(), SPELL_INTERCEPT); - m_uiIntercept_Timer = 45000 + rand()%1000; + m_uiIntercept_Timer = urand(45000, 46000); } else m_uiIntercept_Timer -= uiDiff; @@ -310,7 +310,7 @@ public: if (m_uiWhirlwind_Timer <= uiDiff) { DoCast(me, SPELL_WHIRLWIND); - m_uiWhirlwind_Timer = 10000 + rand()%1000; + m_uiWhirlwind_Timer = urand(10000, 11000); } else m_uiWhirlwind_Timer -= uiDiff; @@ -318,7 +318,7 @@ public: if (m_uiCleave_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_CLEAVE); - m_uiCleave_Timer = 8000 + rand()%1000; + m_uiCleave_Timer = urand(8000, 9000); } else m_uiCleave_Timer -= uiDiff; @@ -330,7 +330,7 @@ public: if (m_uiMortalStrike_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_MORTAL_STRIKE); - m_uiMortalStrike_Timer = 20000 + rand()%1000; + m_uiMortalStrike_Timer = urand(20000, 21000); } else m_uiMortalStrike_Timer -= uiDiff; @@ -338,7 +338,7 @@ public: if (m_uiSlam_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_SLAM); - m_uiSlam_Timer = 15000 + rand()%1000; + m_uiSlam_Timer = urand(15000, 16000); } else m_uiSlam_Timer -= uiDiff; @@ -381,8 +381,8 @@ public: void Reset() { - m_uiArcWeld_Timer = 20000 + rand()%1000; - m_uiRenewSteel_Timer = 10000 + rand()%1000; + m_uiArcWeld_Timer = urand(20000, 21000); + m_uiRenewSteel_Timer = urand(10000, 11000); } void EnterCombat(Unit* who) @@ -406,7 +406,7 @@ public: if (m_uiArcWeld_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_ARC_WELD); - m_uiArcWeld_Timer = 20000 + rand()%1000; + m_uiArcWeld_Timer = urand(20000, 21000); } else m_uiArcWeld_Timer -= uiDiff; @@ -421,7 +421,7 @@ public: DoCast(pBjarngrim, SPELL_RENEW_STEEL_N); } } - m_uiRenewSteel_Timer = 10000 + rand()%4000; + m_uiRenewSteel_Timer = urand(10000, 14000); } else m_uiRenewSteel_Timer -= uiDiff; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index a5ea1868686..d90704dd352 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -183,7 +183,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_ARC_LIGHTNING); - m_uiArcLightning_Timer = 15000 + rand()%1000; + m_uiArcLightning_Timer = urand(15000, 16000); } else m_uiArcLightning_Timer -= uiDiff; @@ -196,7 +196,7 @@ public: m_bIsAura = false; m_uiResumePulsingShockwave_Timer = DUNGEON_MODE(5000, 4000); // Pause Pulsing Shockwave aura - m_uiLightningNova_Timer = 20000 + rand()%1000; + m_uiLightningNova_Timer = urand(20000, 21000); } else m_uiLightningNova_Timer -= uiDiff; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index 375862c141c..65b5d3eaad1 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -80,10 +80,10 @@ public: { bIsSlam = false; - uiBoulderTossTimer = 3000 + rand()%6000; - uiGroundSpikeTimer = 9000 + rand()%5000; - uiGroundSlamTimer = 15000 + rand()%3000; - uiStompTimer = 20000 + rand()%9000; + uiBoulderTossTimer = urand(3000, 9000); + uiGroundSpikeTimer = urand(9000, 14000); + uiGroundSlamTimer = urand(15000, 18000); + uiStompTimer = urand(20000, 29000); uiShatterTimer = 0; if (instance) @@ -107,20 +107,20 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_BOULDER_TOSS); - uiBoulderTossTimer = 9000 + rand()%6000; + uiBoulderTossTimer = urand(9000, 15000); } else uiBoulderTossTimer -= diff; if (uiGroundSpikeTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_GROUND_SPIKE); - uiGroundSpikeTimer = 12000 + rand()%5000; + uiGroundSpikeTimer = urand(12000, 17000); } else uiGroundSpikeTimer -= diff; if (uiStompTimer <= diff) { DoCast(me, SPELL_STOMP); - uiStompTimer = 20000 + rand()%9000; + uiStompTimer = urand(20000, 29000); } else uiStompTimer -= diff; if (uiGroundSlamTimer <= diff) @@ -128,7 +128,7 @@ public: DoCast(me, SPELL_GROUND_SLAM); bIsSlam = true; uiShatterTimer = 10000; - uiGroundSlamTimer = 15000 + rand()%3000; + uiGroundSlamTimer = urand(15000, 18000); } else uiGroundSlamTimer -= diff; if (bIsSlam) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 4ab09dbf67a..4f512089119 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -79,10 +79,10 @@ public: void Reset() { - PartingSorrowTimer = 25000 + rand()%5000; + PartingSorrowTimer = urand(25000, 30000); StormOfGriefTimer = 10000; ShockOfSorrowTimer = 20000+rand()%5000; - PillarOfWoeTimer = 5000 + rand()%10000; + PillarOfWoeTimer = urand(5000, 15000); if (instance) { @@ -124,14 +124,14 @@ public: if (target) DoCast(target, SPELL_PARTING_SORROW); - PartingSorrowTimer = 30000 + rand()%10000; + PartingSorrowTimer = urand(30000, 40000); } else PartingSorrowTimer -= diff; } if (StormOfGriefTimer <= diff) { DoCast(me->getVictim(), SPELL_STORM_OF_GRIEF_N, true); - StormOfGriefTimer = 15000 + rand()%5000; + StormOfGriefTimer = urand(15000, 20000); } else StormOfGriefTimer -= diff; if (ShockOfSorrowTimer <= diff) @@ -139,7 +139,7 @@ public: DoResetThreat(); DoScriptText(SAY_STUN, me); DoCast(me, SPELL_SHOCK_OF_SORROW_N); - ShockOfSorrowTimer = 20000 + rand()%10000; + ShockOfSorrowTimer = urand(20000, 30000); } else ShockOfSorrowTimer -= diff; if (PillarOfWoeTimer <= diff) @@ -151,7 +151,7 @@ public: else DoCast(me->getVictim(), SPELL_PILLAR_OF_WOE_N); - PillarOfWoeTimer = 5000 + rand()%20000; + PillarOfWoeTimer = urand(5000, 25000); } else PillarOfWoeTimer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index 41dcd77d4bc..dd61fe549c3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -115,10 +115,10 @@ public: bIsFrenzy = false; uiEncounterTimer = 0; - uiChainLightningTimer = 3000 + rand()%5000; - uiLightningShieldTimer = 20000 + rand()%5000; - uiStaticChargeTimer = 20000 + rand()%5000; - uiLightningRingTimer = 30000 + rand()%5000; + uiChainLightningTimer = urand(3000, 8000); + uiLightningShieldTimer = urand(20000, 25000); + uiStaticChargeTimer = urand(20000, 25000); + uiLightningRingTimer = urand(30000, 35000); uiSummonTimer = 5000; uiFrenzyTimer = 300000; //5 minutes abuseTheOoze = 0; @@ -158,7 +158,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CHAIN_LIGHTING); - uiChainLightningTimer = 10000 + rand()%5000; + uiChainLightningTimer = urand(10000, 15000); } else uiChainLightningTimer -= diff; if (uiLightningShieldTimer <= diff) @@ -170,7 +170,7 @@ public: if (uiStaticChargeTimer <= diff) { DoCast(me->getVictim(), SPELL_STATIC_CHARGE); - uiStaticChargeTimer = 20000 + rand()%5000; + uiStaticChargeTimer = urand(20000, 25000); } uiStaticChargeTimer -= diff; if (uiLightningRingTimer <= diff) @@ -178,7 +178,7 @@ public: if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_LIGHTING_RING); - uiLightningRingTimer = 30000 + rand()%5000; + uiLightningRingTimer = urand(30000, 35000); } else uiLightningRingTimer -= diff; if (uiSummonTimer <= diff) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index ec1464a5d6f..273a0bf6f8e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -239,7 +239,7 @@ public: summon->CastSpell(target, DUNGEON_MODE(SPELL_DARK_MATTER, H_SPELL_DARK_MATTER), true); } } - uiMarnakEncounterTimer = 30000 + rand()%1000; + uiMarnakEncounterTimer = urand(30000, 31000); } else uiMarnakEncounterTimer -= diff; } if (bAbedneumActivated) @@ -255,7 +255,7 @@ public: summon->CastSpell(target, DUNGEON_MODE(SPELL_SEARING_GAZE, H_SPELL_SEARING_GAZE), true); } } - uiAbedneumEncounterTimer = 30000 + rand()%1000; + uiAbedneumEncounterTimer = urand(30000, 31000); } else uiAbedneumEncounterTimer -= diff; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp index 3888cc43bc9..1892702d336 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp @@ -143,7 +143,7 @@ public: uiPhase_timer = 0; Ascend_Timer = 480000; //8 minutes - QuantumStrike_Timer = 4000 + rand()%10000; + QuantumStrike_Timer = urand(4000, 14000); Berserk_Timer = 360000; //6 minutes CollapsingStar_Timer = urand(15000, 20000); //Spawns between 15 to 20 seconds BigBang_Timer = 90000; diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp index a9f84016a04..71de7177e2b 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -340,7 +340,7 @@ public: if (Mortal_Strike_timer <= diff) { DoCast(me->getVictim(), SPELL_AV_MORTAL_STRIKE); - Mortal_Strike_timer = 10000 + rand()%20 * 1000; + Mortal_Strike_timer = urand(10, 30) * 1000; } else Mortal_Strike_timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp index 829f681982f..8a7eefbf633 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp @@ -162,20 +162,20 @@ public: me->InterruptNonMeleeSpells(true); DoCast(me, SPELL_FROSTNOVA); - FrostNova_Timer = 17500 + rand()%7500; + FrostNova_Timer = urand(17500, 25000); CanBlink = true; } else FrostNova_Timer -= diff; if (Frostbolt_Timer <= diff) { DoCast(me->getVictim(), SPELL_FROSTBOLT); - Frostbolt_Timer = 4500 + rand()%1500; + Frostbolt_Timer = urand(4500, 6000); } else Frostbolt_Timer -= diff; if (FireBall_Timer <= diff) { DoCast(me->getVictim(), SPELL_FIREBALL); - FireBall_Timer = 4500 + rand()%1500; + FireBall_Timer = urand(4500, 6000); } else FireBall_Timer -= diff; if (CanBlink) @@ -191,7 +191,7 @@ public: me->GetMotionMaster()->MovementExpired(); DoCast(me, SPELL_BLINK); - Blink_Timer = 1000 + rand()%1500; + Blink_Timer = urand(1000, 2500); CanBlink = false; } else Blink_Timer -= diff; } @@ -290,7 +290,7 @@ public: if (ArcaneBolt_Timer <= diff) { DoCast(me->getVictim(), SPELL_ARCANE_BOLT); - ArcaneBolt_Timer = 2000 + rand()%2500; + ArcaneBolt_Timer = urand(2000, 4500); } else ArcaneBolt_Timer -= diff; if (Apprentice_Timer <= diff) diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp index 43171eda1af..e744cd0f8fb 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp @@ -157,7 +157,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_FLAME_SHOCK); - flameshock_timer = 10000 + rand()%5000; + flameshock_timer = urand(10000, 15000); } else flameshock_timer -= diff; if (arcaneshock_timer <= diff) @@ -165,7 +165,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_ARCANE_SHOCK); - arcaneshock_timer = 10000 + rand()%5000; + arcaneshock_timer = urand(10000, 15000); } else arcaneshock_timer -= diff; if (frostshock_timer <= diff) @@ -173,7 +173,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_FROST_SHOCK); - frostshock_timer = 10000 + rand()%5000; + frostshock_timer = urand(10000, 15000); } else frostshock_timer -= diff; if (shadowshock_timer <= diff) @@ -181,7 +181,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_SHADOW_SHOCK); - shadowshock_timer = 10000 + rand()%5000; + shadowshock_timer = urand(10000, 15000); } else shadowshock_timer -= diff; if (chainlightning_timer <= diff) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp index 8f1453e51ee..7ffc203f694 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp @@ -74,8 +74,8 @@ public: void Reset() { EventCheck_Timer = 5000; - CorrosiveAcid_Timer = 5000 + rand()%5000; - Fear_Timer = 25000 + rand()%5000; + CorrosiveAcid_Timer = urand(5000, 10000); + Fear_Timer = urand(25000, 30000); Enrage_Timer = 180000; Intro = false; IsBanished = true; @@ -182,13 +182,13 @@ public: if (CorrosiveAcid_Timer <= diff) { DoCast(me->getVictim(), SPELL_CORROSIVE_ACID); - CorrosiveAcid_Timer = 15000 + rand()%10000; + CorrosiveAcid_Timer = urand(15000, 25000); } else CorrosiveAcid_Timer -= diff; if (Fear_Timer <= diff) { DoCast(me, SPELL_FEAR); - Fear_Timer = 20000 + rand()%15000; + Fear_Timer = urand(20000, 35000); } else Fear_Timer -= diff; if (IsHeroic()) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp index 1987c1bb01a..dd5df358d53 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp @@ -152,14 +152,14 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_CHARGE); - Charge_Timer = 15000 + rand()%10000; + Charge_Timer = urand(15000, 25000); } else Charge_Timer -= diff; //Knockback_Timer if (Knockback_Timer <= diff) { DoCast(me, SPELL_WAR_STOMP); - Knockback_Timer = 18000 + rand()%6000; + Knockback_Timer = urand(18000, 24000); } else Knockback_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index 6d3a5f181d4..8cf8d61b845 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -165,7 +165,7 @@ public: void Reset() { - ShadowBoltVolley_Timer = 7000 + rand()%7000; + ShadowBoltVolley_Timer = urand(7000, 14000); DrawShadows_Timer = 45000; summonTraveler_Timer = 90000; banish_Timer = 17000; @@ -269,7 +269,7 @@ public: if (ShadowBoltVolley_Timer <= diff) { DoCast(me, SPELL_SHADOWBOLT_VOLLEY); - ShadowBoltVolley_Timer = 15000 + rand()%15000; + ShadowBoltVolley_Timer = urand(15000, 30000); } else ShadowBoltVolley_Timer -= diff; if (IsHeroic() && banish_Timer <= diff) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index bd6539335c8..ebb279f74ac 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -64,9 +64,9 @@ public: void Reset() { SonicBoom_Timer = 30000; - MurmursTouch_Timer = 8000 + rand()%12000; + MurmursTouch_Timer = urand(8000, 20000); Resonance_Timer = 5000; - MagneticPull_Timer = 15000 + rand()%15000; + MagneticPull_Timer = urand(15000, 30000); ThunderingStorm_Timer = 15000; SonicShock_Timer = 10000; SonicBoom = false; @@ -133,7 +133,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true)) DoCast(target, SPELL_MURMURS_TOUCH); - MurmursTouch_Timer = 25000 + rand()%10000; + MurmursTouch_Timer = urand(25000, 35000); } else MurmursTouch_Timer -= diff; // Resonance diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index ec7f9a8e070..c28fe68d9e0 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -646,7 +646,7 @@ public: case PHASE_NORMAL_MAIEV: AttackStart(me->getVictim()); Timer[EVENT_TAUNT] = 32000; - Timer[EVENT_SHEAR] = 10000 + rand()%15 * 1000; + Timer[EVENT_SHEAR] = urand(10, 25) * 1000; Timer[EVENT_FLAME_CRASH] = 20000; Timer[EVENT_PARASITIC_SHADOWFIEND] = 25000; Timer[EVENT_PARASITE_CHECK] = 0; @@ -657,14 +657,14 @@ public: Timer[EVENT_TRANSFORM_NORMAL] = 60000; if (NextPhase == PHASE_NORMAL_2) break; - Timer[EVENT_ENRAGE] = 30000 + rand()%10 * 1000; + Timer[EVENT_ENRAGE] = urand(30, 40) * 1000; break; case PHASE_FLIGHT: Timer[EVENT_FIREBALL] = 1000; if (!(rand()%4)) Timer[EVENT_DARK_BARRAGE] = 10000; - Timer[EVENT_EYE_BLAST] = 10000 + rand()%15 * 1000; - Timer[EVENT_MOVE_POINT] = 20000 + rand()%20 * 1000; + Timer[EVENT_EYE_BLAST] = urand(10, 25) * 1000; + Timer[EVENT_MOVE_POINT] = urand(20, 40) * 1000; break; case PHASE_DEMON: Timer[EVENT_SHADOW_BLAST] = 1000; @@ -1022,7 +1022,7 @@ public: if (soundid) DoPlaySoundToSet(me, soundid); } - Timer[EVENT_TAUNT] = 25000 + rand()%10000; + Timer[EVENT_TAUNT] = urand(25000, 35000); break; case EVENT_SHEAR: @@ -1033,14 +1033,14 @@ public: case EVENT_FLAME_CRASH: DoCast(me->getVictim(), SPELL_FLAME_CRASH); - Timer[EVENT_FLAME_CRASH] = 30000 + rand()%10000; + Timer[EVENT_FLAME_CRASH] = urand(30000, 40000); break; case EVENT_PARASITIC_SHADOWFIEND: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true)) DoCast(target, SPELL_PARASITIC_SHADOWFIEND, true); - Timer[EVENT_PARASITIC_SHADOWFIEND] = 35000 + rand()%10000; + Timer[EVENT_PARASITIC_SHADOWFIEND] = urand(35000, 45000); } break; @@ -1050,7 +1050,7 @@ public: case EVENT_DRAW_SOUL: DoCast(me->getVictim(), SPELL_DRAW_SOUL); - Timer[EVENT_DRAW_SOUL] = 50000 + rand()%10000; + Timer[EVENT_DRAW_SOUL] = urand(50000, 60000); break; // PHASE_NORMAL_2 @@ -1172,7 +1172,7 @@ public: Phase = PHASE_NORMAL_MAIEV; IllidanGUID = 0; Timer[EVENT_MAIEV_STEALTH] = 0; - Timer[EVENT_MAIEV_TAUNT] = 22000 + rand()%21 * 1000; + Timer[EVENT_MAIEV_TAUNT] = urand(22, 43) * 1000; Timer[EVENT_MAIEV_SHADOW_STRIKE] = 30000; SetEquipmentSlots(false, 44850, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, 45738); @@ -1321,7 +1321,7 @@ public: if (MaievTaunts[random].text.size()) me->MonsterYell(MaievTaunts[random].text.c_str(), LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, sound); - Timer[EVENT_MAIEV_TAUNT] = 22000 + rand()%21 * 1000; + Timer[EVENT_MAIEV_TAUNT] = urand(22, 43) * 1000; } break; case EVENT_MAIEV_SHADOW_STRIKE: @@ -1590,7 +1590,7 @@ public: break; case PHASE_FIGHT_MINIONS: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Timer = 10000 + rand()%6000; // summon minion + Timer = urand(10000, 16000); // summon minion break; case PHASE_RETURN: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -1780,7 +1780,7 @@ public: AttackStart(Elite); me->AddThreat(Elite, 1000000.0f); } - Timer = 10000 + rand()%6000; + Timer = urand(10000, 16000); GETUNIT(Illidan, IllidanGUID); if (Illidan && Illidan->HealthBelowPct(10)) EnterPhase(PHASE_RETURN); diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index a69ed1f7e7d..645a9fe7978 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -128,7 +128,7 @@ public: FatalAttractionExplodeTimer = 70000; ShriekTimer = 30000; SaberTimer = 35000; - RandomYellTimer = 70000 + rand()%41 * 1000; + RandomYellTimer = urand(70, 111) * 1000; EnrageTimer = 600000; ExplosionCount = 0; @@ -237,7 +237,7 @@ public: DoScriptText(RAND(SAY_SPELL2, SAY_SPELL3), me); FatalAttractionExplodeTimer = 2000; - FatalAttractionTimer = 40000 + rand()%31 * 1000; + FatalAttractionTimer = urand(40, 71) * 1000; } else FatalAttractionTimer -= diff; if (FatalAttractionExplodeTimer <= diff) @@ -293,7 +293,7 @@ public: if (RandomYellTimer <= diff) { DoScriptText(RAND(SAY_TAUNT1, SAY_TAUNT2, SAY_TAUNT3), me); - RandomYellTimer = 60000 + rand()%91 * 1000; + RandomYellTimer = urand(60, 151) * 1000; } else RandomYellTimer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 1519713183d..8b39fe8a8f7 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -582,7 +582,7 @@ public: { me->InterruptNonMeleeSpells(false); DoCast(me->getVictim(), SPELL_DEADEN); - DeadenTimer = 25000 + rand()%10000; + DeadenTimer = urand(25000, 35000); if (!(rand()%2)) { DoScriptText(DESI_SAY_SPEC, me); @@ -676,7 +676,7 @@ public: if (SoulScreamTimer <= diff) { DoCast(me->getVictim(), SPELL_SOUL_SCREAM); - SoulScreamTimer = 9000 + rand()%2000; + SoulScreamTimer = urand(9000, 11000); if (!(rand()%3)) { DoScriptText(ANGER_SAY_SPEC, me); diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 074bb16e7a0..d6510db0cbb 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -246,7 +246,7 @@ public: if (instance) instance->SetData(DATA_TERONGOREFIENDEVENT, NOT_STARTED); - IncinerateTimer = 20000 + rand()%11000; + IncinerateTimer = urand(20000, 31000); SummonDoomBlossomTimer = 12000; EnrageTimer = 600000; CrushingShadowsTimer = 22000; @@ -460,7 +460,7 @@ public: { DoScriptText(RAND(SAY_SPECIAL1, SAY_SPECIAL2), me); DoCast(target, SPELL_INCINERATE); - IncinerateTimer = 20000 + rand()%31 * 1000; + IncinerateTimer = urand(20, 51) * 1000; } } else IncinerateTimer -= diff; @@ -469,7 +469,7 @@ public: Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (target && target->isAlive()) DoCast(target, SPELL_CRUSHING_SHADOWS); - CrushingShadowsTimer = 10000 + rand()%16 * 1000; + CrushingShadowsTimer = urand(10, 26) * 1000; } else CrushingShadowsTimer -= diff; /*** NOTE FOR FUTURE DEV: UNCOMMENT BELOW ONLY IF MIND CONTROL IS FULLY IMPLEMENTED **/ @@ -492,7 +492,7 @@ public: if (RandomYellTimer <= diff) { DoScriptText(RAND(SAY_SPELL1, SAY_SPELL2), me); - RandomYellTimer = 50000 + rand()%51 * 1000; + RandomYellTimer = urand(50, 101) * 1000; } else RandomYellTimer -= diff; if (!me->HasAura(SPELL_BERSERK)) diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index f7e98444be8..6fe24378f79 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -613,8 +613,8 @@ public: void Reset() { - BlizzardTimer = 30000 + rand()%61 * 1000; - FlamestrikeTimer = 30000 + rand()%61 * 1000; + BlizzardTimer = urand(30, 91) * 1000; + FlamestrikeTimer = urand(30, 91) * 1000; ArcaneBoltTimer = 10000; DampenMagicTimer = 2000; ArcaneExplosionTimer = 14000; @@ -673,7 +673,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_BLIZZARD); - BlizzardTimer = 45000 + rand()%46 * 1000; + BlizzardTimer = urand(45, 91) * 1000; FlamestrikeTimer += 10000; Cooldown = 1000; } @@ -684,7 +684,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_FLAMESTRIKE); - FlamestrikeTimer = 55000 + rand()%46 * 1000; + FlamestrikeTimer = urand(55, 101) * 1000; BlizzardTimer += 10000; Cooldown = 2000; } @@ -756,7 +756,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_DIVINE_WRATH); - DivineWrathTimer = 40000 + rand()%41 * 1000; + DivineWrathTimer = urand(40, 81) * 1000; } } else DivineWrathTimer -= diff; @@ -799,7 +799,7 @@ public: EnvenomTargetGUID = 0; DeadlyPoisonTimer = 20000; - VanishTimer = 60000 + rand()%61 * 1000; + VanishTimer = urand(60, 121) * 1000; AppearEnvenomTimer = 150000; HasVanished = false; @@ -827,7 +827,7 @@ public: if (DeadlyPoisonTimer <= diff) { DoCast(me->getVictim(), SPELL_DEADLY_POISON); - DeadlyPoisonTimer = 15000 + rand()%31 * 1000; + DeadlyPoisonTimer = urand(15, 46) * 1000; } else DeadlyPoisonTimer -= diff; if (AppearEnvenomTimer <= diff) // Cast Envenom. This is cast 4 seconds after Vanish is over diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 65cb0173cd7..a29fafe4edb 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -691,8 +691,8 @@ public: void Reset() { - Mindblast_Timer = 3000 + rand()%5000; - Earthshock_Timer = 5000 + rand()%5000; + Mindblast_Timer = urand(3000, 8000); + Earthshock_Timer = urand(5000, 10000); if (instance) { @@ -764,7 +764,7 @@ public: if (target)DoCast(target, SPELL_MINDBLAST); - Mindblast_Timer = 10000 + rand()%5000; + Mindblast_Timer = urand(10000, 15000); } else Mindblast_Timer -= diff; if (Earthshock_Timer <= diff) @@ -787,7 +787,7 @@ public: } } } - Earthshock_Timer = 8000 + rand()%7000; + Earthshock_Timer = urand(8000, 15000); } else Earthshock_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index 7cdfdc383bd..5265dff16e2 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -213,7 +213,7 @@ public: if (m_uiReverberation_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_REVERBERATION, true); - m_uiReverberation_Timer = 15000 + rand()%10000; + m_uiReverberation_Timer = urand(15000, 25000); } else m_uiReverberation_Timer -= uiDiff; diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp index de3b93d029d..b941e3bc581 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp @@ -524,7 +524,7 @@ public: if (target) DoCast(target, SPELL_GREATER_POLYMORPH); - GreaterPolymorph_Timer = 15000 + rand()%5000; + GreaterPolymorph_Timer = urand(15000, 20000); } else GreaterPolymorph_Timer -= diff; //LightningBolt_Timer @@ -581,8 +581,8 @@ public: void Reset() { GreaterPowerWordShield_Timer = 5000; - Heal_Timer = 25000 + rand()%15000; - PrayerofHealing_Timer = 45000 + rand()%10000; + Heal_Timer = urand(25000, 40000); + PrayerofHealing_Timer = urand(45000, 55000); //reset encounter if (instance) @@ -648,14 +648,14 @@ public: if (Heal_Timer <= diff) { DoCast(me, SPELL_HEAL); - Heal_Timer = 15000 + rand()%25000; + Heal_Timer = urand(15000, 40000); } else Heal_Timer -= diff; //PrayerofHealing_Timer if (PrayerofHealing_Timer <= diff) { DoCast(me, SPELL_PRAYER_OH); - PrayerofHealing_Timer = 35000 + rand()%15000; + PrayerofHealing_Timer = urand(35000, 50000); } else PrayerofHealing_Timer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index 6918a076f6e..755106f7092 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -424,7 +424,7 @@ class boss_magtheridon : public CreatureScript summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } } - Blaze_Timer = 20000 + rand()%20000; + Blaze_Timer = urand(20000, 40000); } else Blaze_Timer -= diff; @@ -497,10 +497,10 @@ class mob_hellfire_channeler : public CreatureScript void Reset() { - ShadowBoltVolley_Timer = 8000 + rand()%2000; + ShadowBoltVolley_Timer = urand(8000, 10000); DarkMending_Timer = 10000; - Fear_Timer = 15000 + rand()%5000; - Infernal_Timer = 10000 + rand()%40000; + Fear_Timer = urand(15000, 20000); + Infernal_Timer = urand(10000, 50000); Check_Timer = 5000; } @@ -547,7 +547,7 @@ class mob_hellfire_channeler : public CreatureScript if (ShadowBoltVolley_Timer <= diff) { DoCast(me, SPELL_SHADOW_BOLT_VOLLEY); - ShadowBoltVolley_Timer = 10000 + rand()%10000; + ShadowBoltVolley_Timer = urand(10000, 20000); } else ShadowBoltVolley_Timer -= diff; @@ -565,7 +565,7 @@ class mob_hellfire_channeler : public CreatureScript { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) DoCast(target, SPELL_FEAR); - Fear_Timer = 25000 + rand()%15000; + Fear_Timer = urand(25000, 40000); } else Fear_Timer -= diff; @@ -574,7 +574,7 @@ class mob_hellfire_channeler : public CreatureScript { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_BURNING_ABYSSAL, true); - Infernal_Timer = 30000 + rand()%10000; + Infernal_Timer = urand(30000, 40000); } else Infernal_Timer -= diff; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp index df7f95abe2a..cae13adfef7 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp @@ -102,7 +102,7 @@ class boss_gatewatcher_iron_hand : public CreatureScript if (Shadow_Power_Timer <= diff) { DoCast(me, SPELL_SHADOW_POWER); - Shadow_Power_Timer = 20000 + rand()%8000; + Shadow_Power_Timer = urand(20000, 28000); } else Shadow_Power_Timer -= diff; @@ -128,7 +128,7 @@ class boss_gatewatcher_iron_hand : public CreatureScript if (Stream_of_Machine_Fluid_Timer <= diff) { DoCast(me->getVictim(), SPELL_STREAM_OF_MACHINE_FLUID); - Stream_of_Machine_Fluid_Timer = 35000 + rand()%15000; + Stream_of_Machine_Fluid_Timer = urand(35000, 50000); } else Stream_of_Machine_Fluid_Timer -= diff; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 05bf711432d..c5408b4bbf5 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -76,10 +76,10 @@ class boss_nethermancer_sepethrea : public CreatureScript void Reset() { - frost_attack_Timer = 7000 + rand()%3000; - arcane_blast_Timer = 12000 + rand()%6000; - dragons_breath_Timer = 18000 + rand()%4000; - knockback_Timer = 22000 + rand()%6000; + frost_attack_Timer = urand(7000, 10000); + arcane_blast_Timer = urand(12000, 18000); + dragons_breath_Timer = urand(18000, 22000); + knockback_Timer = urand(22000, 28000); solarburn_Timer = 30000; if (instance) @@ -119,7 +119,7 @@ class boss_nethermancer_sepethrea : public CreatureScript { DoCast(me->getVictim(), SPELL_FROST_ATTACK); - frost_attack_Timer = 7000 + rand()%3000; + frost_attack_Timer = urand(7000, 10000); } else frost_attack_Timer -= diff; @@ -141,7 +141,7 @@ class boss_nethermancer_sepethrea : public CreatureScript return; DoScriptText(RAND(SAY_DRAGONS_BREATH_1, SAY_DRAGONS_BREATH_2), me); } - dragons_breath_Timer = 12000 + rand()%10000; + dragons_breath_Timer = urand(12000, 22000); } else dragons_breath_Timer -= diff; @@ -150,7 +150,7 @@ class boss_nethermancer_sepethrea : public CreatureScript if (knockback_Timer <= diff) { DoCast(me->getVictim(), SPELL_KNOCKBACK); - knockback_Timer = 15000 + rand()%10000; + knockback_Timer = urand(15000, 25000); } else knockback_Timer -= diff; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp index 54ecbdd621a..30a6bdbc0dd 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp @@ -83,10 +83,10 @@ class boss_pathaleon_the_calculator : public CreatureScript void Reset() { Summon_Timer = 30000; - ManaTap_Timer = 12000 + rand()%8000; - ArcaneTorrent_Timer = 16000 + rand()%9000; - Domination_Timer = 25000 + rand()%15000; - ArcaneExplosion_Timer = 8000 + rand()%5000; + ManaTap_Timer = urand(12000, 20000); + ArcaneTorrent_Timer = urand(16000, 25000); + Domination_Timer = urand(25000, 40000); + ArcaneExplosion_Timer = urand(8000, 13000); Enraged = false; @@ -135,7 +135,7 @@ class boss_pathaleon_the_calculator : public CreatureScript Wraith->AI()->AttackStart(target); } DoScriptText(SAY_SUMMON, me); - Summon_Timer = 30000 + rand()%15000; + Summon_Timer = urand(30000, 45000); } else Summon_Timer -= diff; @@ -143,7 +143,7 @@ class boss_pathaleon_the_calculator : public CreatureScript if (ManaTap_Timer <= diff) { DoCast(me->getVictim(), SPELL_MANA_TAP); - ManaTap_Timer = 14000 + rand()%8000; + ManaTap_Timer = urand(14000, 22000); } else ManaTap_Timer -= diff; @@ -151,7 +151,7 @@ class boss_pathaleon_the_calculator : public CreatureScript if (ArcaneTorrent_Timer <= diff) { DoCast(me->getVictim(), SPELL_ARCANE_TORRENT); - ArcaneTorrent_Timer = 12000 + rand()%6000; + ArcaneTorrent_Timer = urand(12000, 18000); } else ArcaneTorrent_Timer -= diff; @@ -163,7 +163,7 @@ class boss_pathaleon_the_calculator : public CreatureScript DoScriptText(RAND(SAY_DOMINATION_1, SAY_DOMINATION_2), me); DoCast(target, SPELL_DOMINATION); } - Domination_Timer = 25000 + rand()%5000; + Domination_Timer = urand(25000, 30000); } else Domination_Timer -= diff; @@ -174,7 +174,7 @@ class boss_pathaleon_the_calculator : public CreatureScript if (ArcaneExplosion_Timer <= diff) { DoCast(me->getVictim(), H_SPELL_ARCANE_EXPLOSION); - ArcaneExplosion_Timer = 10000 + rand()%4000; + ArcaneExplosion_Timer = urand(10000, 14000); } else ArcaneExplosion_Timer -= diff; @@ -218,7 +218,7 @@ class mob_nether_wraith : public CreatureScript void Reset() { - ArcaneMissiles_Timer = 1000 + rand()%3000; + ArcaneMissiles_Timer = urand(1000, 4000); Detonation_Timer = 20000; Die_Timer = 2200; Detonation = false; @@ -237,7 +237,7 @@ class mob_nether_wraith : public CreatureScript DoCast(target, SPELL_ARCANE_MISSILES); else DoCast(me->getVictim(), SPELL_ARCANE_MISSILES); - ArcaneMissiles_Timer = 5000 + rand()%5000; + ArcaneMissiles_Timer = urand(5000, 10000); } else ArcaneMissiles_Timer -=diff; diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp index 2bf4abbcb96..75c80b06816 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -152,9 +152,9 @@ class boss_warp_splinter : public CreatureScript void Reset() { - War_Stomp_Timer = 25000 + rand()%15000; + War_Stomp_Timer = urand(25000, 40000); Summon_Treants_Timer = 45000; - Arcane_Volley_Timer = 8000 + rand()%12000; + Arcane_Volley_Timer = urand(8000, 20000); me->SetSpeed(MOVE_RUN, 0.7f, true); } @@ -199,7 +199,7 @@ class boss_warp_splinter : public CreatureScript if (War_Stomp_Timer <= diff) { DoCast(me->getVictim(), WAR_STOMP); - War_Stomp_Timer = 25000 + rand()%15000; + War_Stomp_Timer = urand(25000, 40000); } else War_Stomp_Timer -= diff; @@ -208,7 +208,7 @@ class boss_warp_splinter : public CreatureScript if (Arcane_Volley_Timer <= diff) { DoCast(me->getVictim(), DUNGEON_MODE(ARCANE_VOLLEY, ARCANE_VOLLEY_H)); - Arcane_Volley_Timer = 20000 + rand()%15000; + Arcane_Volley_Timer = urand(20000, 35000); } else Arcane_Volley_Timer -= diff; -- cgit v1.2.3 From fa77969184a7ad5b0dcc2cd52fcb9f2fc79b2519 Mon Sep 17 00:00:00 2001 From: Rat Date: Thu, 19 Jan 2012 20:11:32 +0100 Subject: Core/Movement: Updated/Added/Removed/Renamed Movement related Opcodes. - Rearranged opcodes enum (started working on structs + have to check new naming and such) --- src/server/game/Entities/Player/Player.cpp | 18 +- src/server/game/Entities/Unit/Unit.cpp | 52 ++-- src/server/game/Entities/Vehicle/Vehicle.cpp | 2 +- .../game/Server/Protocol/Handlers/MiscHandler.cpp | 4 +- .../Server/Protocol/Handlers/MovementHandler.cpp | 26 +- src/server/game/Server/Protocol/Opcodes.cpp | 98 +++---- src/server/game/Server/Protocol/Opcodes.h | 286 ++++++++++++--------- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 20 +- src/server/scripts/Commands/cs_modify.cpp | 4 +- 9 files changed, 270 insertions(+), 240 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5e031510752..61d4121c2e4 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2068,7 +2068,7 @@ uint8 Player::GetChatTag() const void Player::SendTeleportPacket(Position &oldPos) { - WorldPacket data2(MSG_MOVE_TELEPORT, 38); + WorldPacket data2(SMSG_MOVE_TELEPORT, 38); data2.append(GetPackGUID()); BuildMovementPacket(&data2); Relocate(&oldPos); @@ -2077,7 +2077,7 @@ void Player::SendTeleportPacket(Position &oldPos) void Player::SendTeleportAckPacket() { - WorldPacket data(MSG_MOVE_TELEPORT_ACK, 41); + WorldPacket data(CMSG_MOVE_TELEPORT_ACK, 41); data.append(GetPackGUID()); data << uint32(0); // this value increments every time BuildMovementPacket(&data); @@ -2187,9 +2187,9 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati SetFallInformation(0, z); // code for finish transfer called in WorldSession::HandleMovementOpcodes() - // at client packet MSG_MOVE_TELEPORT_ACK + // at client packet CMSG_MOVE_TELEPORT_ACK SetSemaphoreTeleportNear(true); - // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing + // near teleport, triggering send CMSG_MOVE_TELEPORT_ACK from client at landing if (!GetSession()->PlayerLogout()) { Position oldPos; @@ -5036,10 +5036,10 @@ void Player::SetMovement(PlayerMovementType pType) WorldPacket data; switch (pType) { - case MOVE_ROOT: data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size()+4); break; - case MOVE_UNROOT: data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size()+4); break; - case MOVE_WATER_WALK: data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size()+4); break; - case MOVE_LAND_WALK: data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size()+4); break; + case MOVE_ROOT: data.Initialize(SMSG_MOVE_ROOT, GetPackGUID().size()+4); break; + case MOVE_UNROOT: data.Initialize(SMSG_MOVE_UNROOT, GetPackGUID().size()+4); break; + case MOVE_WATER_WALK: data.Initialize(SMSG_MOVE_SPLINE_SET_WATER_WALK, GetPackGUID().size()+4); break; + case MOVE_LAND_WALK: data.Initialize(SMSG_MOVE_SPLINE_SET_LAND_WALK, GetPackGUID().size()+4); break; default: sLog->outError("Player::SetMovement: Unsupported move type (%d), data not sent to client.", pType); return; @@ -21778,7 +21778,7 @@ void Player::SendInitialPacketsAfterAddToMap() // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied. if (HasAuraType(SPELL_AURA_MOD_ROOT)) { - WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10); + WorldPacket data2(SMSG_MOVE_ROOT, 10); data2.append(GetPackGUID()); data2 << (uint32)2; SendMessageToSet(&data2, true); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 39e9e077e3e..dcc18c0559f 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11958,7 +11958,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) player->UnsummonPetTemporaryIfAny(); } - WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4); + WorldPacket data(SMSG_MOVE_SET_COLLISION_HEIGHT, GetPackGUID().size() + 4 + 4); data.append(GetPackGUID()); data << uint32(sWorld->GetGameTime()); // Packet counter data << player->GetCollisionHeight(true); @@ -11978,7 +11978,7 @@ void Unit::Dismount() if (Player* thisPlayer = ToPlayer()) { - WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4); + WorldPacket data(SMSG_MOVE_SET_COLLISION_HEIGHT, GetPackGUID().size() + 4 + 4); data.append(GetPackGUID()); data << uint32(sWorld->GetGameTime()); // Packet counter data << thisPlayer->GetCollisionHeight(false); @@ -12636,7 +12636,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) switch (mtype) { case MOVE_WALK: - data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_WALK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_RUN: data.Initialize(SMSG_MOVE_SPLINE_SET_RUN_SPEED, 1 + 8 + 4); @@ -12661,25 +12661,25 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data << float(GetSpeed(mtype)); break; case MOVE_RUN_BACK: - data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_SWIM: - data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_SWIM_BACK: - data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_TURN_RATE: - data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_FLIGHT: - data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_FLIGHT_BACK: - data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_PITCH_RATE: - data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_PITCH_RATE, 8+4+2+4+4+4+4+4+4+4); break; default: sLog->outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.", mtype); @@ -12715,10 +12715,10 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) switch (mtype) { case MOVE_WALK: - data.Initialize(SMSG_FORCE_WALK_SPEED_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_WALK_SPEED, 16); break; case MOVE_RUN: - data.Initialize(SMSG_FORCE_RUN_SPEED_CHANGE, 1 + 8 + 4 + 4 ); + data.Initialize(SMSG_MOVE_SET_RUN_SPEED, 1 + 8 + 4 + 4 ); data.WriteByteMask(bytes[1]); data.WriteByteMask(bytes[0]); data.WriteByteMask(bytes[7]); @@ -12742,25 +12742,25 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data << uint32(0); break; case MOVE_RUN_BACK: - data.Initialize(SMSG_FORCE_RUN_BACK_SPEED_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_RUN_BACK_SPEED, 16); break; case MOVE_SWIM: - data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_SWIM_SPEED, 16); break; case MOVE_SWIM_BACK: - data.Initialize(SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_SWIM_BACK_SPEED, 16); break; case MOVE_TURN_RATE: - data.Initialize(SMSG_FORCE_TURN_RATE_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_TURN_RATE, 16); break; case MOVE_FLIGHT: - data.Initialize(SMSG_FORCE_FLIGHT_SPEED_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_FLIGHT_SPEED, 16); break; case MOVE_FLIGHT_BACK: - data.Initialize(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, 16); break; case MOVE_PITCH_RATE: - data.Initialize(SMSG_FORCE_PITCH_RATE_CHANGE, 16); + data.Initialize(SMSG_MOVE_SET_PITCH_RATE, 16); break; default: sLog->outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.", mtype); @@ -15820,7 +15820,7 @@ void Unit::SetStunned(bool apply) else SetStandState(UNIT_STAND_STATE_STAND); - WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8); + WorldPacket data(SMSG_MOVE_ROOT, 8); data.append(GetPackGUID()); data << uint32(0); SendMessageToSet(&data, true); @@ -15839,7 +15839,7 @@ void Unit::SetStunned(bool apply) if (!HasUnitState(UNIT_STAT_ROOT)) // prevent moving if it also has root effect { - WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4); + WorldPacket data(SMSG_MOVE_UNROOT, 8+4); data.append(GetPackGUID()); data << uint32(0); SendMessageToSet(&data, true); @@ -15864,14 +15864,14 @@ void Unit::SetRooted(bool apply) if (GetTypeId() == TYPEID_PLAYER) { - WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10); + WorldPacket data(SMSG_MOVE_ROOT, 10); data.append(GetPackGUID()); data << m_rootTimes; SendMessageToSet(&data, true); } else { - WorldPacket data(SMSG_SPLINE_MOVE_ROOT, 8); + WorldPacket data(SMSG_MOVE_SPLINE_ROOT, 8); data.append(GetPackGUID()); SendMessageToSet(&data, true); ToCreature()->StopMoving(); @@ -15883,14 +15883,14 @@ void Unit::SetRooted(bool apply) { if (GetTypeId() == TYPEID_PLAYER) { - WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10); + WorldPacket data(SMSG_MOVE_UNROOT, 10); data.append(GetPackGUID()); data << ++m_rootTimes; SendMessageToSet(&data, true); } else { - WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8); + WorldPacket data(SMSG_MOVE_SPLINE_UNROOT, 8); data.append(GetPackGUID()); SendMessageToSet(&data, true); } @@ -17180,7 +17180,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) ToPlayer()->SetFallInformation(0, GetPositionZ()); else if (HasUnitMovementFlag(MOVEMENTFLAG_ROOT)) { - WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8); + WorldPacket data(SMSG_MOVE_SPLINE_UNROOT, 8); data.append(GetPackGUID()); SendMessageToSet(&data, false); } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 7e4bebaab95..677ef5032f2 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -364,7 +364,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) if (_me->IsInWorld()) { unit->SendClearTarget(); // SMSG_BREAK_TARGET - unit->SetControlled(true, UNIT_STAT_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures) + unit->SetControlled(true, UNIT_STAT_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_MOVE_SPLINE_ROOT here (for creatures) // also adds MOVEMENTFLAG_ROOT unit->SendMonsterMoveTransport(_me); // SMSG_MONSTER_MOVE_TRANSPORT diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp index d51afc5eaf1..898db683c0a 100755 --- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp @@ -400,7 +400,7 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket & /*recv_data*/) { GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); - WorldPacket data(SMSG_FORCE_MOVE_ROOT, (8+4)); // guess size + WorldPacket data(SMSG_MOVE_ROOT, (8+4)); // guess size data.append(GetPlayer()->GetPackGUID()); data << (uint32)2; SendPacket(&data); @@ -432,7 +432,7 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPacket & /*recv_data*/) if (GetPlayer()->CanFreeMove()) { //!we can move again - data.Initialize(SMSG_FORCE_MOVE_UNROOT, 8); // guess size + data.Initialize(SMSG_MOVE_UNROOT, 8); // guess size data.append(GetPlayer()->GetPackGUID()); data << uint32(0); SendPacket(&data); diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index 761b8406d88..9fc429f1321 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -34,7 +34,7 @@ void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket & /*recv_data*/) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got MSG_MOVE_WORLDPORT_ACK."); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got CMSG_WORLD_PORT_RESPONSE."); HandleMoveWorldportAckOpcode(); } @@ -191,7 +191,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_MOVE_TELEPORT_ACK"); uint64 guid; recv_data.readPackGUID(guid); @@ -418,15 +418,15 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) switch (opcode) { - //case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; - //case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; - //case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; - //case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; - //case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; - //case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; - //case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; - //case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; - //case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; + case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; + case CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; + case CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; + case CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; + case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; + case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; + case CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; + case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; + case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; default: sLog->outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; @@ -472,7 +472,7 @@ void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recv_data) GetPlayer()->SetMover(mover); if (mover != GetPlayer() && mover->canFly()) { - WorldPacket data(SMSG_MOVE_SET_CAN_FLY, 12); + WorldPacket data(SMSG_MOVE_SPLINE_SET_FLYING, 12); data.append(mover->GetPackGUID()); data << uint32(0); SendPacket(&data); @@ -524,7 +524,7 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket & recv_data) ReadMovementInfo(recv_data, &movementInfo); _player->m_movementInfo = movementInfo; - WorldPacket data(MSG_MOVE_KNOCK_BACK, 66); + WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, 66); data.appendPackGUID(guid); _player->BuildMovementPacket(&data); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b830444aaf2..bff065a6290 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -255,12 +255,12 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(MSG_MOVE_START_PITCH_UP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER(MSG_MOVE_START_PITCH_DOWN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); - DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); - DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER(MSG_MOVE_START_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); @@ -268,47 +268,47 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_WALK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_WALK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_SWIM_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_SWIM_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_SWIM_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_SWIM_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_ALL_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_TURN_RATE_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_TURN_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_TURN_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); + //DEFINE_OPCODE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); DEFINE_OPCODE_HANDLER(SMSG_MONSTER_MOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_CHARM_PORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_RAW_POSITION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_RUN_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_RUN_BACK_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_SWIM_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_RELATIVE_POSITION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_KNOCK_BACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_FEATHER_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_NORMAL_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FEATHER_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_NORMAL_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveHoverAck ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_HOVERING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_TRIGGER_CINEMATIC_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -791,12 +791,12 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterHelloOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_WALK_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_TURN_RATE_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_TURN_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_TURN_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); //DEFINE_OPCODE_HANDLER(MSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePVPLogDataOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LEAVE_BATTLEFIELD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveBattlefieldOpcode ); DEFINE_OPCODE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode); @@ -833,7 +833,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_WALK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_SWIM_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_TURN_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_FEATHER_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_NORMAL_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -854,8 +854,8 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_DEBUG_ACTIONS_STOP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_SET_FACTION_INACTIVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionInactiveOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetWatchedFactionOpcode ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_TIME_SKIPPED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_SET_EXPLORATION_ALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_RESET_INSTANCES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResetInstancesOpcode ); @@ -896,8 +896,8 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLYING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_FLYING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode ); @@ -956,13 +956,13 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_CHEAT_SET_HONOR_CURRENCY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_CHEAT_SET_ARENA_CURRENCY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FLIGHT_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_FLIGHT_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_FLIGHT_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MAELSTROM_INVALIDATE_CACHE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1177,9 +1177,9 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_SET_RUNE_COUNT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_SET_RUNE_COOLDOWN, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_PITCH_RATE_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_PITCH_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_FORCE_PITCH_RATE_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_PITCH_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_PITCH_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_PITCH_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1365,7 +1365,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_DROP_NEW_CONNECTION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(SMSG_SEND_ALL_COMBAT_LOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HGT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_COLLISION_HGT_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_COLLISION_HGT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_CLEAR_RANDOM_BG_WIN_TIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index b30dc5531fb..0d05d924580 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -40,9 +40,9 @@ enum Opcodes CMSG_ADD_IGNORE = 0xCEEA, CMSG_ADD_VOICE_IGNORE = 0x0A7A, CMSG_ALTER_APPEARANCE = 0x5CE3, - CMSG_AREATRIGGER = 0x5862, CMSG_AREA_SPIRIT_HEALER_QUERY = 0xDC7E, CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x8846, + CMSG_AREATRIGGER = 0x5862, CMSG_ARENA_TEAM_ACCEPT = 0xDA42, CMSG_ARENA_TEAM_DECLINE = 0x8E73, CMSG_ARENA_TEAM_DISBAND = 0x4A5A, @@ -61,6 +61,7 @@ enum Opcodes CMSG_AUCTION_REMOVE_ITEM = 0xCEC3, CMSG_AUCTION_SELL_ITEM = 0x0CE6, CMSG_AUTH_SESSION = 0x1019, + CMSG_AUTO_DECLINE_GUILD_INVITES = 0x586F, CMSG_AUTOBANK_ITEM = 0x8C56, CMSG_AUTOEQUIP_GROUND_ITEM = 0x00, CMSG_AUTOEQUIP_ITEM = 0x8E66, @@ -69,7 +70,6 @@ enum Opcodes CMSG_AUTOSTORE_BANK_ITEM = 0x1C5F, CMSG_AUTOSTORE_GROUND_ITEM = 0x00, CMSG_AUTOSTORE_LOOT_ITEM = 0xD876, - CMSG_AUTO_DECLINE_GUILD_INVITES = 0x586F, CMSG_BANKER_ACTIVATE = 0x0A5A, CMSG_BATTLEFIELD_JOIN = 0x225, CMSG_BATTLEFIELD_LIST = 0x32A4, @@ -81,9 +81,9 @@ enum Opcodes CMSG_BOT_DETECTED2 = 0x00, CMSG_BUG = 0x1A77, CMSG_BUSY_TRADE = 0x00, - CMSG_BUYBACK_ITEM = 0xDEE6, CMSG_BUY_BANK_SLOT = 0x487F, CMSG_BUY_ITEM = 0x1E5A, + CMSG_BUYBACK_ITEM = 0xDEE6, CMSG_CALENDAR_ADD_EVENT = 0x1CF3, CMSG_CALENDAR_ARENA_TEAM = 0x00, CMSG_CALENDAR_CONTEXT_EVENT_SIGNUP = 0x00, @@ -150,8 +150,8 @@ enum Opcodes CMSG_DEL_FRIEND = 0xC852, CMSG_DEL_IGNORE = 0x8ADA, CMSG_DEL_VOICE_IGNORE = 0x8C73, - CMSG_DESTROYITEM = 0x4E7A, CMSG_DESTROY_ITEMS = 0x00, + CMSG_DESTROYITEM = 0x4E7A, CMSG_DUEL_ACCEPTED = 0x9CCB, CMSG_DUEL_CANCELLED = 0x1E4F, CMSG_EJECT_PASSENGER = 0x00, @@ -160,26 +160,21 @@ enum Opcodes CMSG_EQUIPMENT_SET_DELETE = 0x9CF2, CMSG_EQUIPMENT_SET_SAVE = 0x5E5F, CMSG_EQUIPMENT_SET_USE = 0x4853, - CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x00, - CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x00, - CMSG_FORCE_MOVE_ROOT_ACK = 0x00, - CMSG_FORCE_MOVE_UNROOT_ACK = 0x00, - CMSG_FORCE_PITCH_RATE_CHANGE_ACK = 0x00, - CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x00, - CMSG_FORCE_RUN_SPEED_CHANGE_ACK = 0x00, - CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x00, - CMSG_FORCE_SWIM_SPEED_CHANGE_ACK = 0x00, - CMSG_FORCE_TURN_RATE_CHANGE_ACK = 0x00, - CMSG_FORCE_WALK_SPEED_CHANGE_ACK = 0x00, - CMSG_GAMEOBJECT_QUERY = 0xCEFF, + CMSG_FORCE_MOVE_ROOT_ACK = 0x00A4, + CMSG_FORCE_MOVE_UNROOT_ACK = 0x27A5, CMSG_GAMEOBJ_REPORT_USE = 0x9A4A, CMSG_GAMEOBJ_USE = 0x1E77, + CMSG_GAMEOBJECT_QUERY = 0xCEFF, CMSG_GAMESPEED_SET = 0x00, CMSG_GAMETIME_SET = 0x00, - CMSG_GETDEATHBINDZONE = 0x00, CMSG_GET_MAIL_LIST = 0xB284, CMSG_GET_MIRRORIMAGE_DATA = 0xDAF3, + CMSG_GETDEATHBINDZONE = 0x00, CMSG_GHOST = 0x00, + CMSG_GM_INVIS = 0x00, + CMSG_GM_NUKE = 0x00, + CMSG_GM_REPORT_LAG = 0x9C6B, + CMSG_GM_SET_SECURITY_GROUP = 0x00, CMSG_GMRESPONSE_RESOLVE = 0x00, CMSG_GMSURVEY_SUBMIT = 0x00, CMSG_GMTICKET_CREATE = 0x0A7B, @@ -187,10 +182,6 @@ enum Opcodes CMSG_GMTICKET_GETTICKET = 0x985F, CMSG_GMTICKET_SYSTEMSTATUS = 0x4A7A, CMSG_GMTICKET_UPDATETEXT = 0x8A7B, - CMSG_GM_INVIS = 0x00, - CMSG_GM_NUKE = 0x00, - CMSG_GM_REPORT_LAG = 0x9C6B, - CMSG_GM_SET_SECURITY_GROUP = 0x00, CMSG_GOSSIP_HELLO = 0xAD3, CMSG_GOSSIP_SELECT_OPTION = 0x984E, CMSG_GRANT_LEVEL = 0x1CD6, @@ -206,9 +197,7 @@ enum Opcodes CMSG_GROUP_SWAP_SUB_GROUP = 0x5AD7, CMSG_GROUP_UNINVITE = 0x00, CMSG_GROUP_UNINVITE_GUID = 0xCE66, - CMSG_GUILDFINDER_JOIN = 0x68C5, CMSG_GUILD_ACCEPT = 0x00, - CMSG_GUILD_BANKER_ACTIVATE = 0x4E77, CMSG_GUILD_BANK_BUY_TAB = 0x00, CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x4847, CMSG_GUILD_BANK_NOTE = 0x00, @@ -216,6 +205,7 @@ enum Opcodes CMSG_GUILD_BANK_SWAP_ITEMS = 0x85B, CMSG_GUILD_BANK_UPDATE_TAB = 0x00, CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x00, + CMSG_GUILD_BANKER_ACTIVATE = 0x4E77, CMSG_GUILD_CREATE = 0x00, CMSG_GUILD_DECLINE = 0x00, CMSG_GUILD_DEMOTE = 0x00, @@ -231,6 +221,7 @@ enum Opcodes CMSG_GUILD_REMOVE = 0x00, CMSG_GUILD_ROSTER = 0x9952, CMSG_GUILD_SET_NOTE = 0x9958, + CMSG_GUILDFINDER_JOIN = 0x68C5, CMSG_HEARTH_AND_RESURRECT = 0xDC4E, CMSG_IGNORE_TRADE = 0x00, CMSG_INITIATE_TRADE = 0x00, @@ -257,9 +248,9 @@ enum Opcodes CMSG_LFG_TELEPORT = 0x8C7A, CMSG_LIST_INVENTORY = 0xDCFE, CMSG_LOAD_SCREEN = 0x0888, + CMSG_LOG_DISCONNECT = 0x00, CMSG_LOGOUT_CANCEL = 0xA76, CMSG_LOGOUT_REQUEST = 0x4C7A, - CMSG_LOG_DISCONNECT = 0x00, CMSG_LOOT = 0x1E62, CMSG_LOOT_METHOD = 0x00, CMSG_LOOT_MONEY = 0x4A42, @@ -295,25 +286,40 @@ enum Opcodes CMSG_MESSAGECHAT_YELL = 0x70C1, CMSG_MINIGAME_MOVE = 0x00, CMSG_MOUNTSPECIAL_ANIM = 0x00, - CMSG_MOVE_HOVER_ACK = 0x00, - CMSG_MOVE_KNOCK_BACK_ACK = 0x00, - CMSG_MOVE_SET_COLLISION_HGT = 0x00, - CMSG_MOVE_SET_RAW_POSITION = 0x00, - CMSG_MOVE_TIME_SKIPPED = 0x00, + CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x16A4, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x05A4, + CMSG_MOVE_FEATHER_FALL_ACK = 0x8525, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x82A4, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x9525, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x0025, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0xB7A5, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x20A4, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x21A5, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x96A4, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0xA324, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x2224, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3524, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x80A5, + CMSG_MOVE_HOVER_ACK = 0x31A4, + CMSG_MOVE_KNOCK_BACK_ACK = 0xA025, + CMSG_MOVE_SET_CAN_FLY_ACK = 0xA325, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x0525, + CMSG_MOVE_SET_RELATIVE_POSITION = 0x0024, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x3525, + CMSG_MOVE_TELEPORT_ACK = 0x2425, + CMSG_MOVE_TELEPORT_CHEAT = 0xA5A5, + CMSG_MOVE_TIME_SKIPPED = 0x3424, + CMSG_MOVE_TOGGLE_COLLISION_ACK = 0x0000, // exists, but not yet known + CMSG_MOVE_WATER_WALK_ACK = 0x25A4, CMSG_NAME_QUERY = 0x586A, CMSG_NEW_SPELL_SLOT = 0x00, CMSG_NEXT_CINEMATIC_CAMERA = 0x8E63, CMSG_NPC_TEXT_QUERY = 0x5C63, CMSG_OFFER_PETITION = 0xC8DE, - CMSG_OPENING_CINEMATIC = 0xD8D2, CMSG_OPEN_ITEM = 0x88C7, + CMSG_OPENING_CINEMATIC = 0xD8D2, CMSG_OPT_OUT_OF_LOOT = 0x00, CMSG_PAGE_TEXT_QUERY = 0x8A5F, - CMSG_PETITION_BUY = 0x8E4E, - CMSG_PETITION_QUERY = 0xCEF3, - CMSG_PETITION_SHOWLIST = 0x00, - CMSG_PETITION_SHOW_SIGNATURES = 0x1E66, - CMSG_PETITION_SIGN = 0x4A5E, CMSG_PET_ABANDON = 0x00, CMSG_PET_ACTION = 0x1AEA, CMSG_PET_CANCEL_AURA = 0x00, @@ -324,19 +330,27 @@ enum Opcodes CMSG_PET_SET_ACTION = 0x00, CMSG_PET_SPELL_AUTOCAST = 0x00, CMSG_PET_STOP_ATTACK = 0x00, + CMSG_PETITION_BUY = 0x8E4E, + CMSG_PETITION_QUERY = 0xCEF3, + CMSG_PETITION_SHOW_SIGNATURES = 0x1E66, + CMSG_PETITION_SHOWLIST = 0x00, + CMSG_PETITION_SIGN = 0x4A5E, CMSG_PING = 0x1008, + CMSG_PLAY_DANCE = 0x5857, CMSG_PLAYED_TIME = 0x5A56, CMSG_PLAYER_DIFFICULTY_CHANGE = 0x00, CMSG_PLAYER_LOGIN = 0x0898, CMSG_PLAYER_LOGOUT = 0x1CEE, CMSG_PLAYER_VEHICLE_ENTER = 0x00, - CMSG_PLAY_DANCE = 0x5857, CMSG_PUSHQUESTTOPARTY = 0xA47, CMSG_QUERY_GUILD_MAX_XP = 0x00, CMSG_QUERY_GUILD_REWARDS = 0x00, CMSG_QUERY_GUILD_XP = 0x00, CMSG_QUERY_QUESTS_COMPLETED = 0x98DF, CMSG_QUERY_TIME = 0x18FE, + CMSG_QUEST_CONFIRM_ACCEPT = 0x8CD3, + CMSG_QUEST_POI_QUERY = 0x12A5, + CMSG_QUEST_QUERY = 0xCE7F, CMSG_QUESTGIVER_ACCEPT_QUEST = 0x0C63, CMSG_QUESTGIVER_CANCEL = 0xC86A, CMSG_QUESTGIVER_CHOOSE_REWARD = 0x18F3, @@ -349,12 +363,9 @@ enum Opcodes CMSG_QUESTGIVER_STATUS_QUERY = 0x88C6, CMSG_QUESTLOG_REMOVE_QUEST = 0x8EFF, CMSG_QUESTLOG_SWAP_QUEST = 0x00, - CMSG_QUEST_CONFIRM_ACCEPT = 0x8CD3, - CMSG_QUEST_POI_QUERY = 0x12A5, - CMSG_QUEST_QUERY = 0xCE7F, CMSG_RANDOMIZE_CHAR_NAME = 0x8A99, - CMSG_READY_FOR_ACCOUNT_DATA_TIMES = 0xCCDB, CMSG_READ_ITEM = 0x184F, + CMSG_READY_FOR_ACCOUNT_DATA_TIMES = 0xCCDB, CMSG_REALM_SPLIT = 0xDC66, CMSG_RECLAIM_CORPSE = 0x88DB, CMSG_REDIRECTION_AUTH_PROOF = 0x1039, @@ -383,10 +394,8 @@ enum Opcodes CMSG_SELF_RES = 0xCCFE, CMSG_SELL_ITEM = 0x5EE3, CMSG_SERVERTIME = 0x00, - CMSG_SETDEATHBINDPOINT = 0x00, - CMSG_SETSHEATHED = 0xCA5F, - CMSG_SET_ACTIONBAR_TOGGLES = 0x584F, CMSG_SET_ACTION_BUTTON = 0xDAC3, + CMSG_SET_ACTIONBAR_TOGGLES = 0x584F, CMSG_SET_ACTIVE_MOVER = 0x00, CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x00, CMSG_SET_ALLOW_LOW_LEVEL_RAID1 = 0xC863, @@ -405,6 +414,8 @@ enum Opcodes CMSG_SET_TITLE = 0xCE63, CMSG_SET_TRADE_GOLD = 0x00, CMSG_SET_TRADE_ITEM = 0x00, + CMSG_SETDEATHBINDPOINT = 0x00, + CMSG_SETSHEATHED = 0xCA5F, CMSG_SHOWING_CLOAK = 0x8AE3, CMSG_SHOWING_HELM = 0xCEFA, CMSG_SOCKET_GEMS = 0x00, @@ -448,6 +459,7 @@ enum Opcodes CMSG_WARDEN_DATA = 0x5847, CMSG_WHO = 0x9AD7, CMSG_WHOIS = 0xCCE6, + CMSG_WORLD_PORT_RESPONSE = 0x0A9A, CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x58F6, CMSG_WORLD_TELEPORT = 0x00, CMSG_WRAP_ITEM = 0x00, @@ -469,33 +481,18 @@ enum Opcodes MSG_MINIMAP_PING = 0x00, MSG_MOVE_FALL_LAND = 0x00A5, MSG_MOVE_HEARTBEAT = 0xB024, - MSG_MOVE_HOVER = 0x00, MSG_MOVE_JUMP = 0x9225, - MSG_MOVE_KNOCK_BACK = 0x60FE, - MSG_MOVE_ROOT = 0xB0DE, MSG_MOVE_SET_ALL_SPEED_CHEAT = 0x00, MSG_MOVE_SET_FACING = 0x02A4, - MSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x00, MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT = 0x00, - MSG_MOVE_SET_FLIGHT_SPEED = 0x00, MSG_MOVE_SET_FLIGHT_SPEED_CHEAT = 0x00, MSG_MOVE_SET_PITCH = 0xA7A5, - MSG_MOVE_SET_PITCH_RATE = 0x00, MSG_MOVE_SET_RAW_POSITION_ACK = 0x00, - MSG_MOVE_SET_RUN_BACK_SPEED = 0x00, MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT = 0x00, - MSG_MOVE_SET_RUN_MODE = 0x21A4, - SMSG_FORCE_RUN_SPEED_CHANGE = 0xE24E, // for self - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0xB2CE, // for others MSG_MOVE_SET_RUN_SPEED_CHEAT = 0x00, - MSG_MOVE_SET_SWIM_BACK_SPEED = 0x00, MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT = 0x00, - MSG_MOVE_SET_SWIM_SPEED = 0x00, MSG_MOVE_SET_SWIM_SPEED_CHEAT = 0x00, - MSG_MOVE_SET_TURN_RATE = 0x00, MSG_MOVE_SET_TURN_RATE_CHEAT = 0x00, - MSG_MOVE_SET_WALK_MODE = 0x24A4, - MSG_MOVE_SET_WALK_SPEED = 0x00, MSG_MOVE_SET_WALK_SPEED_CHEAT = 0x00, MSG_MOVE_START_ASCEND = 0x0624, MSG_MOVE_START_BACKWARD = 0x10A5, @@ -514,15 +511,9 @@ enum Opcodes MSG_MOVE_STOP_STRAFE = 0x0125, MSG_MOVE_STOP_SWIM = 0xB424, MSG_MOVE_STOP_TURN = 0x90A4, - MSG_MOVE_TELEPORT = 0xF25C, - MSG_MOVE_TELEPORT_ACK = 0x2425, - MSG_MOVE_TELEPORT_CHEAT = 0xA5A5, - MSG_MOVE_TIME_SKIPPED = 0x3424, MSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x00, MSG_MOVE_TOGGLE_FALL_LOGGING = 0x00, MSG_MOVE_TOGGLE_LOGGING = 0x00, - MSG_MOVE_UNROOT = 0x00, - MSG_MOVE_WORLDPORT_ACK = 0x00, MSG_NOTIFY_PARTY_SQUELCH = 0x00, MSG_PARTY_ASSIGNMENT = 0x00, MSG_PETITION_DECLINE = 0x98E7, @@ -547,8 +538,8 @@ enum Opcodes SMSG_ACHIEVEMENT_EARNED = 0x484E, SMSG_ACTION_BUTTONS = 0x8A6B, SMSG_ACTIVATETAXIREPLY = 0x8E4F, - SMSG_ADDON_INFO = 0x9863, SMSG_ADD_RUNE_POWER = 0x00, + SMSG_ADDON_INFO = 0x9863, SMSG_AI_REACTION = 0xCEC2, SMSG_ALL_ACHIEVEMENT_DATA = 0x00, SMSG_AREA_SPIRIT_HEALER_TIME = 0x00, @@ -577,16 +568,16 @@ enum Opcodes SMSG_AUCTION_OWNER_LIST_RESULT = 0x4EDA, SMSG_AUCTION_OWNER_NOTIFICATION = 0xCA6A, SMSG_AUCTION_REMOVED_NOTIFICATION = 0x4CFB, - SMSG_AURACASTLOG = 0x00, SMSG_AURA_UPDATE = 0x4C66, SMSG_AURA_UPDATE_ALL = 0x18EE, + SMSG_AURACASTLOG = 0x00, SMSG_AUTH_CHALLENGE = 0x1181, SMSG_AUTH_RESPONSE = 0x8867, SMSG_AVAILABLE_VOICE_CHANNEL = 0x9C7B, SMSG_BARBER_SHOP_RESULT = 0x9847, SMSG_BATTLEFIELD_LIST = 0xB64E, - SMSG_BATTLEFIELD_MGR_EJECTED = 0x32EC, SMSG_BATTLEFIELD_MGR_EJECT_PENDING = 0x724C, + SMSG_BATTLEFIELD_MGR_EJECTED = 0x32EC, SMSG_BATTLEFIELD_MGR_ENTERED = 0x66DC, SMSG_BATTLEFIELD_MGR_ENTRY_INVITE = 0x70DE, SMSG_BATTLEFIELD_MGR_QUEUE_INVITE = 0x644E, @@ -618,13 +609,13 @@ enum Opcodes SMSG_CHANNEL_LIST = 0x9C47, SMSG_CHANNEL_MEMBER_COUNT = 0x5EEA, SMSG_CHANNEL_NOTIFY = 0x9C7F, - SMSG_CHARACTER_LOGIN_FAILED = 0x4AE6, SMSG_CHAR_CREATE = 0x4C5B, SMSG_CHAR_CUSTOMIZE = 0x0AE3, SMSG_CHAR_DELETE = 0x48CE, SMSG_CHAR_ENUM = 0xA05C, SMSG_CHAR_FACTION_CHANGE = 0x885A, SMSG_CHAR_RENAME = 0x5EF6, + SMSG_CHARACTER_LOGIN_FAILED = 0x4AE6, SMSG_CHAT_PLAYER_AMBIGUOUS = 0xDE7F, SMSG_CHAT_PLAYER_NOT_FOUND = 0x4E6F, SMSG_CHAT_RESTRICTED = 0x4863, @@ -632,8 +623,8 @@ enum Opcodes SMSG_CHECK_FOR_BOTS = 0x00, SMSG_CLEAR_COOLDOWN = 0x00, SMSG_CLEAR_TARGET = 0x00, - SMSG_CLIENTCACHE_VERSION = 0x88F2, SMSG_CLIENT_CONTROL_UPDATE = 0x08CB, + SMSG_CLIENTCACHE_VERSION = 0x88F2, SMSG_COMBAT_LOG_MULTIPLE = 0x5C56, SMSG_COMMENTATOR_MAP_INFO = 0x00, SMSG_COMMENTATOR_PLAYER_INFO = 0x00, @@ -686,20 +677,10 @@ enum Opcodes SMSG_FISH_ESCAPED = 0x9C66, SMSG_FISH_NOT_HOOKED = 0x18C3, SMSG_FLIGHT_SPLINE_SYNC = 0x1C63, - SMSG_FORCEACTIONSHOW = 0x00, - SMSG_FORCED_DEATH_UPDATE = 0x00, SMSG_FORCE_DISPLAY_UPDATE = 0x00, - SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE = 0x00, - SMSG_FORCE_FLIGHT_SPEED_CHANGE = 0x00, - SMSG_FORCE_MOVE_ROOT = 0x00, - SMSG_FORCE_MOVE_UNROOT = 0x00, - SMSG_FORCE_PITCH_RATE_CHANGE = 0x00, - SMSG_FORCE_RUN_BACK_SPEED_CHANGE = 0x00, SMSG_FORCE_SEND_QUEUED_PACKETS = 0x1380, - SMSG_FORCE_SWIM_BACK_SPEED_CHANGE = 0x00, - SMSG_FORCE_SWIM_SPEED_CHANGE = 0x00, - SMSG_FORCE_TURN_RATE_CHANGE = 0x00, - SMSG_FORCE_WALK_SPEED_CHANGE = 0x00, + SMSG_FORCEACTIONSHOW = 0x00, + SMSG_FORCED_DEATH_UPDATE = 0x00, SMSG_FRIEND_STATUS = 0xD852, SMSG_GAMEOBJECT_CUSTOM_ANIM = 0xCCE, SMSG_GAMEOBJECT_DESPAWN_ANIM = 0x0A5E, @@ -709,6 +690,7 @@ enum Opcodes SMSG_GAMESPEED_SET = 0x5ACA, SMSG_GAMETIME_SET = 0x9C4A, SMSG_GAMETIME_UPDATE = 0x18E3, + SMSG_GM_MESSAGECHAT = 0x8E5E, SMSG_GMRESPONSE_RECEIVED = 0x00, SMSG_GMRESPONSE_STATUS_UPDATE = 0x00, SMSG_GMTICKET_CREATE = 0x00, @@ -716,7 +698,6 @@ enum Opcodes SMSG_GMTICKET_GETTICKET = 0x00, SMSG_GMTICKET_SYSTEMSTATUS = 0x9C7E, SMSG_GMTICKET_UPDATETEXT = 0x00, - SMSG_GM_MESSAGECHAT = 0x8E5E, SMSG_GODMODE = 0xDEEE, SMSG_GOSSIP_COMPLETE = 0xDE7B, SMSG_GOSSIP_MESSAGE = 0xCCEB, @@ -729,7 +710,6 @@ enum Opcodes SMSG_GROUP_LIST = 0x5C7E, SMSG_GROUP_SET_LEADER = 0xCCF2, SMSG_GROUP_UNINVITE = 0x00, - SMSG_GUILDFINDER_SEARCH_RESULT = 0xE0CE, SMSG_GUILD_BANK_LIST = 0x5EFB, SMSG_GUILD_COMMAND_RESULT = 0xDAD7, SMSG_GUILD_DECLINE = 0x1E5B, @@ -747,11 +727,12 @@ enum Opcodes SMSG_GUILD_TRADESKILL_UPDATE = 0x00, SMSG_GUILD_UPDATE_ROSTER = 0x00, SMSG_GUILD_XP_UPDATE = 0x00, + SMSG_GUILDFINDER_SEARCH_RESULT = 0xE0CE, SMSG_HIGHEST_THREAT_UPDATE = 0x5E7B, - SMSG_INITIALIZE_FACTIONS = 0xCC6F, - SMSG_INITIAL_SPELLS = 0x88FE, SMSG_INIT_CURRENCY = 0x227E, SMSG_INIT_WORLD_STATES = 0x9EDA, + SMSG_INITIAL_SPELLS = 0x88FE, + SMSG_INITIALIZE_FACTIONS = 0xCC6F, SMSG_INSPECT = 0x0E46, SMSG_INSPECT_HONOR_STATS = 0x00, SMSG_INSPECT_TALENT = 0x48EF, @@ -760,9 +741,9 @@ enum Opcodes SMSG_INSTANCE_RESET = 0xDAC2, SMSG_INSTANCE_RESET_FAILED = 0xCEFE, SMSG_INSTANCE_SAVE_CREATED = 0xCE56, + SMSG_INVALID_PROMOTION_CODE = 0xD8FE, SMSG_INVALIDATE_DANCE = 0x1EEF, SMSG_INVALIDATE_PLAYER = 0x5C5F, - SMSG_INVALID_PROMOTION_CODE = 0xD8FE, SMSG_INVENTORY_CHANGE_FAILURE = 0xC8EE, SMSG_ITEM_COOLDOWN = 0x00, SMSG_ITEM_ENCHANT_TIME_UPDATE = 0xDCE6, @@ -794,12 +775,12 @@ enum Opcodes SMSG_LFG_UPDATE_PLAYER = 0x00, SMSG_LFG_UPDATE_SEARCH = 0x1E53, SMSG_LIST_INVENTORY = 0x264C, + SMSG_LOG_XPGAIN = 0x4E7E, SMSG_LOGIN_SETTIMESPEED = 0x5ECA, SMSG_LOGIN_VERIFY_WORLD = 0xC86E, SMSG_LOGOUT_CANCEL_ACK = 0xD8EF, SMSG_LOGOUT_COMPLETE = 0xCC6B, SMSG_LOGOUT_RESPONSE = 0x886A, - SMSG_LOG_XPGAIN = 0x4E7E, SMSG_LOOT_ALL_PASSED = 0x1C7A, SMSG_LOOT_CLEAR_MONEY = 0x586E, SMSG_LOOT_ITEM_NOTIFY = 0xD8E3, @@ -826,18 +807,70 @@ enum Opcodes SMSG_MOTD = 0xCA4B, SMSG_MOUNTRESULT = 0x00, SMSG_MOUNTSPECIAL_ANIM = 0x9E77, - SMSG_MOVE_FEATHER_FALL = 0x00, - SMSG_MOVE_KNOCK_BACK = 0x60FE, - SMSG_MOVE_LAND_WALK = 0x00, - SMSG_MOVE_NORMAL_FALL = 0x00, - SMSG_MOVE_SET_CAN_FLY = 0x00, - SMSG_MOVE_SET_COLLISION_HGT = 0x00, - SMSG_MOVE_SET_HOVER = 0x00, + SMSG_MOVE_DISABLE_COLLISION = 0xF2DE, //forced, for self + SMSG_MOVE_DISABLE_GRAVITY = 0x60DC, //forced, for self + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY= 0x365E, //forced, for self + SMSG_MOVE_ENABLE_COLLISION = 0x64DC, //forced, for self + SMSG_MOVE_ENABLE_GRAVITY = 0x645E, //forced, for self + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x60CC, //forced, for self + SMSG_MOVE_KNOCK_BACK = 0x60FE, //forced, for self + SMSG_MOVE_ROOT = 0xB0DE, //forced, for self + SMSG_MOVE_SET_ACTIVE_MOVER = 0xA0DE, + SMSG_MOVE_SET_CAN_FLY = 0xB66E, //forced, for self + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x20DC, //forced, for self + SMSG_MOVE_SET_COMPOUND_STATE = 0xF25E, + SMSG_MOVE_SET_FEATHER_FALL = 0xF2CC, //forced, for self + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x627C, //forced, for self + SMSG_MOVE_SET_FLIGHT_SPEED = 0x365C, //forced, for self + SMSG_MOVE_SET_HOVERING = 0x74FC, //forced, for self + SMSG_MOVE_SET_LAND_WALK = 0x76CE, //forced, for self + SMSG_MOVE_SET_NORMAL_FALL = 0xF4DC, //forced, for self + SMSG_MOVE_SET_PITCH_RATE = 0x24FE, //forced, for self + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x747C, //forced, for self + SMSG_MOVE_SET_RUN_SPEED = 0xE24E, // for self + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0xE6CC, //forced, for self + SMSG_MOVE_SET_SWIM_SPEED = 0x30FC, //forced, for self + SMSG_MOVE_SET_TURN_RATE = 0xA04E, //forced, for self + SMSG_MOVE_SET_VEHICLE_REC_ID = 0xA44C, //forced, for self SMSG_MOVE_SET_WALK_IN_AIR = 0x00, - SMSG_MOVE_UNSET_CAN_FLY = 0x00, - SMSG_MOVE_UNSET_HOVER = 0x00, + SMSG_MOVE_SET_WALK_SPEED = 0x246E, //forced, for self + SMSG_MOVE_SET_WATER_WALK = 0x625E, //forced, for self + SMSG_MOVE_SKIP_TIME = 0x32DE, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0xE04E, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0xF04C, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x227C, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0xA4DE, + SMSG_MOVE_SPLINE_ROOT = 0x265C, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0xB6CC, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x70EC, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x644C, + SMSG_MOVE_SPLINE_SET_FLYING = 0x70DC, + SMSG_MOVE_SPLINE_SET_HOVER = 0x667E, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0xA65E, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0xE2FC, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x60CE, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x624E, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x26CC, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0xB2CE, // for others + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x326C, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x327E, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x745C, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0xF65C, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x0000, // exists, but not yet known + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0xA24E, + SMSG_MOVE_SPLINE_START_SWIM = 0xF0FC, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x66EE, + SMSG_MOVE_SPLINE_UNROOT = 0x64EE, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0xB06E, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0xA07E, + SMSG_MOVE_TELEPORT = 0xF25C, + SMSG_MOVE_UNROOT = 0xB0CE, //forced, for self + SMSG_MOVE_UNSET_CAN_FLY = 0xA24C, //forced, for self + SMSG_MOVE_UNSET_HOVERING = 0x325E, //forced, for self SMSG_MOVE_UNSET_WALK_IN_AIR = 0x00, - SMSG_MOVE_WATER_WALK = 0x00, + SMSG_MOVE_UPDATE = 0xF66C, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x725C, + SMSG_MOVE_UPDATE_TELEPORT = 0xF6DC, SMSG_MULTIPLE_PACKETS = 0xDCEA, SMSG_NAME_QUERY_RESPONSE = 0x9CE6, SMSG_NEW_TAXI_PATH = 0xC8FF, @@ -852,17 +885,12 @@ enum Opcodes SMSG_OPEN_CONTAINER = 0x00, SMSG_OVERRIDE_LIGHT = 0xCC56, SMSG_PAGE_TEXT_QUERY_RESPONSE = 0x18D2, - SMSG_PARTYKILLLOG = 0xCCC2, SMSG_PARTY_COMMAND_RESULT = 0xCCD6, SMSG_PARTY_MEMBER_STATS = 0xDC5A, SMSG_PARTY_MEMBER_STATS_FULL = 0x0EDF, + SMSG_PARTYKILLLOG = 0xCCC2, SMSG_PAUSE_MIRROR_TIMER = 0x00, SMSG_PERIODICAURALOG = 0x00, - SMSG_PETGODMODE = 0x00, - SMSG_PETITION_QUERY_RESPONSE = 0xCAEE, - SMSG_PETITION_SHOWLIST = 0x8ED7, - SMSG_PETITION_SHOW_SIGNATURES = 0x4E4A, - SMSG_PETITION_SIGN_RESULTS = 0x5EE6, SMSG_PET_ACTION_FEEDBACK = 0x4E5A, SMSG_PET_ACTION_SOUND = 0x0CC7, SMSG_PET_CAST_FAILED = 0x00, @@ -876,13 +904,11 @@ enum Opcodes SMSG_PET_SPELLS = 0x5A43, SMSG_PET_TAME_FAILURE = 0x00, SMSG_PET_UPDATE_COMBO_POINTS = 0x1A47, - SMSG_PLAYED_TIME = 0x187F, - SMSG_PLAYERBINDERROR = 0x5A4F, - SMSG_PLAYERBOUND = 0xCC46, - SMSG_PLAYER_DIFFICULTY_CHANGE = 0xD846, - SMSG_PLAYER_MOVE = 0xF66C, - SMSG_PLAYER_SKINNED = 0xDA63, - SMSG_PLAYER_VEHICLE_DATA = 0x186E, + SMSG_PETGODMODE = 0x00, + SMSG_PETITION_QUERY_RESPONSE = 0xCAEE, + SMSG_PETITION_SHOW_SIGNATURES = 0x4E4A, + SMSG_PETITION_SHOWLIST = 0x8ED7, + SMSG_PETITION_SIGN_RESULTS = 0x5EE6, SMSG_PLAY_DANCE = 0x8CFE, SMSG_PLAY_MUSIC = 0x00, SMSG_PLAY_OBJECT_SOUND = 0xCC57, @@ -890,6 +916,13 @@ enum Opcodes SMSG_PLAY_SPELL_IMPACT = 0x00, SMSG_PLAY_SPELL_VISUAL = 0x00, SMSG_PLAY_TIME_WARNING = 0xD857, + SMSG_PLAYED_TIME = 0x187F, + SMSG_PLAYER_DIFFICULTY_CHANGE = 0xD846, + SMSG_PLAYER_MOVE = 0xF66C, + SMSG_PLAYER_SKINNED = 0xDA63, + SMSG_PLAYER_VEHICLE_DATA = 0x186E, + SMSG_PLAYERBINDERROR = 0x5A4F, + SMSG_PLAYERBOUND = 0xCC46, SMSG_PONG = 0x0380, SMSG_POWER_UPDATE = 0x487E, SMSG_PRE_RESURRECT = 0x1CFB, @@ -899,6 +932,10 @@ enum Opcodes SMSG_PVP_CREDIT = 0x9EF2, SMSG_QUERY_QUESTS_COMPLETED_RESPONSE = 0x8E7A, SMSG_QUERY_TIME_RESPONSE = 0xD85A, + SMSG_QUEST_CONFIRM_ACCEPT = 0x184B, + SMSG_QUEST_FORCE_REMOVED = 0x00, + SMSG_QUEST_POI_QUERY_RESPONSE = 0x8CC3, + SMSG_QUEST_QUERY_RESPONSE = 0x9E56, SMSG_QUESTGIVER_OFFER_REWARD = 0x00, SMSG_QUESTGIVER_QUEST_COMPLETE = 0x24EE, SMSG_QUESTGIVER_QUEST_DETAILS = 0xCE5F, @@ -915,18 +952,14 @@ enum Opcodes SMSG_QUESTUPDATE_COMPLETE = 0x9CD6, SMSG_QUESTUPDATE_FAILED = 0x9EF6, SMSG_QUESTUPDATE_FAILEDTIMER = 0x00, - SMSG_QUEST_CONFIRM_ACCEPT = 0x184B, - SMSG_QUEST_FORCE_REMOVED = 0x00, - SMSG_QUEST_POI_QUERY_RESPONSE = 0x8CC3, - SMSG_QUEST_QUERY_RESPONSE = 0x9E56, SMSG_RAID_GROUP_ONLY = 0xDCDB, SMSG_RAID_INSTANCE_INFO = 0x4ACA, SMSG_RAID_INSTANCE_MESSAGE = 0xD862, SMSG_RANDOMIZE_CHAR_NAME = 0xF0DC, SMSG_READ_ITEM_FAILED = 0x0C5B, SMSG_READ_ITEM_OK = 0x9ECE, - SMSG_REALM_SPLIT = 0x1AF2, SMSG_REAL_GROUP_UPDATE = 0x4C56, + SMSG_REALM_SPLIT = 0x1AF2, SMSG_RECEIVED_MAIL = 0xDEE2, SMSG_REDIRECT_CLIENT = 0x0180, SMSG_REFER_A_FRIEND_FAILURE = 0x4867, @@ -942,9 +975,9 @@ enum Opcodes SMSG_SELL_ITEM = 0x9CD3, SMSG_SEND_MAIL_RESULT = 0x8CC2, SMSG_SEND_UNLEARN_SPELLS = 0xCED2, - SMSG_SERVERTIME = 0x1CD7, SMSG_SERVER_FIRST_ACHIEVEMENT = 0x0CDF, SMSG_SERVER_MESSAGE = 0xC873, + SMSG_SERVERTIME = 0x1CD7, SMSG_SET_FACTION_ATWAR = 0x1E47, SMSG_SET_FACTION_STANDING = 0x1AE3, SMSG_SET_FACTION_VISIBLE = 0x4CEB, @@ -952,11 +985,19 @@ enum Opcodes SMSG_SET_FORCED_REACTIONS = 0xD8C3, SMSG_SET_PCT_SPELL_MODIFIER = 0x485B, SMSG_SET_PHASE_SHIFT = 0x204C, + SMSG_SET_PLAY_HOVER_ANIM = 0xA27E, //forced, for self SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x0E67, SMSG_SET_PROFICIENCY = 0x9C5F, SMSG_SET_PROJECTILE_POSITION = 0xC8F7, - SMSG_SHOWTAXINODES = 0x8CFB, SMSG_SHOW_BANK = 0xCCA, + SMSG_SHOWTAXINODES = 0x8CFB, + SMSG_SPELL_COOLDOWN = 0x88D6, + SMSG_SPELL_DELAYED = 0x1AD3, + SMSG_SPELL_FAILED_OTHER = 0xCE4A, + SMSG_SPELL_FAILURE = 0x9A66, + SMSG_SPELL_GO = 0x0A53, + SMSG_SPELL_START = 0xCE43, + SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x00, SMSG_SPELLBREAKLOG = 0x00, SMSG_SPELLDAMAGESHIELD = 0x8AFE, SMSG_SPELLDISPELLOG = 0x00, @@ -968,18 +1009,7 @@ enum Opcodes SMSG_SPELLNONMELEEDAMAGELOG = 0x5CCF, SMSG_SPELLORDAMAGE_IMMUNE = 0x48FA, SMSG_SPELLSTEALLOG = 0x00, - SMSG_SPELL_COOLDOWN = 0x88D6, - SMSG_SPELL_DELAYED = 0x1AD3, - SMSG_SPELL_FAILED_OTHER = 0xCE4A, - SMSG_SPELL_FAILURE = 0x9A66, - SMSG_SPELL_GO = 0x0A53, - SMSG_SPELL_START = 0xCE43, - SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x00, SMSG_SPIRIT_HEALER_CONFIRM = 0xA4A, - SMSG_SPLINE_MOVE_LAND_WALK = 0x00, - SMSG_SPLINE_MOVE_ROOT = 0x00, - SMSG_SPLINE_MOVE_UNROOT = 0x00, - SMSG_SPLINE_MOVE_WATER_WALK = 0x00, SMSG_STABLE_RESULT = 0xA5B, SMSG_STANDSTATE_UPDATE = 0x4E52, SMSG_START_MIRROR_TIMER = 0x00, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e3e69eff720..124e1628903 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2852,9 +2852,9 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode // allow flying WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); + data.Initialize(SMSG_MOVE_SPLINE_SET_FLYING, 12); else - data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); + data.Initialize(SMSG_MOVE_SPLINE_UNSET_FLYING, 12); data.append(target->GetPackGUID()); data << uint32(0); // unk player->SendDirectMessage(&data); @@ -2877,9 +2877,9 @@ void AuraEffect::HandleAuraWaterWalk(AuraApplication const* aurApp, uint8 mode, WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_WATER_WALK, 8+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_WATER_WALK, 8+4); else - data.Initialize(SMSG_MOVE_LAND_WALK, 8+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_LAND_WALK, 8+4); data.append(target->GetPackGUID()); data << uint32(0); target->SendMessageToSet(&data, true); @@ -2901,9 +2901,9 @@ void AuraEffect::HandleAuraFeatherFall(AuraApplication const* aurApp, uint8 mode WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_FEATHER_FALL, 8+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_FEATHER_FALL, 8+4); else - data.Initialize(SMSG_MOVE_NORMAL_FALL, 8+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_NORMAL_FALL, 8+4); data.append(target->GetPackGUID()); data << uint32(0); target->SendMessageToSet(&data, true); @@ -2929,9 +2929,9 @@ void AuraEffect::HandleAuraHover(AuraApplication const* aurApp, uint8 mode, bool WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_SET_HOVER, 8+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_HOVER, 8+4); else - data.Initialize(SMSG_MOVE_UNSET_HOVER, 8+4); + data.Initialize(SMSG_MOVE_SPLINE_UNSET_HOVER, 8+4); data.append(target->GetPackGUID()); data << uint32(0); target->SendMessageToSet(&data, true); @@ -3250,9 +3250,9 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, { WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); + data.Initialize(SMSG_MOVE_SPLINE_SET_FLYING, 12); else - data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); + data.Initialize(SMSG_MOVE_SPLINE_UNSET_FLYING, 12); data.append(player->GetPackGUID()); data << uint32(0); // unknown player->SendDirectMessage(&data); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 99283623207..9fc220e600a 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -959,14 +959,14 @@ public: target->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); target->Mount(mId); - WorldPacket data(SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4)); + WorldPacket data(SMSG_MOVE_SET_RUN_SPEED, (8+4+1+4)); data.append(target->GetPackGUID()); data << (uint32)0; data << (uint8)0; //new 2.1.0 data << float(speed); target->SendMessageToSet(&data, true); - data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4)); + data.Initialize(SMSG_MOVE_SET_SWIM_SPEED, (8+4+4)); data.append(target->GetPackGUID()); data << (uint32)0; data << float(speed); -- cgit v1.2.3 From f006a2da68cf2df130a02e41eda4ab0e06d92170 Mon Sep 17 00:00:00 2001 From: Rat Date: Sat, 21 Jan 2012 22:25:01 +0100 Subject: Core/Movement: updated UN/SET_FLY packets, .gm fly on/off now works, fly mounts are still broken, probably aura handling needs to be updated too --- src/server/game/Entities/Player/Player.cpp | 48 ++++++++++++++++++++++ src/server/game/Entities/Player/Player.h | 1 + src/server/game/Entities/Unit/Unit.cpp | 8 ++-- .../Server/Protocol/Handlers/MovementHandler.cpp | 5 +-- src/server/game/Server/Protocol/Opcodes.cpp | 3 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 20 +-------- src/server/scripts/Commands/cs_gm.cpp | 7 +--- 7 files changed, 60 insertions(+), 32 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4d9dd6aa669..cdb9ddbcd9b 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2103,6 +2103,54 @@ void Player::SendTeleportPacket(Position &oldPos) SendDirectMessage(&data); } +void Player::SendSetFlyPacket(bool apply) +{ + WorldPacket data(apply ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY, 12); + uint64 guid = GetGUID(); + uint8* bytes = (uint8*)&guid; + if (apply) + { + data.WriteBit(bytes[4]); + data.WriteBit(bytes[3]); + data.WriteBit(bytes[6]); + data.WriteBit(bytes[0]); + data.WriteBit(bytes[1]); + data.WriteBit(bytes[2]); + data.WriteBit(bytes[7]); + data.WriteBit(bytes[5]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[4]); + data << uint32(sWorld->GetGameTime()); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[2]); + } + else + { + data.WriteBit(bytes[1]); + data.WriteBit(bytes[6]); + data.WriteBit(bytes[0]); + data.WriteBit(bytes[2]); + data.WriteBit(bytes[4]); + data.WriteBit(bytes[5]); + data.WriteBit(bytes[7]); + data.WriteBit(bytes[3]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[0]); + data << uint32(sWorld->GetGameTime()); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[4]); + } + SendDirectMessage(&data); +} + bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options) { if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 66e95f09003..a594f2c02ef 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1982,6 +1982,7 @@ class Player : public Unit, public GridObject void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr); void SendTeleportPacket(Position &oldPos); + void SendSetFlyPacket(bool apply); Corpse* GetCorpse() const; void SpawnCorpseBones(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index dcc18c0559f..cbfa73d5311 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11958,11 +11958,11 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) player->UnsummonPetTemporaryIfAny(); } - WorldPacket data(SMSG_MOVE_SET_COLLISION_HEIGHT, GetPackGUID().size() + 4 + 4); + /*WorldPacket data(SMSG_MOVE_SET_COLLISION_HEIGHT, GetPackGUID().size() + 4 + 4); data.append(GetPackGUID()); data << uint32(sWorld->GetGameTime()); // Packet counter data << player->GetCollisionHeight(true); - player->GetSession()->SendPacket(&data); + player->GetSession()->SendPacket(&data);*/ } RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT); @@ -11976,14 +11976,14 @@ void Unit::Dismount() SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT); - if (Player* thisPlayer = ToPlayer()) + /*if (Player* thisPlayer = ToPlayer()) { WorldPacket data(SMSG_MOVE_SET_COLLISION_HEIGHT, GetPackGUID().size() + 4 + 4); data.append(GetPackGUID()); data << uint32(sWorld->GetGameTime()); // Packet counter data << thisPlayer->GetCollisionHeight(false); thisPlayer->GetSession()->SendPacket(&data); - } + }*/ WorldPacket data(SMSG_DISMOUNT, 8); data.appendPackGUID(GetGUID()); diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index b23a73dc9bb..71dfc670145 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -484,10 +484,7 @@ void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recv_data) GetPlayer()->SetMover(mover); if (mover != GetPlayer() && mover->canFly()) { - WorldPacket data(SMSG_MOVE_SPLINE_SET_FLYING, 12); - data.append(mover->GetPackGUID()); - data << uint32(0); - SendPacket(&data); + GetPlayer()->SendSetFlyPacket(true); } } else diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 41ddddaaf1d..1225f7b6c06 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -896,7 +896,8 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLYING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_FLYING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 124e1628903..c54f644a43c 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2850,14 +2850,7 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode if (Player* player = target->m_movedPlayer) { // allow flying - WorldPacket data; - if (apply) - data.Initialize(SMSG_MOVE_SPLINE_SET_FLYING, 12); - else - data.Initialize(SMSG_MOVE_SPLINE_UNSET_FLYING, 12); - data.append(target->GetPackGUID()); - data << uint32(0); // unk - player->SendDirectMessage(&data); + player->SendSetFlyPacket(apply); } } @@ -3247,16 +3240,7 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, if (mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK && (apply || (!target->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !target->HasAuraType(SPELL_AURA_FLY)))) { if (Player* player = target->m_movedPlayer) - { - WorldPacket data; - if (apply) - data.Initialize(SMSG_MOVE_SPLINE_SET_FLYING, 12); - else - data.Initialize(SMSG_MOVE_SPLINE_UNSET_FLYING, 12); - data.append(player->GetPackGUID()); - data << uint32(0); // unknown - player->SendDirectMessage(&data); - } + player->SendSetFlyPacket(apply); } if (mode & AURA_EFFECT_HANDLE_REAL) diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 926e2fe2bf2..ac57d9c9425 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -97,17 +97,14 @@ public: WorldPacket data; if (strncmp(args, "on", 3) == 0) - data.SetOpcode(SMSG_MOVE_SET_CAN_FLY); + target->SendSetFlyPacket(true); else if (strncmp(args, "off", 4) == 0) - data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); + target->SendSetFlyPacket(false); else { handler->SendSysMessage(LANG_USE_BOL); return false; } - data.append(target->GetPackGUID()); - data << uint32(0); // unknown - target->SendMessageToSet(&data, true); handler->PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, handler->GetNameLink(target).c_str(), args); return true; } -- cgit v1.2.3 From af12ae1fa3a0fcef8bdf6bc142294e79dcc7de71 Mon Sep 17 00:00:00 2001 From: Drake Fish Date: Mon, 23 Jan 2012 19:06:38 -0500 Subject: Core/Movement: Added a cs for SMSG_MOVE_SPLINE_ENABLE/DISABLE_COLLISION. --- src/server/scripts/Commands/cs_modify.cpp | 83 +++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 9fc220e600a..00832aa4d59 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -60,6 +60,7 @@ public: { "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL }, { "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL }, { "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL }, + { "collision", SEC_GAMEMASTER, false, &HandleModifyCollisionCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = @@ -1374,6 +1375,88 @@ public: return true; } + + static bool HandleModifyCollisionCommand(ChatHandler* handler, const char* args) + { + if (!*args) + return false; + + Player* target = handler->getSelectedPlayer(); + + if (!target) + { + handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + std::string param = (char*)args; + + if (param == "on") + { + // enable collision + WorldPacket data; + uint64 guid = target->GetGUID(); + uint8* bytes = (uint8*)&guid; + + data.Initialize(SMSG_MOVE_SPLINE_ENABLE_COLLISION, 1 + 8); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[3]); + + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[0]); + + target->SendMessageToSet(&data, true); + handler->SendSysMessage("Enabled Collision"); + return true; + } + + if (param == "off") + { + // disable collision + WorldPacket data; + uint64 guid = target->GetGUID(); + uint8* bytes = (uint8*)&guid; + + data.Initialize(SMSG_MOVE_SPLINE_DISABLE_COLLISION, 1 + 8); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[0]); + + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[2]); + + target->SendMessageToSet(&data, true); + handler->SendSysMessage("Disabled Collision"); + return true; + } + + return false; + } + }; void AddSC_modify_commandscript() -- cgit v1.2.3 From fdbb3e52bcbaa236a26bd2bf8293a5deccb34a01 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 30 Jan 2012 18:19:07 +0100 Subject: Core/Commands: Fixed crash in .modify reputation --- src/server/scripts/Commands/cs_modify.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 00832aa4d59..93aa188c071 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1234,7 +1234,7 @@ public: } target->GetReputationMgr().SetReputation(factionEntry, amount); - handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId, + handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name, factionId, handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); return true; } -- cgit v1.2.3 From 04f38855abeeb101de52b091c378991813e4d28d Mon Sep 17 00:00:00 2001 From: Shocker Date: Fri, 3 Feb 2012 19:12:41 +0200 Subject: Core/Misc: Rename UNIT_STAT_* enums to UNIT_STATE_* --- src/server/game/AI/CoreAI/CombatAI.cpp | 4 +- src/server/game/AI/CoreAI/PassiveAI.cpp | 8 +- src/server/game/AI/CoreAI/PetAI.cpp | 4 +- src/server/game/AI/CoreAI/UnitAI.cpp | 4 +- src/server/game/AI/CreatureAIImpl.h | 4 +- src/server/game/AI/EventAI/CreatureEventAI.cpp | 4 +- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 4 +- src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp | 2 +- .../game/AI/ScriptedAI/ScriptedFollowerAI.cpp | 14 +-- src/server/game/AI/SmartScripts/SmartScript.cpp | 2 +- src/server/game/Combat/ThreatManager.cpp | 2 +- src/server/game/DungeonFinding/LFGMgr.cpp | 2 +- src/server/game/Entities/Creature/Creature.cpp | 6 +- src/server/game/Entities/Creature/Creature.h | 2 +- src/server/game/Entities/Object/Object.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 8 +- src/server/game/Entities/Player/Player.h | 2 +- src/server/game/Entities/Unit/Unit.cpp | 110 ++++++++++----------- src/server/game/Entities/Unit/Unit.h | 88 ++++++++--------- src/server/game/Entities/Vehicle/Vehicle.cpp | 8 +- src/server/game/Grids/Notifiers/GridNotifiers.cpp | 2 +- src/server/game/Grids/Notifiers/GridNotifiers.h | 2 +- src/server/game/Handlers/AuctionHouseHandler.cpp | 14 +-- src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/Handlers/ChatHandler.cpp | 4 +- src/server/game/Handlers/GuildHandler.cpp | 2 +- src/server/game/Handlers/ItemHandler.cpp | 8 +- src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/game/Handlers/NPCHandler.cpp | 28 +++--- src/server/game/Handlers/PetHandler.cpp | 4 +- src/server/game/Handlers/PetitionsHandler.cpp | 2 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- src/server/game/Handlers/SkillHandler.cpp | 2 +- src/server/game/Handlers/TaxiHandler.cpp | 4 +- src/server/game/Handlers/TradeHandler.cpp | 4 +- src/server/game/Movement/MotionMaster.cpp | 6 +- .../ConfusedMovementGenerator.cpp | 14 +-- .../FleeingMovementGenerator.cpp | 20 ++-- .../MovementGenerators/HomeMovementGenerator.cpp | 8 +- .../MovementGenerators/IdleMovementGenerator.cpp | 14 +-- .../MovementGenerators/PointMovementGenerator.cpp | 14 +-- .../MovementGenerators/RandomMovementGenerator.cpp | 10 +- .../TargetedMovementGenerator.cpp | 16 +-- .../MovementGenerators/TargetedMovementGenerator.h | 8 +- .../WaypointMovementGenerator.cpp | 18 ++-- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 36 +++---- src/server/game/Spells/Auras/SpellAuras.cpp | 2 +- src/server/game/Spells/Spell.cpp | 16 +-- src/server/game/Spells/SpellEffects.cpp | 8 +- src/server/game/Spells/SpellInfo.cpp | 2 +- .../BlackrockSpire/boss_drakkisath.cpp | 2 +- .../EasternKingdoms/BlackrockSpire/boss_gyth.cpp | 2 +- .../BlackrockSpire/boss_halycon.cpp | 2 +- .../BlackrockSpire/boss_highlord_omokk.cpp | 2 +- .../BlackrockSpire/boss_mother_smolderweb.cpp | 2 +- .../BlackrockSpire/boss_overlord_wyrmthalak.cpp | 2 +- .../BlackrockSpire/boss_pyroguard_emberseer.cpp | 2 +- .../BlackrockSpire/boss_quartermaster_zigris.cpp | 2 +- .../BlackrockSpire/boss_rend_blackhand.cpp | 2 +- .../boss_shadow_hunter_voshgajin.cpp | 2 +- .../BlackrockSpire/boss_the_beast.cpp | 2 +- .../BlackrockSpire/boss_warmaster_voone.cpp | 2 +- .../BlackwingLair/boss_victor_nefarius.cpp | 2 +- .../Karazhan/boss_prince_malchezaar.cpp | 2 +- .../MoltenCore/boss_baron_geddon.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_garr.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_gehennas.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_golemagg.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_lucifron.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_magmadar.cpp | 2 +- .../MoltenCore/boss_majordomo_executus.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_shazzrah.cpp | 2 +- .../MoltenCore/boss_sulfuron_harbinger.cpp | 4 +- .../SunwellPlateau/boss_kiljaeden.cpp | 2 +- .../EasternKingdoms/SunwellPlateau/boss_muru.cpp | 12 +-- .../EasternKingdoms/ZulGurub/boss_venoxis.cpp | 2 +- .../Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp | 2 +- .../scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp | 2 +- .../Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp | 2 +- .../TempleOfAhnQiraj/boss_twinemperors.cpp | 10 +- .../AzjolNerub/Ahnkahet/boss_herald_volazj.cpp | 6 +- .../AzjolNerub/AzjolNerub/boss_anubarak.cpp | 2 +- .../RubySanctum/boss_baltharus_the_warborn.cpp | 4 +- .../RubySanctum/boss_general_zarithrian.cpp | 4 +- .../RubySanctum/boss_saviana_ragefire.cpp | 2 +- .../TrialOfTheChampion/boss_black_knight.cpp | 12 +-- .../FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp | 2 +- .../ForgeOfSouls/boss_devourer_of_souls.cpp | 2 +- .../FrozenHalls/ForgeOfSouls/forge_of_souls.cpp | 16 +-- .../FrozenHalls/HallsOfReflection/boss_falric.cpp | 2 +- .../FrozenHalls/HallsOfReflection/boss_marwyn.cpp | 2 +- .../HallsOfReflection/halls_of_reflection.cpp | 10 +- .../PitOfSaron/boss_forgemaster_garfrost.cpp | 2 +- .../FrozenHalls/PitOfSaron/boss_krickandick.cpp | 2 +- .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 4 +- .../Northrend/Gundrak/boss_drakkari_colossus.cpp | 6 +- .../scripts/Northrend/Gundrak/boss_gal_darah.cpp | 8 +- .../IcecrownCitadel/boss_blood_prince_council.cpp | 16 +-- .../IcecrownCitadel/boss_blood_queen_lana_thel.cpp | 2 +- .../IcecrownCitadel/boss_deathbringer_saurfang.cpp | 2 +- .../Northrend/IcecrownCitadel/boss_festergut.cpp | 4 +- .../IcecrownCitadel/boss_lady_deathwhisper.cpp | 8 +- .../IcecrownCitadel/boss_lord_marrowgar.cpp | 2 +- .../IcecrownCitadel/boss_professor_putricide.cpp | 4 +- .../Northrend/IcecrownCitadel/boss_rotface.cpp | 4 +- .../Northrend/IcecrownCitadel/boss_sindragosa.cpp | 8 +- .../IcecrownCitadel/boss_the_lich_king.cpp | 22 ++--- .../IcecrownCitadel/boss_valithria_dreamwalker.cpp | 12 +-- .../Northrend/IcecrownCitadel/icecrown_citadel.cpp | 14 +-- .../scripts/Northrend/Naxxramas/boss_faerlina.cpp | 2 +- .../Northrend/Naxxramas/boss_four_horsemen.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_gothik.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_kelthuzad.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_thaddius.cpp | 2 +- .../Northrend/Nexus/EyeOfEternity/boss_malygos.cpp | 2 +- .../scripts/Northrend/Nexus/Oculus/boss_drakos.cpp | 2 +- .../scripts/Northrend/Nexus/Oculus/boss_eregos.cpp | 2 +- .../scripts/Northrend/Nexus/Oculus/boss_varos.cpp | 2 +- .../Ulduar/Ulduar/boss_assembly_of_iron.cpp | 6 +- .../Northrend/Ulduar/Ulduar/boss_auriaya.cpp | 6 +- .../Ulduar/Ulduar/boss_flame_leviathan.cpp | 6 +- .../scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp | 8 +- .../Northrend/Ulduar/Ulduar/boss_general_vezax.cpp | 4 +- .../scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp | 20 ++-- .../scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp | 2 +- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 4 +- .../scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp | 2 +- .../UtgardeKeep/boss_ingvar_the_plunderer.cpp | 2 +- .../UtgardeKeep/UtgardeKeep/boss_keleseth.cpp | 2 +- .../UtgardeKeep/UtgardePinnacle/boss_svala.cpp | 4 +- .../Northrend/VaultOfArchavon/boss_archavon.cpp | 4 +- .../Northrend/VaultOfArchavon/boss_emalon.cpp | 4 +- .../Northrend/VaultOfArchavon/boss_koralon.cpp | 2 +- .../Northrend/VaultOfArchavon/boss_toravon.cpp | 4 +- src/server/scripts/Northrend/borean_tundra.cpp | 6 +- .../boss_shirrak_the_dead_watcher.cpp | 2 +- .../HellfireRamparts/boss_vazruden_the_herald.cpp | 4 +- .../MagtheridonsLair/boss_magtheridon.cpp | 8 +- .../instance_magtheridons_lair.cpp | 2 +- .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 2 +- .../scripts/Outland/boss_doomlord_kazzak.cpp | 2 +- src/server/scripts/Outland/boss_doomwalker.cpp | 2 +- src/server/scripts/Outland/nagrand.cpp | 2 +- src/server/scripts/Outland/netherstorm.cpp | 2 +- src/server/scripts/Outland/shadowmoon_valley.cpp | 4 +- src/server/scripts/Spells/spell_quest.cpp | 2 +- src/server/scripts/World/boss_emerald_dragons.cpp | 2 +- src/server/scripts/World/npcs_special.cpp | 10 +- 148 files changed, 483 insertions(+), 483 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp index a83fb6f2789..e178efc7eee 100755 --- a/src/server/game/AI/CoreAI/CombatAI.cpp +++ b/src/server/game/AI/CoreAI/CombatAI.cpp @@ -99,7 +99,7 @@ void CombatAI::UpdateAI(const uint32 diff) events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (uint32 spellId = events.ExecuteEvent()) @@ -158,7 +158,7 @@ void CasterAI::UpdateAI(const uint32 diff) events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (uint32 spellId = events.ExecuteEvent()) diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index 1244e032dbd..3738d5bab6c 100755 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -61,14 +61,14 @@ void PossessedAI::KilledUnit(Unit* victim) void CritterAI::DamageTaken(Unit* /*done_by*/, uint32&) { - if (!me->HasUnitState(UNIT_STAT_FLEEING)) - me->SetControlled(true, UNIT_STAT_FLEEING); + if (!me->HasUnitState(UNIT_STATE_FLEEING)) + me->SetControlled(true, UNIT_STATE_FLEEING); } void CritterAI::EnterEvadeMode() { - if (me->HasUnitState(UNIT_STAT_FLEEING)) - me->SetControlled(false, UNIT_STAT_FLEEING); + if (me->HasUnitState(UNIT_STATE_FLEEING)) + me->SetControlled(false, UNIT_STATE_FLEEING); CreatureAI::EnterEvadeMode(); } diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 015e20415b1..83a89a966c5 100755 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -116,14 +116,14 @@ void PetAI::UpdateAI(const uint32 diff) else HandleReturnMovement(); } - else if (owner && !me->HasUnitState(UNIT_STAT_FOLLOW)) // no charm info and no victim + else if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) // no charm info and no victim me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle()); if (!me->GetCharmInfo()) return; // Autocast (casted only in combat or persistent spells in any state) - if (!me->HasUnitState(UNIT_STAT_CASTING)) + if (!me->HasUnitState(UNIT_STATE_CASTING)) { typedef std::vector > TargetSpellList; TargetSpellList targetSpellStore; diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 38504b90b19..bf50909eeee 100755 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -40,7 +40,7 @@ void UnitAI::AttackStartCaster(Unit* victim, float dist) void UnitAI::DoMeleeAttackIfReady() { - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; Unit* victim = me->getVictim(); @@ -60,7 +60,7 @@ void UnitAI::DoMeleeAttackIfReady() bool UnitAI::DoSpellAttackIfReady(uint32 spell) { - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return true; if (me->isAttackReady()) diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h index 147e829b0df..f568da80b49 100755 --- a/src/server/game/AI/CreatureAIImpl.h +++ b/src/server/game/AI/CreatureAIImpl.h @@ -596,7 +596,7 @@ inline bool CreatureAI::_EnterEvadeMode() inline void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered) { - if (!victim || (me->HasUnitState(UNIT_STAT_CASTING) && !triggered)) + if (!victim || (me->HasUnitState(UNIT_STATE_CASTING) && !triggered)) return; me->CastSpell(victim, spellId, triggered); @@ -609,7 +609,7 @@ inline void UnitAI::DoCastVictim(uint32 spellId, bool triggered) inline void UnitAI::DoCastAOE(uint32 spellId, bool triggered) { - if (!triggered && me->HasUnitState(UNIT_STAT_CASTING)) + if (!triggered && me->HasUnitState(UNIT_STATE_CASTING)) return; me->CastSpell((Unit*)NULL, spellId, triggered); diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp index 9703757ca7a..ce46d51f579 100755 --- a/src/server/game/AI/EventAI/CreatureEventAI.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp @@ -577,7 +577,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 { if (action.combat_movement.melee) { - me->AddUnitState(UNIT_STAT_MELEE_ATTACKING); + me->AddUnitState(UNIT_STATE_MELEE_ATTACKING); me->SendMeleeAttackStart(victim); } if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE) @@ -591,7 +591,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 Unit* victim = me->getVictim(); if (action.combat_movement.melee && victim) { - me->ClearUnitState(UNIT_STAT_MELEE_ATTACKING); + me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); me->SendMeleeAttackStop(victim); } if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index ff432abcc82..78adc38a67d 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -595,7 +595,7 @@ void BossAI::UpdateAI(uint32 const diff) events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -654,7 +654,7 @@ void WorldBossAI::UpdateAI(uint32 const diff) events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index c5f04d4ff5f..048cc8b3d68 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -90,7 +90,7 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* who) void npc_escortAI::MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STAT_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) + if (!me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) { if (HasEscortState(STATE_ESCORT_ESCORTING) && AssistPlayerInCombat(who)) return; diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index 53747d0c799..d83ad9b756c 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -38,8 +38,8 @@ void FollowerAI::AttackStart(Unit* who) me->SetInCombatWith(who); who->SetInCombatWith(me); - if (me->HasUnitState(UNIT_STAT_FOLLOW)) - me->ClearUnitState(UNIT_STAT_FOLLOW); + if (me->HasUnitState(UNIT_STATE_FOLLOW)) + me->ClearUnitState(UNIT_STATE_FOLLOW); if (IsCombatMovementAllowed()) me->GetMotionMaster()->MoveChase(who); @@ -88,7 +88,7 @@ bool FollowerAI::AssistPlayerInCombat(Unit* who) void FollowerAI::MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STAT_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) + if (!me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) { if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(who)) return; @@ -340,9 +340,9 @@ Player* FollowerAI::GetLeaderForFollower() void FollowerAI::SetFollowComplete(bool bWithEndEvent) { - if (me->HasUnitState(UNIT_STAT_FOLLOW)) + if (me->HasUnitState(UNIT_STATE_FOLLOW)) { - me->ClearUnitState(UNIT_STAT_FOLLOW); + me->ClearUnitState(UNIT_STATE_FOLLOW); me->StopMoving(); me->GetMotionMaster()->Clear(); @@ -369,9 +369,9 @@ void FollowerAI::SetFollowPaused(bool paused) { AddFollowState(STATE_FOLLOW_PAUSED); - if (me->HasUnitState(UNIT_STAT_FOLLOW)) + if (me->HasUnitState(UNIT_STATE_FOLLOW)) { - me->ClearUnitState(UNIT_STAT_FOLLOW); + me->ClearUnitState(UNIT_STATE_FOLLOW); me->StopMoving(); me->GetMotionMaster()->Clear(); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 3c0bdfcade7..04b1fa2b2e7 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2714,7 +2714,7 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff) { if (!(e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)) { - if (me && me->HasUnitState(UNIT_STAT_CASTING)) + if (me && me->HasUnitState(UNIT_STATE_CASTING)) { e.timer = 1; return; diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 7833198e3c3..d82e43ba83b 100755 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -180,7 +180,7 @@ void HostileReference::updateOnlineStatus() // target is not in flight if (isValid() && (getTarget()->GetTypeId() != TYPEID_PLAYER || !getTarget()->ToPlayer()->isGameMaster()) - && !getTarget()->HasUnitState(UNIT_STAT_IN_FLIGHT) + && !getTarget()->HasUnitState(UNIT_STATE_IN_FLIGHT) && getTarget()->IsInMap(getSourceUnit()) ) { diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index ac7343e8f23..cccb780e412 100755 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1762,7 +1762,7 @@ void LFGMgr::TeleportPlayer(Player* player, bool out, bool fromOpcode /*= false* error = LFG_TELEPORTERROR_INVALID_LOCATION; else if (!player->isAlive()) error = LFG_TELEPORTERROR_PLAYER_DEAD; - else if (player->IsFalling() || player->HasUnitState(UNIT_STAT_JUMPING)) + else if (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING)) error = LFG_TELEPORTERROR_FALLING; else { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 25682999f62..82c5ce09d35 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -685,7 +685,7 @@ void Creature::DoFleeToGetAssistance() if (!creature) //SetFeared(true, getVictim()->GetGUID(), 0, sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY)); //TODO: use 31365 - SetControlled(true, UNIT_STAT_FLEEING); + SetControlled(true, UNIT_STATE_FLEEING); else GetMotionMaster()->MoveSeekAssistance(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ()); } @@ -1536,7 +1536,7 @@ void Creature::setDeathState(DeathState s) if (GetCreatureInfo()->InhabitType & INHABIT_WATER) AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); - ClearUnitState(uint32(UNIT_STAT_ALL_STATE)); + ClearUnitState(uint32(UNIT_STATE_ALL_STATE)); SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool)); LoadCreaturesAddon(true); Motion_Initialize(); @@ -1949,7 +1949,7 @@ bool Creature::_IsTargetAcceptable(const Unit* target) const || (m_vehicle && (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target)))) return false; - if (target->HasUnitState(UNIT_STAT_DIED)) + if (target->HasUnitState(UNIT_STATE_DIED)) { // guards can detect fake death if (isGuard() && target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH)) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 908f2b7e312..e890b6ac6fe 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -514,7 +514,7 @@ class Creature : public Unit, public GridObject, public MapCreature uint8 getLevelForTarget(WorldObject const* target) const; // overwrite Unit::getLevelForTarget for boss level support - bool IsInEvadeMode() const { return HasUnitState(UNIT_STAT_EVADE); } + bool IsInEvadeMode() const { return HasUnitState(UNIT_STATE_EVADE); } bool AIM_Initialize(CreatureAI* ai = NULL); void Motion_Initialize(); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d89849f7ccf..0332d0998b4 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2417,7 +2417,7 @@ namespace Trinity float x, y, z; - if (!c->isAlive() || c->HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED) || + if (!c->isAlive() || c->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED) || !c->GetMotionMaster()->GetDestination(x, y, z)) { x = c->GetPositionX(); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8cf1413611b..21994640e63 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1562,7 +1562,7 @@ void Player::Update(uint32 p_time) GetAchievementMgr().UpdateTimedAchievements(p_time); - if (HasUnitState(UNIT_STAT_MELEE_ATTACKING) && !HasUnitState(UNIT_STAT_CASTING)) + if (HasUnitState(UNIT_STATE_MELEE_ATTACKING) && !HasUnitState(UNIT_STATE_CASTING)) { if (Unit* pVictim = getVictim()) { @@ -11519,7 +11519,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool { // May be here should be more stronger checks; STUNNED checked // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked. - if (HasUnitState(UNIT_STAT_STUNNED)) + if (HasUnitState(UNIT_STATE_STUNNED)) return EQUIP_ERR_YOU_ARE_STUNNED; // do not allow equipping gear except weapons, offhands, projectiles, relics in @@ -20385,7 +20385,7 @@ bool Player::ActivateTaxiPathTo(std::vector const& nodes, Creature* npc return false; // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root - if (GetSession()->isLogingOut() || isInCombat() || HasUnitState(UNIT_STAT_STUNNED) || HasUnitState(UNIT_STAT_ROOT)) + if (GetSession()->isLogingOut() || isInCombat() || HasUnitState(UNIT_STATE_STUNNED) || HasUnitState(UNIT_STATE_ROOT)) { WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4); data << uint32(ERR_TAXIPLAYERBUSY); @@ -21666,7 +21666,7 @@ void Player::SendInitialVisiblePackets(Unit* target) SendAurasForTarget(target); if (target->isAlive()) { - if (target->HasUnitState(UNIT_STAT_MELEE_ATTACKING) && target->getVictim()) + if (target->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && target->getVictim()) target->SendMeleeAttackStart(target->getVictim()); } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f462f5af48f..ae2e0df2a63 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1881,7 +1881,7 @@ class Player : public Unit, public GridObject void SetContestedPvPTimer(uint32 newTime) {m_contestedPvPTimer = newTime;} void ResetContestedPvP() { - ClearUnitState(UNIT_STAT_ATTACK_PLAYER); + ClearUnitState(UNIT_STATE_ATTACK_PLAYER); RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP); m_contestedPvPTimer = 0; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 103e42a9da9..1fda85c6c9c 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -316,7 +316,7 @@ void Unit::Update(uint32 p_time) // update combat timer only for players and pets (only pets with PetAI) if (isInCombat() && (GetTypeId() == TYPEID_PLAYER || (ToCreature()->isPet() && IsControlledByPlayer()))) { - // Check UNIT_STAT_MELEE_ATTACKING or UNIT_STAT_CHASE (without UNIT_STAT_FOLLOW in this case) so pets can reach far away + // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away // targets without stopping half way there and running off. // These flags are reset after target dies or another command is given. if (m_HostileRefManager.isEmpty()) @@ -518,7 +518,7 @@ bool Unit::HasAuraTypeWithFamilyFlags(AuraType auraType, uint32 familyName, uint void Unit::DealDamageMods(Unit* victim, uint32 &damage, uint32* absorb) { - if (!victim || !victim->isAlive() || victim->HasUnitState(UNIT_STAT_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) + if (!victim || !victim->isAlive() || victim->HasUnitState(UNIT_STATE_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) { if (absorb) *absorb += damage; @@ -1043,7 +1043,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss) if (!victim) return; - if (!victim->isAlive() || victim->HasUnitState(UNIT_STAT_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) + if (!victim->isAlive() || victim->HasUnitState(UNIT_STATE_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) return; SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(damageInfo->SpellID); @@ -1260,7 +1260,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) { Unit* victim = damageInfo->target; - if (!victim->isAlive() || victim->HasUnitState(UNIT_STAT_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) + if (!victim->isAlive() || victim->HasUnitState(UNIT_STATE_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) return; // Hmmmm dont like this emotes client must by self do all animations @@ -1845,7 +1845,7 @@ void Unit::CalcHealAbsorb(Unit* victim, const SpellInfo* healSpell, uint32 &heal void Unit::AttackerStateUpdate (Unit* victim, WeaponAttackType attType, bool extra) { - if (HasUnitState(UNIT_STAT_CANNOT_AUTOATTACK) || HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) || HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) return; if (!victim->isAlive()) @@ -2563,7 +2563,7 @@ uint32 Unit::GetDefenseSkillValue(Unit const* target) const float Unit::GetUnitDodgeChance() const { - if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STAT_CONTROLLED)) + if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) return 0.0f; if (GetTypeId() == TYPEID_PLAYER) @@ -2583,7 +2583,7 @@ float Unit::GetUnitDodgeChance() const float Unit::GetUnitParryChance() const { - if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STAT_CONTROLLED)) + if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) return 0.0f; float chance = 0.0f; @@ -2629,7 +2629,7 @@ float Unit::GetUnitMissChance(WeaponAttackType attType) const float Unit::GetUnitBlockChance() const { - if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STAT_CONTROLLED)) + if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) return 0.0f; if (Player const* player = ToPlayer()) @@ -2881,7 +2881,7 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell) InterruptSpell(CURRENT_AUTOREPEAT_SPELL); m_AutoRepeatFirstCast = true; } - AddUnitState(UNIT_STAT_CASTING); + AddUnitState(UNIT_STATE_CASTING); } break; case CURRENT_CHANNELED_SPELL: @@ -2894,7 +2894,7 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell) if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75) InterruptSpell(CURRENT_AUTOREPEAT_SPELL); - AddUnitState(UNIT_STAT_CASTING); + AddUnitState(UNIT_STATE_CASTING); } break; case CURRENT_AUTOREPEAT_SPELL: @@ -9349,16 +9349,16 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) // switch to melee attack from ranged/magic if (meleeAttack) { - if (!HasUnitState(UNIT_STAT_MELEE_ATTACKING)) + if (!HasUnitState(UNIT_STATE_MELEE_ATTACKING)) { - AddUnitState(UNIT_STAT_MELEE_ATTACKING); + AddUnitState(UNIT_STATE_MELEE_ATTACKING); SendMeleeAttackStart(victim); return true; } } - else if (HasUnitState(UNIT_STAT_MELEE_ATTACKING)) + else if (HasUnitState(UNIT_STATE_MELEE_ATTACKING)) { - ClearUnitState(UNIT_STAT_MELEE_ATTACKING); + ClearUnitState(UNIT_STATE_MELEE_ATTACKING); SendMeleeAttackStop(victim); return true; } @@ -9368,7 +9368,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) // switch target InterruptSpell(CURRENT_MELEE_SPELL); if (!meleeAttack) - ClearUnitState(UNIT_STAT_MELEE_ATTACKING); + ClearUnitState(UNIT_STATE_MELEE_ATTACKING); } if (m_attacking) @@ -9381,7 +9381,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) SetTarget(victim->GetGUID()); if (meleeAttack) - AddUnitState(UNIT_STAT_MELEE_ATTACKING); + AddUnitState(UNIT_STATE_MELEE_ATTACKING); // set position before any AI calls/assistance //if (GetTypeId() == TYPEID_UNIT) @@ -9422,7 +9422,7 @@ bool Unit::AttackStop() // Clear our target SetTarget(0); - ClearUnitState(UNIT_STAT_MELEE_ATTACKING); + ClearUnitState(UNIT_STATE_MELEE_ATTACKING); InterruptSpell(CURRENT_MELEE_SPELL); @@ -9465,7 +9465,7 @@ void Unit::CombatStopWithPets(bool includingCast) bool Unit::isAttackingPlayer() const { - if (HasUnitState(UNIT_STAT_ATTACK_PLAYER)) + if (HasUnitState(UNIT_STATE_ATTACK_PLAYER)) return true; for (ControlList::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) @@ -11922,7 +11922,7 @@ void Unit::Dismount() { if (Pet* pPet = player->GetPet()) { - if (pPet->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STAT_STUNNED)) + if (pPet->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED)) pPet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); } else @@ -12049,7 +12049,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy) if (PvP) m_CombatTimer = 5000; - if (isInCombat() || HasUnitState(UNIT_STAT_EVADE)) + if (isInCombat() || HasUnitState(UNIT_STATE_EVADE)) return; SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); @@ -12102,7 +12102,7 @@ void Unit::ClearInCombat() if (creature->GetCreatureInfo() && creature->GetCreatureInfo()->unit_flags & UNIT_FLAG_OOC_NOT_ATTACKABLE) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); // re-apply Out of Combat Non Attackable flag if we leave combat, can be overriden in scripts in EnterEvadeMode() - ClearUnitState(UNIT_STAT_ATTACK_PLAYER); + ClearUnitState(UNIT_STATE_ATTACK_PLAYER); if (HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED)) SetUInt32Value(UNIT_DYNAMIC_FLAGS, creature->GetCreatureInfo()->dynamicflags); @@ -12134,7 +12134,7 @@ bool Unit::isTargetableForAttack(bool checkFakeDeath) const if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->isGameMaster()) return false; - return !HasUnitState(UNIT_STAT_UNATTACKABLE) && (!checkFakeDeath || !HasUnitState(UNIT_STAT_DIED)); + return !HasUnitState(UNIT_STATE_UNATTACKABLE) && (!checkFakeDeath || !HasUnitState(UNIT_STATE_DIED)); } bool Unit::IsValidAttackTarget(Unit const* target) const @@ -12152,7 +12152,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) co return false; // can't attack unattackable units or GMs - if (target->HasUnitState(UNIT_STAT_UNATTACKABLE) + if (target->HasUnitState(UNIT_STATE_UNATTACKABLE) || (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->isGameMaster())) return false; @@ -12246,7 +12246,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co return true; // can't assist unattackable units or GMs - if (target->HasUnitState(UNIT_STAT_UNATTACKABLE) + if (target->HasUnitState(UNIT_STATE_UNATTACKABLE) || (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->isGameMaster())) return false; @@ -15055,7 +15055,7 @@ void Unit::SendPetAIReaction(uint64 guid) void Unit::StopMoving() { - ClearUnitState(UNIT_STAT_MOVING); + ClearUnitState(UNIT_STATE_MOVING); // not need send any packets if not in world if (!IsInWorld()) @@ -15437,16 +15437,16 @@ void Unit::SetContestedPvP(Player* attackedPlayer) return; player->SetContestedPvPTimer(30000); - if (!player->HasUnitState(UNIT_STAT_ATTACK_PLAYER)) + if (!player->HasUnitState(UNIT_STATE_ATTACK_PLAYER)) { - player->AddUnitState(UNIT_STAT_ATTACK_PLAYER); + player->AddUnitState(UNIT_STATE_ATTACK_PLAYER); player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP); // call MoveInLineOfSight for nearby contested guards UpdateObjectVisibility(); } - if (!HasUnitState(UNIT_STAT_ATTACK_PLAYER)) + if (!HasUnitState(UNIT_STATE_ATTACK_PLAYER)) { - AddUnitState(UNIT_STAT_ATTACK_PLAYER); + AddUnitState(UNIT_STATE_ATTACK_PLAYER); // call MoveInLineOfSight for nearby contested guards UpdateObjectVisibility(); } @@ -16014,28 +16014,28 @@ void Unit::SetControlled(bool apply, UnitState state) AddUnitState(state); switch (state) { - case UNIT_STAT_STUNNED: + case UNIT_STATE_STUNNED: SetStunned(true); CastStop(); break; - case UNIT_STAT_ROOT: - if (!HasUnitState(UNIT_STAT_STUNNED)) + case UNIT_STATE_ROOT: + if (!HasUnitState(UNIT_STATE_STUNNED)) SetRooted(true); break; - case UNIT_STAT_CONFUSED: - if (!HasUnitState(UNIT_STAT_STUNNED)) + case UNIT_STATE_CONFUSED: + if (!HasUnitState(UNIT_STATE_STUNNED)) { - ClearUnitState(UNIT_STAT_MELEE_ATTACKING); + ClearUnitState(UNIT_STATE_MELEE_ATTACKING); SendMeleeAttackStop(); // SendAutoRepeatCancel ? SetConfused(true); CastStop(); } break; - case UNIT_STAT_FLEEING: - if (!HasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_CONFUSED)) + case UNIT_STATE_FLEEING: + if (!HasUnitState(UNIT_STATE_STUNNED | UNIT_STATE_CONFUSED)) { - ClearUnitState(UNIT_STAT_MELEE_ATTACKING); + ClearUnitState(UNIT_STATE_MELEE_ATTACKING); SendMeleeAttackStop(); // SendAutoRepeatCancel ? SetFeared(true); @@ -16050,29 +16050,29 @@ void Unit::SetControlled(bool apply, UnitState state) { switch (state) { - case UNIT_STAT_STUNNED: if (HasAuraType(SPELL_AURA_MOD_STUN)) return; + case UNIT_STATE_STUNNED: if (HasAuraType(SPELL_AURA_MOD_STUN)) return; else SetStunned(false); break; - case UNIT_STAT_ROOT: if (HasAuraType(SPELL_AURA_MOD_ROOT) || GetVehicle()) return; + case UNIT_STATE_ROOT: if (HasAuraType(SPELL_AURA_MOD_ROOT) || GetVehicle()) return; else SetRooted(false); break; - case UNIT_STAT_CONFUSED:if (HasAuraType(SPELL_AURA_MOD_CONFUSE)) return; + case UNIT_STATE_CONFUSED:if (HasAuraType(SPELL_AURA_MOD_CONFUSE)) return; else SetConfused(false); break; - case UNIT_STAT_FLEEING: if (HasAuraType(SPELL_AURA_MOD_FEAR)) return; + case UNIT_STATE_FLEEING: if (HasAuraType(SPELL_AURA_MOD_FEAR)) return; else SetFeared(false); break; default: return; } ClearUnitState(state); - if (HasUnitState(UNIT_STAT_STUNNED)) + if (HasUnitState(UNIT_STATE_STUNNED)) SetStunned(true); else { - if (HasUnitState(UNIT_STAT_ROOT)) + if (HasUnitState(UNIT_STATE_ROOT)) SetRooted(true); - if (HasUnitState(UNIT_STAT_CONFUSED)) + if (HasUnitState(UNIT_STATE_CONFUSED)) SetConfused(true); - else if (HasUnitState(UNIT_STAT_FLEEING)) + else if (HasUnitState(UNIT_STATE_FLEEING)) SetFeared(true); } } @@ -16114,7 +16114,7 @@ void Unit::SetStunned(bool apply) if (!owner || (owner->GetTypeId() == TYPEID_PLAYER && !owner->ToPlayer()->IsMounted())) RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); - if (!HasUnitState(UNIT_STAT_ROOT)) // prevent moving if it also has root effect + if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect { WorldPacket data(SMSG_MOVE_UNROOT, 8+4); data.append(GetPackGUID()); @@ -16156,7 +16156,7 @@ void Unit::SetRooted(bool apply) } else { - if (!HasUnitState(UNIT_STAT_STUNNED)) // prevent moving if it also has stun effect + if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect { if (GetTypeId() == TYPEID_PLAYER) { @@ -16248,7 +16248,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au return false; } - //if (HasUnitState(UNIT_STAT_UNATTACKABLE)) + //if (HasUnitState(UNIT_STATE_UNATTACKABLE)) // return false; if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->GetTransport()) @@ -16341,7 +16341,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au charmer->ToPlayer()->VehicleSpellInitialize(); break; case CHARM_TYPE_POSSESS: - AddUnitState(UNIT_STAT_POSSESSED); + AddUnitState(UNIT_STATE_POSSESSED); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); charmer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); charmer->ToPlayer()->SetClientControl(this, 1); @@ -16392,7 +16392,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) } CharmType type; - if (HasUnitState(UNIT_STAT_POSSESSED)) + if (HasUnitState(UNIT_STATE_POSSESSED)) type = CHARM_TYPE_POSSESS; else if (charmer && charmer->IsOnVehicle(this)) type = CHARM_TYPE_VEHICLE; @@ -16410,7 +16410,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) if (type == CHARM_TYPE_POSSESS) { - ClearUnitState(UNIT_STAT_POSSESSED); + ClearUnitState(UNIT_STATE_POSSESSED); RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); } @@ -17488,7 +17488,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) Vehicle* vehicle = m_vehicle; m_vehicle = NULL; - SetControlled(false, UNIT_STAT_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT + SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT Position pos; if (!exitPosition) // Exit position not specified @@ -17496,7 +17496,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) else pos = *exitPosition; - AddUnitState(UNIT_STAT_MOVE); + AddUnitState(UNIT_STATE_MOVE); if (GetTypeId() == TYPEID_PLAYER) ToPlayer()->SetFallInformation(0, GetPositionZ()); @@ -17936,7 +17936,7 @@ bool CharmInfo::IsReturning() void Unit::SetInFront(Unit const* target) { - if (!HasUnitState(UNIT_STAT_CANNOT_TURN)) + if (!HasUnitState(UNIT_STATE_CANNOT_TURN)) SetOrientation(GetAngle(target)); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index c50cba080c7..e65574bbfbc 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -469,46 +469,46 @@ enum DeathState enum UnitState { - UNIT_STAT_DIED = 0x00000001, // player has fake death aura - UNIT_STAT_MELEE_ATTACKING = 0x00000002, // player is melee attacking someone - //UNIT_STAT_MELEE_ATTACK_BY = 0x00000004, // player is melee attack by someone - UNIT_STAT_STUNNED = 0x00000008, - UNIT_STAT_ROAMING = 0x00000010, - UNIT_STAT_CHASE = 0x00000020, - //UNIT_STAT_SEARCHING = 0x00000040, - UNIT_STAT_FLEEING = 0x00000080, - UNIT_STAT_IN_FLIGHT = 0x00000100, // player is in flight mode - UNIT_STAT_FOLLOW = 0x00000200, - UNIT_STAT_ROOT = 0x00000400, - UNIT_STAT_CONFUSED = 0x00000800, - UNIT_STAT_DISTRACTED = 0x00001000, - UNIT_STAT_ISOLATED = 0x00002000, // area auras do not affect other players - UNIT_STAT_ATTACK_PLAYER = 0x00004000, - UNIT_STAT_CASTING = 0x00008000, - UNIT_STAT_POSSESSED = 0x00010000, - UNIT_STAT_CHARGING = 0x00020000, - UNIT_STAT_JUMPING = 0x00040000, - UNIT_STAT_ONVEHICLE = 0x00080000, - UNIT_STAT_MOVE = 0x00100000, - UNIT_STAT_ROTATING = 0x00200000, - UNIT_STAT_EVADE = 0x00400000, - UNIT_STAT_ROAMING_MOVE = 0x00800000, - UNIT_STAT_CONFUSED_MOVE = 0x01000000, - UNIT_STAT_FLEEING_MOVE = 0x02000000, - UNIT_STAT_CHASE_MOVE = 0x04000000, - UNIT_STAT_FOLLOW_MOVE = 0x08000000, - UNIT_STAT_UNATTACKABLE = (UNIT_STAT_IN_FLIGHT | UNIT_STAT_ONVEHICLE), - //UNIT_STAT_MOVING = (UNIT_STAT_ROAMING | UNIT_STAT_CHASE), + UNIT_STATE_DIED = 0x00000001, // player has fake death aura + UNIT_STATE_MELEE_ATTACKING = 0x00000002, // player is melee attacking someone + //UNIT_STATE_MELEE_ATTACK_BY = 0x00000004, // player is melee attack by someone + UNIT_STATE_STUNNED = 0x00000008, + UNIT_STATE_ROAMING = 0x00000010, + UNIT_STATE_CHASE = 0x00000020, + //UNIT_STATE_SEARCHING = 0x00000040, + UNIT_STATE_FLEEING = 0x00000080, + UNIT_STATE_IN_FLIGHT = 0x00000100, // player is in flight mode + UNIT_STATE_FOLLOW = 0x00000200, + UNIT_STATE_ROOT = 0x00000400, + UNIT_STATE_CONFUSED = 0x00000800, + UNIT_STATE_DISTRACTED = 0x00001000, + UNIT_STATE_ISOLATED = 0x00002000, // area auras do not affect other players + UNIT_STATE_ATTACK_PLAYER = 0x00004000, + UNIT_STATE_CASTING = 0x00008000, + UNIT_STATE_POSSESSED = 0x00010000, + UNIT_STATE_CHARGING = 0x00020000, + UNIT_STATE_JUMPING = 0x00040000, + UNIT_STATE_ONVEHICLE = 0x00080000, + UNIT_STATE_MOVE = 0x00100000, + UNIT_STATE_ROTATING = 0x00200000, + UNIT_STATE_EVADE = 0x00400000, + UNIT_STATE_ROAMING_MOVE = 0x00800000, + UNIT_STATE_CONFUSED_MOVE = 0x01000000, + UNIT_STATE_FLEEING_MOVE = 0x02000000, + UNIT_STATE_CHASE_MOVE = 0x04000000, + UNIT_STATE_FOLLOW_MOVE = 0x08000000, + UNIT_STATE_UNATTACKABLE = (UNIT_STATE_IN_FLIGHT | UNIT_STATE_ONVEHICLE), + //UNIT_STATE_MOVING = (UNIT_STATE_ROAMING | UNIT_STATE_CHASE), // for real move using movegen check and stop (except unstoppable flight) - UNIT_STAT_MOVING = UNIT_STAT_ROAMING_MOVE | UNIT_STAT_CONFUSED_MOVE | UNIT_STAT_FLEEING_MOVE| UNIT_STAT_CHASE_MOVE | UNIT_STAT_FOLLOW_MOVE , - UNIT_STAT_CONTROLLED = (UNIT_STAT_CONFUSED | UNIT_STAT_STUNNED | UNIT_STAT_FLEEING), - UNIT_STAT_LOST_CONTROL = (UNIT_STAT_CONTROLLED | UNIT_STAT_JUMPING | UNIT_STAT_CHARGING), - UNIT_STAT_SIGHTLESS = (UNIT_STAT_LOST_CONTROL | UNIT_STAT_EVADE), - UNIT_STAT_CANNOT_AUTOATTACK = (UNIT_STAT_LOST_CONTROL | UNIT_STAT_CASTING), - UNIT_STAT_CANNOT_TURN = (UNIT_STAT_LOST_CONTROL | UNIT_STAT_ROTATING), + UNIT_STATE_MOVING = UNIT_STATE_ROAMING_MOVE | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE| UNIT_STATE_CHASE_MOVE | UNIT_STATE_FOLLOW_MOVE , + UNIT_STATE_CONTROLLED = (UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING), + UNIT_STATE_LOST_CONTROL = (UNIT_STATE_CONTROLLED | UNIT_STATE_JUMPING | UNIT_STATE_CHARGING), + UNIT_STATE_SIGHTLESS = (UNIT_STATE_LOST_CONTROL | UNIT_STATE_EVADE), + UNIT_STATE_CANNOT_AUTOATTACK = (UNIT_STATE_LOST_CONTROL | UNIT_STATE_CASTING), + UNIT_STATE_CANNOT_TURN = (UNIT_STATE_LOST_CONTROL | UNIT_STATE_ROTATING), // stay by different reasons - UNIT_STAT_NOT_MOVE = UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DIED | UNIT_STAT_DISTRACTED, - UNIT_STAT_ALL_STATE = 0xffffffff //(UNIT_STAT_STOPPED | UNIT_STAT_MOVING | UNIT_STAT_IN_COMBAT | UNIT_STAT_IN_FLIGHT) + UNIT_STATE_NOT_MOVE = UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DIED | UNIT_STATE_DISTRACTED, + UNIT_STATE_ALL_STATE = 0xffffffff //(UNIT_STATE_STOPPED | UNIT_STATE_MOVING | UNIT_STATE_IN_COMBAT | UNIT_STATE_IN_FLIGHT) }; enum UnitMoveType @@ -1289,8 +1289,8 @@ class Unit : public WorldObject void ClearUnitState(uint32 f) { m_state &= ~f; } bool CanFreeMove() const { - return !HasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_FLEEING | UNIT_STAT_IN_FLIGHT | - UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED) && GetOwnerGUID() == 0; + return !HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT | + UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED) && GetOwnerGUID() == 0; } uint32 HasUnitTypeMask(uint32 mask) const { return mask & m_unitTypeMask; } @@ -1528,7 +1528,7 @@ class Unit : public WorldObject } bool isSpiritService() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER | UNIT_NPC_FLAG_SPIRITGUIDE); } - bool isInFlight() const { return HasUnitState(UNIT_STAT_IN_FLIGHT); } + bool isInFlight() const { return HasUnitState(UNIT_STATE_IN_FLIGHT); } bool isInCombat() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); } void CombatStart(Unit* target, bool initialAggro = true); @@ -1685,8 +1685,8 @@ class Unit : public WorldObject void RemoveAllControlled(); bool isCharmed() const { return GetCharmerGUID() != 0; } - bool isPossessed() const { return HasUnitState(UNIT_STAT_POSSESSED); } - bool isPossessedByPlayer() const { return HasUnitState(UNIT_STAT_POSSESSED) && IS_PLAYER_GUID(GetCharmerGUID()); } + bool isPossessed() const { return HasUnitState(UNIT_STATE_POSSESSED); } + bool isPossessedByPlayer() const { return HasUnitState(UNIT_STATE_POSSESSED) && IS_PLAYER_GUID(GetCharmerGUID()); } bool isPossessing() const { if (Unit* u = GetCharm()) @@ -2051,7 +2051,7 @@ class Unit : public WorldObject MotionMaster* GetMotionMaster() { return &i_motionMaster; } const MotionMaster* GetMotionMaster() const { return &i_motionMaster; } - bool IsStopped() const { return !(HasUnitState(UNIT_STAT_MOVING)); } + bool IsStopped() const { return !(HasUnitState(UNIT_STATE_MOVING)); } void StopMoving(); void AddUnitMovementFlag(uint32 f) { m_movementInfo.flags |= f; } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 677ef5032f2..0ff5d402242 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -176,7 +176,7 @@ void Vehicle::ApplyAllImmunities() case 160: // Strand of the Ancients case 244: // Wintergrasp case 510: // Isle of Conquest - _me->SetControlled(true, UNIT_STAT_ROOT); + _me->SetControlled(true, UNIT_STATE_ROOT); // why we need to apply this? we can simple add immunities to slow mechanic in DB _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true); break; @@ -342,7 +342,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) } if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK1)) - unit->AddUnitState(UNIT_STAT_ONVEHICLE); + unit->AddUnitState(UNIT_STATE_ONVEHICLE); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); VehicleSeatEntry const* veSeat = seat->second.SeatInfo; @@ -364,7 +364,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) if (_me->IsInWorld()) { unit->SendClearTarget(); // SMSG_BREAK_TARGET - unit->SetControlled(true, UNIT_STAT_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_MOVE_SPLINE_ROOT here (for creatures) + unit->SetControlled(true, UNIT_STATE_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_MOVE_SPLINE_ROOT here (for creatures) // also adds MOVEMENTFLAG_ROOT unit->SendMonsterMoveTransport(_me); // SMSG_MONSTER_MOVE_TRANSPORT @@ -407,7 +407,7 @@ void Vehicle::RemovePassenger(Unit* unit) ++_usableSeatNum; } - unit->ClearUnitState(UNIT_STAT_ONVEHICLE); + unit->ClearUnitState(UNIT_STATE_ONVEHICLE); if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) _me->RemoveCharmedBy(unit); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index 5e5fbf4a9a6..2446e9d4276 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -113,7 +113,7 @@ inline void CreatureUnitRelocationWorker(Creature* c, Unit* u) if (!u->isAlive() || !c->isAlive() || c == u || u->isInFlight()) return; - if (c->HasReactState(REACT_AGGRESSIVE) && !c->HasUnitState(UNIT_STAT_SIGHTLESS)) + if (c->HasReactState(REACT_AGGRESSIVE) && !c->HasUnitState(UNIT_STATE_SIGHTLESS)) if (c->IsAIEnabled && c->canSeeOrDetect(u, false, true)) c->AI()->MoveInLineOfSight_Safe(u); } diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 2234109c383..4bec8b2e897 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -746,7 +746,7 @@ namespace Trinity bool operator()(Unit* u) { if (u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && - (u->isFeared() || u->isCharmed() || u->isFrozen() || u->HasUnitState(UNIT_STAT_STUNNED) || u->HasUnitState(UNIT_STAT_CONFUSED))) + (u->isFeared() || u->isCharmed() || u->isFrozen() || u->HasUnitState(UNIT_STATE_STUNNED) || u->HasUnitState(UNIT_STATE_CONFUSED))) { return true; } diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 845f3279356..9b2d502b331 100755 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -46,7 +46,7 @@ void WorldSession::HandleAuctionHelloOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendAuctionHello(guid, unit); @@ -161,7 +161,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Item* it = player->GetItemByGuid(item); @@ -275,7 +275,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); @@ -394,7 +394,7 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); @@ -482,7 +482,7 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); @@ -531,7 +531,7 @@ void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); @@ -586,7 +586,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index ebde812ac76..c4208215053 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1112,7 +1112,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) sLog->outChar("Account: %d (IP: %s) Login Character:[%s] (GUID: %u)", GetAccountId(), IP_str.c_str(), pCurrChar->GetName(), pCurrChar->GetGUIDLow()); - if (!pCurrChar->IsStandState() && !pCurrChar->HasUnitState(UNIT_STAT_STUNNED)) + if (!pCurrChar->IsStandState() && !pCurrChar->HasUnitState(UNIT_STATE_STUNNED)) pCurrChar->SetStandState(UNIT_STAND_STATE_STAND); m_playerLoading = false; diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 3a47f214099..4aab82945f1 100755 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -644,7 +644,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) void WorldSession::HandleEmoteOpcode(WorldPacket & recv_data) { - if (!GetPlayer()->isAlive() || GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (!GetPlayer()->isAlive() || GetPlayer()->HasUnitState(UNIT_STATE_DIED)) return; uint32 emote; @@ -721,7 +721,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket & recv_data) break; default: // Only allow text-emotes for "dead" entities (feign death included) - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) break; GetPlayer()->HandleEmoteCommand(emote_anim); break; diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index fff068a0a04..fd3f0c07fb4 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -324,7 +324,7 @@ void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket) if (GetPlayer()->GetNPCIfCanInteractWith(vendorGuid, UNIT_NPC_FLAG_TABARDDESIGNER)) { // Remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (Guild* guild = _GetPlayerGuild(this)) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 40de8ca9fe8..00ff1f8ffa4 100755 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -501,7 +501,7 @@ void WorldSession::HandleSellItemOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Item* pItem = _player->GetItemByGuid(itemguid); @@ -612,7 +612,7 @@ void WorldSession::HandleBuybackItem(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Item* pItem = _player->GetItemFromBuyBackSlot(slot); @@ -731,11 +731,11 @@ void WorldSession::SendListInventory(uint64 vendorGuid) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // Stop the npc if moving - if (vendor->HasUnitState(UNIT_STAT_MOVING)) + if (vendor->HasUnitState(UNIT_STATE_MOVING)) vendor->StopMoving(); uint8* bytes = (uint8*)&vendorGuid; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 04ad3e745dc..8184334d2b1 100755 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -122,7 +122,7 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if ((unit && unit->GetCreatureInfo()->ScriptID != unit->LastUsedScriptID) || (go && go->GetGOInfo()->ScriptId != go->LastUsedScriptID)) diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index c1b59b41ebb..945116ea5d8 100755 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -60,7 +60,7 @@ void WorldSession::HandleTabardVendorActivateOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendTabardVendorActivate(guid); @@ -89,7 +89,7 @@ void WorldSession::HandleBankerActivateOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendShowBank(guid); @@ -128,7 +128,7 @@ void WorldSession::SendTrainerList(uint64 guid, const std::string& strTitle) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // trainer list loaded at check; @@ -253,7 +253,7 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (!unit->isCanTrainingOf(_player, true)) @@ -318,7 +318,7 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) GetPlayer()->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK); // remove fake death - //if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + //if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) // GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (unit->isArmorer() || unit->isCivilian() || unit->isQuestGiver() || unit->isServiceProvider() || unit->isGuard()) @@ -373,7 +373,7 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (!code.empty()) @@ -404,7 +404,7 @@ void WorldSession::HandleSpiritHealerActivateOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendSpiritResurrect(); @@ -459,7 +459,7 @@ void WorldSession::HandleBinderActivateOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendBindPoint(unit); @@ -512,7 +512,7 @@ void WorldSession::HandleListStabledPetsOpcode(WorldPacket & recv_data) return; // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // remove mounts this fix bug where getting pet from stable while mounted deletes pet. @@ -615,7 +615,7 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Pet* pet = _player->GetPet(); @@ -685,7 +685,7 @@ void WorldSession::HandleUnstablePet(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_ENTRY); @@ -765,7 +765,7 @@ void WorldSession::HandleBuyStableSlot(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (GetPlayer()->m_stableSlots < MAX_PET_STABLES) @@ -804,7 +804,7 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Pet* pet = _player->GetPet(); @@ -892,7 +892,7 @@ void WorldSession::HandleRepairItemOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // reputation discount diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 00a19adc8ae..fb94800d1bd 100755 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -207,7 +207,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid return; } - pet->ClearUnitState(UNIT_STAT_FOLLOW); + pet->ClearUnitState(UNIT_STATE_FOLLOW); // This is true if pet has no target or has target but targets differs. if (pet->getVictim() != TargetUnit || (pet->getVictim() == TargetUnit && !pet->GetCharmInfo()->IsCommandAttack())) { @@ -774,7 +774,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) targets.Read(recvPacket, caster); HandleClientCastFlags(recvPacket, castFlags, targets); - caster->ClearUnitState(UNIT_STAT_FOLLOW); + caster->ClearUnitState(UNIT_STATE_FOLLOW); Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE); spell->m_cast_count = castCount; // probably pending spell cast diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index dce5e0f78ba..f363fa71038 100755 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -98,7 +98,7 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); uint32 charterid = 0; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index a3debe82ac1..6cba7b7fb4f 100755 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -95,7 +95,7 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // Stop the npc if moving creature->StopMoving(); diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 2e4ef5cb40d..886368821f5 100755 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -88,7 +88,7 @@ void WorldSession::HandleTalentWipeConfirmOpcode(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (!_player->ResetTalents()) diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index 3533b153bd8..8eb1eab06d9 100755 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -79,7 +79,7 @@ void WorldSession::HandleTaxiQueryAvailableNodes(WorldPacket & recv_data) } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // unknown taxi node case @@ -118,7 +118,7 @@ void WorldSession::SendTaxiMenu(Creature* unit) void WorldSession::SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode) { // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); while (GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 900f036df0a..b51f13a5063 100755 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -581,7 +581,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) return; } - if (GetPlayer()->HasUnitState(UNIT_STAT_STUNNED)) + if (GetPlayer()->HasUnitState(UNIT_STATE_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; @@ -631,7 +631,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) return; } - if (pOther->HasUnitState(UNIT_STAT_STUNNED)) + if (pOther->HasUnitState(UNIT_STATE_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 8975a2d7d7b..4945ae2a014 100755 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -80,7 +80,7 @@ void MotionMaster::UpdateMotion(uint32 diff) if (!i_owner) return; - if (i_owner->HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) // what about UNIT_STAT_DISTRACTED? Why is this not included? + if (i_owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) // what about UNIT_STATE_DISTRACTED? Why is this not included? return; ASSERT(!empty()); @@ -237,7 +237,7 @@ void MotionMaster::MoveChase(Unit* target, float dist, float angle) if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) return; - //i_owner->ClearUnitState(UNIT_STAT_FOLLOW); + //i_owner->ClearUnitState(UNIT_STATE_FOLLOW); if (i_owner->GetTypeId() == TYPEID_PLAYER) { sLog->outStaticDebug("Player (GUID: %u) chase to %s (GUID: %u)", @@ -262,7 +262,7 @@ void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlo if (!target || target == i_owner || i_owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) return; - //i_owner->AddUnitState(UNIT_STAT_FOLLOW); + //i_owner->AddUnitState(UNIT_STATE_FOLLOW); if (i_owner->GetTypeId() == TYPEID_PLAYER) { sLog->outStaticDebug("Player (GUID: %u) follow to %s (GUID: %u)", i_owner->GetGUIDLow(), diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index 94608d85420..32b960028c2 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -71,7 +71,7 @@ void ConfusedMovementGenerator::Initialize(T &unit) unit.StopMoving(); unit.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); - unit.AddUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); + unit.AddUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); } template<> @@ -94,19 +94,19 @@ void ConfusedMovementGenerator::Reset(T &unit) i_nextMove = 1; i_nextMoveTime.Reset(0); unit.StopMoving(); - unit.AddUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); + unit.AddUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); } template bool ConfusedMovementGenerator::Update(T &unit, const uint32 &diff) { - if (unit.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED)) + if (unit.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) return true; if (i_nextMoveTime.Passed()) { // currently moving, update location - unit.AddUnitState(UNIT_STAT_CONFUSED_MOVE); + unit.AddUnitState(UNIT_STATE_CONFUSED_MOVE); if (unit.movespline->Finalized()) { @@ -121,7 +121,7 @@ bool ConfusedMovementGenerator::Update(T &unit, const uint32 &diff) if(i_nextMoveTime.Passed() ) { // start moving - unit.AddUnitState(UNIT_STAT_CONFUSED_MOVE); + unit.AddUnitState(UNIT_STATE_CONFUSED_MOVE); ASSERT( i_nextMove <= MAX_CONF_WAYPOINTS ); float x = i_waypoints[i_nextMove][0]; @@ -141,14 +141,14 @@ template<> void ConfusedMovementGenerator::Finalize(Player &unit) { unit.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); - unit.ClearUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); + unit.ClearUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); } template<> void ConfusedMovementGenerator::Finalize(Creature &unit) { unit.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); - unit.ClearUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); + unit.ClearUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); if (unit.getVictim()) unit.SetTarget(unit.getVictim()->GetGUID()); } diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 458e6f9a62c..ed5b73dd378 100755 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -34,7 +34,7 @@ FleeingMovementGenerator::_setTargetLocation(T &owner) if (!&owner) return; - if (owner.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) + if (owner.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) return; if (!_setMoveData(owner)) @@ -44,7 +44,7 @@ FleeingMovementGenerator::_setTargetLocation(T &owner) if (!_getPoint(owner, x, y, z)) return; - owner.AddUnitState(UNIT_STAT_FLEEING_MOVE); + owner.AddUnitState(UNIT_STATE_FLEEING_MOVE); Movement::MoveSplineInit init(owner); init.MoveTo(x,y,z); @@ -287,7 +287,7 @@ FleeingMovementGenerator::Initialize(T &owner) return; owner.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING); - owner.AddUnitState(UNIT_STAT_FLEEING|UNIT_STAT_FLEEING_MOVE); + owner.AddUnitState(UNIT_STATE_FLEEING|UNIT_STATE_FLEEING_MOVE); _Init(owner); @@ -335,14 +335,14 @@ template<> void FleeingMovementGenerator::Finalize(Player &owner) { owner.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING); - owner.ClearUnitState(UNIT_STAT_FLEEING|UNIT_STAT_FLEEING_MOVE); + owner.ClearUnitState(UNIT_STATE_FLEEING|UNIT_STATE_FLEEING_MOVE); } template<> void FleeingMovementGenerator::Finalize(Creature &owner) { owner.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING); - owner.ClearUnitState(UNIT_STAT_FLEEING|UNIT_STAT_FLEEING_MOVE); + owner.ClearUnitState(UNIT_STATE_FLEEING|UNIT_STATE_FLEEING_MOVE); if (owner.getVictim()) owner.SetTarget(owner.getVictim()->GetGUID()); } @@ -359,9 +359,9 @@ FleeingMovementGenerator::Update(T &owner, const uint32 &time_diff) { if (!&owner || !owner.isAlive()) return false; - if (owner.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) + if (owner.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) { - owner.ClearUnitState(UNIT_STAT_FLEEING_MOVE); + owner.ClearUnitState(UNIT_STATE_FLEEING_MOVE); return true; } @@ -388,7 +388,7 @@ template bool FleeingMovementGenerator::Update(Creature &, const uint3 void TimedFleeingMovementGenerator::Finalize(Unit &owner) { owner.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING); - owner.ClearUnitState(UNIT_STAT_FLEEING|UNIT_STAT_FLEEING_MOVE); + owner.ClearUnitState(UNIT_STATE_FLEEING|UNIT_STATE_FLEEING_MOVE); if (Unit* victim = owner.getVictim()) { if (owner.isAlive()) @@ -404,9 +404,9 @@ bool TimedFleeingMovementGenerator::Update(Unit & owner, const uint32 time_diff) if (!owner.isAlive()) return false; - if (owner.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) + if (owner.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) { - owner.ClearUnitState(UNIT_STAT_FLEEING_MOVE); + owner.ClearUnitState(UNIT_STATE_FLEEING_MOVE); return true; } diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 84997d6d1ae..dc47898352e 100755 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -25,7 +25,7 @@ void HomeMovementGenerator::Initialize(Creature & owner) { - owner.AddUnitState(UNIT_STAT_EVADE); + owner.AddUnitState(UNIT_STATE_EVADE); _setTargetLocation(owner); } @@ -38,7 +38,7 @@ void HomeMovementGenerator::_setTargetLocation(Creature & owner) if (!&owner) return; - if (owner.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED)) + if (owner.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) return; Movement::MoveSplineInit init(owner); @@ -54,7 +54,7 @@ void HomeMovementGenerator::_setTargetLocation(Creature & owner) init.Launch(); arrived = false; - owner.ClearUnitState(UNIT_STAT_ALL_STATE & ~UNIT_STAT_EVADE); + owner.ClearUnitState(UNIT_STATE_ALL_STATE & ~UNIT_STATE_EVADE); } bool HomeMovementGenerator::Update(Creature &owner, const uint32 time_diff) @@ -67,7 +67,7 @@ void HomeMovementGenerator::Finalize(Creature& owner) { if (arrived) { - owner.ClearUnitState(UNIT_STAT_EVADE); + owner.ClearUnitState(UNIT_STATE_EVADE); owner.SetWalk(true); owner.LoadCreaturesAddon(true); owner.AI()->JustReachedHome(); diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp index 43d3cccfe48..36561e00b93 100755 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp @@ -32,19 +32,19 @@ void IdleMovementGenerator::Initialize(Unit &owner) void IdleMovementGenerator::Reset(Unit& owner) { - if (owner.HasUnitState(UNIT_STAT_MOVE)) + if (owner.HasUnitState(UNIT_STATE_MOVE)) owner.StopMoving(); } void RotateMovementGenerator::Initialize(Unit& owner) { - if (owner.HasUnitState(UNIT_STAT_MOVE)) + if (owner.HasUnitState(UNIT_STATE_MOVE)) owner.StopMoving(); if (owner.getVictim()) owner.SetInFront(owner.getVictim()); - owner.AddUnitState(UNIT_STAT_ROTATING); + owner.AddUnitState(UNIT_STATE_ROTATING); owner.AttackStop(); } @@ -75,7 +75,7 @@ bool RotateMovementGenerator::Update(Unit& owner, const uint32 diff) void RotateMovementGenerator::Finalize(Unit &unit) { - unit.ClearUnitState(UNIT_STAT_ROTATING); + unit.ClearUnitState(UNIT_STATE_ROTATING); if (unit.GetTypeId() == TYPEID_UNIT) unit.ToCreature()->AI()->MovementInform(ROTATE_MOTION_TYPE, 0); } @@ -83,13 +83,13 @@ void RotateMovementGenerator::Finalize(Unit &unit) void DistractMovementGenerator::Initialize(Unit& owner) { - owner.AddUnitState(UNIT_STAT_DISTRACTED); + owner.AddUnitState(UNIT_STATE_DISTRACTED); } void DistractMovementGenerator::Finalize(Unit& owner) { - owner.ClearUnitState(UNIT_STAT_DISTRACTED); + owner.ClearUnitState(UNIT_STATE_DISTRACTED); } bool @@ -105,7 +105,7 @@ DistractMovementGenerator::Update(Unit& /*owner*/, const uint32 time_diff) void AssistanceDistractMovementGenerator::Finalize(Unit &unit) { - unit.ClearUnitState(UNIT_STAT_DISTRACTED); + unit.ClearUnitState(UNIT_STATE_DISTRACTED); unit.ToCreature()->SetReactState(REACT_AGGRESSIVE); } diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index 88465017dc2..02f9ebce847 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -32,7 +32,7 @@ void PointMovementGenerator::Initialize(T &unit) if (!unit.IsStopped()) unit.StopMoving(); - unit.AddUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + unit.AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); Movement::MoveSplineInit init(unit); init.MoveTo(i_x, i_y, i_z); if (speed > 0.0f) @@ -46,20 +46,20 @@ bool PointMovementGenerator::Update(T &unit, const uint32 &diff) if (!&unit) return false; - if(unit.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) + if(unit.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) { - unit.ClearUnitState(UNIT_STAT_ROAMING_MOVE); + unit.ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } - unit.AddUnitState(UNIT_STAT_ROAMING_MOVE); + unit.AddUnitState(UNIT_STATE_ROAMING_MOVE); return !unit.movespline->Finalized(); } template void PointMovementGenerator:: Finalize(T &unit) { - unit.ClearUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + unit.ClearUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); if (unit.movespline->Finalized()) MovementInform(unit); @@ -71,7 +71,7 @@ void PointMovementGenerator::Reset(T &unit) if (!unit.IsStopped()) unit.StopMoving(); - unit.AddUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + unit.AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); } template @@ -120,7 +120,7 @@ void EffectMovementGenerator::Finalize(Unit &unit) if (((Creature&)unit).AI() && unit.movespline->Finalized()) ((Creature&)unit).AI()->MovementInform(EFFECT_MOTION_TYPE, m_Id); // Need restore previous movement since we have no proper states system - //if (unit.isAlive() && !unit.HasUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_FLEEING)) + //if (unit.isAlive() && !unit.HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_FLEEING)) //{ // if (Unit * victim = unit.getVictim()) // unit.GetMotionMaster()->MoveChase(victim); diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 0205b734058..22adc7be92f 100755 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -102,7 +102,7 @@ void RandomMovementGenerator::_setRandomLocation(Creature &creature) else i_nextMoveTime.Reset(urand(500, 10000)); - creature.AddUnitState(UNIT_STAT_ROAMING_MOVE); + creature.AddUnitState(UNIT_STATE_ROAMING_MOVE); Movement::MoveSplineInit init(creature); init.MoveTo(destX, destY, destZ); @@ -123,7 +123,7 @@ void RandomMovementGenerator::Initialize(Creature &creature) if (!wander_distance) wander_distance = creature.GetRespawnRadius(); - creature.AddUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + creature.AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); _setRandomLocation(creature); } @@ -137,7 +137,7 @@ RandomMovementGenerator::Reset(Creature &creature) template<> void RandomMovementGenerator::Finalize(Creature &creature) { - creature.ClearUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + creature.ClearUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); creature.SetWalk(false); } @@ -145,10 +145,10 @@ template<> bool RandomMovementGenerator::Update(Creature &creature, const uint32 diff) { - if (creature.HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED)) + if (creature.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) { i_nextMoveTime.Reset(0); // Expire the timer - creature.ClearUnitState(UNIT_STAT_ROAMING_MOVE); + creature.ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 0d2982ab6b7..964b4402438 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -34,7 +34,7 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T &owner) if (!i_target.isValid() || !i_target->IsInWorld()) return; - if (owner.HasUnitState(UNIT_STAT_NOT_MOVE)) + if (owner.HasUnitState(UNIT_STATE_NOT_MOVE)) return; float x, y, z; @@ -125,7 +125,7 @@ bool TargetedMovementGeneratorMedium::Update(T &owner, const uint32 & time_ if (!owner.isAlive()) return true; - if (owner.HasUnitState(UNIT_STAT_NOT_MOVE)) + if (owner.HasUnitState(UNIT_STATE_NOT_MOVE)) { D::_clearUnitStateMove(owner); return true; @@ -188,7 +188,7 @@ void ChaseMovementGenerator::_reachTarget(T &owner) template<> void ChaseMovementGenerator::Initialize(Player &owner) { - owner.AddUnitState(UNIT_STAT_CHASE|UNIT_STAT_CHASE_MOVE); + owner.AddUnitState(UNIT_STATE_CHASE|UNIT_STATE_CHASE_MOVE); _setTargetLocation(owner); } @@ -196,14 +196,14 @@ template<> void ChaseMovementGenerator::Initialize(Creature &owner) { owner.SetWalk(false); - owner.AddUnitState(UNIT_STAT_CHASE|UNIT_STAT_CHASE_MOVE); + owner.AddUnitState(UNIT_STATE_CHASE|UNIT_STATE_CHASE_MOVE); _setTargetLocation(owner); } template void ChaseMovementGenerator::Finalize(T &owner) { - owner.ClearUnitState(UNIT_STAT_CHASE|UNIT_STAT_CHASE_MOVE); + owner.ClearUnitState(UNIT_STATE_CHASE|UNIT_STATE_CHASE_MOVE); } template @@ -259,7 +259,7 @@ void FollowMovementGenerator::_updateSpeed(Creature &u) template<> void FollowMovementGenerator::Initialize(Player &owner) { - owner.AddUnitState(UNIT_STAT_FOLLOW|UNIT_STAT_FOLLOW_MOVE); + owner.AddUnitState(UNIT_STATE_FOLLOW|UNIT_STATE_FOLLOW_MOVE); _updateSpeed(owner); _setTargetLocation(owner); } @@ -267,7 +267,7 @@ void FollowMovementGenerator::Initialize(Player &owner) template<> void FollowMovementGenerator::Initialize(Creature &owner) { - owner.AddUnitState(UNIT_STAT_FOLLOW|UNIT_STAT_FOLLOW_MOVE); + owner.AddUnitState(UNIT_STATE_FOLLOW|UNIT_STATE_FOLLOW_MOVE); _updateSpeed(owner); _setTargetLocation(owner); } @@ -275,7 +275,7 @@ void FollowMovementGenerator::Initialize(Creature &owner) template void FollowMovementGenerator::Finalize(T &owner) { - owner.ClearUnitState(UNIT_STAT_FOLLOW|UNIT_STAT_FOLLOW_MOVE); + owner.ClearUnitState(UNIT_STATE_FOLLOW|UNIT_STATE_FOLLOW_MOVE); _updateSpeed(owner); } diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 696c99e1460..bf2eecc89f6 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -79,8 +79,8 @@ class ChaseMovementGenerator : public TargetedMovementGeneratorMediumGetTarget(); } void _reachTarget(T &); @@ -103,8 +103,8 @@ class FollowMovementGenerator : public TargetedMovementGeneratorMedium::LoadPath(Creature &creature) void WaypointMovementGenerator::Initialize(Creature &creature) { LoadPath(creature); - creature.AddUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + creature.AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); } void WaypointMovementGenerator::Finalize(Creature &creature) { - creature.ClearUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + creature.ClearUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); creature.SetWalk(false); } void WaypointMovementGenerator::Reset(Creature &creature) { - creature.AddUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + creature.AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); StartMoveNow(creature); } @@ -73,7 +73,7 @@ void WaypointMovementGenerator::OnArrived(Creature& creature) if (m_isArrivalDone) return; - creature.ClearUnitState(UNIT_STAT_ROAMING_MOVE); + creature.ClearUnitState(UNIT_STATE_ROAMING_MOVE); m_isArrivalDone = true; if (i_path->at(i_currentNode)->event_id && urand(0, 99) < i_path->at(i_currentNode)->event_chance) @@ -111,7 +111,7 @@ bool WaypointMovementGenerator::StartMove(Creature &creature) m_isArrivalDone = false; - creature.AddUnitState(UNIT_STAT_ROAMING_MOVE); + creature.AddUnitState(UNIT_STATE_ROAMING_MOVE); Movement::MoveSplineInit init(creature); init.MoveTo(node->x, node->y, node->z); @@ -133,9 +133,9 @@ bool WaypointMovementGenerator::Update(Creature &creature, const uint3 { // Waypoint movement can be switched on/off // This is quite handy for escort quests and other stuff - if (creature.HasUnitState(UNIT_STAT_NOT_MOVE)) + if (creature.HasUnitState(UNIT_STATE_NOT_MOVE)) { - creature.ClearUnitState(UNIT_STAT_ROAMING_MOVE); + creature.ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } // prevent a crash at empty waypoint path. @@ -204,7 +204,7 @@ void FlightPathMovementGenerator::Initialize(Player &player) void FlightPathMovementGenerator::Finalize(Player & player) { // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack) - player.ClearUnitState(UNIT_STAT_IN_FLIGHT); + player.ClearUnitState(UNIT_STATE_IN_FLIGHT); player.Dismount(); player.RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); @@ -227,7 +227,7 @@ void FlightPathMovementGenerator::Finalize(Player & player) void FlightPathMovementGenerator::Reset(Player & player) { player.getHostileRefManager().setOnlineOfflineState(false); - player.AddUnitState(UNIT_STAT_IN_FLIGHT); + player.AddUnitState(UNIT_STATE_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Movement::MoveSplineInit init(player); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 2c28eb4216c..b3b4cf4a30d 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2467,7 +2467,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo target->VisitNearbyObject(target->GetMap()->GetVisibilityRange(), searcher); for (UnitList::iterator iter = targets.begin(); iter != targets.end(); ++iter) { - if (!(*iter)->HasUnitState(UNIT_STAT_CASTING)) + if (!(*iter)->HasUnitState(UNIT_STATE_CASTING)) continue; for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++) @@ -2498,7 +2498,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo // blizz like 2.0.x target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - target->AddUnitState(UNIT_STAT_DIED); + target->AddUnitState(UNIT_STATE_DIED); } else { @@ -2515,7 +2515,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo // blizz like 2.0.x target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - target->ClearUnitState(UNIT_STAT_DIED); + target->ClearUnitState(UNIT_STATE_DIED); } } @@ -3084,7 +3084,7 @@ void AuraEffect::HandleModConfuse(AuraApplication const* aurApp, uint8 mode, boo Unit* target = aurApp->GetTarget(); - target->SetControlled(apply, UNIT_STAT_CONFUSED); + target->SetControlled(apply, UNIT_STATE_CONFUSED); } void AuraEffect::HandleModFear(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -3094,7 +3094,7 @@ void AuraEffect::HandleModFear(AuraApplication const* aurApp, uint8 mode, bool a Unit* target = aurApp->GetTarget(); - target->SetControlled(apply, UNIT_STAT_FLEEING); + target->SetControlled(apply, UNIT_STATE_FLEEING); } void AuraEffect::HandleAuraModStun(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -3104,7 +3104,7 @@ void AuraEffect::HandleAuraModStun(AuraApplication const* aurApp, uint8 mode, bo Unit* target = aurApp->GetTarget(); - target->SetControlled(apply, UNIT_STAT_STUNNED); + target->SetControlled(apply, UNIT_STATE_STUNNED); } void AuraEffect::HandleAuraModRoot(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -3114,7 +3114,7 @@ void AuraEffect::HandleAuraModRoot(AuraApplication const* aurApp, uint8 mode, bo Unit* target = aurApp->GetTarget(); - target->SetControlled(apply, UNIT_STAT_ROOT); + target->SetControlled(apply, UNIT_STATE_ROOT); } void AuraEffect::HandlePreventFleeing(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -3125,7 +3125,7 @@ void AuraEffect::HandlePreventFleeing(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); if (target->HasAuraType(SPELL_AURA_MOD_FEAR)) - target->SetControlled(!(apply), UNIT_STAT_FLEEING); + target->SetControlled(!(apply), UNIT_STATE_FLEEING); } /***************************/ @@ -3509,7 +3509,7 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint if (GetSpellInfo()->Mechanic == MECHANIC_BANISH) { if (apply) - target->AddUnitState(UNIT_STAT_ISOLATED); + target->AddUnitState(UNIT_STATE_ISOLATED); else { bool banishFound = false; @@ -3521,7 +3521,7 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint break; } if (!banishFound) - target->ClearUnitState(UNIT_STAT_ISOLATED); + target->ClearUnitState(UNIT_STATE_ISOLATED); } } @@ -6193,7 +6193,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const if (!caster || !target->isAlive()) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) + if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) { SendTickImmune(target, caster); return; @@ -6334,7 +6334,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c if (!caster || !caster->isAlive() || !target->isAlive()) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) + if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) { SendTickImmune(target, caster); return; @@ -6400,7 +6400,7 @@ void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) if (!caster || !caster->isAlive() || !target->isAlive()) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED)) + if (target->HasUnitState(UNIT_STATE_ISOLATED)) { SendTickImmune(target, caster); return; @@ -6428,7 +6428,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const if (!caster || !target->isAlive()) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED)) + if (target->HasUnitState(UNIT_STATE_ISOLATED)) { SendTickImmune(target, caster); return; @@ -6544,7 +6544,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con if (!caster || !caster->isAlive() || !target->isAlive() || target->getPowerType() != powerType) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) + if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) { SendTickImmune(target, caster); return; @@ -6644,7 +6644,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const if (!target->isAlive() || !target->GetMaxPower(powerType)) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED)) + if (target->HasUnitState(UNIT_STATE_ISOLATED)) { SendTickImmune(target, caster); return; @@ -6675,7 +6675,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons if (!target->isAlive() || !target->GetMaxPower(powerType)) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED)) + if (target->HasUnitState(UNIT_STATE_ISOLATED)) { SendTickImmune(target, caster); return; @@ -6707,7 +6707,7 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con if (!caster || !target->isAlive() || target->getPowerType() != powerType) return; - if (target->HasUnitState(UNIT_STAT_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) + if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) { SendTickImmune(target, caster); return; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index a577a8678ea..d20411eb8a6 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2357,7 +2357,7 @@ void UnitAura::FillTargetMap(std::map & targets, Unit* caster) { float radius = GetSpellInfo()->Effects[effIndex].CalcRadius(caster); - if (!GetUnitOwner()->HasUnitState(UNIT_STAT_ISOLATED)) + if (!GetUnitOwner()->HasUnitState(UNIT_STATE_ISOLATED)) { switch (GetSpellInfo()->Effects[effIndex].Effect) { diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a36bd7361b4..c56969b2094 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1448,7 +1448,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, const uint32 effectMask, bool return SPELL_MISS_EVADE; // assisting case, healing and resurrection - if (unit->HasUnitState(UNIT_STAT_ATTACK_PLAYER)) + if (unit->HasUnitState(UNIT_STATE_ATTACK_PLAYER)) { m_caster->SetContestedPvP(); if (m_caster->GetTypeId() == TYPEID_PLAYER) @@ -3215,8 +3215,8 @@ void Spell::cast(bool skipCheck) m_spellState = SPELL_STATE_DELAYED; SetDelayStart(0); - if (m_caster->HasUnitState(UNIT_STAT_CASTING) && !m_caster->IsNonMeleeSpellCasted(false, false, true)) - m_caster->ClearUnitState(UNIT_STAT_CASTING); + if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !m_caster->IsNonMeleeSpellCasted(false, false, true)) + m_caster->ClearUnitState(UNIT_STATE_CASTING); } else { @@ -3582,8 +3582,8 @@ void Spell::finish(bool ok) if (m_spellInfo->IsChanneled()) m_caster->UpdateInterruptMask(); - if (m_caster->HasUnitState(UNIT_STAT_CASTING) && !m_caster->IsNonMeleeSpellCasted(false, false, true)) - m_caster->ClearUnitState(UNIT_STAT_CASTING); + if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !m_caster->IsNonMeleeSpellCasted(false, false, true)) + m_caster->ClearUnitState(UNIT_STATE_CASTING); // Unsummon summon as possessed creatures on spell cancel if (m_spellInfo->IsChanneled() && m_caster->GetTypeId() == TYPEID_PLAYER) @@ -4967,7 +4967,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (strict && m_caster->IsScriptOverriden(m_spellInfo, 6953)) m_caster->RemoveMovementImpairingAuras(); } - if (m_caster->HasUnitState(UNIT_STAT_ROOT)) + if (m_caster->HasUnitState(UNIT_STATE_ROOT)) return SPELL_FAILED_ROOTED; break; } @@ -5195,7 +5195,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; Unit* target = m_targets.GetUnitTarget(); - if (m_caster == target && m_caster->HasUnitState(UNIT_STAT_ROOT)) + if (m_caster == target && m_caster->HasUnitState(UNIT_STATE_ROOT)) { if (m_caster->GetTypeId() == TYPEID_PLAYER) return SPELL_FAILED_ROOTED; @@ -5419,7 +5419,7 @@ SpellCastResult Spell::CheckCast(bool strict) SpellCastResult Spell::CheckPetCast(Unit* target) { - if (m_caster->HasUnitState(UNIT_STAT_CASTING) && !(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS)) //prevent spellcast interruption by another spellcast + if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS)) //prevent spellcast interruption by another spellcast return SPELL_FAILED_SPELL_IN_PROGRESS; // dead owner (pets still alive when owners ressed?) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index cd4f2324d9b..6ea53fcfd8b 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1351,7 +1351,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) } //Any effect which causes you to lose control of your character will supress the starfall effect. - if (m_caster->HasUnitState(UNIT_STAT_CONTROLLED)) + if (m_caster->HasUnitState(UNIT_STATE_CONTROLLED)) return; m_caster->CastSpell(unitTarget, damage, true); @@ -3373,11 +3373,11 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) return; // target must be OK to do this - if (unitTarget->HasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_STUNNED | UNIT_STAT_FLEEING)) + if (unitTarget->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING)) return; unitTarget->SetFacingTo(unitTarget->GetAngle(m_targets.GetDst())); - unitTarget->ClearUnitState(UNIT_STAT_MOVING); + unitTarget->ClearUnitState(UNIT_STATE_MOVING); if (unitTarget->GetTypeId() == TYPEID_UNIT) unitTarget->GetMotionMaster()->MoveDistract(damage * IN_MILLISECONDS); @@ -6389,7 +6389,7 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE); pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); pet->setDeathState(ALIVE); - pet->ClearUnitState(uint32(UNIT_STAT_ALL_STATE)); + pet->ClearUnitState(uint32(UNIT_STATE_ALL_STATE)); pet->SetHealth(pet->CountPctFromMaxHealth(damage)); //pet->AIM_Initialize(); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 8e6d6cb7207..718efaed411 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1680,7 +1680,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, b } // not allow casting on flying player - if (target->HasUnitState(UNIT_STAT_IN_FLIGHT)) + if (target->HasUnitState(UNIT_STATE_IN_FLIGHT)) return SPELL_FAILED_BAD_TARGETS; if (TargetAuraState && !target->HasAuraState(AuraStateType(TargetAuraState), this, caster)) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp index 442fd025423..ff17e989cd9 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp @@ -76,7 +76,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp index 0edcdfece15..0d8cabcf89c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp @@ -105,7 +105,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp index 3a7461f90c4..a944ee6daf8 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp @@ -82,7 +82,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp index 6f5b9079268..bc9de52d91d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp @@ -85,7 +85,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp index cac07469d68..973ffe7e53b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp @@ -77,7 +77,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp index 0975b171f4d..b7492998d56 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp @@ -101,7 +101,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp index 96cc6e75e4e..d76d0d7f47c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp @@ -74,7 +74,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp index 470d41208dc..4fb7e513f5d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp @@ -72,7 +72,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp index 70b2a415a24..ce19a03571a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp @@ -73,7 +73,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp index 20eefd5a0bc..f93466cbece 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp @@ -74,7 +74,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp index 77152277742..88a09d57138 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp @@ -73,7 +73,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp index 9f06c2fbd5d..2dc05799e51 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp @@ -82,7 +82,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp index 5222270df1a..2c7cd73c604 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp @@ -351,7 +351,7 @@ public: //Teleport self to a hiding spot (this causes errors in the Trinity log but no real issues) DoTeleportTo(HIDE_X, HIDE_Y, HIDE_Z); - me->AddUnitState(UNIT_STAT_FLEEING); + me->AddUnitState(UNIT_STATE_FLEEING); //Spawn nef and have him attack a random target Creature* Nefarian = me->SummonCreature(CREATURE_NEFARIAN, NEF_X, NEF_Y, NEF_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index a6d7248cc26..14add92fd16 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -393,7 +393,7 @@ public: EnfeebleResetTimer = 0; } else EnfeebleResetTimer -= diff; - if (me->HasUnitState(UNIT_STAT_STUNNED)) // While shifting to phase 2 malchezaar stuns himself + if (me->HasUnitState(UNIT_STATE_STUNNED)) // While shifting to phase 2 malchezaar stuns himself return; if (me->GetUInt64Value(UNIT_FIELD_TARGET) != me->getVictim()->GetGUID()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp index 3959a01e4ba..f792b861c99 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp @@ -80,7 +80,7 @@ class boss_baron_geddon : public CreatureScript return; } - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp index e1bb48dfbb0..a9d32ebca9a 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp @@ -71,7 +71,7 @@ class boss_garr : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp index 9bbbb086abd..7261bbf1fbd 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp @@ -68,7 +68,7 @@ class boss_gehennas : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp index 1ba143a8c03..84e9957a60c 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp @@ -91,7 +91,7 @@ class boss_golemagg : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp index 5395b46fef3..e3e04002112 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp @@ -68,7 +68,7 @@ class boss_lucifron : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp index 5551531379b..65a630a58f7 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp @@ -80,7 +80,7 @@ class boss_magmadar : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp index d324150c22f..862a980394a 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp @@ -116,7 +116,7 @@ class boss_majordomo : public CreatureScript return; } - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (HealthBelowPct(50)) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp index 97c89f12b5b..f696ec58e1b 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp @@ -73,7 +73,7 @@ class boss_shazzrah : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp index ccefca70d67..9f511c1394a 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp @@ -84,7 +84,7 @@ class boss_sulfuron : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -169,7 +169,7 @@ class mob_flamewaker_priest : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index cb7f0de165d..337eea13438 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -425,7 +425,7 @@ public: { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); ScriptedAI::InitializeAI(); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 2004eec71bc..9b5d941589b 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -151,7 +151,7 @@ public: summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false); break; case CREATURE_DARKNESS: - summoned->AddUnitState(UNIT_STAT_STUNNED); + summoned->AddUnitState(UNIT_STATE_STUNNED); float x, y, z, o; summoned->GetHomePosition(x, y, z, o); me->SummonCreature(CREATURE_DARK_FIENDS, x, y, z, o, TEMPSUMMON_CORPSE_DESPAWN, 0); @@ -399,7 +399,7 @@ public: InAction = false; SummonSentinel = false; - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); Summons.DespawnAll(); } @@ -472,7 +472,7 @@ public: WaitTimer = 2000; InAction = false; - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); } void SpellHit(Unit* /*caster*/, const SpellInfo* Spell) @@ -491,7 +491,7 @@ public: { if (!InAction) { - me->ClearUnitState(UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_STUNNED); DoCastAOE(SPELL_DARKFIEND_SKIN, false); AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)); InAction = true; @@ -599,7 +599,7 @@ public: SpellTimer = 5000; Phase = 0; - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); DoCastAOE(SPELL_BLACKHOLE_SPAWN, true); } @@ -611,7 +611,7 @@ public: switch (NeedForAHack) { case 0: - me->ClearUnitState(UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_STUNNED); DoCastAOE(SPELL_BLACKHOLE_GROW, false); if (Victim) AttackStart(Victim); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 3cb0cc2120a..bd6f6ec4748 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -173,7 +173,7 @@ class boss_venoxis : public CreatureScript events.Update(diff); // return back to main code if we're still casting - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp index b295780cfc9..36a1ff1bade 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp @@ -75,7 +75,7 @@ class boss_kurinnaxx : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index 3dc7660985f..a290b07e60f 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -127,7 +127,7 @@ class boss_moam : public CreatureScript } // Messing up mana-drain channel - //if (me->HasUnitState(UNIT_STAT_CASTING)) + //if (me->HasUnitState(UNIT_STATE_CASTING)) // return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp index ea137026ec2..afa8eff5823 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp @@ -93,7 +93,7 @@ class boss_rajaxx : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index a60c33a4feb..b03d2dc3a4a 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -90,7 +90,7 @@ struct boss_twinemperorsAI : public ScriptedAI AfterTeleportTimer = 0; Abuse_Bug_Timer = urand(10000, 17000); BugsTimer = 2000; - me->ClearUnitState(UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_STUNNED); DontYellWhenDead = false; EnrageTimer = 15*60000; } @@ -234,7 +234,7 @@ struct boss_twinemperorsAI : public ScriptedAI DoStopAttack(); DoResetThreat(); DoCast(me, SPELL_TWIN_TELEPORT_VISUAL); - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); AfterTeleport = true; AfterTeleportTimer = 2000; tspellcasted = false; @@ -246,9 +246,9 @@ struct boss_twinemperorsAI : public ScriptedAI { if (!tspellcasted) { - me->ClearUnitState(UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_STUNNED); DoCast(me, SPELL_TWIN_TELEPORT); - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); } tspellcasted = true; @@ -256,7 +256,7 @@ struct boss_twinemperorsAI : public ScriptedAI if (AfterTeleportTimer <= diff) { AfterTeleport = false; - me->ClearUnitState(UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_STUNNED); if (Unit* nearu = me->SelectNearestTarget(100)) { //DoYell(nearu->GetName(), LANG_UNIVERSAL, 0); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index bf22c7a5d30..f1eaa0c87c5 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -115,7 +115,7 @@ public: DoCast(me, INSANITY_VISUAL, true); // Unattackable me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetControlled(true, UNIT_STAT_STUNNED); + me->SetControlled(true, UNIT_STATE_STUNNED); } // phase mask target->CastSpell(target, SPELL_INSANITY_TARGET+insanityHandled, true); @@ -171,7 +171,7 @@ public: // Cleanup Summons.DespawnAll(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetControlled(false, UNIT_STAT_STUNNED); + me->SetControlled(false, UNIT_STATE_STUNNED); } void EnterCombat(Unit* /*who*/) @@ -271,7 +271,7 @@ public: insanityHandled = 0; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetControlled(false, UNIT_STAT_STUNNED); + me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveAurasDueToSpell(INSANITY_VISUAL); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index cf9c7fd0f3d..79a102c803f 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -283,7 +283,7 @@ public: if (((UndergroundPhase == 0 && HealthBelowPct(75)) || (UndergroundPhase == 1 && HealthBelowPct(50)) || (UndergroundPhase == 2 && HealthBelowPct(25))) - && !me->HasUnitState(UNIT_STAT_CASTING)) + && !me->HasUnitState(UNIT_STATE_CASTING)) { GuardianSummoned = false; VenomancerSummoned = false; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 61d74c431fe..e848c29c466 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -174,7 +174,7 @@ class boss_baltharus_the_warborn : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) + if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -268,7 +268,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index 3b3b1fb9f47..851a56009f6 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -148,7 +148,7 @@ class boss_general_zarithrian : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -257,7 +257,7 @@ class npc_onyx_flamecaller : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp index 724fd4ef011..78810e27b05 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp @@ -137,7 +137,7 @@ class boss_saviana_ragefire : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index 153e128e58d..0848d1e9524 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -111,7 +111,7 @@ public: { RemoveSummons(); me->SetDisplayId(me->GetNativeDisplayId()); - me->ClearUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED); bEventInProgress = false; bEvent = false; @@ -167,7 +167,7 @@ public: uiPhase++; uiResurrectTimer = 4000; bEventInProgress = false; - me->ClearUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED); } else uiResurrectTimer -= uiDiff; } @@ -211,14 +211,14 @@ public: if (!bSummonArmy) { bSummonArmy = true; - me->AddUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED); DoCast(me, SPELL_ARMY_DEAD); } if (!bDeathArmyDone) { if (uiDeathArmyCheckTimer <= uiDiff) { - me->ClearUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED); uiDeathArmyCheckTimer = 0; bDeathArmyDone = true; } else uiDeathArmyCheckTimer -= uiDiff; @@ -263,7 +263,7 @@ public: } } - if (!me->HasUnitState(UNIT_STAT_ROOT) && !me->HealthBelowPct(1)) + if (!me->HasUnitState(UNIT_STATE_ROOT) && !me->HealthBelowPct(1)) DoMeleeAttackIfReady(); } @@ -273,7 +273,7 @@ public: { uiDamage = 0; me->SetHealth(0); - me->AddUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED); RemoveSummons(); switch (uiPhase) { diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index a0d6f04f44c..4a28ebe6495 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -142,7 +142,7 @@ class boss_bronjahm : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index fb39019fb84..ad49f6cbce8 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -260,7 +260,7 @@ class boss_devourer_of_souls : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index c6d00a95de3..c8f18dba1d0 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -441,7 +441,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -497,7 +497,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -555,7 +555,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -612,7 +612,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -672,7 +672,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -738,7 +738,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -811,7 +811,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -878,7 +878,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index 673362f59a0..9cfcb78f6f1 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -103,7 +103,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp index b074c309cb3..a9bfb603794 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp @@ -100,7 +100,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index e1ae8374278..1583bdbdcd4 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -659,7 +659,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -742,7 +742,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -842,7 +842,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -912,7 +912,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -978,7 +978,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 26ece7db662..0f9495d4928 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -190,7 +190,7 @@ class boss_garfrost : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 8bcd0b8b8e2..8e211cbd2cb 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -215,7 +215,7 @@ class boss_ick : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 91be62a33e7..25cd292d390 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -72,7 +72,7 @@ class mob_ymirjar_flamebearer : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -187,7 +187,7 @@ class mob_wrathbone_laborer : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 9abcc669f09..11614708d99 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -212,7 +212,7 @@ class boss_drakkari_colossus : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -289,7 +289,7 @@ class boss_drakkari_elemental : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -335,7 +335,7 @@ class boss_drakkari_elemental : public CreatureScript damage = 0; // to prevent spell spaming - if (me->HasUnitState(UNIT_STAT_CHARGING)) + if (me->HasUnitState(UNIT_STATE_CHARGING)) return; // not sure about this, the idea of this code is to prevent bug the elemental diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index 46070090063..daa5ee86483 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -148,7 +148,7 @@ public: DoScriptText(SAY_TRANSFORM_1, me); uiTransformationTimer = 5*IN_MILLISECONDS; bStartOfTransformation = true; - me->ClearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); + me->ClearUnitState(UNIT_STATE_STUNNED|UNIT_STATE_ROOT); me->SetReactState(REACT_AGGRESSIVE); } else @@ -158,7 +158,7 @@ public: if (bStartOfTransformation) { bStartOfTransformation = false; - me->AddUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); + me->AddUnitState(UNIT_STATE_STUNNED|UNIT_STATE_ROOT); me->SetReactState(REACT_PASSIVE); } } @@ -191,7 +191,7 @@ public: DoScriptText(SAY_TRANSFORM_2, me); uiTransformationTimer = 9*IN_MILLISECONDS; bStartOfTransformation = true; - me->ClearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); + me->ClearUnitState(UNIT_STATE_STUNNED|UNIT_STATE_ROOT); me->SetReactState(REACT_AGGRESSIVE); } else @@ -201,7 +201,7 @@ public: if (bStartOfTransformation) { bStartOfTransformation = false; - me->AddUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); + me->AddUnitState(UNIT_STATE_STUNNED|UNIT_STATE_ROOT); me->SetReactState(REACT_PASSIVE); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 94a3da2672b..ca86e4cef60 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -287,7 +287,7 @@ class boss_blood_council_controller : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -535,7 +535,7 @@ class boss_prince_keleseth_icc : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -753,7 +753,7 @@ class boss_prince_taldaram_icc : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -990,7 +990,7 @@ class boss_prince_valanar_icc : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -1179,7 +1179,7 @@ class npc_ball_of_flame : public CreatureScript if (Player* target = ObjectAccessor::GetPlayer(*me, _chaseGUID)) { // need to clear states now because this call is before AuraEffect is fully removed - me->ClearUnitState(UNIT_STAT_CASTING | UNIT_STAT_STUNNED); + me->ClearUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED); if (target && me->Attack(target, true)) me->GetMotionMaster()->MoveChase(target, 1.0f); } @@ -1316,7 +1316,7 @@ class npc_dark_nucleus : public CreatureScript } DoCast(who, SPELL_SHADOW_RESONANCE_RESIST); - me->ClearUnitState(UNIT_STAT_CASTING); + me->ClearUnitState(UNIT_STATE_CASTING); } void MoveInLineOfSight(Unit* who) @@ -1350,7 +1350,7 @@ class npc_dark_nucleus : public CreatureScript !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID())) { DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST); - me->ClearUnitState(UNIT_STAT_CASTING); + me->ClearUnitState(UNIT_STATE_CASTING); } } else @@ -1369,7 +1369,7 @@ class npc_dark_nucleus : public CreatureScript _lockedTarget = true; AttackStart(victim); DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST); - me->ClearUnitState(UNIT_STAT_CASTING); + me->ClearUnitState(UNIT_STATE_CASTING); } } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index d775e5778f7..79a577f6591 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -321,7 +321,7 @@ class boss_blood_queen_lana_thel : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 31b3786a360..ace5f07a2f8 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -403,7 +403,7 @@ class boss_deathbringer_saurfang : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index f90bc5d445e..a97c6f7d138 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -169,7 +169,7 @@ class boss_festergut : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -305,7 +305,7 @@ class npc_stinky_icc : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 739df319117..6edf3fe300b 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -410,7 +410,7 @@ class boss_lady_deathwhisper : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) + if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -665,7 +665,7 @@ class npc_cult_fanatic : public CreatureScript Events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = Events.ExecuteEvent()) @@ -743,7 +743,7 @@ class npc_cult_adherent : public CreatureScript Events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = Events.ExecuteEvent()) @@ -888,7 +888,7 @@ class npc_darnavan : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (_canShatter && me->getVictim() && me->getVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL)) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 04ae6f933d8..c05422cbbf6 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -153,7 +153,7 @@ class boss_lord_marrowgar : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index cf22338995b..a4c814e5789 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -519,7 +519,7 @@ class boss_professor_putricide : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -796,7 +796,7 @@ class spell_putricide_ooze_channel : public SpellScriptLoader void StartAttack() { - GetCaster()->ClearUnitState(UNIT_STAT_CASTING); + GetCaster()->ClearUnitState(UNIT_STATE_CASTING); GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index a4cd96aa9f6..9649b6c8ef8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -169,7 +169,7 @@ class boss_rotface : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -384,7 +384,7 @@ class npc_precious_icc : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 3d3eaa1cc87..bab58094468 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -379,7 +379,7 @@ class boss_sindragosa : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -663,7 +663,7 @@ class npc_spinestalker : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -783,7 +783,7 @@ class npc_rimefang : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -911,7 +911,7 @@ class npc_sindragosa_trash : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 5029dbcceee..f3750f38dd5 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -701,7 +701,7 @@ class boss_the_lich_king : public CreatureScript summon->CastSpell(summon, SPELL_ICE_SPHERE, false); summon->CastSpell(summon, SPELL_ICE_BURST_TARGET_SEARCH, false); summon->CastSpell(target, SPELL_ICE_PULSE, false); - summon->ClearUnitState(UNIT_STAT_CASTING); + summon->ClearUnitState(UNIT_STATE_CASTING); summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f); } else @@ -861,7 +861,7 @@ class boss_the_lich_king : public CreatureScript events.Update(diff); // during Remorseless Winter phases The Lich King is channeling a spell, but we must continue casting other spells - if (me->HasUnitState(UNIT_STAT_CASTING) && !(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK)) + if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -966,14 +966,14 @@ class boss_the_lich_king : public CreatureScript break; case EVENT_QUAKE: events.SetPhase(PHASE_TWO); - me->ClearUnitState(UNIT_STAT_CASTING); // clear state to ensure check in DoCastAOE passes + me->ClearUnitState(UNIT_STATE_CASTING); // clear state to ensure check in DoCastAOE passes DoCastAOE(SPELL_QUAKE); SendMusicToPlayers(MUSIC_SPECIAL); Talk(SAY_LK_QUAKE); break; case EVENT_QUAKE_2: events.SetPhase(PHASE_THREE); - me->ClearUnitState(UNIT_STAT_CASTING); // clear state to ensure check in DoCastAOE passes + me->ClearUnitState(UNIT_STATE_CASTING); // clear state to ensure check in DoCastAOE passes DoCastAOE(SPELL_QUAKE); SendMusicToPlayers(MUSIC_SPECIAL); Talk(SAY_LK_QUAKE); @@ -1059,7 +1059,7 @@ class boss_the_lich_king : public CreatureScript break; case EVENT_OUTRO_RAISE_DEAD: DoCastAOE(SPELL_RAISE_DEAD); - me->ClearUnitState(UNIT_STAT_CASTING); + me->ClearUnitState(UNIT_STATE_CASTING); SendMusicToPlayers(MUSIC_FINAL); break; case EVENT_OUTRO_TALK_5: @@ -1071,7 +1071,7 @@ class boss_the_lich_king : public CreatureScript Talk(SAY_LK_OUTRO_6); if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) tirion->SetFacingToObject(me); - me->ClearUnitState(UNIT_STAT_CASTING); + me->ClearUnitState(UNIT_STATE_CASTING); DoCastAOE(SPELL_SUMMON_BROKEN_FROSTMOURNE_3); SetEquipmentSlots(false, EQUIP_UNEQUIP); break; @@ -1255,7 +1255,7 @@ class npc_tirion_fordring_tft : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -1349,7 +1349,7 @@ class npc_shambling_horror_icc : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -1429,7 +1429,7 @@ class npc_raging_spirit : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -1498,7 +1498,7 @@ class npc_valkyr_shadowguard : public CreatureScript _events.Reset(); DoCastAOE(SPELL_EJECT_ALL_PASSENGERS); me->GetMotionMaster()->MoveTargetedHome(); - me->ClearUnitState(UNIT_STAT_EVADE); + me->ClearUnitState(UNIT_STATE_EVADE); } } @@ -1564,7 +1564,7 @@ class npc_valkyr_shadowguard : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 96072ad0e83..e0993178890 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -426,7 +426,7 @@ class boss_valithria_dreamwalker : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -626,7 +626,7 @@ class npc_the_lich_king_controller : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -741,7 +741,7 @@ class npc_risen_archmage : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -807,7 +807,7 @@ class npc_blazing_skeleton : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -873,7 +873,7 @@ class npc_suppresser : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; // this code will never be reached while channeling @@ -967,7 +967,7 @@ class npc_gluttonous_abomination : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 6bd8f3cba7d..112e23c4691 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -611,7 +611,7 @@ class npc_rotting_frost_giant : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -874,7 +874,7 @@ class boss_sister_svalna : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -1130,7 +1130,7 @@ class npc_crok_scourgebane : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) @@ -1353,7 +1353,7 @@ class npc_captain_arnath : public CreatureScript Events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = Events.ExecuteEvent()) @@ -1434,7 +1434,7 @@ class npc_captain_brandon : public CreatureScript Events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = Events.ExecuteEvent()) @@ -1502,7 +1502,7 @@ class npc_captain_grondel : public CreatureScript Events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = Events.ExecuteEvent()) @@ -1567,7 +1567,7 @@ class npc_captain_rupert : public CreatureScript Events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = Events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index 95f07ac212a..058c5b35e3a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -137,7 +137,7 @@ class boss_faerlina : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 2964cb5a699..47151ef6d80 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -342,7 +342,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 4c0efc4ac98..26e4b33ad8a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -400,7 +400,7 @@ class boss_gothik : public CreatureScript instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); } - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index f70f36e77a3..161c9160293 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -486,7 +486,7 @@ public: else uiGuardiansOfIcecrownTimer -= diff; } - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (uint32 eventId = events.GetEvent()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index be9168c6fd4..acdb2355841 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -248,7 +248,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 052fa3ba4a5..6dfa62df2d1 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -523,7 +523,7 @@ public: return; // We can't cast if we are casting already. - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp index fe00f5b97d8..bb75b789fff 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp @@ -95,7 +95,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp index b86e04f55bb..ab814a2ca22 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp @@ -200,7 +200,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 28b606c19e1..8de2945af30 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -101,7 +101,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) 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 2c7532fcf70..eadc524348b 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 @@ -283,7 +283,7 @@ class boss_steelbreaker : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -404,7 +404,7 @@ class boss_runemaster_molgeim : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -649,7 +649,7 @@ class boss_stormcaller_brundir : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 10ff3db96c7..1c478cd83e9 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -217,7 +217,7 @@ class boss_auriaya : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -348,7 +348,7 @@ class npc_sanctum_sentry : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -418,7 +418,7 @@ class npc_feral_defender : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index d96790c3e37..47f74b1ddba 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -384,7 +384,7 @@ class boss_flame_leviathan : public CreatureScript return; } - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -425,7 +425,7 @@ class boss_flame_leviathan : public CreatureScript break; case EVENT_REPAIR: me->MonsterTextEmote(EMOTE_REPAIR, 0, true); - me->ClearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT); + me->ClearUnitState(UNIT_STATE_STUNNED | UNIT_STATE_ROOT); events.ScheduleEvent(EVENT_SHUTDOWN, 150*IN_MILLISECONDS); events.CancelEvent(EVENT_REPAIR); break; @@ -1576,7 +1576,7 @@ class spell_systems_shutdown : public SpellScriptLoader return; //! This could probably in the SPELL_EFFECT_SEND_EVENT handler too: - owner->AddUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT); + owner->AddUnitState(UNIT_STATE_STUNNED | UNIT_STATE_ROOT); owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); owner->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index f62c2d6c596..1f4fc8d3938 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -401,7 +401,7 @@ class boss_freya : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -739,7 +739,7 @@ class boss_elder_brightleaf : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -872,7 +872,7 @@ class boss_elder_stonebark : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -985,7 +985,7 @@ class boss_elder_ironbranch : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 0013a970380..c7918f85245 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -138,7 +138,7 @@ class boss_general_vezax : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -336,7 +336,7 @@ class boss_saronite_animus : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 918a401143a..33f50d0b3de 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -370,7 +370,7 @@ class boss_hodir : public CreatureScript me->StopMoving(); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); - me->SetControlled(true, UNIT_STAT_STUNNED); + me->SetControlled(true, UNIT_STATE_STUNNED); me->CombatStop(true); me->setFaction(35); @@ -387,7 +387,7 @@ class boss_hodir : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -612,12 +612,12 @@ class npc_hodir_priest : public CreatureScript void UpdateAI(uint32 const diff) { - if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) + if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) return; events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (HealthBelowPct(30)) @@ -688,12 +688,12 @@ class npc_hodir_shaman : public CreatureScript void UpdateAI(uint32 const diff) { - if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) + if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) return; events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -750,12 +750,12 @@ class npc_hodir_druid : public CreatureScript void UpdateAI(uint32 const diff) { - if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) + if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) return; events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -825,12 +825,12 @@ class npc_hodir_mage : public CreatureScript void UpdateAI(uint32 const diff) { - if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) + if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) return; events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index e72cf395a0d..d8a3ef0b8df 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -202,7 +202,7 @@ class boss_ignis : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 1fd8430abd8..a156e6ef08b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -224,7 +224,7 @@ class boss_kologarn : public CreatureScript summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_VISUAL, true); summon->SetReactState(REACT_PASSIVE); // One of the above spells is a channeled spell, we need to clear this unit state for MoveChase to work - summon->ClearUnitState(UNIT_STAT_CASTING); + summon->ClearUnitState(UNIT_STATE_CASTING); // Victim gets 67351 if (eyebeamTarget) @@ -244,7 +244,7 @@ class boss_kologarn : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 8f09ab26a0a..724eb45d586 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -263,7 +263,7 @@ class boss_xt002 : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 0c59097a9ec..43a848c6b16 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -229,7 +229,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index 94a133c78a6..8a6d7f80818 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -252,7 +252,7 @@ public: events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 5c1ec15030c..989e1e57453 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -535,7 +535,7 @@ public: void UpdateAI(const uint32 diff) { - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (paralyzeTimer <= diff) @@ -663,7 +663,7 @@ class npc_scourge_hulk : public CreatureScript if (mightyBlow <= diff) { if (Unit* victim = me->getVictim()) - if (!victim->HasUnitState(UNIT_STAT_STUNNED)) // Prevent knocking back a ritual player + if (!victim->HasUnitState(UNIT_STATE_STUNNED)) // Prevent knocking back a ritual player DoCast(victim, SPELL_MIGHTY_BLOW); mightyBlow = urand(12000, 17000); } diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp index 1cc681b0133..bffc6af2a3a 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp @@ -81,7 +81,7 @@ class boss_archavon : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -161,7 +161,7 @@ class mob_archavon_warder : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 973e7a2844c..2f4079d4e3c 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -120,7 +120,7 @@ class boss_emalon : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -221,7 +221,7 @@ class mob_tempest_minion : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (Aura const* overchargedAura = me->GetAura(SPELL_OVERCHARGED)) diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp index a545a6ae14c..dd9db1c0a99 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp @@ -79,7 +79,7 @@ class boss_koralon : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index 4b92b54b0d3..162f59fa5b7 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -80,7 +80,7 @@ class boss_toravon : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -148,7 +148,7 @@ class mob_frost_warder : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (events.ExecuteEvent() == EVENT_FROST_BLAST) diff --git a/src/server/scripts/Northrend/borean_tundra.cpp b/src/server/scripts/Northrend/borean_tundra.cpp index b6e01d3188e..11fb0933b9b 100644 --- a/src/server/scripts/Northrend/borean_tundra.cpp +++ b/src/server/scripts/Northrend/borean_tundra.cpp @@ -1328,7 +1328,7 @@ public: if (uiType != POINT_MOTION_TYPE) return; - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); me->CastSpell(me, SPELL_STUN, true); if (me->isSummon()) if (Unit* summoner = me->ToTempSummon()->GetSummoner()) @@ -1445,7 +1445,7 @@ public: DoScriptText(SAY_LERYSSA_1, pLeryssa); pArlos->Kill(pArlos, false); pLeryssa->RemoveAura(SPELL_STUN); - pLeryssa->ClearUnitState(UNIT_STAT_STUNNED); + pLeryssa->ClearUnitState(UNIT_STATE_STUNNED); pLeryssa->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); pLeryssa->GetMotionMaster()->MovePoint(0, 3722.114502f, 3564.201660f, 477.441437f); @@ -1495,7 +1495,7 @@ public: if (Creature* pTalbot = me->FindNearestCreature(NPC_PRINCE_VALANAR, 50.0f, true)) CAST_AI(npc_counselor_talbot::npc_counselor_talbotAI, pTalbot->GetAI())->bCheck = true; - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); me->CastSpell(me, SPELL_STUN, true); if (me->isSummon()) diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp index a8d1f22bd00..d359917ab28 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp @@ -82,7 +82,7 @@ public: summoned->CastSpell(summoned, SPELL_FOCUS_FIRE_VISUAL, false); summoned->setFaction(me->getFaction()); summoned->SetLevel(me->getLevel()); - summoned->AddUnitState(UNIT_STAT_ROOT); + summoned->AddUnitState(UNIT_STATE_ROOT); if (Unit* pFocusedTarget = Unit::GetUnit(*me, FocusedTargetGUID)) summoned->AI()->AttackStart(pFocusedTarget); diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index 71e773042b7..ecea5e6abb4 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -337,7 +337,7 @@ class boss_vazruden_the_herald : public CreatureScript VazrudenGUID = 0; } summoned = false; - me->ClearUnitState(UNIT_STAT_ROOT); + me->ClearUnitState(UNIT_STATE_ROOT); me->SetVisible(true); } } @@ -352,7 +352,7 @@ class boss_vazruden_the_herald : public CreatureScript NazanGUID = Nazan->GetGUID(); summoned = true; me->SetVisible(false); - me->AddUnitState(UNIT_STAT_ROOT); + me->AddUnitState(UNIT_STATE_ROOT); } } diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index 1679efb5525..1f17e9e4802 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -253,7 +253,7 @@ class boss_magtheridon : public CreatureScript me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - me->AddUnitState(UNIT_STAT_STUNNED); + me->AddUnitState(UNIT_STATE_STUNNED); DoCast(me, SPELL_SHADOW_CAGE_C, true); } @@ -334,7 +334,7 @@ class boss_magtheridon : public CreatureScript void AttackStart(Unit* who) { - if (!me->HasUnitState(UNIT_STAT_STUNNED)) + if (!me->HasUnitState(UNIT_STATE_STUNNED)) ScriptedAI::AttackStart(who); } @@ -388,7 +388,7 @@ class boss_magtheridon : public CreatureScript if (BlastNova_Timer <= diff) { // to avoid earthquake interruption - if (!me->HasUnitState(UNIT_STAT_STUNNED)) + if (!me->HasUnitState(UNIT_STATE_STUNNED)) { DoScriptText(EMOTE_BLASTNOVA, me); DoCast(me, SPELL_BLASTNOVA); @@ -431,7 +431,7 @@ class boss_magtheridon : public CreatureScript if (!Phase3 && HealthBelowPct(30) && !me->IsNonMeleeSpellCasted(false) // blast nova - && !me->HasUnitState(UNIT_STAT_STUNNED)) // shadow cage and earthquake + && !me->HasUnitState(UNIT_STATE_STUNNED)) // shadow cage and earthquake { Phase3 = true; DoScriptText(SAY_CHAMBER_DESTROY, me); diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp index 9d52a0a3e87..caaedc4c51b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -223,7 +223,7 @@ class instance_magtheridons_lair : public InstanceMapScript Creature* Magtheridon = instance->GetCreature(MagtheridonGUID); if (Magtheridon && Magtheridon->isAlive()) { - Magtheridon->ClearUnitState(UNIT_STAT_STUNNED); + Magtheridon->ClearUnitState(UNIT_STATE_STUNNED); Magtheridon->AI()->AttackStart(Magtheridon->SelectNearestTarget(999)); } CageTimer = 0; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 982b8372b7c..7a60b1545d0 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -397,7 +397,7 @@ class boss_kaelthas : public CreatureScript void MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STAT_STUNNED) && me->canCreatureAttack(who)) + if (!me->HasUnitState(UNIT_STATE_STUNNED) && me->canCreatureAttack(who)) { if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp index 4a83181159c..2f6e0823da1 100644 --- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp +++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp @@ -110,7 +110,7 @@ class boss_doomlord_kazzak : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp index 883601632b8..c4bd232cc85 100644 --- a/src/server/scripts/Outland/boss_doomwalker.cpp +++ b/src/server/scripts/Outland/boss_doomwalker.cpp @@ -103,7 +103,7 @@ class boss_doomwalker : public CreatureScript _events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = _events.ExecuteEvent()) diff --git a/src/server/scripts/Outland/nagrand.cpp b/src/server/scripts/Outland/nagrand.cpp index c27ad8e7948..668db2efcbb 100644 --- a/src/server/scripts/Outland/nagrand.cpp +++ b/src/server/scripts/Outland/nagrand.cpp @@ -632,7 +632,7 @@ public: if (!UpdateVictim()) return; - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (ChainLightningTimer <= diff) diff --git a/src/server/scripts/Outland/netherstorm.cpp b/src/server/scripts/Outland/netherstorm.cpp index efebf7dfe94..79811069402 100644 --- a/src/server/scripts/Outland/netherstorm.cpp +++ b/src/server/scripts/Outland/netherstorm.cpp @@ -796,7 +796,7 @@ public: Materialize = true; } - if (me->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) || me->HasUnitState(UNIT_STAT_ROOT)) // if the mob is rooted/slowed by spells eg.: Entangling Roots, Frost Nova, Hamstring, Crippling Poison, etc. => remove it + if (me->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) || me->HasUnitState(UNIT_STATE_ROOT)) // if the mob is rooted/slowed by spells eg.: Entangling Roots, Frost Nova, Hamstring, Crippling Poison, etc. => remove it DoCast(me, SPELL_PHASE_SLIP); if (!UpdateVictim()) diff --git a/src/server/scripts/Outland/shadowmoon_valley.cpp b/src/server/scripts/Outland/shadowmoon_valley.cpp index e4c4e020b0f..07de7fe4786 100644 --- a/src/server/scripts/Outland/shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/shadowmoon_valley.cpp @@ -1195,7 +1195,7 @@ public: AggroTargetGUID = 0; Timers = false; - me->AddUnitState(UNIT_STAT_ROOT); + me->AddUnitState(UNIT_STATE_ROOT); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetTarget(0); } @@ -1239,7 +1239,7 @@ public: if (Player* AggroTarget = (Unit::GetPlayer(*me, AggroTargetGUID))) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->ClearUnitState(UNIT_STAT_ROOT); + me->ClearUnitState(UNIT_STATE_ROOT); float x, y, z; AggroTarget->GetPosition(x, y, z); diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index d266b42f50a..d3e484d80ab 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -224,7 +224,7 @@ public: { Unit* target = GetTarget(); target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - target->AddUnitState(UNIT_STAT_ROOT); + target->AddUnitState(UNIT_STATE_ROOT); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 9deecea01ba..9f652e7a859 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -144,7 +144,7 @@ struct emerald_dragonAI : public WorldBossAI events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 9227c0c1138..fcf5f56c539 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1910,7 +1910,7 @@ public: Unit* owner = me->GetCharmerOrOwner(); me->CombatStop(true); - if (owner && !me->HasUnitState(UNIT_STAT_FOLLOW)) + if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) { me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); @@ -2069,7 +2069,7 @@ public: void Reset() { - me->SetControlled(true, UNIT_STAT_STUNNED);//disable rotate + me->SetControlled(true, UNIT_STATE_STUNNED);//disable rotate me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);//imune to knock aways like blast wave ResetTimer = 5000; @@ -2101,8 +2101,8 @@ public: if (!UpdateVictim()) return; - if (!me->HasUnitState(UNIT_STAT_STUNNED)) - me->SetControlled(true, UNIT_STAT_STUNNED);//disable rotate + if (!me->HasUnitState(UNIT_STATE_STUNNED)) + me->SetControlled(true, UNIT_STATE_STUNNED);//disable rotate if (Entry != NPC_ADVANCED_TARGET_DUMMY && Entry != NPC_TARGET_DUMMY) { @@ -2203,7 +2203,7 @@ public: if (!UpdateVictim()) return; - if (me->HasUnitState(UNIT_STAT_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (FireShield_Timer <= diff) -- cgit v1.2.3 From 3d14384c32971096b49f88ff785d92879480af76 Mon Sep 17 00:00:00 2001 From: kaelima Date: Wed, 30 May 2012 08:01:02 +0200 Subject: Merge git://github.com/TrinityCore/TrinityCore into 4.x Conflicts: dep/PackageList.txt sql/base/auth_database.sql src/server/authserver/Server/AuthSocket.cpp src/server/game/Battlegrounds/BattlegroundMgr.cpp src/server/game/Chat/Commands/Level1.cpp src/server/game/Chat/Commands/Level3.cpp src/server/game/DataStores/DBCEnums.h src/server/game/DataStores/DBCStores.cpp src/server/game/DataStores/DBCStores.h src/server/game/DataStores/DBCStructure.h src/server/game/DataStores/DBCfmt.h src/server/game/Entities/Corpse/Corpse.cpp src/server/game/Entities/Creature/Creature.cpp src/server/game/Entities/DynamicObject/DynamicObject.cpp src/server/game/Entities/GameObject/GameObject.cpp src/server/game/Entities/Item/Item.cpp src/server/game/Entities/Object/Object.cpp src/server/game/Entities/Object/Updates/UpdateData.h src/server/game/Entities/Pet/Pet.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Player/Player.h src/server/game/Entities/Transport/Transport.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Globals/ObjectMgr.h src/server/game/Guilds/Guild.cpp src/server/game/Handlers/CharacterHandler.cpp src/server/game/Handlers/MiscHandler.cpp src/server/game/Handlers/MovementHandler.cpp src/server/game/Handlers/QuestHandler.cpp src/server/game/Loot/LootMgr.cpp src/server/game/Miscellaneous/SharedDefines.h src/server/game/Quests/QuestDef.cpp src/server/game/Server/Protocol/Opcodes.cpp src/server/game/Server/Protocol/Opcodes.h src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSocket.cpp src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/Spell.cpp src/server/game/Spells/Spell.h src/server/game/Spells/SpellEffects.cpp src/server/game/Tickets/TicketMgr.cpp src/server/scripts/Commands/cs_gps.cpp src/server/scripts/Commands/cs_modify.cpp src/server/shared/Database/Implementation/CharacterDatabase.cpp src/server/shared/Logging/Log.h src/tools/map_extractor/CMakeLists.txt src/tools/map_extractor/System.cpp src/tools/map_extractor/mpq_libmpq04.h src/tools/vmap4_extractor/CMakeLists.txt --- PreLoad.cmake | 2 +- cmake/compiler/gcc/settings.cmake | 12 +- cmake/compiler/icc/settings.cmake | 11 +- cmake/compiler/msvc/settings.cmake | 7 +- cmake/genrev.cmake | 2 +- cmake/macros/CheckBuildDir.cmake | 2 +- cmake/options.cmake | 3 +- cmake/platform/unix/settings.cmake | 4 +- cmake/showoptions.cmake | 13 +- contrib/conf_merge/tc-conf-merger.pl | 2 +- dep/CMakeLists.txt | 4 +- dep/PackageList.txt | 8 +- dep/SFMT/SFMT.h | 51 +- dep/SFMT/randomc.h | 2 +- dep/mersennetwister/MersenneTwister.h | 405 - doc/UnixInstall.txt | 2 +- revision.h.in.cmake | 2 +- sql/base/auth_database.sql | 89 +- sql/base/characters_database.sql | 8 +- sql/old/3.3.5a/2012_02_13_00_world_version.sql | 1 + ...12_02_14_00_world_achievement_criteria_data.sql | 7 + .../3.3.5a/2012_02_15_00_world_quest_template.sql | 1 + .../2012_02_15_01_world_areatrigger_tavern.sql | 13 + .../3.3.5a/2012_02_15_02_world_item_template.sql | 3 + .../3.3.5a/2012_02_15_03_world_quest_template.sql | 18 + .../3.3.5a/2012_02_15_04_world_quest_template.sql | 17 + ...12_02_15_06_world_creature_involvedrelation.sql | 3 + sql/old/3.3.5a/2012_02_15_07_00_world_creature.sql | 57 + .../2012_02_15_07_01_world_waypoint_data.sql | 147 + sql/old/3.3.5a/2012_02_15_07_02_world_misc.sql | 120 + sql/old/3.3.5a/2012_02_15_08_world_sai.sql | 9 + .../2012_02_15_09_world_spell_proc_event.sql | 6 + sql/old/3.3.5a/2012_02_16_00_world_conditions.sql | 12800 +++++++++++++++++++ sql/old/3.3.5a/2012_02_16_01_world_conditions.sql | 3 + sql/old/3.3.5a/2012_02_17_00_world_waypoints.sql | 77 + .../2012_02_18_00_world_spell_script_names.sql | 69 + sql/old/3.3.5a/2012_02_18_01_world_spell_dbc.sql | 3 + sql/old/3.3.5a/2012_02_18_02_world_gossip.sql | 52 + sql/old/3.3.5a/2012_02_18_03_world_gossip.sql | 1068 ++ .../2012_02_18_04_world_spell_script_names.sql | 6 + sql/old/3.3.5a/2012_02_18_05_world_creatures.sql | 3 + sql/old/3.3.5a/2012_02_18_06_world_gossip.sql | 166 + sql/old/3.3.5a/2012_02_18_07_world_gossip.sql | 44 + sql/old/3.3.5a/2012_02_18_08_world_gossip.sql | 5 + sql/old/3.3.5a/2012_02_19_00_auth_account.sql | 2 + .../2012_02_19_00_characters_warden_action.sql | 7 + .../3.3.5a/2012_02_19_00_world_quest_template.sql | 14 + .../3.3.5a/2012_02_19_01_world_quest_template.sql | 11 + sql/old/3.3.5a/2012_02_19_02_world_gameobject.sql | 4 + .../3.3.5a/2012_02_19_03_world_warden_checks.sql | 802 ++ .../3.3.5a/2012_02_19_04_world_misc_db_updates.sql | 21 + .../3.3.5a/2012_02_19_05_world_creature_text.sql | 7 + .../3.3.5a/2012_02_19_06_world_creature_text.sql | 20 + sql/old/3.3.5a/2012_02_20_00_world_sai.sql | 4 + sql/old/3.3.5a/2012_02_20_01_world_gossip.sql | 8 + sql/old/3.3.5a/2012_02_20_02_world_conditons.sql | 277 + .../2012_02_21_00_world_creature_loot_template.sql | 78 + sql/old/3.3.5a/2012_02_21_01_world_conditions.sql | 3592 ++++++ .../2012_02_21_02_world_creature_loot_template.sql | 11 + .../2012_02_21_03_world_creature_loot_template.sql | 26 + .../2012_02_21_04_world_creature_loot_template.sql | 16 + sql/old/3.3.5a/2012_02_21_05_world_gossip.sql | 39 + sql/old/3.3.5a/2012_02_21_06_world_Gossip.sql | 184 + sql/old/3.3.5a/2012_02_22_00_world_sai.sql | 39 + .../3.3.5a/2012_02_22_01_world_creature_text.sql | 34 + sql/old/3.3.5a/2012_02_22_02_world_misc.sql | 57 + sql/old/3.3.5a/2012_02_22_03_world_conditions.sql | 3 + .../2012_02_23_00_world_spell_script_names.sql | 7 + ...012_02_24_00_world_gameobject_loot_template.sql | 10 + sql/old/3.3.5a/2012_02_24_01_world_sai.sql | 44 + .../2012_02_25_00_world_spell_script_names.sql | 1 + sql/old/3.3.5a/2012_02_25_01_world_command.sql | 6 + sql/old/3.3.5a/2012_02_25_01_world_misc.sql | 11 + sql/old/3.3.5a/2012_02_25_02_world_sai.sql | 28 + sql/old/3.3.5a/2012_02_26_00_world_misc.sql | 13 + .../2012_02_26_01_world_spell_script_names.sql | 4 + .../2012_02_27_00_world_creature_template.sql | 8 + .../2012_02_28_00_world_wintergrasp_spawns.sql | 366 + .../3.3.5a/2012_02_29_00_world_conditions_misc.sql | 126 + sql/old/3.3.5a/2012_02_29_01_world_conditions.sql | 5 + sql/old/3.3.5a/2012_02_29_02_world_conditions.sql | 5 + .../3.3.5a/2012_02_29_03_world_creature_text.sql | 18 + .../3.3.5a/2012_02_29_04_world_creature_text.sql | 11 + .../3.3.5a/2012_02_29_05_world_creature_text.sql | 15 + sql/old/3.3.5a/2012_03_01_00_world_conditions.sql | 5 + .../3.3.5a/2012_03_01_01_world_creature_text.sql | 15 + .../2012_03_01_02_world_locales_creature_text.sql | 15 + sql/old/3.3.5a/2012_03_03_00_world_command.sql | 9 + sql/old/3.3.5a/2012_03_04_00_world_misc.sql | 13 + .../2012_03_04_01_world_areatrigger_scripts.sql | 7 + sql/old/3.3.5a/2012_03_06_00_world_commands.sql | 3 + sql/old/3.3.5a/2012_03_06_01_world_misc.sql | 4 + .../2012_03_06_02_world_queststatus_seasonal.sql | 1 + .../3.3.5a/2012_03_06_03_world_smart_scripts.sql | 17 + .../3.3.5a/2012_03_06_04_world_creature_text.sql | 6 + .../3.3.5a/2012_03_07_00_world_trinity_string.sql | 3 + sql/old/3.3.5a/2012_03_10_00_world_creature.sql | 21 + .../3.3.5a/2012_03_10_00_world_smart_scripts.sql | 129 + .../3.3.5a/2012_03_10_00_world_waypoint_data.sql | 25 + sql/old/3.3.5a/2012_03_11_00_world_sai.sql | 60 + .../2012_03_12_00_world_creature_template.sql | 1 + sql/old/3.3.5a/2012_03_12_01_world_conditions.sql | 3 + sql/old/3.3.5a/2012_03_12_01_world_gameobject.sql | 4 + .../2012_03_12_01_world_spell_script_names.sql | 3 + .../3.3.5a/2012_03_14_00_world_creature_addon.sql | 2 + .../3.3.5a/2012_03_19_00_world_smart_scripts.sql | 21 + sql/old/3.3.5a/2012_03_20_00_world_gossip.sql | 88 + sql/old/3.3.5a/2012_03_21_00_world_creature.sql | 71 + .../2012_03_22_00_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_03_22_01_world_conditions.sql | 2 + sql/old/3.3.5a/2012_03_23_00_world_ip2nation.sql | 21 + sql/old/3.3.5a/2012_03_24_00_world_misc.sql | 22 + .../2012_03_24_01_world_creature_loot_template.sql | 290 + .../2012_03_24_02_world_creature_loot_template.sql | 136 + sql/old/3.3.5a/2012_03_25_00_auth_misc.sql | 8 + sql/old/3.3.5a/2012_03_25_00_world_game_event.sql | 4 + sql/old/3.3.5a/2012_03_26_00_auth_realmlist.sql | 2 + .../2012_03_26_00_world_creature_template.sql | 73 + .../2012_03_26_01_world_spell_script_names.sql | 4 + sql/old/3.3.5a/2012_03_27_00_world_misc.sql | 49 + sql/old/3.3.5a/2012_03_27_01_world_misc.sql | 15 + sql/old/3.3.5a/2012_03_27_02_world_misc.sql | 78 + sql/old/3.3.5a/2012_03_27_03_world_misc.sql | 59 + sql/old/3.3.5a/2012_03_27_04_world_misc.sql | 3 + sql/old/3.3.5a/2012_03_28_00_auth_account.sql | 13 + .../3.3.5a/2012_03_28_01_auth_account_access.sql | 3 + .../2012_03_28_01_world_spell_bonus_data.sql | 2 + .../3.3.5a/2012_03_28_02_auth_account_banned.sql | 4 + sql/old/3.3.5a/2012_03_28_03_auth_ip_banned.sql | 2 + sql/old/3.3.5a/2012_03_28_04_auth_logs.sql | 5 + .../3.3.5a/2012_03_28_05_auth_realmcharacters.sql | 4 + sql/old/3.3.5a/2012_03_28_06_auth_realmlist.sql | 6 + sql/old/3.3.5a/2012_03_28_07_auth_uptime.sql | 6 + .../3.3.5a/2012_03_30_00_world_smart_scripts.sql | 94 + .../2012_03_31_00_world_creature_loot_template.sql | 191 + sql/old/3.3.5a/2012_04_01_00_auth_realmlist.sql | 1 + sql/old/3.3.5a/2012_04_01_00_world_creature.sql | 17 + .../2012_04_01_00_world_spell_script_names.sql | 6 + sql/old/3.3.5a/2012_04_01_01_world_creature.sql | 26 + ...2012_04_01_02_world_spell_group_stack_rules.sql | 9 + sql/old/3.3.5a/2012_04_01_03_world_trainers.sql | 83 + sql/old/3.3.5a/2012_04_01_04_world_conditions.sql | 5 + .../2012_04_01_05_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_04_01_06_world_sai.sql | 7 + sql/old/3.3.5a/2012_04_01_07_world_misc.sql | 4 + .../2012_04_03_00_world_spell_script_names.sql | 3 + sql/old/3.3.5a/2012_04_04_00_auth_realmlist.sql | 1 + sql/old/3.3.5a/2012_04_04_00_world_conditions.sql | 7 + sql/old/3.3.5a/2012_04_04_01_world_spell_dbc.sql | 1 + .../2012_04_05_00_world_gameobject_template.sql | 32 + .../2012_04_05_00_world_spell_script_names.sql | 6 + .../2012_04_05_01_world_spell_proc_event.sql | 2 + .../2012_04_06_00_world_spell_proc_event.sql | 1 + sql/old/3.3.5a/2012_04_06_01_world_spell_dbc.sql | 3 + .../2012_04_06_02_world_gameobject_template.sql | 4 + sql/old/3.3.5a/2012_04_06_03_world_spell_dbc.sql | 3 + sql/old/3.3.5a/2012_04_06_04_world_page_text.sql | 25 + .../2012_04_07_00_characters_lag_reports.sql | 2 + sql/old/3.3.5a/2012_04_07_00_world_gameobject.sql | 5 + sql/old/3.3.5a/2012_04_07_01_world_game_event.sql | 2 + .../2012_04_07_02_world_spell_proc_event.sql | 1 + .../2012_04_08_00_world_spell_script_names.sql | 3 + .../2012_04_08_01_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_04_08_02_world_spell_dbc.sql | 3 + .../2012_04_08_02_world_spell_script_names.sql | 6 + .../2012_04_08_03_world_spell_script_names.sql | 3 + .../2012_04_12_00_world_creature_template.sql | 2 + .../2012_04_12_01_world_creature_template.sql | 6 + .../2012_04_12_02_world_spell_bonus_data.sql | 29 + .../2012_04_12_03_world_spell_bonus_data.sql | 8 + .../2012_04_12_04_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_04_12_05_world_command.sql | 2 + sql/old/3.3.5a/2012_04_13_00_world_sai.sql | 25 + sql/old/3.3.5a/2012_04_13_01_world_misc.sql | 219 + sql/old/3.3.5a/2012_04_13_02_world_misc.sql | 18 + sql/old/3.3.5a/2012_04_13_03_world_bg_template.sql | 7 + .../2012_04_13_04_world_spell_proc_event.sql | 4 + ...012_04_14_00_world_gameobject_loot_template.sql | 3 + ...012_04_14_01_world_gameobject_loot_template.sql | 11 + ...2012_04_14_02_world_creature_template_addon.sql | 3 + .../2012_04_14_03_world_spell_bonus_data.sql | 1 + .../2012_04_14_04_world_spell_proc_event.sql | 3 + .../2012_04_14_05_world_spell_proc_event.sql | 1 + sql/old/3.3.5a/2012_04_16_00_world_game_event.sql | 4 + sql/old/3.3.5a/2012_04_17_00_world_creature.sql | 28 + .../2012_04_18_00_world_npc_spellclick_spells.sql | 2 + sql/old/3.3.5a/2012_04_18_01_world_creature.sql | 1 + ...2012_04_18_02_world_reference_loot_template.sql | 377 + .../2012_04_18_03_world_creature_loot_template.sql | 2 + ..._04_18_04_world_pickpocketing_loot_template.sql | 501 + sql/old/3.3.5a/2012_04_18_05_world_conditions.sql | 4 + .../2012_04_18_06_world_creature_template.sql | 2 + .../2012_04_18_07_world_fishing_loot_template.sql | 2 + .../2012_04_18_08_world_creature_loot_template.sql | 22 + .../2012_04_19_00_world_creature_template.sql | 7 + ..._04_19_01_world_pickpocketing_loot_template.sql | 202 + .../2012_04_19_02_world_creature_loot_template.sql | 2 + .../3.3.5a/2012_04_19_03_world_instance_ulduar.sql | 174 + ...012_04_20_00_world_gameobject_loot_template.sql | 15 + .../2012_04_20_01_world_item_loot_template.sql | 10 + .../2012_04_20_02_world_creature_loot_template.sql | 4 + .../2012_04_20_03_world_creature_loot_template.sql | 7 + .../2012_04_20_04_world_creature_loot_template.sql | 3 + .../3.3.5a/2012_04_20_05_gameobject_template.sql | 8 + .../2012_04_21_00_world_spell_script_names.sql | 14 + sql/old/3.3.5a/2012_04_22_00_world_sai.sql | 63 + sql/old/3.3.5a/2012_04_23_00_world_creatures.sql | 12 + sql/old/3.3.5a/2012_04_23_01_world_conditions.sql | 5 + ...12_04_23_02_world_prospecting_loot_template.sql | 112 + .../2012_04_23_03_world_skinning_loot_template.sql | 44 + .../2012_04_23_04_world_creature_loot_template.sql | 2 + .../2012_04_23_05_world_creature_loot_template.sql | 3 + sql/old/3.3.5a/2012_04_24_00_world_command.sql | 10 + .../2012_04_24_01_world_spell_proc_event.sql | 4 + .../3.3.5a/2012_04_24_02_world_warden_checks.sql | 8 + .../2012_04_24_03_world_spell_script_names.sql | 4 + .../2012_04_24_04_world_spell_proc_event.sql | 4 + .../2012_04_24_05_world_creature_loot_template.sql | 9 + sql/old/3.3.5a/2012_04_24_06_world_misc.sql | 31 + sql/old/3.3.5a/2012_04_25_00_world_misc.sql | 3 + .../2012_04_25_01_world_spell_script_names.sql | 3 + .../2012_04_25_02_world_spell_script_names.sql | 11 + sql/old/3.3.5a/2012_04_25_03_world_spell_group.sql | 11 + sql/old/3.3.5a/2012_04_26_00_world_conditions.sql | 1 + .../3.3.5a/2012_04_26_01_world_smart_scripts.sql | 1 + .../3.3.5a/2012_04_27_00_world_instance_icc.sql | 5 + ...2012_04_28_00_world_reference_loot_template.sql | 158 + ...2012_04_28_01_world_reference_loot_template.sql | 22 + sql/old/3.3.5a/2012_05_01_00_world_creature.sql | 9 + .../2012_05_02_00_world_creature_loot_template.sql | 8 + sql/old/3.3.5a/2012_05_03_00_world_creature.sql | 29 + sql/old/3.3.5a/2012_05_03_01_world_cos_misc.sql | 153 + .../3.3.5a/2012_05_03_02_world_quest_template.sql | 28 + .../2012_05_03_03_world_creature_questrelation.sql | 2 + ...12_05_03_04_world_game_event_creature_quest.sql | 57 + sql/old/3.3.5a/2012_05_04_00_world_waypoints.sql | 137 + sql/old/3.3.5a/2012_05_04_01_world_sai.sql | 32 + sql/old/3.3.5a/2012_05_05_00_world_sai.sql | 205 + .../2012_05_05_01_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_05_05_02_world_gameobject.sql | 10 + sql/old/3.3.5a/2012_05_05_03_world_sai.sql | 17 + .../2012_05_05_04_world_creature_template.sql | 27 + .../2012_05_05_05_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_05_05_06_world_sai.sql | 13 + .../2012_05_06_00_world_creature_template.sql | 5 + .../2012_05_06_01_world_creature_template.sql | 11 + sql/old/3.3.5a/2012_05_07_00_world_waypoints.sql | 73 + sql/old/3.3.5a/2012_05_07_01_world_sai.sql | 51 + sql/old/3.3.5a/2012_05_08_00_world_sai.sql | 89 + sql/old/3.3.5a/2012_05_08_01_world_gameobject.sql | 5 + sql/old/3.3.5a/2012_05_08_01_world_misc.sql | 9 + .../2012_05_09_00_world_spell_target_position.sql | 7 + sql/old/3.3.5a/2012_05_09_01_world_commands.sql | 8 + sql/old/3.3.5a/2012_05_09_02_world_sai.sql | 116 + sql/old/3.3.5a/2012_05_09_03_world_misc.sql | 56 + sql/old/3.3.5a/2012_05_10_00_world_sai.sql | 42 + sql/old/3.3.5a/2012_05_10_01_world_misc.sql | 37 + .../2012_05_10_02_world_creature_template.sql | 2 + sql/old/3.3.5a/2012_05_10_03_world_misc.sql | 129 + sql/old/3.3.5a/2012_05_10_04_world_ceature_sai.sql | 14 + sql/old/3.3.5a/2012_05_10_05_world_waypoints.sql | 88 + sql/old/3.3.5a/2012_05_10_06_world_waypoints.sql | 40 + sql/old/3.3.5a/2012_05_11_00_world_waypoints.sql | 31 + .../2012_05_11_01_world_gameobject_template.sql | 4 + sql/old/3.3.5a/2012_05_11_02_world_conditions.sql | 23 + .../2012_05_12_00_world_gameobject_template.sql | 2 + .../2012_05_12_01_world_item_loot_template.sql | 92 + ...012_05_12_02_world_gameobject_loot_template.sql | 37 + .../3.3.5a/2012_05_13_00_world_creature_text.sql | 13 + .../3.3.5a/2012_05_13_01_world_creature_text.sql | 14 + sql/old/3.3.5a/2012_05_16_00_world_scripts.sql | 2 + .../3.3.5a/2012_05_17_00_world_creature_text.sql | 7 + sql/old/3.3.5a/2012_05_18_00_world_conditions.sql | 3 + sql/old/3.3.5a/2012_05_18_01_world_misc.sql | 7 + .../2012_05_18_01_world_spell_target_position.sql | 9 + .../3.3.5a/2012_05_19_00_world_quest_template.sql | 2 + .../3.3.5a/2012_05_19_01_world_smart_scripts.sql | 7 + sql/old/3.3.5a/2012_05_19_02_world_misc.sql | 6 + sql/updates/auth/2012_02_19_00_auth_account.sql | 2 - .../2012_02_19_00_characters_warden_action.sql | 7 - sql/updates/world/2012_02_13_00_world_version.sql | 1 - ...12_02_14_00_world_achievement_criteria_data.sql | 7 - .../world/2012_02_15_00_world_quest_template.sql | 1 - .../2012_02_15_01_world_areatrigger_tavern.sql | 13 - .../world/2012_02_15_02_world_item_template.sql | 3 - .../world/2012_02_15_03_world_quest_template.sql | 18 - .../world/2012_02_15_04_world_quest_template.sql | 17 - ...12_02_15_06_world_creature_involvedrelation.sql | 3 - .../world/2012_02_15_07_00_world_creature.sql | 57 - .../world/2012_02_15_07_01_world_waypoint_data.sql | 147 - sql/updates/world/2012_02_15_07_02_world_misc.sql | 120 - sql/updates/world/2012_02_15_08_world_sai.sql | 9 - .../world/2012_02_15_09_world_spell_proc_event.sql | 6 - .../world/2012_02_16_00_world_conditions.sql | 12800 ------------------- .../world/2012_02_16_01_world_conditions.sql | 3 - .../world/2012_02_17_00_world_waypoints.sql | 77 - .../2012_02_18_00_world_spell_script_names.sql | 69 - .../world/2012_02_18_01_world_spell_dbc.sql | 3 - sql/updates/world/2012_02_18_02_world_gossip.sql | 52 - sql/updates/world/2012_02_18_03_world_gossip.sql | 1068 -- .../2012_02_18_04_world_spell_script_names.sql | 6 - .../world/2012_02_18_05_world_creatures.sql | 3 - sql/updates/world/2012_02_18_06_world_gossip.sql | 166 - sql/updates/world/2012_02_18_07_world_gossip.sql | 44 - sql/updates/world/2012_02_18_08_world_gossip.sql | 5 - .../world/2012_02_19_00_world_quest_template.sql | 14 - .../world/2012_02_19_01_world_quest_template.sql | 11 - .../world/2012_02_19_02_world_gameobject.sql | 4 - .../world/2012_02_19_03_world_warden_checks.sql | 802 -- .../world/2012_02_19_04_world_misc_db_updates.sql | 21 - sql/updates/world/2012_02_19_05_world_say_text.sql | 7 - sql/updates/world/2012_02_19_06_world_say_text.sql | 20 - sql/updates/world/2012_02_20_00_world_sai.sql | 4 - sql/updates/world/2012_02_20_01_world_misc_db.sql | 8 - .../world/2012_02_20_02_world_conditons.sql | 275 - .../2012_02_21_00_world_creature_loot_template.sql | 78 - .../world/2012_02_21_01_world_conditions.sql | 3592 ------ .../2012_02_21_02_world_creature_loot_template.sql | 11 - .../2012_02_21_03_world_creature_loot_template.sql | 26 - .../2012_02_21_04_world_creature_loot_template.sql | 16 - .../world/2012_02_21_05_world_Gossip_SAI.sql | 39 - sql/updates/world/2012_02_21_06_world_Gossip.sql | 184 - sql/updates/world/2012_02_22_00_world_SAI.sql | 39 - sql/updates/world/2012_02_22_01_world_say_text.sql | 34 - sql/updates/world/2012_02_22_02_world_misc.sql | 57 - .../world/2012_02_22_03_world_conditions.sql | 3 - sql/updates/world/2012_05_19_03_world_version.sql | 1 + .../world/2012_05_19_04_creature_loot_template.sql | 1 + .../2012_05_19_05_gameobject_loot_template.sql | 93 + .../2012_05_19_06_gameobject_loot_template.sql | 13 + sql/updates/world/2012_05_20_00_world_misc.sql | 16 + .../world/2012_05_20_01_world_spell_bonus_data.sql | 2 + .../world/2012_05_22_00_world_spell_proc_event.sql | 1 + .../2012_05_22_01_world_creature_loot_template.sql | 2 + sql/updates/world/2012_05_23_00_world_creature.sql | 55 + sql/updates/world/2012_05_23_01_world_sai.sql | 14 + sql/updates/world/2012_05_23_02_world_sai.sql | 21 + ...012_05_23_03_world_gameobject_loot_template.sql | 32 + .../world/2012_05_23_04_world_gameobject.sql | 3 + sql/updates/world/2012_05_23_05_world_creature.sql | 12 + .../world/2012_05_24_00_world_creature_misc.sql | 5 + .../world/2012_05_24_01_world_gameobject.sql | 3 + sql/updates/world/2012_05_25_00_world_sai.sql | 6 + .../world/2012_05_25_01_world_waypoints.sql | 149 + .../2012_05_25_02_world_creature_template.sql | 2 + sql/updates/world/2012_05_25_03_world_template.sql | 8 + sql/updates/world/2012_05_26_00_world_scripts.sql | 20 + .../world/2012_05_26_01_world_spell_dbc.sql | 4 + .../2012_05_26_02_world_creature_template.sql | 5 + .../world/2012_05_26_03_world_page_text.sql | 4 + .../2012_05_26_04_world_creature_template.sql | 4 + .../2012_05_26_05_world_creature_template.sql | 8 + .../world/2012_05_26_06_world_smart_scripts.sql | 143 + .../2012_05_27_00_world_gameobject_template.sql | 7 + .../world/2012_05_27_01_world_waypoints.sql | 7 + sql/updates/world/2012_05_27_02_world_creature.sql | 4 + sql/updates/world/2012_05_27_03_world_creature.sql | 2 + .../world/2012_05_27_04_world_smart_scripts.sql | 24 + .../world/2012_05_27_05_world_gameobject.sql | 13 + sql/updates/world/2012_05_27_06_world_creature.sql | 113 + .../world/2012_05_27_07_world_game_event.sql | 8 + .../world/2012_05_27_07_world_waypoints.sql | 8 + .../2012_05_28_00_world_creature_ai_scripts.sql | 9 + sql/updates/world/2012_05_28_01_world_creature.sql | 18 + sql/updates/world/2012_05_28_02_world_creature.sql | 26 + sql/updates/world/2012_05_28_03_waypoint_data.sql | 3 + .../2012_05_28_04_world_creature_template.sql | 3 + sql/updates/world/2012_05_28_05_world_creature.sql | 216 + .../world/2012_05_28_06_world_creature_addon.sql | 2 + .../world/2012_05_28_06_world_waypoint_data.sql | 524 + .../world/2012_05_28_07_world_quest_template.sql | 20 + src/server/authserver/Realms/RealmList.cpp | 24 +- src/server/authserver/Realms/RealmList.h | 17 +- src/server/authserver/Server/AuthSocket.cpp | 11 +- src/server/authserver/Server/AuthSocket.h | 13 - src/server/authserver/authserver.conf.dist | 8 + src/server/collision/Management/VMapManager2.cpp | 8 +- src/server/collision/Management/VMapManager2.h | 2 +- src/server/collision/Maps/MapTree.cpp | 4 +- src/server/collision/Maps/TileAssembler.cpp | 2 +- src/server/collision/Models/GameObjectModel.cpp | 24 +- src/server/collision/Models/WorldModel.cpp | 6 +- src/server/collision/Models/WorldModel.h | 1 - src/server/collision/VMapDefinitions.h | 6 +- src/server/game/AI/CoreAI/GameObjectAI.h | 23 +- src/server/game/AI/CoreAI/GuardAI.cpp | 87 +- src/server/game/AI/CoreAI/GuardAI.h | 23 +- src/server/game/AI/CoreAI/PetAI.cpp | 120 +- src/server/game/AI/CoreAI/PetAI.h | 2 + src/server/game/AI/CoreAI/TotemAI.cpp | 14 +- src/server/game/AI/CoreAI/TotemAI.h | 8 +- src/server/game/AI/CoreAI/UnitAI.h | 2 +- src/server/game/AI/CreatureAI.cpp | 1 + src/server/game/AI/CreatureAI.h | 8 +- src/server/game/AI/CreatureAIImpl.h | 5 + src/server/game/AI/CreatureAISelector.cpp | 7 +- src/server/game/AI/EventAI/CreatureEventAI.cpp | 16 +- src/server/game/AI/EventAI/CreatureEventAI.h | 2 +- src/server/game/AI/EventAI/CreatureEventAIMgr.cpp | 34 +- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 41 +- src/server/game/AI/ScriptedAI/ScriptedCreature.h | 29 +- src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp | 22 +- .../game/AI/ScriptedAI/ScriptedFollowerAI.cpp | 8 +- src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp | 280 - src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h | 73 - src/server/game/AI/SmartScripts/SmartAI.cpp | 40 +- src/server/game/AI/SmartScripts/SmartAI.h | 11 +- src/server/game/AI/SmartScripts/SmartScript.cpp | 131 +- src/server/game/AI/SmartScripts/SmartScript.h | 7 +- src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 217 +- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 42 +- src/server/game/Accounts/AccountMgr.cpp | 97 +- src/server/game/Accounts/AccountMgr.h | 38 +- src/server/game/Achievements/AchievementMgr.cpp | 23 +- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 6 +- src/server/game/Battlegrounds/ArenaTeam.cpp | 46 +- src/server/game/Battlegrounds/ArenaTeamMgr.cpp | 19 +- src/server/game/Battlegrounds/Battleground.cpp | 65 +- src/server/game/Battlegrounds/Battleground.h | 4 + src/server/game/Battlegrounds/BattlegroundMgr.cpp | 35 +- src/server/game/Battlegrounds/BattlegroundMgr.h | 1 + .../game/Battlegrounds/BattlegroundQueue.cpp | 2 +- .../game/Battlegrounds/Zones/BattlegroundAB.cpp | 4 +- .../game/Battlegrounds/Zones/BattlegroundAB.h | 12 +- .../game/Battlegrounds/Zones/BattlegroundAV.cpp | 39 +- .../game/Battlegrounds/Zones/BattlegroundAV.h | 47 +- .../game/Battlegrounds/Zones/BattlegroundDS.cpp | 55 +- .../game/Battlegrounds/Zones/BattlegroundDS.h | 42 +- .../game/Battlegrounds/Zones/BattlegroundEY.cpp | 3 +- .../game/Battlegrounds/Zones/BattlegroundEY.h | 5 +- .../game/Battlegrounds/Zones/BattlegroundIC.cpp | 9 +- .../game/Battlegrounds/Zones/BattlegroundRV.cpp | 46 +- .../game/Battlegrounds/Zones/BattlegroundRV.h | 15 +- .../game/Battlegrounds/Zones/BattlegroundSA.cpp | 26 +- .../game/Battlegrounds/Zones/BattlegroundSA.h | 209 +- .../game/Battlegrounds/Zones/BattlegroundWS.cpp | 28 +- src/server/game/CMakeLists.txt | 1 - src/server/game/Calendar/Calendar.cpp | 82 + src/server/game/Calendar/Calendar.h | 165 +- src/server/game/Calendar/CalendarMgr.cpp | 593 + src/server/game/Calendar/CalendarMgr.h | 80 + src/server/game/Chat/Channels/Channel.cpp | 3 +- src/server/game/Chat/Chat.cpp | 26 +- src/server/game/Chat/Chat.h | 5 +- src/server/game/Chat/Commands/Level0.cpp | 30 +- src/server/game/Chat/Commands/Level1.cpp | 27 +- src/server/game/Chat/Commands/Level2.cpp | 204 +- src/server/game/Chat/Commands/Level3.cpp | 297 +- src/server/game/Combat/ThreatManager.cpp | 4 +- src/server/game/Combat/ThreatManager.h | 2 +- src/server/game/Conditions/ConditionMgr.cpp | 91 +- src/server/game/Conditions/ConditionMgr.h | 29 +- src/server/game/DataStores/DBCEnums.h | 4 +- src/server/game/DataStores/DBCStores.cpp | 23 +- src/server/game/DataStores/DBCStores.h | 1 + src/server/game/DataStores/DBCStructure.h | 43 +- src/server/game/DataStores/DBCfmt.h | 2 +- src/server/game/DungeonFinding/LFGMgr.cpp | 7 +- src/server/game/DungeonFinding/LFGScripts.cpp | 78 +- src/server/game/DungeonFinding/LFGScripts.h | 24 +- src/server/game/Entities/Corpse/Corpse.cpp | 4 +- src/server/game/Entities/Corpse/Corpse.h | 1 - src/server/game/Entities/Creature/Creature.cpp | 323 +- src/server/game/Entities/Creature/Creature.h | 44 +- .../game/Entities/Creature/CreatureGroups.cpp | 27 +- src/server/game/Entities/Creature/CreatureGroups.h | 21 +- src/server/game/Entities/Creature/GossipDef.cpp | 3 - .../game/Entities/Creature/TemporarySummon.h | 1 - .../game/Entities/DynamicObject/DynamicObject.cpp | 8 +- src/server/game/Entities/GameObject/GameObject.cpp | 142 +- src/server/game/Entities/GameObject/GameObject.h | 12 +- src/server/game/Entities/Item/Container/Bag.cpp | 2 +- src/server/game/Entities/Item/Item.cpp | 76 +- src/server/game/Entities/Item/Item.h | 2 +- .../game/Entities/Item/ItemEnchantmentMgr.cpp | 9 +- src/server/game/Entities/Object/Object.cpp | 159 +- src/server/game/Entities/Object/Object.h | 55 +- .../game/Entities/Object/ObjectPosSelector.cpp | 10 +- .../game/Entities/Object/Updates/UpdateData.h | 30 +- src/server/game/Entities/Pet/Pet.cpp | 269 +- src/server/game/Entities/Player/Player.cpp | 1261 +- src/server/game/Entities/Player/Player.h | 46 +- src/server/game/Entities/Player/SocialMgr.cpp | 16 +- src/server/game/Entities/Player/SocialMgr.h | 4 +- src/server/game/Entities/Totem/Totem.h | 1 - src/server/game/Entities/Transport/Transport.cpp | 23 +- src/server/game/Entities/Unit/StatSystem.cpp | 14 +- src/server/game/Entities/Unit/Unit.cpp | 1588 ++- src/server/game/Entities/Unit/Unit.h | 210 +- src/server/game/Entities/Vehicle/Vehicle.cpp | 18 +- src/server/game/Events/GameEventMgr.cpp | 67 +- src/server/game/Globals/ObjectAccessor.cpp | 12 +- src/server/game/Globals/ObjectMgr.cpp | 558 +- src/server/game/Globals/ObjectMgr.h | 13 +- src/server/game/Grids/Cells/CellImpl.h | 2 +- src/server/game/Grids/GridDefines.h | 18 +- src/server/game/Grids/GridStates.h | 1 + src/server/game/Grids/Notifiers/GridNotifiers.cpp | 2 +- src/server/game/Grids/Notifiers/GridNotifiers.h | 43 +- .../game/Grids/Notifiers/GridNotifiersImpl.h | 25 +- src/server/game/Groups/Group.cpp | 49 +- src/server/game/Groups/GroupMgr.cpp | 8 +- src/server/game/Guilds/Guild.cpp | 114 +- src/server/game/Guilds/GuildMgr.cpp | 1 - src/server/game/Handlers/AuctionHouseHandler.cpp | 35 +- src/server/game/Handlers/BattleGroundHandler.cpp | 7 +- src/server/game/Handlers/CalendarHandler.cpp | 911 +- src/server/game/Handlers/CharacterHandler.cpp | 258 +- src/server/game/Handlers/GroupHandler.cpp | 14 +- src/server/game/Handlers/GuildHandler.cpp | 8 +- src/server/game/Handlers/ItemHandler.cpp | 12 +- src/server/game/Handlers/LFGHandler.cpp | 6 +- src/server/game/Handlers/LootHandler.cpp | 29 +- src/server/game/Handlers/MailHandler.cpp | 33 +- src/server/game/Handlers/MiscHandler.cpp | 94 +- src/server/game/Handlers/MovementHandler.cpp | 138 +- src/server/game/Handlers/NPCHandler.cpp | 8 +- src/server/game/Handlers/PetHandler.cpp | 26 +- src/server/game/Handlers/PetitionsHandler.cpp | 121 +- src/server/game/Handlers/QueryHandler.cpp | 48 +- src/server/game/Handlers/QuestHandler.cpp | 150 +- src/server/game/Handlers/SkillHandler.cpp | 1 - src/server/game/Handlers/SpellHandler.cpp | 20 +- src/server/game/Handlers/TaxiHandler.cpp | 2 +- src/server/game/Handlers/TicketHandler.cpp | 12 +- src/server/game/Handlers/TradeHandler.cpp | 14 +- src/server/game/Handlers/VehicleHandler.cpp | 4 +- src/server/game/Instances/InstanceSaveMgr.cpp | 51 +- src/server/game/Instances/InstanceScript.cpp | 18 +- src/server/game/Instances/InstanceScript.h | 10 +- src/server/game/Loot/LootMgr.cpp | 189 +- src/server/game/Mails/Mail.h | 1 + src/server/game/Maps/Map.cpp | 173 +- src/server/game/Maps/Map.h | 16 +- src/server/game/Maps/MapInstanced.cpp | 24 +- src/server/game/Maps/MapManager.cpp | 16 +- src/server/game/Maps/MapUpdater.cpp | 2 +- src/server/game/Miscellaneous/Formulas.h | 4 +- src/server/game/Miscellaneous/Language.h | 11 +- src/server/game/Miscellaneous/SharedDefines.h | 172 +- src/server/game/Movement/MotionMaster.cpp | 13 +- src/server/game/Movement/MovementGenerator.h | 6 +- .../ConfusedMovementGenerator.cpp | 64 +- .../MovementGenerators/ConfusedMovementGenerator.h | 5 +- .../FleeingMovementGenerator.cpp | 33 +- .../MovementGenerators/FleeingMovementGenerator.h | 8 +- .../MovementGenerators/HomeMovementGenerator.cpp | 4 - .../MovementGenerators/HomeMovementGenerator.h | 3 +- .../MovementGenerators/IdleMovementGenerator.cpp | 21 +- .../MovementGenerators/IdleMovementGenerator.h | 6 +- .../MovementGenerators/PointMovementGenerator.cpp | 8 +- .../MovementGenerators/PointMovementGenerator.h | 8 +- .../MovementGenerators/RandomMovementGenerator.cpp | 8 +- .../MovementGenerators/RandomMovementGenerator.h | 3 +- .../TargetedMovementGenerator.cpp | 8 +- .../MovementGenerators/TargetedMovementGenerator.h | 3 +- .../WaypointMovementGenerator.cpp | 11 +- .../MovementGenerators/WaypointMovementGenerator.h | 12 +- src/server/game/Movement/Spline/MoveSpline.cpp | 2 +- src/server/game/Movement/Spline/MoveSplineInit.cpp | 14 +- .../game/Movement/Spline/MovementPacketBuilder.cpp | 46 +- .../game/Movement/Waypoints/WaypointManager.cpp | 10 +- src/server/game/OutdoorPvP/OutdoorPvP.cpp | 10 +- src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp | 6 +- src/server/game/OutdoorPvP/OutdoorPvPMgr.h | 5 +- src/server/game/Pools/PoolMgr.cpp | 13 +- src/server/game/Quests/QuestDef.cpp | 66 +- src/server/game/Reputation/ReputationMgr.cpp | 42 +- src/server/game/Reputation/ReputationMgr.h | 5 +- src/server/game/Scripting/MapScripts.cpp | 96 +- src/server/game/Scripting/ScriptLoader.cpp | 6 +- src/server/game/Scripting/ScriptLoader.h | 19 +- src/server/game/Scripting/ScriptMgr.cpp | 49 +- src/server/game/Scripting/ScriptMgr.h | 17 + src/server/game/Scripting/ScriptSystem.cpp | 31 +- src/server/game/Scripting/ScriptSystem.h | 1 + src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.h | 3 +- src/server/game/Server/Protocol/WorldLog.cpp | 1 + src/server/game/Server/WorldSession.cpp | 56 +- src/server/game/Server/WorldSession.h | 73 +- src/server/game/Server/WorldSocket.cpp | 84 +- src/server/game/Server/WorldSocket.h | 2 +- src/server/game/Server/WorldSocketMgr.cpp | 10 +- src/server/game/Skills/SkillDiscovery.cpp | 6 +- src/server/game/Skills/SkillDiscovery.h | 1 - src/server/game/Skills/SkillExtraItems.cpp | 3 +- src/server/game/Skills/SkillExtraItems.h | 1 - src/server/game/Spells/Auras/SpellAuraEffects.cpp | 391 +- src/server/game/Spells/Auras/SpellAuras.cpp | 123 +- src/server/game/Spells/Spell.cpp | 582 +- src/server/game/Spells/Spell.h | 61 +- src/server/game/Spells/SpellEffects.cpp | 277 +- src/server/game/Spells/SpellInfo.cpp | 183 +- src/server/game/Spells/SpellInfo.h | 27 +- src/server/game/Spells/SpellMgr.cpp | 199 +- src/server/game/Spells/SpellMgr.h | 3 +- src/server/game/Spells/SpellScript.cpp | 34 +- src/server/game/Spells/SpellScript.h | 37 +- src/server/game/Texts/CreatureTextMgr.cpp | 402 +- src/server/game/Texts/CreatureTextMgr.h | 172 +- src/server/game/Tickets/TicketMgr.cpp | 55 +- src/server/game/Tickets/TicketMgr.h | 9 +- src/server/game/Tools/PlayerDump.cpp | 42 +- src/server/game/Warden/Modules/WardenModuleWin.h | 2389 ++-- src/server/game/Warden/Warden.cpp | 10 +- src/server/game/Warden/Warden.h | 2 +- src/server/game/Warden/WardenCheckMgr.cpp | 77 +- src/server/game/Warden/WardenCheckMgr.h | 6 +- src/server/game/Warden/WardenMac.cpp | 2 +- src/server/game/Warden/WardenWin.cpp | 42 +- src/server/game/Weather/Weather.cpp | 2 +- src/server/game/Weather/Weather.h | 1 - src/server/game/Weather/WeatherMgr.cpp | 10 +- src/server/game/World/World.cpp | 85 +- src/server/game/World/World.h | 5 +- src/server/scripts/CMakeLists.txt | 3 +- src/server/scripts/Commands/CMakeLists.txt | 3 +- src/server/scripts/Commands/cs_account.cpp | 37 +- src/server/scripts/Commands/cs_achievement.cpp | 2 +- src/server/scripts/Commands/cs_debug.cpp | 57 +- src/server/scripts/Commands/cs_gm.cpp | 6 +- src/server/scripts/Commands/cs_gobject.cpp | 16 +- src/server/scripts/Commands/cs_gps.cpp | 144 - src/server/scripts/Commands/cs_learn.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 90 +- src/server/scripts/Commands/cs_modify.cpp | 54 +- src/server/scripts/Commands/cs_npc.cpp | 87 +- src/server/scripts/Commands/cs_reload.cpp | 196 +- src/server/scripts/Commands/cs_tele.cpp | 9 +- src/server/scripts/Commands/cs_wp.cpp | 137 +- src/server/scripts/Custom/CMakeLists.txt | 2 +- .../EasternKingdoms/AlteracValley/boss_balinda.cpp | 2 +- .../BlackrockDepths/blackrock_depths.cpp | 531 +- .../BlackrockDepths/boss_ambassador_flamelash.cpp | 4 +- .../BlackrockDepths/boss_anubshiah.cpp | 10 +- .../boss_emperor_dagran_thaurissan.cpp | 10 +- .../BlackrockDepths/boss_general_angerforge.cpp | 10 +- .../BlackrockDepths/boss_gorosh_the_dervish.cpp | 4 +- .../BlackrockDepths/boss_grizzle.cpp | 4 +- .../boss_high_interrogator_gerstahn.cpp | 8 +- .../BlackrockDepths/boss_magmus.cpp | 8 +- .../BlackrockDepths/boss_moira_bronzebeard.cpp | 8 +- .../BlackrockDepths/boss_tomb_of_seven.cpp | 16 +- .../BlackrockDepths/instance_blackrock_depths.cpp | 84 +- .../BlackrockSpire/blackrock_spire.h | 39 +- .../BlackrockSpire/boss_drakkisath.cpp | 2 +- .../EasternKingdoms/BlackrockSpire/boss_gyth.cpp | 4 +- .../BlackrockSpire/boss_halycon.cpp | 2 +- .../BlackrockSpire/boss_highlord_omokk.cpp | 2 +- .../BlackrockSpire/boss_mother_smolderweb.cpp | 2 +- .../BlackrockSpire/boss_overlord_wyrmthalak.cpp | 2 +- .../BlackrockSpire/boss_pyroguard_emberseer.cpp | 41 +- .../BlackrockSpire/boss_quartermaster_zigris.cpp | 2 +- .../BlackrockSpire/boss_rend_blackhand.cpp | 2 +- .../boss_shadow_hunter_voshgajin.cpp | 2 +- .../BlackrockSpire/boss_the_beast.cpp | 2 +- .../BlackrockSpire/boss_warmaster_voone.cpp | 2 +- .../BlackrockSpire/instance_blackrock_spire.cpp | 77 +- .../BlackwingLair/boss_broodlord_lashlayer.cpp | 8 +- .../BlackwingLair/boss_chromaggus.cpp | 2 +- .../BlackwingLair/boss_nefarian.cpp | 16 +- .../BlackwingLair/boss_razorgore.cpp | 2 +- .../BlackwingLair/boss_vaelastrasz.cpp | 36 +- .../BlackwingLair/boss_victor_nefarius.cpp | 18 +- src/server/scripts/EasternKingdoms/CMakeLists.txt | 3 +- .../EasternKingdoms/Deadmines/boss_mr_smite.cpp | 5 +- .../EasternKingdoms/Deadmines/deadmines.cpp | 7 +- .../scripts/EasternKingdoms/Deadmines/deadmines.h | 1 - .../Deadmines/instance_deadmines.cpp | 2 +- .../EasternKingdoms/Gnomeregan/gnomeregan.cpp | 24 +- .../EasternKingdoms/Karazhan/boss_curator.cpp | 4 +- .../Karazhan/boss_maiden_of_virtue.cpp | 4 +- .../EasternKingdoms/Karazhan/boss_midnight.cpp | 20 +- .../EasternKingdoms/Karazhan/boss_moroes.cpp | 29 +- .../EasternKingdoms/Karazhan/boss_netherspite.cpp | 4 +- .../EasternKingdoms/Karazhan/boss_nightbane.cpp | 14 +- .../Karazhan/boss_prince_malchezaar.cpp | 12 +- .../Karazhan/boss_shade_of_aran.cpp | 34 +- .../Karazhan/boss_terestian_illhoof.cpp | 20 +- .../EasternKingdoms/Karazhan/bosses_opera.cpp | 42 +- .../scripts/EasternKingdoms/Karazhan/karazhan.cpp | 26 +- .../MagistersTerrace/boss_felblood_kaelthas.cpp | 40 +- .../MagistersTerrace/boss_priestess_delrissa.cpp | 27 +- .../MagistersTerrace/boss_selin_fireheart.cpp | 8 +- .../MagistersTerrace/boss_vexallus.cpp | 8 +- .../instance_magisters_terrace.cpp | 132 +- .../MagistersTerrace/magisters_terrace.cpp | 4 +- .../MagistersTerrace/magisters_terrace.h | 40 +- .../MoltenCore/boss_majordomo_executus.cpp | 2 +- .../EasternKingdoms/MoltenCore/boss_ragnaros.cpp | 4 +- .../MoltenCore/boss_sulfuron_harbinger.cpp | 2 +- .../EasternKingdoms/MoltenCore/molten_core.cpp | 86 - .../EasternKingdoms/ScarletEnclave/chapter1.cpp | 79 +- .../EasternKingdoms/ScarletEnclave/chapter2.cpp | 106 +- .../EasternKingdoms/ScarletEnclave/chapter5.cpp | 80 +- .../ScarletEnclave/the_scarlet_enclave.cpp | 6 +- .../ScarletMonastery/boss_headless_horseman.cpp | 45 +- .../ScarletMonastery/boss_herod.cpp | 7 +- .../boss_high_inquisitor_fairbanks.cpp | 8 +- .../ScarletMonastery/boss_interrogator_vishas.cpp | 4 +- .../boss_mograine_and_whitemane.cpp | 6 +- .../Scholomance/boss_darkmaster_gandling.cpp | 2 +- .../Scholomance/boss_death_knight_darkreaver.cpp | 2 +- .../Scholomance/boss_doctor_theolen_krastinov.cpp | 2 +- .../Scholomance/boss_illucia_barov.cpp | 2 +- .../Scholomance/boss_instructor_malicia.cpp | 2 +- .../Scholomance/boss_jandice_barov.cpp | 4 +- .../EasternKingdoms/Scholomance/boss_kormok.cpp | 2 +- .../Scholomance/boss_lord_alexei_barov.cpp | 2 +- .../Scholomance/boss_lorekeeper_polkelt.cpp | 2 +- .../Scholomance/boss_ras_frostwhisper.cpp | 2 +- .../Scholomance/boss_the_ravenian.cpp | 2 +- .../EasternKingdoms/Scholomance/boss_vectus.cpp | 2 +- .../ShadowfangKeep/shadowfang_keep.cpp | 19 +- .../Stratholme/boss_baron_rivendare.cpp | 4 +- .../Stratholme/boss_baroness_anastari.cpp | 4 +- .../Stratholme/boss_cannon_master_willey.cpp | 4 +- .../Stratholme/boss_dathrohan_balnazzar.cpp | 4 +- .../Stratholme/boss_magistrate_barthilas.cpp | 4 +- .../Stratholme/boss_maleki_the_pallid.cpp | 4 +- .../EasternKingdoms/Stratholme/boss_nerubenkan.cpp | 4 +- .../Stratholme/boss_order_of_silver_hand.cpp | 52 +- .../Stratholme/boss_postmaster_malown.cpp | 2 +- .../Stratholme/boss_ramstein_the_gorger.cpp | 4 +- .../Stratholme/boss_timmy_the_cruel.cpp | 2 +- .../EasternKingdoms/Stratholme/stratholme.cpp | 10 +- .../SunwellPlateau/boss_brutallus.cpp | 8 +- .../SunwellPlateau/boss_eredar_twins.cpp | 26 +- .../SunwellPlateau/boss_felmyst.cpp | 16 +- .../SunwellPlateau/boss_kalecgos.cpp | 24 +- .../SunwellPlateau/boss_kiljaeden.cpp | 51 +- .../EasternKingdoms/SunwellPlateau/boss_muru.cpp | 20 +- .../EasternKingdoms/Uldaman/boss_archaedas.cpp | 6 +- .../EasternKingdoms/Uldaman/instance_uldaman.cpp | 17 +- .../EasternKingdoms/ZulAman/boss_akilzon.cpp | 32 +- .../EasternKingdoms/ZulAman/boss_halazzi.cpp | 8 +- .../EasternKingdoms/ZulAman/boss_hexlord.cpp | 37 +- .../EasternKingdoms/ZulAman/boss_janalai.cpp | 35 +- .../EasternKingdoms/ZulAman/boss_nalorakk.cpp | 8 +- .../EasternKingdoms/ZulAman/boss_zuljin.cpp | 8 +- .../EasternKingdoms/ZulAman/instance_zulaman.cpp | 7 +- .../scripts/EasternKingdoms/ZulAman/zulaman.cpp | 31 +- .../EasternKingdoms/ZulGurub/boss_arlokk.cpp | 20 +- .../EasternKingdoms/ZulGurub/boss_gahzranka.cpp | 8 +- .../EasternKingdoms/ZulGurub/boss_grilek.cpp | 8 +- .../EasternKingdoms/ZulGurub/boss_hakkar.cpp | 26 +- .../EasternKingdoms/ZulGurub/boss_hazzarah.cpp | 2 +- .../EasternKingdoms/ZulGurub/boss_jeklik.cpp | 22 +- .../EasternKingdoms/ZulGurub/boss_jindo.cpp | 10 +- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 26 +- .../EasternKingdoms/ZulGurub/boss_marli.cpp | 18 +- .../EasternKingdoms/ZulGurub/boss_renataki.cpp | 2 +- .../EasternKingdoms/ZulGurub/boss_thekal.cpp | 92 +- .../EasternKingdoms/ZulGurub/boss_venoxis.cpp | 6 +- .../EasternKingdoms/ZulGurub/boss_wushoolay.cpp | 2 +- .../scripts/EasternKingdoms/arathi_highlands.cpp | 56 +- .../scripts/EasternKingdoms/blasted_lands.cpp | 5 +- src/server/scripts/EasternKingdoms/boss_kruul.cpp | 3 +- .../scripts/EasternKingdoms/burning_steppes.cpp | 7 +- src/server/scripts/EasternKingdoms/duskwood.cpp | 4 +- .../EasternKingdoms/eastern_plaguelands.cpp | 33 +- .../scripts/EasternKingdoms/eversong_woods.cpp | 22 +- src/server/scripts/EasternKingdoms/ghostlands.cpp | 108 +- src/server/scripts/EasternKingdoms/hinterlands.cpp | 15 +- src/server/scripts/EasternKingdoms/ironforge.cpp | 5 +- .../scripts/EasternKingdoms/isle_of_queldanas.cpp | 10 +- src/server/scripts/EasternKingdoms/loch_modan.cpp | 5 +- .../scripts/EasternKingdoms/redridge_mountains.cpp | 12 +- .../scripts/EasternKingdoms/silvermoon_city.cpp | 3 +- .../scripts/EasternKingdoms/silverpine_forest.cpp | 57 +- .../scripts/EasternKingdoms/stormwind_city.cpp | 33 +- .../scripts/EasternKingdoms/stranglethorn_vale.cpp | 3 +- .../scripts/EasternKingdoms/swamp_of_sorrows.cpp | 32 +- .../scripts/EasternKingdoms/tirisfal_glades.cpp | 3 - src/server/scripts/EasternKingdoms/undercity.cpp | 112 +- .../EasternKingdoms/western_plaguelands.cpp | 31 +- src/server/scripts/EasternKingdoms/westfall.cpp | 34 +- src/server/scripts/EasternKingdoms/wetlands.cpp | 7 +- src/server/scripts/Examples/CMakeLists.txt | 2 +- src/server/scripts/Examples/example_creature.cpp | 6 +- src/server/scripts/Examples/example_escort.cpp | 10 +- .../scripts/Examples/example_gossip_codebox.cpp | 10 +- src/server/scripts/Examples/example_spell.cpp | 4 +- .../BlackfathomDeeps/blackfathom_deeps.cpp | 6 +- src/server/scripts/Kalimdor/CMakeLists.txt | 2 +- .../BattleForMountHyjal/boss_anetheron.cpp | 23 +- .../BattleForMountHyjal/boss_archimonde.cpp | 43 +- .../BattleForMountHyjal/boss_azgalor.cpp | 25 +- .../BattleForMountHyjal/boss_kazrogal.cpp | 17 +- .../BattleForMountHyjal/boss_rage_winterchill.cpp | 17 +- .../CavernsOfTime/BattleForMountHyjal/hyjal.cpp | 13 +- .../CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp | 30 +- .../CavernsOfTime/BattleForMountHyjal/hyjalAI.h | 4 +- .../BattleForMountHyjal/hyjal_trash.cpp | 204 +- .../BattleForMountHyjal/hyjal_trash.h | 2 +- .../BattleForMountHyjal/instance_hyjal.cpp | 30 +- .../CullingOfStratholme/boss_epoch.cpp | 4 +- .../CullingOfStratholme/boss_infinite.cpp | 4 +- .../CullingOfStratholme/boss_mal_ganis.cpp | 4 +- .../CullingOfStratholme/boss_meathook.cpp | 4 +- .../CullingOfStratholme/boss_salramm.cpp | 4 +- .../CullingOfStratholme/culling_of_stratholme.cpp | 16 +- .../instance_culling_of_stratholme.cpp | 1 + .../CavernsOfTime/DarkPortal/boss_aeonus.cpp | 6 +- .../DarkPortal/boss_chrono_lord_deja.cpp | 6 +- .../CavernsOfTime/DarkPortal/boss_temporus.cpp | 6 +- .../CavernsOfTime/DarkPortal/dark_portal.cpp | 24 +- .../DarkPortal/instance_dark_portal.cpp | 4 +- .../boss_captain_skarloc.cpp | 6 +- .../EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp | 6 +- .../boss_leutenant_drake.cpp | 8 +- .../EscapeFromDurnholdeKeep/old_hillsbrad.cpp | 38 +- .../Kalimdor/Maraudon/boss_celebras_the_cursed.cpp | 2 +- .../scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp | 42 +- .../boss_amnennar_the_coldbringer.cpp | 2 +- .../Kalimdor/RazorfenDowns/razorfen_downs.cpp | 13 +- .../Kalimdor/RazorfenKraul/razorfen_kraul.cpp | 87 +- .../scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp | 2 +- .../Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp | 20 +- .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 29 +- .../Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp | 2 +- .../Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp | 2 +- .../Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp | 2 +- .../Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp | 6 +- .../Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp | 4 +- .../TempleOfAhnQiraj/boss_twinemperors.cpp | 10 +- .../instance_temple_of_ahnqiraj.cpp | 2 +- .../TempleOfAhnQiraj/mob_anubisath_sentinel.cpp | 4 +- .../Kalimdor/WailingCaverns/wailing_caverns.cpp | 24 +- .../Kalimdor/ZulFarrak/instance_zulfarrak.cpp | 8 +- .../scripts/Kalimdor/ZulFarrak/zulfarrak.cpp | 43 +- src/server/scripts/Kalimdor/ashenvale.cpp | 248 +- src/server/scripts/Kalimdor/azshara.cpp | 238 +- src/server/scripts/Kalimdor/azuremyst_isle.cpp | 222 +- src/server/scripts/Kalimdor/bloodmyst_isle.cpp | 30 +- src/server/scripts/Kalimdor/boss_azuregos.cpp | 125 +- src/server/scripts/Kalimdor/darkshore.cpp | 142 +- src/server/scripts/Kalimdor/desolace.cpp | 37 +- src/server/scripts/Kalimdor/durotar.cpp | 127 +- src/server/scripts/Kalimdor/dustwallow_marsh.cpp | 157 +- src/server/scripts/Kalimdor/felwood.cpp | 34 +- src/server/scripts/Kalimdor/feralas.cpp | 20 +- src/server/scripts/Kalimdor/moonglade.cpp | 230 +- src/server/scripts/Kalimdor/mulgore.cpp | 179 +- src/server/scripts/Kalimdor/orgrimmar.cpp | 61 +- src/server/scripts/Kalimdor/silithus.cpp | 129 +- .../scripts/Kalimdor/stonetalon_mountains.cpp | 39 +- src/server/scripts/Kalimdor/tanaris.cpp | 298 +- src/server/scripts/Kalimdor/teldrassil.cpp | 17 +- src/server/scripts/Kalimdor/the_barrens.cpp | 197 +- src/server/scripts/Kalimdor/thousand_needles.cpp | 108 +- src/server/scripts/Kalimdor/thunder_bluff.cpp | 73 +- src/server/scripts/Kalimdor/ungoro_crater.cpp | 121 +- src/server/scripts/Kalimdor/winterspring.cpp | 20 +- .../AzjolNerub/Ahnkahet/boss_amanitar.cpp | 8 +- .../AzjolNerub/Ahnkahet/boss_elder_nadox.cpp | 10 +- .../Ahnkahet/boss_jedoga_shadowseeker.cpp | 24 +- .../AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp | 82 +- .../AzjolNerub/Ahnkahet/instance_ahnkahet.cpp | 66 +- .../AzjolNerub/AzjolNerub/boss_anubarak.cpp | 2 +- .../AzjolNerub/AzjolNerub/boss_hadronox.cpp | 9 +- .../AzjolNerub/boss_krikthir_the_gatewatcher.cpp | 18 +- .../AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp | 3 +- src/server/scripts/Northrend/CMakeLists.txt | 4 +- .../ObsidianSanctum/boss_sartharion.cpp | 8 +- .../RubySanctum/boss_general_zarithrian.cpp | 4 +- .../RubySanctum/boss_saviana_ragefire.cpp | 14 +- .../ChamberOfAspects/RubySanctum/ruby_sanctum.cpp | 2 +- .../TrialOfTheChampion/boss_argent_challenge.cpp | 8 +- .../TrialOfTheChampion/boss_black_knight.cpp | 2 +- .../TrialOfTheChampion/boss_grand_champions.cpp | 12 +- .../TrialOfTheChampion/trial_of_the_champion.cpp | 8 +- .../TrialOfTheCrusader/boss_anubarak_trial.cpp | 61 +- .../TrialOfTheCrusader/boss_faction_champions.cpp | 98 +- .../TrialOfTheCrusader/boss_lord_jaraxxus.cpp | 52 +- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 71 +- .../TrialOfTheCrusader/boss_twin_valkyr.cpp | 80 +- .../instance_trial_of_the_crusader.cpp | 2 +- .../TrialOfTheCrusader/trial_of_the_crusader.cpp | 301 +- .../scripts/Northrend/DraktharonKeep/boss_dred.cpp | 6 +- .../Northrend/DraktharonKeep/boss_novos.cpp | 12 +- .../Northrend/DraktharonKeep/boss_tharon_ja.cpp | 4 +- .../Northrend/DraktharonKeep/boss_trollgore.cpp | 4 +- .../DraktharonKeep/instance_drak_tharon_keep.cpp | 3 +- .../FrozenHalls/ForgeOfSouls/forge_of_souls.cpp | 587 +- .../HallsOfReflection/halls_of_reflection.cpp | 20 +- .../PitOfSaron/boss_forgemaster_garfrost.cpp | 33 +- .../FrozenHalls/PitOfSaron/boss_krickandick.cpp | 6 +- .../PitOfSaron/boss_scourgelord_tyrannus.cpp | 8 +- .../PitOfSaron/instance_pit_of_saron.cpp | 30 + .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 81 +- .../FrozenHalls/PitOfSaron/pit_of_saron.h | 2 + src/server/scripts/Northrend/Gundrak/boss_eck.cpp | 10 +- .../scripts/Northrend/Gundrak/boss_gal_darah.cpp | 4 +- .../scripts/Northrend/Gundrak/boss_slad_ran.cpp | 8 +- .../scripts/Northrend/Gundrak/instance_gundrak.cpp | 17 +- .../IcecrownCitadel/boss_blood_prince_council.cpp | 89 +- .../IcecrownCitadel/boss_blood_queen_lana_thel.cpp | 73 +- .../IcecrownCitadel/boss_deathbringer_saurfang.cpp | 148 +- .../Northrend/IcecrownCitadel/boss_festergut.cpp | 2 +- .../IcecrownCitadel/boss_lady_deathwhisper.cpp | 2 +- .../IcecrownCitadel/boss_professor_putricide.cpp | 206 +- .../Northrend/IcecrownCitadel/boss_rotface.cpp | 10 +- .../Northrend/IcecrownCitadel/boss_sindragosa.cpp | 248 +- .../IcecrownCitadel/boss_the_lich_king.cpp | 46 +- .../IcecrownCitadel/boss_valithria_dreamwalker.cpp | 25 +- .../Northrend/IcecrownCitadel/icecrown_citadel.cpp | 34 +- .../Northrend/IcecrownCitadel/icecrown_citadel.h | 4 + .../IcecrownCitadel/instance_icecrown_citadel.cpp | 16 +- .../Northrend/Naxxramas/boss_anubrekhan.cpp | 4 +- .../Northrend/Naxxramas/boss_four_horsemen.cpp | 20 +- .../scripts/Northrend/Naxxramas/boss_gluth.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_gothik.cpp | 8 +- .../scripts/Northrend/Naxxramas/boss_grobbulus.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_heigan.cpp | 4 +- .../scripts/Northrend/Naxxramas/boss_kelthuzad.cpp | 46 +- .../scripts/Northrend/Naxxramas/boss_maexxna.cpp | 4 +- .../scripts/Northrend/Naxxramas/boss_noth.cpp | 4 +- .../scripts/Northrend/Naxxramas/boss_patchwerk.cpp | 4 +- .../scripts/Northrend/Naxxramas/boss_razuvious.cpp | 2 +- .../scripts/Northrend/Naxxramas/boss_sapphiron.cpp | 10 +- .../scripts/Northrend/Naxxramas/boss_thaddius.cpp | 12 +- .../Northrend/Naxxramas/instance_naxxramas.cpp | 1 - .../Northrend/Nexus/EyeOfEternity/boss_malygos.cpp | 27 +- .../Northrend/Nexus/Nexus/boss_anomalus.cpp | 2 +- .../Northrend/Nexus/Nexus/boss_keristrasza.cpp | 14 +- .../Northrend/Nexus/Nexus/boss_magus_telestra.cpp | 4 +- .../scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp | 10 +- .../Northrend/Nexus/Nexus/commander_kolurg.cpp | 2 +- .../Northrend/Nexus/Nexus/commander_stoutbeard.cpp | 2 +- .../scripts/Northrend/Nexus/Oculus/boss_urom.cpp | 6 +- .../scripts/Northrend/Nexus/Oculus/boss_varos.cpp | 10 +- .../scripts/Northrend/Nexus/Oculus/oculus.cpp | 8 +- .../Ulduar/HallsOfLightning/boss_bjarngrim.cpp | 66 +- .../Ulduar/HallsOfLightning/boss_ionar.cpp | 19 +- .../Ulduar/HallsOfLightning/boss_loken.cpp | 60 +- .../Ulduar/HallsOfLightning/boss_volkhan.cpp | 50 +- .../Ulduar/HallsOfStone/boss_krystallus.cpp | 4 +- .../Ulduar/HallsOfStone/boss_maiden_of_grief.cpp | 2 +- .../Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp | 10 +- .../Ulduar/HallsOfStone/halls_of_stone.cpp | 16 +- .../Northrend/Ulduar/Ulduar/boss_algalon.cpp | 376 - .../Ulduar/Ulduar/boss_algalon_the_observer.cpp | 1374 ++ .../Ulduar/Ulduar/boss_assembly_of_iron.cpp | 12 +- .../Northrend/Ulduar/Ulduar/boss_auriaya.cpp | 10 +- .../Ulduar/Ulduar/boss_flame_leviathan.cpp | 37 +- .../scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp | 32 +- .../Northrend/Ulduar/Ulduar/boss_general_vezax.cpp | 6 +- .../scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp | 18 +- .../scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp | 10 +- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 9 +- .../Northrend/Ulduar/Ulduar/boss_razorscale.cpp | 20 +- .../Northrend/Ulduar/Ulduar/boss_thorim.cpp | 2 +- .../scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp | 10 +- .../Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp | 31 +- .../Northrend/Ulduar/Ulduar/instance_ulduar.cpp | 271 +- .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 226 +- .../UtgardeKeep/boss_ingvar_the_plunderer.cpp | 11 +- .../UtgardeKeep/boss_skarvald_dalronn.cpp | 28 +- .../UtgardeKeep/instance_utgarde_keep.cpp | 3 +- .../UtgardeKeep/UtgardeKeep/utgarde_keep.cpp | 100 +- .../UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp | 35 +- .../UtgardeKeep/UtgardePinnacle/boss_skadi.cpp | 56 +- .../UtgardeKeep/UtgardePinnacle/boss_svala.cpp | 95 +- .../UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp | 6 +- .../UtgardePinnacle/instance_pinnacle.cpp | 3 +- .../Northrend/VaultOfArchavon/boss_emalon.cpp | 4 +- .../Northrend/VaultOfArchavon/boss_toravon.cpp | 2 +- .../Northrend/VioletHold/boss_cyanigosa.cpp | 6 +- .../scripts/Northrend/VioletHold/boss_erekem.cpp | 8 +- .../Northrend/VioletHold/boss_lavanthor.cpp | 4 +- .../scripts/Northrend/VioletHold/boss_moragg.cpp | 4 +- .../scripts/Northrend/VioletHold/boss_zuramat.cpp | 4 +- .../Northrend/VioletHold/instance_violet_hold.cpp | 8 +- .../scripts/Northrend/VioletHold/violet_hold.cpp | 80 +- src/server/scripts/Northrend/borean_tundra.cpp | 239 +- src/server/scripts/Northrend/dalaran.cpp | 6 +- src/server/scripts/Northrend/dragonblight.cpp | 4 +- src/server/scripts/Northrend/grizzly_hills.cpp | 42 +- src/server/scripts/Northrend/howling_fjord.cpp | 20 +- src/server/scripts/Northrend/icecrown.cpp | 8 +- src/server/scripts/Northrend/sholazar_basin.cpp | 95 +- src/server/scripts/Northrend/storm_peaks.cpp | 124 +- src/server/scripts/Northrend/zuldrak.cpp | 37 +- src/server/scripts/OutdoorPvP/CMakeLists.txt | 2 +- src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp | 1 - src/server/scripts/OutdoorPvP/OutdoorPvPEP.h | 1 - src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp | 1 - src/server/scripts/OutdoorPvP/OutdoorPvPZM.h | 2 +- .../AuchenaiCrypts/boss_exarch_maladaar.cpp | 8 +- .../boss_shirrak_the_dead_watcher.cpp | 4 +- .../ManaTombs/boss_nexusprince_shaffar.cpp | 8 +- .../Auchindoun/ManaTombs/boss_pandemonius.cpp | 4 +- .../SethekkHalls/boss_darkweaver_syth.cpp | 12 +- .../SethekkHalls/boss_tailonking_ikiss.cpp | 8 +- .../ShadowLabyrinth/boss_ambassador_hellmaw.cpp | 30 +- .../boss_blackheart_the_inciter.cpp | 6 +- .../ShadowLabyrinth/boss_grandmaster_vorpil.cpp | 10 +- .../Auchindoun/ShadowLabyrinth/boss_murmur.cpp | 6 +- .../ShadowLabyrinth/instance_shadow_labyrinth.cpp | 3 +- .../scripts/Outland/BlackTemple/black_temple.cpp | 4 +- .../scripts/Outland/BlackTemple/boss_bloodboil.cpp | 8 +- .../scripts/Outland/BlackTemple/boss_illidan.cpp | 95 +- .../Outland/BlackTemple/boss_mother_shahraz.cpp | 8 +- .../BlackTemple/boss_reliquary_of_souls.cpp | 23 +- .../Outland/BlackTemple/boss_shade_of_akama.cpp | 59 +- .../scripts/Outland/BlackTemple/boss_supremus.cpp | 24 +- .../Outland/BlackTemple/boss_teron_gorefiend.cpp | 27 +- .../Outland/BlackTemple/boss_warlord_najentus.cpp | 10 +- .../Outland/BlackTemple/illidari_council.cpp | 44 +- .../Outland/BlackTemple/instance_black_temple.cpp | 142 +- src/server/scripts/Outland/CMakeLists.txt | 2 +- .../SerpentShrine/boss_fathomlord_karathress.cpp | 38 +- .../SerpentShrine/boss_hydross_the_unstable.cpp | 69 +- .../SerpentShrine/boss_lady_vashj.cpp | 625 +- .../SerpentShrine/boss_leotheras_the_blind.cpp | 47 +- .../SerpentShrine/boss_lurker_below.cpp | 139 +- .../SerpentShrine/boss_morogrim_tidewalker.cpp | 8 +- .../SerpentShrine/instance_serpent_shrine.cpp | 2 +- .../SteamVault/boss_hydromancer_thespia.cpp | 8 +- .../SteamVault/boss_mekgineer_steamrigger.cpp | 12 +- .../SteamVault/boss_warlord_kalithresh.cpp | 10 +- .../CoilfangReservoir/underbog/boss_hungarfen.cpp | 4 +- .../underbog/boss_the_black_stalker.cpp | 4 +- .../scripts/Outland/GruulsLair/boss_gruul.cpp | 15 +- .../Outland/GruulsLair/boss_high_king_maulgar.cpp | 40 +- .../Outland/GruulsLair/instance_gruuls_lair.cpp | 19 +- .../HellfireCitadel/BloodFurnace/boss_broggok.cpp | 6 +- .../BloodFurnace/boss_kelidan_the_breaker.cpp | 18 +- .../BloodFurnace/boss_the_maker.cpp | 6 +- .../HellfireRamparts/boss_omor_the_unscarred.cpp | 8 +- .../HellfireRamparts/boss_vazruden_the_herald.cpp | 30 +- .../boss_watchkeeper_gargolmar.cpp | 8 +- .../MagtheridonsLair/boss_magtheridon.cpp | 24 +- .../instance_magtheridons_lair.cpp | 4 +- .../ShatteredHalls/boss_nethekurse.cpp | 12 +- .../ShatteredHalls/boss_warbringer_omrogg.cpp | 6 +- .../boss_warchief_kargath_bladefist.cpp | 16 +- .../scripts/Outland/TempestKeep/Eye/boss_alar.cpp | 24 +- .../Outland/TempestKeep/Eye/boss_astromancer.cpp | 14 +- .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 117 +- .../Outland/TempestKeep/Eye/boss_void_reaver.cpp | 6 +- .../Outland/TempestKeep/Eye/instance_the_eye.cpp | 3 +- .../Mechanar/boss_gatewatcher_ironhand.cpp | 2 +- .../Mechanar/boss_nethermancer_sepethrea.cpp | 2 +- .../Mechanar/boss_pathaleon_the_calculator.cpp | 2 +- .../TempestKeep/Mechanar/instance_mechanar.cpp | 2 +- .../Outland/TempestKeep/arcatraz/arcatraz.cpp | 4 +- .../arcatraz/boss_harbinger_skyriss.cpp | 2 +- .../TempestKeep/arcatraz/instance_arcatraz.cpp | 47 +- .../botanica/boss_high_botanist_freywinn.cpp | 6 +- .../Outland/TempestKeep/botanica/boss_laj.cpp | 4 +- .../TempestKeep/botanica/boss_warp_splinter.cpp | 10 +- .../scripts/Outland/blades_edge_mountains.cpp | 71 +- .../scripts/Outland/boss_doomlord_kazzak.cpp | 41 +- src/server/scripts/Outland/boss_doomwalker.cpp | 4 +- src/server/scripts/Outland/hellfire_peninsula.cpp | 79 +- src/server/scripts/Outland/nagrand.cpp | 52 +- src/server/scripts/Outland/netherstorm.cpp | 66 +- src/server/scripts/Outland/shadowmoon_valley.cpp | 376 +- src/server/scripts/Outland/shattrath_city.cpp | 140 +- src/server/scripts/Outland/terokkar_forest.cpp | 143 +- src/server/scripts/Outland/zangarmarsh.cpp | 32 +- src/server/scripts/Spells/CMakeLists.txt | 2 +- src/server/scripts/Spells/spell_dk.cpp | 39 +- src/server/scripts/Spells/spell_druid.cpp | 6 +- src/server/scripts/Spells/spell_generic.cpp | 215 +- src/server/scripts/Spells/spell_hunter.cpp | 67 +- src/server/scripts/Spells/spell_item.cpp | 94 +- src/server/scripts/Spells/spell_mage.cpp | 26 +- src/server/scripts/Spells/spell_paladin.cpp | 20 + src/server/scripts/Spells/spell_priest.cpp | 64 +- src/server/scripts/Spells/spell_quest.cpp | 86 +- src/server/scripts/Spells/spell_shaman.cpp | 131 +- src/server/scripts/Spells/spell_warlock.cpp | 134 +- src/server/scripts/Spells/spell_warrior.cpp | 80 +- src/server/scripts/World/CMakeLists.txt | 2 +- src/server/scripts/World/areatrigger_scripts.cpp | 80 +- src/server/scripts/World/boss_emerald_dragons.cpp | 4 +- src/server/scripts/World/go_scripts.cpp | 300 +- src/server/scripts/World/guards.cpp | 25 +- src/server/scripts/World/item_scripts.cpp | 49 +- src/server/scripts/World/mob_generic_creature.cpp | 8 +- src/server/scripts/World/npc_innkeeper.cpp | 6 +- src/server/scripts/World/npc_professions.cpp | 246 +- src/server/scripts/World/npc_taxi.cpp | 11 +- src/server/scripts/World/npcs_special.cpp | 592 +- src/server/shared/AutoPtr.h | 53 + src/server/shared/CMakeLists.txt | 1 - src/server/shared/Common.h | 4 + src/server/shared/Containers.h | 71 + src/server/shared/Cryptography/BigNumber.cpp | 4 + src/server/shared/Cryptography/BigNumber.h | 5 + src/server/shared/Cryptography/HMACSHA1.cpp | 12 +- src/server/shared/Cryptography/HMACSHA1.h | 2 - src/server/shared/Cryptography/SHA1.h | 1 - src/server/shared/Database/DatabaseWorkerPool.h | 181 +- src/server/shared/Database/Field.h | 103 +- .../Database/Implementation/CharacterDatabase.cpp | 193 +- .../Database/Implementation/CharacterDatabase.h | 177 +- .../Database/Implementation/LoginDatabase.cpp | 35 +- .../shared/Database/Implementation/LoginDatabase.h | 29 +- .../Database/Implementation/WorldDatabase.cpp | 30 +- .../shared/Database/Implementation/WorldDatabase.h | 31 +- src/server/shared/Database/MySQLConnection.cpp | 4 - src/server/shared/Database/PreparedStatement.cpp | 51 +- src/server/shared/Database/QueryResult.h | 6 +- src/server/shared/Database/Transaction.h | 2 +- src/server/shared/Debugging/Errors.h | 8 +- .../shared/Debugging/WheatyExceptionReport.cpp | 18 +- .../shared/Dynamic/TypeContainerFunctionsPtr.h | 168 - src/server/shared/Logging/Log.cpp | 24 +- src/server/shared/Logging/Log.h | 44 +- src/server/shared/Packets/ByteBuffer.h | 85 +- src/server/shared/Utilities/Util.cpp | 40 - src/server/shared/Utilities/Util.h | 12 +- src/server/worldserver/CMakeLists.txt | 3 +- src/server/worldserver/CommandLine/CliRunnable.cpp | 34 +- src/server/worldserver/Main.cpp | 4 +- src/server/worldserver/Master.cpp | 41 +- src/server/worldserver/Master.h | 2 +- src/server/worldserver/RemoteAccess/RASocket.cpp | 28 +- src/server/worldserver/RemoteAccess/RASocket.h | 2 +- .../worldserver/WorldThread/WorldRunnable.cpp | 2 + src/server/worldserver/worldserver.conf.dist | 6 +- src/tools/map_extractor/System.cpp | 211 +- src/tools/vmap4_extractor/model.cpp | 2 +- src/tools/vmap4_extractor/mpq_libmpq04.h | 10 +- src/tools/vmap4_extractor/vmapexport.cpp | 17 +- src/tools/vmap4_extractor/vmapexport.h | 4 +- src/tools/vmap4_extractor/wmo.cpp | 48 +- 1132 files changed, 51312 insertions(+), 37093 deletions(-) delete mode 100644 dep/mersennetwister/MersenneTwister.h create mode 100644 sql/old/3.3.5a/2012_02_13_00_world_version.sql create mode 100644 sql/old/3.3.5a/2012_02_14_00_world_achievement_criteria_data.sql create mode 100644 sql/old/3.3.5a/2012_02_15_00_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_02_15_01_world_areatrigger_tavern.sql create mode 100644 sql/old/3.3.5a/2012_02_15_02_world_item_template.sql create mode 100644 sql/old/3.3.5a/2012_02_15_03_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_02_15_04_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_02_15_06_world_creature_involvedrelation.sql create mode 100644 sql/old/3.3.5a/2012_02_15_07_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_02_15_07_01_world_waypoint_data.sql create mode 100644 sql/old/3.3.5a/2012_02_15_07_02_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_02_15_08_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_02_15_09_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_02_16_00_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_02_16_01_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_02_17_00_world_waypoints.sql create mode 100644 sql/old/3.3.5a/2012_02_18_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_02_18_01_world_spell_dbc.sql create mode 100644 sql/old/3.3.5a/2012_02_18_02_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_18_03_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_18_04_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_02_18_05_world_creatures.sql create mode 100644 sql/old/3.3.5a/2012_02_18_06_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_18_07_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_18_08_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_19_00_auth_account.sql create mode 100644 sql/old/3.3.5a/2012_02_19_00_characters_warden_action.sql create mode 100644 sql/old/3.3.5a/2012_02_19_00_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_02_19_01_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_02_19_02_world_gameobject.sql create mode 100644 sql/old/3.3.5a/2012_02_19_03_world_warden_checks.sql create mode 100644 sql/old/3.3.5a/2012_02_19_04_world_misc_db_updates.sql create mode 100644 sql/old/3.3.5a/2012_02_19_05_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_02_19_06_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_02_20_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_02_20_01_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_20_02_world_conditons.sql create mode 100644 sql/old/3.3.5a/2012_02_21_00_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_02_21_01_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_02_21_02_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_02_21_03_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_02_21_04_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_02_21_05_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_21_06_world_Gossip.sql create mode 100644 sql/old/3.3.5a/2012_02_22_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_02_22_01_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_02_22_02_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_02_22_03_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_02_23_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_02_24_00_world_gameobject_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_02_24_01_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_02_25_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_02_25_01_world_command.sql create mode 100644 sql/old/3.3.5a/2012_02_25_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_02_25_02_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_02_26_00_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_02_26_01_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_02_27_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_02_28_00_world_wintergrasp_spawns.sql create mode 100644 sql/old/3.3.5a/2012_02_29_00_world_conditions_misc.sql create mode 100644 sql/old/3.3.5a/2012_02_29_01_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_02_29_02_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_02_29_03_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_02_29_04_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_02_29_05_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_03_01_00_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_03_01_01_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_03_01_02_world_locales_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_03_03_00_world_command.sql create mode 100644 sql/old/3.3.5a/2012_03_04_00_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_04_01_world_areatrigger_scripts.sql create mode 100644 sql/old/3.3.5a/2012_03_06_00_world_commands.sql create mode 100644 sql/old/3.3.5a/2012_03_06_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_06_02_world_queststatus_seasonal.sql create mode 100644 sql/old/3.3.5a/2012_03_06_03_world_smart_scripts.sql create mode 100644 sql/old/3.3.5a/2012_03_06_04_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_03_07_00_world_trinity_string.sql create mode 100644 sql/old/3.3.5a/2012_03_10_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_03_10_00_world_smart_scripts.sql create mode 100644 sql/old/3.3.5a/2012_03_10_00_world_waypoint_data.sql create mode 100644 sql/old/3.3.5a/2012_03_11_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_03_12_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_03_12_01_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_03_12_01_world_gameobject.sql create mode 100644 sql/old/3.3.5a/2012_03_12_01_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_03_14_00_world_creature_addon.sql create mode 100644 sql/old/3.3.5a/2012_03_19_00_world_smart_scripts.sql create mode 100644 sql/old/3.3.5a/2012_03_20_00_world_gossip.sql create mode 100644 sql/old/3.3.5a/2012_03_21_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_03_22_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_03_22_01_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_03_23_00_world_ip2nation.sql create mode 100644 sql/old/3.3.5a/2012_03_24_00_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_24_01_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_03_24_02_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_03_25_00_auth_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_25_00_world_game_event.sql create mode 100644 sql/old/3.3.5a/2012_03_26_00_auth_realmlist.sql create mode 100644 sql/old/3.3.5a/2012_03_26_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_03_26_01_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_03_27_00_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_27_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_27_02_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_27_03_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_27_04_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_03_28_00_auth_account.sql create mode 100644 sql/old/3.3.5a/2012_03_28_01_auth_account_access.sql create mode 100644 sql/old/3.3.5a/2012_03_28_01_world_spell_bonus_data.sql create mode 100644 sql/old/3.3.5a/2012_03_28_02_auth_account_banned.sql create mode 100644 sql/old/3.3.5a/2012_03_28_03_auth_ip_banned.sql create mode 100644 sql/old/3.3.5a/2012_03_28_04_auth_logs.sql create mode 100644 sql/old/3.3.5a/2012_03_28_05_auth_realmcharacters.sql create mode 100644 sql/old/3.3.5a/2012_03_28_06_auth_realmlist.sql create mode 100644 sql/old/3.3.5a/2012_03_28_07_auth_uptime.sql create mode 100644 sql/old/3.3.5a/2012_03_30_00_world_smart_scripts.sql create mode 100644 sql/old/3.3.5a/2012_03_31_00_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_01_00_auth_realmlist.sql create mode 100644 sql/old/3.3.5a/2012_04_01_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_04_01_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_01_01_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_04_01_02_world_spell_group_stack_rules.sql create mode 100644 sql/old/3.3.5a/2012_04_01_03_world_trainers.sql create mode 100644 sql/old/3.3.5a/2012_04_01_04_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_04_01_05_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_01_06_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_04_01_07_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_04_03_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_04_00_auth_realmlist.sql create mode 100644 sql/old/3.3.5a/2012_04_04_00_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_04_04_01_world_spell_dbc.sql create mode 100644 sql/old/3.3.5a/2012_04_05_00_world_gameobject_template.sql create mode 100644 sql/old/3.3.5a/2012_04_05_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_05_01_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_06_00_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_06_01_world_spell_dbc.sql create mode 100644 sql/old/3.3.5a/2012_04_06_02_world_gameobject_template.sql create mode 100644 sql/old/3.3.5a/2012_04_06_03_world_spell_dbc.sql create mode 100644 sql/old/3.3.5a/2012_04_06_04_world_page_text.sql create mode 100644 sql/old/3.3.5a/2012_04_07_00_characters_lag_reports.sql create mode 100644 sql/old/3.3.5a/2012_04_07_00_world_gameobject.sql create mode 100644 sql/old/3.3.5a/2012_04_07_01_world_game_event.sql create mode 100644 sql/old/3.3.5a/2012_04_07_02_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_08_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_08_01_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_08_02_world_spell_dbc.sql create mode 100644 sql/old/3.3.5a/2012_04_08_02_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_08_03_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_12_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_12_01_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_12_02_world_spell_bonus_data.sql create mode 100644 sql/old/3.3.5a/2012_04_12_03_world_spell_bonus_data.sql create mode 100644 sql/old/3.3.5a/2012_04_12_04_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_12_05_world_command.sql create mode 100644 sql/old/3.3.5a/2012_04_13_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_04_13_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_04_13_02_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_04_13_03_world_bg_template.sql create mode 100644 sql/old/3.3.5a/2012_04_13_04_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_14_00_world_gameobject_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_14_01_world_gameobject_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_14_02_world_creature_template_addon.sql create mode 100644 sql/old/3.3.5a/2012_04_14_03_world_spell_bonus_data.sql create mode 100644 sql/old/3.3.5a/2012_04_14_04_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_14_05_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_16_00_world_game_event.sql create mode 100644 sql/old/3.3.5a/2012_04_17_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_04_18_00_world_npc_spellclick_spells.sql create mode 100644 sql/old/3.3.5a/2012_04_18_01_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_04_18_02_world_reference_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_18_03_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_18_04_world_pickpocketing_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_18_05_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_04_18_06_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_18_07_world_fishing_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_18_08_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_19_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_04_19_01_world_pickpocketing_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_19_02_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_19_03_world_instance_ulduar.sql create mode 100644 sql/old/3.3.5a/2012_04_20_00_world_gameobject_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_20_01_world_item_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_20_02_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_20_03_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_20_04_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_20_05_gameobject_template.sql create mode 100644 sql/old/3.3.5a/2012_04_21_00_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_22_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_04_23_00_world_creatures.sql create mode 100644 sql/old/3.3.5a/2012_04_23_01_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_04_23_02_world_prospecting_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_23_03_world_skinning_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_23_04_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_23_05_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_24_00_world_command.sql create mode 100644 sql/old/3.3.5a/2012_04_24_01_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_24_02_world_warden_checks.sql create mode 100644 sql/old/3.3.5a/2012_04_24_03_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_24_04_world_spell_proc_event.sql create mode 100644 sql/old/3.3.5a/2012_04_24_05_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_24_06_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_04_25_00_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_04_25_01_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_25_02_world_spell_script_names.sql create mode 100644 sql/old/3.3.5a/2012_04_25_03_world_spell_group.sql create mode 100644 sql/old/3.3.5a/2012_04_26_00_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_04_26_01_world_smart_scripts.sql create mode 100644 sql/old/3.3.5a/2012_04_27_00_world_instance_icc.sql create mode 100644 sql/old/3.3.5a/2012_04_28_00_world_reference_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_04_28_01_world_reference_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_05_01_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_05_02_00_world_creature_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_05_03_00_world_creature.sql create mode 100644 sql/old/3.3.5a/2012_05_03_01_world_cos_misc.sql create mode 100644 sql/old/3.3.5a/2012_05_03_02_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_05_03_03_world_creature_questrelation.sql create mode 100644 sql/old/3.3.5a/2012_05_03_04_world_game_event_creature_quest.sql create mode 100644 sql/old/3.3.5a/2012_05_04_00_world_waypoints.sql create mode 100644 sql/old/3.3.5a/2012_05_04_01_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_05_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_05_01_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_05_05_02_world_gameobject.sql create mode 100644 sql/old/3.3.5a/2012_05_05_03_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_05_04_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_05_05_05_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_05_05_06_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_06_00_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_05_06_01_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_05_07_00_world_waypoints.sql create mode 100644 sql/old/3.3.5a/2012_05_07_01_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_08_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_08_01_world_gameobject.sql create mode 100644 sql/old/3.3.5a/2012_05_08_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_05_09_00_world_spell_target_position.sql create mode 100644 sql/old/3.3.5a/2012_05_09_01_world_commands.sql create mode 100644 sql/old/3.3.5a/2012_05_09_02_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_09_03_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_05_10_00_world_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_10_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_05_10_02_world_creature_template.sql create mode 100644 sql/old/3.3.5a/2012_05_10_03_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_05_10_04_world_ceature_sai.sql create mode 100644 sql/old/3.3.5a/2012_05_10_05_world_waypoints.sql create mode 100644 sql/old/3.3.5a/2012_05_10_06_world_waypoints.sql create mode 100644 sql/old/3.3.5a/2012_05_11_00_world_waypoints.sql create mode 100644 sql/old/3.3.5a/2012_05_11_01_world_gameobject_template.sql create mode 100644 sql/old/3.3.5a/2012_05_11_02_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_05_12_00_world_gameobject_template.sql create mode 100644 sql/old/3.3.5a/2012_05_12_01_world_item_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_05_12_02_world_gameobject_loot_template.sql create mode 100644 sql/old/3.3.5a/2012_05_13_00_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_05_13_01_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_05_16_00_world_scripts.sql create mode 100644 sql/old/3.3.5a/2012_05_17_00_world_creature_text.sql create mode 100644 sql/old/3.3.5a/2012_05_18_00_world_conditions.sql create mode 100644 sql/old/3.3.5a/2012_05_18_01_world_misc.sql create mode 100644 sql/old/3.3.5a/2012_05_18_01_world_spell_target_position.sql create mode 100644 sql/old/3.3.5a/2012_05_19_00_world_quest_template.sql create mode 100644 sql/old/3.3.5a/2012_05_19_01_world_smart_scripts.sql create mode 100644 sql/old/3.3.5a/2012_05_19_02_world_misc.sql delete mode 100644 sql/updates/auth/2012_02_19_00_auth_account.sql delete mode 100644 sql/updates/characters/2012_02_19_00_characters_warden_action.sql delete mode 100644 sql/updates/world/2012_02_13_00_world_version.sql delete mode 100644 sql/updates/world/2012_02_14_00_world_achievement_criteria_data.sql delete mode 100644 sql/updates/world/2012_02_15_00_world_quest_template.sql delete mode 100644 sql/updates/world/2012_02_15_01_world_areatrigger_tavern.sql delete mode 100644 sql/updates/world/2012_02_15_02_world_item_template.sql delete mode 100644 sql/updates/world/2012_02_15_03_world_quest_template.sql delete mode 100644 sql/updates/world/2012_02_15_04_world_quest_template.sql delete mode 100644 sql/updates/world/2012_02_15_06_world_creature_involvedrelation.sql delete mode 100644 sql/updates/world/2012_02_15_07_00_world_creature.sql delete mode 100644 sql/updates/world/2012_02_15_07_01_world_waypoint_data.sql delete mode 100644 sql/updates/world/2012_02_15_07_02_world_misc.sql delete mode 100644 sql/updates/world/2012_02_15_08_world_sai.sql delete mode 100644 sql/updates/world/2012_02_15_09_world_spell_proc_event.sql delete mode 100644 sql/updates/world/2012_02_16_00_world_conditions.sql delete mode 100644 sql/updates/world/2012_02_16_01_world_conditions.sql delete mode 100644 sql/updates/world/2012_02_17_00_world_waypoints.sql delete mode 100644 sql/updates/world/2012_02_18_00_world_spell_script_names.sql delete mode 100644 sql/updates/world/2012_02_18_01_world_spell_dbc.sql delete mode 100644 sql/updates/world/2012_02_18_02_world_gossip.sql delete mode 100644 sql/updates/world/2012_02_18_03_world_gossip.sql delete mode 100644 sql/updates/world/2012_02_18_04_world_spell_script_names.sql delete mode 100644 sql/updates/world/2012_02_18_05_world_creatures.sql delete mode 100644 sql/updates/world/2012_02_18_06_world_gossip.sql delete mode 100644 sql/updates/world/2012_02_18_07_world_gossip.sql delete mode 100644 sql/updates/world/2012_02_18_08_world_gossip.sql delete mode 100644 sql/updates/world/2012_02_19_00_world_quest_template.sql delete mode 100644 sql/updates/world/2012_02_19_01_world_quest_template.sql delete mode 100644 sql/updates/world/2012_02_19_02_world_gameobject.sql delete mode 100644 sql/updates/world/2012_02_19_03_world_warden_checks.sql delete mode 100644 sql/updates/world/2012_02_19_04_world_misc_db_updates.sql delete mode 100644 sql/updates/world/2012_02_19_05_world_say_text.sql delete mode 100644 sql/updates/world/2012_02_19_06_world_say_text.sql delete mode 100644 sql/updates/world/2012_02_20_00_world_sai.sql delete mode 100644 sql/updates/world/2012_02_20_01_world_misc_db.sql delete mode 100644 sql/updates/world/2012_02_20_02_world_conditons.sql delete mode 100644 sql/updates/world/2012_02_21_00_world_creature_loot_template.sql delete mode 100644 sql/updates/world/2012_02_21_01_world_conditions.sql delete mode 100644 sql/updates/world/2012_02_21_02_world_creature_loot_template.sql delete mode 100644 sql/updates/world/2012_02_21_03_world_creature_loot_template.sql delete mode 100644 sql/updates/world/2012_02_21_04_world_creature_loot_template.sql delete mode 100644 sql/updates/world/2012_02_21_05_world_Gossip_SAI.sql delete mode 100644 sql/updates/world/2012_02_21_06_world_Gossip.sql delete mode 100644 sql/updates/world/2012_02_22_00_world_SAI.sql delete mode 100644 sql/updates/world/2012_02_22_01_world_say_text.sql delete mode 100644 sql/updates/world/2012_02_22_02_world_misc.sql delete mode 100644 sql/updates/world/2012_02_22_03_world_conditions.sql create mode 100644 sql/updates/world/2012_05_19_03_world_version.sql create mode 100644 sql/updates/world/2012_05_19_04_creature_loot_template.sql create mode 100644 sql/updates/world/2012_05_19_05_gameobject_loot_template.sql create mode 100644 sql/updates/world/2012_05_19_06_gameobject_loot_template.sql create mode 100644 sql/updates/world/2012_05_20_00_world_misc.sql create mode 100644 sql/updates/world/2012_05_20_01_world_spell_bonus_data.sql create mode 100644 sql/updates/world/2012_05_22_00_world_spell_proc_event.sql create mode 100644 sql/updates/world/2012_05_22_01_world_creature_loot_template.sql create mode 100644 sql/updates/world/2012_05_23_00_world_creature.sql create mode 100644 sql/updates/world/2012_05_23_01_world_sai.sql create mode 100644 sql/updates/world/2012_05_23_02_world_sai.sql create mode 100644 sql/updates/world/2012_05_23_03_world_gameobject_loot_template.sql create mode 100644 sql/updates/world/2012_05_23_04_world_gameobject.sql create mode 100644 sql/updates/world/2012_05_23_05_world_creature.sql create mode 100644 sql/updates/world/2012_05_24_00_world_creature_misc.sql create mode 100644 sql/updates/world/2012_05_24_01_world_gameobject.sql create mode 100644 sql/updates/world/2012_05_25_00_world_sai.sql create mode 100644 sql/updates/world/2012_05_25_01_world_waypoints.sql create mode 100644 sql/updates/world/2012_05_25_02_world_creature_template.sql create mode 100644 sql/updates/world/2012_05_25_03_world_template.sql create mode 100644 sql/updates/world/2012_05_26_00_world_scripts.sql create mode 100644 sql/updates/world/2012_05_26_01_world_spell_dbc.sql create mode 100644 sql/updates/world/2012_05_26_02_world_creature_template.sql create mode 100644 sql/updates/world/2012_05_26_03_world_page_text.sql create mode 100644 sql/updates/world/2012_05_26_04_world_creature_template.sql create mode 100644 sql/updates/world/2012_05_26_05_world_creature_template.sql create mode 100644 sql/updates/world/2012_05_26_06_world_smart_scripts.sql create mode 100644 sql/updates/world/2012_05_27_00_world_gameobject_template.sql create mode 100644 sql/updates/world/2012_05_27_01_world_waypoints.sql create mode 100644 sql/updates/world/2012_05_27_02_world_creature.sql create mode 100644 sql/updates/world/2012_05_27_03_world_creature.sql create mode 100644 sql/updates/world/2012_05_27_04_world_smart_scripts.sql create mode 100644 sql/updates/world/2012_05_27_05_world_gameobject.sql create mode 100644 sql/updates/world/2012_05_27_06_world_creature.sql create mode 100644 sql/updates/world/2012_05_27_07_world_game_event.sql create mode 100644 sql/updates/world/2012_05_27_07_world_waypoints.sql create mode 100644 sql/updates/world/2012_05_28_00_world_creature_ai_scripts.sql create mode 100644 sql/updates/world/2012_05_28_01_world_creature.sql create mode 100644 sql/updates/world/2012_05_28_02_world_creature.sql create mode 100644 sql/updates/world/2012_05_28_03_waypoint_data.sql create mode 100644 sql/updates/world/2012_05_28_04_world_creature_template.sql create mode 100644 sql/updates/world/2012_05_28_05_world_creature.sql create mode 100644 sql/updates/world/2012_05_28_06_world_creature_addon.sql create mode 100644 sql/updates/world/2012_05_28_06_world_waypoint_data.sql create mode 100644 sql/updates/world/2012_05_28_07_world_quest_template.sql delete mode 100755 src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp delete mode 100644 src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h create mode 100644 src/server/game/Calendar/CalendarMgr.cpp create mode 100644 src/server/game/Calendar/CalendarMgr.h delete mode 100644 src/server/scripts/Commands/cs_gps.cpp delete mode 100644 src/server/scripts/EasternKingdoms/MoltenCore/molten_core.cpp delete mode 100644 src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp create mode 100644 src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp create mode 100644 src/server/shared/AutoPtr.h create mode 100644 src/server/shared/Containers.h delete mode 100755 src/server/shared/Dynamic/TypeContainerFunctionsPtr.h (limited to 'src/server/scripts') diff --git a/PreLoad.cmake b/PreLoad.cmake index a6dc928b906..0f1c0f6ce19 100644 --- a/PreLoad.cmake +++ b/PreLoad.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2005-2010 Trinity +# Copyright (C) 2005-2012 Trinity # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/cmake/compiler/gcc/settings.cmake b/cmake/compiler/gcc/settings.cmake index 3a2745702c8..8247831fdd8 100644 --- a/cmake/compiler/gcc/settings.cmake +++ b/cmake/compiler/gcc/settings.cmake @@ -3,14 +3,12 @@ add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"') add_definitions(-fno-delete-null-pointer-checks) -if( USE_SFMT) - if(PLATFORM EQUAL 32) - # Required on 32-bit systems to enable SSE2 (standard on x64) - add_definitions(-msse2 -mfpmath=sse) - endif() - add_definitions(-DHAVE_SSE2 -D__SSE2__) - message(STATUS "GCC: SFMT enabled, SSE2 flags forced") +if(PLATFORM EQUAL 32) + # Required on 32-bit systems to enable SSE2 (standard on x64) + add_definitions(-msse2 -mfpmath=sse) endif() +add_definitions(-DHAVE_SSE2 -D__SSE2__) +message(STATUS "GCC: SSE2 flags forced") if( WITH_WARNINGS ) add_definitions(-Wall -Wfatal-errors -Wextra) diff --git a/cmake/compiler/icc/settings.cmake b/cmake/compiler/icc/settings.cmake index 0e614ef97f8..b7e4cb742b3 100644 --- a/cmake/compiler/icc/settings.cmake +++ b/cmake/compiler/icc/settings.cmake @@ -1,13 +1,10 @@ # Set build-directive (used in core to tell which buildtype we used) add_definitions(-D_BUILD_DIRECTIVE="${CMAKE_BUILD_TYPE}") -if( USE_SFMT) - if(PLATFORM EQUAL 32) - add_definitions(-axSSE2) - else() - add_definitions(-xSSE2) - endif() - message(STATUS "ICC: SFMT enabled, SSE2 flags forced") +if(PLATFORM EQUAL 32) + add_definitions(-axSSE2) +else() + add_definitions(-xSSE2) endif() if( WITH_WARNINGS ) diff --git a/cmake/compiler/msvc/settings.cmake b/cmake/compiler/msvc/settings.cmake index eb55dc66c50..3d8fe43b6aa 100644 --- a/cmake/compiler/msvc/settings.cmake +++ b/cmake/compiler/msvc/settings.cmake @@ -20,11 +20,8 @@ else() set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") message(STATUS "MSVC: Enabled large address awareness") - # Test if we need SSE2-support - if(USE_SFMT) - add_definitions(/arch:SSE2) - message(STATUS "MSVC: Enabled SSE2 support") - endif() + add_definitions(/arch:SSE2) + message(STATUS "MSVC: Enabled SSE2 support") endif() # Set build-directive (used in core to tell which buildtype we used) diff --git a/cmake/genrev.cmake b/cmake/genrev.cmake index 37cea9b3deb..b1112d13c12 100644 --- a/cmake/genrev.cmake +++ b/cmake/genrev.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2010 Trinity +# Copyright (C) 2008-2012 Trinity # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/cmake/macros/CheckBuildDir.cmake b/cmake/macros/CheckBuildDir.cmake index 868643285ef..d67f930df99 100644 --- a/cmake/macros/CheckBuildDir.cmake +++ b/cmake/macros/CheckBuildDir.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2010 Trinity +# Copyright (C) 2008-2012 Trinity # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/cmake/options.cmake b/cmake/options.cmake index 17edc2697b7..11ebe6ddd12 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2010 Trinity +# Copyright (C) 2008-2012 Trinity # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -13,6 +13,5 @@ option(SCRIPTS "Build core with scripts included" option(TOOLS "Build map/vmap extraction/assembler tools" 0) option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts" 1) option(USE_COREPCH "Use precompiled headers when compiling servers" 1) -option(USE_SFMT "Use SFMT as random numbergenerator" 0) option(WITH_WARNINGS "Show all warnings during compile" 0) option(WITH_COREDEBUG "Include additional debug-code in core" 0) diff --git a/cmake/platform/unix/settings.cmake b/cmake/platform/unix/settings.cmake index 81f438befc9..dd8b7c081f3 100644 --- a/cmake/platform/unix/settings.cmake +++ b/cmake/platform/unix/settings.cmake @@ -1,6 +1,8 @@ # Package overloads - Linux if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(JEMALLOC_LIBRARY "jemalloc") + if (NOT NOJEM) + set(JEMALLOC_LIBRARY "jemalloc") + endif() endif() # set default configuration directory diff --git a/cmake/showoptions.cmake b/cmake/showoptions.cmake index 31e1b412b32..47ad7b0889b 100644 --- a/cmake/showoptions.cmake +++ b/cmake/showoptions.cmake @@ -50,13 +50,6 @@ else() message("* Build scripts w/PCH : No") endif() -if( USE_SFMT ) - message("* Use SFMT for RNG : Yes") - add_definitions(-DUSE_SFMT_FOR_RNG) -else() - message("* Use SFMT for RNG : No (default)") -endif() - if( WITH_WARNINGS ) message("* Show all warnings : Yes") else() @@ -78,4 +71,10 @@ if( WIN32 ) endif() endif( WIN32 ) +if ( NOJEM ) + message("") + message("*** WARNING: jemalloc linking has been disabled!") + message("*** Please note that this is for DEBUGGING WITH VALGRIND only!") + message("*** DO NOT DISABLE IT UNLESS YOU KNOW WHAT YOU'RE DOING!") +endif() message("") diff --git a/contrib/conf_merge/tc-conf-merger.pl b/contrib/conf_merge/tc-conf-merger.pl index d4902aba279..138d51705d7 100644 --- a/contrib/conf_merge/tc-conf-merger.pl +++ b/contrib/conf_merge/tc-conf-merger.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl -w -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # Author: leak # Date: 2010-12-06 # Note: Based on conf file format of rev 10507 diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt index ce80d43b0c1..946dadf33d8 100644 --- a/dep/CMakeLists.txt +++ b/dep/CMakeLists.txt @@ -15,8 +15,8 @@ elseif( MSVC ) endif() if(CMAKE_SYSTEM_NAME MATCHES "Linux") - if(SERVERS) - add_subdirectory(jemalloc) + if(SERVERS AND NOT NOJEM) + add_subdirectory(jemalloc) endif() endif() diff --git a/dep/PackageList.txt b/dep/PackageList.txt index b599bd0e11b..5d3d4bdcc4d 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -14,12 +14,8 @@ G3D (a commercial-grade C++ 3D engine available as Open Source (BSD License) jemalloc (a general-purpose scalable concurrent malloc-implementation) http://www.canonware.com/jemalloc/ - Version: 2.1.0 + Version: 2.2.5 -MersenneTwister (a very fast random number generator) - http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html - Version: 0.4.2 - MySQL (the world's most popular open source database software) http://www.mysql.com/ Version: 5.5.9 (GA) @@ -38,7 +34,7 @@ zlib (A Massively Spiffy Yet Delicately Unobtrusive Compression Library) gSOAP (a portable development toolkit for C and C++ XML Web services and XML data bindings) http://gsoap2.sourceforge.net/ - Version: 2.8.0 + Version: 2.8.2 StormLib (a pack of modules, written in C++, which are able to read and also to write files from/to the MPQ archives) http://www.zezula.net/en/mpq/stormlib.html diff --git a/dep/SFMT/SFMT.h b/dep/SFMT/SFMT.h index 03a7e853316..5498b9ac5fb 100644 --- a/dep/SFMT/SFMT.h +++ b/dep/SFMT/SFMT.h @@ -7,7 +7,7 @@ * in effect in addition to the GNU General Public License. * Copyright (c) 2006, 2007 by Mutsuo Saito, Makoto Matsumoto and Hiroshima University. * Copyright (c) 2008 by Agner Fog. - * Copyright (c) 2010 Trinity Core + * Copyright (c) 2012 Trinity Core * * BSD License: * Redistribution and use in source and binary forms, with or without @@ -39,6 +39,7 @@ #include // Define SSE2 intrinsics #include "randomc.h" // Define integer types etc #include +#include // Choose one of the possible Mersenne exponents. // Higher values give longer cycle length and use more memory: @@ -149,8 +150,14 @@ __m128i const &c, __m128i const &d, __m128i const &mask) { // Class for SFMT generator class SFMTRand { // Encapsulate random number generator + friend class ACE_TSS; + public: - SFMTRand() { LastInterval = 0; RandomInit((int)(time(0))); } + SFMTRand() + { + LastInterval = 0; + RandomInit((int)(time(0))); + } void RandomInit(int seed) // Re-seed { @@ -298,6 +305,46 @@ private: ix = 0; } + void* operator new(size_t size, std::nothrow_t const&) + { + return _mm_malloc(size, 16); + } + + void operator delete(void* ptr, std::nothrow_t const&) + { + _mm_free(ptr); + } + + void* operator new(size_t size) + { + return _mm_malloc(size, 16); + } + + void operator delete(void* ptr) + { + _mm_free(ptr); + } + + void* operator new[](size_t size, std::nothrow_t const&) + { + return _mm_malloc(size, 16); + } + + void operator delete[](void* ptr, std::nothrow_t const&) + { + _mm_free(ptr); + } + + void* operator new[](size_t size) + { + return _mm_malloc(size, 16); + } + + void operator delete[](void* ptr) + { + _mm_free(ptr); + } + uint32_t ix; // Index into state array uint32_t LastInterval; // Last interval length for IRandom uint32_t RLimit; // Rejection limit used by IRandom diff --git a/dep/SFMT/randomc.h b/dep/SFMT/randomc.h index 5370a701c0e..ee5ad9aa43b 100644 --- a/dep/SFMT/randomc.h +++ b/dep/SFMT/randomc.h @@ -7,7 +7,7 @@ * in effect in addition to the GNU General Public License. * Copyright (c) 2006, 2007 by Mutsuo Saito, Makoto Matsumoto and Hiroshima University. * Copyright (c) 2008 by Agner Fog. - * Copyright (c) 2010 Trinity Core + * Copyright (c) 2012 Trinity Core * * BSD License: * Redistribution and use in source and binary forms, with or without diff --git a/dep/mersennetwister/MersenneTwister.h b/dep/mersennetwister/MersenneTwister.h deleted file mode 100644 index 1cff879643f..00000000000 --- a/dep/mersennetwister/MersenneTwister.h +++ /dev/null @@ -1,405 +0,0 @@ -// MersenneTwister.h -// Mersenne Twister random number generator -- a C++ class MTRand -// Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// Richard J. Wagner v1.0 15 May 2003 rjwagner@writeme.com - -// The Mersenne Twister is an algorithm for generating random numbers. It -// was designed with consideration of the flaws in various other generators. -// The period, 2^19937-1, and the order of equidistribution, 623 dimensions, -// are far greater. The generator is also fast; it avoids multiplication and -// division, and it benefits from caches and pipelines. For more information -// see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html - -// Reference -// M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally -// Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on -// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. - -// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, -// Copyright (C) 2000 - 2003, Richard J. Wagner -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The names of its contributors may not be used to endorse or promote -// products derived from this software without specific prior written -// permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// The original code included the following notice: -// -// When you use this, send an email to: matumoto@math.keio.ac.jp -// with an appropriate reference to your work. -// -// It would be nice to CC: rjwagner@writeme.com and Cokus@math.washington.edu -// when you write. - -#ifndef MERSENNETWISTER_H -#define MERSENNETWISTER_H - -// Not thread safe (unless auto-initialization is avoided and each thread has -// its own MTRand object) - -#include"Define.h" - -#include -#include -#include - -class MTRand { -// Data -public: - typedef ::uint32 uint32; - enum { N = 624 }; // length of state vector - enum { SAVE = N + 1 }; // length of array for save() - -protected: - enum { M = 397 }; // period parameter - - uint32 state[N]; // internal state - uint32 *pNext; // next value to get from state - int left; // number of values left before reload needed - -//Methods -public: - MTRand( const uint32& oneSeed ); // initialize with a simple uint32 - MTRand( uint32 *const bigSeed, uint32 const seedLength = N ); // or an array - MTRand(); // auto-initialize with /dev/urandom or time() and clock() - MTRand(const MTRand&); // prevent copy constructor - MTRand& operator=(const MTRand&); // no-op operator= - - // Do NOT use for CRYPTOGRAPHY without securely hashing several returned - // values together, otherwise the generator state can be learned after - // reading 624 consecutive values. - - // Access to 32-bit random numbers - double rand(); // real number in [0,1] - double rand( const double& n ); // real number in [0,n] - double randExc(); // real number in [0,1) - double randExc( const double& n ); // real number in [0,n) - double randDblExc(); // real number in (0,1) - double randDblExc( const double& n ); // real number in (0,n) - uint32 randInt(); // integer in [0,2^32-1] - uint32 randInt( const uint32& n ); // integer in [0,n] for n < 2^32 - double operator()() { return rand(); } // same as rand() - - // Access to 53-bit random numbers (capacity of IEEE double precision) - double rand53(); // real number in [0,1) - - // Access to nonuniform random number distributions - double randNorm( const double& mean = 0.0, const double& variance = 0.0 ); - - // Re-seeding functions with same behavior as initializers - void seed( const uint32 oneSeed ); - void seed( uint32 *const bigSeed, const uint32 seedLength = N ); - void seed(); - - // Saving and loading generator state - void save( uint32* saveArray ) const; // to array of size SAVE - void load( uint32 *const loadArray ); // from such array - /* Trinity not use streams for random values output - friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); - friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); - */ -protected: - void initialize( const uint32 oneSeed ); - void reload(); - uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; } - uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; } - uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; } - uint32 mixBits( const uint32& u, const uint32& v ) const - { return hiBit(u) | loBits(v); } - uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const - { return m ^ (mixBits(s0,s1)>>1) ^ uint32(-(int32)(loBit(s1) & 0x9908b0dfUL)); } - static uint32 hash( time_t t, clock_t c ); -}; - -inline MTRand::MTRand(const MTRand&) - { seed(); } - -inline MTRand& MTRand::operator=(const MTRand&) - { return *this; } - -inline MTRand::MTRand( const uint32& oneSeed ) - { seed(oneSeed); } - -inline MTRand::MTRand( uint32 *const bigSeed, const uint32 seedLength ) - { seed(bigSeed,seedLength); } - -inline MTRand::MTRand() - { seed(); } - -inline double MTRand::rand() - { return double(randInt()) * (1.0/4294967295.0); } - -inline double MTRand::rand( const double& n ) - { return rand() * n; } - -inline double MTRand::randExc() - { return double(randInt()) * (1.0/4294967296.0); } - -inline double MTRand::randExc( const double& n ) - { return randExc() * n; } - -inline double MTRand::randDblExc() - { return ( double(randInt()) + 0.5 ) * (1.0/4294967296.0); } - -inline double MTRand::randDblExc( const double& n ) - { return randDblExc() * n; } - -inline double MTRand::rand53() -{ - uint32 a = randInt() >> 5, b = randInt() >> 6; - return ( a * 67108864.0 + b ) * (1.0/9007199254740992.0); // by Isaku Wada -} - -inline double MTRand::randNorm( const double& mean, const double& variance ) -{ - // Return a real number from a normal (Gaussian) distribution with given - // mean and variance by Box-Muller method - double r = sqrt( -2.0 * log( 1.0-randDblExc()) ) * variance; - double phi = 2.0 * 3.14159265358979323846264338328 * randExc(); - return mean + r * cos(phi); -} - -inline MTRand::uint32 MTRand::randInt() -{ - // Pull a 32-bit integer from the generator state - // Every other access function simply transforms the numbers extracted here - - if( left == 0 ) reload(); - --left; - - register uint32 s1; - s1 = *pNext++; - s1 ^= (s1 >> 11); - s1 ^= (s1 << 7) & 0x9d2c5680UL; - s1 ^= (s1 << 15) & 0xefc60000UL; - return ( s1 ^ (s1 >> 18) ); -} - -inline MTRand::uint32 MTRand::randInt( const uint32& n ) -{ - // Find which bits are used in n - // Optimized by Magnus Jonsson (magnus@smartelectronix.com) - uint32 used = n; - used |= used >> 1; - used |= used >> 2; - used |= used >> 4; - used |= used >> 8; - used |= used >> 16; - - // Draw numbers until one is found in [0,n] - uint32 i; - do - i = randInt() & used; // toss unused bits to shorten search - while( i > n ); - return i; -} - -inline void MTRand::seed( const uint32 oneSeed ) -{ - // Seed the generator with a simple uint32 - initialize(oneSeed); - reload(); -} - -inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength ) -{ - // Seed the generator with an array of uint32's - // There are 2^19937-1 possible initial states. This function allows - // all of those to be accessed by providing at least 19937 bits (with a - // default seed length of N = 624 uint32's). Any bits above the lower 32 - // in each element are discarded. - // Just call seed() if you want to get array from /dev/urandom - initialize(19650218UL); - register int i = 1; - register uint32 j = 0; - register int k = ( N > int(seedLength) ? N : int(seedLength) ); - for (; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1664525UL ); - state[i] += ( bigSeed[j] & 0xffffffffUL ) + j; - state[i] &= 0xffffffffUL; - ++i; ++j; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - if( j >= seedLength ) j = 0; - } - for (k = N - 1; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL ); - state[i] -= i; - state[i] &= 0xffffffffUL; - ++i; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - } - state[0] = 0x80000000UL; // MSB is 1, assuring non-zero initial array - reload(); -} - -inline void MTRand::seed() -{ - // Seed the generator with hash of time() and clock() values - seed( hash( time(NULL), clock() ) ); -} - -inline void MTRand::initialize( const uint32 seed ) -{ - // Initialize generator state with seed - // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. - // In previous versions, most significant bits (MSBs) of the seed affect - // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. - register uint32 *s = state; - register uint32 *r = state; - register int i = 1; - *s++ = seed & 0xffffffffUL; - for (; i < N; ++i ) - { - *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; - r++; - } -} - -inline void MTRand::reload() -{ - // Generate N new values in state - // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) - register uint32 *p = state; - register int i; - for (i = N - M; i--; ++p ) - *p = twist( p[M], p[0], p[1] ); - for (i = M; --i; ++p ) - *p = twist( p[M-N], p[0], p[1] ); - *p = twist( p[M-N], p[0], state[0] ); - - left = N, pNext = state; -} - -inline MTRand::uint32 MTRand::hash( time_t t, clock_t c ) -{ - // Get a uint32 from t and c - // Better than uint32(x) in case x is floating point in [0,1] - // Based on code by Lawrence Kirby (fred@genesis.demon.co.uk) - - static uint32 differ = 0; // guarantee time-based seeds will change - - uint32 h1 = 0; - unsigned char *p = (unsigned char *) &t; - for (size_t i = 0; i < sizeof(t); ++i ) - { - h1 *= UCHAR_MAX + 2U; - h1 += p[i]; - } - uint32 h2 = 0; - p = (unsigned char *) &c; - for (size_t j = 0; j < sizeof(c); ++j ) - { - h2 *= UCHAR_MAX + 2U; - h2 += p[j]; - } - return ( h1 + differ++ ) ^ h2; -} - -inline void MTRand::save( uint32* saveArray ) const -{ - register uint32 *sa = saveArray; - register const uint32 *s = state; - register int i = N; - for (; i--; *sa++ = *s++ ) {} - *sa = left; -} - -inline void MTRand::load( uint32 *const loadArray ) -{ - register uint32 *s = state; - register uint32 *la = loadArray; - register int i = N; - for (; i--; *s++ = *la++ ) {} - left = *la; - pNext = &state[N-left]; -} - -/* Trinity not use streams for random values output -inline std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ) -{ - register const MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for (; i--; os << *s++ << "\t" ) {} - return os << mtrand.left; -} - -inline std::istream& operator>>( std::istream& is, MTRand& mtrand ) -{ - register MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for (; i--; is >> *s++ ) {} - is >> mtrand.left; - mtrand.pNext = &mtrand.state[mtrand.N-mtrand.left]; - return is; -} -*/ - -#endif // MERSENNETWISTER_H - -// Change log: -// -// v0.1 - First release on 15 May 2000 -// - Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// - Translated from C to C++ -// - Made completely ANSI compliant -// - Designed convenient interface for initialization, seeding, and -// obtaining numbers in default or user-defined ranges -// - Added automatic seeding from /dev/urandom or time() and clock() -// - Provided functions for saving and loading generator state -// -// v0.2 - Fixed bug which reloaded generator one step too late -// -// v0.3 - Switched to clearer, faster reload() code from Matthew Bellew -// -// v0.4 - Removed trailing newline in saved generator format to be consistent -// with output format of built-in types -// -// v0.5 - Improved portability by replacing static const int's with enum's and -// clarifying return values in seed(); suggested by Eric Heimburg -// - Removed MAXINT constant; use 0xffffffffUL instead -// -// v0.6 - Eliminated seed overflow when uint32 is larger than 32 bits -// - Changed integer [0,n] generator to give better uniformity -// -// v0.7 - Fixed operator precedence ambiguity in reload() -// - Added access for real numbers in (0,1) and (0,n) -// -// v0.8 - Included time.h header to properly support time_t and clock_t -// -// v1.0 - Revised seeding to match 26 Jan 2002 update of Nishimura and Matsumoto -// - Allowed for seeding with arrays of any length -// - Added access for real numbers in [0,1) with 53-bit resolution -// - Added access for real numbers from normal (Gaussian) distributions -// - Increased overall speed by optimizing twist() -// - Doubled speed of integer [0,n] generation -// - Fixed out-of-range number generation on 64-bit machines -// - Improved portability by substituting literal constants for long enum's -// - Changed license from GNU LGPL to BSD - diff --git a/doc/UnixInstall.txt b/doc/UnixInstall.txt index 8691e5cf559..71ee4282a7c 100644 --- a/doc/UnixInstall.txt +++ b/doc/UnixInstall.txt @@ -1,5 +1,5 @@ = TrinityCore -- Linux installation = -Copyright (C) 2008-2011 TrinityCore (http://www.trinitycore.org) +Copyright (C) 2008-2012 TrinityCore (http://www.trinitycore.org) ========================================================= WARNING: THIS DOCUMENTATION IS NOT ALWAYS UP TO DATE. diff --git a/revision.h.in.cmake b/revision.h.in.cmake index 9212b8060ef..b553bb2f26f 100644 --- a/revision.h.in.cmake +++ b/revision.h.in.cmake @@ -3,7 +3,7 @@ #define _HASH "@rev_hash@" #define _DATE "@rev_date@" #define VER_COMPANYNAME_STR "TrinityCore Developers" - #define VER_LEGALCOPYRIGHT_STR "(c)2008-2011 TrinityCore" + #define VER_LEGALCOPYRIGHT_STR "(c)2008-2012 TrinityCore" #define VER_FILEVERSION 0,0,0 #define VER_FILEVERSION_STR "@rev_date@ (@rev_hash@)" #define VER_PRODUCTVERSION VER_FILEVERSION diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 2a86ad75166..9e894850fd7 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.13 Distrib 5.5.19, for Win64 (x86) +-- MySQL dump 10.13 Distrib 5.5.22, for Win64 (x86) -- -- Host: localhost Database: auth -- ------------------------------------------------------ --- Server version 5.5.19 +-- Server version 5.5.22 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,27 +23,27 @@ DROP TABLE IF EXISTS `account`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `account` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Identifier', + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Identifier', `username` varchar(32) NOT NULL DEFAULT '', `sha_pass_hash` varchar(40) NOT NULL DEFAULT '', - `sessionkey` longtext, - `v` longtext, - `s` longtext, - `email` text, + `sessionkey` varchar(80) NOT NULL DEFAULT '', + `v` varchar(64) NOT NULL DEFAULT '', + `s` varchar(64) NOT NULL DEFAULT '', + `email` varchar(254) NOT NULL DEFAULT '', `joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `last_ip` varchar(30) NOT NULL DEFAULT '127.0.0.1', - `failed_logins` int(11) unsigned NOT NULL DEFAULT '0', + `last_ip` varchar(15) NOT NULL DEFAULT '127.0.0.1', + `failed_logins` int(10) unsigned NOT NULL DEFAULT '0', `locked` tinyint(3) unsigned NOT NULL DEFAULT '0', `last_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - `online` tinyint(4) NOT NULL DEFAULT '0', + `online` tinyint(3) unsigned NOT NULL DEFAULT '0', `expansion` tinyint(3) unsigned NOT NULL DEFAULT '2', - `mutetime` bigint(40) NOT NULL DEFAULT '0', + `mutetime` bigint(20) NOT NULL DEFAULT '0', `locale` tinyint(3) unsigned NOT NULL DEFAULT '0', - `os` varchar(4) NOT NULL DEFAULT '', - `recruiter` int(11) NOT NULL DEFAULT '0', + `os` varchar(3) NOT NULL DEFAULT '', + `recruiter` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `idx_username` (`username`) -) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Account System'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Account System'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -63,11 +63,11 @@ DROP TABLE IF EXISTS `account_access`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `account_access` ( - `id` int(11) unsigned NOT NULL, + `id` int(10) unsigned NOT NULL, `gmlevel` tinyint(3) unsigned NOT NULL, `RealmID` int(11) NOT NULL DEFAULT '-1', PRIMARY KEY (`id`,`RealmID`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -87,14 +87,14 @@ DROP TABLE IF EXISTS `account_banned`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `account_banned` ( - `id` int(11) NOT NULL DEFAULT '0' COMMENT 'Account id', - `bandate` bigint(40) NOT NULL DEFAULT '0', - `unbandate` bigint(40) NOT NULL DEFAULT '0', + `id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Account id', + `bandate` int(10) unsigned NOT NULL DEFAULT '0', + `unbandate` int(10) unsigned NOT NULL DEFAULT '0', `bannedby` varchar(50) NOT NULL, `banreason` varchar(255) NOT NULL, - `active` tinyint(4) NOT NULL DEFAULT '1', + `active` tinyint(3) unsigned NOT NULL DEFAULT '1', PRIMARY KEY (`id`,`bandate`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Ban List'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Ban List'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -114,13 +114,13 @@ DROP TABLE IF EXISTS `ip_banned`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `ip_banned` ( - `ip` varchar(32) NOT NULL DEFAULT '127.0.0.1', - `bandate` bigint(40) NOT NULL, - `unbandate` bigint(40) NOT NULL, + `ip` varchar(15) NOT NULL DEFAULT '127.0.0.1', + `bandate` int(10) unsigned NOT NULL, + `unbandate` int(10) unsigned NOT NULL, `bannedby` varchar(50) NOT NULL DEFAULT '[Console]', `banreason` varchar(255) NOT NULL DEFAULT 'no reason', PRIMARY KEY (`ip`,`bandate`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Banned IPs'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Banned IPs'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -140,11 +140,11 @@ DROP TABLE IF EXISTS `logs`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `logs` ( - `time` int(14) NOT NULL, - `realm` int(4) NOT NULL, - `type` int(4) NOT NULL, - `string` text -) ENGINE=MyISAM DEFAULT CHARSET=latin1; + `time` int(10) unsigned NOT NULL, + `realm` int(10) unsigned NOT NULL, + `type` tinyint(3) unsigned NOT NULL, + `string` text CHARACTER SET latin1 +) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -164,12 +164,12 @@ DROP TABLE IF EXISTS `realmcharacters`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `realmcharacters` ( - `realmid` int(11) unsigned NOT NULL DEFAULT '0', - `acctid` bigint(20) unsigned NOT NULL, + `realmid` int(10) unsigned NOT NULL DEFAULT '0', + `acctid` int(10) unsigned NOT NULL, `numchars` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`realmid`,`acctid`), KEY `acctid` (`acctid`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm Character Tracker'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Realm Character Tracker'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -189,19 +189,19 @@ DROP TABLE IF EXISTS `realmlist`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `realmlist` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '', - `address` varchar(32) NOT NULL DEFAULT '127.0.0.1', - `port` int(11) NOT NULL DEFAULT '8085', + `address` varchar(255) NOT NULL DEFAULT '127.0.0.1', + `port` smallint(5) unsigned NOT NULL DEFAULT '8085', `icon` tinyint(3) unsigned NOT NULL DEFAULT '0', - `color` tinyint(3) unsigned NOT NULL DEFAULT '2', + `flag` tinyint(3) unsigned NOT NULL DEFAULT '2', `timezone` tinyint(3) unsigned NOT NULL DEFAULT '0', `allowedSecurityLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', `population` float unsigned NOT NULL DEFAULT '0', - `gamebuild` int(11) unsigned NOT NULL DEFAULT '14545', + `gamebuild` int(10) unsigned NOT NULL DEFAULT '14545', PRIMARY KEY (`id`), UNIQUE KEY `idx_name` (`name`) -) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System'; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Realm System'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -223,14 +223,13 @@ DROP TABLE IF EXISTS `uptime`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `uptime` ( - `realmid` int(11) unsigned NOT NULL, - `starttime` bigint(20) unsigned NOT NULL DEFAULT '0', - `startstring` varchar(64) NOT NULL DEFAULT '', - `uptime` bigint(20) unsigned NOT NULL DEFAULT '0', + `realmid` int(10) unsigned NOT NULL, + `starttime` int(10) unsigned NOT NULL DEFAULT '0', + `uptime` int(10) unsigned NOT NULL DEFAULT '0', `maxplayers` smallint(5) unsigned NOT NULL DEFAULT '0', `revision` varchar(255) NOT NULL DEFAULT 'Trinitycore', PRIMARY KEY (`realmid`,`starttime`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Uptime system'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Uptime system'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -251,4 +250,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2012-02-19 13:18:35 +-- Dump completed on 2012-03-28 18:26:06 diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 5f4b90d9f17..6820bdee1c0 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.13 Distrib 5.5.9, for Win64 (x86) +-- MySQL dump 10.13 Distrib 5.5.21, for Win64 (x86) -- -- Host: localhost Database: characters -- ------------------------------------------------------ --- Server version 5.5.9 +-- Server version 5.5.21 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1924,6 +1924,8 @@ CREATE TABLE `lag_reports` ( `posX` float NOT NULL DEFAULT '0', `posY` float NOT NULL DEFAULT '0', `posZ` float NOT NULL DEFAULT '0', + `latency` int(10) unsigned NOT NULL DEFAULT '0', + `createTime` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`reportId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2262,3 +2264,5 @@ UNLOCK TABLES; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2012-03-25 21:14:19 diff --git a/sql/old/3.3.5a/2012_02_13_00_world_version.sql b/sql/old/3.3.5a/2012_02_13_00_world_version.sql new file mode 100644 index 00000000000..2dd7ab92ddb --- /dev/null +++ b/sql/old/3.3.5a/2012_02_13_00_world_version.sql @@ -0,0 +1 @@ +UPDATE `version` SET `db_version`='TDB 335.11.46' LIMIT 1; diff --git a/sql/old/3.3.5a/2012_02_14_00_world_achievement_criteria_data.sql b/sql/old/3.3.5a/2012_02_14_00_world_achievement_criteria_data.sql new file mode 100644 index 00000000000..e7993726132 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_14_00_world_achievement_criteria_data.sql @@ -0,0 +1,7 @@ +-- Criteria conditions for Once Bitten, Twice Shy achievement +DELETE FROM `achievement_criteria_data` WHERE `type`=12 AND `criteria_id` IN (13013, 13012, 13011, 12780); +INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`scriptname`) VALUES +(13013, 12, 1, 0, ""), -- heroic +(13012, 12, 1, 0, ""), -- heroic +(13011, 12, 0, 0, ""), -- normal +(12780, 12, 0, 0, ""); -- normal diff --git a/sql/old/3.3.5a/2012_02_15_00_world_quest_template.sql b/sql/old/3.3.5a/2012_02_15_00_world_quest_template.sql new file mode 100644 index 00000000000..e26f52fd0fe --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_00_world_quest_template.sql @@ -0,0 +1 @@ +UPDATE `quest_template` SET `OfferRewardText` = 'Good, $C. You have done well in serving the Dark Lady. Your continued perseverance and ambition will be of great use to the Lady''s subjects. Return to me again in the future. Perhaps I will have other tasks for you that will aid the Dark Lady in her attempts at overtaking the Lich King and completely freeing the Scourge.', `RequestItemsText` = 'There are a hundred other tasks awaiting my attention, $C. Do you have the books?' WHERE `Id` = 14356; diff --git a/sql/old/3.3.5a/2012_02_15_01_world_areatrigger_tavern.sql b/sql/old/3.3.5a/2012_02_15_01_world_areatrigger_tavern.sql new file mode 100644 index 00000000000..1c3d45dc490 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_01_world_areatrigger_tavern.sql @@ -0,0 +1,13 @@ +DELETE FROM `areatrigger_tavern` WHERE `id` IN (98, 4109, 4300, 4378, 4380, 4498, 4608, 5314, 5315, 5316, 5317); +INSERT INTO `areatrigger_tavern` (`id`, `name`) VALUES +(98, 'Nesingwary''s Expedition'), +(4109, 'Tranquillen - Upper level Inn'), +(4300, 'Cenarion Refugee - Outside Inn'), +(4378, 'Stonebreaker Hold Inn'), +(4380, 'Falcon Watch Inn'), +(4498, 'Old Hillsbrad Foothills Inn'), +(4608, 'Sanctum Of The Stars - Upper level Inn'), +(5314, 'Wyrmrest Temple'), +(5315, 'Wyrmrest Temple'), +(5316, 'Wyrmrest Temple'), +(5317, 'Wyrmrest Temple'); diff --git a/sql/old/3.3.5a/2012_02_15_02_world_item_template.sql b/sql/old/3.3.5a/2012_02_15_02_world_item_template.sql new file mode 100644 index 00000000000..463d43368cd --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_02_world_item_template.sql @@ -0,0 +1,3 @@ +DELETE FROM `item_template` WHERE `entry`=49867; +INSERT INTO `item_template` (`entry`, `class`, `subclass`, `unk0`, `name`, `displayid`, `Quality`, `Flags`, `FlagsExtra`, `BuyCount`, `BuyPrice`, `SellPrice`, `InventoryType`, `AllowableClass`, `AllowableRace`, `ItemLevel`, `RequiredLevel`, `RequiredSkill`, `RequiredSkillRank`, `requiredspell`, `requiredhonorrank`, `RequiredCityRank`, `RequiredReputationFaction`, `RequiredReputationRank`, `maxcount`, `stackable`, `ContainerSlots`, `StatsCount`, `stat_type1`, `stat_value1`, `stat_type2`, `stat_value2`, `stat_type3`, `stat_value3`, `stat_type4`, `stat_value4`, `stat_type5`, `stat_value5`, `stat_type6`, `stat_value6`, `stat_type7`, `stat_value7`, `stat_type8`, `stat_value8`, `stat_type9`, `stat_value9`, `stat_type10`, `stat_value10`, `ScalingStatDistribution`, `ScalingStatValue`, `dmg_min1`, `dmg_max1`, `dmg_type1`, `dmg_min2`, `dmg_max2`, `dmg_type2`, `armor`, `holy_res`, `fire_res`, `nature_res`, `frost_res`, `shadow_res`, `arcane_res`, `delay`, `ammo_type`, `RangedModRange`, `spellid_1`, `spelltrigger_1`, `spellcharges_1`, `spellppmRate_1`, `spellcooldown_1`, `spellcategory_1`, `spellcategorycooldown_1`, `spellid_2`, `spelltrigger_2`, `spellcharges_2`, `spellppmRate_2`, `spellcooldown_2`, `spellcategory_2`, `spellcategorycooldown_2`, `spellid_3`, `spelltrigger_3`, `spellcharges_3`, `spellppmRate_3`, `spellcooldown_3`, `spellcategory_3`, `spellcategorycooldown_3`, `spellid_4`, `spelltrigger_4`, `spellcharges_4`, `spellppmRate_4`, `spellcooldown_4`, `spellcategory_4`, `spellcategorycooldown_4`, `spellid_5`, `spelltrigger_5`, `spellcharges_5`, `spellppmRate_5`, `spellcooldown_5`, `spellcategory_5`, `spellcategorycooldown_5`, `bonding`, `description`, `PageText`, `LanguageID`, `PageMaterial`, `startquest`, `lockid`, `Material`, `sheath`, `RandomProperty`, `RandomSuffix`, `block`, `itemset`, `MaxDurability`, `area`, `Map`, `BagFamily`, `TotemCategory`, `socketColor_1`, `socketContent_1`, `socketColor_2`, `socketContent_2`, `socketColor_3`, `socketContent_3`, `socketBonus`, `GemProperties`, `RequiredDisenchantSkill`, `ArmorDamageModifier`, `Duration`, `ItemLimitCategory`, `HolidayId`, `ScriptName`, `DisenchantID`, `FoodType`, `minMoneyLoot`, `maxMoneyLoot`, `WDBVerified`) VALUES +(49867, 12, 0, -1, 'Crown Chemical Co. Supplies', 11448, 1, 0, 8192, 1, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 4, 'You can hear the clink of glass... dont drop it!', 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 423, 0, 0, 0, 0, 14545); diff --git a/sql/old/3.3.5a/2012_02_15_03_world_quest_template.sql b/sql/old/3.3.5a/2012_02_15_03_world_quest_template.sql new file mode 100644 index 00000000000..833d36b246c --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_03_world_quest_template.sql @@ -0,0 +1,18 @@ +-- Love is in the Air +-- Quests Missing Text ... By Albis + +UPDATE `quest_template` SET `RequestItemsText` ='The cologne isn''t going to give itself out, you know.$B$BGet spraying!' , `OfferRewardText` ='Nice work, $N! People will be buying Crown colognes by the crate-load now that they''ve had a chance to try them.$B$BHere''s a little something for helping us out.' WHERE `Id` = 24635; +UPDATE `quest_template` SET `RequestItemsText` ='That perfume''s not going to spray itself, you know.$B$BGet going!' , `OfferRewardText` ='Great work, $N! People will come running to buy Crown perfumes now that they''ve had a chance to sample their wonders.$B$BHere''s a little something for helping us out.' WHERE `Id` = 24629; +UPDATE `quest_template` SET `RequestItemsText` ='You know, those chocolates aren''t going to fling themselves at people.$B$BYou need to get to work!' , `OfferRewardText` ='Lovely work, $N! People will be tripping over one another to get Crown chocolates now that they''ve had a chance to taste those sweet, romantic treats.$B$BHere''s a little something for helping us out.' WHERE `Id` = 24636; +UPDATE `quest_template` SET `OfferRewardText` ='Hey. You got some time on your hands? I could use someone like you.' WHERE `Id` IN (24804,24805); +UPDATE `quest_template` SET `RequestItemsText` ='You analyze that reek yet, kid?' , `OfferRewardText` ='Hey, thanks, kid. Give it over, let''s take a look.$B$B$B$BOh, that ain''t good.' WHERE `Id` IN (24655,24536); +UPDATE `quest_template` SET `RequestItemsText` ='Did they toss ya a crate to deliver?' , `OfferRewardText` ='You got it, huh? Good job, kid. Top notch. Let''s see what we what we got here.$B$B$B$BThat''s not like my Snivel, but what choice is there?' WHERE `Id` = 24848; +UPDATE `quest_template` SET `OfferRewardText` ='You''re not Snivel. He was supposed to be here an hour ago! What have you done with him?$B$B$B$BThis isn''t like my Snivel. Do you think something''s happened to him?' WHERE `Id` = 24850; +UPDATE `quest_template` SET `RequestItemsText` ='Who are you?' , `OfferRewardText` ='All he talked about was leaving town with all his money? Then he really has abandoned me, hasn''t he?$B$BOh, $N. I was such a fool to fall for him, but how could I help myself? He was so irresistible!' WHERE `Id` = 24849; +UPDATE `quest_template` SET `RequestItemsText` ='Who are you?' , `OfferRewardText` ='All he talked about was leaving town with all his money? Then he really has abandoned me, hasn''t he?$B$BI can''t believe I fell for such a horrible goblin! But he was so irresistible when we first met.' WHERE `Id` = 24851; +UPDATE `quest_template` SET `RequestItemsText` ='Did you find the guy, or did he crawl under a rock?' , `OfferRewardText` ='You got his ledger? Really? That''s great, $N. There''s probably loads of good information in here.' WHERE `Id` IN (24657,24576); +UPDATE `quest_template` SET `OfferRewardText` ='Fantastic. Help is exactly what I need.' WHERE `Id` IN (24792,24793); +UPDATE `quest_template` SET `RequestItemsText` ='I don''t remember ordering a cleaing service... why yes, I am Apothecary Hummel.$B$B...wait, what is the meaning of this? You think these meaningless papers can stop me? Hah!' , `OfferRewardText` ='What we do here is none of your business...' WHERE `Id` = 11488; +UPDATE `quest_template` SET `RequestItemsText` ='Did you take care of those no-good scheming villains?' , `OfferRewardText` ='What''ve you got there?$B$BOh hey, this is big. Real big. Most of the crazy details in one little package. Thanks - you really helped us reel this all in. Good working with ya.' WHERE `Id` IN (24745,14483); +UPDATE `quest_template` SET `RequestItemsText` ='Did you teach ''em a lesson?' , `OfferRewardText` ='Good job, kid. You deserve a little somethin''. And hey, come back tomorrow if you get the time; I might have a job for ya.' WHERE `Id` IN (24658,24665,24666,24664,24663,24659,24660,24662,24647,24638,24651,24652,24650,24649,24645,24648); diff --git a/sql/old/3.3.5a/2012_02_15_04_world_quest_template.sql b/sql/old/3.3.5a/2012_02_15_04_world_quest_template.sql new file mode 100644 index 00000000000..8b6ad1d2cf9 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_04_world_quest_template.sql @@ -0,0 +1,17 @@ +-- Horde +UPDATE `quest_template` SET `PrevQuestId`=24805 WHERE `Id`=24536; -- Uncommon Scents completed before starting Something Stinks +UPDATE `quest_template` SET `PrevQuestId`=24536 WHERE `Id`=24541; -- Something Stinks completed before starting Pilfering Perfume +UPDATE `quest_template` SET `PrevQuestId`=24541 WHERE `Id`=24850; -- Pilfering Perfume completed before starting Snivel's Sweetheart +UPDATE `quest_template` SET `PrevQuestId`=24850 WHERE `Id`=24851; -- Snivel's Sweetheart completed before starting Hot On The Trail +UPDATE `quest_template` SET `PrevQuestId`=24851 WHERE `Id`=24576; -- Hot On The Trail completed before starting A Friendly Chat... + +UPDATE `quest_template` SET `PrevQuestId`=24576 WHERE `Id` IN (24638,24645,24647,24648,24649,24650,24651,24652); -- A Friendly Chat... completed before starting Crushing the Crown + +-- Alliance +UPDATE `quest_template` SET `PrevQuestId`=24804 WHERE `Id`=24655; -- Uncommon Scents completed before starting Something Stinks +UPDATE `quest_template` SET `PrevQuestId`=24655 WHERE `Id`=24656; -- Something Stinks completed before starting Pilfering Perfume +UPDATE `quest_template` SET `PrevQuestId`=24656 WHERE `Id`=24848; -- Pilfering Perfume completed before starting Snivel's Sweetheart +UPDATE `quest_template` SET `PrevQuestId`=24848 WHERE `Id`=24849; -- Snivel's Sweetheart completed before starting Hot On The Trail +UPDATE `quest_template` SET `PrevQuestId`=24849 WHERE `Id`=24657; -- Hot On The Trail completed before starting A Friendly Chat... + +UPDATE `quest_template` SET `PrevQuestId`=24657 WHERE `Id` IN (24658,24659,24660,24662,24663,24664,24665,24666); -- A Friendly Chat... completed before starting Crushing the Crown diff --git a/sql/old/3.3.5a/2012_02_15_06_world_creature_involvedrelation.sql b/sql/old/3.3.5a/2012_02_15_06_world_creature_involvedrelation.sql new file mode 100644 index 00000000000..431e23b53b8 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_06_world_creature_involvedrelation.sql @@ -0,0 +1,3 @@ +DELETE FROM `creature_involvedrelation` WHERE `quest`=24745; +INSERT INTO `creature_involvedrelation` (`id`, `quest`) VALUES +(38066, 24745); -- A - Something is in the Air (and it Ain't Love) - Inspector Snip Snagglebolt diff --git a/sql/old/3.3.5a/2012_02_15_07_00_world_creature.sql b/sql/old/3.3.5a/2012_02_15_07_00_world_creature.sql new file mode 100644 index 00000000000..75beec97d67 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_07_00_world_creature.sql @@ -0,0 +1,57 @@ +SET @GUID := 40489; +SET @NPC :=3254; + +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+7; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@GUID ,@NPC,1,1,1,0,0, 10.3997021, -2316.43555, 92.1945343, 2.91896486,120,0,0,1,0,0,0,0,0), +(@GUID+1,@NPC,1,1,1,0,0,346.736572 , -2606.38916, 91.7916641, 1.58010352,120,0,0,1,0,0,0,0,0), +(@GUID+2,@NPC,1,1,1,0,0, 83.07206 , -2545.2085 , 98.107666 , 1.86412442,120,0,0,1,0,0,0,0,0), +(@GUID+3,@NPC,1,1,1,0,0,-93.53362 , -2287.0835 , 92.35358 , 0.8518014 ,120,0,0,1,0,0,0,0,0), +(@GUID+4,@NPC,1,1,1,0,0,-618.9995,-2738.234,91.91664,4.303216,120,0,0,1,0,0,0,0,0), +(@GUID+5,@NPC,1,1,1,0,0,-491.2982,-2473.443,93.66666,2.670027,120,0,0,1,0,0,0,0,0), +(@GUID+6,@NPC,1,1,1,0,0,-614.9523,-2721.66 ,93.85735,1.412064,120,0,0,1,0,0,0,0,0), +(@GUID+7,@NPC,1,1,1,0,0,-617.4864,-2710.463,96.7657 ,1.582084,120,0,0,1,0,0,0,0,0); + +SET @NPC1=@GUID*10; +SET @NPC2=(@GUID+1)*10; +SET @NPC3=(@GUID+2)*10; +SET @NPC4=(@GUID+3)*10; +SET @NPC5=(@GUID+6)*10; +SET @NPC6=(@GUID+7)*10; + +DELETE FROM `waypoint_data` WHERE `id` IN (@NPC1,@NPC2,@NPC3,@NPC4,@NPC5,@NPC6); +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +-- 1st +(@NPC1,1,6.336712,-2322.309,92.16663,0,0,0,0,100,0), +-- 2nd +(@NPC2,1,346.4289,-2573.332,91.79166,0,0,0,0,100,0), +-- 3rd +(@NPC3,1,81.53384,-2540.826,97.38716,0,0,0,0,100,0), +(@NPC3,2,80.28384,-2537.076,96.63716,0,0,0,0,100,0), +(@NPC3,3,79.03384,-2533.326,95.38716,0,0,0,0,100,0), +(@NPC3,4,78.28384,-2530.326,94.63716,0,0,0,0,100,0), +(@NPC3,5,77.03384,-2526.576,93.63716,0,0,0,0,100,0), +(@NPC3,6,76.49564,-2523.443,93.66665,0,0,0,0,100,0), +-- 4th +(@NPC4,1,-88.46167,-2281.137,92.69763,0,0,0,0,100,0), +(@NPC4,2,-92.46167,-2285.637,91.94763,0,0,0,0,100,0), +-- 5th +(@NPC5,1,-614.9318,-2720.435,94.01199,0,0,0,0,100,0), +-- 6th +(@NPC6,1,-617.2921,-2722.99,93.41664,0,0,0,0,100,0), +(@NPC6,2,-617.3077,-2721.99,93.41664,0,0,0,0,100,0), +(@NPC6,3,-617.3398,-2719.99,94.16664,0,0,0,0,100,0), +(@NPC6,4,-617.3867,-2716.99,95.04164,0,0,0,0,100,0), +(@NPC6,5,-617.4336,-2713.99,95.91664,0,0,0,0,100,0), +(@NPC6,6,-617.4805,-2710.99,96.66664,0,0,0,0,100,0), +(@NPC6,7,-617.503,-2708.995,97.04164,0,0,0,0,100,0), +(@NPC6,8,-617.503,-2708.995,97.04164,0,0,0,0,100,0); + +DELETE FROM `creature_addon` WHERE `guid` IN (@GUID,@GUID+1,@GUID+2,@GUID+3,@GUID+6,@GUID+7); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@GUID ,@NPC1,0,0,0,0,''), +(@GUID+1,@NPC2,0,0,0,0,''), +(@GUID+2,@NPC3,0,0,0,0,''), +(@GUID+3,@NPC4,0,0,0,0,''), +(@GUID+6,@NPC5,0,0,0,0,''), +(@GUID+7,@NPC6,0,0,0,0,''); diff --git a/sql/old/3.3.5a/2012_02_15_07_01_world_waypoint_data.sql b/sql/old/3.3.5a/2012_02_15_07_01_world_waypoint_data.sql new file mode 100644 index 00000000000..e47572b2074 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_07_01_world_waypoint_data.sql @@ -0,0 +1,147 @@ +SET @NPC := 26841; +SET @GUID := 40497; -- need 9 + +SET @SPAWN0 := (@GUID )*10; +SET @SPAWN1 := (@GUID+1)*10; +SET @SPAWN2 := (@GUID+2)*10; +SET @SPAWN3 := (@GUID+3)*10; +SET @SPAWN4 := (@GUID+4)*10; +SET @SPAWN5 := (@GUID+5)*10; +SET @SPAWN6 := (@GUID+6)*10; +SET @SPAWN7 := (@GUID+7)*10; +SET @SPAWN8 := (@GUID+8)*10; + +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+8; +INSERT INTO creature (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@GUID ,@NPC,571,1,1,0,0,4690.292,859.291,154.1271,2.914072,120,0,0,1,0,0,0,0,0), +(@GUID+1,@NPC,571,1,1,0,0,4362.418,750.5102,123.7846,6.194367,120,0,0,1,0,0,0,0,0), +(@GUID+2,@NPC,571,1,1,0,0,4191.03,645.8215,109.6868,0.4027403,120,0,0,1,0,0,0,0,0), +(@GUID+3,@NPC,571,1,1,0,0,4098.345,657.0866,99.36436,5.185792,120,0,0,1,0,0,0,0,0), +(@GUID+4,@NPC,571,1,1,0,0,4065.753,709.2308,108.47,1.153499,120,0,0,1,0,0,0,0,0), +(@GUID+5,@NPC,571,1,1,0,0,4012.895,495.4877,82.1595,0.8684024,120,0,0,1,0,0,0,0,0), +(@GUID+6,@NPC,571,1,1,0,0,3941.605,552.9745,144.0994,0.06546114,120,0,0,1,0,0,0,0,0), +(@GUID+7,@NPC,571,1,1,0,0,3995.586,447.6094,88.55691,1.320955,120,0,0,1,0,0,0,0,0), +(@GUID+8,@NPC,571,1,1,0,0,3869.004,707.384,134.3378,4.695541,120,0,0,1,0,0,0,0,0); + +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID AND @GUID+8; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@GUID ,@SPAWN0,0,0,0,0,''), +(@GUID+1,@SPAWN1,0,0,0,0,''), +(@GUID+2,@SPAWN2,0,0,0,0,''), +(@GUID+3,@SPAWN3,0,0,0,0,''), +(@GUID+4,@SPAWN4,0,0,0,0,''), +(@GUID+5,@SPAWN5,0,0,0,0,''), +(@GUID+6,@SPAWN6,0,0,0,0,''), +(@GUID+7,@SPAWN7,0,0,0,0,''), +(@GUID+8,@SPAWN8,0,0,0,0,''); + +DELETE FROM `waypoint_data` WHERE `id` IN (@SPAWN0,@SPAWN1,@SPAWN2,@SPAWN3,@SPAWN4,@SPAWN5,@SPAWN6,@SPAWN7,@SPAWN8); +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +-- 1st +(@SPAWN0,0,4716.777,833.6211,169.0006,0,0,0,0,100,0), +(@SPAWN0,1,4643.756,855.9798,132.5562,0,0,0,0,100,0), +(@SPAWN0,2,4550.864,812.4362,133.6673,0,0,0,0,100,0), +(@SPAWN0,3,4532.678,762.772,130.1951,0,0,0,0,100,0), +(@SPAWN0,4,4566.182,662.6984,132.7506,0,0,0,0,100,0), +(@SPAWN0,5,4592.511,595.6938,130.1674,0,0,0,0,100,0), +(@SPAWN0,6,4732.632,631.5569,164.584,0,0,0,0,100,0), +(@SPAWN0,7,4716.777,833.6211,169.0006,0,0,0,0,100,0), +(@SPAWN0,8,4643.756,855.9798,132.5562,0,0,0,0,100,0), +(@SPAWN0,9,4550.864,812.4362,133.6673,0,0,0,0,100,0), +-- 2nd +(@SPAWN1,0,4431.805,596.8371,157.1775,0,0,0,0,100,0), +(@SPAWN1,1,4128.16,507.4055,198.8118,0,0,0,0,100,0), +(@SPAWN1,2,4102.405,567.1112,198.8118,0,0,0,0,100,0), +(@SPAWN1,3,4112.486,636.6321,86.95068,0,0,0,0,100,0), +(@SPAWN1,4,4141.771,704.1605,67.97847,0,0,0,0,100,0), +(@SPAWN1,5,4191.388,726.6014,98.11736,0,0,0,0,100,0), +(@SPAWN1,6,4247.502,724.9836,182.4229,0,0,0,0,100,0), +(@SPAWN1,7,4295.807,746.8245,210.1174,0,0,0,0,100,0), +(@SPAWN1,8,4387.15,744.5955,93.08962,0,0,0,0,100,0), +(@SPAWN1,9,4428.509,680.8868,91.33962,0,0,0,0,100,0), +(@SPAWN1,10,4431.805,596.8371,157.1775,0,0,0,0,100,0), +(@SPAWN1,11,4128.16,507.4055,198.8118,0,0,0,0,100,0), +(@SPAWN1,12,4102.405,567.1112,198.8118,0,0,0,0,100,0), +-- 3rd +(@SPAWN2,0,4170.111,627.0887,100.283,0,0,0,0,100,0), +(@SPAWN2,1,4265.816,644.1154,136.2274,0,0,0,0,100,0), +(@SPAWN2,2,4272.799,551.5093,50.92185,0,0,0,0,100,0), +(@SPAWN2,3,4378.531,451.3199,54.28299,0,0,0,0,100,0), +(@SPAWN2,4,4277.019,345.219,121.2274,0,0,0,0,100,0), +(@SPAWN2,5,4185.893,458.5754,118.5608,0,0,0,0,100,0), +(@SPAWN2,6,4170.111,627.0887,100.283,0,0,0,0,100,0), +(@SPAWN2,7,4265.816,644.1154,136.2274,0,0,0,0,100,0), +(@SPAWN2,8,4272.799,551.5093,50.92185,0,0,0,0,100,0), +-- 4th +(@SPAWN3,0,4464.15,712.9612,99.36437,0,0,0,0,100,0), +(@SPAWN3,1,4466.412,769.1019,99.36437,0,0,0,0,100,0), +(@SPAWN3,2,4427.949,785.3342,99.36437,0,0,0,0,100,0), +(@SPAWN3,3,4382.415,794.0613,99.36437,0,0,0,0,100,0), +(@SPAWN3,4,4312.128,808.5213,99.36437,0,0,0,0,100,0), +(@SPAWN3,5,4206.404,817.2534,99.36437,0,0,0,0,100,0), +(@SPAWN3,6,4089.363,771.5425,99.36437,0,0,0,0,100,0), +(@SPAWN3,7,4114.452,637.4808,99.36437,0,0,0,0,100,0), +(@SPAWN3,8,4265.095,661.3358,99.36437,0,0,0,0,100,0), +(@SPAWN3,9,4366.876,678.4272,99.36437,0,0,0,0,100,0), +(@SPAWN3,10,4433.122,674.1555,99.36437,0,0,0,0,100,0), +(@SPAWN3,11,4464.15,712.9612,99.36437,0,0,0,0,100,0), +(@SPAWN3,12,4466.412,769.1019,99.36437,0,0,0,0,100,0), +(@SPAWN3,13,4427.949,785.3342,99.36437,0,0,0,0,100,0), +-- 5th +(@SPAWN4,0,4331.604,778.9,114.7446,0,0,0,0,100,0), +(@SPAWN4,1,4270.823,698.3784,130.4668,0,0,0,0,100,0), +(@SPAWN4,2,4232.598,681.8058,126.7724,0,0,0,0,100,0), +(@SPAWN4,3,4156.661,638.471,129.439,0,0,0,0,100,0), +(@SPAWN4,4,4062.89,681.9251,102.9113,0,0,0,0,100,0), +(@SPAWN4,5,4096.761,758.9566,123.5501,0,0,0,0,100,0), +(@SPAWN4,6,4134.598,799.989,109.8835,0,0,0,0,100,0), +(@SPAWN4,7,4189.475,840.5444,114.6335,0,0,0,0,100,0), +(@SPAWN4,8,4274.875,812.3191,101.3001,0,0,0,0,100,0), +(@SPAWN4,9,4331.604,778.9,114.7446,0,0,0,0,100,0), +(@SPAWN4,10,4270.823,698.3784,130.4668,0,0,0,0,100,0), +(@SPAWN4,11,4232.598,681.8058,126.7724,0,0,0,0,100,0), +-- 6th +(@SPAWN5,0,3769.598,454.0081,82.1595,0,0,0,0,100,0), +(@SPAWN5,1,3879.825,441.5815,82.1595,0,0,0,0,100,0), +(@SPAWN5,2,3926.388,447.295,82.1595,0,0,0,0,100,0), +(@SPAWN5,3,4017.082,501.3171,82.1595,0,0,0,0,100,0), +(@SPAWN5,4,4015.132,597.8423,82.1595,0,0,0,0,100,0), +(@SPAWN5,5,3923.788,576.8113,82.1595,0,0,0,0,100,0), +(@SPAWN5,6,3865.991,561.2335,82.1595,0,0,0,0,100,0), +(@SPAWN5,7,3795.942,538.189,82.1595,0,0,0,0,100,0), +(@SPAWN5,8,3769.598,454.0081,82.1595,0,0,0,0,100,0), +(@SPAWN5,9,3879.825,441.5815,82.1595,0,0,0,0,100,0), +(@SPAWN5,10,3926.388,447.295,82.1595,0,0,0,0,100,0), +-- 7th +(@SPAWN6,0,3886.876,810.7806,134.3378,0,0,0,0,100,0), +(@SPAWN6,1,3868.72,688.4549,134.3378,0,0,0,0,100,0), +(@SPAWN6,2,3883.254,607.1956,134.3378,0,0,0,0,100,0), +(@SPAWN6,3,3904.998,559.2425,134.3378,0,0,0,0,100,0), +(@SPAWN6,4,3969.396,561.8792,148.5877,0,0,0,0,100,0), +(@SPAWN6,5,4010.678,638.0726,130.6155,0,0,0,0,100,0), +(@SPAWN6,6,3976.813,756.3585,134.3378,0,0,0,0,100,0), +(@SPAWN6,7,3886.876,810.7806,134.3378,0,0,0,0,100,0), +(@SPAWN6,8,3868.72,688.4549,134.3378,0,0,0,0,100,0), +(@SPAWN6,9,3883.254,607.1956,134.3378,0,0,0,0,100,0), +-- 8th +(@SPAWN7,0,4187.318,438.9777,88.55692,0,0,0,0,100,0), +(@SPAWN7,1,4151.397,351.4095,88.55692,0,0,0,0,100,0), +(@SPAWN7,2,4106.679,347.3126,88.55692,0,0,0,0,100,0), +(@SPAWN7,3,4056.414,373.3088,88.55692,0,0,0,0,100,0), +(@SPAWN7,4,3994.193,440.1974,88.55692,0,0,0,0,100,0), +(@SPAWN7,5,4076.892,564.8895,88.55692,0,0,0,0,100,0), +(@SPAWN7,6,4178.652,558.3406,88.55692,0,0,0,0,100,0), +(@SPAWN7,7,4187.318,438.9777,88.55692,0,0,0,0,100,0), +(@SPAWN7,8,4151.397,351.4095,88.55692,0,0,0,0,100,0), +(@SPAWN7,9,4106.679,347.3126,88.55692,0,0,0,0,100,0), +-- 9th +(@SPAWN8,0,3886.876,810.7806,134.3378,0,0,0,0,100,0), +(@SPAWN8,1,3868.72,688.4549,134.3378,0,0,0,0,100,0), +(@SPAWN8,2,3883.254,607.1956,134.3378,0,0,0,0,100,0), +(@SPAWN8,3,3904.998,559.2425,134.3378,0,0,0,0,100,0), +(@SPAWN8,4,3969.396,561.8792,148.5877,0,0,0,0,100,0), +(@SPAWN8,5,4010.678,638.0726,130.6155,0,0,0,0,100,0), +(@SPAWN8,6,3976.813,756.3585,134.3378,0,0,0,0,100,0), +(@SPAWN8,7,3886.876,810.7806,134.3378,0,0,0,0,100,0), +(@SPAWN8,8,3868.72,688.4549,134.3378,0,0,0,0,100,0), +(@SPAWN8,9,3883.254,607.1956,134.3378,0,0,0,0,100,0); diff --git a/sql/old/3.3.5a/2012_02_15_07_02_world_misc.sql b/sql/old/3.3.5a/2012_02_15_07_02_world_misc.sql new file mode 100644 index 00000000000..e7ffe54e922 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_07_02_world_misc.sql @@ -0,0 +1,120 @@ +-- Love is in the Air +SET @OGUID := 24399; +SET @CGUID := 40506; +SET @OLDGUID := 40489; -- wrong guids +SET @EVENT := 8; + +-- Quest chain +DELETE FROM `creature_questrelation` WHERE `quest` IN (24804,24657,24656,24848,24849); +INSERT INTO `creature_questrelation` (`id`, `quest`) VALUES +(38293, 24804), -- A - Uncommon Scents - Junior Inspector +(38325, 24657), -- A - Friendly Chat... - Marion Sutton +(38066, 24656), -- A - Pilfering Perfume - Inspector Snip Snagglebolt +(38066, 24848), -- A - Fireworks At The Gilded Rose - Inspector Snip Snagglebolt +(38325, 24849); -- A - Hot On The Trail - Marion Sutton + +DELETE FROM `creature_involvedrelation` WHERE `quest` IN (24804,24657,24656,24848,24849); +INSERT INTO `creature_involvedrelation` (`id`, `quest`) VALUES +(38066, 24804), -- A - Uncommon Scents - Inspector Snip Snagglebolt +(38066, 24657), -- A - Friendly Chat... - Inspector Snip Snagglebolt +(38066, 24656), -- A - Pilfering Perfume - Inspector Snip Snagglebolt +(38325, 24848), -- A - Fireworks At The Gilded Rose - Marion Sutton +(38325, 24849); -- A - Hot On The Trail - Marion Sutton + +-- Loot: Crown Chemical Co. Supplies +DELETE FROM `gameobject_loot_template` WHERE `entry`=27766; +INSERT INTO `gameobject_loot_template` VALUES +(27766, 49867, -100, 1, 0, 1, 1); -- Crown Chemical Co. Supplies + +-- GO spawns +DELETE FROM `gameobject` WHERE `id` IN (181086,201752,201778) AND `guid` BETWEEN @OGUID+0 AND @OGUID+42; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +-- Valentine Arch +(@OGUID+0, 181086, 1, 1, 1, 9869.12, 2493.13, 1315.88, 6.16653, 0, 0, 0.0582931, -0.9983, 300, 0, 1), +(@OGUID+1, 181086, 530, 1, 1, -4004.66, -11844.5, 0.19541, 4.93701, 0, 0, 0.623403, -0.7819, 300, 0, 1), +(@OGUID+2, 181086, 0, 1, 1, -4918.78, -983.208, 501.455, 2.30465, 0, 0, 0.913711, 0.406364, 300, 0, 1), +(@OGUID+3, 181086, 0, 1, 1, -8869.51, 636.686, 95.7873, 0.794388, 0, 0, 0.386832, 0.92215, 300, 0, 1), +(@OGUID+4, 181086, 1, 1, 1, 1653.44, -4437.37, 18.1863, 1.72627, 0, 0, 0.759883, 0.65006, 300, 0, 1), +(@OGUID+5, 181086, 1, 1, 1, -1224.34, 68.3642, 129.71, 3.17285, 0, 0, 0.999878, -0.015627, 300, 0, 1), +(@OGUID+6, 181086, 530, 1, 1, 9612.28, -7184.77, 14.285, 1.82938, 0, 0, 0.792374, 0.610036, 300, 0, 1), +(@OGUID+7, 181086, 0, 1, 1, 1629.62, 240.116, 63.8516, 0.155664, 0, 0, 0.0777534, 0.996973, 300, 0, 1), +-- Large Crate +(@OGUID+8, 201752, 0, 1, 1, -9029.77, 353.325, 92.923, 0.8808, 0, 0, 0.426301, 0.904581, 300, 0, 1), +(@OGUID+9, 201752, 0, 1, 1, -9029.87, 351.542, 92.9248, 0.489671, 0, 0, 0.242397, 0.970177, 300, 0, 1), +(@OGUID+10, 201752, 0, 1, 1, -9028.41, 352.69, 92.9163, 0.721364, 0, 0, 0.352912, 0.935656, 300, 0, 1), +(@OGUID+11, 201752, 0, 1, 1, -9027.7, 351.062, 92.9193, 0.689162, 0, 0, 0.337803, 0.941217, 300, 0, 1), +(@OGUID+12, 201752, 0, 1, 1, -9029.08, 349.917, 92.932, 0.657746, 0, 0, 0.322977, 0.946407, 300, 0, 1), +(@OGUID+13, 201752, 0, 1, 1, -9028.77, 352.62, 94.1596, 6.02202, 0, 0, 0.130214, -0.991486, 300, 0, 1), +(@OGUID+14, 201752, 0, 1, 1, -9028.84, 350.443, 94.1755, 0.771628, 0, 0, 0.376314, 0.926492, 300, 0, 1), +(@OGUID+15, 201752, 0, 1, 1, -9026.5, 348.864, 93.0359, 2.17356, 0, 0, 0.885134, 0.465337, 300, 0, 1), +(@OGUID+16, 201752, 0, 1, 1, -9028.21, 348.744, 93.024, 0.889436, 0, 0, 0.430203, 0.902732, 300, 0, 1), +(@OGUID+17, 201752, 1, 1, 1, 1381.97, -4431.17, 30.6588, 5.49617, 0, 0, 0.383432, -0.923569, 300, 0, 1), +(@OGUID+18, 201752, 1, 1, 1, 1380.98, -4432.28, 30.6586, 5.55507, 0, 0, 0.356069, -0.93446, 300, 0, 1), +(@OGUID+19, 201752, 1, 1, 1, 1379.73, -4433.4, 30.6569, 5.69644, 0, 0, 0.28918, -0.957275, 300, 0, 1), +(@OGUID+20, 201752, 1, 1, 1, 1377.96, -4432.16, 30.6489, 5.58649, 0, 0, 0.341345, -0.939938, 300, 0, 1), +(@OGUID+21, 201752, 1, 1, 1, 1379.23, -4431.41, 30.6768, 5.559, 0, 0, 0.354231, -0.935158, 300, 0, 1), +(@OGUID+22, 201752, 1, 1, 1, 1379.85, -4432.91, 31.8999, 5.66896, 0, 0, 0.302309, -0.95321, 300, 0, 1), +(@OGUID+23, 201752, 1, 1, 1, 1380.81, -4431.58, 31.902, 5.64147, 0, 0, 0.315381, -0.948965, 300, 0, 1), +(@OGUID+24, 201752, 1, 1, 1, 1377.67, -4434.36, 30.6055, 5.36265, 0, 0, 0.444186, -0.895935, 300, 0, 1), +-- Crown Chemical Co. Supplies +(@OGUID+25, 201778, 0, 1, 1, -9031.18, 354.399, 92.9752, 6.12019, 0, 0, 0.0814081, -0.996681, 300, 0, 1), +(@OGUID+26, 201778, 0, 1, 1, -9028.76, 352.525, 95.4034, 0.503804, 0, 0, 0.249246, 0.96844, 300, 0, 1), +(@OGUID+27, 201778, 0, 1, 1, -9030.19, 351.409, 94.1683, 0.134668, 0, 0, 0.067283, 0.997734, 300, 0, 1), +(@OGUID+28, 201778, 0, 1, 1, -9031.52, 349.739, 92.9068, 0.338872, 0, 0, 0.168626, 0.98568, 300, 0, 1), +(@OGUID+29, 201778, 0, 1, 1, -9030.55, 347.899, 92.9635, 0.751206, 0, 0, 0.366833, 0.930287, 300, 0, 1), +(@OGUID+30, 201778, 0, 1, 1, -9027.59, 348.911, 94.2683, 1.784, 0, 0, 0.77833, 0.627855, 300, 0, 1), +(@OGUID+31, 201778, 0, 1, 1, -9028.87, 349.971, 95.4191, 1.82327, 0, 0, 0.790507, 0.612452, 300, 0, 1), +(@OGUID+32, 201778, 0, 1, 1, -9031.75, 354.82, 92.9939, 6.0605, 0, 0, 0.111113, -0.993808, 300, 0, 1), +(@OGUID+33, 201778, 0, 1, 1, -9032.22, 352.779, 92.9627, 6.0605, 0, 0, 0.111113, -0.993808, 300, 0, 1), +(@OGUID+34, 201778, 1, 1, 1, 1375.84, -4432.46, 30.5735, 5.69645, 0, 0, 0.289178, -0.957275, 300, 0, 1), +(@OGUID+35, 201778, 1, 1, 1, 1377.99, -4431.81, 31.8923, 5.5001, 0, 0, 0.381614, -0.924322, 300, 0, 1), +(@OGUID+36, 201778, 1, 1, 1, 1379.21, -4430.58, 31.9198, 4.81681, 0, 0, 0.669241, -0.743045, 300, 0, 1), +(@OGUID+37, 201778, 1, 1, 1, 1379.35, -4432.78, 33.143, 5.61791, 0, 0, 0.326536, -0.945185, 300, 0, 1), +(@OGUID+38, 201778, 1, 1, 1, 1380.87, -4431.5, 33.1452, 4.66994, 0, 0, 0.721955, -0.69194, 300, 0, 1), +(@OGUID+39, 201778, 1, 1, 1, 1380.96, -4429.36, 30.6772, 4.6503, 0, 0, 0.728713, -0.68482, 300, 0, 1), +(@OGUID+40, 201778, 1, 1, 1, 1383.08, -4429.42, 30.651, 4.53642, 0, 0, 0.766505, -0.642238, 300, 0, 1), +(@OGUID+41, 201778, 1, 1, 1, 1378.64, -4428.42, 30.6846, 5.23543, 0, 0, 0.500243, -0.865885, 300, 0, 1), +(@OGUID+42, 201778, 1, 1, 1, 1377.05, -4429.39, 30.6467, 5.31397, 0, 0, 0.465863, -0.884857, 300, 0, 1); + +DELETE FROM `game_event_gameobject` WHERE `eventEntry`=@EVENT AND `guid` BETWEEN @OGUID AND @OGUID+42; +INSERT INTO `game_event_gameobject` (`guid`, `eventEntry`) VALUES +(@OGUID, @EVENT),(@OGUID+1, @EVENT),(@OGUID+2, @EVENT), +(@OGUID+3, @EVENT),(@OGUID+4, @EVENT),(@OGUID+5, @EVENT), +(@OGUID+6, @EVENT),(@OGUID+7, @EVENT),(@OGUID+8, @EVENT), +(@OGUID+9, @EVENT),(@OGUID+10, @EVENT),(@OGUID+11, @EVENT), +(@OGUID+12, @EVENT),(@OGUID+13, @EVENT),(@OGUID+14, @EVENT), +(@OGUID+15, @EVENT),(@OGUID+16, @EVENT),(@OGUID+17, @EVENT), +(@OGUID+18, @EVENT),(@OGUID+19, @EVENT),(@OGUID+20, @EVENT), +(@OGUID+21, @EVENT),(@OGUID+22, @EVENT),(@OGUID+23, @EVENT), +(@OGUID+24, @EVENT),(@OGUID+25, @EVENT),(@OGUID+26, @EVENT), +(@OGUID+27, @EVENT),(@OGUID+28, @EVENT),(@OGUID+29, @EVENT), +(@OGUID+30, @EVENT),(@OGUID+31, @EVENT),(@OGUID+32, @EVENT), +(@OGUID+33, @EVENT),(@OGUID+34, @EVENT),(@OGUID+35, @EVENT), +(@OGUID+36, @EVENT),(@OGUID+37, @EVENT),(@OGUID+38, @EVENT), +(@OGUID+39, @EVENT),(@OGUID+40, @EVENT),(@OGUID+41, @EVENT), +(@OGUID+42, @EVENT); + +-- [Q]: Pilfering Perfume +-- Note: this is EndText (misleading field name), NOT ObjectiveText1 +UPDATE `quest_template` SET `EndText` = 'Steal perfume package from Crown Chemical Co. outside Stormind' WHERE `Id` = 24656; -- Alliance +UPDATE `quest_template` SET `EndText` = 'Steal perfume package from Crown Chemical Co. outside Orgrimmar' WHERE `Id` = 24541; -- Horde + +-- Creature templates and spawns +UPDATE `creature_template` SET `minlevel`=70, `maxlevel`=75 WHERE `entry`=37671; -- Crown Supply Guard +UPDATE `creature_template` SET `npcflag`=`npcflag`|1, `gossip_menu_id`=10991 WHERE `entry`=38293; -- Junior Inspector (gossip menu not confirmed) + +DELETE FROM `creature` WHERE `id` IN (38293,38065,37671) AND `guid` BETWEEN @CGUID+0 AND @CGUID+3; +DELETE FROM `creature` WHERE `id` IN (38293,38065,37671) AND `guid` BETWEEN @OLDGUID+0 AND @OLDGUID+3; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@CGUID+0, 38293, 530, 1, 1, 0, 0, -4022.81, -11842.7, 0.0062171, 5.89912, 300, 0, 0, 955, 0, 0, 0, 0, 0), -- Junior Inspector +(@CGUID+1, 38065, 1, 1, 1, 0, 0, 1380.22, -4426.79, 30.6681, 2.03572, 300, 0, 0, 12600, 0, 0, 0, 0, 0), -- Crown Supply Sentry +(@CGUID+2, 37671, 0, 1, 1, 30912, 0, -9033.01, 356.408, 93.1543, 2.09345, 300, 0, 0, 42, 0, 0, 0, 0, 0), -- Crown Supply Guard +(@CGUID+3, 37671, 0, 1, 1, 30912, 0, -9028.63, 344.994, 93.2389, 3.37679, 300, 0, 0, 42, 0, 0, 0, 0, 0); -- Crown Supply Guard + +DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+3 AND `eventEntry`=@EVENT; +DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @OLDGUID+0 AND @OLDGUID+3 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_creature` (`guid`, `eventEntry`) VALUES +(@CGUID+0, @EVENT), +(@CGUID+1, @EVENT), +(@CGUID+2, @EVENT), +(@CGUID+3, @EVENT); diff --git a/sql/old/3.3.5a/2012_02_15_08_world_sai.sql b/sql/old/3.3.5a/2012_02_15_08_world_sai.sql new file mode 100644 index 00000000000..ef49ff484f3 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_08_world_sai.sql @@ -0,0 +1,9 @@ +SET @Pinata := 34632; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Pinata AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@Pinata, 0, 0, 0, 6, 0, 100, 0, 0, 0, 0, 0, 11, 65788, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ogre Pinata - On death cast Pile of Candy'), +(@Pinata, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ogre Pinata - On reset set react state passive'); + +-- same faction of the GO that is spawned by spell 65788 (not sniffed) +UPDATE `creature_template` SET `faction_A`=7,`faction_H`=7,`exp`=0,`AIName`='SmartAI' WHERE `entry`=@Pinata; diff --git a/sql/old/3.3.5a/2012_02_15_09_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_02_15_09_world_spell_proc_event.sql new file mode 100644 index 00000000000..4811e5d66fe --- /dev/null +++ b/sql/old/3.3.5a/2012_02_15_09_world_spell_proc_event.sql @@ -0,0 +1,6 @@ +-- Corrected proc of Misery +DELETE FROM `spell_proc_event` WHERE `entry` IN (33191, 33192, 33193); +INSERT INTO `spell_proc_event` VALUES +(33191, 0x00, 0x06, 0x00008000, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0), +(33192, 0x00, 0x06, 0x00008000, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0), +(33193, 0x00, 0x06, 0x00008000, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0); diff --git a/sql/old/3.3.5a/2012_02_16_00_world_conditions.sql b/sql/old/3.3.5a/2012_02_16_00_world_conditions.sql new file mode 100644 index 00000000000..5bef38fc485 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_16_00_world_conditions.sql @@ -0,0 +1,12800 @@ +CREATE TABLE `temp_convert_spells` +( + `id` INT(11), + PRIMARY KEY (`id`) +); + +-- spells with EffectImplicitTarget In (6,21, 25) + spells having Targets & 1115534 +-- those spells are the ones which require explicit unit target to cast +INSERT INTO `temp_convert_spells` VALUES +(5), +(11), +(12), +(14), +(15), +(17), +(25), +(49), +(50), +(53), +(56), +(58), +(59), +(60), +(61), +(67), +(68), +(72), +(75), +(78), +(89), +(91), +(96), +(100), +(101), +(113), +(116), +(118), +(131), +(132), +(133), +(134), +(139), +(142), +(143), +(145), +(172), +(184), +(205), +(228), +(246), +(260), +(271), +(284), +(285), +(339), +(348), +(355), +(370), +(403), +(408), +(421), +(453), +(457), +(467), +(475), +(512), +(514), +(526), +(527), +(528), +(529), +(530), +(546), +(548), +(550), +(552), +(585), +(589), +(591), +(592), +(594), +(596), +(598), +(600), +(603), +(605), +(606), +(633), +(635), +(639), +(647), +(676), +(686), +(689), +(692), +(694), +(695), +(699), +(700), +(701), +(702), +(703), +(705), +(707), +(709), +(710), +(720), +(731), +(744), +(745), +(746), +(770), +(772), +(774), +(782), +(785), +(812), +(835), +(837), +(845), +(851), +(853), +(879), +(915), +(921), +(930), +(932), +(943), +(970), +(974), +(976), +(980), +(984), +(988), +(992), +(996), +(1004), +(1010), +(1014), +(1026), +(1035), +(1042), +(1044), +(1058), +(1062), +(1075), +(1079), +(1082), +(1088), +(1090), +(1094), +(1098), +(1106), +(1108), +(1120), +(1121), +(1126), +(1130), +(1139), +(1152), +(1159), +(1194), +(1196), +(1210), +(1214), +(1225), +(1228), +(1234), +(1241), +(1243), +(1244), +(1245), +(1249), +(1250), +(1251), +(1266), +(1267), +(1329), +(1330), +(1350), +(1364), +(1373), +(1413), +(1430), +(1446), +(1459), +(1460), +(1461), +(1462), +(1464), +(1467), +(1472), +(1473), +(1474), +(1475), +(1481), +(1485), +(1490), +(1495), +(1513), +(1515), +(1516), +(1536), +(1579), +(1588), +(1604), +(1608), +(1609), +(1650), +(1664), +(1665), +(1666), +(1669), +(1671), +(1672), +(1714), +(1715), +(1752), +(1753), +(1754), +(1755), +(1756), +(1757), +(1758), +(1759), +(1760), +(1766), +(1767), +(1768), +(1769), +(1770), +(1776), +(1777), +(1795), +(1796), +(1797), +(1798), +(1800), +(1809), +(1810), +(1811), +(1822), +(1823), +(1824), +(1831), +(1833), +(1852), +(1906), +(1908), +(1943), +(1950), +(1966), +(1978), +(1991), +(2000), +(2020), +(2021), +(2050), +(2052), +(2053), +(2054), +(2055), +(2060), +(2061), +(2070), +(2090), +(2091), +(2094), +(2096), +(2098), +(2110), +(2118), +(2119), +(2124), +(2125), +(2136), +(2137), +(2138), +(2139), +(2141), +(2142), +(2143), +(2147), +(2148), +(2154), +(2155), +(2275), +(2280), +(2313), +(2372), +(2373), +(2400), +(2425), +(2442), +(2443), +(2444), +(2446), +(2552), +(2589), +(2590), +(2591), +(2601), +(2602), +(2606), +(2607), +(2608), +(2609), +(2610), +(2626), +(2629), +(2630), +(2633), +(2634), +(2636), +(2637), +(2643), +(2647), +(2649), +(2650), +(2653), +(2691), +(2764), +(2767), +(2782), +(2791), +(2800), +(2816), +(2817), +(2818), +(2819), +(2834), +(2850), +(2855), +(2860), +(2871), +(2880), +(2893), +(2908), +(2912), +(2941), +(2944), +(2948), +(2949), +(2969), +(2972), +(2973), +(2974), +(2995), +(3007), +(3009), +(3010), +(3011), +(3018), +(3029), +(3034), +(3043), +(3044), +(3105), +(3108), +(3110), +(3120), +(3121), +(3130), +(3131), +(3132), +(3137), +(3140), +(3145), +(3147), +(3148), +(3150), +(3205), +(3206), +(3207), +(3229), +(3233), +(3234), +(3237), +(3242), +(3243), +(3246), +(3247), +(3252), +(3261), +(3263), +(3267), +(3268), +(3279), +(3280), +(3286), +(3332), +(3355), +(3356), +(3358), +(3360), +(3387), +(3388), +(3393), +(3396), +(3405), +(3409), +(3427), +(3429), +(3436), +(3442), +(3446), +(3465), +(3466), +(3472), +(3510), +(3514), +(3539), +(3542), +(3551), +(3553), +(3571), +(3578), +(3583), +(3584), +(3586), +(3602), +(3603), +(3604), +(3606), +(3607), +(3609), +(3627), +(3635), +(3636), +(3650), +(3674), +(3715), +(3716), +(3747), +(3812), +(3911), +(3912), +(3913), +(3921), +(4011), +(4039), +(4040), +(4041), +(4058), +(4060), +(4089), +(4090), +(4091), +(4101), +(4102), +(4130), +(4131), +(4132), +(4150), +(4159), +(4164), +(4165), +(4166), +(4167), +(4168), +(4169), +(4209), +(4221), +(4240), +(4243), +(4244), +(4262), +(4280), +(4281), +(4282), +(4285), +(4286), +(4294), +(4316), +(4362), +(4423), +(4500), +(4504), +(4505), +(4506), +(4538), +(4630), +(4659), +(4805), +(4877), +(4940), +(4961), +(4962), +(4974), +(4979), +(4980), +(4984), +(4987), +(4996), +(4997), +(4998), +(4999), +(5000), +(5003), +(5019), +(5025), +(5103), +(5105), +(5116), +(5133), +(5137), +(5138), +(5143), +(5144), +(5145), +(5164), +(5165), +(5171), +(5176), +(5177), +(5178), +(5179), +(5180), +(5185), +(5186), +(5187), +(5188), +(5189), +(5195), +(5196), +(5201), +(5208), +(5211), +(5213), +(5221), +(5232), +(5234), +(5246), +(5255), +(5259), +(5260), +(5263), +(5271), +(5276), +(5306), +(5308), +(5320), +(5321), +(5322), +(5323), +(5324), +(5325), +(5337), +(5374), +(5375), +(5376), +(5401), +(5413), +(5416), +(5422), +(5424), +(5433), +(5480), +(5503), +(5507), +(5508), +(5509), +(5513), +(5514), +(5547), +(5565), +(5566), +(5567), +(5570), +(5588), +(5589), +(5595), +(5597), +(5598), +(5614), +(5615), +(5648), +(5649), +(5676), +(5679), +(5696), +(5697), +(5703), +(5726), +(5727), +(5739), +(5760), +(5781), +(5782), +(5862), +(5884), +(5917), +(5918), +(5938), +(5940), +(5951), +(5967), +(6000), +(6016), +(6027), +(6028), +(6041), +(6060), +(6061), +(6063), +(6064), +(6065), +(6066), +(6074), +(6075), +(6076), +(6077), +(6078), +(6121), +(6128), +(6130), +(6132), +(6136), +(6142), +(6144), +(6146), +(6178), +(6199), +(6203), +(6205), +(6213), +(6215), +(6217), +(6222), +(6223), +(6245), +(6252), +(6253), +(6254), +(6255), +(6257), +(6273), +(6277), +(6278), +(6304), +(6327), +(6346), +(6348), +(6349), +(6350), +(6351), +(6352), +(6353), +(6357), +(6358), +(6359), +(6360), +(6362), +(6409), +(6435), +(6460), +(6465), +(6466), +(6483), +(6484), +(6509), +(6530), +(6531), +(6533), +(6546), +(6547), +(6548), +(6552), +(6554), +(6555), +(6572), +(6574), +(6576), +(6580), +(6581), +(6595), +(6607), +(6647), +(6655), +(6660), +(6664), +(6685), +(6713), +(6716), +(6719), +(6726), +(6728), +(6730), +(6742), +(6743), +(6744), +(6745), +(6746), +(6747), +(6748), +(6751), +(6753), +(6754), +(6756), +(6760), +(6761), +(6762), +(6766), +(6767), +(6768), +(6770), +(6774), +(6778), +(6780), +(6785), +(6787), +(6788), +(6789), +(6795), +(6798), +(6800), +(6807), +(6808), +(6809), +(6814), +(6866), +(6870), +(6873), +(6894), +(6907), +(6909), +(6917), +(6922), +(6927), +(6942), +(6946), +(6949), +(6950), +(6951), +(6957), +(6958), +(6960), +(6963), +(6965), +(6979), +(6980), +(6984), +(7001), +(7033), +(7054), +(7057), +(7068), +(7079), +(7081), +(7084), +(7092), +(7093), +(7098), +(7099), +(7101), +(7102), +(7105), +(7120), +(7122), +(7124), +(7125), +(7127), +(7140), +(7145), +(7154), +(7159), +(7160), +(7162), +(7211), +(7266), +(7288), +(7289), +(7290), +(7295), +(7321), +(7322), +(7329), +(7357), +(7365), +(7367), +(7369), +(7372), +(7373), +(7379), +(7384), +(7386), +(7399), +(7400), +(7402), +(7405), +(7414), +(7415), +(7416), +(7439), +(7482), +(7485), +(7588), +(7621), +(7638), +(7641), +(7645), +(7646), +(7648), +(7651), +(7655), +(7656), +(7712), +(7714), +(7715), +(7716), +(7717), +(7718), +(7719), +(7736), +(7761), +(7763), +(7764), +(7799), +(7800), +(7801), +(7802), +(7806), +(7807), +(7808), +(7809), +(7810), +(7811), +(7813), +(7814), +(7815), +(7816), +(7821), +(7829), +(7853), +(7874), +(7875), +(7876), +(7877), +(7878), +(7879), +(7880), +(7881), +(7882), +(7883), +(7884), +(7885), +(7887), +(7891), +(7896), +(7901), +(7914), +(7922), +(7925), +(7926), +(7927), +(7932), +(7933), +(7938), +(7947), +(7951), +(7967), +(7992), +(7994), +(7997), +(8004), +(8008), +(8010), +(8012), +(8014), +(8016), +(8026), +(8028), +(8029), +(8034), +(8037), +(8040), +(8042), +(8044), +(8045), +(8046), +(8050), +(8052), +(8053), +(8056), +(8058), +(8068), +(8070), +(8091), +(8092), +(8094), +(8095), +(8096), +(8097), +(8098), +(8099), +(8100), +(8101), +(8102), +(8103), +(8104), +(8105), +(8106), +(8112), +(8113), +(8114), +(8115), +(8116), +(8117), +(8118), +(8119), +(8120), +(8121), +(8129), +(8137), +(8138), +(8139), +(8140), +(8151), +(8208), +(8211), +(8221), +(8222), +(8242), +(8246), +(8255), +(8256), +(8257), +(8272), +(8275), +(8277), +(8282), +(8288), +(8289), +(8292), +(8295), +(8312), +(8313), +(8314), +(8318), +(8319), +(8344), +(8345), +(8346), +(8347), +(8352), +(8353), +(8355), +(8362), +(8363), +(8365), +(8379), +(8380), +(8382), +(8383), +(8384), +(8385), +(8391), +(8400), +(8401), +(8402), +(8406), +(8407), +(8408), +(8412), +(8413), +(8414), +(8415), +(8416), +(8417), +(8425), +(8426), +(8428), +(8440), +(8441), +(8442), +(8444), +(8445), +(8446), +(8447), +(8448), +(8449), +(8452), +(8453), +(8456), +(8459), +(8460), +(8463), +(8464), +(8493), +(8496), +(8497), +(8552), +(8554), +(8555), +(8595), +(8598), +(8600), +(8613), +(8615), +(8616), +(8617), +(8618), +(8619), +(8620), +(8621), +(8623), +(8624), +(8627), +(8629), +(8631), +(8632), +(8633), +(8637), +(8639), +(8640), +(8643), +(8645), +(8646), +(8647), +(8649), +(8650), +(8654), +(8673), +(8676), +(8680), +(8682), +(8685), +(8689), +(8699), +(8716), +(8721), +(8724), +(8725), +(8733), +(8735), +(8788), +(8806), +(8818), +(8820), +(8903), +(8905), +(8907), +(8910), +(8914), +(8921), +(8924), +(8925), +(8926), +(8927), +(8928), +(8929), +(8936), +(8938), +(8939), +(8940), +(8941), +(8946), +(8947), +(8949), +(8950), +(8951), +(8955), +(8972), +(8983), +(8992), +(8994), +(8998), +(9000), +(9005), +(9007), +(9034), +(9053), +(9057), +(9080), +(9159), +(9176), +(9234), +(9268), +(9275), +(9347), +(9373), +(9454), +(9455), +(9456), +(9459), +(9462), +(9472), +(9473), +(9474), +(9481), +(9482), +(9483), +(9484), +(9485), +(9487), +(9488), +(9492), +(9493), +(9532), +(9552), +(9574), +(9591), +(9612), +(9613), +(9614), +(9654), +(9658), +(9672), +(9734), +(9735), +(9739), +(9745), +(9750), +(9752), +(9756), +(9758), +(9771), +(9775), +(9786), +(9789), +(9790), +(9791), +(9796), +(9806), +(9823), +(9824), +(9826), +(9827), +(9829), +(9830), +(9833), +(9834), +(9835), +(9839), +(9840), +(9841), +(9849), +(9850), +(9852), +(9853), +(9856), +(9857), +(9858), +(9866), +(9867), +(9875), +(9876), +(9880), +(9881), +(9884), +(9885), +(9888), +(9889), +(9892), +(9894), +(9896), +(9901), +(9904), +(9910), +(9912), +(9949), +(9977), +(9991), +(9999), +(10055), +(10056), +(10060), +(10073), +(10101), +(10136), +(10141), +(10142), +(10143), +(10146), +(10147), +(10148), +(10149), +(10150), +(10151), +(10156), +(10157), +(10158), +(10162), +(10163), +(10164), +(10171), +(10172), +(10175), +(10176), +(10178), +(10179), +(10180), +(10181), +(10188), +(10189), +(10190), +(10194), +(10195), +(10196), +(10197), +(10198), +(10199), +(10200), +(10203), +(10204), +(10205), +(10206), +(10207), +(10208), +(10209), +(10210), +(10211), +(10212), +(10217), +(10218), +(10221), +(10222), +(10224), +(10226), +(10227), +(10231), +(10239), +(10244), +(10245), +(10246), +(10277), +(10308), +(10310), +(10312), +(10313), +(10314), +(10321), +(10326), +(10328), +(10329), +(10346), +(10370), +(10371), +(10373), +(10391), +(10392), +(10412), +(10413), +(10414), +(10435), +(10436), +(10444), +(10445), +(10447), +(10448), +(10452), +(10458), +(10466), +(10467), +(10468), +(10472), +(10473), +(10577), +(10578), +(10605), +(10617), +(10651), +(10653), +(10657), +(10659), +(10661), +(10663), +(10689), +(10730), +(10767), +(10768), +(10769), +(10771), +(10833), +(10838), +(10839), +(10843), +(10847), +(10851), +(10855), +(10863), +(10872), +(10892), +(10893), +(10894), +(10898), +(10899), +(10900), +(10901), +(10908), +(10909), +(10915), +(10916), +(10917), +(10921), +(10927), +(10928), +(10929), +(10933), +(10934), +(10937), +(10938), +(10945), +(10946), +(10947), +(10955), +(10957), +(10958), +(10960), +(10961), +(10963), +(10964), +(10965), +(10966), +(11014), +(11016), +(11020), +(11021), +(11027), +(11084), +(11085), +(11131), +(11132), +(11196), +(11197), +(11198), +(11203), +(11204), +(11205), +(11267), +(11268), +(11269), +(11273), +(11274), +(11275), +(11279), +(11280), +(11281), +(11285), +(11286), +(11289), +(11290), +(11293), +(11294), +(11297), +(11299), +(11300), +(11303), +(11335), +(11336), +(11337), +(11353), +(11354), +(11362), +(11366), +(11374), +(11391), +(11397), +(11409), +(11428), +(11430), +(11431), +(11436), +(11442), +(11443), +(11444), +(11446), +(11469), +(11470), +(11471), +(11512), +(11519), +(11520), +(11522), +(11525), +(11528), +(11538), +(11539), +(11545), +(11564), +(11565), +(11566), +(11567), +(11572), +(11573), +(11574), +(11578), +(11584), +(11585), +(11595), +(11596), +(11597), +(11600), +(11601), +(11604), +(11605), +(11608), +(11609), +(11610), +(11612), +(11639), +(11640), +(11641), +(11642), +(11650), +(11658), +(11659), +(11660), +(11661), +(11665), +(11667), +(11668), +(11671), +(11672), +(11675), +(11699), +(11700), +(11707), +(11708), +(11711), +(11712), +(11713), +(11719), +(11721), +(11722), +(11725), +(11726), +(11762), +(11763), +(11772), +(11773), +(11774), +(11775), +(11776), +(11777), +(11778), +(11779), +(11780), +(11781), +(11782), +(11783), +(11784), +(11785), +(11786), +(11787), +(11791), +(11820), +(11821), +(11824), +(11825), +(11835), +(11836), +(11839), +(11877), +(11879), +(11885), +(11886), +(11887), +(11888), +(11889), +(11918), +(11920), +(11921), +(11922), +(11960), +(11962), +(11963), +(11971), +(11972), +(11974), +(11976), +(11977), +(11978), +(11980), +(11981), +(11985), +(11986), +(11994), +(11998), +(12021), +(12023), +(12024), +(12039), +(12054), +(12057), +(12058), +(12096), +(12097), +(12098), +(12118), +(12127), +(12128), +(12130), +(12131), +(12160), +(12161), +(12162), +(12166), +(12167), +(12170), +(12174), +(12175), +(12176), +(12177), +(12178), +(12179), +(12181), +(12242), +(12245), +(12246), +(12248), +(12251), +(12279), +(12280), +(12289), +(12294), +(12355), +(12461), +(12466), +(12471), +(12479), +(12480), +(12484), +(12485), +(12486), +(12491), +(12492), +(12493), +(12494), +(12505), +(12509), +(12510), +(12521), +(12522), +(12523), +(12524), +(12525), +(12526), +(12531), +(12538), +(12540), +(12541), +(12542), +(12545), +(12548), +(12551), +(12553), +(12555), +(12578), +(12579), +(12654), +(12657), +(12668), +(12675), +(12693), +(12699), +(12705), +(12721), +(12723), +(12738), +(12739), +(12742), +(12747), +(12798), +(12809), +(12821), +(12824), +(12825), +(12826), +(12850), +(12868), +(12885), +(12888), +(12890), +(12998), +(13003), +(13005), +(13006), +(13009), +(13013), +(13022), +(13029), +(13044), +(13099), +(13119), +(13120), +(13138), +(13140), +(13142), +(13180), +(13181), +(13218), +(13222), +(13223), +(13224), +(13278), +(13279), +(13281), +(13298), +(13318), +(13319), +(13321), +(13322), +(13323), +(13325), +(13326), +(13327), +(13338), +(13339), +(13340), +(13341), +(13342), +(13374), +(13375), +(13398), +(13424), +(13438), +(13439), +(13440), +(13441), +(13442), +(13443), +(13444), +(13445), +(13446), +(13459), +(13480), +(13482), +(13486), +(13490), +(13491), +(13496), +(13518), +(13519), +(13524), +(13526), +(13527), +(13528), +(13530), +(13534), +(13549), +(13550), +(13551), +(13552), +(13553), +(13554), +(13555), +(13566), +(13567), +(13579), +(13583), +(13584), +(13585), +(13608), +(13619), +(13692), +(13728), +(13729), +(13737), +(13738), +(13748), +(13752), +(13797), +(13860), +(13864), +(13878), +(13880), +(13884), +(13897), +(13901), +(13902), +(13907), +(13921), +(13952), +(13953), +(13977), +(14030), +(14032), +(14033), +(14034), +(14053), +(14087), +(14099), +(14102), +(14103), +(14105), +(14106), +(14109), +(14110), +(14112), +(14118), +(14119), +(14120), +(14122), +(14126), +(14129), +(14130), +(14134), +(14145), +(14156), +(14157), +(14160), +(14178), +(14180), +(14183), +(14189), +(14200), +(14247), +(14251), +(14253), +(14260), +(14261), +(14262), +(14263), +(14264), +(14265), +(14266), +(14269), +(14270), +(14271), +(14278), +(14281), +(14282), +(14283), +(14284), +(14285), +(14286), +(14287), +(14288), +(14289), +(14290), +(14298), +(14299), +(14300), +(14301), +(14308), +(14309), +(14323), +(14324), +(14325), +(14326), +(14327), +(14331), +(14443), +(14515), +(14516), +(14517), +(14518), +(14537), +(14752), +(14792), +(14795), +(14818), +(14819), +(14867), +(14868), +(14873), +(14874), +(14875), +(14890), +(14892), +(14893), +(14894), +(14895), +(14897), +(14902), +(14903), +(14914), +(14916), +(14917), +(14918), +(14919), +(14920), +(14921), +(15037), +(15039), +(15040), +(15042), +(15043), +(15057), +(15065), +(15089), +(15090), +(15095), +(15096), +(15117), +(15120), +(15122), +(15123), +(15124), +(15128), +(15187), +(15207), +(15208), +(15211), +(15228), +(15229), +(15230), +(15232), +(15234), +(15235), +(15236), +(15238), +(15241), +(15242), +(15247), +(15248), +(15249), +(15250), +(15254), +(15257), +(15261), +(15262), +(15263), +(15264), +(15265), +(15266), +(15267), +(15277), +(15279), +(15280), +(15283), +(15284), +(15288), +(15305), +(15306), +(15331), +(15332), +(15342), +(15343), +(15344), +(15346), +(15357), +(15359), +(15362), +(15363), +(15366), +(15398), +(15407), +(15451), +(15471), +(15472), +(15487), +(15493), +(15495), +(15496), +(15497), +(15498), +(15499), +(15500), +(15501), +(15505), +(15530), +(15534), +(15535), +(15536), +(15537), +(15539), +(15547), +(15549), +(15570), +(15572), +(15574), +(15575), +(15580), +(15581), +(15582), +(15583), +(15586), +(15587), +(15592), +(15598), +(15605), +(15607), +(15608), +(15610), +(15611), +(15612), +(15614), +(15615), +(15616), +(15617), +(15618), +(15619), +(15620), +(15621), +(15643), +(15651), +(15652), +(15653), +(15654), +(15655), +(15656), +(15657), +(15659), +(15661), +(15662), +(15664), +(15665), +(15667), +(15691), +(15692), +(15695), +(15698), +(15699), +(15702), +(15708), +(15712), +(15713), +(15729), +(15730), +(15732), +(15734), +(15735), +(15736), +(15749), +(15752), +(15753), +(15784), +(15785), +(15790), +(15791), +(15793), +(15795), +(15797), +(15798), +(15801), +(15802), +(15848), +(15850), +(15859), +(15860), +(15876), +(15878), +(15968), +(15969), +(15970), +(15976), +(15980), +(15981), +(15982), +(16000), +(16001), +(16006), +(16007), +(16029), +(16031), +(16033), +(16034), +(16044), +(16045), +(16050), +(16053), +(16067), +(16071), +(16075), +(16095), +(16100), +(16101), +(16128), +(16143), +(16144), +(16145), +(16168), +(16170), +(16172), +(16176), +(16177), +(16186), +(16231), +(16235), +(16236), +(16237), +(16240), +(16243), +(16247), +(16249), +(16333), +(16336), +(16343), +(16344), +(16351), +(16352), +(16353), +(16366), +(16373), +(16375), +(16391), +(16392), +(16393), +(16400), +(16401), +(16402), +(16403), +(16405), +(16406), +(16407), +(16408), +(16409), +(16410), +(16411), +(16412), +(16413), +(16414), +(16415), +(16427), +(16429), +(16430), +(16431), +(16433), +(16448), +(16449), +(16451), +(16454), +(16455), +(16456), +(16458), +(16460), +(16461), +(16472), +(16495), +(16496), +(16498), +(16508), +(16509), +(16511), +(16527), +(16528), +(16530), +(16536), +(16549), +(16552), +(16553), +(16554), +(16555), +(16561), +(16564), +(16565), +(16568), +(16569), +(16570), +(16573), +(16583), +(16587), +(16588), +(16603), +(16608), +(16610), +(16612), +(16614), +(16618), +(16627), +(16628), +(16636), +(16697), +(16707), +(16708), +(16709), +(16711), +(16712), +(16713), +(16714), +(16716), +(16722), +(16782), +(16783), +(16784), +(16788), +(16790), +(16793), +(16798), +(16799), +(16804), +(16805), +(16827), +(16828), +(16829), +(16830), +(16831), +(16832), +(16844), +(16856), +(16857), +(16868), +(16869), +(16871), +(16898), +(16908), +(16921), +(16922), +(16927), +(16928), +(16953), +(16979), +(16997), +(17008), +(17009), +(17011), +(17012), +(17013), +(17105), +(17134), +(17137), +(17138), +(17139), +(17140), +(17141), +(17142), +(17143), +(17144), +(17146), +(17147), +(17148), +(17149), +(17150), +(17151), +(17153), +(17156), +(17157), +(17158), +(17159), +(17160), +(17165), +(17168), +(17170), +(17171), +(17172), +(17173), +(17174), +(17175), +(17183), +(17194), +(17195), +(17198), +(17201), +(17213), +(17227), +(17230), +(17233), +(17234), +(17238), +(17243), +(17244), +(17246), +(17253), +(17255), +(17256), +(17257), +(17258), +(17259), +(17260), +(17261), +(17273), +(17274), +(17276), +(17281), +(17284), +(17287), +(17289), +(17290), +(17292), +(17293), +(17307), +(17308), +(17311), +(17312), +(17313), +(17314), +(17315), +(17330), +(17331), +(17333), +(17334), +(17347), +(17348), +(17353), +(17364), +(17368), +(17393), +(17405), +(17407), +(17434), +(17435), +(17439), +(17445), +(17451), +(17452), +(17470), +(17483), +(17484), +(17492), +(17494), +(17496), +(17500), +(17503), +(17504), +(17505), +(17506), +(17509), +(17510), +(17511), +(17529), +(17547), +(17607), +(17608), +(17609), +(17610), +(17611), +(17613), +(17615), +(17620), +(17630), +(17633), +(17639), +(17648), +(17649), +(17672), +(17682), +(17692), +(17734), +(17736), +(17738), +(17744), +(17745), +(17749), +(17753), +(17754), +(17755), +(17776), +(17777), +(17794), +(17797), +(17798), +(17799), +(17800), +(17843), +(17855), +(17856), +(17857), +(17859), +(17860), +(17863), +(17877), +(17883), +(17919), +(17920), +(17921), +(17922), +(17923), +(17924), +(17925), +(17926), +(17939), +(17943), +(17944), +(17946), +(17948), +(17950), +(17961), +(17962), +(17963), +(18070), +(18072), +(18075), +(18077), +(18078), +(18081), +(18082), +(18083), +(18084), +(18085), +(18086), +(18088), +(18089), +(18090), +(18091), +(18092), +(18101), +(18103), +(18104), +(18105), +(18106), +(18107), +(18108), +(18111), +(18112), +(18118), +(18138), +(18145), +(18149), +(18151), +(18152), +(18153), +(18159), +(18164), +(18165), +(18172), +(18173), +(18187), +(18197), +(18199), +(18200), +(18202), +(18203), +(18204), +(18205), +(18206), +(18208), +(18209), +(18210), +(18211), +(18214), +(18217), +(18223), +(18266), +(18267), +(18270), +(18276), +(18278), +(18289), +(18347), +(18362), +(18367), +(18368), +(18375), +(18381), +(18387), +(18389), +(18390), +(18395), +(18396), +(18398), +(18425), +(18469), +(18476), +(18498), +(18502), +(18503), +(18543), +(18545), +(18557), +(18561), +(18562), +(18608), +(18610), +(18631), +(18632), +(18633), +(18647), +(18649), +(18651), +(18652), +(18654), +(18656), +(18657), +(18658), +(18663), +(18670), +(18702), +(18761), +(18763), +(18796), +(18798), +(18802), +(18805), +(18807), +(18809), +(18812), +(18813), +(18817), +(18819), +(18833), +(18867), +(18868), +(18869), +(18870), +(18871), +(18945), +(18952), +(18958), +(18968), +(18972), +(18980), +(18988), +(18996), +(19027), +(19128), +(19130), +(19131), +(19132), +(19133), +(19134), +(19136), +(19179), +(19196), +(19213), +(19244), +(19260), +(19276), +(19277), +(19278), +(19279), +(19280), +(19306), +(19319), +(19362), +(19386), +(19391), +(19393), +(19395), +(19397), +(19411), +(19434), +(19437), +(19439), +(19444), +(19445), +(19446), +(19447), +(19448), +(19450), +(19452), +(19460), +(19463), +(19469), +(19471), +(19472), +(19476), +(19481), +(19486), +(19501), +(19503), +(19505), +(19512), +(19548), +(19595), +(19597), +(19632), +(19633), +(19637), +(19639), +(19642), +(19643), +(19644), +(19647), +(19648), +(19650), +(19652), +(19653), +(19654), +(19658), +(19661), +(19662), +(19663), +(19664), +(19674), +(19675), +(19676), +(19677), +(19678), +(19679), +(19680), +(19681), +(19682), +(19683), +(19684), +(19685), +(19686), +(19687), +(19688), +(19689), +(19692), +(19693), +(19694), +(19696), +(19697), +(19699), +(19700), +(19701), +(19725), +(19727), +(19728), +(19729), +(19730), +(19731), +(19734), +(19736), +(19737), +(19738), +(19739), +(19740), +(19742), +(19750), +(19755), +(19767), +(19770), +(19771), +(19775), +(19776), +(19777), +(19779), +(19785), +(19797), +(19801), +(19816), +(19820), +(19834), +(19835), +(19836), +(19837), +(19838), +(19850), +(19852), +(19853), +(19854), +(19869), +(19872), +(19874), +(19881), +(19901), +(19931), +(19938), +(19939), +(19940), +(19941), +(19942), +(19943), +(19970), +(19971), +(19972), +(19973), +(19974), +(19975), +(19983), +(20000), +(20004), +(20005), +(20006), +(20019), +(20066), +(20170), +(20184), +(20185), +(20186), +(20187), +(20211), +(20217), +(20220), +(20221), +(20223), +(20228), +(20233), +(20236), +(20240), +(20243), +(20252), +(20253), +(20271), +(20276), +(20279), +(20294), +(20295), +(20297), +(20298), +(20367), +(20368), +(20369), +(20370), +(20371), +(20372), +(20373), +(20374), +(20410), +(20420), +(20424), +(20425), +(20463), +(20467), +(20473), +(20474), +(20475), +(20477), +(20508), +(20511), +(20534), +(20535), +(20536), +(20537), +(20539), +(20541), +(20543), +(20547), +(20559), +(20560), +(20564), +(20565), +(20569), +(20586), +(20604), +(20605), +(20614), +(20615), +(20616), +(20617), +(20618), +(20623), +(20625), +(20627), +(20629), +(20630), +(20647), +(20655), +(20656), +(20657), +(20658), +(20660), +(20661), +(20662), +(20663), +(20664), +(20665), +(20666), +(20668), +(20677), +(20678), +(20679), +(20682), +(20684), +(20685), +(20688), +(20690), +(20691), +(20692), +(20695), +(20696), +(20698), +(20700), +(20714), +(20720), +(20726), +(20733), +(20735), +(20736), +(20740), +(20751), +(20787), +(20788), +(20790), +(20791), +(20792), +(20793), +(20795), +(20797), +(20800), +(20801), +(20802), +(20804), +(20805), +(20806), +(20807), +(20808), +(20811), +(20812), +(20815), +(20816), +(20819), +(20820), +(20821), +(20822), +(20823), +(20824), +(20825), +(20826), +(20829), +(20830), +(20831), +(20832), +(20869), +(20882), +(20883), +(20893), +(20900), +(20901), +(20902), +(20903), +(20904), +(20909), +(20910), +(20911), +(20929), +(20930), +(20989), +(21008), +(21027), +(21030), +(21047), +(21049), +(21050), +(21055), +(21056), +(21059), +(21060), +(21062), +(21063), +(21064), +(21066), +(21067), +(21068), +(21072), +(21074), +(21077), +(21081), +(21100), +(21128), +(21140), +(21141), +(21150), +(21151), +(21159), +(21162), +(21163), +(21164), +(21170), +(21179), +(21183), +(21187), +(21330), +(21332), +(21335), +(21337), +(21343), +(21356), +(21357), +(21368), +(21369), +(21372), +(21388), +(21390), +(21398), +(21401), +(21402), +(21463), +(21464), +(21465), +(21541), +(21542), +(21543), +(21546), +(21549), +(21551), +(21552), +(21553), +(21647), +(21654), +(21667), +(21668), +(21669), +(21670), +(21731), +(21732), +(21734), +(21735), +(21737), +(21745), +(21787), +(21794), +(21807), +(21829), +(21832), +(21834), +(21835), +(21840), +(21847), +(21866), +(21889), +(21892), +(21898), +(21912), +(21939), +(21949), +(21952), +(21953), +(21960), +(21961), +(21971), +(21979), +(21987), +(21990), +(21992), +(22009), +(22012), +(22048), +(22068), +(22088), +(22108), +(22109), +(22110), +(22111), +(22112), +(22113), +(22114), +(22115), +(22116), +(22117), +(22118), +(22119), +(22120), +(22121), +(22127), +(22128), +(22167), +(22168), +(22187), +(22189), +(22207), +(22227), +(22272), +(22273), +(22274), +(22284), +(22289), +(22290), +(22291), +(22312), +(22335), +(22336), +(22355), +(22357), +(22371), +(22373), +(22411), +(22412), +(22414), +(22415), +(22416), +(22418), +(22423), +(22426), +(22427), +(22428), +(22429), +(22433), +(22438), +(22482), +(22565), +(22568), +(22570), +(22572), +(22574), +(22575), +(22582), +(22591), +(22592), +(22639), +(22641), +(22646), +(22651), +(22661), +(22662), +(22666), +(22667), +(22677), +(22678), +(22682), +(22687), +(22689), +(22690), +(22691), +(22692), +(22695), +(22709), +(22713), +(22715), +(22742), +(22744), +(22745), +(22751), +(22752), +(22784), +(22785), +(22799), +(22800), +(22814), +(22816), +(22817), +(22818), +(22820), +(22822), +(22823), +(22827), +(22828), +(22829), +(22856), +(22858), +(22859), +(22864), +(22883), +(22885), +(22886), +(22887), +(22893), +(22901), +(22907), +(22909), +(22911), +(22916), +(22919), +(22920), +(22935), +(22947), +(22950), +(22951), +(22959), +(22968), +(22993), +(22994), +(22995), +(22997), +(23015), +(23038), +(23059), +(23064), +(23065), +(23073), +(23102), +(23104), +(23106), +(23114), +(23115), +(23122), +(23123), +(23124), +(23125), +(23135), +(23139), +(23153), +(23154), +(23155), +(23169), +(23170), +(23174), +(23205), +(23206), +(23224), +(23256), +(23262), +(23267), +(23268), +(23275), +(23278), +(23298), +(23301), +(23304), +(23333), +(23335), +(23337), +(23340), +(23359), +(23379), +(23380), +(23381), +(23391), +(23392), +(23402), +(23416), +(23417), +(23451), +(23452), +(23454), +(23460), +(23490), +(23491), +(23493), +(23504), +(23505), +(23546), +(23552), +(23567), +(23568), +(23569), +(23577), +(23580), +(23590), +(23592), +(23601), +(23604), +(23605), +(23620), +(23621), +(23622), +(23623), +(23625), +(23626), +(23627), +(23658), +(23661), +(23675), +(23687), +(23693), +(23694), +(23695), +(23696), +(23699), +(23702), +(23735), +(23736), +(23737), +(23738), +(23765), +(23766), +(23767), +(23768), +(23769), +(23774), +(23775), +(23786), +(23848), +(23850), +(23853), +(23859), +(23860), +(23862), +(23865), +(23881), +(23892), +(23893), +(23894), +(23895), +(23921), +(23922), +(23923), +(23924), +(23925), +(23947), +(23948), +(23952), +(23953), +(23958), +(23959), +(23960), +(23961), +(23962), +(23963), +(23964), +(23967), +(23970), +(23978), +(23979), +(24002), +(24003), +(24016), +(24017), +(24020), +(24023), +(24042), +(24049), +(24053), +(24061), +(24064), +(24097), +(24109), +(24111), +(24131), +(24132), +(24133), +(24134), +(24135), +(24178), +(24179), +(24185), +(24187), +(24193), +(24199), +(24201), +(24208), +(24210), +(24212), +(24213), +(24238), +(24239), +(24241), +(24248), +(24251), +(24253), +(24254), +(24257), +(24259), +(24261), +(24267), +(24274), +(24275), +(24300), +(24306), +(24314), +(24315), +(24316), +(24317), +(24327), +(24331), +(24332), +(24333), +(24335), +(24336), +(24337), +(24339), +(24341), +(24374), +(24378), +(24379), +(24388), +(24393), +(24394), +(24407), +(24408), +(24412), +(24413), +(24414), +(24423), +(24435), +(24458), +(24466), +(24530), +(24573), +(24577), +(24578), +(24579), +(24583), +(24585), +(24586), +(24587), +(24596), +(24600), +(24601), +(24611), +(24617), +(24618), +(24619), +(24637), +(24640), +(24648), +(24649), +(24668), +(24671), +(24672), +(24674), +(24680), +(24684), +(24685), +(24686), +(24690), +(24705), +(24708), +(24709), +(24710), +(24711), +(24712), +(24713), +(24714), +(24715), +(24723), +(24725), +(24726), +(24727), +(24730), +(24732), +(24735), +(24736), +(24740), +(24742), +(24745), +(24747), +(24750), +(24751), +(24752), +(24753), +(24755), +(24757), +(24759), +(24761), +(24762), +(24766), +(24767), +(24769), +(24771), +(24773), +(24776), +(24785), +(24787), +(24791), +(24792), +(24793), +(24802), +(24803), +(24816), +(24817), +(24819), +(24824), +(24825), +(24826), +(24829), +(24831), +(24832), +(24844), +(24857), +(24872), +(24873), +(24875), +(24923), +(24928), +(24935), +(24937), +(24942), +(24950), +(24951), +(24952), +(24953), +(24954), +(24955), +(24957), +(24960), +(24961), +(24962), +(24963), +(24964), +(24965), +(24966), +(24974), +(24975), +(24976), +(24977), +(24982), +(24993), +(25006), +(25008), +(25009), +(25010), +(25011), +(25012), +(25021), +(25022), +(25025), +(25028), +(25050), +(25051), +(25052), +(25054), +(25055), +(25058), +(25104), +(25139), +(25140), +(25143), +(25165), +(25174), +(25185), +(25187), +(25189), +(25190), +(25191), +(25208), +(25210), +(25212), +(25213), +(25217), +(25218), +(25221), +(25222), +(25225), +(25231), +(25233), +(25234), +(25235), +(25236), +(25241), +(25242), +(25245), +(25246), +(25248), +(25251), +(25258), +(25262), +(25263), +(25266), +(25269), +(25272), +(25273), +(25274), +(25275), +(25281), +(25282), +(25286), +(25288), +(25290), +(25291), +(25292), +(25294), +(25295), +(25297), +(25298), +(25299), +(25300), +(25302), +(25304), +(25306), +(25307), +(25308), +(25309), +(25311), +(25312), +(25314), +(25315), +(25316), +(25345), +(25349), +(25363), +(25364), +(25367), +(25368), +(25371), +(25372), +(25373), +(25375), +(25383), +(25384), +(25387), +(25389), +(25391), +(25396), +(25420), +(25424), +(25433), +(25439), +(25442), +(25448), +(25449), +(25454), +(25457), +(25462), +(25464), +(25465), +(25467), +(25471), +(25488), +(25497), +(25501), +(25504), +(25514), +(25515), +(25530), +(25531), +(25595), +(25602), +(25603), +(25605), +(25645), +(25646), +(25650), +(25651), +(25652), +(25668), +(25671), +(25673), +(25677), +(25678), +(25686), +(25710), +(25712), +(25721), +(25725), +(25742), +(25748), +(25755), +(25760), +(25761), +(25762), +(25771), +(25772), +(25777), +(25778), +(25779), +(25781), +(25788), +(25800), +(25802), +(25803), +(25806), +(25807), +(25808), +(25809), +(25810), +(25811), +(25816), +(25821), +(25838), +(25840), +(25843), +(25845), +(25847), +(25848), +(25852), +(25854), +(25856), +(25861), +(25902), +(25903), +(25911), +(25912), +(25913), +(25914), +(25947), +(25992), +(25995), +(25997), +(25999), +(26001), +(26004), +(26005), +(26006), +(26007), +(26008), +(26012), +(26013), +(26017), +(26035), +(26044), +(26050), +(26077), +(26078), +(26079), +(26081), +(26082), +(26090), +(26095), +(26097), +(26098), +(26100), +(26108), +(26125), +(26126), +(26134), +(26141), +(26143), +(26170), +(26181), +(26194), +(26195), +(26196), +(26197), +(26198), +(26206), +(26207), +(26211), +(26218), +(26226), +(26233), +(26258), +(26259), +(26275), +(26281), +(26282), +(26339), +(26350), +(26363), +(26364), +(26365), +(26366), +(26367), +(26368), +(26369), +(26370), +(26371), +(26372), +(26374), +(26375), +(26377), +(26406), +(26408), +(26409), +(26410), +(26412), +(26414), +(26415), +(26419), +(26446), +(26448), +(26470), +(26476), +(26548), +(26556), +(26561), +(26565), +(26572), +(26584), +(26601), +(26610), +(26613), +(26616), +(26622), +(26623), +(26624), +(26625), +(26636), +(26639), +(26641), +(26649), +(26654), +(26663), +(26679), +(26688), +(26693), +(26740), +(26742), +(26748), +(26791), +(26796), +(26799), +(26800), +(26839), +(26861), +(26862), +(26863), +(26864), +(26865), +(26866), +(26867), +(26884), +(26890), +(26899), +(26923), +(26924), +(26968), +(26978), +(26979), +(26980), +(26981), +(26982), +(26984), +(26985), +(26986), +(26987), +(26988), +(26989), +(26990), +(26992), +(26995), +(26996), +(27000), +(27001), +(27002), +(27003), +(27004), +(27005), +(27006), +(27007), +(27008), +(27010), +(27013), +(27014), +(27016), +(27019), +(27021), +(27024), +(27030), +(27031), +(27047), +(27048), +(27049), +(27050), +(27051), +(27060), +(27065), +(27067), +(27068), +(27069), +(27070), +(27071), +(27072), +(27073), +(27074), +(27075), +(27078), +(27079), +(27126), +(27132), +(27135), +(27136), +(27137), +(27138), +(27140), +(27142), +(27154), +(27174), +(27175), +(27176), +(27177), +(27180), +(27187), +(27189), +(27209), +(27210), +(27211), +(27215), +(27216), +(27217), +(27218), +(27219), +(27220), +(27223), +(27224), +(27228), +(27243), +(27254), +(27255), +(27258), +(27261), +(27263), +(27267), +(27270), +(27274), +(27275), +(27276), +(27277), +(27281), +(27286), +(27288), +(27290), +(27360), +(27375), +(27376), +(27378), +(27379), +(27380), +(27381), +(27384), +(27385), +(27386), +(27387), +(27389), +(27390), +(27391), +(27392), +(27393), +(27395), +(27396), +(27397), +(27398), +(27441), +(27448), +(27486), +(27526), +(27527), +(27532), +(27541), +(27547), +(27548), +(27549), +(27550), +(27552), +(27553), +(27554), +(27555), +(27556), +(27557), +(27559), +(27565), +(27567), +(27571), +(27572), +(27573), +(27576), +(27577), +(27580), +(27581), +(27582), +(27584), +(27605), +(27606), +(27608), +(27609), +(27611), +(27613), +(27615), +(27620), +(27624), +(27626), +(27632), +(27633), +(27634), +(27635), +(27636), +(27637), +(27638), +(27640), +(27648), +(27655), +(27662), +(27673), +(27677), +(27686), +(27752), +(27754), +(27755), +(27756), +(27760), +(27765), +(27794), +(27806), +(27814), +(27819), +(27841), +(27849), +(27852), +(27860), +(27861), +(27863), +(27864), +(27865), +(27868), +(27873), +(27874), +(27891), +(27907), +(27909), +(27910), +(27915), +(27919), +(27931), +(27937), +(27983), +(27991), +(27992), +(27994), +(27995), +(28030), +(28099), +(28133), +(28147), +(28149), +(28167), +(28169), +(28239), +(28251), +(28252), +(28253), +(28254), +(28255), +(28256), +(28257), +(28258), +(28259), +(28260), +(28261), +(28262), +(28263), +(28265), +(28271), +(28272), +(28276), +(28287), +(28293), +(28299), +(28301), +(28303), +(28306), +(28308), +(28310), +(28314), +(28318), +(28319), +(28320), +(28321), +(28329), +(28336), +(28337), +(28342), +(28350), +(28351), +(28375), +(28393), +(28394), +(28396), +(28397), +(28410), +(28412), +(28418), +(28419), +(28420), +(28428), +(28431), +(28434), +(28439), +(28444), +(28445), +(28467), +(28470), +(28478), +(28516), +(28522), +(28597), +(28601), +(28608), +(28614), +(28624), +(28674), +(28676), +(28678), +(28684), +(28685), +(28689), +(28690), +(28691), +(28692), +(28696), +(28698), +(28702), +(28715), +(28718), +(28720), +(28722), +(28723), +(28724), +(28734), +(28750), +(28772), +(28776), +(28783), +(28788), +(28790), +(28791), +(28793), +(28795), +(28810), +(28824), +(28825), +(28826), +(28827), +(28836), +(28839), +(28858), +(28859), +(28872), +(28873), +(28880), +(28882), +(28883), +(28887), +(28896), +(28899), +(28900), +(28901), +(28902), +(28913), +(28969), +(28993), +(29001), +(29002), +(29003), +(29006), +(29044), +(29054), +(29058), +(29060), +(29098), +(29117), +(29126), +(29127), +(29128), +(29129), +(29134), +(29135), +(29136), +(29137), +(29138), +(29139), +(29151), +(29155), +(29157), +(29158), +(29160), +(29164), +(29166), +(29168), +(29170), +(29175), +(29182), +(29185), +(29188), +(29194), +(29196), +(29198), +(29228), +(29290), +(29295), +(29300), +(29306), +(29314), +(29317), +(29319), +(29320), +(29341), +(29362), +(29364), +(29380), +(29386), +(29395), +(29405), +(29407), +(29408), +(29425), +(29426), +(29427), +(29428), +(29435), +(29436), +(29443), +(29473), +(29487), +(29492), +(29494), +(29495), +(29497), +(29500), +(29502), +(29515), +(29516), +(29519), +(29522), +(29528), +(29539), +(29540), +(29543), +(29544), +(29546), +(29555), +(29560), +(29561), +(29562), +(29563), +(29564), +(29567), +(29570), +(29572), +(29574), +(29575), +(29576), +(29577), +(29578), +(29580), +(29581), +(29582), +(29583), +(29585), +(29586), +(29587), +(29607), +(29609), +(29638), +(29639), +(29640), +(29641), +(29644), +(29646), +(29647), +(29652), +(29653), +(29655), +(29661), +(29665), +(29666), +(29667), +(29670), +(29673), +(29675), +(29676), +(29677), +(29679), +(29684), +(29690), +(29703), +(29704), +(29707), +(29711), +(29712), +(29716), +(29722), +(29765), +(29768), +(29815), +(29832), +(29845), +(29847), +(29848), +(29850), +(29879), +(29881), +(29896), +(29901), +(29903), +(29906), +(29907), +(29909), +(29915), +(29916), +(29917), +(29925), +(29926), +(29927), +(29928), +(29930), +(29953), +(29954), +(29955), +(29956), +(29964), +(29990), +(29991), +(30010), +(30013), +(30014), +(30016), +(30019), +(30022), +(30036), +(30039), +(30044), +(30050), +(30053), +(30055), +(30069), +(30070), +(30077), +(30081), +(30099), +(30100), +(30102), +(30103), +(30104), +(30105), +(30108), +(30112), +(30113), +(30115), +(30121), +(30127), +(30128), +(30130), +(30131), +(30151), +(30153), +(30164), +(30173), +(30175), +(30177), +(30178), +(30180), +(30194), +(30195), +(30197), +(30198), +(30202), +(30213), +(30218), +(30219), +(30223), +(30238), +(30253), +(30269), +(30270), +(30271), +(30280), +(30285), +(30324), +(30330), +(30335), +(30351), +(30353), +(30356), +(30357), +(30358), +(30383), +(30395), +(30400), +(30401), +(30402), +(30404), +(30405), +(30412), +(30421), +(30422), +(30423), +(30424), +(30430), +(30433), +(30435), +(30448), +(30449), +(30451), +(30455), +(30459), +(30463), +(30464), +(30465), +(30466), +(30467), +(30468), +(30471), +(30474), +(30478), +(30479), +(30481), +(30493), +(30495), +(30500), +(30501), +(30504), +(30505), +(30507), +(30512), +(30520), +(30528), +(30530), +(30545), +(30546), +(30601), +(30605), +(30606), +(30607), +(30608), +(30609), +(30614), +(30615), +(30619), +(30621), +(30637), +(30638), +(30639), +(30641), +(30643), +(30646), +(30647), +(30648), +(30651), +(30652), +(30653), +(30654), +(30661), +(30686), +(30687), +(30688), +(30689), +(30691), +(30695), +(30719), +(30736), +(30740), +(30751), +(30753), +(30755), +(30756), +(30768), +(30817), +(30822), +(30830), +(30832), +(30838), +(30839), +(30846), +(30849), +(30850), +(30854), +(30875), +(30876), +(30877), +(30878), +(30888), +(30889), +(30890), +(30900), +(30901), +(30909), +(30910), +(30923), +(30926), +(30932), +(30936), +(30937), +(30942), +(30943), +(30944), +(30945), +(30967), +(30971), +(30977), +(30980), +(30981), +(30984), +(30986), +(30989), +(30990), +(30992), +(31008), +(31009), +(31012), +(31015), +(31016), +(31018), +(31022), +(31041), +(31042), +(31043), +(31046), +(31069), +(31117), +(31125), +(31139), +(31249), +(31257), +(31262), +(31263), +(31270), +(31271), +(31272), +(31274), +(31275), +(31279), +(31280), +(31281), +(31282), +(31284), +(31286), +(31287), +(31288), +(31289), +(31290), +(31292), +(31295), +(31296), +(31305), +(31306), +(31312), +(31316), +(31319), +(31330), +(31334), +(31337), +(31339), +(31345), +(31366), +(31367), +(31368), +(31376), +(31378), +(31381), +(31387), +(31389), +(31390), +(31394), +(31397), +(31399), +(31400), +(31401), +(31402), +(31404), +(31405), +(31406), +(31407), +(31410), +(31415), +(31416), +(31417), +(31418), +(31419), +(31420), +(31423), +(31425), +(31426), +(31427), +(31436), +(31445), +(31446), +(31457), +(31464), +(31477), +(31481), +(31486), +(31513), +(31516), +(31535), +(31547), +(31551), +(31552), +(31553), +(31566), +(31589), +(31595), +(31596), +(31600), +(31601), +(31602), +(31604), +(31609), +(31610), +(31618), +(31620), +(31622), +(31623), +(31626), +(31627), +(31629), +(31651), +(31662), +(31664), +(31703), +(31705), +(31707), +(31709), +(31713), +(31715), +(31717), +(31718), +(31721), +(31724), +(31729), +(31733), +(31734), +(31739), +(31740), +(31741), +(31742), +(31743), +(31747), +(31751), +(31754), +(31758), +(31759), +(31764), +(31766), +(31772), +(31779), +(31782), +(31784), +(31789), +(31790), +(31803), +(31804), +(31807), +(31808), +(31810), +(31811), +(31812), +(31813), +(31814), +(31815), +(31816), +(31819), +(31827), +(31843), +(31863), +(31864), +(31865), +(31893), +(31898), +(31907), +(31911), +(31916), +(31923), +(31935), +(31939), +(31942), +(31946), +(31948), +(31955), +(31956), +(31961), +(31965), +(31966), +(31971), +(31972), +(31973), +(31975), +(31976), +(31977), +(31978), +(31984), +(31988), +(31994), +(31996), +(31999), +(32000), +(32001), +(32002), +(32004), +(32005), +(32006), +(32009), +(32010), +(32011), +(32012), +(32013), +(32015), +(32017), +(32018), +(32019), +(32020), +(32021), +(32022), +(32024), +(32025), +(32026), +(32039), +(32049), +(32055), +(32056), +(32063), +(32065), +(32071), +(32076), +(32077), +(32080), +(32082), +(32092), +(32093), +(32094), +(32095), +(32103), +(32104), +(32105), +(32110), +(32120), +(32125), +(32126), +(32129), +(32131), +(32132), +(32133), +(32139), +(32154), +(32168), +(32175), +(32176), +(32190), +(32197), +(32202), +(32211), +(32224), +(32231), +(32247), +(32248), +(32261), +(32268), +(32270), +(32300), +(32306), +(32315), +(32317), +(32319), +(32320), +(32321), +(32323), +(32325), +(32328), +(32329), +(32330), +(32337), +(32338), +(32346), +(32361), +(32363), +(32364), +(32369), +(32370), +(32376), +(32378), +(32379), +(32386), +(32388), +(32389), +(32390), +(32391), +(32405), +(32414), +(32415), +(32416), +(32417), +(32418), +(32422), +(32428), +(32430), +(32431), +(32441), +(32445), +(32474), +(32491), +(32546), +(32550), +(32578), +(32583), +(32588), +(32593), +(32594), +(32595), +(32605), +(32606), +(32639), +(32643), +(32645), +(32652), +(32654), +(32666), +(32674), +(32675), +(32677), +(32678), +(32679), +(32682), +(32683), +(32684), +(32689), +(32690), +(32691), +(32693), +(32699), +(32700), +(32707), +(32709), +(32716), +(32721), +(32733), +(32734), +(32735), +(32736), +(32738), +(32739), +(32740), +(32741), +(32742), +(32747), +(32748), +(32749), +(32751), +(32752), +(32759), +(32769), +(32770), +(32771), +(32772), +(32774), +(32778), +(32779), +(32784), +(32797), +(32829), +(32830), +(32831), +(32835), +(32846), +(32858), +(32860), +(32862), +(32863), +(32864), +(32889), +(32897), +(32901), +(32902), +(32903), +(32904), +(32905), +(32906), +(32907), +(32908), +(32909), +(32913), +(32915), +(32916), +(32917), +(32919), +(32921), +(32922), +(32924), +(32926), +(32935), +(32940), +(32950), +(32959), +(32960), +(32962), +(32967), +(32969), +(32971), +(32984), +(32996), +(33031), +(33040), +(33044), +(33045), +(33047), +(33049), +(33051), +(33055), +(33056), +(33068), +(33069), +(33072), +(33073), +(33074), +(33077), +(33078), +(33079), +(33080), +(33081), +(33082), +(33086), +(33096), +(33098), +(33126), +(33129), +(33130), +(33144), +(33173), +(33175), +(33196), +(33197), +(33198), +(33206), +(33227), +(33230), +(33246), +(33247), +(33324), +(33326), +(33331), +(33335), +(33346), +(33360), +(33382), +(33383), +(33385), +(33387), +(33389), +(33392), +(33401), +(33404), +(33417), +(33419), +(33462), +(33463), +(33480), +(33482), +(33483), +(33487), +(33493), +(33502), +(33526), +(33527), +(33528), +(33529), +(33534), +(33535), +(33542), +(33552), +(33553), +(33554), +(33619), +(33620), +(33625), +(33626), +(33628), +(33631), +(33632), +(33640), +(33641), +(33643), +(33659), +(33661), +(33665), +(33684), +(33688), +(33689), +(33698), +(33699), +(33700), +(33709), +(33723), +(33728), +(33731), +(33745), +(33750), +(33763), +(33768), +(33781), +(33786), +(33787), +(33789), +(33792), +(33793), +(33794), +(33813), +(33824), +(33825), +(33827), +(33832), +(33833), +(33837), +(33844), +(33849), +(33850), +(33865), +(33871), +(33876), +(33878), +(33899), +(33907), +(33910), +(33911), +(33912), +(33913), +(33914), +(33925), +(33938), +(33947), +(33951), +(33960), +(33964), +(33969), +(33970), +(33975), +(33982), +(33983), +(33985), +(33986), +(33987), +(33988), +(33989), +(34014), +(34020), +(34025), +(34036), +(34071), +(34073), +(34083), +(34087), +(34088), +(34089), +(34092), +(34093), +(34095), +(34097), +(34099), +(34107), +(34108), +(34110), +(34112), +(34113), +(34120), +(34130), +(34132), +(34135), +(34138), +(34139), +(34143), +(34149), +(34150), +(34163), +(34171), +(34172), +(34176), +(34177), +(34213), +(34214), +(34215), +(34216), +(34217), +(34218), +(34219), +(34232), +(34243), +(34259), +(34298), +(34344), +(34345), +(34346), +(34347), +(34348), +(34351), +(34352), +(34353), +(34354), +(34357), +(34361), +(34363), +(34366), +(34370), +(34379), +(34389), +(34390), +(34391), +(34394), +(34400), +(34411), +(34412), +(34413), +(34414), +(34415), +(34416), +(34417), +(34418), +(34419), +(34423), +(34425), +(34428), +(34432), +(34437), +(34438), +(34439), +(34445), +(34446), +(34447), +(34451), +(34463), +(34490), +(34510), +(34520), +(34578), +(34580), +(34587), +(34613), +(34614), +(34615), +(34616), +(34618), +(34620), +(34625), +(34626), +(34629), +(34637), +(34639), +(34640), +(34641), +(34643), +(34644), +(34645), +(34650), +(34653), +(34654), +(34655), +(34661), +(34665), +(34672), +(34694), +(34695), +(34696), +(34697), +(34709), +(34714), +(34715), +(34719), +(34722), +(34745), +(34752), +(34784), +(34786), +(34787), +(34788), +(34789), +(34793), +(34794), +(34797), +(34798), +(34799), +(34800), +(34802), +(34809), +(34811), +(34812), +(34820), +(34824), +(34828), +(34829), +(34841), +(34852), +(34856), +(34875), +(34879), +(34881), +(34883), +(34886), +(34889), +(34891), +(34893), +(34906), +(34907), +(34913), +(34914), +(34916), +(34917), +(34920), +(34922), +(34924), +(34925), +(34930), +(34931), +(34940), +(34941), +(34942), +(34945), +(34969), +(34974), +(34975), +(34976), +(34984), +(34996), +(35004), +(35010), +(35011), +(35012), +(35013), +(35033), +(35034), +(35039), +(35047), +(35049), +(35054), +(35055), +(35056), +(35062), +(35065), +(35066), +(35067), +(35069), +(35071), +(35072), +(35088), +(35089), +(35092), +(35096), +(35101), +(35105), +(35106), +(35107), +(35112), +(35115), +(35117), +(35120), +(35144), +(35147), +(35161), +(35178), +(35179), +(35180), +(35182), +(35183), +(35185), +(35189), +(35195), +(35201), +(35207), +(35229), +(35231), +(35234), +(35238), +(35243), +(35244), +(35263), +(35267), +(35273), +(35280), +(35290), +(35291), +(35292), +(35293), +(35294), +(35295), +(35313), +(35314), +(35316), +(35317), +(35318), +(35321), +(35323), +(35325), +(35326), +(35328), +(35329), +(35331), +(35332), +(35333), +(35334), +(35335), +(35339), +(35346), +(35353), +(35371), +(35376), +(35377), +(35382), +(35387), +(35389), +(35392), +(35395), +(35401), +(35410), +(35412), +(35424), +(35460), +(35466), +(35472), +(35473), +(35493), +(35499), +(35501), +(35506), +(35507), +(35510), +(35511), +(35514), +(35518), +(35519), +(35556), +(35570), +(35621), +(35686), +(35718), +(35727), +(35728), +(35735), +(35741), +(35742), +(35748), +(35759), +(35760), +(35771), +(35772), +(35780), +(35783), +(35839), +(35846), +(35851), +(35853), +(35857), +(35871), +(35873), +(35877), +(35913), +(35914), +(35916), +(35918), +(35919), +(35920), +(35927), +(35928), +(35932), +(35944), +(35945), +(35946), +(35949), +(35954), +(35955), +(35963), +(35964), +(35965), +(35966), +(35967), +(35968), +(35969), +(35970), +(35971), +(35972), +(35973), +(35974), +(35975), +(35976), +(35977), +(35978), +(35979), +(35980), +(35981), +(35982), +(35983), +(35984), +(35985), +(35986), +(35987), +(35988), +(35989), +(35990), +(35997), +(35998), +(35999), +(36002), +(36020), +(36021), +(36023), +(36025), +(36033), +(36052), +(36054), +(36073), +(36088), +(36093), +(36094), +(36095), +(36099), +(36100), +(36102), +(36115), +(36123), +(36138), +(36140), +(36141), +(36145), +(36152), +(36153), +(36170), +(36173), +(36176), +(36181), +(36207), +(36208), +(36224), +(36227), +(36228), +(36237), +(36238), +(36246), +(36247), +(36250), +(36276), +(36277), +(36279), +(36288), +(36295), +(36296), +(36299), +(36310), +(36312), +(36314), +(36328), +(36332), +(36333), +(36339), +(36340), +(36341), +(36342), +(36343), +(36344), +(36345), +(36348), +(36380), +(36398), +(36399), +(36401), +(36402), +(36404), +(36414), +(36415), +(36416), +(36417), +(36433), +(36434), +(36435), +(36436), +(36438), +(36439), +(36441), +(36447), +(36448), +(36457), +(36458), +(36461), +(36464), +(36469), +(36470), +(36475), +(36478), +(36482), +(36483), +(36488), +(36500), +(36507), +(36508), +(36509), +(36516), +(36517), +(36518), +(36527), +(36534), +(36536), +(36538), +(36539), +(36540), +(36541), +(36554), +(36558), +(36570), +(36571), +(36578), +(36586), +(36590), +(36594), +(36601), +(36604), +(36606), +(36608), +(36609), +(36612), +(36622), +(36623), +(36624), +(36625), +(36627), +(36628), +(36632), +(36638), +(36641), +(36642), +(36645), +(36646), +(36647), +(36650), +(36655), +(36656), +(36659), +(36664), +(36671), +(36677), +(36678), +(36679), +(36710), +(36711), +(36712), +(36713), +(36714), +(36732), +(36739), +(36778), +(36779), +(36780), +(36781), +(36787), +(36789), +(36791), +(36796), +(36801), +(36805), +(36806), +(36807), +(36810), +(36812), +(36814), +(36822), +(36825), +(36831), +(36832), +(36833), +(36836), +(36838), +(36839), +(36840), +(36841), +(36842), +(36843), +(36844), +(36863), +(36864), +(36866), +(36872), +(36876), +(36877), +(36886), +(36891), +(36894), +(36905), +(36906), +(36909), +(36913), +(36914), +(36916), +(36917), +(36919), +(36920), +(36921), +(36924), +(36927), +(36929), +(36947), +(36956), +(36957), +(36965), +(36966), +(36971), +(36972), +(36974), +(36979), +(36980), +(36983), +(36984), +(36986), +(36987), +(36988), +(36990), +(36991), +(37027), +(37028), +(37030), +(37031), +(37054), +(37057), +(37067), +(37073), +(37074), +(37082), +(37089), +(37104), +(37110), +(37111), +(37112), +(37113), +(37121), +(37122), +(37123), +(37126), +(37132), +(37133), +(37136), +(37138), +(37154), +(37156), +(37162), +(37176), +(37208), +(37216), +(37221), +(37249), +(37250), +(37251), +(37252), +(37254), +(37255), +(37257), +(37259), +(37260), +(37271), +(37272), +(37273), +(37274), +(37275), +(37276), +(37277), +(37320), +(37321), +(37322), +(37323), +(37328), +(37329), +(37330), +(37331), +(37332), +(37334), +(37335), +(37359), +(37361), +(37369), +(37372), +(37387), +(37389), +(37412), +(37417), +(37421), +(37450), +(37455), +(37456), +(37460), +(37462), +(37463), +(37470), +(37479), +(37486), +(37500), +(37506), +(37511), +(37527), +(37532), +(37537), +(37540), +(37548), +(37551), +(37552), +(37554), +(37563), +(37566), +(37572), +(37577), +(37578), +(37579), +(37580), +(37581), +(37589), +(37591), +(37592), +(37596), +(37597), +(37599), +(37602), +(37621), +(37628), +(37629), +(37630), +(37632), +(37634), +(37646), +(37647), +(37654), +(37661), +(37662), +(37664), +(37667), +(37668), +(37675), +(37681), +(37685), +(37695), +(37700), +(37711), +(37717), +(37718), +(37719), +(37727), +(37749), +(37770), +(37777), +(37778), +(37798), +(37800), +(37801), +(37802), +(37803), +(37804), +(37805), +(37806), +(37807), +(37808), +(37809), +(37810), +(37811), +(37813), +(37823), +(37834), +(37838), +(37839), +(37840), +(37841), +(37847), +(37850), +(37851), +(37856), +(37862), +(37865), +(37867), +(37871), +(37892), +(37894), +(37906), +(37908), +(37910), +(37921), +(37922), +(37930), +(37933), +(37937), +(37940), +(37945), +(37946), +(37950), +(37956), +(37958), +(37962), +(37965), +(37967), +(37968), +(37972), +(37973), +(37974), +(37975), +(37978), +(37979), +(37986), +(37988), +(37992), +(37998), +(38002), +(38007), +(38009), +(38010), +(38023), +(38024), +(38025), +(38027), +(38029), +(38030), +(38032), +(38034), +(38035), +(38047), +(38048), +(38051), +(38052), +(38053), +(38056), +(38058), +(38059), +(38063), +(38065), +(38066), +(38067), +(38074), +(38075), +(38076), +(38078), +(38083), +(38084), +(38085), +(38093), +(38094), +(38095), +(38107), +(38109), +(38113), +(38120), +(38122), +(38125), +(38127), +(38129), +(38133), +(38134), +(38135), +(38136), +(38145), +(38146), +(38147), +(38148), +(38149), +(38153), +(38154), +(38155), +(38167), +(38177), +(38178), +(38182), +(38183), +(38187), +(38193), +(38203), +(38204), +(38205), +(38208), +(38209), +(38210), +(38213), +(38223), +(38226), +(38233), +(38234), +(38238), +(38239), +(38240), +(38243), +(38245), +(38246), +(38252), +(38253), +(38254), +(38259), +(38260), +(38262), +(38263), +(38264), +(38265), +(38267), +(38274), +(38275), +(38276), +(38277), +(38279), +(38280), +(38285), +(38295), +(38310), +(38313), +(38324), +(38328), +(38329), +(38330), +(38333), +(38338), +(38340), +(38342), +(38344), +(38363), +(38366), +(38370), +(38372), +(38374), +(38377), +(38378), +(38383), +(38386), +(38387), +(38391), +(38400), +(38401), +(38441), +(38446), +(38461), +(38465), +(38470), +(38474), +(38495), +(38496), +(38505), +(38509), +(38510), +(38520), +(38523), +(38526), +(38534), +(38535), +(38538), +(38543), +(38554), +(38556), +(38557), +(38558), +(38559), +(38560), +(38561), +(38562), +(38563), +(38564), +(38565), +(38566), +(38567), +(38568), +(38569), +(38570), +(38572), +(38580), +(38582), +(38584), +(38585), +(38586), +(38588), +(38591), +(38595), +(38598), +(38606), +(38616), +(38617), +(38621), +(38625), +(38626), +(38628), +(38630), +(38631), +(38634), +(38636), +(38641), +(38643), +(38645), +(38657), +(38658), +(38661), +(38663), +(38669), +(38692), +(38697), +(38699), +(38704), +(38708), +(38721), +(38723), +(38731), +(38739), +(38742), +(38753), +(38760), +(38762), +(38764), +(38765), +(38767), +(38768), +(38770), +(38772), +(38775), +(38777), +(38791), +(38797), +(38798), +(38801), +(38804), +(38806), +(38807), +(38808), +(38815), +(38816), +(38817), +(38821), +(38822), +(38823), +(38824), +(38825), +(38826), +(38827), +(38846), +(38848), +(38849), +(38851), +(38852), +(38858), +(38859), +(38861), +(38863), +(38864), +(38875), +(38879), +(38880), +(38881), +(38882), +(38883), +(38884), +(38887), +(38894), +(38895), +(38896), +(38897), +(38899), +(38904), +(38907), +(38909), +(38913), +(38914), +(38915), +(38918), +(38919), +(38921), +(38923), +(38926), +(38930), +(38935), +(38940), +(38941), +(38942), +(38943), +(38945), +(38946), +(38950), +(38952), +(38959), +(38967), +(38971), +(38985), +(38986), +(38987), +(38988), +(38989), +(38990), +(38992), +(38995), +(39000), +(39002), +(39006), +(39009), +(39015), +(39016), +(39017), +(39019), +(39020), +(39021), +(39022), +(39023), +(39025), +(39026), +(39029), +(39032), +(39039), +(39044), +(39046), +(39047), +(39053), +(39054), +(39058), +(39060), +(39061), +(39062), +(39064), +(39065), +(39066), +(39068), +(39069), +(39070), +(39076), +(39077), +(39078), +(39079), +(39083), +(39087), +(39097), +(39098), +(39099), +(39101), +(39116), +(39119), +(39120), +(39121), +(39122), +(39123), +(39125), +(39129), +(39135), +(39136), +(39145), +(39153), +(39157), +(39159), +(39160), +(39164), +(39165), +(39171), +(39172), +(39174), +(39176), +(39182), +(39192), +(39196), +(39197), +(39198), +(39202), +(39204), +(39207), +(39210), +(39212), +(39214), +(39215), +(39226), +(39229), +(39230), +(39252), +(39258), +(39262), +(39267), +(39268), +(39270), +(39271), +(39285), +(39293), +(39297), +(39299), +(39309), +(39322), +(39328), +(39329), +(39332), +(39337), +(39339), +(39349), +(39367), +(39371), +(39378), +(39386), +(39396), +(39412), +(39413), +(39415), +(39419), +(39435), +(39436), +(39445), +(39449), +(39456), +(39457), +(39460), +(39474), +(39475), +(39476), +(39477), +(39512), +(39513), +(39528), +(39529), +(39544), +(39560), +(39566), +(39574), +(39582), +(39587), +(39590), +(39592), +(39595), +(39600), +(39609), +(39621), +(39622), +(39661), +(39665), +(39668), +(39669), +(39670), +(39674), +(39675), +(39676), +(39697), +(39703), +(39794), +(39796), +(39810), +(39812), +(39826), +(39830), +(39835), +(39837), +(39838), +(39857), +(39865), +(39883), +(39886), +(39901), +(39904), +(39908), +(39920), +(39928), +(39945), +(39948), +(39955), +(39956), +(39967), +(39972), +(39979), +(39980), +(39995), +(39996), +(40011), +(40019), +(40032), +(40041), +(40055), +(40057), +(40063), +(40066), +(40071), +(40074), +(40081), +(40084), +(40086), +(40097), +(40099), +(40102), +(40109), +(40119), +(40123), +(40124), +(40146), +(40157), +(40165), +(40166), +(40167), +(40173), +(40185), +(40191), +(40193), +(40197), +(40198), +(40199), +(40220), +(40225), +(40227), +(40228), +(40239), +(40248), +(40251), +(40254), +(40259), +(40279), +(40290), +(40293), +(40303), +(40310), +(40311), +(40312), +(40313), +(40317), +(40321), +(40322), +(40325), +(40327), +(40334), +(40337), +(40339), +(40344), +(40346), +(40347), +(40348), +(40351), +(40356), +(40357), +(40358), +(40363), +(40366), +(40367), +(40368), +(40384), +(40385), +(40392), +(40400), +(40406), +(40411), +(40412), +(40413), +(40414), +(40415), +(40416), +(40420), +(40423), +(40427), +(40429), +(40430), +(40431), +(40434), +(40449), +(40450), +(40471), +(40472), +(40481), +(40486), +(40489), +(40491), +(40493), +(40497), +(40504), +(40505), +(40507), +(40508), +(40509), +(40525), +(40536), +(40542), +(40554), +(40560), +(40563), +(40564), +(40565), +(40569), +(40571), +(40581), +(40585), +(40595), +(40597), +(40602), +(40604), +(40605), +(40608), +(40616), +(40620), +(40633), +(40635), +(40639), +(40641), +(40643), +(40645), +(40646), +(40651), +(40652), +(40671), +(40672), +(40685), +(40726), +(40728), +(40736), +(40739), +(40740), +(40742), +(40751), +(40758), +(40770), +(40772), +(40777), +(40778), +(40787), +(40796), +(40801), +(40810), +(40814), +(40822), +(40827), +(40835), +(40837), +(40838), +(40842), +(40843), +(40844), +(40846), +(40856), +(40859), +(40860), +(40861), +(40864), +(40872), +(40873), +(40876), +(40877), +(40881), +(40886), +(40888), +(40890), +(40892), +(40893), +(40894), +(40895), +(40901), +(40903), +(40906), +(40909), +(40917), +(40926), +(40928), +(40930), +(40935), +(40945), +(40951), +(40954), +(40958), +(40964), +(40965), +(40968), +(40969), +(40970), +(40972), +(40976), +(40991), +(41001), +(41003), +(41028), +(41029), +(41032), +(41035), +(41044), +(41047), +(41050), +(41052), +(41054), +(41055), +(41060), +(41063), +(41065), +(41069), +(41070), +(41072), +(41075), +(41080), +(41082), +(41083), +(41084), +(41092), +(41093), +(41103), +(41109), +(41115), +(41116), +(41121), +(41137), +(41139), +(41152), +(41169), +(41170), +(41171), +(41177), +(41178), +(41179), +(41180), +(41182), +(41183), +(41184), +(41186), +(41187), +(41188), +(41189), +(41190), +(41192), +(41197), +(41198), +(41213), +(41214), +(41225), +(41226), +(41227), +(41228), +(41229), +(41230), +(41231), +(41238), +(41241), +(41247), +(41250), +(41255), +(41256), +(41259), +(41264), +(41265), +(41270), +(41272), +(41278), +(41279), +(41280), +(41281), +(41283), +(41291), +(41299), +(41302), +(41332), +(41334), +(41335), +(41336), +(41338), +(41345), +(41346), +(41351), +(41352), +(41353), +(41355), +(41360), +(41363), +(41368), +(41370), +(41372), +(41373), +(41374), +(41375), +(41377), +(41378), +(41383), +(41384), +(41388), +(41389), +(41390), +(41392), +(41394), +(41395), +(41396), +(41407), +(41410), +(41411), +(41419), +(41421), +(41426), +(41439), +(41440), +(41442), +(41448), +(41450), +(41451), +(41456), +(41461), +(41467), +(41468), +(41470), +(41471), +(41472), +(41473), +(41483), +(41484), +(41485), +(41486), +(41487), +(41489), +(41490), +(41491), +(41492), +(41519), +(41526), +(41528), +(41533), +(41540), +(41543), +(41544), +(41546), +(41547), +(41548), +(41549), +(41558), +(41559), +(41563), +(41564), +(41565), +(41567), +(41568), +(41571), +(41578), +(41579), +(41580), +(41581), +(41586), +(41588), +(41592), +(41596), +(41597), +(41598), +(41601), +(41621), +(41622), +(41625), +(41626), +(41633), +(41637), +(41911), +(41914), +(41916), +(41917), +(41926), +(41931), +(41932), +(41933), +(41936), +(41937), +(41939), +(41940), +(41957), +(41958), +(41959), +(41960), +(41961), +(41964), +(41965), +(41978), +(41980), +(41984), +(41985), +(41990), +(42002), +(42003), +(42013), +(42018), +(42020), +(42021), +(42024), +(42025), +(42053), +(42058), +(42129), +(42131), +(42132), +(42133), +(42139), +(42142), +(42144), +(42149), +(42150), +(42152), +(42161), +(42165), +(42169), +(42185), +(42203), +(42246), +(42299), +(42313), +(42315), +(42319), +(42320), +(42322), +(42324), +(42325), +(42326), +(42328), +(42329), +(42330), +(42331), +(42332), +(42333), +(42337), +(42349), +(42360), +(42363), +(42368), +(42369), +(42370), +(42371), +(42372), +(42380), +(42382), +(42383), +(42384), +(42385), +(42389), +(42395), +(42396), +(42397), +(42399), +(42400), +(42401), +(42402), +(42411), +(42414), +(42426), +(42434), +(42435), +(42441), +(42443), +(42447), +(42455), +(42463), +(42476), +(42483), +(42485), +(42486), +(42488), +(42489), +(42502), +(42512), +(42514), +(42516), +(42518), +(42535), +(42537), +(42540), +(42560), +(42561), +(42574), +(42579), +(42580), +(42583), +(42587), +(42611), +(42628), +(42632), +(42633), +(42634), +(42635), +(42653), +(42658), +(42670), +(42671), +(42672), +(42696), +(42702), +(42710), +(42711), +(42717), +(42719), +(42721), +(42724), +(42725), +(42730), +(42733), +(42739), +(42740), +(42741), +(42746), +(42747), +(42756), +(42762), +(42767), +(42772), +(42780), +(42781), +(42782), +(42783), +(42785), +(42789), +(42790), +(42791), +(42793), +(42799), +(42802), +(42803), +(42804), +(42811), +(42826), +(42832), +(42833), +(42834), +(42841), +(42842), +(42843), +(42846), +(42853), +(42858), +(42859), +(42867), +(42869), +(42870), +(42872), +(42873), +(42878), +(42879), +(42880), +(42889), +(42890), +(42891), +(42894), +(42895), +(42896), +(42897), +(42902), +(42903), +(42904), +(42907), +(42908), +(42913), +(42914), +(42953), +(42964), +(42972), +(42978), +(42995), +(42999), +(43003), +(43004), +(43006), +(43036), +(43037), +(43043), +(43044), +(43058), +(43061), +(43063), +(43064), +(43065), +(43067), +(43075), +(43077), +(43083), +(43084), +(43086), +(43087), +(43090), +(43093), +(43094), +(43097), +(43100), +(43103), +(43104), +(43107), +(43108), +(43122), +(43123), +(43125), +(43128), +(43130), +(43131), +(43132), +(43133), +(43137), +(43138), +(43140), +(43150), +(43151), +(43153), +(43156), +(43157), +(43159), +(43178), +(43187), +(43191), +(43192), +(43193), +(43194), +(43195), +(43196), +(43197), +(43198), +(43199), +(43202), +(43205), +(43206), +(43225), +(43228), +(43235), +(43243), +(43245), +(43246), +(43256), +(43259), +(43260), +(43261), +(43262), +(43267), +(43268), +(43270), +(43273), +(43286), +(43287), +(43288), +(43292), +(43297), +(43298), +(43299), +(43300), +(43301), +(43303), +(43305), +(43309), +(43315), +(43325), +(43330), +(43334), +(43337), +(43340), +(43341), +(43345), +(43346), +(43347), +(43348), +(43352), +(43353), +(43354), +(43356), +(43357), +(43358), +(43359), +(43361), +(43362), +(43364), +(43365), +(43368), +(43370), +(43379), +(43380), +(43381), +(43384), +(43393), +(43398), +(43399), +(43409), +(43410), +(43411), +(43413), +(43415), +(43416), +(43417), +(43419), +(43427), +(43428), +(43433), +(43435), +(43439), +(43441), +(43445), +(43451), +(43456), +(43461), +(43469), +(43470), +(43471), +(43472), +(43473), +(43474), +(43475), +(43477), +(43483), +(43484), +(43488), +(43489), +(43492), +(43495), +(43496), +(43497), +(43501), +(43505), +(43507), +(43511), +(43512), +(43515), +(43516), +(43517), +(43518), +(43519), +(43520), +(43522), +(43523), +(43524), +(43525), +(43526), +(43528), +(43529), +(43532), +(43535), +(43543), +(43545), +(43553), +(43556), +(43560), +(43564), +(43565), +(43567), +(43569), +(43571), +(43572), +(43574), +(43575), +(43577), +(43578), +(43579), +(43581), +(43584), +(43585), +(43586), +(43591), +(43592), +(43593), +(43612), +(43613), +(43619), +(43621), +(43622), +(43644), +(43646), +(43648), +(43649), +(43650), +(43651), +(43660), +(43661), +(43663), +(43665), +(43666), +(43667), +(43671), +(43673), +(43680), +(43682), +(43683), +(43684), +(43690), +(43693), +(43695), +(43701), +(43709), +(43714), +(43715), +(43720), +(43726), +(43727), +(43728), +(43729), +(43732), +(43746), +(43767), +(43769), +(43785), +(43786), +(43789), +(43794), +(43795), +(43799), +(43804), +(43807), +(43809), +(43821), +(43834), +(43869), +(43895), +(43903), +(43906), +(43923), +(43928), +(43931), +(43932), +(43933), +(43937), +(43941), +(43948), +(43951), +(43952), +(43969), +(43971), +(43974), +(43976), +(43984), +(43988), +(43993), +(43996), +(43997), +(44000), +(44005), +(44008), +(44015), +(44016), +(44030), +(44031), +(44038), +(44053), +(44078), +(44079), +(44081), +(44082), +(44089), +(44093), +(44095), +(44120), +(44121), +(44126), +(44127), +(44137), +(44138), +(44139), +(44141), +(44142), +(44144), +(44148), +(44149), +(44152), +(44156), +(44159), +(44164), +(44165), +(44168), +(44169), +(44170), +(44171), +(44173), +(44174), +(44176), +(44181), +(44185), +(44188), +(44189), +(44202), +(44211), +(44212), +(44216), +(44219), +(44220), +(44221), +(44222), +(44223), +(44237), +(44241), +(44242), +(44247), +(44248), +(44256), +(44258), +(44262), +(44267), +(44268), +(44271), +(44274), +(44280), +(44285), +(44286), +(44289), +(44294), +(44304), +(44308), +(44310), +(44318), +(44319), +(44323), +(44325), +(44327), +(44328), +(44332), +(44339), +(44351), +(44357), +(44358), +(44361), +(44364), +(44368), +(44370), +(44382), +(44407), +(44408), +(44415), +(44424), +(44425), +(44429), +(44430), +(44454), +(44455), +(44457), +(44464), +(44473), +(44477), +(44478), +(44479), +(44481), +(44482), +(44503), +(44504), +(44512), +(44518), +(44519), +(44525), +(44530), +(44532), +(44533), +(44534), +(44536), +(44541), +(44542), +(44547), +(44553), +(44563), +(44564), +(44572), +(44577), +(44583), +(44586), +(44600), +(44602), +(44606), +(44614), +(44617), +(44618), +(44619), +(44620), +(44622), +(44639), +(44640), +(44641), +(44642), +(44654), +(44657), +(44658), +(44685), +(44732), +(44753), +(44755), +(44765), +(44780), +(44781), +(44787), +(44788), +(44789), +(44790), +(44791), +(44796), +(44808), +(44811), +(44812), +(44813), +(44817), +(44818), +(44823), +(44843), +(44848), +(44868), +(44871), +(44872), +(44876), +(44881), +(44934), +(44937), +(44945), +(44956), +(44957), +(44961), +(44966), +(44985), +(44997), +(45012), +(45017), +(45023), +(45026), +(45029), +(45031), +(45036), +(45055), +(45064), +(45071), +(45075), +(45088), +(45089), +(45090), +(45096), +(45101), +(45102), +(45105), +(45108), +(45110), +(45113), +(45123), +(45124), +(45129), +(45130), +(45133), +(45134), +(45141), +(45145), +(45185), +(45189), +(45192), +(45195), +(45197), +(45199), +(45200), +(45204), +(45205), +(45206), +(45209), +(45214), +(45215), +(45221), +(45228), +(45235), +(45251), +(45256), +(45269), +(45271), +(45274), +(45276), +(45280), +(45284), +(45286), +(45287), +(45288), +(45289), +(45290), +(45291), +(45292), +(45293), +(45294), +(45295), +(45296), +(45297), +(45298), +(45299), +(45300), +(45301), +(45302), +(45314), +(45321), +(45324), +(45327), +(45328), +(45334), +(45337), +(45344), +(45350), +(45352), +(45353), +(45356), +(45362), +(45409), +(45417), +(45419), +(45420), +(45421), +(45425), +(45428), +(45429), +(45430), +(45442), +(45444), +(45447), +(45456), +(45458), +(45462), +(45463), +(45468), +(45469), +(45472), +(45476), +(45477), +(45485), +(45487), +(45491), +(45493), +(45497), +(45504), +(45505), +(45507), +(45509), +(45511), +(45516), +(45524), +(45534), +(45537), +(45543), +(45544), +(45573), +(45576), +(45577), +(45578), +(45580), +(45587), +(45588), +(45589), +(45590), +(45600), +(45603), +(45604), +(45611), +(45625), +(45627), +(45628), +(45629), +(45632), +(45639), +(45645), +(45646), +(45647), +(45648), +(45649), +(45650), +(45659), +(45660), +(45661), +(45664), +(45693), +(45696), +(45716), +(45717), +(45719), +(45724), +(45725), +(45730), +(45739), +(45742), +(45744), +(45748), +(45773), +(45777), +(45778), +(45798), +(45799), +(45800), +(45803), +(45804), +(45815), +(45820), +(45833), +(45837), +(45854), +(45866), +(45873), +(45874), +(45875), +(45889), +(45897), +(45898), +(45899), +(45900), +(45902), +(45906), +(45913), +(45919), +(45924), +(45926), +(45931), +(45940), +(45943), +(45946), +(45947), +(45964), +(45967), +(45975), +(45980), +(45981), +(45983), +(45989), +(45992), +(46010), +(46012), +(46014), +(46015), +(46016), +(46023), +(46027), +(46028), +(46029), +(46031), +(46032), +(46033), +(46035), +(46042), +(46043), +(46044), +(46045), +(46047), +(46049), +(46057), +(46062), +(46065), +(46067), +(46070), +(46074), +(46080), +(46081), +(46083), +(46084), +(46092), +(46093), +(46098), +(46099), +(46101), +(46104), +(46119), +(46145), +(46152), +(46153), +(46155), +(46161), +(46164), +(46166), +(46167), +(46180), +(46181), +(46182), +(46183), +(46187), +(46188), +(46189), +(46190), +(46191), +(46192), +(46194), +(46198), +(46200), +(46202), +(46206), +(46221), +(46231), +(46232), +(46239), +(46260), +(46266), +(46276), +(46279), +(46280), +(46283), +(46285), +(46288), +(46291), +(46292), +(46305), +(46315), +(46323), +(46331), +(46333), +(46341), +(46357), +(46361), +(46362), +(46364), +(46365), +(46366), +(46368), +(46380), +(46381), +(46394), +(46406), +(46411), +(46420), +(46421), +(46422), +(46429), +(46430), +(46432), +(46433), +(46434), +(46440), +(46443), +(46444), +(46447), +(46448), +(46449), +(46459), +(46460), +(46466), +(46468), +(46469), +(46479), +(46480), +(46481), +(46483), +(46485), +(46486), +(46487), +(46543), +(46550), +(46556), +(46557), +(46558), +(46559), +(46560), +(46561), +(46562), +(46563), +(46566), +(46567), +(46568), +(46572), +(46579), +(46580), +(46582), +(46587), +(46590), +(46591), +(46595), +(46598), +(46602), +(46607), +(46611), +(46612), +(46613), +(46614), +(46615), +(46616), +(46617), +(46618), +(46620), +(46621), +(46624), +(46629), +(46630), +(46641), +(46642), +(46651), +(46654), +(46661), +(46664), +(46665), +(46667), +(46671), +(46672), +(46673), +(46674), +(46677), +(46681), +(46686), +(46691), +(46693), +(46696), +(46702), +(46704), +(46709), +(46711), +(46716), +(46717), +(46718), +(46719), +(46720), +(46721), +(46722), +(46723), +(46724), +(46725), +(46726), +(46727), +(46728), +(46729), +(46730), +(46731), +(46734), +(46745), +(46762), +(46764), +(46770), +(46772), +(46773), +(46787), +(46791), +(46801), +(46813), +(46816), +(46824), +(46825), +(46826), +(46841), +(46845), +(46846), +(46856), +(46857), +(46877), +(46879), +(46880), +(46887), +(46906), +(46956), +(46960), +(46962), +(46978), +(46982), +(46983), +(46987), +(46988), +(46990), +(47001), +(47003), +(47009), +(47011), +(47012), +(47014), +(47020), +(47021), +(47028), +(47029), +(47033), +(47034), +(47042), +(47043), +(47057), +(47059), +(47062), +(47063), +(47064), +(47066), +(47068), +(47069), +(47070), +(47071), +(47072), +(47074), +(47076), +(47077), +(47079), +(47081), +(47084), +(47093), +(47096), +(47098), +(47107), +(47117), +(47122), +(47139), +(47143), +(47144), +(47145), +(47146), +(47148), +(47149), +(47151), +(47152), +(47153), +(47155), +(47156), +(47157), +(47158), +(47160), +(47161), +(47162), +(47163), +(47164), +(47165), +(47166), +(47168), +(47171), +(47173), +(47176), +(47206), +(47208), +(47219), +(47244), +(47248), +(47249), +(47257), +(47272), +(47277), +(47282), +(47293), +(47299), +(47305), +(47307), +(47308), +(47316), +(47321), +(47322), +(47323), +(47326), +(47333), +(47334), +(47337), +(47338), +(47339), +(47340), +(47345), +(47380), +(47382), +(47390), +(47392), +(47394), +(47403), +(47405), +(47410), +(47413), +(47414), +(47422), +(47424), +(47431), +(47432), +(47442), +(47447), +(47449), +(47450), +(47451), +(47453), +(47465), +(47467), +(47468), +(47470), +(47471), +(47472), +(47474), +(47475), +(47476), +(47480), +(47481), +(47482), +(47485), +(47486), +(47487), +(47488), +(47489), +(47497), +(47498), +(47504), +(47516), +(47517), +(47519), +(47520), +(47528), +(47530), +(47534), +(47540), +(47541), +(47550), +(47575), +(47601), +(47604), +(47610), +(47611), +(47614), +(47629), +(47632), +(47633), +(47635), +(47637), +(47664), +(47665), +(47673), +(47674), +(47676), +(47679), +(47689), +(47695), +(47697), +(47698), +(47700), +(47702), +(47703), +(47718), +(47721), +(47722), +(47723), +(47724), +(47729), +(47739), +(47740), +(47741), +(47744), +(47749), +(47751), +(47753), +(47757), +(47758), +(47761), +(47767), +(47768), +(47777), +(47778), +(47780), +(47781), +(47782), +(47783), +(47785), +(47788), +(47808), +(47809), +(47810), +(47811), +(47812), +(47813), +(47814), +(47815), +(47824), +(47825), +(47826), +(47827), +(47835), +(47836), +(47837), +(47838), +(47841), +(47843), +(47848), +(47850), +(47851), +(47852), +(47853), +(47855), +(47857), +(47859), +(47860), +(47863), +(47864), +(47865), +(47867), +(47902), +(47914), +(47917), +(47920), +(47926), +(47928), +(47930), +(47938), +(47948), +(47960), +(47961), +(47962), +(47964), +(47968), +(47976), +(47984), +(47991), +(47992), +(47993), +(47994), +(47995), +(47996), +(48011), +(48013), +(48039), +(48045), +(48046), +(48047), +(48048), +(48053), +(48060), +(48062), +(48063), +(48065), +(48066), +(48067), +(48068), +(48070), +(48071), +(48072), +(48073), +(48084), +(48085), +(48098), +(48099), +(48100), +(48101), +(48102), +(48103), +(48104), +(48105), +(48119), +(48120), +(48122), +(48123), +(48124), +(48125), +(48126), +(48127), +(48130), +(48132), +(48133), +(48134), +(48135), +(48137), +(48140), +(48147), +(48155), +(48156), +(48157), +(48158), +(48159), +(48160), +(48161), +(48163), +(48164), +(48165), +(48169), +(48181), +(48184), +(48187), +(48192), +(48208), +(48210), +(48232), +(48245), +(48249), +(48250), +(48261), +(48262), +(48264), +(48267), +(48268), +(48282), +(48283), +(48285), +(48286), +(48287), +(48288), +(48290), +(48291), +(48292), +(48296), +(48298), +(48299), +(48300), +(48301), +(48307), +(48309), +(48310), +(48316), +(48330), +(48334), +(48360), +(48365), +(48374), +(48376), +(48377), +(48378), +(48400), +(48417), +(48423), +(48424), +(48440), +(48441), +(48442), +(48443), +(48450), +(48451), +(48459), +(48461), +(48462), +(48463), +(48464), +(48465), +(48468), +(48469), +(48479), +(48480), +(48489), +(48490), +(48491), +(48504), +(48532), +(48533), +(48540), +(48541), +(48542), +(48543), +(48548), +(48549), +(48563), +(48564), +(48565), +(48566), +(48567), +(48568), +(48569), +(48570), +(48571), +(48572), +(48573), +(48574), +(48575), +(48576), +(48577), +(48578), +(48579), +(48583), +(48585), +(48598), +(48599), +(48601), +(48603), +(48606), +(48617), +(48622), +(48628), +(48637), +(48638), +(48639), +(48640), +(48648), +(48652), +(48656), +(48657), +(48658), +(48659), +(48660), +(48661), +(48662), +(48663), +(48664), +(48665), +(48666), +(48667), +(48668), +(48669), +(48671), +(48672), +(48673), +(48674), +(48675), +(48676), +(48678), +(48679), +(48680), +(48689), +(48690), +(48691), +(48693), +(48696), +(48697), +(48698), +(48699), +(48700), +(48712), +(48714), +(48737), +(48738), +(48746), +(48747), +(48749), +(48750), +(48752), +(48753), +(48754), +(48755), +(48756), +(48759), +(48760), +(48765), +(48770), +(48772), +(48774), +(48775), +(48781), +(48782), +(48784), +(48785), +(48788), +(48800), +(48801), +(48802), +(48805), +(48806), +(48812), +(48813), +(48815), +(48820), +(48821), +(48822), +(48823), +(48824), +(48825), +(48826), +(48827), +(48828), +(48829), +(48830), +(48831), +(48832), +(48845), +(48850), +(48851), +(48852), +(48854), +(48862), +(48871), +(48872), +(48873), +(48876), +(48877), +(48878), +(48880), +(48881), +(48883), +(48895), +(48917), +(48920), +(48931), +(48932), +(48935), +(48936), +(48953), +(48960), +(48974), +(48981), +(48984), +(48995), +(48996), +(48998), +(48999), +(49000), +(49001), +(49005), +(49009), +(49010), +(49011), +(49012), +(49020), +(49021), +(49026), +(49028), +(49029), +(49037), +(49044), +(49045), +(49047), +(49048), +(49049), +(49050), +(49051), +(49052), +(49053), +(49054), +(49078), +(49084), +(49089), +(49090), +(49091), +(49092), +(49093), +(49099), +(49106), +(49110), +(49111), +(49113), +(49119), +(49124), +(49125), +(49127), +(49138), +(49143), +(49158), +(49161), +(49165), +(49177), +(49184), +(49204), +(49206), +(49213), +(49215), +(49230), +(49231), +(49232), +(49233), +(49235), +(49236), +(49237), +(49238), +(49239), +(49240), +(49242), +(49243), +(49256), +(49257), +(49266), +(49267), +(49268), +(49269), +(49270), +(49271), +(49272), +(49273), +(49275), +(49276), +(49278), +(49279), +(49282), +(49283), +(49284), +(49288), +(49294), +(49296), +(49298), +(49305), +(49309), +(49312), +(49317), +(49323), +(49324), +(49348), +(49349), +(49353), +(49354), +(49362), +(49363), +(49364), +(49372), +(49376), +(49381), +(49383), +(49387), +(49404), +(49406), +(49418), +(49427), +(49429), +(49433), +(49439), +(49446), +(49453), +(49454), +(49459), +(49463), +(49466), +(49481), +(49482), +(49485), +(49500), +(49501), +(49511), +(49512), +(49527), +(49537), +(49544), +(49546), +(49547), +(49549), +(49560), +(49576), +(49584), +(49587), +(49592), +(49613), +(49616), +(49617), +(49624), +(49637), +(49639), +(49641), +(49644), +(49675), +(49678), +(49680), +(49681), +(49686), +(49690), +(49696), +(49704), +(49705), +(49706), +(49708), +(49710), +(49711), +(49712), +(49715), +(49718), +(49719), +(49720), +(49723), +(49729), +(49734), +(49742), +(49747), +(49749), +(49753), +(49755), +(49758), +(49759), +(49771), +(49776), +(49797), +(49799), +(49800), +(49802), +(49803), +(49804), +(49805), +(49806), +(49830), +(49836), +(49840), +(49841), +(49843), +(49846), +(49848), +(49859), +(49861), +(49863), +(49865), +(49891), +(49892), +(49893), +(49894), +(49895), +(49896), +(49897), +(49903), +(49904), +(49906), +(49909), +(49913), +(49914), +(49915), +(49916), +(49917), +(49918), +(49919), +(49920), +(49921), +(49922), +(49923), +(49924), +(49926), +(49927), +(49928), +(49929), +(49930), +(49935), +(49942), +(49945), +(49956), +(49961), +(49965), +(49966), +(49967), +(49968), +(49969), +(49970), +(49971), +(49972), +(49973), +(49974), +(49975), +(49978), +(49980), +(49981), +(49985), +(49986), +(49987), +(49989), +(49991), +(49993), +(49994), +(49995), +(49996), +(49997), +(49998), +(49999), +(50004), +(50006), +(50015), +(50021), +(50027), +(50028), +(50035), +(50038), +(50046), +(50047), +(50050), +(50052), +(50064), +(50066), +(50073), +(50075), +(50084), +(50086), +(50089), +(50090), +(50091), +(50092), +(50094), +(50100), +(50101), +(50102), +(50104), +(50135), +(50144), +(50145), +(50146), +(50156), +(50165), +(50169), +(50183), +(50184), +(50185), +(50188), +(50196), +(50198), +(50205), +(50206), +(50207), +(50217), +(50231), +(50232), +(50234), +(50245), +(50251), +(50252), +(50255), +(50256), +(50257), +(50259), +(50265), +(50271), +(50273), +(50276), +(50282), +(50287), +(50288), +(50289), +(50290), +(50291), +(50293), +(50295), +(50299), +(50301), +(50303), +(50305), +(50306), +(50307), +(50319), +(50323), +(50328), +(50335), +(50341), +(50343), +(50344), +(50347), +(50349), +(50356), +(50361), +(50370), +(50375), +(50377), +(50378), +(50379), +(50380), +(50400), +(50401), +(50402), +(50403), +(50405), +(50406), +(50410), +(50411), +(50412), +(50424), +(50431), +(50432), +(50434), +(50435), +(50436), +(50437), +(50439), +(50445), +(50454), +(50455), +(50456), +(50459), +(50462), +(50463), +(50464), +(50477), +(50478), +(50479), +(50484), +(50498), +(50499), +(50500), +(50504), +(50508), +(50509), +(50510), +(50511), +(50512), +(50517), +(50518), +(50519), +(50521), +(50523), +(50533), +(50534), +(50536), +(50537), +(50538), +(50541), +(50545), +(50550), +(50559), +(50566), +(50572), +(50573), +(50578), +(50581), +(50582), +(50588), +(50597), +(50629), +(50631), +(50633), +(50634), +(50635), +(50638), +(50655), +(50658), +(50659), +(50660), +(50661), +(50662), +(50663), +(50666), +(50668), +(50673), +(50675), +(50679), +(50688), +(50691), +(50693), +(50701), +(50704), +(50705), +(50706), +(50721), +(50725), +(50729), +(50731), +(50732), +(50733), +(50737), +(50739), +(50740), +(50744), +(50761), +(50770), +(50773), +(50782), +(50783), +(50796), +(50797), +(50799), +(50804), +(50818), +(50820), +(50821), +(50830), +(50832), +(50834), +(50842), +(50843), +(50844), +(50845), +(50846), +(50853), +(50854), +(50859), +(50861), +(50874), +(50876), +(50894), +(50895), +(50900), +(50905), +(50907), +(50914), +(50918), +(50919), +(50923), +(50924), +(50926), +(50927), +(50978), +(50979), +(50992), +(50997), +(51011), +(51015), +(51016), +(51018), +(51020), +(51026), +(51035), +(51037), +(51046), +(51054), +(51055), +(51057), +(51059), +(51062), +(51064), +(51067), +(51069), +(51072), +(51077), +(51079), +(51081), +(51083), +(51085), +(51087), +(51089), +(51091), +(51093), +(51095), +(51097), +(51100), +(51102), +(51105), +(51107), +(51111), +(51120), +(51121), +(51131), +(51134), +(51135), +(51137), +(51154), +(51156), +(51157), +(51165), +(51187), +(51196), +(51197), +(51198), +(51199), +(51200), +(51203), +(51216), +(51220), +(51221), +(51226), +(51227), +(51228), +(51229), +(51232), +(51233), +(51235), +(51236), +(51240), +(51243), +(51258), +(51259), +(51270), +(51272), +(51275), +(51279), +(51285), +(51287), +(51290), +(51292), +(51298), +(51305), +(51308), +(51310), +(51315), +(51316), +(51325), +(51326), +(51327), +(51328), +(51330), +(51334), +(51339), +(51340), +(51354), +(51356), +(51363), +(51365), +(51372), +(51382), +(51399), +(51409), +(51410), +(51411), +(51413), +(51416), +(51417), +(51418), +(51419), +(51423), +(51424), +(51425), +(51426), +(51427), +(51428), +(51429), +(51430), +(51431), +(51432), +(51440), +(51442), +(51446), +(51447), +(51454), +(51460), +(51467), +(51484), +(51489), +(51491), +(51492), +(51495), +(51496), +(51500), +(51502), +(51503), +(51504), +(51505), +(51506), +(51509), +(51514), +(51515), +(51573), +(51580), +(51584), +(51585), +(51586), +(51587), +(51588), +(51591), +(51592), +(51593), +(51596), +(51598), +(51601), +(51608), +(51609), +(51610), +(51613), +(51614), +(51618), +(51656), +(51657), +(51658), +(51659), +(51662), +(51675), +(51676), +(51677), +(51680), +(51693), +(51695), +(51699), +(51714), +(51718), +(51722), +(51724), +(51726), +(51728), +(51732), +(51734), +(51735), +(51736), +(51740), +(51751), +(51756), +(51757), +(51772), +(51775), +(51776), +(51778), +(51779), +(51786), +(51787), +(51797), +(51798), +(51799), +(51803), +(51804), +(51808), +(51809), +(51811), +(51818), +(51827), +(51830), +(51842), +(51844), +(51853), +(51854), +(51855), +(51856), +(51857), +(51863), +(51864), +(51872), +(51875), +(51876), +(51877), +(51878), +(51879), +(51886), +(51888), +(51889), +(51893), +(51894), +(51895), +(51897), +(51898), +(51899), +(51901), +(51909), +(51912), +(51917), +(51918), +(51919), +(51920), +(51926), +(51934), +(51935), +(51936), +(51937), +(51940), +(51945), +(51949), +(51951), +(51961), +(51962), +(51963), +(51968), +(51973), +(51976), +(51979), +(51981), +(51989), +(51990), +(51997), +(51998), +(51999), +(52000), +(52004), +(52005), +(52007), +(52008), +(52014), +(52025), +(52026), +(52030), +(52032), +(52042), +(52043), +(52045), +(52053), +(52069), +(52078), +(52082), +(52083), +(52086), +(52088), +(52090), +(52108), +(52125), +(52139), +(52149), +(52157), +(52160), +(52163), +(52167), +(52169), +(52171), +(52187), +(52194), +(52196), +(52198), +(52199), +(52206), +(52207), +(52209), +(52210), +(52212), +(52217), +(52219), +(52221), +(52223), +(52224), +(52228), +(52229), +(52230), +(52251), +(52252), +(52253), +(52256), +(52261), +(52263), +(52265), +(52267), +(52270), +(52280), +(52282), +(52292), +(52307), +(52312), +(52318), +(52327), +(52328), +(52334), +(52345), +(52346), +(52352), +(52353), +(52355), +(52356), +(52359), +(52360), +(52361), +(52364), +(52372), +(52373), +(52374), +(52375), +(52383), +(52389), +(52391), +(52401), +(52402), +(52415), +(52425), +(52428), +(52430), +(52431), +(52433), +(52444), +(52445), +(52447), +(52460), +(52463), +(52465), +(52466), +(52468), +(52469), +(52471), +(52472), +(52473), +(52474), +(52475), +(52476), +(52486), +(52487), +(52496), +(52498), +(52499), +(52501), +(52502), +(52504), +(52506), +(52511), +(52515), +(52519), +(52521), +(52522), +(52527), +(52532), +(52534), +(52536), +(52537), +(52538), +(52540), +(52542), +(52544), +(52545), +(52546), +(52547), +(52548), +(52549), +(52554), +(52566), +(52577), +(52581), +(52583), +(52586), +(52587), +(52591), +(52594), +(52595), +(52596), +(52600), +(52601), +(52604), +(52608), +(52609), +(52610), +(52613), +(52620), +(52631), +(52633), +(52643), +(52644), +(52655), +(52657), +(52658), +(52660), +(52672), +(52675), +(52680), +(52684), +(52695), +(52696), +(52699), +(52700), +(52702), +(52705), +(52708), +(52709), +(52711), +(52713), +(52715), +(52718), +(52719), +(52721), +(52722), +(52737), +(52740), +(52741), +(52743), +(52751), +(52752), +(52754), +(52755), +(52758), +(52761), +(52762), +(52764), +(52771), +(52772), +(52773), +(52778), +(52781), +(52782), +(52784), +(52789), +(52794), +(52806), +(52807), +(52813), +(52814), +(52818), +(52825), +(52835), +(52839), +(52851), +(52856), +(52859), +(52862), +(52863), +(52864), +(52871), +(52872), +(52873), +(52883), +(52885), +(52889), +(52890), +(52904), +(52905), +(52909), +(52921), +(52926), +(52931), +(52932), +(52939), +(52943), +(52986), +(52987), +(52988), +(52992), +(52994), +(52996), +(53001), +(53002), +(53003), +(53005), +(53006), +(53007), +(53019), +(53023), +(53027), +(53031), +(53033), +(53043), +(53044), +(53045), +(53051), +(53058), +(53059), +(53060), +(53062), +(53068), +(53069), +(53070), +(53072), +(53073), +(53085), +(53086), +(53087), +(53088), +(53089), +(53094), +(53098), +(53099), +(53100), +(53101), +(53102), +(53108), +(53109), +(53111), +(53116), +(53141), +(53145), +(53148), +(53150), +(53153), +(53158), +(53174), +(53191), +(53193), +(53194), +(53195), +(53208), +(53209), +(53214), +(53254), +(53271), +(53288), +(53289), +(53301), +(53307), +(53308), +(53310), +(53311), +(53313), +(53314), +(53317), +(53318), +(53322), +(53326), +(53327), +(53329), +(53330), +(53332), +(53333), +(53335), +(53338), +(53339), +(53340), +(53346), +(53351), +(53352), +(53353), +(53357), +(53359), +(53364), +(53366), +(53372), +(53388), +(53394), +(53395), +(53396), +(53402), +(53404), +(53407), +(53408), +(53418), +(53422), +(53424), +(53425), +(53431), +(53435), +(53437), +(53438), +(53442), +(53449), +(53460), +(53477), +(53480), +(53492), +(53493), +(53498), +(53499), +(53508), +(53509), +(53526), +(53528), +(53529), +(53532), +(53533), +(53534), +(53536), +(53537), +(53538), +(53540), +(53542), +(53543), +(53544), +(53545), +(53546), +(53547), +(53548), +(53549), +(53550), +(53558), +(53559), +(53560), +(53561), +(53562), +(53564), +(53565), +(53566), +(53567), +(53568), +(53571), +(53572), +(53573), +(53574), +(53575), +(53578), +(53579), +(53580), +(53581), +(53582), +(53584), +(53586), +(53587), +(53588), +(53589), +(53595), +(53600), +(53601), +(53617), +(53618), +(53625), +(53629), +(53631), +(53633), +(53638), +(53639), +(53652), +(53653), +(53654), +(53659), +(53669), +(53697), +(53704), +(53719), +(53726), +(53733), +(53739), +(53742), +(53769), +(53772), +(53786), +(53788), +(53799), +(53807), +(53809), +(53810), +(53815), +(53821), +(53824), +(54016), +(54028), +(54029), +(54035), +(54039), +(54042), +(54049), +(54050), +(54051), +(54052), +(54053), +(54060), +(54063), +(54068), +(54070), +(54071), +(54074), +(54075), +(54076), +(54077), +(54078), +(54079), +(54080), +(54092), +(54094), +(54095), +(54096), +(54113), +(54121), +(54126), +(54129), +(54132), +(54135), +(54158), +(54169), +(54172), +(54175), +(54183), +(54185), +(54188), +(54190), +(54191), +(54195), +(54196), +(54198), +(54203), +(54216), +(54226), +(54235), +(54237), +(54238), +(54249), +(54260), +(54261), +(54273), +(54283), +(54284), +(54290), +(54299), +(54303), +(54309), +(54311), +(54315), +(54316), +(54319), +(54321), +(54324), +(54331), +(54334), +(54335), +(54337), +(54338), +(54339), +(54340), +(54345), +(54350), +(54361), +(54376), +(54378), +(54380), +(54387), +(54393), +(54394), +(54395), +(54396), +(54399), +(54416), +(54417), +(54429), +(54431), +(54433), +(54451), +(54453), +(54458), +(54459), +(54460), +(54468), +(54470), +(54479), +(54485), +(54487), +(54491), +(54495), +(54498), +(54499), +(54502), +(54504), +(54507), +(54511), +(54514), +(54518), +(54521), +(54525), +(54526), +(54527), +(54531), +(54532), +(54540), +(54549), +(54565), +(54573), +(54576), +(54577), +(54578), +(54587), +(54588), +(54593), +(54594), +(54602), +(54604), +(54609), +(54610), +(54611), +(54612), +(54613), +(54615), +(54616), +(54617), +(54618), +(54619), +(54620), +(54622), +(54624), +(54630), +(54631), +(54632), +(54634), +(54640), +(54644), +(54646), +(54648), +(54651), +(54660), +(54662), +(54663), +(54667), +(54668), +(54673), +(54675), +(54677), +(54679), +(54680), +(54688), +(54689), +(54694), +(54702), +(54703), +(54704), +(54706), +(54708), +(54709), +(54716), +(54719), +(54723), +(54755), +(54757), +(54761), +(54770), +(54772), +(54781), +(54785), +(54788), +(54790), +(54791), +(54794), +(54799), +(54801), +(54804), +(54805), +(54820), +(54822), +(54823), +(54843), +(54846), +(54880), +(54881), +(54882), +(54883), +(54884), +(54885), +(54886), +(54887), +(54900), +(54906), +(54908), +(54919), +(54920), +(54932), +(54933), +(54951), +(54956), +(54957), +(54958), +(54965), +(54970), +(54971), +(54973), +(54974), +(54975), +(54976), +(54977), +(54982), +(54983), +(54986), +(54987), +(54992), +(54997), +(55006), +(55007), +(55008), +(55009), +(55021), +(55029), +(55039), +(55041), +(55046), +(55050), +(55051), +(55054), +(55065), +(55066), +(55069), +(55070), +(55071), +(55074), +(55075), +(55078), +(55079), +(55090), +(55093), +(55095), +(55102), +(55104), +(55144), +(55160), +(55168), +(55196), +(55209), +(55210), +(55216), +(55217), +(55218), +(55219), +(55220), +(55224), +(55225), +(55226), +(55240), +(55241), +(55253), +(55255), +(55258), +(55259), +(55260), +(55261), +(55262), +(55263), +(55264), +(55265), +(55268), +(55269), +(55270), +(55271), +(55274), +(55276), +(55277), +(55281), +(55284), +(55313), +(55314), +(55317), +(55318), +(55319), +(55320), +(55321), +(55322), +(55324), +(55331), +(55334), +(55346), +(55348), +(55359), +(55360), +(55363), +(55364), +(55411), +(55412), +(55416), +(55424), +(55425), +(55430), +(55469), +(55470), +(55482), +(55483), +(55484), +(55485), +(55487), +(55488), +(55489), +(55490), +(55491), +(55492), +(55495), +(55496), +(55497), +(55498), +(55499), +(55504), +(55505), +(55506), +(55507), +(55508), +(55509), +(55511), +(55520), +(55521), +(55530), +(55536), +(55549), +(55550), +(55555), +(55556), +(55557), +(55567), +(55568), +(55569), +(55579), +(55581), +(55582), +(55597), +(55598), +(55599), +(55602), +(55604), +(55605), +(55613), +(55622), +(55624), +(55625), +(55643), +(55645), +(55646), +(55648), +(55652), +(55659), +(55700), +(55703), +(55704), +(55716), +(55719), +(55728), +(55736), +(55748), +(55749), +(55750), +(55751), +(55752), +(55753), +(55754), +(55756), +(55770), +(55771), +(55772), +(55778), +(55779), +(55780), +(55781), +(55790), +(55797), +(55802), +(55804), +(55809), +(55813), +(55815), +(55818), +(55823), +(55824), +(55838), +(55840), +(55841), +(55864), +(55874), +(55877), +(55880), +(55890), +(55894), +(55929), +(55931), +(55932), +(55933), +(55935), +(55936), +(55937), +(55939), +(55951), +(55958), +(55959), +(55960), +(55962), +(55963), +(55968), +(55973), +(55978), +(55981), +(55982), +(55983), +(55984), +(56033), +(56036), +(56038), +(56046), +(56061), +(56071), +(56072), +(56090), +(56091), +(56092), +(56098), +(56104), +(56106), +(56107), +(56112), +(56113), +(56115), +(56122), +(56123), +(56125), +(56127), +(56130), +(56131), +(56132), +(56138), +(56139), +(56141), +(56143), +(56144), +(56147), +(56149), +(56160), +(56161), +(56185), +(56190), +(56191), +(56198), +(56200), +(56211), +(56222), +(56223), +(56230), +(56236), +(56239), +(56252), +(56254), +(56260), +(56277), +(56287), +(56305), +(56320), +(56326), +(56329), +(56331), +(56332), +(56346), +(56351), +(56352), +(56361), +(56362), +(56379), +(56404), +(56405), +(56411), +(56425), +(56426), +(56430), +(56433), +(56434), +(56440), +(56442), +(56444), +(56447), +(56448), +(56485), +(56491), +(56506), +(56513), +(56515), +(56517), +(56520), +(56521), +(56525), +(56536), +(56537), +(56539), +(56545), +(56557), +(56559), +(56562), +(56564), +(56565), +(56581), +(56582), +(56584), +(56586), +(56603), +(56605), +(56606), +(56607), +(56609), +(56624), +(56626), +(56627), +(56628), +(56629), +(56630), +(56631), +(56640), +(56641), +(56645), +(56659), +(56662), +(56664), +(56666), +(56668), +(56670), +(56671), +(56672), +(56678), +(56685), +(56687), +(56698), +(56699), +(56701), +(56707), +(56715), +(56718), +(56719), +(56720), +(56721), +(56727), +(56728), +(56729), +(56730), +(56731), +(56734), +(56753), +(56754), +(56755), +(56760), +(56761), +(56770), +(56771), +(56772), +(56773), +(56774), +(56775), +(56776), +(56777), +(56780), +(56781), +(56785), +(56790), +(56791), +(56795), +(56796), +(56797), +(56815), +(56854), +(56860), +(56861), +(56862), +(56891), +(56893), +(56896), +(56898), +(56902), +(56903), +(56905), +(56906), +(56907), +(56909), +(56917), +(56918), +(56919), +(56920), +(56921), +(56922), +(56923), +(56925), +(56933), +(56937), +(56938), +(56939), +(56940), +(56966), +(56969), +(57049), +(57050), +(57052), +(57053), +(57058), +(57062), +(57063), +(57089), +(57090), +(57094), +(57095), +(57108), +(57118), +(57143), +(57292), +(57305), +(57323), +(57337), +(57346), +(57347), +(57369), +(57374), +(57376), +(57380), +(57384), +(57386), +(57388), +(57389), +(57390), +(57391), +(57392), +(57393), +(57395), +(57397), +(57402), +(57407), +(57411), +(57413), +(57420), +(57454), +(57456), +(57461), +(57464), +(57465), +(57466), +(57473), +(57480), +(57486), +(57487), +(57488), +(57490), +(57506), +(57507), +(57528), +(57530), +(57536), +(57537), +(57547), +(57548), +(57553), +(57554), +(57556), +(57573), +(57580), +(57582), +(57587), +(57589), +(57590), +(57593), +(57594), +(57596), +(57599), +(57601), +(57602), +(57603), +(57615), +(57616), +(57617), +(57620), +(57628), +(57635), +(57640), +(57641), +(57644), +(57645), +(57647), +(57648), +(57651), +(57657), +(57661), +(57665), +(57670), +(57671), +(57677), +(57679), +(57723), +(57724), +(57725), +(57745), +(57755), +(57759), +(57765), +(57766), +(57767), +(57770), +(57774), +(57775), +(57777), +(57778), +(57779), +(57780), +(57781), +(57783), +(57785), +(57787), +(57789), +(57790), +(57795), +(57799), +(57802), +(57807), +(57808), +(57823), +(57825), +(57833), +(57834), +(57838), +(57841), +(57842), +(57845), +(57846), +(57860), +(57863), +(57864), +(57871), +(57874), +(57888), +(57896), +(57897), +(57906), +(57908), +(57914), +(57921), +(57922), +(57941), +(57949), +(57951), +(57964), +(57965), +(57969), +(57970), +(57974), +(57975), +(57981), +(57984), +(57992), +(57993), +(57994), +(58012), +(58021), +(58025), +(58044), +(58054), +(58061), +(58062), +(58071), +(58106), +(58117), +(58118), +(58119), +(58151), +(58154), +(58179), +(58180), +(58181), +(58183), +(58184), +(58187), +(58194), +(58203), +(58204), +(58205), +(58207), +(58208), +(58209), +(58210), +(58211), +(58212), +(58213), +(58214), +(58215), +(58216), +(58217), +(58218), +(58219), +(58220), +(58221), +(58222), +(58223), +(58224), +(58230), +(58270), +(58282), +(58283), +(58349), +(58351), +(58352), +(58371), +(58373), +(58412), +(58418), +(58419), +(58420), +(58421), +(58438), +(58448), +(58449), +(58450), +(58451), +(58452), +(58453), +(58456), +(58457), +(58459), +(58460), +(58461), +(58462), +(58464), +(58466), +(58471), +(58475), +(58494), +(58504), +(58505), +(58508), +(58509), +(58510), +(58511), +(58513), +(58514), +(58516), +(58517), +(58518), +(58519), +(58520), +(58526), +(58529), +(58531), +(58534), +(58535), +(58537), +(58544), +(58548), +(58561), +(58563), +(58564), +(58566), +(58567), +(58597), +(58604), +(58605), +(58607), +(58608), +(58609), +(58610), +(58611), +(58612), +(58617), +(58619), +(58621), +(58622), +(58624), +(58628), +(58632), +(58633), +(58642), +(58644), +(58660), +(58663), +(58664), +(58665), +(58666), +(58667), +(58678), +(58681), +(58683), +(58684), +(58691), +(58700), +(58701), +(58702), +(58743), +(58747), +(58758), +(58769), +(58770), +(58772), +(58781), +(58782), +(58786), +(58787), +(58788), +(58797), +(58798), +(58799), +(58810), +(58811), +(58814), +(58815), +(58816), +(58817), +(58822), +(58823), +(58827), +(58829), +(58830), +(58839), +(58840), +(58843), +(58844), +(58845), +(58847), +(58849), +(58850), +(58855), +(58859), +(58861), +(58867), +(58879), +(58890), +(58896), +(58898), +(58902), +(58905), +(58912), +(58913), +(58915), +(58919), +(58921), +(58922), +(58935), +(58940), +(58941), +(58953), +(58955), +(58959), +(58961), +(58966), +(58967), +(58969), +(58971), +(58972), +(58973), +(58976), +(58978), +(58980), +(58981), +(58987), +(58988), +(58989), +(58991), +(58996), +(59001), +(59006), +(59007), +(59011), +(59013), +(59016), +(59017), +(59019), +(59020), +(59021), +(59023), +(59024), +(59025), +(59034), +(59035), +(59039), +(59040), +(59044), +(59047), +(59050), +(59051), +(59060), +(59064), +(59065), +(59069), +(59079), +(59080), +(59081), +(59082), +(59083), +(59085), +(59100), +(59102), +(59104), +(59105), +(59106), +(59109), +(59110), +(59111), +(59114), +(59119), +(59121), +(59124), +(59130), +(59131), +(59132), +(59133), +(59134), +(59138), +(59142), +(59144), +(59146), +(59147), +(59148), +(59150), +(59151), +(59153), +(59155), +(59160), +(59161), +(59163), +(59164), +(59165), +(59166), +(59167), +(59168), +(59169), +(59170), +(59171), +(59172), +(59178), +(59179), +(59180), +(59182), +(59185), +(59186), +(59187), +(59191), +(59192), +(59199), +(59209), +(59210), +(59211), +(59215), +(59220), +(59223), +(59225), +(59226), +(59228), +(59233), +(59235), +(59237), +(59239), +(59241), +(59242), +(59243), +(59244), +(59246), +(59247), +(59248), +(59249), +(59251), +(59252), +(59254), +(59256), +(59257), +(59259), +(59260), +(59261), +(59262), +(59263), +(59264), +(59265), +(59268), +(59269), +(59270), +(59271), +(59273), +(59280), +(59288), +(59290), +(59300), +(59304), +(59318), +(59319), +(59324), +(59325), +(59329), +(59330), +(59331), +(59342), +(59343), +(59344), +(59346), +(59347), +(59348), +(59350), +(59351), +(59352), +(59355), +(59357), +(59359), +(59361), +(59362), +(59364), +(59367), +(59371), +(59373), +(59374), +(59376), +(59381), +(59389), +(59391), +(59392), +(59395), +(59397), +(59398), +(59399), +(59400), +(59401), +(59402), +(59408), +(59409), +(59412), +(59413), +(59423), +(59432), +(59434), +(59439), +(59444), +(59448), +(59455), +(59460), +(59467), +(59468), +(59471), +(59482), +(59485), +(59513), +(59515), +(59517), +(59519), +(59520), +(59525), +(59530), +(59542), +(59543), +(59544), +(59545), +(59547), +(59548), +(59557), +(59558), +(59563), +(59575), +(59577), +(59590), +(59593), +(59594), +(59599), +(59603), +(59604), +(59605), +(59606), +(59607), +(59608), +(59610), +(59611), +(59616), +(59617), +(59633), +(59634), +(59637), +(59638), +(59651), +(59653), +(59656), +(59661), +(59663), +(59679), +(59682), +(59683), +(59684), +(59685), +(59691), +(59695), +(59696), +(59700), +(59703), +(59710), +(59712), +(59713), +(59715), +(59716), +(59717), +(59718), +(59723), +(59727), +(59735), +(59736), +(59742), +(59743), +(59746), +(59750), +(59760), +(59762), +(59763), +(59765), +(59766), +(59767), +(59769), +(59779), +(59795), +(59805), +(59812), +(59813), +(59814), +(59815), +(59817), +(59823), +(59826), +(59827), +(59832), +(59839), +(59840), +(59841), +(59844), +(59846), +(59851), +(59852), +(59855), +(59856), +(59863), +(59864), +(59877), +(59879), +(59881), +(59882), +(59883), +(59884), +(59885), +(59886), +(59894), +(59901), +(59921), +(59963), +(59965), +(59972), +(59974), +(59978), +(59982), +(59984), +(59985), +(59986), +(59987), +(59988), +(59989), +(59991), +(59992), +(59993), +(59994), +(59997), +(59999), +(60003), +(60004), +(60005), +(60006), +(60008), +(60009), +(60011), +(60012), +(60013), +(60015), +(60016), +(60017), +(60018), +(60032), +(60035), +(60039), +(60041), +(60043), +(60051), +(60052), +(60053), +(60067), +(60073), +(60076), +(60078), +(60079), +(60080), +(60085), +(60089), +(60100), +(60103), +(60106), +(60107), +(60111), +(60112), +(60115), +(60117), +(60122), +(60123), +(60127), +(60129), +(60181), +(60183), +(60186), +(60194), +(60195), +(60197), +(60203), +(60204), +(60210), +(60211), +(60212), +(60229), +(60233), +(60234), +(60235), +(60236), +(60239), +(60241), +(60300), +(60307), +(60309), +(60339), +(60351), +(60352), +(60428), +(60431), +(60432), +(60433), +(60440), +(60443), +(60446), +(60447), +(60450), +(60452), +(60453), +(60472), +(60474), +(60483), +(60488), +(60500), +(60504), +(60505), +(60506), +(60518), +(60526), +(60530), +(60540), +(60541), +(60542), +(60578), +(60580), +(60585), +(60588), +(60590), +(60626), +(60642), +(60644), +(60646), +(60654), +(60672), +(60678), +(60682), +(60683), +(60699), +(60708), +(60742), +(60753), +(60781), +(60782), +(60784), +(60785), +(60786), +(60790), +(60802), +(60803), +(60805), +(60809), +(60814), +(60817), +(60842), +(60844), +(60850), +(60856), +(60857), +(60859), +(60868), +(60869), +(60870), +(60871), +(60872), +(60873), +(60876), +(60880), +(60882), +(60890), +(60896), +(60897), +(60898), +(60899), +(60900), +(60901), +(60905), +(60906), +(60917), +(60918), +(60924), +(60926), +(60927), +(60930), +(60932), +(60935), +(60940), +(60941), +(60944), +(60945), +(60946), +(60947), +(60949), +(60950), +(60951), +(60952), +(60954), +(60959), +(60961), +(60962), +(60963), +(60965), +(60968), +(60972), +(60973), +(60979), +(60980), +(60981), +(60982), +(60983), +(60988), +(60991), +(60995), +(61001), +(61005), +(61006), +(61016), +(61018), +(61024), +(61025), +(61029), +(61034), +(61036), +(61039), +(61041), +(61042), +(61046), +(61048), +(61051), +(61064), +(61070), +(61077), +(61080), +(61083), +(61087), +(61091), +(61094), +(61100), +(61101), +(61103), +(61109), +(61110), +(61111), +(61115), +(61123), +(61124), +(61127), +(61129), +(61133), +(61140), +(61143), +(61159), +(61160), +(61162), +(61164), +(61166), +(61168), +(61171), +(61172), +(61173), +(61176), +(61178), +(61182), +(61186), +(61187), +(61191), +(61193), +(61194), +(61195), +(61196), +(61197), +(61198), +(61209), +(61211), +(61213), +(61215), +(61218), +(61223), +(61226), +(61242), +(61243), +(61244), +(61253), +(61259), +(61260), +(61263), +(61269), +(61272), +(61281), +(61282), +(61286), +(61287), +(61291), +(61295), +(61296), +(61299), +(61300), +(61301), +(61302), +(61305), +(61314), +(61319), +(61320), +(61326), +(61327), +(61343), +(61344), +(61347), +(61352), +(61358), +(61372), +(61373), +(61374), +(61375), +(61380), +(61381), +(61382), +(61385), +(61395), +(61398), +(61399), +(61409), +(61411), +(61415), +(61419), +(61420), +(61421), +(61423), +(61424), +(61443), +(61445), +(61448), +(61454), +(61457), +(61461), +(61466), +(61474), +(61479), +(61480), +(61486), +(61490), +(61491), +(61493), +(61507), +(61511), +(61512), +(61515), +(61528), +(61545), +(61549), +(61550), +(61552), +(61554), +(61556), +(61558), +(61561), +(61562), +(61563), +(61565), +(61567), +(61569), +(61572), +(61579), +(61584), +(61590), +(61592), +(61593), +(61596), +(61597), +(61599), +(61600), +(61601), +(61604), +(61606), +(61607), +(61613), +(61621), +(61623), +(61624), +(61626), +(61627), +(61628), +(61634), +(61635), +(61662), +(61663), +(61666), +(61667), +(61668), +(61676), +(61685), +(61696), +(61705), +(61712), +(61716), +(61721), +(61728), +(61729), +(61730), +(61733), +(61747), +(61767), +(61780), +(61781), +(61789), +(61791), +(61793), +(61794), +(61795), +(61796), +(61797), +(61798), +(61799), +(61800), +(61801), +(61802), +(61804), +(61805), +(61806), +(61807), +(61808), +(61815), +(61817), +(61819), +(61821), +(61822), +(61823), +(61824), +(61825), +(61832), +(61833), +(61834), +(61835), +(61836), +(61837), +(61838), +(61839), +(61840), +(61841), +(61842), +(61843), +(61844), +(61845), +(61849), +(61857), +(61859), +(61862), +(61866), +(61868), +(61870), +(61873), +(61879), +(61880), +(61881), +(61888), +(61893), +(61895), +(61896), +(61897), +(61903), +(61909), +(61911), +(61912), +(61923), +(61924), +(61925), +(61926), +(61927), +(61928), +(61929), +(61965), +(61967), +(61973), +(61998), +(62014), +(62026), +(62030), +(62036), +(62053), +(62063), +(62078), +(62089), +(62103), +(62105), +(62117), +(62118), +(62119), +(62120), +(62121), +(62122), +(62124), +(62128), +(62129), +(62130), +(62131), +(62138), +(62167), +(62169), +(62195), +(62198), +(62204), +(62225), +(62226), +(62249), +(62250), +(62261), +(62264), +(62265), +(62280), +(62292), +(62298), +(62305), +(62309), +(62310), +(62312), +(62315), +(62316), +(62317), +(62318), +(62322), +(62326), +(62327), +(62328), +(62331), +(62332), +(62333), +(62334), +(62335), +(62342), +(62347), +(62354), +(62356), +(62368), +(62372), +(62373), +(62382), +(62395), +(62401), +(62402), +(62415), +(62417), +(62418), +(62420), +(62441), +(62442), +(62443), +(62444), +(62445), +(62446), +(62455), +(62456), +(62466), +(62479), +(62482), +(62503), +(62507), +(62526), +(62531), +(62536), +(62540), +(62544), +(62554), +(62563), +(62575), +(62581), +(62583), +(62589), +(62601), +(62607), +(62608), +(62611), +(62613), +(62614), +(62626), +(62638), +(62648), +(62649), +(62653), +(62658), +(62672), +(62673), +(62707), +(62708), +(62711), +(62717), +(62722), +(62726), +(62732), +(62767), +(62768), +(62769), +(62793), +(62796), +(62806), +(62832), +(62836), +(62844), +(62845), +(62846), +(62854), +(62855), +(62863), +(62867), +(62874), +(62875), +(62881), +(62900), +(62901), +(62902), +(62903), +(62904), +(62928), +(62935), +(62938), +(62939), +(62960), +(62961), +(62989), +(62997), +(62998), +(63003), +(63010), +(63012), +(63028), +(63034), +(63035), +(63036), +(63047), +(63082), +(63094), +(63103), +(63104), +(63105), +(63111), +(63112), +(63120), +(63124), +(63125), +(63126), +(63127), +(63134), +(63136), +(63138), +(63147), +(63151), +(63169), +(63171), +(63172), +(63174), +(63175), +(63177), +(63178), +(63179), +(63180), +(63183), +(63184), +(63185), +(63216), +(63221), +(63226), +(63228), +(63233), +(63240), +(63242), +(63259), +(63276), +(63278), +(63301), +(63311), +(63313), +(63314), +(63315), +(63316), +(63336), +(63337), +(63338), +(63344), +(63345), +(63356), +(63359), +(63361), +(63362), +(63363), +(63380), +(63382), +(63413), +(63416), +(63418), +(63459), +(63462), +(63463), +(63464), +(63465), +(63466), +(63468), +(63477), +(63479), +(63487), +(63493), +(63494), +(63495), +(63511), +(63518), +(63519), +(63529), +(63535), +(63536), +(63544), +(63549), +(63550), +(63551), +(63553), +(63556), +(63559), +(63562), +(63564), +(63569), +(63571), +(63573), +(63575), +(63599), +(63605), +(63612), +(63615), +(63619), +(63652), +(63653), +(63654), +(63655), +(63661), +(63668), +(63669), +(63670), +(63671), +(63672), +(63673), +(63675), +(63678), +(63685), +(63689), +(63691), +(63699), +(63700), +(63716), +(63728), +(63736), +(63738), +(63754), +(63755), +(63759), +(63760), +(63789), +(63803), +(63804), +(63809), +(63815), +(63823), +(63825), +(63827), +(63845), +(63846), +(63852), +(63861), +(63913), +(63914), +(63915), +(63916), +(63917), +(63918), +(63919), +(63920), +(63921), +(63922), +(63923), +(63931), +(63980), +(63989), +(63993), +(63995), +(63997), +(63998), +(64003), +(64005), +(64006), +(64014), +(64024), +(64025), +(64026), +(64027), +(64028), +(64029), +(64030), +(64031), +(64032), +(64034), +(64036), +(64039), +(64044), +(64058), +(64065), +(64085), +(64090), +(64097), +(64102), +(64104), +(64107), +(64113), +(64114), +(64115), +(64119), +(64123), +(64128), +(64134), +(64136), +(64138), +(64142), +(64151), +(64152), +(64153), +(64156), +(64157), +(64159), +(64160), +(64186), +(64204), +(64211), +(64212), +(64213), +(64215), +(64230), +(64269), +(64324), +(64328), +(64330), +(64331), +(64332), +(64333), +(64334), +(64335), +(64336), +(64337), +(64338), +(64339), +(64342), +(64346), +(64363), +(64365), +(64367), +(64374), +(64375), +(64376), +(64377), +(64380), +(64382), +(64387), +(64388), +(64390), +(64391), +(64395), +(64396), +(64412), +(64413), +(64429), +(64430), +(64442), +(64467), +(64478), +(64496), +(64499), +(64501), +(64507), +(64528), +(64529), +(64535), +(64542), +(64552), +(64580), +(64583), +(64588), +(64590), +(64591), +(64592), +(64595), +(64627), +(64637), +(64638), +(64640), +(64646), +(64647), +(64648), +(64649), +(64654), +(64665), +(64666), +(64667), +(64668), +(64669), +(64674), +(64682), +(64686), +(64692), +(64696), +(64698), +(64699), +(64705), +(64719), +(64740), +(64757), +(64758), +(64759), +(64766), +(64768), +(64771), +(64773), +(64776), +(64780), +(64787), +(64795), +(64798), +(64801), +(64806), +(64807), +(64821), +(64841), +(64870), +(64874), +(64876), +(64888), +(64891), +(64903), +(64909), +(64918), +(64930), +(64953), +(64967), +(64970), +(64971), +(64974), +(64978), +(64991), +(65030), +(65031), +(65033), +(65035), +(65036), +(65038), +(65039), +(65040), +(65042), +(65054), +(65055), +(65056), +(65057), +(65058), +(65059), +(65061), +(65062), +(65071), +(65080), +(65081), +(65104), +(65111), +(65113), +(65122), +(65123), +(65131), +(65133), +(65147), +(65162), +(65201), +(65210), +(65240), +(65266), +(65280), +(65343), +(65351), +(65359), +(65360), +(65374), +(65378), +(65379), +(65386), +(65391), +(65392), +(65403), +(65431), +(65488), +(65490), +(65492), +(65502), +(65503), +(65512), +(65513), +(65516), +(65531), +(65532), +(65541), +(65542), +(65545), +(65546), +(65564), +(65565), +(65575), +(65576), +(65577), +(65634), +(65635), +(65636), +(65647), +(65648), +(65693), +(65694), +(65703), +(65720), +(65722), +(65723), +(65728), +(65729), +(65744), +(65754), +(65775), +(65778), +(65782), +(65790), +(65791), +(65799), +(65801), +(65807), +(65809), +(65810), +(65812), +(65813), +(65814), +(65815), +(65819), +(65820), +(65821), +(65825), +(65826), +(65854), +(65855), +(65856), +(65857), +(65859), +(65862), +(65863), +(65866), +(65867), +(65868), +(65877), +(65878), +(65881), +(65883), +(65918), +(65924), +(65926), +(65927), +(65929), +(65930), +(65931), +(65934), +(65935), +(65936), +(65940), +(65941), +(65954), +(65957), +(65960), +(65962), +(65970), +(65971), +(65972), +(65973), +(65974), +(65978), +(65987), +(65998), +(66003), +(66005), +(66007), +(66008), +(66009), +(66012), +(66017), +(66018), +(66019), +(66020), +(66021), +(66042), +(66043), +(66045), +(66047), +(66053), +(66054), +(66055), +(66056), +(66057), +(66063), +(66065), +(66066), +(66067), +(66068), +(66069), +(66070), +(66072), +(66075), +(66079), +(66081), +(66093), +(66095), +(66097), +(66099), +(66100), +(66104), +(66109), +(66112), +(66113), +(66114), +(66115), +(66116), +(66125), +(66126), +(66134), +(66154), +(66177), +(66188), +(66196), +(66197), +(66198), +(66206), +(66207), +(66209), +(66213), +(66215), +(66216), +(66217), +(66236), +(66237), +(66240), +(66243), +(66244), +(66245), +(66250), +(66259), +(66260), +(66261), +(66262), +(66265), +(66283), +(66285), +(66290), +(66291), +(66292), +(66293), +(66294), +(66295), +(66313), +(66326), +(66331), +(66334), +(66342), +(66359), +(66377), +(66378), +(66407), +(66408), +(66409), +(66410), +(66417), +(66420), +(66423), +(66425), +(66457), +(66460), +(66461), +(66474), +(66477), +(66479), +(66480), +(66481), +(66489), +(66493), +(66516), +(66528), +(66532), +(66533), +(66536), +(66537), +(66538), +(66548), +(66549), +(66588), +(66592), +(66593), +(66594), +(66595), +(66596), +(66613), +(66619), +(66620), +(66629), +(66638), +(66666), +(66668), +(66669), +(66686), +(66687), +(66688), +(66689), +(66716), +(66717), +(66719), +(66733), +(66735), +(66736), +(66742), +(66744), +(66765), +(66770), +(66773), +(66777), +(66784), +(66796), +(66797), +(66809), +(66813), +(66823), +(66824), +(66863), +(66867), +(66869), +(66879), +(66880), +(66887), +(66888), +(66890), +(66891), +(66892), +(66899), +(66903), +(66904), +(66922), +(66940), +(66941), +(66950), +(66951), +(66952), +(66953), +(66954), +(66955), +(66957), +(66958), +(66959), +(66960), +(66961), +(66962), +(66963), +(66964), +(66965), +(66972), +(66973), +(66974), +(66975), +(66976), +(66977), +(66978), +(66979), +(66988), +(66989), +(66990), +(66991), +(66992), +(66994), +(67029), +(67030), +(67031), +(67033), +(67035), +(67049), +(67050), +(67051), +(67073), +(67074), +(67075), +(67088), +(67089), +(67090), +(67097), +(67098), +(67099), +(67114), +(67148), +(67229), +(67235), +(67237), +(67247), +(67252), +(67253), +(67280), +(67289), +(67290), +(67309), +(67310), +(67311), +(67312), +(67313), +(67314), +(67324), +(67325), +(67330), +(67331), +(67333), +(67366), +(67372), +(67373), +(67387), +(67390), +(67477), +(67478), +(67479), +(67480), +(67481), +(67485), +(67518), +(67519), +(67528), +(67529), +(67530), +(67531), +(67532), +(67533), +(67534), +(67540), +(67542), +(67550), +(67554), +(67560), +(67573), +(67574), +(67577), +(67606), +(67607), +(67608), +(67612), +(67613), +(67614), +(67618), +(67619), +(67620), +(67624), +(67625), +(67626), +(67632), +(67633), +(67634), +(67650), +(67651), +(67652), +(67654), +(67655), +(67656), +(67674), +(67675), +(67676), +(67678), +(67679), +(67680), +(67686), +(67703), +(67708), +(67709), +(67710), +(67714), +(67718), +(67719), +(67721), +(67722), +(67724), +(67725), +(67730), +(67745), +(67749), +(67760), +(67767), +(67772), +(67773), +(67774), +(67793), +(67799), +(67810), +(67811), +(67817), +(67818), +(67819), +(67821), +(67823), +(67830), +(67834), +(67835), +(67836), +(67837), +(67838), +(67846), +(67847), +(67861), +(67862), +(67863), +(67878), +(67879), +(67880), +(67881), +(67882), +(67883), +(67884), +(67885), +(67891), +(67892), +(67905), +(67906), +(67907), +(67929), +(67930), +(67931), +(67932), +(67933), +(67934), +(67935), +(67936), +(67937), +(67938), +(67939), +(67940), +(67941), +(67942), +(67943), +(67944), +(67945), +(67946), +(67947), +(67948), +(67949), +(67951), +(67952), +(67953), +(67957), +(67958), +(67959), +(67965), +(67966), +(67967), +(67968), +(67969), +(67970), +(67971), +(67972), +(67973), +(67977), +(67978), +(67979), +(67980), +(67981), +(67982), +(67983), +(67984), +(67985), +(67988), +(67989), +(67990), +(67991), +(67992), +(67993), +(67994), +(67995), +(67996), +(67997), +(67998), +(67999), +(68003), +(68004), +(68005), +(68008), +(68009), +(68010), +(68011), +(68012), +(68013), +(68014), +(68015), +(68016), +(68017), +(68018), +(68019), +(68023), +(68024), +(68025), +(68026), +(68027), +(68028), +(68032), +(68033), +(68034), +(68035), +(68036), +(68037), +(68038), +(68039), +(68040), +(68042), +(68043), +(68044), +(68055), +(68073), +(68077), +(68078), +(68081), +(68088), +(68089), +(68090), +(68091), +(68092), +(68093), +(68094), +(68095), +(68096), +(68100), +(68101), +(68102), +(68106), +(68107), +(68108), +(68109), +(68110), +(68111), +(68112), +(68113), +(68114), +(68115), +(68116), +(68117), +(68118), +(68119), +(68120), +(68123), +(68124), +(68125), +(68130), +(68133), +(68134), +(68135), +(68136), +(68137), +(68138), +(68139), +(68140), +(68141), +(68148), +(68149), +(68150), +(68151), +(68152), +(68153), +(68154), +(68155), +(68156), +(68157), +(68158), +(68159), +(68272), +(68282), +(68284), +(68301), +(68306), +(68307), +(68310), +(68311), +(68313), +(68315), +(68317), +(68318), +(68319), +(68321), +(68328), +(68333), +(68334), +(68340), +(68341), +(68350), +(68357), +(68362), +(68363), +(68364), +(68365), +(68372), +(68391), +(68415), +(68458), +(68472), +(68478), +(68479), +(68498), +(68501), +(68502), +(68503), +(68504), +(68505), +(68550), +(68551), +(68586), +(68587), +(68588), +(68607), +(68621), +(68622), +(68623), +(68624), +(68625), +(68626), +(68627), +(68628), +(68629), +(68727), +(68753), +(68754), +(68755), +(68756), +(68757), +(68758), +(68762), +(68763), +(68764), +(68778), +(68781), +(68782), +(68783), +(68784), +(68788), +(68799), +(68812), +(68834), +(68839), +(68841), +(68843), +(68868), +(68879), +(68884), +(68900), +(68915), +(68927), +(68934), +(68948), +(68966), +(68971), +(68980), +(68982), +(68984), +(68985), +(68991), +(69000), +(69003), +(69021), +(69023), +(69028), +(69034), +(69038), +(69051), +(69058), +(69063), +(69065), +(69066), +(69067), +(69068), +(69088), +(69091), +(69124), +(69128), +(69130), +(69131), +(69133), +(69137), +(69138), +(69153), +(69155), +(69156), +(69158), +(69160), +(69172), +(69180), +(69181), +(69189), +(69190), +(69198), +(69200), +(69209), +(69210), +(69211), +(69212), +(69218), +(69222), +(69232), +(69243), +(69246), +(69274), +(69275), +(69276), +(69285), +(69308), +(69342), +(69352), +(69387), +(69389), +(69391), +(69397), +(69398), +(69403), +(69404), +(69405), +(69406), +(69409), +(69410), +(69416), +(69420), +(69427), +(69438), +(69445), +(69455), +(69483), +(69489), +(69492), +(69496), +(69497), +(69498), +(69499), +(69500), +(69501), +(69503), +(69504), +(69520), +(69528), +(69542), +(69543), +(69544), +(69548), +(69563), +(69564), +(69566), +(69567), +(69569), +(69570), +(69572), +(69573), +(69574), +(69576), +(69577), +(69578), +(69579), +(69581), +(69583), +(69603), +(69617), +(69623), +(69627), +(69633), +(69644), +(69651), +(69668), +(69672), +(69673), +(69675), +(69681), +(69692), +(69693), +(69696), +(69699), +(69710), +(69722), +(69724), +(69726), +(69729), +(69730), +(69731), +(69733), +(69734), +(69771), +(69772), +(69779), +(69828), +(69837), +(69856), +(69861), +(69866), +(69869), +(69871), +(69882), +(69889), +(69891), +(69892), +(69893), +(69896), +(69898), +(69899), +(69902), +(69903), +(69906), +(69910), +(69911), +(69912), +(69916), +(69917), +(69920), +(69923), +(69926), +(69927), +(69933), +(69956), +(69958), +(69961), +(69963), +(69967), +(69968), +(69969), +(69970), +(69972), +(69973), +(69974), +(69975), +(69984), +(69989), +(70002), +(70043), +(70070), +(70074), +(70080), +(70110), +(70119), +(70122), +(70126), +(70141), +(70144), +(70153), +(70161), +(70162), +(70182), +(70183), +(70191), +(70192), +(70196), +(70205), +(70208), +(70211), +(70213), +(70227), +(70269), +(70270), +(70271), +(70273), +(70275), +(70276), +(70277), +(70278), +(70279), +(70280), +(70281), +(70282), +(70285), +(70289), +(70292), +(70296), +(70302), +(70304), +(70308), +(70309), +(70320), +(70322), +(70327), +(70333), +(70337), +(70355), +(70361), +(70381), +(70386), +(70387), +(70388), +(70391), +(70393), +(70396), +(70400), +(70408), +(70409), +(70410), +(70423), +(70428), +(70429), +(70432), +(70435), +(70437), +(70445), +(70449), +(70451), +(70453), +(70495), +(70510), +(70516), +(70525), +(70538), +(70539), +(70540), +(70542), +(70583), +(70594), +(70599), +(70616), +(70639), +(70640), +(70645), +(70646), +(70648), +(70653), +(70656), +(70659), +(70698), +(70746), +(70751), +(70754), +(70772), +(70781), +(70802), +(70809), +(70821), +(70838), +(70856), +(70857), +(70858), +(70859), +(70860), +(70861), +(70864), +(70867), +(70886), +(70890), +(70895), +(70896), +(70897), +(70906), +(70917), +(70923), +(70928), +(70929), +(70942), +(70946), +(70964), +(70965), +(70971), +(70972), +(70973), +(70974), +(70980), +(71003), +(71004), +(71005), +(71006), +(71020), +(71021), +(71023), +(71038), +(71040), +(71041), +(71087), +(71089), +(71090), +(71103), +(71107), +(71108), +(71112), +(71116), +(71117), +(71119), +(71120), +(71121), +(71124), +(71126), +(71127), +(71129), +(71130), +(71131), +(71133), +(71135), +(71136), +(71138), +(71140), +(71141), +(71142), +(71143), +(71144), +(71145), +(71146), +(71148), +(71153), +(71154), +(71155), +(71157), +(71163), +(71164), +(71169), +(71203), +(71204), +(71237), +(71248), +(71253), +(71254), +(71257), +(71264), +(71289), +(71291), +(71296), +(71297), +(71298), +(71316), +(71317), +(71318), +(71319), +(71326), +(71327), +(71328), +(71330), +(71331), +(71335), +(71339), +(71340), +(71350), +(71361), +(71362), +(71363), +(71392), +(71405), +(71410), +(71420), +(71433), +(71434), +(71443), +(71446), +(71450), +(71459), +(71462), +(71466), +(71473), +(71475), +(71476), +(71477), +(71478), +(71479), +(71480), +(71488), +(71489), +(71490), +(71500), +(71501), +(71504), +(71510), +(71512), +(71522), +(71532), +(71533), +(71539), +(71544), +(71546), +(71547), +(71548), +(71549), +(71551), +(71552), +(71553), +(71554), +(71590), +(71591), +(71594), +(71595), +(71607), +(71623), +(71624), +(71625), +(71626), +(71646), +(71647), +(71686), +(71687), +(71688), +(71713), +(71715), +(71726), +(71727), +(71728), +(71729), +(71738), +(71745), +(71748), +(71750), +(71752), +(71757), +(71758), +(71759), +(71760), +(71778), +(71779), +(71780), +(71781), +(71782), +(71783), +(71784), +(71785), +(71786), +(71788), +(71789), +(71801), +(71806), +(71807), +(71815), +(71818), +(71819), +(71820), +(71821), +(71822), +(71823), +(71824), +(71825), +(71834), +(71838), +(71839), +(71841), +(71842), +(71847), +(71864), +(71866), +(71874), +(71879), +(71909), +(71923), +(71924), +(71925), +(71926), +(71927), +(71928), +(71930), +(71931), +(71932), +(71933), +(71934), +(71936), +(71937), +(71938), +(71951), +(71954), +(71955), +(71972), +(71988), +(72004), +(72005), +(72007), +(72008), +(72010), +(72021), +(72022), +(72023), +(72024), +(72057), +(72065), +(72066), +(72098), +(72106), +(72120), +(72121), +(72123), +(72124), +(72133), +(72163), +(72164), +(72166), +(72167), +(72171), +(72194), +(72196), +(72198), +(72208), +(72211), +(72218), +(72219), +(72222), +(72231), +(72258), +(72264), +(72265), +(72266), +(72267), +(72268), +(72269), +(72293), +(72301), +(72302), +(72303), +(72304), +(72313), +(72318), +(72319), +(72321), +(72322), +(72324), +(72326), +(72327), +(72329), +(72330), +(72333), +(72334), +(72335), +(72336), +(72360), +(72366), +(72367), +(72368), +(72369), +(72373), +(72400), +(72409), +(72410), +(72421), +(72422), +(72423), +(72424), +(72426), +(72427), +(72434), +(72437), +(72447), +(72448), +(72449), +(72451), +(72453), +(72457), +(72463), +(72465), +(72484), +(72485), +(72486), +(72487), +(72488), +(72489), +(72490), +(72491), +(72492), +(72501), +(72502), +(72503), +(72504), +(72531), +(72539), +(72540), +(72541), +(72551), +(72552), +(72553), +(72556), +(72558), +(72566), +(72567), +(72568), +(72569), +(72570), +(72571), +(72586), +(72588), +(72590), +(72597), +(72613), +(72617), +(72645), +(72671), +(72672), +(72688), +(72728), +(72756), +(72796), +(72797), +(72798), +(72804), +(72805), +(72806), +(72809), +(72810), +(72811), +(72847), +(72848), +(72865), +(72875), +(72876), +(72879), +(72883), +(72898), +(72901), +(72930), +(72960), +(72961), +(72963), +(72964), +(72965), +(72966), +(72967), +(72985), +(72995), +(73003), +(73040), +(73075), +(73076), +(73079), +(73395), +(73412), +(73488), +(73489), +(73491), +(73492), +(73499), +(73536), +(73574), +(73712), +(73771), +(73772), +(73782), +(73783), +(73784), +(73788), +(73789), +(73790), +(73797), +(73798), +(73799), +(73830), +(73832), +(73833), +(73879), +(73896), +(73906), +(73912), +(73913), +(73914), +(73943), +(73952), +(73985), +(74035), +(74046), +(74062), +(74080), +(74111), +(74162), +(74163), +(74164), +(74166), +(74184), +(74185), +(74222), +(74307), +(74325), +(74326), +(74327), +(74347), +(74367), +(74394), +(74395), +(74403), +(74404), +(74413), +(74414), +(74417), +(74421), +(74422), +(74424), +(74438), +(74445), +(74451), +(74453), +(74454), +(74470), +(74485), +(74502), +(74506), +(74507), +(74524), +(74562), +(74710), +(74749), +(74762), +(74768), +(74772), +(74774), +(74792), +(74797), +(74807), +(74812), +(74904), +(74905), +(74913), +(74978), +(74982), +(75055), +(75058), +(75082), +(75086), +(75088), +(75102), +(75159), +(75160), +(75161), +(75163), +(75168), +(75182), +(75185), +(75186), +(75188), +(75209), +(75213), +(75234), +(75314), +(75327), +(75329), +(75330), +(75331), +(75332), +(75362), +(75366), +(75367), +(75382), +(75383), +(75384), +(75412), +(75419), +(75421), +(75422), +(75423), +(75434), +(75459), +(75493), +(75494), +(75648), +(75731), +(75760), +(75780), +(75888), +(75889), +(75953), +(76096), +(76221), +(79187), +(79397); +CREATE TABLE `temp_cond_vals` +( + `spellId` INT(11), + `elseGroup` INT(11) AUTO_INCREMENT, + `entry` INT(11), + `dead` INT(11), + `errorTextId` INT(11), + `comment` VARCHAR(255), + PRIMARY KEY (`spellId`, `elseGroup`) +) ENGINE=MYISAM; + +CREATE TABLE `temp_item_spell` +( + `itemId` INT(11), + `spellId` INT(11), + PRIMARY KEY (`itemId`, `spellId`) +); + +CREATE TABLE `temp_item` +( + `itemId` INT(11), + PRIMARY KEY (`itemId`) +); + +INSERT INTO `temp_item` SELECT DISTINCT `SourceEntry` FROM `conditions` WHERE `SourceTypeOrReferenceId` = 18; +INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_1` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_1` IN (SELECT * FROM `temp_convert_spells`); +INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_2` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_2` IN (SELECT * FROM `temp_convert_spells`); +INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_3` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_3` IN (SELECT * FROM `temp_convert_spells`); +INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_4` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_4` IN (SELECT * FROM `temp_convert_spells`); +INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_5` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_5` IN (SELECT * FROM `temp_convert_spells`); + +INSERT INTO `temp_cond_vals` (`spellId`, `entry`, `dead`, `errorTextId`, `comment`) SELECT DISTINCT (SELECT `spellId` FROM `temp_item_spell` WHERE `itemId` = `SourceEntry`), `ConditionValue2`, (`ConditionValue1` - 1), `ErrorTextId`, `Comment` FROM `conditions` +WHERE `SourceTypeOrReferenceId` = 18; + +-- use CONDITION_OBJECT_ENTRY instead of CONDITION_ITEM_TARGET +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `Comment`) +SELECT DISTINCT 17, 0, `spellId`, 0, `elseGroup` - 1, 31, 1, 3, `entry`, 0, 0, `errorTextId`, `comment` FROM `temp_cond_vals`; +-- for CONDITION_ITEM_TARGET with ConditionValue1 = DEAD we're adding !CONDITION_ALIVE as a second requirement +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `Comment`) +SELECT DISTINCT 17, 0, `spellId`, 0, `elseGroup` - 1, 36, 1, 0, 0, 0, 1, `errorTextId`, `comment` FROM `temp_cond_vals` WHERE `dead`; +-- remove entries which could be converted by this sql +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 18 AND `SourceEntry` IN (SELECT `itemId` FROM `temp_item_spell`); +DROP TABLE `temp_convert_spells`; +DROP TABLE `temp_cond_vals`; +DROP TABLE `temp_item_spell`; +DROP TABLE `temp_item`; + +ALTER TABLE conditions DROP PRIMARY KEY; +ALTER TABLE conditions ADD PRIMARY KEY (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`); diff --git a/sql/old/3.3.5a/2012_02_16_01_world_conditions.sql b/sql/old/3.3.5a/2012_02_16_01_world_conditions.sql new file mode 100644 index 00000000000..4bcf997b8e4 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_16_01_world_conditions.sql @@ -0,0 +1,3 @@ +UPDATE `conditions` SET ConditionValue3 = 0, ConditionTarget = 1 WHERE ConditionTypeOrReference = 1 AND ConditionValue3 = 1; +UPDATE `conditions` SET ConditionTypeOrReference = 31, ConditionValue2 = ConditionValue1, ConditionValue1 = 3, ConditionTarget = 1 WHERE ConditionTypeOrReference = 19; +UPDATE `conditions` SET ConditionTypeOrReference = 38, ConditionValue2 = 4, ConditionTarget = 1 WHERE ConditionTypeOrReference = 20; diff --git a/sql/old/3.3.5a/2012_02_17_00_world_waypoints.sql b/sql/old/3.3.5a/2012_02_17_00_world_waypoints.sql new file mode 100644 index 00000000000..1cff86f5d51 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_17_00_world_waypoints.sql @@ -0,0 +1,77 @@ +-- Pathing for Eye of Thrallmar +SET @NPC :=57585; +SET @PATH :=@NPC*10; +UPDATE `creature` SET `position_x`=203.191,`position_y`=2850.286,`position_z`=160.4257,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,197.9876,2842.495,160.4257,0,0,0,100,0), +(@PATH,2,212.5493,2807.971,174.2035,0,0,0,100,0), +(@PATH,3,244.0748,2812.302,156.8424,0,0,0,100,0), +(@PATH,4,262.963,2839.935,173.5923,0,0,0,100,0), +(@PATH,5,249.0294,2865.575,155.9257,0,0,0,100,0), +(@PATH,6,223.3671,2870.441,169.5924,0,0,0,100,0), +(@PATH,7,203.191,2850.286,160.4257,0,0,0,100,0); + +-- Pathing for Eye of Thrallmar +SET @NPC :=57586; +SET @PATH :=@NPC*10; +UPDATE `creature` SET `position_x`=210.6249,`position_y`=2809.285,`position_z`=208.7277,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,213.0469,2809.036,207.1722,0,0,0,100,0), +(@PATH,2,223.5349,2797.282,213.4777,0,0,0,100,0), +(@PATH,3,238.895,2805.732,213.4777,0,0,0,100,0), +(@PATH,4,252.788,2818.183,213.4777,0,0,0,100,0), +(@PATH,5,255.2734,2839.056,213.4777,0,0,0,100,0), +(@PATH,6,245.0219,2851.84,213.4777,0,0,0,100,0), +(@PATH,7,229.2117,2860.19,213.4777,0,0,0,100,0), +(@PATH,8,213.6996,2851.376,206.5887,0,0,0,100,0), +(@PATH,9,204.457,2828.248,199.6443,0,0,0,100,0), +(@PATH,10,212.4397,2807.455,199.6443,0,0,0,100,0), +(@PATH,11,241.3802,2813.464,199.6443,0,0,0,100,0), +(@PATH,12,249.7797,2829.964,199.6443,0,0,0,100,0), +(@PATH,13,244.951,2854.129,199.6443,0,0,0,100,0), +(@PATH,14,221.8344,2856.781,199.6443,0,0,0,100,0), +(@PATH,15,210.7503,2837.578,199.6443,0,0,0,100,0), +(@PATH,16,210.6249,2809.285,208.7277,0,0,0,100,0); + +-- Pathing for Eye of Thrallmar +SET @NPC :=57587; +SET @PATH :=@NPC*10; +UPDATE `creature` SET `position_x`=236.1859,`position_y`=2813.747,`position_z`=200.9708,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,241.7692,2815.284,200.8042,0,0,0,100,0), +(@PATH,2,255.8273,2833.317,201.443,0,0,0,100,0), +(@PATH,3,247.4309,2853.592,205.1653,0,0,0,100,0), +(@PATH,4,223.9901,2858.107,208.5819,0,0,0,100,0), +(@PATH,5,208.0596,2843.793,192.3596,0,0,0,100,0), +(@PATH,6,213.9734,2816.793,188.4153,0,0,0,100,0), +(@PATH,7,236.1859,2813.747,200.9708,0,0,0,100,0); + +-- Pathing for Eye of Thrallmar +SET @NPC :=57588; +SET @PATH :=@NPC*10; +UPDATE `creature` SET `position_x`=245.9259,`position_y`=2829.09,`position_z`=177.804,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,251.6207,2841.322,177.804,0,0,0,100,0), +(@PATH,2,241.4914,2859.113,169.6652,0,0,0,100,0), +(@PATH,3,214.9913,2858.249,176.3595,0,0,0,100,0), +(@PATH,4,210.2245,2836.028,169.7762,0,0,0,100,0), +(@PATH,5,225.7556,2822.145,169.9707,0,0,0,100,0), +(@PATH,6,237.9712,2823.874,170.1096,0,0,0,100,0), +(@PATH,7,245.9259,2829.09,177.804,0,0,0,100,0); + +DELETE FROM `creature` WHERE `guid`=57589; +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=16598; + + diff --git a/sql/old/3.3.5a/2012_02_18_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_02_18_00_world_spell_script_names.sql new file mode 100644 index 00000000000..993fe3a2f38 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_00_world_spell_script_names.sql @@ -0,0 +1,69 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` in (-100,-12162,13567,17251,23019,23448,23453,25860,28089,29200,29858,30458,30507,31225,35745,37674,39090,39093,39096,42784,43723,44875,47170,49357,50243,51582,51961,52759,52845,53808,54171,54577,55004,64385,-1464,-5308,12809,23881,-1454,-50286,8171,52041,52046,52047,52048,52049,52050,52059,52060,52061,52031,52033,52034,52035,52036,58778,58779,58780,60103,-49998,-66188,-47541,52375,59134,-62900,49560,62324,31890); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(-100,'spell_warr_charge'), +(-12162,'spell_warr_deep_wounds'), +(13567,'spell_gen_dummy_trigger'), +(17251,'spell_gen_spirit_healer_res'), +(23019,'spell_item_crystal_prison_dummy_dnd'), +(23448,'spell_gen_gadgetzan_transporter_backfire'), +(23453,'spell_gen_gnomish_transporter'), +(25860,'spell_item_reindeer_transformation'), +(28089,'spell_thaddius_polarity_shift'), +(29200,'spell_item_purify_helboar_meat'), +(29858,'spell_warl_soulshatter'), +(30458,'spell_item_nigh_invulnerability'), +(30507,'spell_item_poultryizer'), +(31225,'spell_item_shimmering_vessel'), +(35745,'spell_item_socrethars_stone'), +(37674,'spell_gen_chaos_blast'), +(39090,'spell_capacitus_polarity_charge'), +(39093,'spell_capacitus_polarity_charge'), +(39096,'spell_capacitus_polarity_shift'), +(42784,'spell_astromancer_wrath_of_the_astromancer'), +(43723,'spell_item_demon_broiled_surprise'), +(44875,'spell_item_complete_raptor_capture'), +(47170,'spell_item_impale_leviroth'), +(49357,'spell_item_brewfest_mount_transformation'), +(50243,'spell_item_teach_language'), +(51582,'spell_item_rocket_boots'), +(51961,'spell_item_chicken_cover'), +(52759,'spell_sha_ancestral_awakening_proc'), +(52845,'spell_item_brewfest_mount_transformation'), +(53808,'spell_item_pygmy_oil'), +(54577,'spell_item_uded'), +(54171,'spell_pal_divine_storm_dummy'), +(55004,'spell_item_nitro_boots'), +(64385,'spell_item_unusual_compass'), +(-1464,'spell_warr_slam'), +(-5308,'spell_warr_execute'), +(12809,'spell_warr_concussion_blow'), +(23881,'spell_warr_bloodthirst'), +(-1454,'spell_warl_life_tap'), +(-50286,'spell_dru_starfall_dummy'), +(8171,'spell_sha_cleansing_totem_pulse'), +(52041,'spell_sha_healing_stream_totem'), +(52046,'spell_sha_healing_stream_totem'), +(52047,'spell_sha_healing_stream_totem'), +(52048,'spell_sha_healing_stream_totem'), +(52049,'spell_sha_healing_stream_totem'), +(52050,'spell_sha_healing_stream_totem'), +(52059,'spell_sha_healing_stream_totem'), +(52060,'spell_sha_healing_stream_totem'), +(52061,'spell_sha_healing_stream_totem'), +(52031,'spell_sha_mana_spring_totem'), +(52033,'spell_sha_mana_spring_totem'), +(52034,'spell_sha_mana_spring_totem'), +(52035,'spell_sha_mana_spring_totem'), +(52036,'spell_sha_mana_spring_totem'), +(58778,'spell_sha_mana_spring_totem'), +(58779,'spell_sha_mana_spring_totem'), +(58780,'spell_sha_mana_spring_totem'), +(60103,'spell_sha_lava_lash'), +(-49998,'spell_dk_death_strike'), +(-66188,'spell_dk_death_strike'), +(-47541,'spell_dk_death_coil'), +(52375,'spell_dk_death_coil'), +(59134,'spell_dk_death_coil'), +(-62900,'spell_dk_death_coil'), +(49560,'spell_dk_death_grip'), +(62324,'spell_vehicle_throw_passenger'); diff --git a/sql/old/3.3.5a/2012_02_18_01_world_spell_dbc.sql b/sql/old/3.3.5a/2012_02_18_01_world_spell_dbc.sql new file mode 100644 index 00000000000..b343399d7f2 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_01_world_spell_dbc.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_dbc` WHERE `id`=31980; +INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES +(31980,0,0,328064,1024,4,268894208,0,0,0,0,0,0,0,1,0,0,101,0,0,14,14,0,13,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,15,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,4,0,0,0,0,1,0,0,0,1,"Righteous Defense Trigger Spell"); diff --git a/sql/old/3.3.5a/2012_02_18_02_world_gossip.sql b/sql/old/3.3.5a/2012_02_18_02_world_gossip.sql new file mode 100644 index 00000000000..47882d4eb36 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_02_world_gossip.sql @@ -0,0 +1,52 @@ +-- Gossip for Lore Keeper of Norgannon "Uldaman" for quest 2278 "The Platinum Discs" +UPDATE `creature_template` SET `gossip_menu_id`=562 WHERE `entry`=7172; + +-- SAI for Lore Keeper of Norgannon +SET @ENTRY := 7172; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,576,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Lore Keeper of Norgannon - On gossip option select - close gossip'), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,26,2278,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Lore Keeper of Norgannon - On gossip option select - give quest credit'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=562 AND `SourceEntry`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,562,0,0,9,2278,0,0,0,'','Show gossip option if player has quest 2278 but not complete'); + +DELETE FROM `gossip_menu` WHERE `entry` BETWEEN 561 AND 576; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(561,1080), +(562,1079), +(563,1081), +(564,1082), +(565,1083), +(566,1084), +(567,1085), +(568,1086), +(569,1087), +(570,1088), +(571,1089), +(572,1090), +(573,1091), +(574,1092), +(575,1093), +(576,1094); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 561 AND 576; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(561,0,0,'What is a "subterranean being matrix"?',1,1,563,0,0,0,''), +(562,0,0,'Who are the Earthen?',1,1,561,0,0,0,''), +(563,0,0,'What are the anomalies you speak of?',1,1,564,0,0,0,''), +(564,0,0,'What is a "resilient foundation of construction"?',1,1,565,0,0,0,''), +(565,0,0,'So... the Earthen were made out of stone?',1,1,566,0,0,0,''), +(566,0,0,'Anything else I should know about the Earthen?',1,1,567,0,0,0,''), +(567,0,0,'I think I understand the Creators'' design intent for the Earthen now. What are the Earthen''s anomalies that you spoke of earlier?',1,1,568,0,0,0,''), +(568,0,0,'What high-stress environments would cause the Earthen to destabilize?',1,1,569,0,0,0,''), +(569,0,0,'What happens when the Earthen destabilize?',1,1,570,0,0,0,''), +(570,0,0,'Troggs?! Are the troggs you mention the same as the ones in the world today?',1,1,571,0,0,0,''), +(571,0,0,'You mentioned two results when the Earthen destabilize. What is the second?',1,1,572,0,0,0,''), +(572,0,0,'Dwarves!!! Now you''re telling me that dwarves originally came from the Earthen?!',1,1,573,0,0,0,''), +(573,0,0,'These dwarves are the same ones today, yes? Do dwarves maintain any other links to the Earthen?',1,1,574,0,0,0,''), +(574,0,0,'Who are the Creators?',1,1,575,0,0,0,''), +(575,0,0,'This is a lot to think about.',1,1,576,0,0,0,''), +(576,0,0,'I will access the discs now.',1,1,0,0,0,0,''); diff --git a/sql/old/3.3.5a/2012_02_18_03_world_gossip.sql b/sql/old/3.3.5a/2012_02_18_03_world_gossip.sql new file mode 100644 index 00000000000..990006f5098 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_03_world_gossip.sql @@ -0,0 +1,1068 @@ +-- XXXXXXXXXXXXXXXXXXXX +-- X Rogue Trainers X +-- XXXXXXXXXXXXXXXXXXXX + +UPDATE `creature_template` SET `gossip_menu_id`=410 WHERE `entry`=1234; +UPDATE `creature_template` SET `gossip_menu_id`=85 WHERE `entry`=2122; +UPDATE `creature_template` SET `gossip_menu_id`=3984 WHERE `entry`=6707; +UPDATE `creature_template` SET `gossip_menu_id`=4512 WHERE `entry`=3328; +UPDATE `creature_template` SET `gossip_menu_id`=4575 WHERE `entry`=4215; +UPDATE `creature_template` SET `gossip_menu_id`=4577 WHERE `entry`=4214; +UPDATE `creature_template` SET `gossip_menu_id`=4658 WHERE `entry`=1411; + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 85; +SET @TEXTYES := 581; +SET @TEXTNO := 4796; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 141; +SET @TEXTYES := 638; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 381; +SET @TEXTYES := 878; +SET @TEXTNO := 4799; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I am in need of training, Keryn.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 410; +SET @TEXTYES := 4795; +SET @TEXTNO := 4797; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 411; +SET @TEXTYES := 908; +SET @TEXTNO := 4798; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Good day, Hulfdan, I am looking for training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 436; +SET @TEXTYES := 934; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Hello! I am a Rogue in need of training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 3984; +SET @TEXTYES := 4838; +SET @TEXTNO := 4839; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Yes, I have. Teach me.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4502; +SET @TEXTYES := 4835; +SET @TEXTNO := 4837; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4512; +SET @TEXTYES := 638; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4513; +SET @TEXTYES := 638; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4540; +SET @TEXTYES := 581; +SET @TEXTNO := 4796; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4541; +SET @TEXTYES := 581; +SET @TEXTNO := 4796; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4542; +SET @TEXTYES := 581; +SET @TEXTNO := 4796; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4561; +SET @TEXTYES := 5695; +SET @TEXTNO := 4833; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I'm lookin' for rogue trainin'.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4562; +SET @TEXTYES := 4834; +SET @TEXTNO := 4833; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I'm lookin' for rogue trainin'.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4575; +SET @TEXTYES := 4795; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4576; +SET @TEXTYES := 4795; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4577; +SET @TEXTYES := 4795; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4658; +SET @TEXTYES := 6165; +SET @TEXTNO := 6164; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4659; +SET @TEXTYES := 4835; +SET @TEXTNO := 4837; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4676; +SET @TEXTYES := 4835; +SET @TEXTNO := 4833; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 4690; +SET @TEXTYES := 4795; +SET @TEXTNO := 4793; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 5061; +SET @TEXTYES := 4835; +SET @TEXTNO := 4837; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- Gossip Condition for Rogue Trainers +SET @GOSSIP := 6650; +SET @TEXTYES := 9188; +SET @TEXTNO := 9187; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), +(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I require rogue training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), +(@GOSSIP,4,0,"",1,1,0,0,0,0,''); + +-- XXXXXXXXXXXXXXXXXXXXX +-- X Hunter Trainers X +-- XXXXXXXXXXXXXXXXXXXXX + +UPDATE `creature_template` SET `gossip_menu_id`=4657 WHERE `entry`=1404; +UPDATE `creature_template` SET `gossip_menu_id`=4695 WHERE `entry`=3596; +UPDATE `creature_template` SET `gossip_menu_id`=4009 WHERE `entry`=3601; +UPDATE `creature_template` SET `gossip_menu_id`=6652 WHERE `entry`=16672; +UPDATE `creature_template` SET `gossip_menu_id`=4101 WHERE `entry`=987; + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4008; +SET @TEXTYES := 4863; +SET @TEXTNO := 4993; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I'd like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4009; +SET @TEXTYES := 4316; +SET @TEXTNO := 4993; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I am in need of training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4010; +SET @TEXTYES := 4866; +SET @TEXTNO := 5003; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I have come for training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4011; +SET @TEXTYES := 4867; +SET @TEXTNO := 4998; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I am in need of training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4012; +SET @TEXTYES := 4868; +SET @TEXTNO := 4998; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I am a hunter and wish to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4017; +SET @TEXTYES := 4888; +SET @TEXTNO := 4888; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"Please train me.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4023; +SET @TEXTYES := 4889; +SET @TEXTNO := 4996; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I wish to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4101; +SET @TEXTYES := 5001; +SET @TEXTNO := 5002; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4472; +SET @TEXTYES := 4893; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4473; +SET @TEXTYES := 4893; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4474; +SET @TEXTYES := 4893; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4506; +SET @TEXTYES := 4987; +SET @TEXTNO := 5004; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I wish to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4524; +SET @TEXTYES := 4997; +SET @TEXTNO := 4998; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4549; +SET @TEXTYES := 4999; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4550; +SET @TEXTYES := 4890; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I am here for training.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4551; +SET @TEXTYES := 4999; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4647; +SET @TEXTYES := 4997; +SET @TEXTNO := 4998; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4648; +SET @TEXTYES := 4987; +SET @TEXTNO := 5004; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I wish to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4657; +SET @TEXTYES := 5001; +SET @TEXTNO := 5002; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4675; +SET @TEXTYES := 4999; +SET @TEXTNO := 5000; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4693; +SET @TEXTYES := 6160; +SET @TEXTNO := 4993; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I'd like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 4695; +SET @TEXTYES := 4863; +SET @TEXTNO := 4993; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I'd like to train.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 6652; +SET @TEXTYES := 9190; +SET @TEXTNO := 9189; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 7262; +SET @TEXTYES := 8585; +SET @TEXTNO := 8586; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Gossip Condition for Hunter Trainers +SET @GOSSIP := 7368; +SET @TEXTYES := 8804; +SET @TEXTNO := 8823; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), +(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); +-- Add Any Missing Gossip Menu item +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); +DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(@GOSSIP,0,3,"I am a hunter in need of training, Acteon.",5,16,0,0,0,0,''), +(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), +(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); + +-- Add some missing gossip from sniff for Zabra'jin in Zangermarsh +UPDATE `creature_template` SET `gossip_menu_id`=7601 WHERE `entry`=18013; +UPDATE `creature_template` SET `gossip_menu_id`=7602 WHERE `entry`=18014; +UPDATE `creature_template` SET `gossip_menu_id`=7608 WHERE `entry`=18015; +UPDATE `creature_template` SET `gossip_menu_id`=7603 WHERE `entry`=18017; +UPDATE `creature_template` SET `gossip_menu_id`=7609 WHERE `entry`=18018; +UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=18244; +UPDATE `creature_template` SET `gossip_menu_id`=7722 WHERE `entry`=18564; + +DELETE FROM `gossip_menu` WHERE `entry` IN (7601,7602,7603,7608,7609,7722,7946,9821); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(7601,9248),(7602,9249),(7603,9250),(7608,9259), +(7609,9260),(7722,9431),(7946,9752),(9821,13584); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7603,7608,7609) AND `id` IN (0); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7609,7722,9821) AND `id` IN (1); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(7603,0,1,'I would like to buy from you.',3,128,0,0,0,0,''), +(7608,0,1,'I wish to purchase tradeskill supplies.',3,128,0,0,0,0,''), +(7609,0,1,'I wish to purchase fishing supplies.',3,128,0,0,0,0,''), +(7609,1,3,'Give me some pointers on my fishing technique.',5,16,0,0,0,0,''), +(7722,1,1,'I have marks to redeem!',3,128,0,0,0,0,''), +(9821,1,1,'I''m looking for a lost companion.',14,4194304,0,0,0,0,''); + +-- Add some missing gossip from sniff for Thunderlord Stronghold in Blade's Edge Mountains +UPDATE `creature_template` SET `gossip_menu_id`=9856 WHERE `entry`=19471; +UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=19476; +UPDATE `creature_template` SET `gossip_menu_id`=5856 WHERE `entry`=19478; +UPDATE `creature_template` SET `gossip_menu_id`=8283 WHERE `entry`=21311; +UPDATE `creature_template` SET `gossip_menu_id`=8406 WHERE `entry`=21950; +UPDATE `creature_template` SET `gossip_menu_id`=8244 WHERE `entry`=21147; +UPDATE `creature_template` SET `gossip_menu_id`=8525 WHERE `entry`=21984; +UPDATE `creature_template` SET `gossip_menu_id`=8239 WHERE `entry`=21117; + +DELETE FROM `gossip_menu` WHERE `entry` IN (8283,8406,8244,8525,8239); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(8283,10322),(8406,10508),(8244,10259),(8525,10661),(8239,10251); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9856) AND `id` IN (0); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(9856,0,1,'Show me what you have for sale.',3,128,0,0,0,0,''); + diff --git a/sql/old/3.3.5a/2012_02_18_04_world_spell_script_names.sql b/sql/old/3.3.5a/2012_02_18_04_world_spell_script_names.sql new file mode 100644 index 00000000000..8fa5bc55197 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_04_world_spell_script_names.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (52059,52060,52061); +DELETE FROM `spell_script_names` WHERE `spell_id` IN (58759,58760,58761); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(58759,'spell_sha_healing_stream_totem'), +(58760,'spell_sha_healing_stream_totem'), +(58761,'spell_sha_healing_stream_totem'); diff --git a/sql/old/3.3.5a/2012_02_18_05_world_creatures.sql b/sql/old/3.3.5a/2012_02_18_05_world_creatures.sql new file mode 100644 index 00000000000..3fdac99c854 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_05_world_creatures.sql @@ -0,0 +1,3 @@ +UPDATE `creature` SET `MovementType`=1 WHERE `spawndist`!=0 AND `MovementType`=2 AND `guid` IN (49123,49124,49125,49127,49128,49129,49143,49144,49145,49146,49150,49151,49154,49156,49157,49158,49167,49186,49187,49188,49318,49319,49664,49665,49751,49762,51398,51402,51422,51423,123148,127753,137490,137491,202314); +UPDATE `creature` SET `MovementType`=0 WHERE `spawndist`=0 AND `MovementType`=2 AND `guid` IN (49123,49124,49125,49127,49128,49129,49143,49144,49145,49146,49150,49151,49154,49156,49157,49158,49167,49186,49187,49188,49318,49319,49664,49665,49751,49762,51398,51402,51422,51423,123148,127753,137490,137491,202314); +UPDATE `creature_template` SET `MovementType`=0 WHERE `MovementType`=2 AND `entry` NOT IN (21657,30007); diff --git a/sql/old/3.3.5a/2012_02_18_06_world_gossip.sql b/sql/old/3.3.5a/2012_02_18_06_world_gossip.sql new file mode 100644 index 00000000000..e3385ceb5b0 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_06_world_gossip.sql @@ -0,0 +1,166 @@ +-- Add some missing gossip to Nagrand From UDB +UPDATE `creature_template` SET `gossip_menu_id`=7675 WHERE `entry`=18261; +UPDATE `creature_template` SET `gossip_menu_id`=7723 WHERE `entry`=18333; +UPDATE `creature_template` SET `gossip_menu_id`=7719 WHERE `entry`=18417; +UPDATE `creature_template` SET `gossip_menu_id`=7724 WHERE `entry`=18581; +UPDATE `creature_template` SET `gossip_menu_id`=7625 WHERE `entry`=18265; +UPDATE `creature_template` SET `gossip_menu_id`=7626 WHERE `entry`=18276; +UPDATE `creature_template` SET `gossip_menu_id`=7631 WHERE `entry`=18335; +UPDATE `creature_template` SET `gossip_menu_id`=7699 WHERE `entry`=18471; +UPDATE `creature_template` SET `gossip_menu_id`=7563 WHERE `entry`=18074; +UPDATE `creature_template` SET `gossip_menu_id`=7592 WHERE `entry`=18200; +UPDATE `creature_template` SET `gossip_menu_id`=7579 WHERE `entry`=18180; +UPDATE `creature_template` SET `gossip_menu_id`=7607 WHERE `entry`=18218; +UPDATE `creature_template` SET `gossip_menu_id`=7704 WHERE `entry`=18482; +UPDATE `creature_template` SET `gossip_menu_id`=8493, `npcflag`=`npcflag`|1 WHERE `entry`=22113; + +DELETE FROM `gossip_menu` WHERE `entry`=7563 AND `text_id`=9181; +DELETE FROM `gossip_menu` WHERE `entry`=7578 AND `text_id`=9220; +DELETE FROM `gossip_menu` WHERE `entry`=7579 AND `text_id` IN (9219,9221,9256,9257); +DELETE FROM `gossip_menu` WHERE `entry`=7592 AND `text_id` IN (9240,9283,9284); +DELETE FROM `gossip_menu` WHERE `entry`=7607 AND `text_id` IN (9258,9286); +DELETE FROM `gossip_menu` WHERE `entry`=7625 AND `text_id`=9287; +DELETE FROM `gossip_menu` WHERE `entry`=7626 AND `text_id`=9288; +DELETE FROM `gossip_menu` WHERE `entry`=7631 AND `text_id`=9312; +DELETE FROM `gossip_menu` WHERE `entry`=7675 AND `text_id` IN (9361,9369); +DELETE FROM `gossip_menu` WHERE `entry`=7676 AND `text_id`=9368; +DELETE FROM `gossip_menu` WHERE `entry`=7677 AND `text_id`=9367; +DELETE FROM `gossip_menu` WHERE `entry`=7678 AND `text_id`=9366; +DELETE FROM `gossip_menu` WHERE `entry`=7679 AND `text_id`=9365; +DELETE FROM `gossip_menu` WHERE `entry`=7680 AND `text_id`=9364; +DELETE FROM `gossip_menu` WHERE `entry`=7681 AND `text_id`=9363; +DELETE FROM `gossip_menu` WHERE `entry`=7682 AND `text_id`=9362; +DELETE FROM `gossip_menu` WHERE `entry`=7699 AND `text_id`=9394; +DELETE FROM `gossip_menu` WHERE `entry`=7704 AND `text_id`=9405; +DELETE FROM `gossip_menu` WHERE `entry`=7705 AND `text_id`=9406; +DELETE FROM `gossip_menu` WHERE `entry`=7714 AND `text_id`=9424; +DELETE FROM `gossip_menu` WHERE `entry`=7715 AND `text_id`=9423; +DELETE FROM `gossip_menu` WHERE `entry`=7716 AND `text_id`=9422; +DELETE FROM `gossip_menu` WHERE `entry`=7717 AND `text_id`=9421; +DELETE FROM `gossip_menu` WHERE `entry`=7718 AND `text_id`=9420; +DELETE FROM `gossip_menu` WHERE `entry`=7719 AND `text_id` IN (9419,9427); +DELETE FROM `gossip_menu` WHERE `entry`=7723 AND `text_id`=9429; +DELETE FROM `gossip_menu` WHERE `entry`=7724 AND `text_id`=9433; +DELETE FROM `gossip_menu` WHERE `entry`=8393 AND `text_id`=10493; +DELETE FROM `gossip_menu` WHERE `entry`=8394 AND `text_id`=10492; +DELETE FROM `gossip_menu` WHERE `entry`=8394 AND `text_id`=10614; -- was incorrect in the db +DELETE FROM `gossip_menu` WHERE `entry`=8395 AND `text_id`=10494; +DELETE FROM `gossip_menu` WHERE `entry`=8395 AND `text_id`=10615; -- was incorrect in the db +DELETE FROM `gossip_menu` WHERE `entry`=8396 AND `text_id`=10495; +DELETE FROM `gossip_menu` WHERE `entry`=8396 AND `text_id`=10616; -- was incorrect in the db +DELETE FROM `gossip_menu` WHERE `entry`=8398 AND `text_id`=10497; +DELETE FROM `gossip_menu` WHERE `entry`=8493 AND `text_id` IN (10606,10655,10854); +DELETE FROM `gossip_menu` WHERE `entry`=8497 AND `text_id`=10616; +DELETE FROM `gossip_menu` WHERE `entry`=8498 AND `text_id`=10615; +DELETE FROM `gossip_menu` WHERE `entry`=8499 AND `text_id`=10614; +DELETE FROM `gossip_menu` WHERE `entry` BETWEEN 21296 AND 21303; -- the old menus assigned to Lantresor which were not sniffed +DELETE FROM `gossip_menu` WHERE `entry` BETWEEN 21304 AND 21309; -- the old menus assigned to Altruis which were not sniffed +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(7563,9181), +(7578,9220), +(7579,9219),(7579,9221),(7579,9256),(7579,9257), +(7592,9240),(7592,9283),(7592,9284), +(7625,9287), +(7626,9288), +(7631,9312), +(7699,9394), +(7607,9258),(7607,9286), +(7675,9361),(7675,9369), +(7676,9368), +(7677,9367), +(7678,9366), +(7679,9365), +(7680,9364), +(7681,9363), +(7682,9362), +(7704,9405), +(7705,9406), +(7714,9424), +(7715,9423), +(7716,9422), +(7717,9421), +(7718,9420), +(7719,9419),(7719,9427), +(7723,9429), +(7724,9433), +(8394,10492), +(8393,10493), +(8395,10494), +(8396,10495), +(8398,10497), +(8493,10606),(8493,10655),(8493,10854), +(8497,10616), +(8498,10615), +(8499,10614); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7579,7704,7715,7716,7717,7718,7719,8393,8394,8395,8396,8398,8497,8498,8499) AND `id`=0; +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7719,7724) AND `id`=1; +DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 7675 AND 7682 AND `id`=0; +UPDATE `gossip_menu_option` SET `action_menu_id`=8499 WHERE `menu_id`=8397; -- was incorrect +DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 21296 AND 21303; -- the old options assigned to Lantresor which were not sniffed +DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 21304 AND 21309; -- the old options assigned to Altruis which was not sniffed +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(7579,0,0,'Hemet Nesingwary, what are you doing here in the Outland?',1,1,7578,0,0,0,''), +(7704,0,0,'Empoor, you''re going to tell me what I want to know, or else!',1,1,0,0,0,0,''), +(7715,0,0,'Forge camps?',1,1,7714,0,0,0,''), +(7716,0,0,'How do you see them now?',1,1,7715,0,0,0,''), +(7717,0,0,'And now?',1,1,7716,0,0,0,''), +(7718,0,0,'Legion?',1,1,7717,0,0,0,''), +(7719,0,0,'I see twisted steel and smell sundered earth.',1,1,7718,0,0,0,''), +(7719,1,0,'Tell me about the demon hunter training grounds at the Ruins of Karabor.',1,1,8394,0,0,0,''), +(7724,1,1,'I have marks to redeem!',3,128,0,0,0,0,''), +(7675,0,0,'I have killed many of your ogres, Lantresor. I have no fear.',1,1,7682,0,0,0,''), +(7682,0,0,'Should I know? You look like an orc to me.',1,1,7681,0,0,0,''), +(7681,0,0,'And the other half?',1,1,7680,0,0,0,''), +(7680,0,0,'I have heard of your kind, but I never thought to see the day when I would meet a half-breed.',1,1,7679,0,0,0,''), +(7679,0,0,'My apologies. I did not mean to offend. I am here on behalf of my people.',1,1,7678,0,0,0,''), +(7678,0,0,'My people ask that you pull back your Boulderfist ogres and cease all attacks on our territories. In return, we will also pull back our forces.',1,1,7677,0,0,0,''), +(7677,0,0,'We will fight you until the end, then, Lantresor. We will not stand idly by as you pillage our towns and kill our people.',1,1,7676,0,0,0,''), +(7676,0,0,'What do I need to do?',1,1,0,0,0,0,''), +(8394,0,0,'I''m listening.',1,1,8393,0,0,0,''), +(8393,0,0,'Go on, please.',1,1,8395,0,0,0,''), +(8395,0,0,'Interesting.',1,1,8396,0,0,0,''), +(8396,0,0,'That''s quite a story.',1,1,8398,0,0,0,''), +(8398,0,0,'There was something else I wanted to ask you, Altruis.',1,1,7719,0,0,0,''), +(8499,0,0,'But you are dragons! How could orcs do this to you?',1,1,8498,0,0,0,''), +(8498,0,0,'Your mate?',1,1,8497,0,0,0,''), +(8497,0,0,'I have battled many beasts, dragon. I will help you.',1,1,0,0,0,0,''); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7579 AND `SourceEntry` IN (9221,9256,9257); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7592 AND `SourceEntry` IN (9283,9284); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7607 AND `SourceEntry`=9286; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7675 AND `SourceEntry`=9369; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7719 AND `SourceEntry`=9427; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=8493 AND `SourceEntry` IN (10655,10854); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7675 AND `SourceEntry`=0; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (7704,7719) AND `SourceEntry`=0; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (7719) AND `SourceEntry`=1; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21304; -- condition for Altruis' gossip that wasn't sniffed +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21295; -- condition for Lantresor's gossip that wasn't sniffed +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,7579,9221,0,0,8,208,0,0,0,0,'','Show different gossip if player has rewarded quest 208'), +(14,7579,9256,0,0,8,9851,0,0,0,0,'','Show different gossip if player has rewarded quest 9851'), +(14,7579,9257,0,0,8,9852,0,0,0,0,'','Show different gossip if player has rewarded quest 9852'), +(14,7592,9283,0,0,8,9854,0,0,0,0,'','Show different gossip if player has rewarded quest 9854'), +(14,7592,9284,0,0,8,9856,0,0,0,0,'','Show different gossip if player has rewarded quest 9856'), +(14,7607,9286,0,0,8,9859,0,0,0,0,'','Show different gossip if player has rewarded quest 9859'), +(14,7675,9369,0,0,8,10107,0,0,0,0,'','Show different gossip if player has rewarded quest 10107'), +(14,7675,9369,0,1,8,10108,0,0,0,0,'','Show different gossip if player has rewarded quest 10108'), +(14,7719,9427,0,0,8,9991,0,0,0,0,'','Show different gossip if player has rewarded quest 9991'), +(14,8493,10655,0,0,8,10870,0,0,0,0,'','Show different gossip if player has rewarded quest 10870'), +(14,8493,10854,0,0,8,11012,0,0,0,0,'','Show different gossip if player has rewarded quest 11012'), +(15,7675,0,0,0,9,10107,0,0,0,0,'','Show gossip option if player has quest 10107 but not complete'), +(15,7675,0,0,1,9,10108,0,0,0,0,'','Show gossip option if player has quest 10108 but not complete'), +(15,7704,0,0,0,9,9978,0,0,0,0,'','Show gossip option if player has quest 9978 but not complete'), +(15,7719,0,0,0,8,9991,0,0,1,0,'','Show gossip option if player has not rewarded quest 9991'), +(15,7719,1,0,0,9,10646,0,0,0,0,'','Show gossip option if player has quest 10646 but not complete'); + +UPDATE `smart_scripts` SET `event_param1`=7715 WHERE `entryorguid`=18417 AND `id` IN (0,1); -- correct Altruis' script +UPDATE `smart_scripts` SET `event_param1`=8396 WHERE `entryorguid`=18417 AND `id`=2; + +UPDATE `smart_scripts` SET `event_param1`=8497 WHERE `entryorguid`=21657 AND `id`=0; -- correct Neltharaku's script + +UPDATE `smart_scripts` SET `link`=3, `event_param1`=7676 WHERE `entryorguid`=18261 AND `id` IN (1,2); -- correct Lantresor's script +DELETE FROM `smart_scripts` WHERE `entryorguid`=18261 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(18261,0,3,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Lantresor - On gossip select - Close gossip'); diff --git a/sql/old/3.3.5a/2012_02_18_07_world_gossip.sql b/sql/old/3.3.5a/2012_02_18_07_world_gossip.sql new file mode 100644 index 00000000000..6246f12cefc --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_07_world_gossip.sql @@ -0,0 +1,44 @@ +-- Fallen Hero of the Horde http://old.wowhead.com/npc=7572 +DELETE FROM `gossip_menu` WHERE `entry`=840 AND `text_id`=1451; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (840,1451); +DELETE FROM `gossip_menu` WHERE `entry`=880 AND `text_id`=1452; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (880,1452); +DELETE FROM `gossip_menu` WHERE `entry`=881 AND `text_id`=1456; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (881,1456); +DELETE FROM `gossip_menu` WHERE `entry`=882 AND `text_id`=1455; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (882,1455); +DELETE FROM `gossip_menu` WHERE `entry`=883 AND `text_id`=1454; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (883,1454); +DELETE FROM `gossip_menu` WHERE `entry`=884 AND `text_id`=1453; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (884,1453); +-- Text Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=840 AND `SourceEntry` IN (1391); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,840,1391,0,8,2784,0,0,0,'','Show gossip text if player has quest 2801 or 2784 completed'), -- It's hard to imagine that so much death and despair could be confined to such a small area; yet beyond the swamp is a land plagued by chaos and destruction.$B$BWatch your step, adventurer. The Blasted Lands are the final resting place to far greater beings than you. +(14,840,1391,1,8,2801,0,0,0,'','Show gossip text if player has quest 2801 or 2784 completed'); -- It's hard to imagine that so much death and despair could be confined to such a small area; yet beyond the swamp is a land plagued by chaos and destruction.$B$BWatch your step, adventurer. The Blasted Lands are the final resting place to far greater beings than you. +-- Gossip option conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=840; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,840,0,0,9,2784,0,0,0,'','Show gossip option if player has quest 2784 but not complete'), +(15,840,1,0,9,2801,0,0,0,'','Show gossip option if player has quest 2801 but not complete'), +(15,840,2,0,9,2702,0,0,0,'','Show gossip option if player has quest 2702 but not complete'); +-- Add Any Missing Gossip Option +DELETE FROM `gossip_menu_option` WHERE `menu_id`=840 AND `id` IN (0,1); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (880,881,882,883,884) AND `id` IN (0); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(840,0,0,"Please continue, Hero...",1,1,880,0,0,0,''), +(840,1,0,"Please continue, Hero...",1,1,880,0,0,0,''), +(880,0,0,"What could be worse than death?",1,1,884,0,0,0,''), +(881,0,0,"I shall.",1,1,0,0,0,0,''), +(882,0,0,"You can count on me, Hero.",1,1,881,0,0,0,''), +(883,0,0,"What are the stones of binding?",1,1,882,0,0,0,''), +(884,0,0,"Subordinates?",1,1,883,0,0,0,''); +-- Fallen Hero of the Horde SAI +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=7572; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=7572 AND `source_type`=0); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(7572,0,0,1,62,0,100,0,881,0,0,0,26,2784,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - complete quest 2784'), +(7572,0,1,2,61,0,100,0,0,0,0,0,26,2801,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - complete quest 2801'), +(7572,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - Close Gossip'), +(7572,0,3,4,62,0,100,0,840,2,0,0,12,7750,1,180000,0,0,0,8,0,0,0,-10630.3,-2987.05,28.96,4.54,'Fallen Hero of the Horde - On Gossip option select - Spawn Corporal Thund Splithoof'), +(7572,0,4,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - Close Gossip'); diff --git a/sql/old/3.3.5a/2012_02_18_08_world_gossip.sql b/sql/old/3.3.5a/2012_02_18_08_world_gossip.sql new file mode 100644 index 00000000000..a9fef9bcd76 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_18_08_world_gossip.sql @@ -0,0 +1,5 @@ +-- Fix mistake in Fallen Hero of the Horde gossip update +UPDATE `conditions` SET `ConditionValue1`=2784,`Comment`='Show gossip text if player has quest 2801 or 2784 completed' WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=840 AND `ConditionValue1`=2704; +UPDATE `conditions` SET `Comment`='Show gossip text if player has quest 2801 or 2784 completed' WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=840 AND `ConditionValue1`=2801; +UPDATE `conditions` SET `ConditionValue1`=2784,`Comment`='Show gossip option if player has quest 2784 but not complete' WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=840 AND `ConditionValue1`=2704; +UPDATE `smart_scripts` SET `action_param1`=2784 WHERE `entryorguid`=7572 AND `id`=0; diff --git a/sql/old/3.3.5a/2012_02_19_00_auth_account.sql b/sql/old/3.3.5a/2012_02_19_00_auth_account.sql new file mode 100644 index 00000000000..a5b48ede3b4 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_00_auth_account.sql @@ -0,0 +1,2 @@ +ALTER TABLE `account` + ADD COLUMN `os` VARCHAR(4) DEFAULT '' NOT NULL AFTER `locale`; diff --git a/sql/old/3.3.5a/2012_02_19_00_characters_warden_action.sql b/sql/old/3.3.5a/2012_02_19_00_characters_warden_action.sql new file mode 100644 index 00000000000..587f65fedc5 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_00_characters_warden_action.sql @@ -0,0 +1,7 @@ +DROP TABLE IF EXISTS `warden_action`; + +CREATE TABLE `warden_action` ( + `wardenId` smallint(5) unsigned NOT NULL, + `action` tinyint(3) unsigned DEFAULT NULL, + PRIMARY KEY (`wardenId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sql/old/3.3.5a/2012_02_19_00_world_quest_template.sql b/sql/old/3.3.5a/2012_02_19_00_world_quest_template.sql new file mode 100644 index 00000000000..76ab51f803b --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_00_world_quest_template.sql @@ -0,0 +1,14 @@ +-- Shadowmourne quest chain fix by nelegalno + +-- Limit quests to Warrior, Paladin and Death Knight classes +UPDATE `quest_template` SET `RequiredClasses` = 35 WHERE `Id` IN (24545, 24743, 24547, 24749, 24756, 24757, 24548, 24748); + +-- Quest relations +UPDATE `quest_template` SET `NextQuestId` = 24743 WHERE `Id` = 24545; -- The Sacred and the Corrupt +UPDATE `quest_template` SET `NextQuestId` = 24547 WHERE `Id` = 24743; -- Shadow's Edge +UPDATE `quest_template` SET `NextQuestId` = 24749 WHERE `Id` = 24547; -- A Feast of Souls +UPDATE `quest_template` SET `NextQuestId` = 24756 WHERE `Id` = 24749; -- Unholy Infusion +UPDATE `quest_template` SET `NextQuestId` = 24757 WHERE `Id` = 24756; -- Blood Infusion +UPDATE `quest_template` SET `NextQuestId` = 24548 WHERE `Id` = 24757; -- Frost Infusion +UPDATE `quest_template` SET `NextQuestId` = 24549 WHERE `Id` = 24548; -- The Splintered Throne +UPDATE `quest_template` SET `NextQuestId` = 24748 WHERE `Id` = 24549; -- Shadowmourne... to The Lich King's Last Stand diff --git a/sql/old/3.3.5a/2012_02_19_01_world_quest_template.sql b/sql/old/3.3.5a/2012_02_19_01_world_quest_template.sql new file mode 100644 index 00000000000..2f888f08cdd --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_01_world_quest_template.sql @@ -0,0 +1,11 @@ +-- Dire Maul Book Quests + +UPDATE `quest_template` SET `RequiredClasses` = 1 WHERE `Id` = 7499; -- Codex of Defense (18357/7499) +UPDATE `quest_template` SET `RequiredClasses` = 2 WHERE `Id` = 7501; -- The Light and How to Swing It (18359/7501) +UPDATE `quest_template` SET `RequiredClasses` = 4 WHERE `Id` = 7503; -- The Greatest Race of Hunters (18361/7503) +UPDATE `quest_template` SET `RequiredClasses` = 8 WHERE `Id` = 7498; -- Garona: A Study on Stealth and Treachery (18356/7498) +UPDATE `quest_template` SET `RequiredClasses` = 16 WHERE `Id` = 7504; -- Holy Bologna: What the Light Won't Tell You (18362/7504) +UPDATE `quest_template` SET `RequiredClasses` = 64 WHERE `Id` = 7505; -- Frost Shock and You (18363/7505) Closes #4727 +UPDATE `quest_template` SET `RequiredClasses` = 128 WHERE `Id` = 7500; -- The Arcanist's Cookbook (18358/7500) +UPDATE `quest_template` SET `RequiredClasses` = 256 WHERE `Id` = 7502; -- Harnessing Shadows (18360/7502) +UPDATE `quest_template` SET `RequiredClasses` = 1024 WHERE `Id` = 7506; -- The Emerald Dream... (18364/7506) diff --git a/sql/old/3.3.5a/2012_02_19_02_world_gameobject.sql b/sql/old/3.3.5a/2012_02_19_02_world_gameobject.sql new file mode 100644 index 00000000000..88a1f2e3a4c --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_02_world_gameobject.sql @@ -0,0 +1,4 @@ +-- meeting stone for UK +DELETE FROM `gameobject` WHERE `id`=188488; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(245, 188488, 571, 1, 1, 1237.301, -4948.268, 36.02063, 2.495818, 0, 0, 0.9483232, 0.3173059, 300, 0, 1); diff --git a/sql/old/3.3.5a/2012_02_19_03_world_warden_checks.sql b/sql/old/3.3.5a/2012_02_19_03_world_warden_checks.sql new file mode 100644 index 00000000000..3698c461358 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_03_world_warden_checks.sql @@ -0,0 +1,802 @@ +DROP TABLE IF EXISTS `warden_checks`; + +CREATE TABLE `warden_checks` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `type` tinyint(3) unsigned DEFAULT NULL, + `data` varchar(48) DEFAULT NULL, + `str` varchar(20) DEFAULT NULL, + `address` int(10) unsigned DEFAULT NULL, + `length` tinyint(3) unsigned DEFAULT NULL, + `result` varchar(24) DEFAULT NULL, + `comment` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +INSERT INTO `warden_checks`(`id`,`type`,`data`,`str`,`address`,`length`,`result`,`comment`) VALUES +(1,178,'07F223143C69271AA2A851FECF6DC883A9D3A7DBA6FE26CC','',710730,23,'',NULL), +(2,191,'C7D18F99DBC446A4B36E78B9130B6FA2E365B3D2D4199DF5','',28940,17,'',NULL), +(3,191,'AA1A8559776F873F26954F15E49E6041EDC2C3766AD87A59','',21826,11,'',NULL), +(4,178,'5F342A4D0EA9DB35F93FAE6E32670D810F017309817AA7C0','',676970,23,'',NULL), +(5,178,'C57BD89DD447131EA2083784AB4DA8BD58CF3E182F1D8AF6','',690106,23,'',NULL), +(6,191,'69AA85EFE8A1A990DA5ECFED4FAFD5B14F1D52EF2548FD15','',12905,36,'',NULL), +(7,191,'083ECAD073DE2D61E3564B4BF767C9D1F8F15AA0495F5A76','',41096,24,'',NULL), +(8,178,'C774D64EF60AD5A141FC56F3D02AE78AC147770FAE25D8FE','',3037164,22,'',NULL), +(9,191,'502C59CAFEA11E9584C13BFE75F85EB79936AEEE31B44165','',12194860,37,'',NULL), +(10,178,'4FBE8978A662428C616AABD71DA5562E4AC21F54BEB8ADBF','',3037164,22,'',NULL), +(11,178,'83D3F7FD7DCA144AD8219A6A4E20F0CFC6E7EA208C4144FF','',3033068,22,'',NULL), +(12,243,'','',4623652,7,'578B7D08578BF1','Pointer to realmlist address'), +(13,178,'00523153EE2298A8D80D7B26B7067CA7B26AC06FF374FE7B','',673210,23,'',NULL), +(14,191,'91BC368FA14A3FE3E13D0B1056F485F846925E613D8E8903','',12194860,37,'',NULL), +(15,243,'','',10010636,12,'8166443FFF1FFFD9565CD95E',NULL), +(16,178,'8FEFDBC58301AB0E0D0F6EBC5FBDA5ED9A7126873A9AB337','',682394,23,'',NULL), +(17,191,'B40FF92D4F092599EA9014C88B474DE4352C3F1635109882','',448492,48,'',NULL), +(18,191,'42B596FF923054531E4918DC39E08F8564FED16D559B494A','',29852,20,'',NULL), +(19,178,'24291D6733A7CEFA3D54C3BCCAE95D56D8365BAB42AEE1CE','',3037164,22,'',NULL), +(20,178,'6C4E321E2D5A153F2BB664EB6EEDF8D67FDE7ECC8076D087','',3990720,23,'',NULL), +(21,178,'FB649706C8F1AFF5990B5F3118DFE54FF6F9609C6991C161','',3045776,31,'',NULL), +(22,191,'D1B451C906B81261B048FD4025217245950C11660815367F','',28920,23,'',NULL), +(23,191,'40079A1083A6B57E3B713992BD395FB6650B631E4C4B8D4E','',29852,20,'',NULL), +(24,178,'3F8FEFE08CB358D6613656AFDB498AB8C599BA18B5574FB6','',682378,23,'',NULL), +(25,191,'EECA71B5536EE1992FD7825A5CCC4B7F9F3B413C0DA498B6','',29884,20,'',NULL), +(26,191,'B8786BFF2421ED1F1FB30F3F0BAF671FC1DAD5B3B33124C8','',28956,17,'',NULL), +(27,191,'BF0C842D635D9D8B3F6FF84EF6DF7C963C485EBAF02D17B0','',28920,23,'',NULL), +(28,191,'9672ED2A27C4972E04DF4471C95492C721024E241995170C','',36924,24,'',NULL), +(29,191,'63532B056020A261251BD24AB026BBC5D4468AF863136044','',17906,11,'',NULL), +(30,178,'7D38C80FEAB10B857A4A7BEF15D27A58FB43FD875E29C73C','',3990720,23,'',NULL), +(31,178,'B158752316672A90BF29846E7AD64BA4FD1699C638BFD3B6','',2299116,33,'',NULL), +(32,178,'4549AE7CA28700562D996CBC78FA7341DC05F644C01474E4','',3000288,31,'',NULL), +(33,178,'EE77806A4F5723FD9C6FC6F43308C8AB448E0A139CB43700','',690106,23,'',NULL), +(34,191,'046D6EA3E99E275F51CAA591BD8C478B6F964A3072018F43','',21660,15,'',NULL), +(35,178,'B1682CE919907AD7D8990F3D8272CFF24A996162565D52B4','',676970,23,'',NULL), +(36,178,'22E057649A8BF1D9672841EF47A4DA175AAC082FFEF059DA','',710730,23,'',NULL), +(37,178,'7BA62D5F5CFEB545D1AE646962F4EB9A91B93EF8FFD5D1B0','',710554,23,'',NULL), +(38,178,'702802D919D9E5C3FD42CA9188936C73E47F87CFA419025A','',3033068,22,'',NULL), +(39,178,'FDA6D997BFB8A991B57755633D1AB3C7E567A74C1EC09937','',3070052,22,'',NULL), +(40,191,'84F6BDD28490937867774E7BF8D5B78F68BF9EB43DE90F10','',477912,60,'',NULL), +(41,191,'5A5B4BA32BD937FF253016AE836DD44B794F8D05982860A6','',447736,48,'',NULL), +(42,178,'A243986665C7FCA1E60A9F209DE9431C3098D082DF1C4528','',682378,23,'',NULL), +(43,178,'7CC89374CE3A9C07DCD685006690B828931D60085EE5FEE8','',710554,23,'',NULL), +(44,191,'01F10590E6DFED79523D26C043D5424174BEF1011F3F4974','',477928,60,'',NULL), +(45,178,'C9728BDC4B77BAA7B3515AFD3628EDB0986DFA20B46917B4','',672746,23,'',NULL), +(46,191,'179B80E5E054521E44BA8F5978D5FC489CC9E514B350A3FF','',28956,17,'',NULL), +(47,243,'','',5417948,5,'7734FF2485','FrameXML Signature Check'), +(48,191,'7769A67D6E2460450873133B0CFF99B67A58CE6C404A17F8','',17282,15,'',NULL), +(49,178,'CF3896074EEBC0F93B539FD44E4D825227D4C1556B8F2279','',3990720,23,'',NULL), +(50,178,'88F2833B5267A71A0CA72509C40819B99283A6E556FD9038','',198,10,'',NULL), +(51,243,'','',8491566,5,'8B4D10890D','Lua DoString'), +(52,178,'F7229DF2D879A9E8D5BCEDCDC7046D75BAEE1C9D4DA41E55','',3638348,23,'',NULL), +(53,191,'AE78585CD862134059B13669FC416B8124752EC6471DDCE6','',28940,17,'',NULL), +(54,191,'B408E9F9B475E4B6A81F9B7F2E060824F618FFDABBFFE805','',13634,11,'',NULL), +(55,178,'A9DA016B83961F95097E08F2DEBE69517C7573FFF06D8C4B','',668874,23,'',NULL), +(56,191,'0E74160C242EF826D09BCE4ED535E9A9D251B1CD20E31891','',24812,14,'',NULL), +(57,178,'A58E4D44D952C1F9DB7B5E423167EE4C28AD02668C5B86AF','',710730,23,'',NULL), +(58,191,'35A9FC42ACBF3A147B0C8CF67BA04EC979C6534B20249B45','',28956,12,'',NULL), +(59,243,'','',5345746,7,'746583F9177760','Lua Protection Patch'), +(60,191,'1430DC4A627EA5FA2CFF9C010CE16022F259F81DB6047879','',13634,11,'',NULL), +(61,191,'85A005398AF851382267C01BB6FB04AEF2093213C20EC200','',360508,13,'',NULL), +(62,191,'96916CD89649027A9A8BBFBD28AE190CD5D590E24BBAD451','',13033,36,'',NULL), +(63,191,'056D57A5C1A46883400E1F69405750B23DE18C3032C3D91C','',27270,13,'',NULL), +(64,191,'87C641E1EDBD96D9F170C7BE0FA13F45611DCDF41AC02526','',41127,24,'',NULL), +(65,191,'1F378DF1E7BD99164DDC7401A98CA5E9551BD50B4A35D5AA','',34176,25,'',NULL), +(66,178,'B5ED443D6CA2F6095BAC8DAFDC8F3413F7B473916357C17E','',209352,75,'',NULL), +(67,191,'A2BC3FF01787A38CB88B3EF45C1CD97DA113157FC395D38C','',30012,16,'',NULL), +(68,191,'190862E5018F1428E5B12BFDAD08283ECD057B34AD722846','',41228,24,'',NULL), +(69,191,'6E0E55BE8690F64442E275559E6C9F8A3FDCAA00937D1C13','',49347,24,'',NULL), +(70,191,'B6FC4C07BB2CBE7C5C854CD99DAFEC0D1AE4101FC51460F9','',477912,60,'',NULL), +(71,178,'3B5955C3B498489869990F08A4CAE566A7D689C23990518B','',156,8,'',NULL), +(72,243,'','',7246064,6,'8950108B450C','Movement State related'), +(73,178,'F24317DAA28AA477996EEBB9538A89569ABF9B185A3EA4E4','',718842,23,'',NULL), +(74,178,'DA25A4134671325719833878E2556455EC4321A2207B6728','',198,10,'',NULL), +(75,191,'DC9490A7BEB43C64585E013B5260BE843D126EB3BCEBAC11','',50040,26,'',NULL), +(76,178,'4BB92BBD5CA8C192C9D0E1EDB6C21FF3F4A61ED1B151365F','',673210,23,'',NULL), +(77,178,'13E8DD1C9F5501A270A59CC4B61311F6D5D18DC3F2AA351A','',3037164,22,'',NULL), +(78,191,'346CFA39FF98198BDE1C23673FBF51A50CFF5ADED784F077','',17522,15,'',NULL), +(79,113,'0590FC57AB448975FA46C314A8AB75AF96DF0FD0A3D9FB23','Afd32uu',0,0,'',NULL), +(80,178,'E37D413DC96A92D3CEAB8A482B8F5397587A0E654C9A0166','',672954,23,'',NULL), +(81,178,'E7D5551799C2C7F0072BC3149A22F37D09EA1EB83F64C655','',3045912,31,'',NULL), +(82,191,'7CC5260578671130CA5B3392BA5CFD0F3DE0BE1085E556B6','',9977,32,'',NULL), +(83,191,'F44A40945F24385D089E040A733553EEFF92EFAAB0636323','',134968,32,'',NULL), +(84,178,'D3122CF30EE55310CF4A710E61B190D2B108227B746B41AD','',679578,23,'',NULL), +(85,191,'7E3CC1BC53477D84F05F623BBC94B9DE8D01A2607CA935DB','',41188,24,'',NULL), +(86,191,'DC06565CC1512B5A91A848E08BC4FBC6DA705F6503667852','',41127,24,'',NULL), +(87,191,'03DC47CDFBB14C5CF0D0010FA5424556F951585588A2180A','',29916,16,'',NULL), +(88,191,'29EC91C4D87891FECDED381CE65A86A259F00DD788833E4D','',174688,37,'',NULL), +(89,191,'31F024003681765368F6EFB667E83CE1D12799723AA99BF9','',685304,44,'',NULL), +(90,191,'6A82AC1D0BFEF5DA7385510CBC57189FACD42E45E0D2A65E','',30012,16,'',NULL), +(91,191,'3901FBD52655E12ADA4EEDED3B365B1DDFAAA925A140097F','',448492,48,'',NULL), +(92,191,'6E9991A25EC347BEA5813EDE0A842D746779C97606565B5A','',17906,11,'',NULL), +(93,191,'0AC9F2B104AC5AA9131FB14E669B98D30D056936625B0245','',27270,13,'',NULL), +(94,178,'A338B3DA78A6683CBEE08A63C5EEFBE1AF33BF54983D583D','',684876,29,'',NULL), +(95,178,'38759C29F2ACF42DA9D16EF35837A470DC7C42C3284B2A3C','',3049492,22,'',NULL), +(96,191,'F35817564FC39F4DB7994021352FEEB86E2FEE86C11B8DBB','',360508,13,'',NULL), +(97,191,'09FAC087283873DAEE0AD074ABF7DDB1B395F5CF6BC2141E','',28956,17,'',NULL), +(98,178,'87FE57916743AF3C97CC3B583B29E89B6E503D31D1747B64','',676970,23,'',NULL), +(99,178,'97D854645011BAD1F6625679511D78D1B7367A51EB0FCC6E','',668874,23,'',NULL), +(100,178,'12369F6F1B875FB5CC5E67445ADEAE2B295D196596679317','',0,9,'',NULL), +(101,191,'5034278808E93A3DFC9BEFFD8E180FEFA24DFC5056ED3BE1','',433168,48,'',NULL), +(102,178,'55EF16220A7EF3F74A9D895821610DFBD2A757FB05C792D5','',209352,75,'',NULL), +(103,191,'67445533AA0BB737D2F74C9258148C6C667794F0E3D07498','',45324,24,'',NULL), +(104,178,'AA8649100B17A9C5BE227F47F867FADE51AD242BAAD39821','',3045632,31,'',NULL), +(105,191,'85545FE9242B2474574EEBABBF452FBD11497073CB1E46A5','',41080,24,'',NULL), +(106,191,'9DACD6981681F53650B681EAE68065D26F4803682058709D','',448456,48,'',NULL), +(107,191,'96B74F1436A05E658E3282164BC3CBDF4DBBB2CF6A5B866F','',9977,32,'',NULL), +(108,191,'033BD6861DF7878DC9470EC2F699772BB2F3D5000490866F','',90202,13,'',NULL), +(109,113,'B797D0AF3164EE83167D5C054A511A5B209A70C6655C408B','IPSect',0,0,'',NULL), +(110,178,'D91A2764435C5091D3F9471AB8B5F397E609330294694488','',710730,23,'',NULL), +(111,191,'94EED02DCDB71789E50917DA401A03F4B91BDBEA050D8BCA','',3766400,37,'',NULL), +(112,178,'2DF33CBB544E2D5238FB591F2547AC507B4D8A652D789F2B','',2303444,33,'',NULL), +(113,243,'','',7860712,5,'742DF6407C',NULL), +(114,178,'81A74F35F0F887144D59F93647C18C70C5FEEF542A7F3782','',709322,22,'',NULL), +(115,178,'2E1F8A68FDDF084A950B786A1EE7E0CE43E62449A56F92A3','',3045632,31,'',NULL), +(116,191,'B1F8988B6664A90E79503FA5D843C3CB97BFDC23EB8C7690','',433168,48,'',NULL), +(117,178,'0277E26DE31814DFD675A59E526669E39080E033BAE88859','',0,9,'',NULL), +(118,243,'','',10714892,8,'BB8D243FD4D0313E','Wall Climb'), +(119,178,'09BBFC19FCADC69D6B5BF655A5BB6350B4A8120C3EB557D2','',3990720,23,'',NULL), +(120,178,'BF4ABDEB726B0060E74701C03180C3CB02170ADCB7DCB61C','',3049872,31,'',NULL), +(121,243,'','',9990741,9,'8B878000000089463C','No Fall Damage Patch'), +(122,178,'D259A46A6D1855C436BFC96FB9376BDCDF5E9FFAE8B4147C','',3045616,31,'',NULL), +(123,178,'F425A62A44097742D72A05669B6BE93AD9CEFE9E40D71E48','',3045976,31,'',NULL), +(124,191,'B134291F515D136B6576FFBC0133C7859755974611170D07','',20512,16,'',NULL), +(125,191,'125BE691985D8DB37068DC14D74EA2DA1260E4A63D3F74BF','',45324,24,'',NULL), +(126,178,'E06E3C5B356B34BA92F6765108556AD53ABB74B986D5810E','',3070052,22,'',NULL), +(127,178,'8CC87DFF61F2EC82DE033865C9879010D94E1614369FE286','',710554,23,'',NULL), +(128,191,'E1F5233450FEFFB6F0E8F2B17683047A485828FEDD3E5B80','',448456,48,'',NULL), +(129,191,'31BA6EA4DF2362676AB71F4CB60B0D40FA51A3AABD25D5CB','',36924,24,'',NULL), +(130,191,'C14630E1D519EB85C254C536FE81DC490977E869BD5CD884','',12985,36,'',NULL), +(131,191,'B337F892EEDD52A5B978C116A19D927134273626EFC4DAA3','',17890,11,'',NULL), +(132,191,'D97560108AA21A487EC9278759F7615BFA304A933776A201','',18680,35,'',NULL), +(133,178,'DA59505BA61459508532CBEAD246DCD2C8E7BF5C6D3CE676','',3037164,22,'',NULL), +(134,191,'5803CA69E5B7F1DF08D95219894D75F52EDB1AD429E562D9','',174688,37,'',NULL), +(135,178,'8A1099E19139D91573286DBB3DED2CC093A99FD178F7FEC8','',3033068,22,'',NULL), +(136,178,'0331B438B085F55C06F7F697160845BE953D9CE789AA62A4','',3000288,31,'',NULL), +(137,191,'E844078A5671FF7DB0621E7F1C7EDDF9C92F5A9FA0477FCB','',41023,24,'',NULL), +(138,178,'AAD7F47B231861913F353341FD26E5AA89AFB586FB6A5366','',672746,23,'',NULL), +(139,178,'136DFB3FE66D2830DF46EE155FCAEADC9624FFE1410088DA','',3041472,31,'',NULL), +(140,191,'C6015A0D5C9109768BA4233639A51F163CC7ED58749E5026','',25724,20,'',NULL), +(141,178,'9C668CE4D328EEA9B6AB7AD5FF54169289B35B230275A43C','',3049872,31,'',NULL), +(142,178,'FC3C95E71F968C46BD5DB5C9EF9B0A5BDCC5619B805046F5','',2299060,33,'',NULL), +(143,178,'FBE3808C0E36BFBC1D1F5A0E508CA89E81E550CD2FDEEC48','',149,5,'',NULL), +(144,178,'35A8252DBC65514E858256C497141153812EE61C724BF5A9','',710730,23,'',NULL), +(145,178,'CC79AA9AE29A52A998181D183D38974221B8BAC0AB534E7D','',0,9,'',NULL), +(146,178,'B89F25A249D295580E649F5ABE0C65EC24401F4889A4FB16','',668874,23,'',NULL), +(147,178,'742A0A9997B9E857C355AA75797466506BAE73D44D26399D','',3037164,22,'',NULL), +(148,178,'E7975701601B2FDF8262098521B7BB4FF5CCC484F8E919E7','',3045776,31,'',NULL), +(149,178,'43E81BE830F169F4EDD23B84ABFA9D15EF12C978FE134346','',60648,56,'',NULL), +(150,178,'66CA9E464A2122E301A72FAEF13A4853D8CB1A45C177E854','',178504,96,'',NULL), +(151,113,'0A3C294B0799FD2C9EC17C1CCBCD174A51B6A2ECC62FEF17','IPSect',0,0,'',NULL), +(152,178,'6E9CE81BFCAF0C250705FCC599981D2D9E4D474A7E857B37','',2299108,33,'',NULL), +(153,178,'8734D6E081D5C993DCE8161CFDFC6197F39A487E4083A3E1','',149,5,'',NULL), +(154,178,'A33355AF7B5FF3CECB3A6059F6621F30AEE695D69421EA2B','',3049492,22,'',NULL), +(155,191,'BF8CEA63013511BDE0B551DAAC492DFBB9608645140B88F7','',29916,16,'',NULL), +(156,178,'8D5D5E99EAB2ED21A104913B05D6BD7A8E63ADA56B66CDED','',3022016,31,'',NULL), +(157,191,'778256BFEF82EA60C4E0F25083655FB2BB75B83FD60A9C06','',18680,35,'',NULL), +(158,178,'43FB8007D7DD7B01FFBEEA3EF9D0242778565544281EC761','',0,9,'',NULL), +(159,191,'94DCF5D21FE2106F5303216C14AD55EEDC1B19FDC91D5F76','',28704,16,'',NULL), +(160,191,'7EBBF90F7D8462D1453479DF9AC5943AF483FE2828C74FDD','',477928,60,'',NULL), +(161,191,'A171148491E099B12CCD1708B784D8C3B09737772C7780C0','',401992,14,'',NULL), +(162,191,'5350ACB75F9FA498FE0D2A371649C9FD9716BDDE2C32F5FB','',13634,11,'',NULL), +(163,191,'85E53280630956C58D4CA7FD8DC5FE73C9A2A03314DFF294','',45223,24,'',NULL), +(164,191,'391BC8A81D4EB6D526BAF0DC3468CAA36C9207B82E194B7A','',130380,14,'',NULL), +(165,191,'0F88FA5CD9B9950F850C18FE76C948FF43CDDE3E75638FF1','',17938,11,'',NULL), +(166,178,'EB63FC60164AFF92726DA658882BF1CE47CF0BF6C80B1B97','',690106,23,'',NULL), +(167,178,'E30B2494142B416BBE95DA3DAE4A82CBDF3A020715F10E8B','',4011280,23,'',NULL), +(168,191,'6CA1C19D0E9191CBC9CA3D5BC3CF1D19764D8F17C6B54AE4','',59620,13,'',NULL), +(169,178,'4730B7A7EC70544A688211A5C754C357A090116092D3EC4D','',682378,23,'',NULL), +(170,243,'','',10000022,6,'894644894E54',NULL), +(171,191,'713A7B79619AEF3C47E44102F86EDCE0D6AFBC5ABE87F861','',13538,11,'',NULL), +(172,191,'575F1C6AF7C71085C7D9CB2291844D9F2DA3B71391C0B941','',36907,24,'',NULL), +(173,178,'296F233E4FAC4CF419D5FBF2701AC4D5AA0866CB4D0DAEC6','',3045976,31,'',NULL), +(174,178,'933C1A228C99E35DF309838B25B7D5EA3A8E961E81D81D32','',673194,23,'',NULL), +(175,191,'9EC125252C3738478CA942DCB59030097194B284A9162B32','',59620,13,'',NULL), +(176,178,'6665F3FB8DC6BE71C152C3674B5783D6E57FE8BF796D190C','',3634252,23,'',NULL), +(177,191,'E120DD63042FEFF9E7FCEC0CA44D2544F03C5D4CDBA1C008','',12985,36,'',NULL), +(178,113,'09BDABA6CB17BE561B4104124A3D0266C858D194A8765198','drvsys_mon',0,0,'',NULL), +(179,178,'3AAE69E7088E4060EA32EF95E9B6D9532460F5B84EE4EC80','',684876,29,'',NULL), +(180,191,'990D4E1C2D63C8E447F034642686D57B727064E3EDE13B00','',448500,48,'',NULL), +(181,191,'E88F31BDC5513216CF3701CAF8BE954CCC7EAE0E7AC7D942','',594348,26,'',NULL), +(182,178,'81229C1E56FA72E01B52E8CBB8BB5F55ED48A11B72E7729B','',710554,23,'',NULL), +(183,191,'B4D0CDE7D53493A1549328F711013F07DBD3A9BE88DB2EF9','',685304,44,'',NULL), +(184,178,'D6CA6F94FF248F722F97037C1AE7C8DE0191D5F4D1E3A5B8','',156,8,'',NULL), +(185,178,'9C9DF1E868BB33D43676F21096C4F75759C0807096EEB886','',60648,56,'',NULL), +(186,178,'1C79B3B5A74A4F09A1FAE19BB15CDCF26B5F917861071F1C','',198,10,'',NULL), +(187,178,'AC1AD3E831A4C758858350A8A197A24FE82583F4B0E39A85','',3049888,31,'',NULL), +(188,178,'56E4980485E3129E94F370E7066E80B07141C4A669B9FC0F','',672746,23,'',NULL), +(189,178,'C21574305E0377A3D2B72D1E1546B9D62DCFA8B1A4405F16','',3638348,23,'',NULL), +(190,178,'AA74121AF835978BC1C1BB402A8B7388CB7C075C1227C253','',3049888,31,'',NULL), +(191,178,'D6457A86DFADF9825D6093090AED2A807FE7DA6ECF5922AF','',3065956,22,'',NULL), +(192,191,'1BAB7E6B5ACBEED8F54B667EDF13A385B9E146C0C50D9FB7','',448456,48,'',NULL), +(193,243,'','',7517484,7,'7518683B010000','Follow Unit Check'), +(194,178,'01000FEAC61ED76FE04ED1169C40289D96C71A1564E38FCB','',690106,23,'',NULL), +(195,191,'F095338ED87C658C916CC604A427F4ED95309C4A07B7898C','',34176,25,'',NULL), +(196,191,'800E120187DF74A231722FB887B3944AD16A703FB8CB9D39','',28920,23,'',NULL), +(197,191,'2CFCE981C322A54724E1418B6A6D1896B95D584630EEEA43','',38300,21,'',NULL), +(198,243,'','',5081862,8,'6840AAB600C60200',NULL), +(199,178,'481751066D6C97AD5EE90173E8ED107BB1C9FD873B0CE55A','',3037164,22,'',NULL), +(200,178,'7FC57D49535798CDA7E4DC5DCEA2E085AAB9A68BF7F9469D','',149,5,'',NULL), +(201,191,'33357C112DE0195F013FAAC4D57AB1BE77417934CE03A2B9','',3766400,37,'',NULL), +(202,191,'BF8AC678DC3CD354BADBFE46C9173D34CC84D13302190EBB','',21826,11,'',NULL), +(203,178,'4E2F9721D52A7552AE2728B9695F1523DD62DC0569237C3F','',2299108,33,'',NULL), +(204,191,'9F015E7D8A11F30AA1954D9FEA7142D0247E3C09FF2BFF72','',12194860,37,'',NULL), +(205,178,'1EB5AD39B94DB5CDC3294DF49FA589DFBE2C674D07E4B211','',710730,23,'',NULL), +(206,178,'E9D67F07E035A64B89C9E91614DC1930FEF61DC3A5C1BBA6','',690106,23,'',NULL), +(207,191,'36411C2FF2C3AC51B7F6A6B8DF61DBD4E5895C27438847BE','',59620,13,'',NULL), +(208,178,'A77F30CBB8057E0DB37782367C8462FA98D4DB21DE936ECD','',3049492,22,'',NULL), +(209,243,'','',7452688,10,'8B81CC07000025000000','WoWEmuHacker Injection'), +(210,178,'A8C806E1FB7CA3625E6BB6F5E4D9E2BF0EBDBE70BA7226F7','',3049872,31,'',NULL), +(211,191,'B3DD04807DEA2679045F4F197BDDAED5C7CCEEFE19622B43','',360508,13,'',NULL), +(212,178,'B075C8B4D8C5D83FE703677319491DC816EA5103901B44A8','',682394,23,'',NULL), +(213,191,'53DB506C0341B50BEA3897E2E3C0DD74C2CA2D8F5F34A2E4','',59620,13,'',NULL), +(214,191,'E112F38956124FE0F48BF569F5E81B40E293DC6E16B544D6','',17282,15,'',NULL), +(215,191,'0363EF2B1AAE09E6C2B1FA555E706F4EE094BE678DA27598','',3766400,37,'',NULL), +(216,191,'EA256F01B6340C99E27611B39C5ED28CF2FA202436F0972F','',49564,24,'',NULL), +(217,178,'A86C95C4E58495A10F5F1C9B5B62D3365132E8DC62863E8B','',198,12,'',NULL), +(218,191,'56DD8D99991F83AFA2E169315B395BD388B248340E9C64D3','',30044,16,'',NULL), +(219,191,'684B23E010C3D6B88CC12BD9F0B6B0CE00D692C71BFB84A8','',28940,17,'',NULL), +(220,178,'83AEEFCDF4C2E80B18DDF93D99120A89F916C19206D257AB','',668874,23,'',NULL), +(221,178,'D68651921F5CD387C7E860FB7C3B143409735748E3B2FB7F','',682394,23,'',NULL), +(222,113,'A4D501A9DB9D84BD8695A8BF61FC853BF434D2D4B352C7A0','HideEx',0,0,'',NULL), +(223,191,'5E77F12C032D4FEF559F9B837B85BDB9D95ADB10C9F56649','',448504,48,'',NULL), +(224,178,'F08406AEDFA8F19B6FB7C9ADDE0BFEE82CB0D2E275593150','',2303444,33,'',NULL), +(225,178,'AC0EC72522ADA5B2BFFAFAC92D6D0A0225E1D5C727CDFFA7','',672602,23,'',NULL), +(226,178,'4D1A7D1C88AB04438510E3255184E51EAE2036BB09DB553A','',700714,23,'',NULL), +(227,178,'68BBC36F75DC763B573DACAB1D6D8F70E667638AA894BEE9','',717898,23,'',NULL), +(228,178,'2AC3C23FBDE2C1EC46C9ECFF71BD7F603F17C9DFC1328D1C','',3638348,23,'',NULL), +(229,191,'C365E9FE00580EBB14EE863A5CE3C8139B1A59A610520AE7','',3766400,37,'',NULL), +(230,178,'DB2A0451B9753100085C9D149B61CE47A195D77C8B709143','',178504,96,'',NULL), +(231,178,'0871F69205FA62C74C2DDE200A3911FC3E41A4FB8BAB9817','',682378,23,'',NULL), +(232,191,'0017307F2FF889462B0FA06018D99EB1F847F189B6CC9B99','',21826,11,'',NULL), +(233,178,'0FEFCD6B0BF8C2816A9259AB5FD7B89231AEB8D92DE53D26','',3045356,22,'',NULL), +(234,178,'87EAD79656133B3183C2E452886D8F00C5EC6C9D741673A2','',3037164,22,'',NULL), +(235,178,'C2B6C5E19FA98D121B2CDE51789BD2883A324015E7D131E0','',710554,23,'',NULL), +(236,178,'B6F3A7D557A3E3BC4833C3D9B6B0B0609255591CC8AB3B65','',3022016,31,'',NULL), +(237,243,'','',5283280,12,'558BECB8084E0000E8731DF0','AddChatMessage'), +(238,191,'AEA87B23CD9463E9693B6C053C1D9030F8E229DA308DBF29','',90202,13,'',NULL), +(239,178,'8C16C7E8EEAD49AE67E4E91E229FFBCE2F6590A48348914E','',3049888,31,'',NULL), +(240,178,'7B2DCA97CD348E45490C288EADE9303CE270CF57F28EB1E4','',690106,23,'',NULL), +(241,191,'BC10B10BE398F2397FA6962C4E59C8CF11FDD7158EC222A5','',29916,16,'',NULL), +(242,178,'8E53EC1B8ABE90C9A5C087671DE0A3007BEA4488EE5415D0','',3037164,22,'',NULL), +(243,191,'65B5CE07A794164101F7E379D21A7A544EF1EC2A3A39A2D8','',27270,13,'',NULL), +(244,191,'C6C8597824F249180A53196699421ADF7857A5C4E4F80D6F','',13033,36,'',NULL), +(245,178,'FE677759E719178BC5CB49DA252D9B635F76030FC4C9876C','',673194,23,'',NULL), +(246,243,'','',5265823,5,'72118B5518','Language Patch'), +(247,178,'BA2D161EF412084B0229A08E64D5A445C4E9F9F2645535E5','',706314,23,'',NULL), +(248,191,'0174B647A535F206711D3EEEF08D3F421BCABD7016A2F103','',17282,15,'',NULL), +(249,178,'5F5F754FD6E7BAC9650B715387646CF992813730A2BA37DA','',2303444,33,'',NULL), +(250,178,'D2CC7F98209E9A9BBA483BD1E9A916E40EB971EE2129AFF8','',3990720,23,'',NULL), +(251,178,'E8C741CC79005898FFD0026821F61A2E4E67C695C6E1CE1C','',198,10,'',NULL), +(252,191,'23B364A9012EF40A39EC4D04A91F9B60FC7EF7D85E3F240A','',18680,35,'',NULL), +(253,191,'C9363F808D37F13FC09EBB7F700AD09EEB27DA046E41FD52','',36907,24,'',NULL), +(254,191,'2D92FC5B8603E18F50D9CAA0922F5C7BB89E42A4656ED2D5','',3766400,37,'',NULL), +(255,178,'EDEDBC5B1A3D92D2A91192118898FDBF840C967C82968D70','',3045912,31,'',NULL), +(256,113,'BFEF06E80472106B57B15D711F94A25243F6ABA7FE354C95','ndis_x86',0,0,'',NULL), +(257,178,'FB20B0EB9ACF571FE37C6B69CBE86F7906F96B996D7E5EFA','',2303444,33,'',NULL), +(258,191,'917AC1C48C1FF354FD594A3705C70A2C356FE981275E7FB5','',22792,25,'',NULL), +(259,178,'48CD29D8B39DC07B0FD071FD8C643E07A8FC2C9AFC2A3083','',3045356,22,'',NULL), +(260,243,'','',11154396,8,'D893FEC0488C11C1','Jump Momentum'), +(261,191,'FB13A8360C8E23B83ED7309625A7EFBAEE7DCF737068C5A6','',174688,37,'',NULL), +(262,191,'3C8D85F85ED5DD0354561F84EACA575123DE05EE941C28D2','',56063,25,'',NULL), +(263,191,'FBC20EEA52B5882209BC016EC14818376CA7BAF28780BCED','',22792,25,'',NULL), +(264,191,'210D85A84F7BE48F3EB427E0CBCCD9C146320ABAAB5E28D8','',41096,24,'',NULL), +(265,178,'953107F9F718795B6DF9E5E5BEE0EA949800CAD0EB71F891','',3037164,22,'',NULL), +(266,113,'FBBA36D0FC5434D12EE1509E148FF908D51F18719CCBEABC','IPSect',0,0,'',NULL), +(267,178,'82CB32BA2A05B228F2F8D0313C185EB6FDC50A94340F40C8','',209352,75,'',NULL), +(268,191,'079172B91B1768A2650A87BAB06AF700BB4C9A0B5E5B983B','',17522,15,'',NULL), +(269,191,'881751DF112F817E799953E00E94543DA4610968437DB7C6','',12194860,37,'',NULL), +(270,191,'9A47B274EAAC888FA2007B4EC0623580365458E3621CC416','',28956,17,'',NULL), +(271,191,'77344CE014111FAAA66DEF35B670B2E76AE878B054F85285','',61874,42,'',NULL), +(272,191,'0A74CBD8DFF245DA5E8691C1174F037D7ABE823E265226AB','',685656,44,'',NULL), +(273,178,'0E13ADDD413B679E2984060D929440064FAC308FC2B90742','',3049872,31,'',NULL), +(274,178,'D0D8CE5001596C6F4A766FE94726FE7E337F42469CB96CA1','',3065956,22,'',NULL), +(275,191,'313C58F8401B47F716B220B88411CAD0E85966D95B301591','',13033,36,'',NULL), +(276,178,'ACBDC68A4D748C48ED1180DD3DA52632EA6FC275BFC35D5B','',0,9,'',NULL), +(277,191,'BACA83A742B9E09CD07787BC6B50389707EA94C41886BAD0','',448504,48,'',NULL), +(278,178,'549B42D266E7F17B7F30B72E301A9CB3C5E3865DE9B7E90B','',60648,56,'',NULL), +(279,178,'86DB854557D75BEEE7DA820FCA15669B08C760E8B165B06F','',3037164,22,'',NULL), +(280,178,'02D5FBD9E30D43ACED0EFD00CF16DAA69EDD262C292136AB','',178504,96,'',NULL), +(281,191,'B9D920131EFC38767012340CF0FFBFE154DBA28E6EF3B859','',61874,42,'',NULL), +(282,191,'96E6CAE70AF690F5D552E0948C29CA9AA527DEBF9731B16B','',20512,16,'',NULL), +(283,191,'375B22B4990997348A8AEDD53319897BE196398B4F1DBAC3','',30012,16,'',NULL), +(284,178,'932F4622AE9F1B3990900F1F88375FA1DD7C238F7C6133C6','',684876,29,'',NULL), +(285,178,'43583C7BCCD9DF14C64CC84710BEE44DD30E199F579890AE','',3049872,31,'',NULL), +(286,191,'97CF98F0BCABA04BC2BAD40FBD4EBFB3C1FD8A7139D5C9B9','',433168,48,'',NULL), +(287,178,'97A0E0F8F8ACE7F1E6492DAFADE8F45B366446E79C1B0419','',3049452,22,'',NULL), +(288,243,'','',5284488,9,'7507C7451400000000','Language Patch'), +(289,191,'C3546D16052E0DC1838E7A6E18936B88CC8A40C2AEC0BE3B','',21826,11,'',NULL), +(290,178,'4179D6BD8C2F11AD5D5C103A7877504074009AB53AE4D8A6','',3045356,22,'',NULL), +(291,191,'2C360CEAB996C8D6E5DE3FFAC30E412DED48E7814D1CE110','',20512,16,'',NULL), +(292,191,'6F1486BE58078BD453F1B249947BB99CB8E17E9A355CE024','',41228,24,'',NULL), +(293,178,'924F4631DC3167BCFAB02F92DDB49A871DA0C55122EF9EB8','',0,9,'',NULL), +(294,178,'411029C5B28D942ED3C7BC1F4299162D874838A661410894','',700714,23,'',NULL), +(295,191,'B9093BAED730E86AF004119B3B7258938C56902915C2E8BA','',501956,48,'',NULL), +(296,178,'63BD2D7FF6C5442795361031E5768C396A37AE38AF98DB11','',668874,23,'',NULL), +(297,191,'754A2FE56037B971E128FFAA669032C511BDA3A62524CE03','',28956,12,'',NULL), +(298,178,'9AEFDCDB62EBC2DABD6CEBF8C411C1145274FCA7CED890CB','',3037164,22,'',NULL), +(299,178,'3AC57BAC3B782AE5ADBB899CCC060D4E8F66E5217F7DF654','',676970,23,'',NULL), +(300,191,'2F0D9702A58D6D5A8599529A0A816AA101AFE581D98416B2','',56063,25,'',NULL), +(301,178,'77804219E627B4D38C9F95194301A895180B598AEFA9963F','',3022016,31,'',NULL), +(302,178,'0D1B99EDC8E458705A88E72F7FDEEE9233DB21290A0098E6','',149,5,'',NULL), +(303,191,'BB795B4069F985BF44C7418DE264C3B0E9BA6D61A116FF81','',90202,13,'',NULL), +(304,191,'5A6EEBA1E6B9EE71BD4A5F63014E9928302C36FC806DC796','',3766400,37,'',NULL), +(305,191,'BA5777AF7FFF3895935669878D662B585912A759A2DFCE68','',24812,14,'',NULL), +(306,178,'5E690DB1AD8910886334158C6D4452FA2CE896634BCDDF40','',580768,52,'',NULL), +(307,191,'42A8F651F55F697E783ADA1959A2833276F970F1EE0410C7','',41280,16,'',NULL), +(308,243,'','',5296496,12,'558BEC81ECE80D00006A0AE8','SendChatMessage'), +(309,191,'445A6894B8C1838462D7D0D29FBE6BF815B5E6C344971349','',31924,23,'',NULL), +(310,178,'C010786A38F396503B7411FBADA0C1A68795F54A7AAE228E','',679578,23,'',NULL), +(311,113,'E3185EE4428291F9D2E4080C2EB1B19ADB005AD26EF0A993','IPSect',0,0,'',NULL), +(312,243,'','',7739760,11,'01BE80000000E805B6FFFF','Jump related?'), +(313,191,'1995FA3235ADA4B25232DC6403E7463A8D1864528BF9FDD4','',12905,36,'',NULL), +(314,243,'','',5124558,5,'8BF08D4608','GetCharacterInfo'), +(315,191,'30A26827798B7F1646003A9E846E8A9A8FF10A9DF926825A','',49564,24,'',NULL), +(316,178,'A567BBE4CA9D8E976083024E8D68903CF15CEA88C47C9961','',2299060,33,'',NULL), +(317,191,'BEA7165D7DD8E24E31B1C3D791A47A28731E1BACD1189A17','',24812,14,'',NULL), +(318,191,'0971A7CEB84D392670C7B8CBB61776762C25259D8E772CA5','',13538,11,'',NULL), +(319,178,'13200A59A28561A413FADAADFFFE4521A209CB691EA199A5','',690106,23,'',NULL), +(320,243,'','',5090917,8,'E886EE1D0083C40C',NULL), +(321,191,'56CABE081991356465BDE1DA3B8DED099DF9B6E746D1B531','',25724,20,'',NULL), +(322,191,'F98469C704F8B8ABC1A251EF8FC1E4CB5CEF1E007BAB5EA5','',57602,42,'',NULL), +(323,178,'6A64BF5AC652747B47E0B8E6593B7EEAC1EF38E0A84F4F5D','',3049452,22,'',NULL), +(324,191,'978BCD17BC9C81B05A2F0A50EC2CC206EC5F6AB1FE40D38D','',28956,12,'',NULL), +(325,178,'A28EDC898CEB14FB52591754DEF981C7168DD2421D0742FA','',3037164,22,'',NULL), +(326,191,'35E88DF07F0D48A0B7ABD53F4865DB762E6935529DC826DF','',360508,13,'',NULL), +(327,178,'BF1FB7E4C3CDD5D5A93AA1B24FC822AA5537DBB59F696818','',3037164,22,'',NULL), +(328,178,'343F1AFF6DA7A967D2DB958C608A6E2A19F83E862F8E3954','',149,5,'',NULL), +(329,243,'','',10694516,8,'2F549A416F12033B','Wall Climb'), +(330,178,'0B008034F97BD411A9F900D87578258AA1B79873850BC12B','',3049888,31,'',NULL), +(331,178,'C5A35B72E6BC604BAC9AA218908B3747D6850769CEA79C0F','',2299092,33,'',NULL), +(332,191,'FDDB2AA7F8884C8E3A7ED646B3E9E4AF5A8C0704130C39A7','',29852,20,'',NULL), +(333,178,'F57343CEA7133DE6469B1CFD1A749845D553B8D806B2BAA4','',3037164,22,'',NULL), +(334,178,'565A63583AC736E3CAFB95EE5AF9A64D3A7D3C3A8B234121','',3045912,31,'',NULL), +(335,191,'E26CF0E2ED92F608A80733CE703D7EA2C3DB83FE46182519','',3766400,37,'',NULL), +(336,191,'2F44EE3A34EFF98303B3724005EF3A8AC89CB25F9CA1B8BC','',12985,36,'',NULL), +(337,191,'C32F7CDB33BEF7B3093262F89263884DBB44E57D74D646B7','',12985,36,'',NULL), +(338,113,'2357AD2012CEBA72283F93460AC5FF55E4E5719A5AB9F5B9','drvsys_mon',0,0,'',NULL), +(339,178,'1C1595A1A64016D8725619CBC2FC7ABD41835320958A97FD','',676970,23,'',NULL), +(340,191,'DB5765A8B8D5F636D619E44669E9D3EF968BD8011C5D6999','',36907,24,'',NULL), +(341,191,'70B78734AC394D83D45427E0B7C88351E9BB108ED59C7E71','',37136,40,'',NULL), +(342,191,'85F2A5072D2D7557155CBF5157CAA460B19470DEE8AF96BB','',22792,25,'',NULL), +(343,243,'','',4609669,5,'8986100F00','Login Password Pointer'), +(344,191,'6C33FD80565B2860A76C87BB772E794E2FF444D813079A2F','',685656,44,'',NULL), +(345,178,'F09BEAD15FDEBD09240316D9E2E736028B54972B13F14E5E','',673194,23,'',NULL), +(346,191,'302E114D921D40EE54585BD9D63B9BDDFF7A2BD4D678DA97','',30044,16,'',NULL), +(347,178,'24807D7810C58A4B9A070A21B8AE50A0385DD4B4C6BD8B6F','',3049872,31,'',NULL), +(348,178,'B6BDECA858773B6F995AC6496923F5D0CBFDB1F76DB29C58','',198,12,'',NULL), +(349,243,'','',5296823,7,'75166824020000','Language patch (speak all)'), +(350,191,'C125EB3FD1B222ACE1B518959D96C5AC83EEAF109E9C6D20','',12194860,37,'',NULL), +(351,178,'8AFF28C3E6367B10340FB963B093AB52E61B267C541D5659','',2299108,33,'',NULL), +(352,191,'734D3EDDA69D9DD307032245FA0806456E2F02E90C2291E2','',36907,24,'',NULL), +(353,191,'9CB5A848D90B7FA4F58801ABD8A68EF8FDF8C602063C2CD6','',13033,36,'',NULL), +(354,178,'C8BCF785F8B7118D0270016E620E2C3DF6802E034471E5E4','',3033068,22,'',NULL), +(355,178,'8FB282098C8BB4EC10C8398E44C630677C6E2785227E31D3','',0,9,'',NULL), +(356,191,'2381BB2B613C58C364E962738335EBC2F3EFF81009DE49E4','',37180,24,'',NULL), +(357,191,'AA2A24A7C90D149C7817640B0D2D46C8A4B4D52146837605','',501956,48,'',NULL), +(358,191,'6815D749CCA8C1738A5F3236A737F0B70AE037E82D46033A','',448500,48,'',NULL), +(359,178,'F9F131F27BCC37FEF638FB8EDDAC29400652020C290D4F75','',676970,23,'',NULL), +(360,191,'319CBACC4CD2E1F54F8C8FC41EF44A3A9C492A652B00C622','',18700,32,'',NULL), +(361,178,'A4A7DB31BF51180F1ACFEA6C0E59AC84B43D022CB4BB817D','',2299116,33,'',NULL), +(362,191,'0DF639ED45B0C578DD616DD191014727A3C22C346E9FF73C','',50040,26,'',NULL), +(363,191,'72944B7FED63C1D2FC9D2CF6A07B5788731BE2B02215CEE4','',447736,48,'',NULL), +(364,191,'9148E18CF9213B25197C247F08CCA4C0DC60FEA73E3A247C','',13250,15,'',NULL), +(365,191,'ADA39A6A805BDF59271BBCE21734E8F28182164563CA15AA','',29916,16,'',NULL), +(366,191,'D5C852D85FA4393D027615506B7DEE07A1074AA4633019D8','',41023,24,'',NULL), +(367,191,'D06EE8DDC2115E5895E96D26A2A2F11FC566297D1D21BD26','',56063,25,'',NULL), +(368,191,'3AFE3B981D50B26FCAAC9DBE5A4BCB24F5BC3E9348AAA04B','',25724,20,'',NULL), +(369,191,'058E826BD75C26BACE712DF9D67B0A751896515802E9DDAE','',501956,48,'',NULL), +(370,178,'6E4C9CA0F7140E32D9284AF2E0EEB76419696771D4DDE887','',3634252,23,'',NULL), +(371,178,'29E43B1309ACB344AC777636BE838F0BFE6A04570B7FB09C','',700714,23,'',NULL), +(372,191,'5B7AC53977D57C5756A2F61582DD386EC93F5FE180FAB5DC','',27270,13,'',NULL), +(373,191,'22BF8D63A306178F368016E4657CCFCA5B2B21EBC90B8DB2','',50040,26,'',NULL), +(374,178,'1E8729EE000CD5BD8BABC49C368E0FF5AC08BC2B30921BC4','',709322,22,'',NULL), +(375,178,'8A1304B9AB2579F392F92D8A592308728EF76B26AE258A41','',4011280,23,'',NULL), +(376,178,'8A90AA547378BD5930D24FC415AEC08EF52E29B22073335F','',710730,23,'',NULL), +(377,113,'4BBF42A918109CC23F231B8E657076A213601AD681C032D1','HideEx',0,0,'',NULL), +(378,191,'06D9E92AE3953D13A0AC5FA31EC24B16C6A2260E2D32BF8E','',41096,24,'',NULL), +(379,178,'D4D3A9950FA07FAEDAD0658F9128007ADE282C043210A201','',683146,23,'',NULL), +(380,191,'94530FBCCC455105E8BB67E5B19BE0A4534A6F39A1201B52','',13291422,37,'',NULL), +(381,243,'','',4198410,6,'CCCCCCCCCCCC',NULL), +(382,178,'2313AF1E20F446936533F9440B220BEA966D9EB3A0502DCF','',178504,96,'',NULL), +(383,191,'F982BFDF01EB3BC6FFB70E897BFE21376232B2EEEFB25E58','',20512,16,'',NULL), +(384,178,'26308A71C6F483CC7795A01A2F2CF7E7EE97787C12CACC52','',2299108,33,'',NULL), +(385,113,'368334F9A3A549DFD3ABC9793E4EB83E837AA43F010354D1','ndis_x86',0,0,'',NULL), +(386,113,'5DA702DF95570780875ADB4C64259E887CE0A867D9B67711','Afd32uu',0,0,'',NULL), +(387,191,'B51E8DA25AAE556552404F5172642D0808A89E2AFE870B23','',694376,44,'',NULL), +(388,191,'4748EAC0350B1B56D8549157AAAAF4FF35438078A7E37AB5','',34176,25,'',NULL), +(389,191,'FBE20B03C75572D992273F192CE72CE78A65E6764BF8E6F6','',36907,24,'',NULL), +(390,191,'D8C1B9DEF3CA9CA59C5B827F055729B636FD55BA6242F9F0','',694376,44,'',NULL), +(391,191,'448475EBCA685E5A4ECC5F810740C9181825B49613CDDDA8','',477928,60,'',NULL), +(392,191,'2AF2DEE0CA5F307895E5773A083AEB862EA3D5210E037F06','',41080,24,'',NULL), +(393,178,'1708C050FF0C98DE59FE8F070273D80F9C1A612D336AB9FC','',3049452,22,'',NULL), +(394,178,'ED6BB184C9DD307229A023C1905E6EE73981D3E088D69FE6','',676970,23,'',NULL), +(395,191,'EB63A86D51668323A18AE2F8CE2BDD1ADAE57375B5F76C6B','',45223,24,'',NULL), +(396,178,'5837373EE8D4CCB5687045C04A4297450ACDE774FE973917','',673194,23,'',NULL), +(397,191,'65CCA5E079D38DCF32053D8DEE6C5ECF88E6AD8E1CF5379B','',31924,23,'',NULL), +(398,178,'FB895125A69DE5DB112B4731F6216668EB09C4F57943D85A','',706314,23,'',NULL), +(399,191,'A388E8CE523DB7C3C501AC5DB2C8AAE58FD1831E75665C48','',401992,14,'',NULL), +(400,178,'77C74B5E4CBCA9150FB64261E497AC4E7642A316C89B291A','',3045356,22,'',NULL), +(401,178,'8A2C4F7F3367A4648744D8964BB9A6833182ECABFE015B00','',3022016,31,'',NULL), +(402,243,'','',4609675,5,'5E5DC20800','Loggin Result'), +(403,191,'E8A24A78E6A716734CC666B48263B424804A42155C0BDB51','',18700,32,'',NULL), +(404,191,'3C881D2F0634D9223A36DF5266A7CF36B503DCF424441FA5','',28928,17,'',NULL), +(405,191,'7B3D92577810CAB5DA0134FDDA91CE6F36003C5373526774','',41023,24,'',NULL), +(406,178,'7F794E0811DA99DABA76CD9925B3E78045425E32880F05D3','',672746,23,'',NULL), +(407,178,'08235E08E4F83DDEA588D9FE32BD084FB26BDA6DEBB1E416','',668874,23,'',NULL), +(408,191,'5EF7C22867612F48FE5B41E219A1CA389AE8D32D8F0FC46B','',21660,15,'',NULL), +(409,178,'C7C78789911D6B30FA6E67198EF03B73CEE37576AEBFF5EA','',3045356,22,'',NULL), +(410,178,'62BF4E6440FE3F28138094B46FB469CDEB35008DEB652B8B','',3045776,31,'',NULL), +(411,191,'E24027620A1723C203E8084AD6269A852CD50D6F79D50530','',36544,55,'',NULL), +(412,113,'49CA50FCF2699AE5F4A867156A5D8053C4239B36DACE170C','HideEx',0,0,'',NULL), +(413,191,'073F4A76F248FE7C38F799437D475B9A2E9E81FA08B0C6BB','',17666,11,'',NULL), +(414,178,'6ECA7966F2845B9B61C6D9356E4FE4C913FE917808C8AFFE','',684876,29,'',NULL), +(415,178,'30BA488B3964465B142E75F6D1E1BA42DC9F489C3AC70BDA','',2299092,33,'',NULL), +(416,178,'55492051D368975D444428D6218A7D731555ABF7C3391E7D','',3049888,31,'',NULL), +(417,191,'94E0CEC4F7BDE7844C4D4ACF62E5C96ECF1D11FC2169CF8E','',433168,48,'',NULL), +(418,191,'5003A599A1162170A30F1906C0AD5B16DC7041E72D28A4B4','',28956,17,'',NULL), +(419,178,'686F700B2223502053CAFDF9977D8774E905E76B8C960E7C','',3049492,22,'',NULL), +(420,191,'F5A776E794B34ABBF93CA93E9230B7224CA088AB741DCB57','',13291422,37,'',NULL), +(421,191,'4A67D56DDA6B0E7D9117CFDB17EC6572E68B9300609FFE3C','',28956,17,'',NULL), +(422,178,'1B695DF78AA0708221E0EC2F5A69AB7078ED8143B2EAD174','',668874,23,'',NULL), +(423,191,'7C8CD40E29AE999923CD8EAFC233E619C73885A0258A6E3D','',21826,11,'',NULL), +(424,191,'73407824E9064DF5F1161A204A272A9CD69026EB4DF1004A','',29916,16,'',NULL), +(425,191,'B21609972E46C9BC8C6A77A18161A77D0C1D4001DC892DF1','',41080,24,'',NULL), +(426,191,'BB66A6AC45D02568067987834ECD8BF0A2BD0DAD06D12753','',17762,11,'',NULL), +(427,191,'2550EB7C358B7FB86FAF0EACDDC3111118769F448D93BF7A','',49347,24,'',NULL), +(428,178,'B6E4EF9350CA859576DB74D02C115D5A19C79AA58B0F6681','',684876,29,'',NULL), +(429,191,'451D2C8FF751743B52109FF5D95ED633DDBD8BCDB80EB7A9','',17906,11,'',NULL), +(430,191,'4A0161A4E5D50F11F58E1B23B281ABDA106625E3DC5A179C','',685304,44,'',NULL), +(431,178,'E4F21910D4B5D3E7B5461ED384889F6D0969645AE83F7601','',3037164,22,'',NULL), +(432,113,'B9756E3E1093B54511AC5A7B85711E53CEBEA373EF4866EE','Afde32uu',0,0,'',NULL), +(433,178,'A5AD6C8506004101E42165CD95051A7B5F13FBADD027461B','',710730,23,'',NULL), +(434,178,'B8AE30A02C59219D144EE95228C6CC9F99916F6FE423C940','',700714,23,'',NULL), +(435,178,'DAFD84BA8F977F5CFEEC9310C0EEF8F949F8EB6B827EBE71','',3990720,23,'',NULL), +(436,191,'B42986974893A82D73CC497B3252E9B844A11A99ACF46BEA','',41188,24,'',NULL), +(437,243,'','',11287980,8,'04000000903C9F00','Parental Controls related'), +(438,191,'0DC0953AE42E913121092DF17BC2BEE8BE133D1C53C8BFFD','',17762,11,'',NULL), +(439,178,'72C81E9BA425C54DE57BF4B7745D9C8D6B44D56E8FE933BA','',3049888,31,'',NULL), +(440,191,'100426CD22E80090502AA7A087B094B49ACFF4E7A09773ED','',30044,16,'',NULL), +(441,178,'46C797D1E60CC458E6C9D874650B996D10FC52641C2E7AA7','',676970,23,'',NULL), +(442,178,'DEA2C8A5775AA8CA86B8241BD418979D10DF4587E8E95C87','',250,11,'',NULL), +(443,113,'8807783067F9FF2697A61DEE925760682EB894C6F0A798AE','Afd32uu',0,0,'',NULL), +(444,178,'F63823A1F60619FDE6B4D6F3915EFB03EC03DEBEC82AFB9E','',673210,23,'',NULL), +(445,191,'E4DFD66163F2A65ECDD2EE9CA8062D707CC51882336F6483','',130380,14,'',NULL), +(446,178,'88182C96807A6025E628C90CE436C9EC54EC5FEC858A12B2','',690106,23,'',NULL), +(447,178,'EC322863C90B861E66A0008554BB8702EA92E1406F6F1711','',3070052,22,'',NULL), +(448,178,'9C851C7C05E54E5514E7BE038ABC5C669A3F5747EC573333','',3022016,31,'',NULL), +(449,178,'46D70E5C13F6D16BDD01A7481D9AFA51B73202070CA5D712','',673210,23,'',NULL), +(450,178,'CBEBB5F6F4EFB1324D17AB6CB48C573B639A37EAFD6299B4','',683146,23,'',NULL), +(451,191,'684575AAC0D8BC30D5325D56D3D522380E85ABFF380FA80F','',17938,11,'',NULL), +(452,178,'952BC8983C2CAEB6239BB2774F176A7F87A9F2DC10261205','',3045356,22,'',NULL), +(453,191,'4EAE0459E341062DB99658136D494BD79511B883F00BCE6A','',57602,42,'',NULL), +(454,178,'67E6E0A4006561DC5A67026886D1FF37AD14C5AA1AEA3CAD','',149,5,'',NULL), +(455,191,'222FE6B0A70CE2CEE633597E018706B3F78C338D96F6D9DC','',38300,21,'',NULL), +(456,113,'79747D68A5D6CD203671EF43029F17591E42BBCDB60B8B93','IPSect',0,0,'',NULL), +(457,178,'77ECC7613D44E56210F7CCDD6046226B41C8F087E901C94D','',682394,23,'',NULL), +(458,191,'77A59932BC8D497D992A213256ABD52C4D5F4FFB8A06002E','',49564,24,'',NULL), +(459,113,'2D14DD3BC859535580D8D9DC3BE7D59865A4E3FD112598A5','drvsys_mon',0,0,'',NULL), +(460,178,'9B487CD5032D00424A24FF3185AC4C17246729ECCE431951','',3049872,31,'',NULL), +(461,191,'978D8D1F3E1EF11CEBC4B65B13F1C5CE6E9E220E71B255B9','',13033,36,'',NULL), +(462,191,'1F5AD2397EB3CA814C5D156C6777C040F5D73085F3751C35','',433168,48,'',NULL), +(463,178,'912807952F9397C8F2B718C9164424D720E4EFC681DA3099','',3045356,22,'',NULL), +(464,191,'095F1A232F56B3DDA3338B5DE2CA310E5CF0EC0B6F72E87F','',17890,11,'',NULL), +(465,178,'2A5E27A3EE36254F61795E168A98C055772F88CEA5CCD6F1','',3033068,22,'',NULL), +(466,178,'4319BA4F2139568E87BAAC5F7C95121DD98D710B1C901E2B','',718842,23,'',NULL), +(467,191,'74E55BA8CDEFB5BD54BF1C0B0D326721D756440BA33C3ECE','',27270,13,'',NULL), +(468,191,'ED9FED6EE63B6C5E35C9E4615AC444603F6BF1FBC669D8B5','',13033,36,'',NULL), +(469,191,'DF967A96C67C8D6CB1955D1CA06556F37EEFC88D26F1D684','',90202,13,'',NULL), +(470,191,'2BDB1F4509561B2F846AAE7A5354008215C1EF4BDD0EA1D1','',49347,24,'',NULL), +(471,178,'0F3B3F0934C1B1E32DC9F83F67308BF9CFCCEB0EFE10B2FA','',672602,23,'',NULL), +(472,178,'E89980FFE6987D22DF5379283F53DA8DC3B5CD4862BA22C4','',335122,23,'',NULL), +(473,191,'156B3F2929664A16C3DA2D47CE3050B3A1BC32F9C30E4776','',27270,13,'',NULL), +(474,191,'65B03F581DEAA68B6A07C679C6B620A2623FD83EB4C4978B','',28940,17,'',NULL), +(475,178,'044C63CB9F480E28E02D68426C1F3D69BD146B39A7F081B5','',0,9,'',NULL), +(476,178,'B3BC7201BF77B362B943C8C13F9E70A751906F304F9AE133','',673210,23,'',NULL), +(477,191,'4783BF04A6BD423D63CD955407780BE0E15A70BC2643F853','',28928,17,'',NULL), +(478,178,'A71B471FFB4C58A2C99FC6818DD0269C4AE4C5686D5FDA87','',690106,23,'',NULL), +(479,191,'3EA0347F1F7D9BC9CAE387816DFBE4F492F53533400315B4','',17762,11,'',NULL), +(480,178,'AA5ADEE929B0B2FB655080B35D19607695F611672E6AD364','',3045616,31,'',NULL), +(481,191,'2DAAB5C524CA576967A7B0B713C1C34DA8EBF3990A86730C','',28704,16,'',NULL), +(482,191,'D0042CAE82A7121F7783A1382F542074B34ABFDF50A1B13A','',22792,25,'',NULL), +(483,191,'4D30286AD524AB2EB05C1A361A81036F787B1C0ACA36DD74','',30012,16,'',NULL), +(484,191,'03F9E0F9328E7C7025C0D5C59585700F19E29E8C8F9BF5B4','',49564,24,'',NULL), +(485,191,'430C4F44FD7CDF1A51F7A8FA5852ECCDA6CFA92C2A6ACB3A','',28920,23,'',NULL), +(486,178,'A2886E2080C54F25867AEDACDADD8F5175545F44512A3B58','',672746,23,'',NULL), +(487,178,'8438939BFCD0C550664ADE2DD75DD15FA23DC435EB5FC011','',3638348,23,'',NULL), +(488,191,'66480AAA84C5C00B64EEABE96DD21EB3773228B144E25D0E','',20512,16,'',NULL), +(489,191,'76C1B0FAC29E4E41FC6DAC31A0592CB0087BCE0D052904FE','',61874,42,'',NULL), +(490,191,'DA219765DA22ABBDBE5486CF7DB01C283FBF9986732C9A91','',37180,24,'',NULL), +(491,178,'F58BFE40291DD85F45C47E0E255594382DE0180AAE1F1FC9','',149,5,'',NULL), +(492,178,'8D8A305C43A3DD47DE550F256BD5F4B1753EDCC079AF279E','',3070052,22,'',NULL), +(493,191,'69CA60928A9A85D79ED39596C018DF899BD14C6219EFE088','',41080,24,'',NULL), +(494,191,'8D9AA947B904C003D06ACDF4EA0C84104612B274696999C4','',17890,11,'',NULL), +(495,178,'289CBF469FC750449980BFC2CA6AD7E42A69E14595D140A3','',209352,75,'',NULL), +(496,178,'49961CDE71B612E5432EAB389E7AD193476E05BB2778B751','',700714,23,'',NULL), +(497,178,'43818F9575A04BF426F4BE167052859015CC63622F7D4F3A','',672746,23,'',NULL), +(498,191,'7828B55FDE24719EC377E29FAE55BA6324020D00CD42A99D','',360508,13,'',NULL), +(499,178,'5432916108AFDFA313B6D88C886D87B5722E43EEBCAFC627','',0,8,'',NULL), +(500,191,'106F24060B7A4FC87A7971A4B0EFC1021F7181A09598C336','',17906,11,'',NULL), +(501,191,'13AA99805639421566A2652F0A7104939EA52EF0F77CFB03','',24812,14,'',NULL), +(502,178,'D0938B578EC70162A30A25571CD5DC7E765780F6191EAE1B','',710730,23,'',NULL), +(503,178,'70FA2C3749960F1B0D881FDB186DB9992D6EFD30C6674104','',580768,52,'',NULL), +(504,191,'BCA2CC6F5740DEF5D01D314146879036A5B6965C01424B0C','',45223,24,'',NULL), +(505,178,'47DD279576A64BCB3A4AF23D55895600C73BB5C214B70AEF','',3049452,22,'',NULL), +(506,178,'09C9B53C215456866BF764553A7B7E4F1F20F33A8D2CB613','',3638348,23,'',NULL), +(507,178,'3EC2D3876D82F424718D3B8E0B87562244C3F5A11A29F0E8','',682394,23,'',NULL), +(508,191,'7B4E9BBDC89694CCAE5BA6996D4240EB2E0C9C7F03CC5D40','',59620,13,'',NULL), +(509,178,'E2333772B05ABC620076EB66CFBB4AFE2313CCB6D719399F','',3065956,22,'',NULL), +(510,178,'2EB4C04C0946264F5BC8EFBAA832CA97381A8A6523BAB093','',178504,96,'',NULL), +(511,178,'0E3DE8374276C08D5DD241ABA2AC0AC1D2319F5CD22AAB52','',2303444,33,'',NULL), +(512,178,'FDB8DF478DADD2E36619D63D04D106EDB86EBF8FB9EC8CB4','',3000288,31,'',NULL), +(513,191,'BA76761FA5F569497047C3484FBC6FDDD8AFA71B96FE93C8','',24812,14,'',NULL), +(514,191,'2496E15413F7008A01FA53AC109C01E45B80BF2C3BC2F205','',56063,25,'',NULL), +(515,191,'CACB6383E8613E41489D93D7FE7235BE61214F9AE0825F44','',13291422,37,'',NULL), +(516,178,'931C403D2562AEE58EEB2586D73D51323A3A739860290AA6','',690106,23,'',NULL), +(517,191,'1A95AFB270B9C0D170E7280816891492C21E87D92E9EA6E5','',433168,48,'',NULL), +(518,191,'7483929857AE7A16C2D9EB0857EB1D5E9477479C2EEF0B5C','',37180,24,'',NULL), +(519,113,'379E1F6905F203E1026DB54A58AF588EF5726D9F50FCF369','Afde32uu',0,0,'',NULL), +(520,113,'08394625CCD77F36897EF283FAA0C019EE9F36775182584F','Afd32uu',0,0,'',NULL), +(521,191,'D9ADFC0283E75A86A3E1672BF50F5D1AD8E8466AE7086437','',27270,13,'',NULL), +(522,178,'D37F6219417C0E5196D3A4473D57ED767E6D9B49BB2B9555','',0,9,'',NULL), +(523,191,'93AAFBD4B8B50D6AE72F3BA7002D76791942D0EC0E61253A','',41127,24,'',NULL), +(524,191,'F9B132A5E1FFF379EC7175C12A58683C85272CC96E03E161','',41023,24,'',NULL), +(525,178,'1867D3CEC9379D1E6B8A1B9B667BDB1B6084B02ED9A60864','',3037164,22,'',NULL), +(526,178,'86548378A25632100F7E6E872ECF4D591B7542D977B623AE','',3049452,22,'',NULL), +(527,191,'9E00F6F9AF1D63FA2628E60B7BF2B1D63EFDD42D69929A73','',41080,24,'',NULL), +(528,178,'7DDD4CF1352822A1F9D19775498EE865FABB26C69F8FDEFE','',209352,75,'',NULL), +(529,191,'3D793384AD147BDDE98743EBE1E943263EFD6CAD542E2757','',17522,15,'',NULL), +(530,191,'9014AFDE93FDAC6C20971BEE76898FBB300A744CCBC24DA1','',28956,12,'',NULL), +(531,178,'D1212D7155D2C3114DA596070139C0B3610597CA0CE1CB17','',149,5,'',NULL), +(532,178,'BE18517661568A9D7F3CC9548592867F3A987A705866F60F','',3049888,31,'',NULL), +(533,191,'5D833D8DF05A7AF50DF945F5AF6880D325AC52B3ABC815AF','',41188,24,'',NULL), +(534,178,'1AA3B0D9AD368562F181E4E5D498652B3859210C126824D8','',672602,23,'',NULL), +(535,191,'331E027A700CAFDBEAC9E80B68B8304D0895D52947447448','',501956,48,'',NULL), +(536,191,'8E704337CE9F823A8A93947130ED1EE14A99F2EDB5458B94','',12194860,37,'',NULL), +(537,178,'BB1C818F79DB2F1FF71B7CB181021EB4F425311D09DAAE81','',0,9,'',NULL), +(538,178,'F1AD484D3F189A08EBF420C235D16ECAF1B485092FB063D6','',3045776,31,'',NULL), +(539,191,'1CF7028BE4D68B7AC6BB8061BECBFF402860541D04C90C0C','',17906,11,'',NULL), +(540,191,'2550D8249054E57086D4F4CF80396C686A71673C070711DA','',17890,11,'',NULL), +(541,191,'E864BD00AEB4F3D18CFFA7AADEAC7926A9A1E3EA7588F17A','',29884,20,'',NULL), +(542,191,'9E70338B4C8C845F8514925463DB624FC4423F9C467F5E62','',685304,44,'',NULL), +(543,178,'FC5EF49EDEE7A5268395298071BBA270822547A7416AEFB1','',3634252,23,'',NULL), +(544,191,'8282F57B7C3CD9B449B6363D5C9E792C2044EA2C3F381F9F','',17282,15,'',NULL), +(545,191,'B793EEE20E44B2942C6522F79343C58738A1A8489A381FB0','',24812,14,'',NULL), +(546,191,'6178EE9E575927A3505835AC88DA31BE15F0622DA55B31EB','',28956,12,'',NULL), +(547,178,'7BFD2D88793D6AB1A2351A3E8873B1E20CF44BF6563A0930','',3049888,31,'',NULL), +(548,191,'4102F13984A4E146C134D3F607AE7CA1B3263A22B52308C6','',447736,48,'',NULL), +(549,178,'EA1C4CA2A64548757BC2ED1C5BB6D2B5094AAD5B5C331F7D','',683146,23,'',NULL), +(550,178,'BEB42A9DB2B656B2DFF3DD7D1B8D87033F1D99A019CD4BB5','',3045632,31,'',NULL), +(551,191,'4E209437251EBB0CF31CF8A7CCF2C873A4D759B9563D573E','',34176,25,'',NULL), +(552,191,'85EB9C8A36B32287F096CF73F7FAE8B57405321342E9B779','',17666,11,'',NULL), +(553,191,'2EDE42629DD4A72669FFC9BBFBE15F357BF241853DBF7B2E','',27270,13,'',NULL), +(554,191,'FF47A1D9514F4DD81BDA23FC9018F03D894F9096E26EF809','',18680,35,'',NULL), +(555,191,'65185BBCA1D9995EA4B796E908B9F78923FDAE2D0C2500BC','',594348,26,'',NULL), +(556,191,'BD55E51B55A8FAB82CBF45012D761B1BEEE9BC0DAD8A83CD','',28920,17,'',NULL), +(557,178,'AACC3E694ACD478B1F99714734B5A43BD7D7A2A3565ED9B2','',3049492,22,'',NULL), +(558,191,'F3C07663325C5358F58A547725FBDF8DEF591021CD94513D','',685304,44,'',NULL), +(559,191,'503B5AB938616DE7672103919957B421FA8B6C98F72375F6','',20512,16,'',NULL), +(560,191,'3B6EFA3FF9443BEF4CBD2E7CAE08DA1753C79E5EDFA8510F','',37136,40,'',NULL), +(561,191,'3E5D1B5BBAD191442388FBD5236F5406CB2CA68EDF986328','',17666,11,'',NULL), +(562,178,'D8AB51DCC7840369846821B2A6B229CBA2E42C0CA566792D','',0,9,'',NULL), +(563,178,'F8004FA24C4925FAA3ED4993B0D457C5E4C5371915BB93D0','',3037164,22,'',NULL), +(564,178,'EAF4A696D564F6BC800BF0F6D732E4E92B50133DE02EE8C4','',0,9,'',NULL), +(565,191,'30BDC2BC3E4A2055426FA0EC67DBDEB7705C58047EFFA4D6','',61874,42,'',NULL), +(566,191,'3C8BCED97B2F9E5A52587E725004E136DED2B53AB2DB9D4F','',20512,16,'',NULL), +(567,178,'0B586F15A8CFD6B7A96632FF2B48D0F71E9D06BFAC174002','',3049888,31,'',NULL), +(568,191,'B2B3043BF9CDF3DB535D52ABC45BE586E6B8097B58D82C45','',17890,11,'',NULL), +(569,191,'9ED22064CDACF86DAC8C365C325EE428A87B628D137E038E','',28920,17,'',NULL), +(570,178,'2254B046D6D8D1A47E5F9275474B5EEE7A96CD99E8D952E9','',682378,23,'',NULL), +(571,113,'0A268B6DB28320A1956B54C36C61C625B02A48A4768A0823','Afd32uu',0,0,'',NULL), +(572,191,'41B3450DB8D10C506A561C7B95354A7792286D837C08B437','',12194860,37,'',NULL), +(573,191,'5CEDF5982800D9C6D16F9D357AEA17BBBAABADC8F3A12EC6','',45223,24,'',NULL), +(574,178,'3399D1DE6156FDE8614333B6C4AB0F5B2354381AAB7AF818','',3049872,31,'',NULL), +(575,178,'31DA5322A7B1F1715CA35F0976C201122A76D46A719F0C28','',335122,23,'',NULL), +(576,178,'36172791F3ACC5EFD406A7AD6F5D218279B94D458BDD60C3','',700714,23,'',NULL), +(577,178,'C64DDA3E5D94BD0DEFEDDB867DD304177B554C5771CF4DEF','',682378,23,'',NULL), +(578,178,'701D57AFE1315795AFE1340C35E923FE69C36EFC670C0BA5','',0,9,'',NULL), +(579,191,'D55BBE3C196C2FE07829CC54717C0A2A27C13A38ED4CF582','',30012,16,'',NULL), +(580,178,'DAD3C22D23FAB30C9AA6796E19EAB23CB7DCCD639854C14F','',3045976,31,'',NULL), +(581,178,'B3EC9710B55079104420F126BA7257F8FD7DC39D46880E5B','',2299060,33,'',NULL), +(582,191,'7762CCDD012D51167BF42F775CC307238C35EA5DA55B999E','',41096,24,'',NULL), +(583,191,'CEB7B2C893B8410CA8716C77DB679AB860F7F0E86BCF2D8E','',12194860,37,'',NULL), +(584,113,'C584FF543FABE32DBA3206AB324CAFAD92497C4926BBF8B2','HideEx',0,0,'',NULL), +(585,178,'122B96C9AD3D43FA5EE82ADFA464904F304EB7FD4CB5622D','',2299108,33,'',NULL), +(586,178,'3EFBC5B273BFF42D9F704C74DC2381B8A0D50D61C2F1512E','',717898,23,'',NULL), +(587,178,'8C5824E4A6D16714A2BFB5FC9D0CBF4706B8A2170DA87D7B','',0,9,'',NULL), +(588,191,'402282B90E06579656CF454305C0B5A925C95FBF6A7CF265','',477928,60,'',NULL), +(589,191,'71B36C6D650EF0D049328643E5B12E73DF95B58B2F30D0DC','',17938,11,'',NULL), +(590,178,'7C49C303394E1493D897E802528CA8E558B6A7BFE8320F08','',3037164,22,'',NULL), +(591,178,'2C190F9E920AF2EF67DA4D06905C2A6A0A2BC63D0192BAC5','',3045632,31,'',NULL), +(592,191,'E59168C40E1A0C9F8896EA9E2D684988D81A522FFCDC51D5','',3766400,37,'',NULL), +(593,191,'3C825803D3ABF20A11495E54718A2D83A0B35FD7D741B5E1','',12905,36,'',NULL), +(594,191,'DCF32E3E1C5DF813DFB137A2D9B21D95B0AF66CC2AD0F245','',41023,24,'',NULL), +(595,178,'7B66BDB4A0A713A7B315888708B88F90CCF7313832CCE35E','',3045356,22,'',NULL), +(596,178,'FFAF20DD14D7018A4156F000D1455DF36966513EB76F93E7','',2299116,33,'',NULL), +(597,178,'0C59AA1F05D2D9D3C0C5ECF6A38D9FF57187A7A461DEE908','',717898,23,'',NULL), +(598,191,'913AA6D16EBE73143FA4B4EF89C786668C6E7DD0B936DD18','',90202,13,'',NULL), +(599,191,'A9F5CA81A547D8F8051928A287DD280F7FE835B2858CEED5','',20512,16,'',NULL), +(600,178,'16B4D8897AEED4732A47239CDC99603D2F505D0AD602847F','',673210,23,'',NULL), +(601,191,'23F29E10D55E8701A1A699A1C05CED4553676E9FBA5B51F5','',13634,11,'',NULL), +(602,178,'9A65A024256C0D7D677C9F24A9C16A48BEA9B03CCA016098','',3000288,31,'',NULL), +(603,191,'AA0004288ED58DE4324FA521F849807DB1EF33634C7FE8C3','',61874,42,'',NULL), +(604,191,'E400A401BD0376A0475F1216731F5EE0DDF42C9A4FA805D2','',59620,13,'',NULL), +(605,178,'FD434987A57E848192562B61CA0D67BDCEA2392514CDD0AF','',3000288,31,'',NULL), +(606,191,'88C140A6580061C775D9141887FABD3F20E574DC4C0C4BBB','',9977,32,'',NULL), +(607,178,'3623B441A5D414AFD6650C8B8623ECF3C3A9129E1F5A81C1','',672954,23,'',NULL), +(608,178,'393A06D430D287FEC1C02F9945C34BA2A7954241C6357909','',335122,23,'',NULL), +(609,191,'0955A3267A3E576B9BD823BB210E8200F37CCB0421BF208C','',685656,44,'',NULL), +(610,191,'1A00ED18B456ADC1A1F39A5DEF572250FB0CCAC8BECA9DD8','',477928,60,'',NULL), +(611,178,'370B9B6E3AA987595F986C5716BF9FFCF0369438D5DC5D11','',156,8,'',NULL), +(612,191,'E8E85DFE24D8D20852A37D702CDF029C3B1FA30B99CAA4BE','',447736,48,'',NULL), +(613,178,'FA24C5FEEAF4538DD4913F10C99F3F64380B7354EB318386','',3041472,31,'',NULL), +(614,191,'C6AD92AC13B340575AB5D0769A1A7EED47BC42A5968E67D6','',37136,40,'',NULL), +(615,191,'990EFFE367D44A29E82F62C57B6041A66F66C1D100B05639','',28956,12,'',NULL), +(616,191,'631E42C3B6ED8A22F5AFA903176A7EB011754F5ABF2081EF','',3766400,37,'',NULL), +(617,191,'D8AB4091C51177D7BBA7384EE12E0384A7EDB73E38D15920','',13291422,37,'',NULL), +(618,178,'54AAA1926869D259C427870A620AE0C24AFC9B472F424633','',3049888,31,'',NULL), +(619,191,'CC0E40919988E53DA0B447F0984A30D51CC42E9DB54A8F1F','',49564,24,'',NULL), +(620,191,'396E7EC540DC2C74CD6709753CC627517E3A2DB8A1EF3633','',29916,16,'',NULL), +(621,191,'84A5A077180DFB9841E8DF4A4EC49EADE886D905768EE032','',57602,42,'',NULL), +(622,178,'072300C283F8DF72B3ED5F3CD8B7DF47574AECF7B21FBB59','',668874,23,'',NULL), +(623,191,'D4FC9A6022B7CFA81904503E43B813631D4735D80BC61868','',9977,32,'',NULL), +(624,178,'47B5A19B87234257CB6C1485AB2C0CB25513260F60094BEE','',3037164,22,'',NULL), +(625,191,'B8B6F4BA5FD45F0ABDCB060F72987987B6EF62B80C9E378F','',12194860,37,'',NULL), +(626,178,'261F2915266F20B7289A1560176F24198930C61540BEFA01','',3638348,23,'',NULL), +(627,191,'019A378006B0677C0B2F42C6CA882EC571D504E7D8F5B05B','',17282,15,'',NULL), +(628,178,'4E82DD9F04571D6DAB2FFCFCD638699D1D4C84917F720F32','',717898,23,'',NULL), +(629,178,'EAA75F6AE049552C55AFFDABB7268682428B1A9BF028C4D4','',673194,23,'',NULL), +(630,178,'F1431C669453FE0BD95430ECD8328EA0D3CD37BA658F094E','',198,12,'',NULL), +(631,178,'8AD8C581E8BAF7A2140211C4298A93E229493F272F4EFF4A','',3045912,31,'',NULL), +(632,191,'C154E3B6CE0B979BA98FEDAA1829DCCF2A7172642DEF9EFC','',37180,24,'',NULL), +(633,191,'295A29C81B1B9CC9B6758440BED913ED4D8B5E05A90D7CE7','',41023,24,'',NULL), +(634,178,'3ED9105E3D1F31AD1D4376C54B07D18348C56E7453D161B2','',690106,23,'',NULL), +(635,178,'74C75B8F0147ADA8610F6C9BB80C4BDA543C1D95943ADCEB','',0,8,'',NULL), +(636,191,'7BE7A7D3F4AD8B30A0A144D5D4AC5E569BB9A0D18AB590FC','',37180,24,'',NULL), +(637,191,'0B5C54A4850924038D95A3F1C44F300921CEA1E13644842E','',57602,42,'',NULL), +(638,191,'876743AA30D61C83444427F4F18203B2FF443C337E5DD190','',22792,25,'',NULL), +(639,191,'C83A14C21D1E66345574E3E0E3613E924F702883A30A1809','',31924,23,'',NULL), +(640,191,'2545F02B4FC2F5425960A2E5C0299936C99FF2EC68A5ECDB','',501956,48,'',NULL), +(641,191,'85EF9C6353712A8D0E2E27B1702B510A95B1305473F86345','',41023,24,'',NULL), +(642,191,'35282392AA86692A153FC159D6E13C74F9DF01661E4867D6','',13538,11,'',NULL), +(643,191,'0D6CC3008615CD5BFB96A90620805B78D5BFBC6100B1AF0D','',13538,15,'',NULL), +(644,191,'D573179188521C485CFD24A9EE9CDA77C540A31EE68E3E78','',41228,24,'',NULL), +(645,191,'8FA80694C3766FC1B041103EB35EBA3B7C77081A5DA8FFD8','',28940,17,'',NULL), +(646,113,'CD6B8F9D23612C807F7653D29F1F1C54BC8F917C5C5BD8F1','Afd32uu',0,0,'',NULL), +(647,178,'FCB5CF830DB536208D4C58E5838D1C8798F0738247EF0867','',672602,23,'',NULL), +(648,178,'4451680A3F41926C1545701887F93A0A49CC29C3E114AADB','',4011280,23,'',NULL), +(649,191,'6BE2C4F29ADF49AE5BF0485A27A854087E775FA28047168C','',27270,13,'',NULL), +(650,191,'016FF5D8685E37969B1B7C310756DCD93D4AB34256837031','',38300,21,'',NULL), +(651,191,'6726DA4A8F112CC25DD78500CA9BF792DB688F7D8D1FBC4B','',57602,42,'',NULL), +(652,191,'9F8B3A3C70027496420A619969CF1EB7AF447D245DA766A0','',29884,20,'',NULL), +(653,178,'E74FFC8ADF5FE8A0FE0F10BCABCFCEDB3B2B9C2307340D7C','',3041472,31,'',NULL), +(654,178,'B31302D6A47971059B2643B57D2D50EBEBEAA89BE483F1F4','',3037164,22,'',NULL), +(655,191,'2F761DEA3CD3394A0091D745FD2976B52F3B16BB0A48BC80','',29884,20,'',NULL), +(656,178,'8E44EC966A93870696359D3E2474D12C071A381B9403B1B9','',673210,23,'',NULL), +(657,191,'2424AFA7FEC48FF09E5E3BDAF93FAA74743A7551B6FB1495','',56063,25,'',NULL), +(658,178,'ACCF5804D419F30643F87A650C4DC6E0E10266922692AECE','',682378,23,'',NULL), +(659,191,'6EC19D6D1244E3FE787AE448EC905C509DBA3C01FBE34F24','',41280,16,'',NULL), +(660,178,'5B2D2EE40383C33D381998995210918AC6B1AD67C5880F6D','',710554,23,'',NULL), +(661,178,'83FFE0F8F224D5E56C38D731EFE8AD5AD1285B1AD4FA019B','',683146,23,'',NULL), +(662,191,'9D67A809FD8FDA1E1504F0C038E21E1D5FC4C6D11F426228','',28940,17,'',NULL), +(663,191,'2965EC092EC0A4B3D4A3C781F0A0A542824C77B7300BF50C','',45324,24,'',NULL), +(664,191,'FE31901F5558E6555DA6BC5B1BC3415E82CB97DECBB486BB','',41096,24,'',NULL), +(665,191,'B35406A77D6501A50F41981C7C137AD5272EB612F4A74109','',29884,20,'',NULL), +(666,178,'7275397E511B45264BCFA30E3A3F8101894AA3923D91BE6E','',3037164,22,'',NULL), +(667,178,'CA7D8D0E1F20385DCF6FC209799750CE9D0160B0C67196E7','',700714,23,'',NULL), +(668,191,'F5CCDA244D826B3180E7C49193B3B0B5DBF651EC67DCB47A','',594348,26,'',NULL), +(669,191,'7977F1E72B30179072EE1784396AB0406D06162051CA1EDB','',37136,40,'',NULL), +(670,178,'603F8A015D8436CCBCD68B26FF6006E7A81BA9A8D9524B1F','',3045356,22,'',NULL), +(671,178,'9631E9EBC78E0333010E522045852C7BEA44655080D418F3','',3049888,31,'',NULL), +(672,191,'43BE7C00605D9FECAEFAE38D8FFEAED78B8382563A245F10','',9977,32,'',NULL), +(673,191,'E493F1BAED1DBE7A0D429BF1A5D665636D29069060310BF0','',13291422,37,'',NULL), +(674,191,'6C53203FA95EBE4DBB0A7F3E85994058DECA069A5244C29E','',130380,14,'',NULL), +(675,178,'5A07E5A0525DBD5005CBDE16F7393EC8B795ADB2327C2F96','',3045356,22,'',NULL), +(676,178,'D7665366F333BD580C5F8E2FF8971294F69E99EC7E3623F3','',717898,23,'',NULL), +(677,191,'FB87EB8F178C69D9F7576AC7FF75D0479467057A2B6C956D','',9977,32,'',NULL), +(678,178,'292911AC98E7ED34DF021B562D5DEBE8DAA15570B552978B','',3000288,31,'',NULL), +(679,178,'6618F45C49D47C4105070C085FD5C384254A62E4AB614DB9','',3634252,23,'',NULL), +(680,191,'316E531545999AFC533814888434999501FEA8ABFBAF8655','',134968,32,'',NULL), +(681,191,'9945ED64886F68664A4BDF50731F4B4DC680273AB2E0DBCB','',20512,16,'',NULL), +(682,191,'1D4D6EC7B6B26553FC914D28BF9B62FD81D0B865DE606D97','',29884,20,'',NULL), +(683,178,'63B2D2ACF6E912CDC68282B080A2D610BE6AFE8EBB95FD31','',3070052,22,'',NULL), +(684,191,'B0955BAC042D5441496103E7C45E38609A9AE3799D534BD9','',18680,35,'',NULL), +(685,178,'6488E44D4E965581650F73F6E68DD8F863795162D99104F8','',682378,23,'',NULL), +(686,191,'CC0D3F7D8FCF928A55F92F6414F4AEF7AD75DED5819BF870','',13538,15,'',NULL), +(687,191,'CD3835965AF27EC338F828666CD06089B847B04A2DD56AE0','',17938,11,'',NULL), +(688,178,'D04E9CF6A03D4767AFF1E4EE0EFBC333AEBA5B0552F15957','',0,9,'',NULL), +(689,178,'120904F033D78A13DB0971F095C809852B7EB876D1A8AA01','',3045632,31,'',NULL), +(690,191,'7DDD19DCF77E27DF0A31BC21C7F716FF85076AF065F102DC','',36924,24,'',NULL), +(691,178,'5486E2CDD98AC3F25C223FD515CE7EF3FB09AC12ED338C86','',198,10,'',NULL), +(692,178,'F8D6423F01E5369D16F6F70180083B936F0DDE3737B23308','',2299092,33,'',NULL), +(693,191,'EC10CC349A8E654240B27B03EE1232B9CCED28F7104CCB71','',49347,24,'',NULL), +(694,178,'29E064ACC509206873A1D548F4816DB60D29D6EE9FF63A56','',682378,23,'',NULL), +(695,178,'E1A8A2A81920A7BA9F419A6D19CAC3DD9E292EF39F963234','',676970,23,'',NULL), +(696,191,'32393EB09F7C829F58612E5E47018F7203C43218C3506C79','',20512,16,'',NULL), +(697,178,'AFC4D19CACEDE8E9A2FDE3CC3D29CF8556AF4980872DFE1A','',3033068,22,'',NULL), +(698,178,'09A2B97FD351B1D339030233AC51C741E0ECDC21AA7A152B','',3049452,22,'',NULL), +(699,191,'2B2AF2171B8A9FC0D44EFE0ECDCB9DE1A55ACC8D83661E16','',41023,24,'',NULL), +(700,178,'D111B236DC42EB338870E72FF6EE3141714D0437864B02AE','',3045356,22,'',NULL), +(701,178,'E6DC6898929D1DA9F5768A9BFCBE848F8C1F31E8B6910FB8','',335122,23,'',NULL), +(702,113,'85A32F8B5F8430A086D27E62EB17D878E49CE815F6AC91CA','IPSect',0,0,'',NULL), +(703,191,'B6CB7B905A6BDD64BC032BE71927C1FE31153D14D6CF87E1','',447736,48,'',NULL), +(704,178,'40EE7F4EEE1D707ECB770CDBBB54730CB863CC8E268D4208','',3634252,23,'',NULL), +(705,178,'D74E308262D8C52ACE81B66F1D90C160AC86B2E0508176C1','',0,8,'',NULL), +(706,178,'E15287D29EE155299619F8E93E66B55B564FD921FA41CF50','',3049452,22,'',NULL), +(707,191,'58DFAEE44A52F0D5A58B0C94F0E5E63C1C7F76206D7FA7CA','',22792,25,'',NULL), +(708,191,'83705EAE8AAD9709494E52EB05AC0481C998C15730E61099','',30012,16,'',NULL), +(709,178,'0271F4D624304A48CB7CDFA016E3A735DCA3170FAD557468','',3070052,22,'',NULL), +(710,178,'217DFFE3C12F984992E1E0AE7B5864061572BA301B21D869','',178504,96,'',NULL), +(711,178,'C5C7AC33D1E4CF33E661033006BFEDE08523B643CCF51261','',3045356,22,'',NULL), +(712,243,'','',4618113,10,'FF1554F79D003B470C89','WS2_32.Send'), +(713,191,'D45144FC835266270E67CFB1F2900FD227B63204698A3EA7','',50040,26,'',NULL), +(714,191,'B5BB832AEEC591196864E08A392592C5789D76D3DDDD4DBF','',27270,13,'',NULL), +(715,191,'93582814E00150E2DD750ACAD7BD1719C4EBCD4C06F482AB','',28940,17,'',NULL), +(716,191,'FD6B6AC7FA5F2E7828CB1B429A9442383BD93E762A5D7D00','',31924,23,'',NULL), +(717,191,'51DF4EDECBBE42CC7C5D6723318F98E43E14A45F41CBD124','',41080,24,'',NULL), +(718,191,'F2B2260FDD23E5F268FAAE4D1A48E74C452F2AC5D114765D','',57602,42,'',NULL), +(719,191,'69FBDB69EC2E113EF691E47EDD46E40F03D1EBE226A1F7CE','',29884,20,'',NULL), +(720,178,'E3E431D8F8FB38F0F2586D0F50D809BCCEB13651C5EF2619','',682394,23,'',NULL), +(721,178,'2294015927F07D884FE2923FA17B3A8BCABC0A378930CF84','',679578,23,'',NULL), +(722,191,'0A022AB25C52F94404A01F96687B2D6E6BE774237254BD05','',20512,16,'',NULL), +(723,191,'65EEE243504EDC3319C3528B1A1E8061A3E75F4C25B61F95','',41228,24,'',NULL), +(724,178,'877C654036A29FC108FE8D69D416361732D7A0270E51189D','',3022016,31,'',NULL), +(725,178,'1A223564DF9E7BADD3CF858FB8250FE59F892232AC3B412D','',4011280,23,'',NULL), +(726,191,'4FEDF58FB4DE45289C97ACCF16EB2DEA6FBC85C74A52D3C9','',37180,24,'',NULL), +(727,191,'D4BE47EA1D68B92E2AD8307D139877705BE2B6A98B6A916E','',13033,36,'',NULL), +(728,191,'9658AC7EF426A52C327BBC1ED71C6FA6DC5940E35DCC18C7','',18680,35,'',NULL), +(729,113,'1B17998CD8E0CDA4D84B0A0F9DB05E536DACE0348A883D24','ndis_x86',0,0,'',NULL), +(730,178,'BB9B86ED12359A465B02387A1D727F11F78D35C8B7FCC2FC','',2299092,33,'',NULL), +(731,191,'842BC1A8C53902D26018B1C5E05ADCD70D973A968E298331','',50040,26,'',NULL), +(732,178,'3E894F9682573CC0AD54C7E9873C9026AC050929392D0B93','',3049452,22,'',NULL), +(733,191,'4A31E3D24FD6D576D84EF1BFB813D0F066870DEB38C32E47','',21826,11,'',NULL), +(734,191,'EEA122B4C066EC0B196F67511E633EBACB37C4EA6AE4BFF7','',41096,24,'',NULL), +(735,191,'66211671BEF80FB973B1C9595A70B462AD79EC83530DFE89','',12905,36,'',NULL), +(736,178,'3760BBD6FE99A0BBEE0AB61A8BD52A6ABCAC48FF3CB265B8','',3070052,22,'',NULL), +(737,191,'70F425426612D0D8495386C2375F7A4183548C0D4E7DFA46','',594348,26,'',NULL), +(738,178,'BB310E9DDE9259027123500E65F9FA1E8D9D0F5FE8381CD2','',3638348,23,'',NULL), +(739,191,'6FFB5E4982D306680E0C59087DA961CD4F6B068E323C3BB4','',401992,14,'',NULL), +(740,191,'6DDCA79B7460A1F3671532A28FDCEB331DE6CA550E3178D0','',3766400,37,'',NULL), +(741,191,'A8F7B2FB37CF3BEF43D6CE5C0BF85E85077E681490BA1C4C','',37136,40,'',NULL), +(742,191,'052F425E7528B3A7155C45EEE530F915DBB154E5C8876E25','',50040,26,'',NULL), +(743,178,'D6DE200B631AF71BFBC76202D82649942FD6ED9BC4A9EF75','',198,12,'',NULL), +(744,178,'61077261C66B2CF9B199F115A3A656EA6A00068F151E3656','',706314,23,'',NULL), +(745,191,'513FC0F0673A9DF86FA1FA05371040C14634CE08311ED619','',401992,14,'',NULL), +(746,191,'5E0970A6EB246A79DDF427CB76D0D921F971E13921DD5D2C','',134968,32,'',NULL), +(747,178,'53CAC3EF654610AC7E043C6AAD62709EF0B5400DBDE755EB','',149,5,'',NULL), +(748,178,'566637D06BAEA9190B7CE510C697F72CD20FE3D958A95A25','',3049888,31,'',NULL), +(749,113,'3C9B0CC7FE020EEBD43E6B1D88EDDF0EC46AC35974765068','drvsys_mon',0,0,'',NULL), +(750,191,'BDFEE5DCDD37FC5B2A1B3E42FBE5F7997CFED35E86062EB6','',28920,23,'',NULL), +(751,191,'7794AE60131E4D07860DB48047206784B885B30457EAB83E','',12194860,37,'',NULL), +(752,178,'653A308BB00D914AE1ECD773BA4B0BA7724874BC62647D10','',3037164,22,'',NULL), +(753,178,'06B696C35F905E75B451A02E121BDA0330CD44E0D9B872BF','',60648,56,'',NULL), +(754,191,'35E8CD9E8CBD879B1E53278926C634AA8B72B8D9A20009F9','',17522,15,'',NULL), +(755,191,'9B13F2E744904ADAAA062F9113A576D11C2C450D1CD6A4AB','',13033,36,'',NULL), +(756,191,'60851B4A6F7338632A84795FBBB20320E49AD2CC2034BA80','',28940,17,'',NULL), +(757,191,'3BC0BE02AE0B6975974D3B13B811EC6BDACBF9EE122BE633','',90202,13,'',NULL), +(758,191,'E47F7DD8D5B5C29B70AFFD4F25AA286167D411937F9BD247','',36907,24,'',NULL), +(759,178,'35D1CDEE86A410DF087DE6D5F5AC6289C4888B9753293E73','',3037164,22,'',NULL), +(760,191,'2ED2EEB29EE0D48477779E5CA875F1F5F15CCE74CA85BDAA','',28956,17,'',NULL), +(761,191,'A373FDB6A789CC46072A4CC51A429C817C40862DC6C0190F','',30012,16,'',NULL), +(762,178,'3D02551F548DFB58832626FE90A7AAA12824D93A54A0DC14','',709322,22,'',NULL), +(763,191,'09D04CF8ABC51D06D874784442987E5F2631041550607255','',36544,55,'',NULL), +(764,191,'F3CD473F8C85977895CA5BA9DC22185BCCBBF6B977205193','',448492,48,'',NULL), +(765,191,'30E2F23DB1038D16D2DEEAB1D0F1790D961E468368DC5108','',30012,16,'',NULL), +(766,191,'540D465F760320A63981289D30CD40CCC770EE126523C71D','',477912,60,'',NULL), +(767,191,'C461E1BE054FE29A1FD58B33D33890BC4A1279DE4F572B47','',37180,24,'',NULL), +(768,191,'1AC3D903CFCA11321E76A257BDA0608E5060030BE745CCF3','',130380,14,'',NULL), +(769,178,'96281A2887E61232007D7015E4A35DA118794841A8EC84BC','',3037164,22,'',NULL), +(770,178,'8A1AC926B46A9E3D60D3BD87A59FF77D7B80A1510BC327A7','',710730,23,'',NULL), +(771,191,'3620B6BDF3993B87FD35E906FE8376A04FF34684E2023D8E','',41280,16,'',NULL), +(772,191,'025C373F05EC6E809EF5A86A903570FDA14D219286BCED5E','',448492,48,'',NULL), +(773,178,'5C0E4EE98C4E34CBE44F6BD595C13DD675555164A8D491DA','',710554,23,'',NULL), +(774,191,'BECE667BF9443EF6515E8E154F74FC2C5817455C8636DB72','',501956,48,'',NULL), +(775,191,'94F1DA3E0D955761826D6BC932E26F44D321B4838C7567D8','',13538,15,'',NULL), +(776,191,'EA3A3AD71FD14B038C98F256E80C1EFA1F45562A3DF92E7D','',22792,25,'',NULL), +(777,191,'AD5A8CBF55EC436DA968EE0B9744C93F65D9E0D6E3C1B136','',174688,37,'',NULL), +(778,191,'9B6B3B311BA9007C06CF0D146BB979B11CF295C58768DD4F','',31924,23,'',NULL), +(779,217,'','RPE.DLL',0,0,'','rEdoX Packet Editor - injected dll'), +(780,243,'','',5345728,2,'558B','Lua Protection Remover'), +(781,243,'','',7726137,2,'7414','Walk on Water Patch'), +(782,243,'','',8016620,2,'7417','Collision M2 Special'), +(783,243,'','',8016079,6,'0F8462010000','Collision M2 Regular'), +(784,243,'','',8054762,2,'7506','Collision WMD'), +(785,243,'','',9995315,2,'7544','Multi-Jump Patch'), +(786,217,'','WPESPY.DLL',0,0,'','WPE PRO - injected dll'); diff --git a/sql/old/3.3.5a/2012_02_19_04_world_misc_db_updates.sql b/sql/old/3.3.5a/2012_02_19_04_world_misc_db_updates.sql new file mode 100644 index 00000000000..32fada1e895 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_04_world_misc_db_updates.sql @@ -0,0 +1,21 @@ +-- Horde Orphan should not have weapons +UPDATE `creature_template` SET `equipment_id`=0 WHERE `entry`=14499; +-- Tog'thar Gossip +UPDATE `creature_template` SET `gossip_menu_id`=264 WHERE `entry`=2238; +DELETE FROM `gossip_menu` WHERE `entry`=264 AND `text_id`=761; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (264,761); +-- Cosmetic Silkwing should have InhabitType 4 +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=21840; +-- Leoroxx +UPDATE `creature_template` SET `gossip_menu_id`=8511 WHERE `entry`=22004; +DELETE FROM `gossip_menu` WHERE `entry`=8511 AND `text_id`=10645; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8511,10645); +-- Spiritcaller Dohgar +UPDATE `creature_template` SET `gossip_menu_id`=8513 WHERE `entry`=22312; +DELETE FROM `gossip_menu` WHERE `entry`=8513 AND `text_id`=10647; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8513,10647); +-- Ogrin +UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=22468; +-- Wanted Poster "Blade's Edge Mountains" +DELETE FROM `gossip_menu` WHERE `entry`=8242 AND `text_id`=10257; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8242,10257); diff --git a/sql/old/3.3.5a/2012_02_19_05_world_creature_text.sql b/sql/old/3.3.5a/2012_02_19_05_world_creature_text.sql new file mode 100644 index 00000000000..b70385660a1 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_05_world_creature_text.sql @@ -0,0 +1,7 @@ +-- NPC talk text from sniff +DELETE FROM `creature_text` WHERE `entry`=7604; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(7604,0,0, 'What? How dare you say that to me?!?',12,0,100,6,0,0, 'Sergeant Bly'), +(7604,1,0, 'After all we''ve been through? Well, I didn''t like you anyway!!',12,0,100,5,0,0, 'Sergeant Bly'); +-- Remove old text +DELETE FROM `script_texts` WHERE `entry` IN (-1209002,-1209003); diff --git a/sql/old/3.3.5a/2012_02_19_06_world_creature_text.sql b/sql/old/3.3.5a/2012_02_19_06_world_creature_text.sql new file mode 100644 index 00000000000..f69c4cb86a9 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_19_06_world_creature_text.sql @@ -0,0 +1,20 @@ +-- SAI for Erich Lohan +SET @ENTRY=3627; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,10000,15000,10000,15000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Erich Lohan - OOC - Say random text'); +-- Talk text from sniff +DELETE FROM `creature_text` WHERE `entry`=3627; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(3627,0,0, 'Magical studies stressing your brain? Relax at the Blue Recluse!',12,7,100,0,0,0, 'Erich Lohan'), +(3627,0,1, 'Best drinks in Stormwind!',12,7,100,0,0,0, 'Erich Lohan'), +(3627,0,2, 'Come for the beer, stay for the atmosphere!',12,7,100,0,0,0, 'Erich Lohan'), +(3627,0,3, 'The only place in Stormwind where magic and spirits mix, come to the Blue Recluse!',12,7,100,0,0,0, 'Erich Lohan'), +(3627,0,4, 'Free drinks at the Blue Recluse!',12,7,100,0,0,0, 'Erich Lohan'), +(3627,0,5, 'Feeling blue? Come on down to the Blue Recluse for a good time!',12,7,100,0,0,0, 'Erich Lohan'), +(3627,0,6, 'Head on over to the Blue Recluse. Where everybody knows your name!',12,7,100,0,0,0, 'Erich Lohan'); +-- Remove old waypoint text +UPDATE `waypoint_data` SET `action`=0 WHERE `id`=904450; +DELETE FROM `waypoint_scripts` WHERE `id` BETWEEN 432 AND 446; +DELETE FROM `db_script_string` WHERE `entry` BETWEEN 2000005185 AND 2000005199; diff --git a/sql/old/3.3.5a/2012_02_20_00_world_sai.sql b/sql/old/3.3.5a/2012_02_20_00_world_sai.sql new file mode 100644 index 00000000000..44f8ab68d70 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_20_00_world_sai.sql @@ -0,0 +1,4 @@ +UPDATE `smart_scripts` SET `event_param3`=2*60*60*1000, `event_param4`=2*60*60*1000 WHERE `entryorguid`=18481 AND `source_type`=0 AND `id`=0; +UPDATE `smart_scripts` SET `event_flags`=`event_flags`|1 WHERE `entryorguid` IN (-85175,-85176) AND `source_type`=0 AND `id`=5 AND `link`=6; +UPDATE `smart_scripts` SET `event_flags`=`event_flags`|1 WHERE `entryorguid`=30146 AND `source_type`=0 AND `id`=0; +UPDATE `smart_scripts` SET `event_flags`=`event_flags`|0x20 WHERE `entryorguid` IN (-85175,-85176) AND `source_type`=0 AND `id`=2 AND `link`=3; diff --git a/sql/old/3.3.5a/2012_02_20_01_world_gossip.sql b/sql/old/3.3.5a/2012_02_20_01_world_gossip.sql new file mode 100644 index 00000000000..f3943ded29a --- /dev/null +++ b/sql/old/3.3.5a/2012_02_20_01_world_gossip.sql @@ -0,0 +1,8 @@ +-- Fix error in Scourge Deathspeaker SAI +UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=27615 AND `id`=14; +-- Fix up Keeper Remulos SAI +UPDATE `smart_scripts` SET `id`=3 WHERE `entryorguid`=11832 AND `id`=4; +-- Spiritcaller Dohgar +UPDATE `creature_template` SET `gossip_menu_id`=8513 WHERE `entry`=22312; +DELETE FROM `gossip_menu` WHERE `entry`=8513 AND `text_id`=10647; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8513,10647); diff --git a/sql/old/3.3.5a/2012_02_20_02_world_conditons.sql b/sql/old/3.3.5a/2012_02_20_02_world_conditons.sql new file mode 100644 index 00000000000..f87a95fb1c9 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_20_02_world_conditons.sql @@ -0,0 +1,277 @@ +-- Update a typo in original data entry +UPDATE `npc_spellclick_spells` SET `quest_end`=11999 WHERE `npc_entry`=26477 AND `spell_id`=61832 AND `quest_start`=11999; + +-- Delete redundant data with invalid condition type +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18; + +-- Static Data +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`, +`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`Comment`) VALUES +(18,24752,44363,0,8,0,11460,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,24752,44363,0,9,0,11460,0,0,0,'Required quest active for spellclick'), +(18,25596,45875,0,8,0,11690,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,25596,45875,0,9,0,11690,0,0,0,'Required quest active for spellclick'), +(18,25841,46166,0,8,0,11795,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,25841,46166,0,9,0,11795,0,0,0,'Required quest active for spellclick'), +(18,26200,39996,0,8,0,11960,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26200,39996,0,9,0,11960,0,0,0,'Required quest active for spellclick'), +(18,26200,61286,0,8,0,11960,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26200,61286,0,9,0,11960,0,0,0,'Required quest active for spellclick'), +(18,26421,47575,0,8,0,12092,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26421,47575,0,8,0,12096,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26421,47575,0,9,0,12092,0,0,0,'Required quest active for spellclick'), +(18,26421,47575,0,9,0,12096,0,0,0,'Required quest active for spellclick'), +(18,26477,47096,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,47096,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,47096,0,9,0,11999,0,0,0,'Required quest active for spellclick'), +(18,26477,47096,0,9,0,12000,0,0,0,'Required quest active for spellclick'), +(18,26477,61286,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61286,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61286,0,9,0,11999,0,0,0,'Required quest active for spellclick'), +(18,26477,61286,0,9,0,12000,0,0,0,'Required quest active for spellclick'), +(18,26477,61832,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61832,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61832,0,9,0,11999,0,0,0,'Required quest active for spellclick'), +(18,26477,61832,0,9,0,12000,0,0,0,'Required quest active for spellclick'), +(18,27061,47920,0,8,0,12050,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,27061,47920,0,9,0,12050,0,0,0,'Required quest active for spellclick'), +(18,27354,60944,18,8,0,12244,0,0,0,'Required quest rewarded for spellclick'), +(18,27354,60944,18,9,0,12244,0,0,0,'Required quest active for spellclick'), +(18,28161,39996,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,39996,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,39996,0,9,0,12532,0,0,0,'Required quest active for spellclick'), +(18,28161,39996,0,9,0,12702,0,0,0,'Required quest active for spellclick'), +(18,28161,51037,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51037,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51037,0,9,0,12532,0,0,0,'Required quest active for spellclick'), +(18,28161,51037,0,9,0,12702,0,0,0,'Required quest active for spellclick'), +(18,28161,51961,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51961,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51961,0,9,0,12532,0,0,0,'Required quest active for spellclick'), +(18,28161,51961,0,9,0,12702,0,0,0,'Required quest active for spellclick'), +(18,28162,39996,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28162,39996,0,9,0,12519,0,0,0,'Required quest active for spellclick'), +(18,28162,50737,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28162,50737,0,9,0,12519,0,0,0,'Required quest active for spellclick'), +(18,28162,51026,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28162,51026,0,9,0,12519,0,0,0,'Required quest active for spellclick'), +(18,28162,61286,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28162,61286,0,9,0,12519,0,0,0,'Required quest active for spellclick'), +(18,28202,50926,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28202,50926,0,9,0,12527,0,0,0,'Required quest active for spellclick'), +(18,28202,50927,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28202,50927,0,9,0,12527,0,0,0,'Required quest active for spellclick'), +(18,28203,50918,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28203,50918,0,9,0,12527,0,0,0,'Required quest active for spellclick'), +(18,28203,50919,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28203,50919,0,9,0,12527,0,0,0,'Required quest active for spellclick'), +(18,28222,52082,0,8,0,12546,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28222,52082,0,9,0,12546,0,0,0,'Required quest active for spellclick'), +(18,28379,51658,0,8,0,12607,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28379,51658,0,9,0,12607,0,0,0,'Required quest active for spellclick'), +(18,28389,51592,0,8,0,12605,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28389,51592,0,9,0,12605,0,0,0,'Required quest active for spellclick'), +(18,28389,51593,0,8,0,12605,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28389,51593,0,9,0,12605,0,0,0,'Required quest active for spellclick'), +(18,28782,52280,0,8,0,12687,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28782,52280,0,9,0,12687,0,0,0,'Required quest active for spellclick'), +(18,29488,54568,15,8,0,12670,0,0,0,'Required quest rewarded for spellclick'), +(18,29488,54568,15,9,0,12670,0,0,0,'Required quest active for spellclick'), +(18,29563,56795,0,8,0,1,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29598,54768,0,8,0,12856,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29708,55028,0,8,0,12856,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29708,55028,0,9,0,12856,0,0,0,'Required quest active for spellclick'), +(18,29856,55363,0,8,0,12629,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29856,55363,0,8,0,12643,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29856,55363,0,9,0,12629,0,0,0,'Required quest active for spellclick'), +(18,29856,55363,0,9,0,12643,0,0,0,'Required quest active for spellclick'), +(18,29857,55457,0,8,0,12910,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29857,55457,0,9,0,12910,0,0,0,'Required quest active for spellclick'), +(18,30066,43977,0,8,0,12953,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,30337,43671,0,8,0,13069,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,30337,43671,0,9,0,13069,0,0,0,'Required quest active for spellclick'), +(18,30500,56679,0,8,0,13045,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,30500,56679,0,9,0,13045,0,0,0,'Required quest active for spellclick'), +(18,30560,57347,0,1,0,57348,0,0,1,'Forbidden aura for spellclick'), +(18,31736,59592,0,8,0,13280,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,31736,59592,0,9,0,13280,0,0,0,'Required quest active for spellclick'), +(18,31785,59656,0,8,0,13283,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,31785,59656,0,9,0,13283,0,0,0,'Required quest active for spellclick'), +(18,31883,60123,0,1,0,48085,0,0,1,'Forbidden aura for spellclick'), +(18,31893,60123,0,1,0,48084,0,0,1,'Forbidden aura for spellclick'), +(18,31894,60123,0,1,0,28276,0,0,1,'Forbidden aura for spellclick'), +(18,31895,60123,0,1,0,27874,0,0,1,'Forbidden aura for spellclick'), +(18,31896,60123,0,1,0,27873,0,0,1,'Forbidden aura for spellclick'), +(18,31897,60123,0,1,0,7001,0,0,1,'Forbidden aura for spellclick'), +(18,32788,57539,17,8,0,13075,0,0,0,'Required quest rewarded for spellclick'), +(18,32788,57539,17,9,0,13075,0,0,0,'Required quest active for spellclick'), +(18,32790,57654,16,8,0,13073,0,0,0,'Required quest rewarded for spellclick'), +(18,32790,57654,16,9,0,13073,0,0,0,'Required quest active for spellclick'), +(18,33498,63126,0,8,0,13654,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,33498,63126,0,9,0,13654,0,0,0,'Required quest active for spellclick'), +(18,33790,62781,0,8,0,13690,0,0,0,'Required quest rewarded for spellclick'), +(18,33790,62781,0,8,0,13705,0,0,0,'Required quest rewarded for spellclick'), +(18,33791,62786,0,8,0,13696,0,0,0,'Required quest rewarded for spellclick'), +(18,33791,62786,0,8,0,13711,0,0,0,'Required quest rewarded for spellclick'), +(18,33792,62785,0,8,0,13694,0,0,0,'Required quest rewarded for spellclick'), +(18,33792,62785,0,8,0,13709,0,0,0,'Required quest rewarded for spellclick'), +(18,33793,62780,0,8,0,13688,0,0,0,'Required quest rewarded for spellclick'), +(18,33793,62780,0,8,0,13704,0,0,0,'Required quest rewarded for spellclick'), +(18,33794,62782,0,8,0,13689,0,0,0,'Required quest rewarded for spellclick'), +(18,33794,62782,0,8,0,13706,0,0,0,'Required quest rewarded for spellclick'), +(18,33795,62779,0,8,0,13685,0,0,0,'Required quest rewarded for spellclick'), +(18,33795,62779,0,8,0,13703,0,0,0,'Required quest rewarded for spellclick'), +(18,33796,62784,0,8,0,13693,0,0,0,'Required quest rewarded for spellclick'), +(18,33796,62784,0,8,0,13708,0,0,0,'Required quest rewarded for spellclick'), +(18,33798,62787,0,8,0,13695,0,0,0,'Required quest rewarded for spellclick'), +(18,33798,62787,0,8,0,13710,0,0,0,'Required quest rewarded for spellclick'), +(18,33799,62783,0,8,0,13691,0,0,0,'Required quest rewarded for spellclick'), +(18,33799,62783,0,8,0,13707,0,0,0,'Required quest rewarded for spellclick'), +(18,33800,62774,0,8,0,13593,0,0,0,'Required quest rewarded for spellclick'), +(18,33800,62774,0,8,0,13684,0,0,0,'Required quest rewarded for spellclick'), +(18,33842,63791,0,8,0,13668,0,0,0,'Required quest rewarded for spellclick'), +(18,33842,63791,0,8,0,13687,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,33843,63792,0,8,0,13667,0,0,0,'Required quest rewarded for spellclick'), +(18,33843,63792,0,8,0,13686,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,33870,63663,0,8,0,1,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13847,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13851,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13852,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13854,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13855,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13856,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13857,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13858,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13859,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13860,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13861,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13862,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13863,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,8,0,13864,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,34125,63215,0,9,0,13847,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13851,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13852,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13854,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13855,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13856,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13857,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13858,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13859,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13860,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13861,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13862,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13863,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,0,9,0,13864,0,0,0,'Required quest active for spellclick'), +(18,38248,71462,0,1,0,71443,0,0,1,'Forbidden aura for spellclick'), +(18,40176,74904,0,8,0,25444,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,40176,74904,0,9,0,25444,0,0,0,'Required quest active for spellclick'), +(18,40176,74905,0,8,0,25444,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,40176,74905,0,9,0,25444,0,0,0,'Required quest active for spellclick'); + +-- Below is a procedure to dynamically convert custom content to conditions table. +-- However this procedure only works for MySQL server versions >= 5.6 due to +-- a bug / missing feature in older MySQL versions. + +/* + +DROP PROCEDURE IF EXISTS ConvertSpellClickConditions; +DELIMITER // +CREATE PROCEDURE ConvertSpellClickConditions() +BEGIN + DECLARE counter INT DEFAULT 0; + DECLARE recordCount INT DEFAULT 0; + DECLARE counterPlusOne INT DEFAULT 0; + DECLARE npcEntry INT DEFAULT 0; + DECLARE spellId INT DEFAULT 0; + DECLARE aura INT DEFAULT 0; + DECLARE quest INT DEFAULT 0; + DECLARE quest2 INT DEFAULT 0; + DECLARE questStartCanActive INT DEFAULT 0; + DECLARE maxElseGroupId INT DEFAULT 14; -- Change this for custom content + SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `aura_required` !=0; + WHILE counter < recordCount DO + SELECT `npc_entry`, `spell_id`, `aura_required` + INTO npcEntry, spellId, aura + FROM `npc_spellclick_spells` WHERE `aura_required` !=0 + LIMIT counter,1; + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,1,0,aura,0,0,'Required aura for spellclick'); + SET counter = counter+1; + END WHILE; + + SET counter = 0; + SET recordCount = 0; + SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `aura_forbidden` !=0; + WHILE counter < recordCount DO + SELECT `npc_entry`, `spell_id`, `aura_forbidden` + INTO npcEntry, spellId, aura + FROM `npc_spellclick_spells` WHERE `aura_forbidden` !=0 + LIMIT counter,1; + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,1,0,aura,0,1,'Forbidden aura for spellclick'); + SET counter = counter+1; + END WHILE; + + SET counter = 0; + SET recordCount = 0; + SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `quest_start` !=0; + WHILE counter < recordCount DO + SELECT `npc_entry`, `spell_id`, `quest_start`, `quest_start_active`, `quest_end` + INTO npcEntry, spellId, quest, questStartCanActive, quest2 + FROM `npc_spellclick_spells` WHERE `quest_start` !=0 + LIMIT counter,1; + IF questStartCanActive = 1 AND quest2 = 0 THEN + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`, `ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,maxElseGroupId+1,9,0,quest,0,0,'Required quest active for spellclick'); + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`, `ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,maxElseGroupId+1,8,0,quest,0,0,'Required quest rewarded for spellclick'); + SET maxElseGroupId = maxElseGroupId+1; + -- ELSE IF quest2 != 0 is handled in next loop (forbidden rewarded quest) + ELSEIF questStartCanActive = 1 && quest2 = quest THEN + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,9,0,quest,0,0,'Required quest active for spellclick'); + -- ^Adds the required active quest condition. Prohibit quest reward is done in next loop + ELSEIF questStartCanActive = 0 THEN + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,8,0,quest,0,0,'Required quest rewarded for spellclick'); + END IF; + + SET counter = counter+1; + END WHILE; + + SET counter = 0; + SET recordCount = 0; + SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `quest_end` !=0; + WHILE counter < recordCount DO + SELECT `npc_entry`, `spell_id`, `quest_end` + INTO npcEntry, spellId, quest + FROM `npc_spellclick_spells` WHERE `quest_end` !=0 + LIMIT counter,1; + INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, + `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) + VALUES (18,npcEntry,spellId,8,0,quest,0,1,'Forbidden rewarded quest for spellclick'); + SET counter = counter+1; + END WHILE; + +END// + +DELIMITER ; + +CALL ConvertSpellClickConditions(); +DROP PROCEDURE ConvertSpellClickConditions; + +*/ + +ALTER TABLE `npc_spellclick_spells` + DROP COLUMN `quest_start`, + DROP COLUMN `quest_start_active`, + DROP COLUMN `quest_end`, + DROP COLUMN `aura_required`, + DROP COLUMN `aura_forbidden` +; diff --git a/sql/old/3.3.5a/2012_02_21_00_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_02_21_00_world_creature_loot_template.sql new file mode 100644 index 00000000000..1d05c031868 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_00_world_creature_loot_template.sql @@ -0,0 +1,78 @@ +-- Loot for Hellfire 5-man dungeons Trash (heroic and normal) -- +-- ------------------------------------------------------------- + +-- Hellfire Citadel: Ramparts +SET @Lootid := 17259; +-- set all lootids to same entry (normal and heroic) +UPDATE `creature_template` SET `lootid`=@Lootid WHERE `entry` IN +(17259,17264,17269,17270,17271,17280,17281,17309,17455,17478,17517,18048,18049,18050,18051,18052,18053,18054,18055,18057,18058,18059); +-- populate trashloot table +DELETE FROM `creature_loot_template` WHERE `entry` IN +(17259,17264,17269,17270,17271,17280,17281,17309,17455,17478,17517,18048,18049,18050,18051,18052,18053,18054,18055,18057,18058,18059); +DELETE FROM `creature_loot_template` WHERE `entry`=@Lootid; +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- rough indication based on wowhead data of ALL mobs in the dungeon +(@Lootid,14047,40,1,0,1,4), -- Runecloth +(@Lootid,21877,20,1,0,1,4), -- Netherweave Cloth +(@Lootid, 8952,10,1,0,1,4), -- Roasted Quail +(@Lootid, 8766, 5,1,0,1,3), -- Morning Glory Dew +-- references for worldgreys +(@Lootid,1,5,1,0,-24000,1), -- Outland Grey Item Reference1 +(@Lootid,2,5,1,0,-24002,1), -- Outland Grey Item Reference2 +(@Lootid,3,5,1,0,-24003,1), -- Outland Grey Item Reference3 +(@Lootid,4,5,1,0,-24011,1), -- Outland Grey Item Reference4 +(@Lootid,5,5,1,0,-24022,1), -- Outland Grey Item Reference5 +(@Lootid,6,5,1,0,-24023,1), -- Outland Grey Item Reference6 +-- specifics +(@Lootid,5759,0.25,1,0,1,1), -- Thorium Lockbox +(@Lootid,5760,0.30,1,0,1,1), -- Eternium Lockbox +-- Scrolls +(@Lootid,7,5,1,0,-24724,1); -- Scroll of IV + +-- ----------------------------------------- +-- -- Hellfire Citadel: The Blood Furnace -- +-- ----------------------------------------- +SET @Lootid := 17370; +UPDATE `creature_template` SET `lootid`=@Lootid WHERE `entry` IN (17256,17370,17371,17395,17397,17398,17399,17414,17429,17477,17491,17624,17626,17653,18894,19016,18608,18619,18617,18615,18612,18614,18618,18603,18606,18610,18611,18609,18620,21645,21646); + +DELETE FROM `creature_loot_template` WHERE `entry` IN (17370,17371,17395,17397,17398,17414,17429,17491,17624,17626,18894); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@Lootid,23894,-100,1,0,1,1), -- Fel Orc Blood (quest) +-- most common items +(@Lootid,14047,40,1,0,1,4), -- Runecloth +(@Lootid,21877,20,1,0,1,4), -- Netherweave Cloth +(@Lootid, 8952,10,1,0,1,4), -- Roasted Quail +(@Lootid, 8766, 5,1,0,1,3), -- Morning Glory Dew +-- references for worldgreys +(@Lootid,1,5,1,0,-24000,1), -- Outland Grey Item Reference1 +(@Lootid,2,5,1,0,-24002,1), -- Outland Grey Item Reference2 +(@Lootid,3,5,1,0,-24003,1), -- Outland Grey Item Reference3 +(@Lootid,4,5,1,0,-24011,1), -- Outland Grey Item Reference4 +(@Lootid,5,5,1,0,-24022,1), -- Outland Grey Item Reference5 +(@Lootid,6,5,1,0,-24023,1), -- Outland Grey Item Reference6 +-- specifics +(@Lootid,5759,0.25,1,0,1,1), -- Thorium Lockbox +(@Lootid,5760,0.30,1,0,1,1), -- Eternium Lockbox +-- Scrolls +(@Lootid,7,5,1,0,-24724,1); -- Scroll of IV + +-- ------------------------------------------- +-- -- Hellfire Citadel: The Shattered Halls -- +-- ------------------------------------------- +SET @Lootid := 16507; +UPDATE `creature_template` SET `lootid`=@Lootid WHERE `entry` IN (17669,16507,17622,17462,17427,17420,17083,16699,16704,17695,17670,16700,16593,16594,17464,17694,17465,17461,17671,20593,20582,20576,20590,20589,20594,20567,20587,20579,20581,20595,20586,20583,20578,20574,20588,20584,20577,20580); + +DELETE FROM `creature_loot_template` WHERE `entry` IN (16507,16593,16594,16699,16700,16704,17083,17420,17427,17461,17462,17464,17465,17669,17670,17671,17694,17695,17669,16594,17694,17427,17695,17461,16593,17465,17671,17464,17420,17670,16700,16699,16507,16704,17462); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@Lootid,21877,40,1,0,2,3), -- Netherweave Cloth +(@Lootid,27854,20,1,0,1,1), -- Smoked Talbuk Venison +(@Lootid,27860,20,1,0,1,1), -- Purified Draenic Water +(@Lootid,31952,2.5,1,0,1,1), -- Khorium Lockbox +-- references +(@Lootid,1,5,1,1,-24002,1), -- Outland Grey Item Reference1 +(@Lootid,2,2,1,1,-24009,1), -- Outland Green Reference1 +(@Lootid,3,5,1,1,-24011,1), -- Outland Grey Item Reference2 +(@Lootid,4,1,1,1,-24012,1), -- Outland Blue Reference1 +(@Lootid,5,5,1,1,-24093,1), -- Outland Plans & patterns +-- Scrolls +(@Lootid,6,5,1,0,-24724,1); -- Scroll of IV diff --git a/sql/old/3.3.5a/2012_02_21_01_world_conditions.sql b/sql/old/3.3.5a/2012_02_21_01_world_conditions.sql new file mode 100644 index 00000000000..95c32703ea4 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_01_world_conditions.sql @@ -0,0 +1,3592 @@ +CREATE TABLE `temp_convert_spells` +( + `id` INT(11), + `effMask` INT(11), + `onlyPlayers` TINYINT(3), + PRIMARY KEY (`id`) +); + +INSERT INTO `temp_convert_spells` VALUES +(46174,1,0), +(78002,1,1), +(78001,1,1), +(78000,1,1), +(77999,1,1), +(77984,1,1), +(76379,1,0), +(76098,1,0), +(76092,1,0), +(75920,1,1), +(75767,1,1), +(75765,1,1), +(75396,1,0), +(75389,1,1), +(75364,1,0), +(75319,1,0), +(75313,1,0), +(75244,1,0), +(75197,1,0), +(75195,1,0), +(75181,1,0), +(75107,1,0), +(75100,1,0), +(75078,1,0), +(75053,1,0), +(75018,1,0), +(74977,1,0), +(74903,1,0), +(74801,1,1), +(74758,1,0), +(74735,1,0), +(74549,1,0), +(74548,1,0), +(74486,1,0), +(74455,1,0), +(74444,1,0), +(74313,1,0), +(74285,1,0), +(74219,1,0), +(74182,1,0), +(74148,1,0), +(74098,1,0), +(74090,1,1), +(74086,1,1), +(74074,1,0), +(74033,1,0), +(73980,1,0), +(73955,1,0), +(73953,1,0), +(73886,1,0), +(73846,1,1), +(73845,1,1), +(73844,1,1), +(73843,1,1), +(73837,1,0), +(73836,1,0), +(73835,1,0), +(73787,1,0), +(73786,1,0), +(73785,1,0), +(73725,1,0), +(73659,1,0), +(73650,1,1), +(73582,1,0), +(73556,1,0), +(73555,1,0), +(73548,1,0), +(73331,1,1), +(73288,1,0), +(73165,1,0), +(73164,1,1), +(73159,1,1), +(73129,1,0), +(73128,1,0), +(73082,1,0), +(73071,1,0), +(73035,1,0), +(72959,1,1), +(72934,1,1), +(72928,1,1), +(72900,1,1), +(72830,1,1), +(72748,1,0), +(72747,1,0), +(72746,1,0), +(72745,1,0), +(72728,1,0), +(72706,1,1), +(72618,1,0), +(72595,1,1), +(72527,1,0), +(72479,1,1), +(72431,1,1), +(72429,1,1), +(72401,1,0), +(72347,1,0), +(72346,1,1), +(72280,1,0), +(72279,1,0), +(72278,1,0), +(72262,1,0), +(72260,1,0), +(72257,1,1), +(72209,1,0), +(72202,1,0), +(72099,1,0), +(72033,1,0), +(72032,1,0), +(72031,1,0), +(71952,1,0), +(71949,1,1), +(71948,1,0), +(71946,1,0), +(71848,1,0), +(71811,1,0), +(71809,1,0), +(71753,1,1), +(71693,1,0), +(71620,1,0), +(71617,1,0), +(71599,1,0), +(71538,1,1), +(71536,1,1), +(71520,1,0), +(71440,1,0), +(71415,1,0), +(71412,1,0), +(71365,1,0), +(71352,1,1), +(71322,1,0), +(71310,1,0), +(71308,1,0), +(71306,1,0), +(71281,1,0), +(71272,1,0), +(71189,1,0), +(71082,1,0), +(71081,1,0), +(71080,1,0), +(71079,1,0), +(71078,1,0), +(71075,1,0), +(71070,1,0), +(71032,1,0), +(71024,1,0), +(70995,1,0), +(70983,1,0), +(70966,1,1), +(70939,1,0), +(70936,1,0), +(70933,1,0), +(70931,1,0), +(70921,1,0), +(70881,1,0), +(70861,1,0), +(70860,1,0), +(70859,1,0), +(70858,1,0), +(70857,1,0), +(70856,1,0), +(70792,1,0), +(70790,1,0), +(70784,1,0), +(70781,1,0), +(70743,1,0), +(70713,1,1), +(70643,1,0), +(70639,1,0), +(70638,1,1), +(70636,1,1), +(70635,1,0), +(70623,1,1), +(70614,1,0), +(70611,1,0), +(70602,1,0), +(70595,1,0), +(70588,1,0), +(70586,1,0), +(70572,1,0), +(70569,1,0), +(70527,1,1), +(70525,1,0), +(70488,1,0), +(70485,1,0), +(70471,1,0), +(70466,1,0), +(70464,1,0), +(70444,1,0), +(70443,1,1), +(70403,1,0), +(70397,1,0), +(70383,1,0), +(70374,1,0), +(70366,1,0), +(70360,1,0), +(70338,1,0), +(70331,1,1), +(70299,1,0), +(70293,1,0), +(70290,1,0), +(70267,1,0), +(70266,1,0), +(70265,1,0), +(70246,1,0), +(70225,1,0), +(70224,1,0), +(70143,1,0), +(70130,1,0), +(70104,1,0), +(70100,1,0), +(70098,1,0), +(70079,1,0), +(70078,1,0), +(70053,1,0), +(70041,1,0), +(70040,1,0), +(70021,1,0), +(69960,1,0), +(69959,1,0), +(69922,1,0), +(69907,1,0), +(69886,1,0), +(69857,1,0), +(69843,1,0), +(69801,1,0), +(69798,1,0), +(69796,1,0), +(69784,1,0), +(69782,1,0), +(69768,1,0), +(69753,1,0), +(69705,1,0), +(69682,1,0), +(69614,1,0), +(69610,1,0), +(69601,1,0), +(69600,1,0), +(69593,1,0), +(69553,1,0), +(69538,1,0), +(69508,1,0), +(69431,1,0), +(69372,1,0), +(69347,1,0), +(69298,1,1), +(69171,1,0), +(69125,1,0), +(69101,1,0), +(69098,1,0), +(69097,1,0), +(69048,1,1), +(69039,1,0), +(69016,1,0), +(68957,1,0), +(68922,1,0), +(68919,1,0), +(68901,1,0), +(68881,1,0), +(68880,1,0), +(68861,1,0), +(68847,1,0), +(68842,1,0), +(68798,1,0), +(68663,1,0), +(68644,1,0), +(68617,1,0), +(68616,1,0), +(68614,1,0), +(68515,1,1), +(68471,1,1), +(68470,1,1), +(68401,1,0), +(68400,1,0), +(68360,1,0), +(68359,1,0), +(68358,1,0), +(68206,1,1), +(68198,1,1), +(68197,1,1), +(68193,1,1), +(68186,1,1), +(67888,1,0), +(67864,1,0), +(67857,1,0), +(67856,1,0), +(67855,1,0), +(67804,1,0), +(67757,1,0), +(67756,1,0), +(67755,1,0), +(67748,1,0), +(67732,1,0), +(67715,1,0), +(67705,1,0), +(67551,1,1), +(67547,1,0), +(67482,1,0), +(67400,1,0), +(67397,1,0), +(67369,1,0), +(67335,1,0), +(67328,1,0), +(67163,1,0), +(67162,1,0), +(67161,1,0), +(67160,1,0), +(67159,1,0), +(67158,1,0), +(66986,1,1), +(66810,1,1), +(66798,1,0), +(66785,1,0), +(66774,1,0), +(66718,1,1), +(66665,1,0), +(66637,1,0), +(66636,1,0), +(66630,1,0), +(66551,1,0), +(66550,1,0), +(66513,1,0), +(66512,1,0), +(66508,1,0), +(66401,1,0), +(66391,1,0), +(66390,1,0), +(66387,1,0), +(66386,1,0), +(66385,1,0), +(66384,1,0), +(66383,1,0), +(66382,1,0), +(66379,1,0), +(66357,1,0), +(66356,1,0), +(66355,1,0), +(66354,1,0), +(66353,1,0), +(66352,1,0), +(66350,1,0), +(66349,1,0), +(66348,1,0), +(66345,1,0), +(66339,1,0), +(66332,1,0), +(66314,1,1), +(66312,1,1), +(66287,1,0), +(66256,1,0), +(66193,1,0), +(66181,1,0), +(66153,1,0), +(66152,1,0), +(66141,1,0), +(66140,1,0), +(66135,1,1), +(66133,1,0), +(66132,1,0), +(65872,1,0), +(65861,1,0), +(65719,1,0), +(65718,1,0), +(65699,1,0), +(65685,1,0), +(65652,1,0), +(65614,1,0), +(65613,1,0), +(65611,1,0), +(65594,1,1), +(65589,1,0), +(65588,1,0), +(65587,1,0), +(65509,1,0), +(65357,1,0), +(65354,1,0), +(65350,1,0), +(65349,1,0), +(65346,1,1), +(65312,1,1), +(65311,1,1), +(65265,1,0), +(65258,1,0), +(65238,1,0), +(65224,1,0), +(65206,1,0), +(65200,1,0), +(65192,1,0), +(65184,1,1), +(65140,1,0), +(65109,1,0), +(65061,1,0), +(65042,1,0), +(65040,1,1), +(65034,1,0), +(65016,1,0), +(65015,1,0), +(64996,1,0), +(64995,1,0), +(64898,1,0), +(64887,1,0), +(64886,1,0), +(64880,1,0), +(64828,1,0), +(64799,1,0), +(64767,1,0), +(64623,1,0), +(64620,1,0), +(64619,1,0), +(64618,1,0), +(64597,1,0), +(64543,1,0), +(64539,1,0), +(64503,1,0), +(64499,1,0), +(64480,1,0), +(64475,1,0), +(64474,1,0), +(64466,1,0), +(64465,1,0), +(64463,1,0), +(64449,1,0), +(64444,1,0), +(64425,1,0), +(64414,1,0), +(64402,1,0), +(64397,1,0), +(64320,1,0), +(64229,1,0), +(64225,1,0), +(64224,1,0), +(64201,1,0), +(64185,1,0), +(64184,1,0), +(64183,1,0), +(64173,1,0), +(64172,1,0), +(64098,1,0), +(64069,1,0), +(64063,1,0), +(64061,1,0), +(64059,1,1), +(64032,1,0), +(64031,1,0), +(64030,1,0), +(64029,1,0), +(64028,1,0), +(64027,1,0), +(64026,1,0), +(64025,1,0), +(64024,1,0), +(64014,1,0), +(63984,1,0), +(63979,1,0), +(63947,1,0), +(63886,1,0), +(63882,1,0), +(63820,1,0), +(63813,1,0), +(63812,1,0), +(63764,1,0), +(63763,1,0), +(63762,1,0), +(63761,1,0), +(63749,1,0), +(63747,1,1), +(63745,1,1), +(63744,1,0), +(63702,1,0), +(63676,1,0), +(63659,1,0), +(63658,1,0), +(63657,1,0), +(63629,1,0), +(63628,1,0), +(63576,1,0), +(63524,1,0), +(63499,1,0), +(63446,1,0), +(63445,1,0), +(63444,1,0), +(63443,1,0), +(63442,1,0), +(63441,1,0), +(63440,1,0), +(63439,1,0), +(63438,1,0), +(63352,1,0), +(63348,1,0), +(63322,1,1), +(63274,1,0), +(63255,1,0), +(63238,1,0), +(63109,1,0), +(63037,1,0), +(63013,1,0), +(63001,1,0), +(62990,1,0), +(62978,1,0), +(62976,1,0), +(62943,1,0), +(62911,1,0), +(62909,1,0), +(62906,1,0), +(62888,1,0), +(62883,1,0), +(62882,1,0), +(62834,1,0), +(62809,1,0), +(62797,1,1), +(62778,1,0), +(62731,1,0), +(62727,1,0), +(62711,1,0), +(62708,1,0), +(62706,1,0), +(62701,1,0), +(62669,1,0), +(62646,1,0), +(62603,1,0), +(62584,1,0), +(62577,1,0), +(62567,1,0), +(62533,1,0), +(62525,1,0), +(62524,1,0), +(62521,1,0), +(62509,1,0), +(62505,1,0), +(62496,1,0), +(62488,1,0), +(62485,1,0), +(62484,1,0), +(62483,1,0), +(62480,1,0), +(62464,1,0), +(62378,1,0), +(124,1,0), +(2222,1,0), +(3730,1,0), +(4020,1,0), +(4338,1,0), +(5249,1,0), +(5251,1,0), +(5432,1,0), +(5555,1,0), +(6636,1,0), +(6672,1,0), +(6755,1,0), +(6955,1,0), +(6967,1,0), +(7022,1,0), +(7035,1,0), +(7036,1,0), +(7277,1,0), +(7393,1,0), +(7670,1,0), +(7769,1,0), +(8283,1,0), +(8593,1,0), +(8596,1,0), +(9002,1,0), +(9003,1,0), +(9004,1,0), +(9012,1,0), +(9082,1,0), +(9095,1,0), +(9455,1,0), +(9457,1,0), +(9712,1,0), +(9976,1,0), +(10113,1,0), +(10137,1,0), +(10252,1,0), +(10258,1,0), +(10259,1,0), +(10260,1,0), +(10345,1,0), +(10604,1,0), +(10727,1,0), +(10747,1,0), +(11195,1,0), +(11402,1,0), +(11440,1,0), +(11513,1,0), +(11637,1,0), +(11757,1,0), +(11893,1,0), +(12134,1,0), +(12158,1,0), +(12159,1,0), +(12347,1,0), +(12512,1,0), +(12564,1,0), +(12613,1,0), +(12623,1,0), +(12699,1,0), +(12709,1,0), +(12774,1,0), +(12938,1,0), +(13461,1,0), +(13727,1,0), +(13821,1,0), +(13951,1,0), +(13982,1,0), +(14250,1,0), +(14292,1,0), +(14806,1,0), +(14813,1,0), +(14928,1,0), +(15252,1,0), +(15281,1,0), +(15591,1,0), +(15658,1,0), +(15746,1,0), +(15958,1,0), +(16007,1,0), +(16032,1,0), +(16037,1,0), +(16053,1,0), +(16068,1,0), +(16069,1,0), +(16070,1,0), +(16074,1,0), +(16378,1,0), +(16381,1,0), +(16404,1,0), +(16556,1,0), +(16558,1,0), +(16637,1,0), +(16786,1,0), +(16807,1,0), +(17048,1,0), +(17166,1,0), +(17190,1,0), +(17202,1,0), +(17272,1,0), +(17278,1,0), +(17279,1,0), +(17471,1,0), +(17536,1,0), +(17616,1,0), +(17618,1,0), +(17652,1,0), +(17671,1,0), +(17675,1,0), +(17676,1,0), +(17677,1,0), +(17678,1,0), +(17698,1,0), +(17748,1,0), +(18110,1,0), +(18655,1,0), +(18666,1,0), +(18811,1,0), +(18969,1,0), +(19032,1,0), +(19096,1,0), +(19571,1,0), +(19593,1,0), +(19721,1,0), +(19749,1,0), +(19770,1,0), +(19773,1,0), +(19952,1,0), +(20358,1,0), +(20465,1,0), +(20619,1,0), +(21052,1,0), +(21075,1,0), +(21076,1,0), +(21391,1,0), +(21556,1,0), +(21566,1,0), +(21885,1,0), +(21950,1,0), +(22096,1,0), +(22203,1,0), +(22205,1,0), +(22393,1,0), +(22458,1,0), +(22860,1,0), +(22906,1,0), +(22966,1,0), +(23014,1,0), +(23016,1,0), +(23018,1,0), +(23019,1,0), +(23168,1,0), +(23328,1,0), +(23360,1,0), +(23389,1,0), +(23394,1,0), +(23415,1,0), +(23642,1,0), +(23951,1,0), +(23974,1,0), +(24062,1,0), +(24083,1,0), +(24172,1,0), +(24207,1,0), +(24217,1,0), +(24311,1,0), +(24322,1,0), +(24323,1,0), +(24391,1,0), +(24734,1,0), +(24744,1,0), +(24756,1,0), +(24758,1,0), +(24760,1,0), +(24763,1,0), +(24765,1,0), +(24768,1,0), +(24770,1,0), +(24772,1,0), +(24784,1,0), +(24786,1,0), +(24788,1,0), +(24789,1,0), +(24790,1,0), +(24804,1,0), +(24933,1,0), +(25030,1,0), +(25031,1,0), +(25032,1,0), +(25099,1,0), +(25145,1,0), +(25149,1,0), +(25150,1,0), +(25158,1,0), +(25201,1,0), +(25715,1,0), +(25727,1,0), +(25745,1,0), +(25822,1,0), +(25823,1,0), +(25896,1,0), +(26235,1,0), +(26344,1,0), +(26345,1,0), +(26346,1,0), +(26347,1,0), +(26348,1,0), +(26349,1,0), +(26351,1,0), +(26352,1,0), +(26353,1,0), +(26354,1,0), +(26355,1,0), +(26356,1,0), +(26462,1,0), +(26522,1,1), +(26608,1,0), +(26687,1,1), +(26879,1,0), +(27583,1,0), +(27651,1,0), +(27663,1,0), +(27745,1,0), +(27885,1,0), +(27886,1,0), +(27892,1,0), +(27893,1,0), +(27894,1,0), +(27928,1,0), +(27929,1,0), +(27935,1,0), +(27936,1,0), +(28018,1,0), +(28032,1,0), +(28056,1,0), +(28078,1,0), +(28087,1,0), +(28096,1,0), +(28111,1,0), +(28159,1,0), +(28278,1,0), +(28281,1,0), +(28309,1,0), +(28326,1,0), +(28338,1,0), +(28339,1,0), +(28365,1,0), +(28366,1,0), +(28367,1,0), +(28374,1,0), +(28392,1,0), +(28404,1,0), +(28441,1,0), +(28605,1,0), +(28697,1,0), +(28731,1,0), +(28732,1,0), +(28861,1,0), +(29070,1,0), +(29072,1,0), +(29120,1,0), +(29121,1,0), +(29122,1,0), +(29172,1,0), +(29173,1,0), +(29176,1,0), +(29328,1,1), +(29339,1,0), +(29340,1,0), +(29428,1,0), +(29437,1,0), +(29456,1,0), +(29457,1,0), +(29458,1,0), +(29459,1,0), +(29461,1,0), +(29531,1,0), +(29534,1,0), +(29612,1,0), +(29705,1,0), +(29726,1,0), +(29727,1,0), +(29769,1,0), +(29770,1,0), +(29846,1,1), +(29962,1,0), +(29966,1,0), +(29967,1,0), +(29969,1,0), +(29970,1,0), +(29972,1,0), +(29989,1,0), +(30012,1,0), +(30065,1,0), +(30107,1,0), +(30166,1,0), +(30207,1,0), +(30221,1,0), +(30232,1,0), +(30273,1,0), +(30410,1,0), +(30417,1,0), +(30418,1,0), +(30425,1,0), +(30427,1,0), +(30460,1,0), +(30462,1,0), +(30469,1,0), +(30477,1,0), +(30541,1,0), +(30544,1,0), +(30571,1,1), +(30572,1,0), +(30625,1,0), +(30631,1,1), +(30656,1,0), +(30662,1,0), +(30676,1,0), +(30690,1,0), +(30735,1,0), +(30738,1,0), +(30745,1,0), +(30751,1,0), +(30762,1,0), +(30763,1,0), +(30764,1,0), +(30765,1,0), +(30766,1,0), +(30834,1,0), +(30835,1,0), +(30875,1,0), +(30876,1,0), +(30951,1,0), +(30952,1,0), +(30964,1,0), +(30968,1,0), +(30970,1,0), +(30974,1,0), +(30985,1,0), +(30988,1,0), +(31115,1,0), +(31225,1,0), +(31315,1,0), +(31324,1,0), +(31326,1,0), +(31329,1,0), +(31336,1,0), +(31346,1,0), +(31411,1,0), +(31412,1,0), +(31413,1,0), +(31414,1,0), +(31474,1,0), +(31515,1,0), +(31532,1,0), +(31537,1,0), +(31550,1,0), +(31611,1,0), +(31628,1,0), +(31630,1,0), +(31631,1,0), +(31702,1,0), +(31727,1,0), +(31736,1,0), +(31749,1,0), +(31781,1,0), +(31793,1,0), +(31799,1,0), +(31806,1,0), +(31889,1,0), +(31902,1,0), +(31936,1,0), +(31979,1,0), +(31993,1,0), +(32040,1,0), +(32042,1,0), +(32045,1,0), +(32051,1,0), +(32052,1,0), +(32087,1,0), +(32111,1,0), +(32127,1,0), +(32146,1,0), +(32163,1,0), +(32164,1,0), +(32227,1,0), +(32228,1,0), +(32251,1,0), +(32260,1,0), +(32286,1,0), +(32301,1,0), +(32303,1,0), +(32312,1,0), +(32373,1,0), +(32396,1,0), +(32560,1,0), +(32573,1,0), +(32589,1,0), +(32622,1,0), +(32623,1,0), +(32638,1,0), +(32668,1,0), +(32708,1,1), +(32760,1,0), +(32838,1,0), +(32890,1,0), +(32928,1,0), +(32929,1,0), +(32930,1,0), +(32953,1,0), +(32958,1,0), +(32974,1,0), +(32976,1,0), +(32979,1,0), +(33067,1,0), +(33270,1,1), +(33329,1,0), +(33332,1,0), +(33336,1,0), +(33337,1,0), +(33423,1,0), +(33424,1,0), +(33425,1,0), +(33531,1,0), +(33532,1,0), +(33618,1,0), +(33644,1,0), +(33655,1,0), +(33669,1,0), +(33710,1,0), +(33716,1,1), +(33742,1,0), +(33744,1,0), +(33796,1,0), +(33805,1,0), +(33806,1,0), +(33809,1,0), +(33822,1,0), +(33831,1,0), +(33838,1,0), +(33861,1,0), +(33862,1,0), +(33918,1,0), +(33924,1,0), +(33937,1,0), +(33981,1,0), +(34011,1,0), +(34013,1,0), +(34016,1,0), +(34019,1,0), +(34023,1,0), +(34024,1,0), +(34062,1,0), +(34063,1,0), +(34076,1,0), +(34119,1,0), +(34154,1,0), +(34156,1,0), +(34209,1,0), +(34211,1,0), +(34212,1,0), +(34221,1,0), +(34239,1,0), +(34254,1,0), +(34330,1,0), +(34332,1,0), +(34367,1,0), +(34378,1,0), +(34393,1,0), +(34397,1,0), +(34430,1,0), +(34516,1,0), +(34526,1,0), +(34536,1,0), +(34581,1,0), +(34583,1,0), +(34613,1,0), +(34627,1,0), +(34646,1,0), +(34662,1,0), +(34742,1,0), +(34806,1,0), +(34874,1,0), +(34893,1,0), +(34946,1,0), +(35016,1,0), +(35040,1,0), +(35063,1,0), +(35097,1,0), +(35113,1,0), +(35137,1,0), +(35140,1,0), +(35141,1,0), +(35155,1,0), +(35160,1,0), +(35162,1,0), +(35170,1,0), +(35176,1,0), +(35190,1,0), +(35245,1,0), +(35262,1,0), +(35282,1,0), +(35301,1,0), +(35372,1,0), +(35413,1,0), +(35427,1,0), +(35515,1,0), +(35516,1,0), +(35598,1,0), +(35600,1,0), +(35673,1,0), +(35682,1,0), +(35724,1,0), +(35746,1,0), +(35756,1,0), +(35770,1,0), +(35771,1,0), +(35772,1,0), +(35782,1,0), +(35930,1,0), +(35941,1,1), +(35956,1,1), +(35960,1,0), +(35961,1,0), +(35962,1,0), +(36000,1,0), +(36035,1,0), +(36089,1,0), +(36090,1,0), +(36103,1,0), +(36167,1,0), +(36174,1,0), +(36196,1,0), +(36197,1,0), +(36198,1,0), +(36201,1,0), +(36220,1,0), +(36239,1,0), +(36241,1,0), +(36243,1,0), +(36290,1,0), +(36291,1,0), +(36293,1,0), +(36327,1,0), +(36330,1,0), +(36378,1,0), +(36384,1,0), +(36431,1,0), +(36452,1,0), +(36455,1,1), +(36456,1,0), +(36514,1,0), +(36544,1,0), +(36639,1,0), +(36651,1,0), +(36652,1,0), +(36692,1,0), +(36709,1,0), +(36717,1,1), +(36779,1,0), +(36795,1,0), +(36802,1,0), +(36803,1,0), +(36804,1,0), +(36823,1,0), +(36852,1,0), +(36854,1,0), +(36856,1,0), +(36857,1,0), +(36858,1,0), +(36859,1,0), +(36871,1,0), +(36878,1,0), +(36884,1,0), +(36896,1,0), +(36951,1,0), +(36953,1,0), +(36969,1,0), +(36995,1,0), +(37013,1,0), +(37017,1,0), +(37032,1,0), +(37033,1,0), +(37034,1,0), +(37035,1,0), +(37051,1,0), +(37052,1,0), +(37053,1,0), +(37055,1,0), +(37056,1,0), +(37071,1,0), +(37072,1,0), +(37103,1,0), +(37142,1,0), +(37143,1,0), +(37144,1,0), +(37146,1,0), +(37147,1,0), +(37148,1,0), +(37149,1,0), +(37150,1,0), +(37151,1,0), +(37152,1,0), +(37153,1,0), +(37199,1,0), +(37220,1,0), +(37226,1,0), +(37229,1,0), +(37235,1,0), +(37281,1,0), +(37285,1,0), +(37337,1,0), +(37339,1,0), +(37345,1,0), +(37348,1,0), +(37388,1,0), +(37406,1,0), +(37408,1,1), +(37413,1,0), +(37422,1,0), +(37427,1,0), +(37428,1,0), +(37448,1,1), +(37449,1,1), +(37453,1,0), +(37454,1,0), +(37459,1,0), +(37461,1,0), +(37465,1,0), +(37469,1,0), +(37471,1,0), +(37472,1,0), +(37474,1,0), +(37476,1,0), +(37498,1,0), +(37502,1,0), +(37573,1,0), +(37626,1,0), +(37645,1,0), +(37689,1,0), +(37697,1,0), +(37712,1,0), +(37720,1,0), +(37748,1,0), +(37755,1,0), +(37775,1,0), +(37784,1,0), +(37824,1,0), +(37842,1,0), +(37843,1,0), +(37848,1,0), +(37849,1,1), +(37853,1,0), +(37868,1,0), +(37893,1,0), +(37895,1,0), +(37918,1,0), +(37934,1,0), +(37936,1,0), +(37964,1,0), +(37984,1,0), +(38003,1,0), +(38014,1,0), +(38015,1,0), +(38017,1,0), +(38020,1,0), +(38053,1,0), +(38054,1,0), +(38072,1,0), +(38073,1,0), +(38112,1,0), +(38121,1,0), +(38123,1,0), +(38126,1,0), +(38128,1,0), +(38130,1,0), +(38202,1,0), +(38250,1,0), +(38269,1,0), +(38360,1,0), +(38444,1,0), +(38451,1,0), +(38452,1,0), +(38455,1,0), +(38469,1,0), +(38482,1,0), +(38508,1,0), +(38530,1,0), +(38629,1,0), +(38632,1,0), +(38691,1,0), +(38711,1,0), +(38722,1,0), +(38736,1,0), +(38738,1,0), +(38762,1,0), +(38802,1,0), +(38829,1,1), +(38966,1,0), +(38968,1,0), +(39010,1,0), +(39011,1,0), +(39043,1,0), +(39073,1,0), +(39094,1,0), +(39124,1,0), +(39126,1,0), +(39140,1,0), +(39141,1,0), +(39184,1,0), +(39185,1,0), +(39189,1,0), +(39190,1,0), +(39206,1,0), +(39211,1,0), +(39216,1,0), +(39219,1,0), +(39221,1,0), +(39248,1,0), +(39334,1,0), +(39335,1,0), +(39338,1,0), +(39341,1,0), +(39342,1,0), +(39344,1,0), +(39350,1,0), +(39352,1,0), +(39353,1,0), +(39354,1,0), +(39355,1,0), +(39356,1,0), +(39357,1,0), +(39358,1,0), +(39359,1,0), +(39360,1,0), +(39361,1,0), +(39362,1,0), +(39395,1,0), +(39495,1,0), +(39497,1,1), +(39552,1,0), +(39559,1,0), +(39583,1,0), +(39601,1,0), +(39635,1,0), +(39678,1,0), +(39687,1,0), +(39690,1,0), +(39691,1,0), +(39692,1,0), +(39696,1,0), +(39758,1,0), +(39834,1,1), +(39849,1,0), +(39851,1,1), +(39852,1,1), +(39853,1,1), +(39854,1,1), +(39873,1,0), +(39899,1,0), +(39914,1,0), +(39915,1,0), +(39919,1,0), +(39921,1,0), +(39923,1,1), +(39930,1,0), +(39938,1,0), +(39939,1,0), +(39940,1,0), +(39974,1,0), +(39977,1,0), +(39978,1,0), +(39985,1,0), +(39989,1,0), +(39993,1,0), +(39999,1,0), +(40085,1,0), +(40094,1,0), +(40106,1,0), +(40110,1,0), +(40112,1,1), +(40136,1,0), +(40147,1,0), +(40153,1,0), +(40156,1,0), +(40160,1,0), +(40187,1,0), +(40189,1,0), +(40190,1,0), +(40224,1,0), +(40281,1,0), +(40287,1,0), +(40288,1,0), +(40289,1,0), +(40309,1,0), +(40350,1,0), +(40359,1,0), +(40382,1,0), +(40383,1,0), +(40397,1,0), +(40437,1,0), +(40439,1,0), +(40454,1,0), +(40490,1,0), +(40494,1,0), +(40498,1,0), +(40499,1,0), +(40512,1,0), +(40520,1,0), +(40521,1,0), +(40523,1,0), +(40532,1,0), +(40547,1,0), +(40607,1,0), +(40638,1,0), +(40693,1,0), +(40704,1,0), +(40707,1,0), +(40708,1,0), +(40709,1,0), +(40710,1,0), +(40711,1,0), +(40712,1,0), +(40713,1,0), +(40715,1,0), +(40730,1,1), +(40738,1,0), +(40750,1,0), +(40761,1,0), +(40788,1,0), +(40821,1,0), +(40824,1,0), +(40825,1,0), +(40828,1,0), +(40830,1,0), +(40848,1,1), +(40874,1,0), +(40887,1,0), +(40978,1,0), +(40985,1,1), +(40989,1,0), +(40993,1,1), +(41007,1,1), +(41015,1,1), +(41022,1,1), +(41073,1,0), +(41077,1,0), +(41122,1,0), +(41124,1,0), +(41125,1,0), +(41128,1,0), +(41129,1,0), +(41154,1,0), +(41257,1,0), +(41268,1,0), +(41269,1,0), +(41271,1,0), +(41285,1,1), +(41295,1,0), +(41333,1,0), +(41342,1,0), +(41343,1,0), +(41344,1,0), +(41362,1,0), +(41455,1,0), +(41457,1,0), +(41477,1,0), +(41499,1,0), +(41522,1,0), +(41525,1,0), +(41537,1,0), +(41557,1,0), +(41560,1,0), +(41575,1,0), +(41602,1,0), +(41614,1,0), +(41624,1,1), +(41975,1,0), +(41976,1,0), +(41993,1,0), +(42008,1,0), +(42014,1,0), +(42138,1,1), +(42143,1,0), +(42151,1,0), +(42166,1,0), +(42167,1,0), +(42168,1,0), +(42178,1,0), +(42219,1,0), +(42222,1,0), +(42247,1,0), +(42269,1,0), +(42271,1,0), +(42272,1,0), +(42289,1,0), +(42317,1,0), +(42318,1,0), +(42321,1,0), +(42339,1,0), +(42341,1,0), +(42352,1,0), +(42356,1,0), +(42391,1,0), +(42393,1,0), +(42405,1,0), +(42410,1,0), +(42415,1,0), +(42428,1,0), +(42442,1,0), +(42447,1,0), +(42454,1,0), +(42471,1,0), +(42473,1,0), +(42482,1,0), +(42484,1,0), +(42515,1,0), +(42517,1,0), +(42530,1,0), +(42534,1,0), +(42536,1,0), +(42542,1,0), +(42550,1,0), +(42564,1,0), +(42567,1,0), +(42570,1,0), +(42577,1,0), +(42585,1,0), +(42604,1,0), +(42605,1,0), +(42616,1,0), +(42631,1,0), +(42638,1,1), +(42647,1,0), +(42654,1,0), +(42655,1,0), +(42659,1,0), +(42661,1,0), +(42664,1,0), +(42674,1,1), +(42685,1,0), +(42695,1,0), +(42697,1,0), +(42703,1,0), +(42707,1,0), +(42713,1,0), +(42720,1,0), +(42734,1,0), +(42757,1,1), +(42768,1,0), +(42793,1,0), +(42797,1,0), +(42808,1,0), +(42809,1,0), +(42813,1,0), +(42815,1,0), +(42816,1,0), +(42818,1,0), +(42821,1,0), +(42839,1,0), +(42857,1,0), +(42881,1,0), +(42882,1,0), +(42883,1,0), +(42884,1,0), +(42888,1,0), +(42905,1,0), +(42968,1,0), +(42982,1,0), +(43033,1,0), +(43035,1,0), +(43057,1,0), +(43066,1,0), +(43068,1,0), +(43069,1,0), +(43072,1,0), +(43076,1,0), +(43078,1,0), +(43079,1,0), +(43092,1,0), +(43101,1,0), +(43106,1,0), +(43109,1,0), +(43144,1,0), +(43171,1,0), +(43209,1,0), +(43210,1,0), +(43234,1,0), +(43239,1,0), +(43244,1,0), +(43255,1,0), +(43291,1,0), +(43306,1,0), +(43307,1,0), +(43333,1,0), +(43371,1,0), +(43385,1,0), +(43386,1,0), +(43403,1,0), +(43404,1,0), +(43407,1,0), +(43450,1,0), +(43458,1,0), +(43468,1,0), +(43486,1,0), +(43487,1,0), +(43515,1,0), +(43520,1,0), +(43525,1,0), +(43546,1,0), +(43559,1,0), +(43563,1,0), +(43568,1,0), +(43615,1,0), +(43647,1,0), +(43662,1,0), +(43685,1,0), +(43691,1,0), +(43711,1,0), +(43734,1,0), +(43754,1,0), +(43770,1,0), +(43791,1,0), +(43805,1,0), +(43863,1,0), +(43865,1,0), +(43867,1,0), +(43871,1,0), +(43872,1,0), +(43878,1,0), +(43882,1,0), +(43892,1,0), +(43942,1,0), +(43943,1,0), +(43949,1,0), +(43962,1,0), +(43990,1,0), +(43994,1,0), +(44014,1,0), +(44022,1,0), +(44023,1,0), +(44024,1,0), +(44026,1,0), +(44027,1,0), +(44028,1,0), +(44037,1,0), +(44145,1,0), +(44161,1,0), +(44193,1,0), +(44214,1,0), +(44224,1,1), +(44229,1,0), +(44232,1,1), +(44250,1,0), +(44255,1,0), +(44260,1,0), +(44266,1,0), +(44270,1,0), +(44283,1,0), +(44284,1,0), +(44309,1,0), +(44313,1,0), +(44329,1,0), +(44330,1,0), +(44355,1,0), +(44362,1,0), +(44365,1,0), +(44367,1,0), +(44374,1,0), +(44392,1,0), +(44411,1,0), +(44420,1,0), +(44422,1,0), +(44458,1,0), +(44550,1,0), +(44562,1,0), +(44574,1,0), +(44609,1,0), +(44610,1,0), +(44653,1,0), +(44681,1,0), +(44682,1,1), +(44749,1,0), +(44804,1,0), +(44807,1,0), +(44826,1,0), +(44837,1,0), +(44838,1,0), +(44839,1,0), +(44840,1,0), +(44841,1,0), +(44842,1,0), +(44845,1,0), +(44846,1,0), +(44849,1,1), +(44864,1,0), +(44865,1,0), +(44872,1,0), +(44877,1,0), +(44883,1,0), +(44886,1,0), +(44938,1,0), +(44939,1,0), +(44941,1,0), +(44946,1,0), +(44948,1,0), +(44963,1,0), +(44965,1,0), +(44981,1,0), +(45005,1,0), +(45008,1,0), +(45012,1,0), +(45013,1,0), +(45076,1,0), +(45086,1,0), +(45103,1,0), +(45109,1,0), +(45114,1,0), +(45115,1,0), +(45119,1,0), +(45172,1,0), +(45188,1,0), +(45191,1,0), +(45219,1,0), +(45223,1,0), +(45224,1,0), +(45229,1,0), +(45233,1,0), +(45259,1,0), +(45260,1,1), +(45264,1,0), +(45267,1,0), +(45277,1,0), +(45279,1,0), +(45307,1,0), +(45323,1,0), +(45339,1,0), +(45340,1,0), +(45351,1,0), +(45368,1,0), +(45371,1,0), +(45388,1,0), +(45389,1,0), +(45405,1,0), +(45407,1,0), +(45414,1,0), +(45437,1,0), +(45446,1,0), +(45448,1,0), +(45449,1,0), +(45465,1,0), +(45474,1,0), +(45536,1,0), +(45581,1,0), +(45583,1,0), +(45586,1,0), +(45594,1,0), +(45595,1,0), +(45596,1,0), +(45597,1,0), +(45602,1,0), +(45605,1,0), +(45606,1,0), +(45607,1,0), +(45608,1,0), +(45609,1,0), +(45622,1,0), +(45623,1,0), +(45630,1,0), +(45634,1,0), +(45644,1,1), +(45651,1,0), +(45655,1,0), +(45656,1,0), +(45666,1,0), +(45667,1,0), +(45671,1,1), +(45680,1,1), +(45692,1,0), +(45700,1,0), +(45714,1,0), +(45732,1,0), +(45735,1,0), +(45761,1,0), +(45774,1,0), +(45780,1,0), +(45788,1,0), +(45805,1,0), +(45808,1,0), +(45834,1,0), +(45835,1,0), +(45841,1,0), +(45853,1,0), +(45859,1,0), +(45863,1,0), +(45864,1,0), +(45867,1,0), +(45872,1,0), +(45888,1,0), +(45907,1,0), +(45911,1,0), +(45912,1,0), +(45914,1,0), +(45918,1,1), +(45923,1,0), +(45929,1,0), +(45930,1,0), +(45941,1,0), +(45949,1,0), +(45961,1,0), +(45968,1,0), +(45969,1,0), +(45970,1,0), +(45976,1,0), +(45979,1,0), +(45990,1,0), +(45993,1,0), +(46013,1,0), +(46018,1,1), +(46022,1,0), +(46034,1,0), +(46054,1,0), +(46058,1,0), +(46063,1,0), +(46066,1,0), +(46068,1,0), +(46085,1,0), +(46143,1,0), +(46171,1,0), +(46173,1,0), +(62377,1,0), +(46175,1,0), +(46176,1,0), +(46177,1,0), +(46178,1,0), +(46201,1,0), +(46208,1,0), +(46219,1,0), +(46222,1,0), +(46236,1,0), +(46237,1,0), +(46245,1,0), +(46246,1,0), +(46281,1,0), +(46307,1,1), +(46318,1,0), +(46319,1,0), +(46320,1,1), +(46330,1,0), +(46363,1,0), +(46372,1,1), +(46374,1,0), +(46376,1,0), +(46382,1,0), +(46385,1,0), +(46396,1,1), +(46398,1,0), +(46399,1,0), +(46400,1,0), +(46474,1,0), +(46475,1,0), +(46477,1,0), +(46482,1,0), +(46488,1,0), +(46521,1,0), +(46588,1,1), +(46592,1,0), +(46593,1,0), +(46603,1,0), +(46609,1,0), +(46610,1,0), +(46623,1,0), +(46631,1,0), +(46637,1,0), +(46650,1,0), +(46652,1,0), +(46656,1,0), +(46685,1,0), +(46692,1,0), +(46694,1,0), +(46704,1,0), +(46707,1,0), +(46732,1,1), +(46733,1,0), +(46735,1,0), +(46747,1,0), +(46793,1,0), +(46797,1,0), +(46809,1,0), +(46815,1,0), +(46818,1,0), +(46820,1,0), +(46843,1,0), +(46886,1,0), +(46895,1,0), +(46900,1,0), +(46902,1,0), +(46903,1,0), +(46904,1,0), +(46936,1,0), +(46937,1,0), +(46963,1,0), +(46964,1,0), +(46965,1,1), +(46974,1,0), +(47016,1,0), +(47026,1,0), +(47035,1,0), +(47060,1,0), +(47065,1,0), +(47104,1,0), +(47110,1,0), +(47137,1,0), +(47170,1,0), +(47176,1,0), +(47184,1,0), +(47214,1,0), +(47253,1,0), +(47254,1,0), +(47336,1,0), +(47344,1,0), +(47370,1,1), +(47374,1,0), +(47378,1,0), +(47421,1,0), +(47452,1,0), +(47460,1,0), +(47463,1,0), +(47469,1,0), +(47542,1,0), +(47547,1,0), +(47563,1,0), +(47574,1,0), +(47593,1,0), +(47594,1,0), +(47596,1,0), +(47597,1,0), +(47598,1,0), +(47599,1,0), +(47616,1,0), +(47617,1,0), +(47618,1,0), +(47619,1,0), +(47634,1,0), +(47669,1,0), +(47670,1,0), +(47681,1,0), +(47682,1,0), +(47683,1,0), +(47684,1,0), +(47685,1,0), +(47691,1,1), +(47711,1,0), +(47712,1,0), +(47713,1,0), +(47747,1,0), +(47771,1,0), +(47787,1,0), +(47799,1,0), +(47911,1,0), +(47913,1,0), +(47916,1,0), +(47933,1,0), +(47935,1,0), +(47939,1,0), +(47959,1,0), +(48009,1,0), +(48021,1,0), +(48028,1,1), +(48035,1,0), +(48115,1,0), +(48117,1,0), +(48183,1,0), +(48185,1,0), +(48188,1,0), +(48194,1,1), +(48199,1,0), +(48201,1,0), +(48202,1,0), +(48213,1,0), +(48218,1,0), +(48222,1,0), +(48223,1,0), +(48227,1,0), +(48246,1,1), +(48252,1,0), +(48293,1,0), +(48306,1,0), +(48315,1,0), +(48329,1,0), +(48344,1,0), +(48345,1,0), +(48362,1,0), +(48363,1,0), +(48375,1,0), +(48385,1,0), +(48398,1,0), +(48399,1,0), +(48425,1,0), +(48426,1,0), +(48455,1,0), +(48490,1,0), +(48497,1,0), +(48508,1,0), +(48530,1,0), +(48551,1,0), +(48597,1,0), +(48600,1,0), +(48605,1,0), +(48620,1,0), +(48623,1,0), +(48627,1,0), +(48641,1,0), +(48642,1,0), +(48646,1,0), +(48649,1,0), +(48685,1,0), +(48724,1,0), +(48726,1,0), +(48728,1,0), +(48730,1,0), +(48732,1,0), +(48748,1,0), +(48764,1,0), +(48771,1,0), +(48773,1,0), +(48790,1,0), +(48793,1,0), +(48799,1,0), +(48808,1,0), +(48811,1,0), +(48896,1,0), +(48901,1,0), +(48904,1,0), +(48929,1,0), +(48974,1,0), +(48975,1,0), +(49022,1,0), +(49030,1,0), +(49058,1,0), +(49062,1,0), +(49075,1,0), +(49080,1,0), +(49083,1,0), +(49118,1,0), +(49125,1,0), +(49128,1,0), +(49129,1,0), +(49131,1,0), +(49134,1,0), +(49135,1,0), +(49159,1,0), +(49166,1,0), +(49210,1,0), +(49211,1,0), +(49262,1,0), +(49291,1,0), +(49292,1,0), +(49313,1,0), +(49319,1,0), +(49325,1,0), +(49330,1,0), +(49332,1,0), +(49333,1,0), +(49334,1,0), +(49367,1,0), +(49370,1,0), +(49404,1,0), +(49405,1,0), +(49428,1,0), +(49434,1,0), +(49515,1,0), +(49517,1,0), +(49519,1,0), +(49524,1,0), +(49525,1,0), +(49552,1,0), +(49554,1,0), +(49555,1,0), +(49557,1,0), +(49590,1,0), +(49625,1,0), +(49634,1,0), +(49679,1,0), +(49682,1,0), +(49683,1,0), +(49684,1,0), +(49731,1,0), +(49751,1,0), +(49762,1,0), +(49825,1,0), +(49826,1,0), +(49829,1,0), +(49858,1,0), +(49862,1,0), +(49870,1,0), +(49899,1,0), +(49947,1,0), +(50036,1,0), +(50087,1,0), +(50133,1,0), +(50173,1,0), +(50174,1,0), +(50176,1,0), +(50177,1,0), +(50178,1,0), +(50179,1,0), +(50312,1,0), +(50315,1,1), +(50331,1,0), +(50350,1,0), +(50382,1,0), +(50383,1,0), +(50398,1,1), +(50430,1,0), +(50440,1,0), +(50492,1,0), +(50515,1,0), +(50524,1,0), +(50546,1,0), +(50547,1,0), +(50548,1,0), +(50554,1,0), +(50556,1,0), +(50562,1,0), +(50563,1,0), +(50568,1,0), +(50569,1,0), +(50592,1,0), +(50628,1,0), +(50669,1,0), +(50674,1,0), +(50682,1,1), +(50742,1,0), +(50775,1,0), +(50793,1,0), +(50794,1,0), +(50817,1,0), +(50835,1,0), +(50878,1,0), +(50883,1,1), +(50892,1,0), +(51001,1,0), +(51022,1,0), +(51023,1,0), +(51024,1,0), +(51025,1,0), +(51039,1,0), +(51049,1,0), +(51122,1,0), +(51136,1,0), +(51139,1,0), +(51152,1,0), +(51171,1,0), +(51172,1,0), +(51202,1,0), +(51213,1,0), +(51215,1,0), +(51234,1,0), +(51239,1,0), +(51247,1,0), +(51256,1,0), +(51276,1,0), +(51288,1,0), +(51318,1,0), +(51331,1,0), +(51332,1,0), +(51333,1,0), +(51343,1,0), +(51366,1,0), +(51368,1,0), +(51381,1,0), +(51384,1,0), +(51393,1,0), +(51396,1,0), +(51403,1,0), +(51420,1,0), +(51448,1,1), +(51516,1,0), +(51518,1,0), +(51577,1,0), +(51579,1,0), +(51590,1,0), +(51603,1,0), +(51606,1,0), +(51607,1,0), +(51616,1,0), +(51639,1,0), +(51641,1,0), +(51642,1,0), +(51643,1,0), +(51644,1,0), +(51645,1,0), +(51649,1,0), +(51650,1,0), +(51651,1,0), +(51652,1,0), +(51670,1,0), +(51694,1,0), +(51697,1,0), +(51727,1,0), +(51737,1,0), +(51739,1,0), +(51743,1,0), +(51754,1,0), +(51767,1,0), +(51769,1,0), +(51773,1,0), +(51774,1,0), +(51791,1,0), +(51794,1,0), +(51825,1,0), +(51840,1,0), +(51843,1,0), +(51858,1,0), +(51859,1,0), +(51861,1,0), +(51866,1,0), +(51870,1,0), +(51902,1,0), +(51904,1,0), +(51907,1,0), +(51910,1,0), +(51925,1,0), +(51927,1,0), +(51931,1,0), +(51932,1,0), +(51933,1,0), +(51942,1,0), +(51959,1,0), +(51964,1,0), +(51965,1,0), +(52011,1,0), +(52037,1,0), +(52059,1,0), +(52064,1,0), +(52089,1,0), +(52106,1,0), +(52122,1,0), +(52124,1,0), +(52140,1,0), +(52151,1,0), +(52164,1,0), +(52170,1,0), +(52173,1,0), +(52185,1,0), +(52227,1,0), +(52229,1,0), +(52238,1,0), +(52239,1,0), +(52242,1,0), +(52247,1,0), +(52254,1,0), +(52257,1,0), +(52259,1,0), +(52264,1,0), +(52294,1,0), +(52313,1,0), +(52322,1,0), +(52335,1,0), +(52336,1,0), +(52337,1,1), +(52340,1,0), +(52343,1,0), +(52349,1,0), +(52365,1,1), +(52369,1,0), +(52371,1,0), +(52381,1,0), +(52387,1,0), +(52388,1,0), +(52407,1,0), +(52412,1,0), +(52414,1,0), +(52427,1,0), +(52438,1,0), +(52446,1,0), +(52449,1,0), +(52452,1,0), +(52453,1,0), +(52454,1,0), +(52457,1,0), +(52458,1,0), +(52512,1,0), +(52514,1,0), +(52528,1,0), +(52576,1,0), +(52577,1,0), +(52585,1,0), +(52607,1,0), +(52632,1,0), +(52638,1,0), +(52654,1,0), +(52661,1,0), +(52676,1,0), +(52681,1,0), +(52686,1,0), +(52687,1,0), +(52688,1,0), +(52725,1,0), +(52726,1,0), +(52727,1,0), +(52728,1,0), +(52729,1,0), +(52730,1,0), +(52731,1,0), +(52732,1,0), +(52774,1,0), +(52791,1,0), +(52793,1,0), +(52805,1,0), +(52811,1,0), +(52816,1,0), +(52833,1,0), +(52834,1,0), +(52837,1,0), +(52838,1,0), +(52844,1,0), +(52850,1,0), +(52884,1,0), +(52908,1,0), +(52920,1,0), +(52930,1,0), +(52934,1,0), +(52935,1,0), +(52936,1,0), +(52937,1,0), +(52953,1,0), +(52955,1,0), +(52956,1,0), +(52981,1,0), +(52989,1,0), +(52990,1,0), +(53010,1,0), +(53020,1,0), +(53024,1,0), +(53029,1,0), +(53038,1,0), +(53083,1,0), +(53093,1,0), +(53096,1,0), +(53106,1,0), +(53110,1,0), +(53163,1,0), +(53170,1,0), +(53177,1,0), +(53185,1,0), +(53206,1,0), +(53210,1,0), +(53242,1,1), +(53272,1,0), +(53441,1,0), +(53464,1,0), +(53465,1,0), +(53466,1,0), +(53570,1,0), +(53609,1,0), +(53613,1,0), +(53626,1,0), +(53644,1,0), +(53680,1,0), +(53683,1,0), +(53684,1,0), +(53685,1,0), +(53701,1,0), +(53714,1,1), +(53717,1,0), +(53730,1,0), +(53745,1,0), +(53757,1,1), +(53778,1,0), +(53798,1,0), +(53826,1,0), +(53827,1,0), +(53828,1,0), +(53829,1,0), +(54040,1,0), +(54047,1,0), +(54089,1,0), +(54090,1,0), +(54097,1,0), +(54108,1,0), +(54112,1,0), +(54128,1,0), +(54142,1,0), +(54209,1,0), +(54236,1,0), +(54245,1,0), +(54250,1,0), +(54258,1,0), +(54264,1,0), +(54265,1,0), +(54266,1,0), +(54267,1,0), +(54269,1,0), +(54323,1,0), +(54325,1,0), +(54327,1,0), +(54328,1,0), +(54377,1,0), +(54423,1,0), +(54426,1,0), +(54430,1,0), +(54464,1,0), +(54510,1,0), +(54522,1,0), +(54539,1,0), +(54548,1,0), +(54643,1,0), +(54656,1,0), +(54664,1,0), +(54685,1,0), +(54699,1,1), +(54725,1,1), +(54728,1,0), +(54744,1,1), +(54746,1,1), +(54773,1,0), +(54796,1,0), +(54798,1,0), +(54806,1,0), +(54878,1,0), +(54899,1,0), +(54984,1,0), +(54985,1,0), +(54988,1,0), +(54991,1,0), +(55063,1,0), +(55089,1,0), +(55127,1,0), +(55134,1,0), +(55137,1,0), +(55138,1,0), +(55141,1,0), +(55145,1,0), +(55161,1,0), +(55223,1,0), +(55227,1,0), +(55229,1,0), +(55231,1,0), +(55244,1,0), +(55257,1,0), +(55287,1,0), +(55288,1,0), +(55290,1,0), +(55406,1,0), +(55418,1,0), +(55419,1,0), +(55423,1,1), +(55432,1,0), +(55465,1,0), +(55468,1,0), +(55510,1,0), +(55516,1,0), +(55519,1,0), +(55524,1,0), +(55526,1,0), +(55527,1,0), +(55571,1,0), +(55578,1,0), +(55616,1,1), +(55647,1,0), +(55660,1,0), +(55661,1,0), +(55662,1,0), +(55693,1,0), +(55720,1,0), +(55721,1,0), +(55722,1,0), +(55723,1,0), +(55724,1,0), +(55725,1,0), +(55726,1,0), +(55727,1,0), +(55785,1,0), +(55796,1,0), +(55801,1,0), +(55803,1,0), +(55805,1,0), +(55811,1,0), +(55844,1,0), +(55853,1,0), +(55868,1,0), +(55872,1,0), +(55875,1,0), +(55878,1,1), +(55881,1,1), +(55882,1,0), +(55885,1,1), +(55886,1,0), +(55887,1,1), +(55888,1,0), +(55954,1,0), +(56047,1,0), +(56066,1,0), +(56099,1,0), +(56103,1,0), +(56114,1,0), +(56117,1,0), +(56150,1,0), +(56152,1,0), +(56189,1,0), +(56227,1,0), +(56253,1,0), +(56263,1,0), +(56264,1,0), +(56265,1,0), +(56266,1,0), +(56275,1,0), +(56312,1,0), +(56387,1,0), +(56388,1,0), +(56393,1,0), +(56429,1,0), +(56458,1,0), +(56505,1,0), +(56523,1,0), +(56560,1,0), +(56563,1,0), +(56567,1,0), +(56575,1,0), +(56621,1,0), +(56622,1,0), +(56652,1,0), +(56661,1,0), +(56663,1,0), +(56665,1,0), +(56667,1,0), +(56669,1,0), +(56673,1,0), +(56677,1,0), +(56680,1,0), +(56683,1,0), +(56688,1,0), +(56691,1,0), +(56693,1,0), +(56695,1,0), +(56696,1,0), +(56711,1,0), +(56713,1,0), +(56722,1,0), +(56723,1,0), +(56724,1,0), +(56725,1,0), +(56738,1,0), +(56763,1,0), +(56764,1,0), +(56865,1,0), +(56905,1,0), +(56917,1,0), +(56941,1,1), +(57042,1,0), +(57068,1,0), +(57071,1,0), +(57072,1,0), +(57410,1,0), +(57417,1,0), +(57420,1,0), +(57422,1,0), +(57469,1,0), +(57471,1,0), +(57495,1,0), +(57523,1,0), +(57534,1,0), +(57632,1,0), +(57637,1,0), +(57638,1,0), +(57639,1,0), +(57642,1,0), +(57650,1,0), +(57659,1,0), +(57666,1,0), +(57667,1,0), +(57682,1,0), +(57732,1,0), +(57734,1,0), +(57735,1,0), +(57736,1,0), +(57737,1,0), +(57738,1,0), +(57797,1,0), +(57806,1,0), +(57809,1,0), +(57828,1,0), +(57852,1,0), +(57853,1,0), +(57885,1,0), +(57891,1,0), +(57912,1,0), +(57930,1,0), +(57962,1,0), +(57963,1,0), +(57980,1,0), +(57983,1,0), +(58036,1,0), +(58040,1,0), +(58064,1,0), +(58084,1,0), +(58103,1,0), +(58108,1,0), +(58109,1,0), +(58112,1,0), +(58114,1,0), +(58121,1,0), +(58123,1,0), +(58124,1,0), +(58131,1,0), +(58152,1,0), +(58178,1,0), +(58195,1,1), +(58196,1,1), +(58197,1,1), +(58198,1,1), +(58225,1,0), +(58350,1,0), +(58416,1,0), +(58493,1,1), +(58515,1,0), +(58533,1,0), +(58542,1,0), +(58552,1,0), +(58593,1,0), +(58641,1,0), +(58658,1,0), +(58672,1,0), +(58685,1,0), +(58793,1,0), +(58836,1,0), +(58838,1,0), +(58846,1,1), +(58858,1,0), +(58873,1,0), +(58916,1,0), +(58917,1,0), +(58945,1,0), +(58949,1,0), +(59078,1,0), +(59091,1,0), +(59098,1,0), +(59115,1,0), +(59125,1,0), +(59189,1,0), +(59190,1,0), +(59284,1,0), +(59335,1,0), +(59363,1,0), +(59375,1,0), +(59383,1,0), +(59386,1,0), +(59396,1,0), +(59449,1,0), +(59456,1,0), +(59461,1,1), +(59528,1,0), +(59534,1,0), +(59552,1,0), +(59554,1,0), +(59556,1,1), +(59579,1,0), +(59595,1,0), +(59643,1,0), +(59655,1,0), +(59668,1,0), +(59677,1,0), +(59678,1,0), +(59704,1,0), +(59729,1,0), +(59730,1,0), +(59764,1,0), +(59780,1,0), +(59781,1,0), +(59807,1,0), +(59847,1,0), +(59867,1,0), +(59871,1,0), +(59897,1,0), +(59925,1,0), +(59930,1,0), +(59951,1,0), +(59952,1,0), +(59977,1,0), +(60038,1,0), +(60045,1,0), +(60046,1,0), +(60088,1,0), +(60104,1,0), +(60178,1,1), +(60207,1,0), +(60208,1,0), +(60224,1,0), +(60243,1,0), +(60256,1,0), +(60285,1,0), +(60288,1,0), +(60291,1,1), +(60292,1,1), +(60293,1,1), +(60294,1,1), +(60295,1,1), +(60296,1,1), +(60297,1,1), +(60298,1,0), +(60310,1,0), +(60315,1,0), +(60316,1,0), +(60342,1,0), +(60422,1,0), +(60456,1,0), +(60476,1,1), +(60496,1,0), +(60499,1,1), +(60507,1,1), +(60508,1,1), +(60511,1,0), +(60516,1,0), +(60522,1,1), +(60528,1,0), +(60535,1,0), +(60536,1,0), +(60561,1,0), +(60612,1,0), +(60614,1,0), +(60713,1,0), +(60810,1,0), +(60829,1,0), +(60831,1,0), +(60834,1,0), +(60836,1,0), +(60863,1,0), +(60909,1,0), +(60912,1,1), +(60967,1,0), +(61007,1,0), +(61026,1,0), +(61028,1,0), +(61071,1,0), +(61072,1,0), +(61073,1,0), +(61074,1,0), +(61075,1,0), +(61114,1,0), +(61121,1,0), +(61151,1,0), +(61152,1,0), +(61180,1,0), +(61210,1,0), +(61219,1,0), +(61245,1,0), +(61254,1,0), +(61353,1,0), +(61355,1,0), +(61397,1,0), +(61408,1,0), +(61416,1,0), +(61487,1,0), +(61488,1,0), +(61492,1,0), +(61524,1,0), +(61537,1,0), +(61588,1,0), +(61602,1,0), +(61647,1,0), +(61652,1,0), +(61665,1,0), +(61710,1,0), +(61738,1,0), +(61764,1,0), +(61765,1,0), +(61766,1,0), +(61771,1,0), +(61816,1,1), +(61863,1,1), +(61901,1,0), +(61934,1,0), +(61942,1,0), +(61964,1,0), +(61975,1,0), +(62002,1,0), +(62016,1,0), +(62034,1,0), +(62037,1,1), +(62072,1,0), +(62082,1,0), +(62083,1,0), +(62084,1,0), +(62091,1,0), +(62102,1,0), +(62195,1,0), +(62223,1,0), +(62266,1,0), +(62272,1,0), +(62278,1,0), +(62284,1,0), +(62304,1,0), +(62323,1,0), +(62343,1,0), +(47129,2,0), +(34395,2,0), +(34387,2,0), +(32440,2,0), +(32439,2,0), +(32205,2,0), +(31538,2,0), +(30740,2,0), +(29831,2,0), +(28806,2,0), +(28353,2,0), +(27517,2,0), +(27203,2,0), +(27202,2,0), +(27201,2,0), +(27191,2,0), +(27190,2,0), +(27184,2,0), +(26560,2,0), +(26063,2,0), +(25005,2,0), +(24934,2,0), +(24871,2,0), +(24721,2,0), +(24390,2,0), +(23208,2,0), +(21127,2,0), +(18431,2,0), +(17731,2,0), +(17016,2,0), +(16613,2,0), +(16447,2,0), +(13489,2,0), +(12139,2,0), +(11792,2,0), +(9224,2,0), +(9223,2,0), +(9222,2,0), +(9221,2,0), +(8674,2,0), +(7729,2,0), +(7728,2,0), +(3921,2,0), +(35683,2,0), +(36066,2,0), +(36546,2,0), +(36851,2,0), +(37754,2,0), +(38439,2,0), +(38782,2,0), +(39050,2,0), +(40055,2,0), +(40165,2,0), +(40166,2,0), +(40167,2,0), +(40328,2,0), +(40447,2,0), +(40468,2,0), +(40632,2,0), +(40640,2,0), +(40642,2,0), +(40644,2,0), +(40675,2,0), +(40774,2,0), +(40785,2,0), +(40964,2,0), +(40965,2,0), +(40968,2,0), +(40970,2,0), +(41004,2,0), +(41145,2,0), +(41146,2,0), +(42020,2,0), +(42022,2,0), +(42323,2,0), +(42788,2,0), +(43418,2,0), +(43552,2,0), +(43723,2,0), +(43753,2,0), +(43768,2,0), +(43950,2,0), +(44307,2,0), +(44498,2,0), +(44499,2,0), +(44611,2,0), +(44686,2,0), +(44874,2,0), +(44885,2,0), +(45149,2,0), +(45222,2,0), +(45226,2,0), +(45795,2,0), +(45877,2,0), +(45971,2,0), +(46072,2,0), +(46350,2,0), +(46360,2,1), +(46584,2,0), +(76006,2,0), +(74179,2,0), +(72869,2,0), +(72868,2,0), +(72608,2,0), +(72456,2,0), +(72405,2,0), +(72340,2,1), +(71284,2,1), +(70598,2,1), +(70446,2,1), +(70346,2,0), +(70227,2,0), +(70199,2,0), +(70175,2,0), +(70173,2,0), +(69402,2,0), +(69400,2,0), +(69294,2,0), +(69157,2,0), +(67815,2,0), +(67814,2,0), +(67813,2,0), +(67812,2,0), +(67798,2,0), +(67459,2,0), +(67458,2,0), +(67448,2,0), +(67439,2,0), +(67436,2,0), +(66676,2,0), +(66672,2,0), +(66655,2,0), +(66531,2,0), +(66289,2,0), +(65209,2,0), +(64871,2,0), +(64570,2,0), +(64436,2,0), +(63618,2,0), +(63381,2,0), +(62776,2,0), +(62714,2,0), +(62635,2,0), +(62397,2,0), +(62363,2,0), +(62357,2,0), +(62355,2,0), +(62307,2,0), +(62086,2,0), +(61999,2,1), +(60289,2,0), +(60101,2,0), +(59790,2,0), +(59732,2,0), +(59576,2,0), +(58596,2,0), +(58231,2,0), +(57945,2,0), +(57619,2,0), +(57610,2,0), +(57607,2,0), +(57583,2,0), +(57575,2,0), +(57544,2,0), +(57517,2,0), +(57415,2,0), +(56790,2,0), +(56570,2,0), +(56385,2,0), +(56350,2,0), +(55934,2,0), +(55820,2,0), +(55367,2,0), +(55197,2,0), +(54712,2,0), +(54666,2,0), +(54530,2,0), +(52510,2,0), +(52408,2,0), +(52339,2,0), +(52277,2,0), +(52274,2,0), +(52115,2,0), +(51383,2,0), +(51328,2,0), +(51327,2,0), +(51326,2,0), +(51325,2,0), +(51241,2,0), +(50999,2,0), +(50319,2,0), +(50026,2,0), +(50003,2,0), +(49867,2,0), +(49860,2,0), +(49765,2,0), +(49728,2,0), +(49693,2,0), +(49689,2,0), +(49158,2,0), +(49123,2,0), +(49109,2,0), +(48794,2,0), +(48738,2,0), +(48347,2,0), +(47978,2,0), +(35246,2,0), +(42576,3,0), +(42492,3,0), +(42475,3,0), +(42433,3,0), +(42350,3,0), +(42348,3,0), +(42242,3,1), +(42228,3,0), +(42220,3,0), +(42114,3,0), +(41221,3,0), +(40961,3,0), +(40960,3,0), +(40959,3,0), +(40957,3,0), +(40885,3,0), +(40603,3,0), +(40495,3,0), +(40401,3,0), +(40380,3,0), +(40341,3,0), +(40307,3,0), +(40286,3,0), +(40285,3,0), +(40284,3,0), +(40283,3,0), +(40268,3,0), +(40247,3,0), +(40246,3,0), +(40245,3,0), +(40244,3,0), +(40240,3,0), +(40222,3,0), +(40179,3,0), +(40178,3,0), +(40177,3,0), +(40176,3,0), +(40105,3,0), +(40076,3,0), +(39932,3,0), +(39887,3,0), +(39844,3,0), +(39832,3,1), +(39831,3,0), +(39558,3,0), +(39401,3,0), +(39399,3,0), +(39398,3,0), +(39393,3,0), +(39384,3,0), +(39364,3,0), +(38866,3,0), +(38680,3,0), +(38173,3,0), +(38046,3,0), +(38044,3,0), +(37970,3,0), +(37954,3,0), +(37942,3,0), +(37919,3,0), +(37913,3,0), +(37793,3,1), +(37789,3,0), +(37750,3,1), +(37504,3,0), +(37489,3,0), +(37473,3,1), +(37366,3,0), +(37134,3,0), +(36821,3,0), +(36811,3,0), +(36450,3,0), +(36449,3,1), +(36325,3,0), +(35958,3,0), +(35776,3,0), +(35734,3,0), +(35599,3,0), +(35596,3,0), +(34303,3,0), +(34200,3,0), +(34186,3,0), +(42578,3,0), +(33814,3,0), +(33783,3,0), +(33670,3,0), +(33664,3,0), +(33365,3,0), +(33240,3,0), +(33111,3,0), +(32785,3,0), +(32314,3,0), +(32307,3,0), +(32241,3,0), +(32148,3,0), +(32067,3,0), +(31927,3,0), +(31543,3,0), +(31364,3,0), +(31363,3,0), +(31333,3,0), +(30758,3,0), +(30741,3,0), +(30284,3,0), +(29945,3,0), +(29866,3,0), +(29820,3,1), +(29460,3,0), +(28373,3,0), +(28250,3,0), +(28054,3,0), +(26521,3,0), +(26519,3,0), +(26518,3,0), +(26517,3,0), +(26516,3,0), +(26490,3,0), +(26488,3,0), +(26393,3,1), +(26373,3,0), +(26338,3,0), +(26337,3,0), +(26336,3,0), +(26335,3,0), +(26334,3,0), +(26333,3,0), +(26329,3,0), +(26328,3,0), +(26327,3,0), +(26326,3,0), +(26325,3,0), +(26304,3,0), +(26295,3,0), +(26294,3,0), +(26293,3,0), +(26292,3,0), +(26291,3,0), +(26286,3,0), +(25687,3,0), +(25183,3,0), +(25181,3,0), +(25180,3,0), +(25178,3,0), +(25177,3,0), +(24973,3,0), +(24731,3,0), +(23024,3,0), +(21086,3,0), +(21014,3,0), +(20038,3,0), +(20037,3,0), +(19873,3,0), +(17179,3,0), +(16629,3,0), +(16452,3,0), +(16337,3,0), +(15998,3,0), +(13488,3,0), +(12151,3,0), +(10860,3,0), +(10836,3,0), +(10835,3,0), +(10834,3,0), +(10805,3,0), +(9257,3,0), +(9232,3,0), +(42868,3,0), +(43233,3,0), +(43539,3,0), +(43664,3,0), +(43898,3,0), +(43954,3,0), +(43963,3,0), +(43986,3,0), +(44013,3,0), +(44132,3,0), +(44213,3,0), +(44249,3,0), +(44320,3,0), +(44321,3,0), +(44375,3,0), +(44465,3,0), +(44554,3,0), +(44565,3,0), +(44603,3,0), +(44678,3,0), +(44844,3,0), +(44884,3,0), +(45030,3,0), +(45050,3,1), +(45201,3,0), +(45203,3,0), +(45404,3,0), +(45502,3,0), +(45585,3,0), +(45633,3,0), +(45635,3,0), +(45653,3,0), +(45839,3,0), +(45885,3,1), +(46417,3,0), +(46574,3,0), +(46638,3,1), +(46852,3,0), +(46896,3,0), +(47030,3,1), +(47328,3,0), +(47510,3,0), +(47628,3,0), +(47745,3,0), +(47775,3,1), +(47800,3,0), +(48198,3,0), +(48212,3,0), +(48331,3,0), +(48431,3,0), +(48882,3,0), +(48972,3,0), +(49197,3,0), +(49300,3,0), +(49308,3,0), +(49453,3,0), +(49735,3,0), +(50313,3,1), +(50348,3,0), +(50443,3,0), +(50501,3,0), +(50626,3,0), +(50639,3,0), +(50640,3,0), +(50716,3,0), +(50790,3,0), +(50791,3,0), +(50802,3,0), +(50803,3,0), +(50825,3,0), +(50826,3,0), +(51212,3,0), +(51246,3,0), +(51395,3,0), +(51511,3,0), +(51742,3,0), +(51748,3,0), +(51805,3,0), +(51846,3,0), +(52067,3,1), +(52271,3,0), +(52305,3,0), +(52479,3,0), +(52480,3,0), +(52497,3,0), +(52603,3,0), +(52683,3,0), +(52685,3,0), +(52812,3,0), +(53677,3,0), +(53679,3,0), +(53694,3,0), +(53705,3,0), +(53706,3,0), +(54272,3,0), +(54517,3,0), +(54914,3,0), +(54961,3,0), +(54990,3,0), +(55037,3,0), +(55083,3,0), +(55365,3,0), +(55479,3,0), +(55715,3,0), +(55800,3,0), +(55889,3,1), +(56095,3,0), +(56140,3,0), +(56386,3,0), +(56389,3,0), +(56578,3,0), +(56747,3,0), +(56765,3,0), +(57586,3,0), +(57800,3,0), +(57824,3,0), +(57835,3,0), +(58766,3,0), +(58825,3,0), +(59008,3,0), +(59462,3,0), +(59464,3,0), +(59564,3,0), +(59629,3,0), +(59694,3,0), +(60639,3,0), +(61126,3,0), +(61224,3,0), +(61699,3,0), +(62000,3,0), +(62056,3,0), +(62385,3,0), +(62387,3,0), +(62399,3,0), +(62565,3,0), +(62709,3,0), +(62973,3,0), +(62991,3,0), +(63019,3,0), +(63122,3,1), +(63292,3,0), +(63294,3,0), +(63295,3,0), +(63317,3,0), +(63414,3,0), +(63528,3,0), +(63766,3,0), +(63983,3,0), +(63985,3,0), +(64021,3,0), +(65044,3,0), +(65045,3,0), +(65101,3,0), +(65585,3,0), +(65586,3,0), +(65690,3,0), +(66129,3,0), +(66170,3,0), +(66598,3,0), +(67398,3,0), +(68378,3,0), +(68902,3,0), +(69007,3,0), +(69095,3,0), +(69096,3,0), +(69708,3,0), +(69783,3,0), +(69797,3,0), +(69799,3,0), +(69802,3,0), +(69985,3,0), +(70028,3,0), +(70037,3,0), +(70194,3,0), +(70521,3,0), +(70564,3,0), +(70590,3,0), +(70997,3,0), +(70998,3,0), +(70999,3,0), +(71278,3,1), +(71621,3,0), +(71704,3,0), +(72155,3,1), +(72162,3,1), +(72274,3,1), +(72297,3,1), +(72460,3,1), +(72548,3,1), +(72549,3,1), +(72550,3,1), +(72619,3,1), +(72620,3,1), +(72679,3,0), +(72771,3,0), +(72850,3,0), +(72851,3,0), +(72852,3,0), +(74318,3,0), +(74319,3,0), +(74320,3,0), +(74472,3,0), +(75509,3,0), +(75553,3,1), +(75766,3,1), +(34012,3,0), +(74271,4,0), +(74270,4,0), +(72096,4,1), +(72034,4,1), +(71615,4,0), +(70827,4,0), +(69425,4,0), +(69164,4,0), +(69162,4,0), +(68981,4,0), +(68788,4,1), +(67816,4,0), +(67796,4,0), +(65370,4,0), +(65333,4,0), +(64626,4,0), +(62826,4,0), +(62489,4,0), +(62466,4,0), +(62457,4,0), +(62345,4,0), +(62308,4,0), +(60206,4,0), +(58185,4,0), +(55896,4,0), +(55349,4,0), +(54109,4,0), +(54107,4,0), +(51678,4,0), +(50652,4,0), +(49556,4,0), +(48610,4,0), +(48277,4,0), +(48224,4,0), +(47674,4,0), +(47109,4,0), +(45922,4,0), +(44969,4,0), +(44737,4,0), +(44687,4,0), +(44626,4,0), +(44233,4,0), +(40647,4,0), +(40259,4,0), +(39246,4,0), +(36904,4,0), +(36460,4,0), +(36374,4,0), +(30532,4,0), +(28995,4,0), +(10451,4,0), +(9735,4,0), +(8900,4,0), +(8899,4,0), +(8898,4,0), +(8202,4,0), +(74272,4,0), +(69767,5,0), +(65590,5,0), +(62386,5,0), +(55588,5,0), +(54713,5,0), +(49464,5,0), +(49460,5,0), +(49346,5,0), +(47310,5,1), +(45676,5,0), +(44217,5,0), +(43977,5,0), +(41962,5,0), +(40789,5,0), +(40503,5,0), +(38729,5,0), +(38312,5,0), +(38106,5,0), +(38105,5,0), +(38104,5,0), +(38103,5,0), +(38102,5,0), +(38101,5,0), +(38100,5,0), +(38099,5,0), +(37206,5,0), +(37205,5,0), +(37204,5,0), +(36817,5,0), +(34630,5,0), +(21866,5,0), +(21794,5,0), +(19832,5,0), +(19250,5,0), +(8913,5,0), +(67308,6,0), +(67307,6,0), +(67306,6,0), +(67305,6,0), +(67304,6,0), +(67303,6,0), +(65876,6,0), +(65875,6,0), +(63041,6,0), +(62560,6,0), +(59099,6,1), +(44608,6,0), +(43702,6,0), +(43080,6,0), +(43056,6,0), +(40902,6,0), +(40657,6,0), +(28803,6,1), +(16054,6,0), +(8712,6,0), +(75863,7,1), +(75448,7,1), +(74412,7,1), +(74323,7,0), +(74322,7,0), +(74321,7,0), +(73028,7,0), +(72622,7,1), +(72621,7,1), +(72459,7,1), +(72273,7,0), +(72272,7,0), +(71618,7,0), +(71614,7,0), +(71279,7,1), +(70982,7,0), +(70981,7,0), +(70952,7,0), +(69540,7,0), +(67751,7,0), +(66905,7,0), +(66667,7,0), +(65126,7,0), +(64218,7,0), +(63059,7,0), +(62942,7,0), +(62705,7,0), +(61920,7,0), +(61715,7,0), +(61714,7,0), +(61632,7,0), +(60532,7,0), +(60430,7,0), +(59474,7,0), +(59465,7,0), +(57409,7,0), +(57405,7,0), +(57056,7,1), +(56694,7,0), +(56454,7,0), +(54160,7,0), +(53605,7,0), +(52319,7,0), +(51719,7,0), +(50747,7,0), +(50646,7,0), +(50645,7,0), +(50627,7,0), +(50218,7,0), +(49889,7,0), +(48742,7,0), +(48552,7,0), +(46158,7,0), +(42287,7,0), +(42265,7,1), +(42079,7,0), +(42004,7,1), +(41284,7,0), +(41113,7,0), +(41112,7,0), +(41111,7,0), +(41110,7,0), +(41071,7,0), +(41064,7,1), +(40931,7,0), +(40929,7,0), +(40905,7,0), +(40900,7,0), +(40851,7,0), +(40370,7,0), +(40172,7,0), +(40171,7,0), +(40170,7,0), +(40169,7,0), +(40075,7,1), +(39698,7,0), +(39686,7,0), +(39218,7,0), +(38920,7,0), +(38774,7,0), +(38484,7,0), +(38449,7,0), +(38371,7,0), +(37076,7,0), +(35957,7,1), +(35754,7,0), +(35289,7,0), +(34350,7,0), +(34187,7,0), +(31625,7,0), +(31624,7,0), +(31617,7,0), +(30939,7,1), +(30659,7,0), +(30657,7,0), +(30531,7,0), +(30098,7,0), +(28681,7,1), +(25790,7,0), +(25029,7,0), +(23015,7,0), +(22710,7,0), +(20553,7,0), +(10732,7,0), +(10348,7,0), +(7082,7,0), +(5628,7,0), +(804,7,0), +(802,7,0), +(54069,1,0), +(56251,1,0), +(58630,1,0); + +-- remove redundant entries +DELETE FROM `conditions` WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 1 AND `ConditionValue2` = 0 AND `SourceEntry` IN (SELECT `id` FROM `temp_convert_spells` WHERE onlyPlayers); + +-- set source group if available in db +UPDATE `conditions` SET `SourceGroup` = `ConditionValue3`, `ConditionValue3` = 0 WHERE `ConditionTypeOrReference` = 18; + +-- set source group in case of old default (not set) source group +UPDATE `conditions` SET `SourceGroup` = (SELECT `effMask` FROM `temp_convert_spells` WHERE `id` = `SourceEntry`) WHERE `SourceGroup` = 0 AND `ConditionTypeOrReference` = 18; + +CREATE TABLE `temp_cond_vals` +( + `sourceGroup` INT(11), + `sourceEntry` INT(11), + `conditionValue1` INT(11), + `conditionValue2` INT(11), + `elseGroup` INT(11) AUTO_INCREMENT, + PRIMARY KEY (`sourceGroup`, `sourceEntry`, `elseGroup`) +) ENGINE=MYISAM; + +INSERT INTO `temp_cond_vals` (`sourceGroup`, `sourceEntry`, `conditionValue1`, `conditionValue2`) SELECT `SourceGroup`, `SourceEntry`, `ConditionValue1`, `ConditionValue2` FROM `conditions` WHERE `ConditionTypeOrReference` = 18; + +-- set correct else group +UPDATE `conditions` SET `ElseGroup` = (SELECT `elseGroup` FROM `temp_cond_vals` WHERE `sourceGroup` = `conditions`.`SourceGroup` AND `sourceEntry` = `conditions`.`SourceEntry` AND `conditionValue1` = `conditions`.`ConditionValue1` AND `conditionValue2` = `conditions`.`ConditionValue2`)-1 WHERE `ConditionTypeOrReference` = 18; + +-- old condition type 3 (caster's minion) +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`) +SELECT `SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, 33, 0, 1, 3 FROM `conditions` WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 3; + +UPDATE `conditions` SET `ConditionTypeOrReference` = 31 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 3; + +-- old condition type 2 (dead creature) +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `NegativeCondition`) +SELECT `SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, 36, 0, 0, 0, 1 FROM `conditions` WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 2; + +UPDATE `conditions` SET `ConditionTypeOrReference` = 31, `ConditionValue1` = 3 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 2; + +-- old condition type 1 (creature) +UPDATE `conditions` SET `ConditionTypeOrReference` = 31, `ConditionValue1` = 3 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 1 AND `ConditionValue2`; + +-- old condition type 1 (player) +UPDATE `conditions` SET `ConditionTypeOrReference` = 32, `ConditionValue1` = 0x90 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 1 AND NOT `ConditionValue2`; + +-- old condition type 0 (gameobject) +UPDATE `conditions` SET `ConditionTypeOrReference` = 31, `ConditionValue1` = 5 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 0; + +DROP TABLE `temp_convert_spells`; +DROP TABLE `temp_cond_vals`; diff --git a/sql/old/3.3.5a/2012_02_21_02_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_02_21_02_world_creature_loot_template.sql new file mode 100644 index 00000000000..6c6af7ed2a3 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_02_world_creature_loot_template.sql @@ -0,0 +1,11 @@ +UPDATE `creature_template` SET `lootid`=`entry` WHERE `entry` IN (38032,37917,38016,38023,37214,38030,38006,37984); +DELETE FROM `creature_loot_template` WHERE `entry`IN (38032,37917,38016,38023,37214,38030,38006,37984); +INSERT INTO `creature_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `lootmode`, `groupid`, `mincountOrRef`, `maxcount`) VALUES +(38032,1,100,1,0,-45009,1), -- Crown Sprayer +(37917,1,100,1,0,-45009,1), -- Crown Thug +(38016,1,100,1,0,-45009,1), -- Crown Agent +(38023,1,100,1,0,-45009,1), -- Crown Sprinkler +(37214,1,100,1,0,-45009,1), -- Crown Lackey +(38030,1,100,1,0,-45009,1), -- Crown Underling +(38006,1,100,1,0,-45009,1), -- Crown Hoodlum (level 1??) +(37984,1,100,1,0,-45009,1); -- Crown Duster (level 1??) diff --git a/sql/old/3.3.5a/2012_02_21_03_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_02_21_03_world_creature_loot_template.sql new file mode 100644 index 00000000000..d7d043cbda9 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_03_world_creature_loot_template.sql @@ -0,0 +1,26 @@ +-- Razormane Hunter Warrior's Boots 32% to 3.2% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=3.2996 WHERE `entry`=3265 AND `item`=2967; +-- Razormane Hunter Hunting Cloak 11% to 1.1% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=1.1855 WHERE `entry`=3265 AND `item`=4689; +-- Razormane Defender Pioneer Buckler 87% to 0.8% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.8789 WHERE `entry`=3266 AND `item`=7109; +-- Razormane Defender Spellbinder Belt 77% to 0.7% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7717 WHERE `entry`=3266 AND `item`=4684; +-- Razormane Geomancer Simple Shoes 77% to 0.7% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7791 WHERE `entry`=3269 AND `item`=9743; +-- Razormane Geomancer Veteran Bracers 73% to 0.7% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7364 WHERE `entry`=3269 AND `item`=3213; +-- Venture Co. Supervisor Burnt Leather Belt 85% to 0.8% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.8511 WHERE `entry`=2979 AND `item`=4666; +-- Venture Co. Supervisor Warrior's Gloves 74% to 0.7% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7433 WHERE `entry`=2979 AND `item`=2968; +-- Venture Co. Supervisor Pioneer Bracers 55% to 0.5% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.5593 WHERE `entry`=2979 AND `item`=6519; +-- Venture Co. Supervisor Journeyman's Gloves 43% to 0.4% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.4348 WHERE `entry`=2979 AND `item`=2960; +-- Venture Co. Worker Warrior's Bracers 72% to 0.7% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7226 WHERE `entry`=2978 AND `item`=3214; +-- Venture Co. Worker Fine Scimitar 64% to 0.6% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.6492 WHERE `entry`=2978 AND `item`=4560; +-- Venture Co. Worker Warrior's Girdle 24% to 0.2% +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.2458 WHERE `entry`=2978 AND `item`=4659; diff --git a/sql/old/3.3.5a/2012_02_21_04_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_02_21_04_world_creature_loot_template.sql new file mode 100644 index 00000000000..3deedbf0b0d --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_04_world_creature_loot_template.sql @@ -0,0 +1,16 @@ +SET @ENTRY := 30409; -- Apprentice Osterkilgr +DELETE FROM `creature_loot_template` WHERE entry=@ENTRY; +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Quest related Items +(@ENTRY,43089,-100,1,0,1,1), -- Vrykul Bones +(@ENTRY,42772,-100,1,0,1,1), -- Dr Terrible's "Building a Better Flesh Giant" +(@ENTRY,42422,-50,1,0,1,1), -- Jotunheim Cage Key +-- Other random stuff +(@ENTRY,33470,20,1,0,1,4), -- Frostweave Cloth +(@ENTRY,43851,20,1,0,1,1), -- Fur Clothing Scraps +(@ENTRY,43852,20,1,0,1,1), -- Thick Fur Clothing Scraps +-- References for world drops +(@ENTRY,1,10,1,0,-35063,1), -- Northrend Grey Items +(@ENTRY,2,5,1,0,-35066,1), -- Northrend Green Items +-- hatebook +(@ENTRY,45912,0.1,1,0,1,1); -- Book Glyph of Mastery (honestly screw that thing) diff --git a/sql/old/3.3.5a/2012_02_21_05_world_gossip.sql b/sql/old/3.3.5a/2012_02_21_05_world_gossip.sql new file mode 100644 index 00000000000..1bdccae5c39 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_05_world_gossip.sql @@ -0,0 +1,39 @@ +-- SAI for Lothos Riftwaker +SET @ENTRY=14387; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Lothos Riftwaker - On Gossip Option select - close gossip'), +(@ENTRY,0,1,0,61,0,100,0,5750,0,0,0,62,409,0,0,0,0,0,7,0,0,0,1096,-467,-104.6,3.64,'Lothos Riftwaker - On Gossip Option select - teleport player'); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (5750); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(5750,0,0,'Teleport me to the Molten Core, Lothos.',1,1,0,0,0,0,''); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (5750); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,5750,0,0,0,8,7848,0,0,0,0,'','Show gossip option if player has quest 7848 completed'); + +-- SAI for Zamael Lunthistle +SET @ENTRY=8436; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,1285,0,0,0,26,3377,0,0,0,0,0,7,0,0,0,0,0,0,0,'Zamael Lunthistle - On Gossip Option select - quest credit'), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Zamael Lunthistle - On Gossip Option select - close gossip'); + +DELETE FROM `gossip_menu` WHERE `entry`=1285 AND `text_id`=1920; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1285,1920); +DELETE FROM `gossip_menu` WHERE `entry`=1286 AND `text_id`=1922; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1286,1922); +DELETE FROM `gossip_menu` WHERE `entry`=1287 AND `text_id`=1921; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1287,1921); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1285,1286,1287); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(1285,0,0,'I wish to hear your tale.',1,1,1287,0,0,0,''), +(1286,0,0,'Let me think about it, Zamael.',1,1,1285,0,0,0,''), +(1287,0,0,'Please continue, Zamael.',1,1,1286,0,0,0,''); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (1285); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,1285,0,0,0,9,3377,0,0,0,0,'','Show gossip option if player has quest 3377 but not complete'); diff --git a/sql/old/3.3.5a/2012_02_21_06_world_Gossip.sql b/sql/old/3.3.5a/2012_02_21_06_world_Gossip.sql new file mode 100644 index 00000000000..a59d330c6a3 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_21_06_world_Gossip.sql @@ -0,0 +1,184 @@ +-- Gossip Update from Pitcrawler +-- Creature Gossip_menu_id Update from sniff +UPDATE `creature_template` SET `gossip_menu_id`=7692 WHERE `entry`=18424; +UPDATE `creature_template` SET `gossip_menu_id`=9033 WHERE `entry`=24838; +UPDATE `creature_template` SET `gossip_menu_id`=9038 WHERE `entry`=24833; +UPDATE `creature_template` SET `gossip_menu_id`=9066 WHERE `entry`=25011; +UPDATE `creature_template` SET `gossip_menu_id`=9067 WHERE `entry`=25015; +UPDATE `creature_template` SET `gossip_menu_id`=9068 WHERE `entry`=25009; +UPDATE `creature_template` SET `gossip_menu_id`=9069 WHERE `entry`=25017; +UPDATE `creature_template` SET `gossip_menu_id`=9070 WHERE `entry`=25018; +UPDATE `creature_template` SET `gossip_menu_id`=9071 WHERE `entry`=25016; +UPDATE `creature_template` SET `gossip_menu_id`=9072 WHERE `entry` IN (25013,25014); +UPDATE `creature_template` SET `gossip_menu_id`=9091 WHERE `entry`=25076; +UPDATE `creature_template` SET `gossip_menu_id`=9107 WHERE `entry`=24929; +UPDATE `creature_template` SET `gossip_menu_id`=9109 WHERE `entry`=24927; +UPDATE `creature_template` SET `gossip_menu_id`=9110 WHERE `entry`=24924; +UPDATE `creature_template` SET `gossip_menu_id`=9116 WHERE `entry`=25105; +UPDATE `creature_template` SET `gossip_menu_id`=9117 WHERE `entry`=25100; +UPDATE `creature_template` SET `gossip_menu_id`=9118 WHERE `entry`=25104; +UPDATE `creature_template` SET `gossip_menu_id`=9120 WHERE `entry`=25107; +UPDATE `creature_template` SET `gossip_menu_id`=9121 WHERE `entry` IN (25101,25102,25103); +UPDATE `creature_template` SET `gossip_menu_id`=9122 WHERE `entry`=25106; +UPDATE `creature_template` SET `gossip_menu_id`=9349 WHERE `entry`=26539; +UPDATE `creature_template` SET `gossip_menu_id`=10120 WHERE `entry` IN (31704,31705,31706,31720,31723,31724); +UPDATE `creature_template` SET `gossip_menu_id`=10259 WHERE `entry`=31716; + +-- Gossip Menu insert from sniff +DELETE FROM `gossip_menu` WHERE `entry`=7692 AND `text_id`=9383; +DELETE FROM `gossip_menu` WHERE `entry`=7696 AND `text_id`=9444; +DELETE FROM `gossip_menu` WHERE `entry`=7704 AND `text_id`=9425; +DELETE FROM `gossip_menu` WHERE `entry`=7726 AND `text_id`=9437; +DELETE FROM `gossip_menu` WHERE `entry`=7727 AND `text_id`=9438; +DELETE FROM `gossip_menu` WHERE `entry`=7728 AND `text_id`=9439; +DELETE FROM `gossip_menu` WHERE `entry`=9033 AND `text_id`=12211; +DELETE FROM `gossip_menu` WHERE `entry`=9038 AND `text_id`=12216; +DELETE FROM `gossip_menu` WHERE `entry`=9040 AND `text_id`=12217; +DELETE FROM `gossip_menu` WHERE `entry`=9041 AND `text_id`=12218; +DELETE FROM `gossip_menu` WHERE `entry`=9042 AND `text_id`=12219; +DELETE FROM `gossip_menu` WHERE `entry`=9043 AND `text_id`=12220; +DELETE FROM `gossip_menu` WHERE `entry`=9066 AND `text_id`=12262; +DELETE FROM `gossip_menu` WHERE `entry`=9067 AND `text_id`=12263; +DELETE FROM `gossip_menu` WHERE `entry`=9068 AND `text_id`=12264; +DELETE FROM `gossip_menu` WHERE `entry`=9069 AND `text_id`=12266; +DELETE FROM `gossip_menu` WHERE `entry`=9070 AND `text_id`=12267; +DELETE FROM `gossip_menu` WHERE `entry`=9091 AND `text_id`=12292; +DELETE FROM `gossip_menu` WHERE `entry`=9109 AND `text_id`=12317; +DELETE FROM `gossip_menu` WHERE `entry`=9110 AND `text_id`=12318; +DELETE FROM `gossip_menu` WHERE `entry`=9116 AND `text_id`=12327; +DELETE FROM `gossip_menu` WHERE `entry`=9117 AND `text_id`=12328; +DELETE FROM `gossip_menu` WHERE `entry`=9118 AND `text_id`=12329; +DELETE FROM `gossip_menu` WHERE `entry`=9120 AND `text_id`=12331; +DELETE FROM `gossip_menu` WHERE `entry`=9121 AND `text_id`=12332; +DELETE FROM `gossip_menu` WHERE `entry`=9122 AND `text_id`=12333; +DELETE FROM `gossip_menu` WHERE `entry`=9349 AND `text_id`=12649; +DELETE FROM `gossip_menu` WHERE `entry`=10120 AND `text_id`=14047; +DELETE FROM `gossip_menu` WHERE `entry`=10259 AND `text_id`=14248; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(7692,9383), +(7696,9444), +(7704,9425), +(7726,9437), +(7727,9438), +(7728,9439), +(9033,12211), +(9038,12216), +(9040,12217), +(9041,12218), +(9042,12219), +(9043,12220), +(9066,12262), +(9067,12263), +(9068,12264), +(9069,12266), +(9070,12267), +(9091,12292), +(9109,12317), +(9110,12318), +(9116,12327), +(9117,12328), +(9118,12329), +(9120,12331), +(9121,12332), +(9122,12333), +(9349,12649), +(10120,14047), +(10259,14248); + +-- Insert npc_text from sniff +DELETE FROM `npc_text` WHERE `ID` IN (9437,9438,9439,12211,12266); +INSERT INTO `npc_text` (`ID`,`text0_0`,`text0_1`,`lang0`,`prob0`,`em0_0`,`em0_1`,`em0_2`,`em0_3`,`em0_4`,`em0_5`,`text1_0`,`text1_1`,`lang1`,`prob1`,`em1_0`,`em1_1`,`em1_2`,`em1_3`,`em1_4`,`em1_5`,`text2_0`,`text2_1`,`lang2`,`prob2`,`em2_0`,`em2_1`,`em2_2`,`em2_3`,`em2_4`,`em2_5`,`text3_0`,`text3_1`,`lang3`,`prob3`,`em3_0`,`em3_1`,`em3_2`,`em3_3`,`em3_4`,`em3_5`,`text4_0`,`text4_1`,`lang4`,`prob4`,`em4_0`,`em4_1`,`em4_2`,`em4_3`,`em4_4`,`em4_5`,`text5_0`,`text5_1`,`lang5`,`prob5`,`em5_0`,`em5_1`,`em5_2`,`em5_3`,`em5_4`,`em5_5`,`text6_0`,`text6_1`,`lang6`,`prob6`,`em6_0`,`em6_1`,`em6_2`,`em6_3`,`em6_4`,`em6_5`,`text7_0`,`text7_1`,`lang7`,`prob7`,`em7_0`,`em7_1`,`em7_2`,`em7_3`,`em7_4`,`em7_5`,`WDBVerified`) VALUES +(9437,'$B$BZangarmarsh... too close to truth.$B$B$B$BIs he still watching!?','',0,1,1000,1,1000,6,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), +(9438,'What''s that? Zangarmarsh? Why would I want to go there?$B$B$B$BYes, Zangarmarsh... we... the druids there are getting close to figuring out why the water level is dropping. It''s destroying everything!$B$B$B$BDestroyed us all! Bright light! BOOM!!','',0,1,0,6,1000,1,1000,5,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), +(9439,'The Firewing blood elves... for some reason they want to stop us.$B$B$B$BThey... they sent one of the Broken as ... as an emissary.... But he had a bomb!$B$BThey died, they all died! They tried to run away! The lucky ones didn''t even know.$B$BI must have been at the edge of the blast. It was horr...IT''S WATCHING US AGAIN!$B$B','',0,1,0,18,1000,18,1000,5,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), +(12211,'Fine day fer sailin'', innit?','',7,1,0,1,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), +(12266,'','I''m almost jealous of our Mr. Wavesinger. Why, he may well be prettier than me!',7,1,0,1,3,11,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340); + +-- Creature Gossip_menu_option insert from sniff +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7692,7726,7727) AND `id`=0; +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9038,9040,9041,9042,9043) AND `id` IN (0,1,2); +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9038 AND `id`=3; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(7692,0,0,'Treelos, I know that the truth is somewhere inside you. Tell me what it is.',1,1,7726,0,0,0,''), +(7726,0,0,'Keep it together man! What about Zangarmarsh?',1,1,7727,0,0,0,''), +(7727,0,0,'I don''t have time for this! Warden, what happened?!',1,1,7728,0,0,0,''), +(9038,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), +(9038,1,0,'Food & Drink',1,1,9041,0,0,0,''), +(9038,2,0,'Goods & Gear',1,1,9042,0,0,0,''), +(9038,3,0,'"Stash?"',1,1,9043,0,0,0,''), +(9040,0,0,'Food & Drink',1,1,9041,0,0,0,''), +(9040,1,0,'Goods & Gear',1,1,9042,0,0,0,''), +(9040,2,0,'"Stash?',1,1,9043,0,0,0,''), +(9041,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), +(9041,1,0,'Goods & Gear',1,1,9042,0,0,0,''), +(9041,2,0,'"Stash?',1,1,9043,0,0,0,''), +(9042,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), +(9042,1,0,'Food & Drink',1,1,9041,0,0,0,''), +(9042,2,0,'"Stash?',1,1,9043,0,0,0,''), +(9043,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), +(9043,1,0,'Food & Drink',1,1,9041,0,0,0,''), +(9043,2,0,'Goods & Gear',1,1,9042,0,0,0,''); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7704 AND `SourceEntry`=9425; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7696 AND `SourceEntry`=9444; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (7704,7692); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,7696,9444,0,0,8,10005,0,0,0,0,'','Show different gossip if player has rewarded quest 10005'), +(14,7696,9444,0,1,8,10006,0,0,0,0,'','Show different gossip if player has rewarded quest 10006'), +(14,7704,9425,0,0,8,9978,0,0,0,0,'','Show different gossip if player has rewarded quest 9978'), +(15,7704,0,0,0,9,9978,0,0,0,0,'','Show gossip option if player has quest 9978 but not complete'), +(15,7692,0,0,0,8,10006,0,0,0,0,'','Show gossip option if player has rewarded quest 10006'), +(15,7692,0,0,1,8,10005,0,0,0,0,'','Show gossip option if player has rewarded quest 10005'); + +-- Gossip Update from Malcrom +DELETE FROM `gossip_menu` WHERE `entry` IN (1042,1043,1044,1045,1046,1047,1048,1049,1050,1052,1053); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(1042,1635),(1043,1640),(1044,1644),(1045,1643),(1045,1753), +(1046,1648),(1047,1754),(1048,1650),(1049,1755), +(1050,1651),(1050,1756),(1052,1652),(1053,1653); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1045,1047,1049,1050); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(1045,0,0,'Acquire Higher Level Access Card',1,1,0,0,0,0,''), +(1047,0,0,'Acquire Higher Level Access Card',1,1,0,0,0,0,''), +(1049,0,0,'Acquire Higher Level Access Card',1,1,0,0,0,0,''), +(1050,0,0,'Acquire high level data card.',1,1,0,0,0,0,''); + +DELETE FROM `gossip_menu` WHERE `entry`=1080 AND `text_id`=1693; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1080,1693); +DELETE FROM `gossip_menu` WHERE `entry`=1100 AND `text_id`=1713; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1100,1713); +DELETE FROM `gossip_menu` WHERE `entry`=1143 AND `text_id`=1759; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1143,1759); +DELETE FROM `gossip_menu` WHERE `entry`=1161 AND `text_id`=1793; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1161,1793); +DELETE FROM `gossip_menu` WHERE `entry`=1162 AND `text_id`=1794; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1162,1794); +DELETE FROM `gossip_menu` WHERE `entry`=1201 AND `text_id`=1833; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1201,1833); +DELETE FROM `gossip_menu` WHERE `entry`=1281 AND `text_id`=1916; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1281,1916); +DELETE FROM `gossip_menu` WHERE `entry`=1282 AND `text_id`=1918; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1282,1918); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1282); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(1282,0,0,'Touch the Suntara stone and call forth Lathoric the Black and his guardian, Obsidion.',1,1,0,0,0,0,''); + +DELETE FROM `gossip_menu` WHERE `entry`=1301 AND `text_id`=1933; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1301,1933); +DELETE FROM `gossip_menu` WHERE `entry`=1301 AND `text_id`=1934; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1301,1934); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1301); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(1301,0,0,'I wish to browse your wares.',3,128,0,0,0,0,''); + +DELETE FROM `gossip_menu` WHERE `entry`=1302 AND `text_id`=1935; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1302,1935); +DELETE FROM `gossip_menu` WHERE `entry`=1321 AND `text_id`=1955; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1321,1955); +DELETE FROM `gossip_menu` WHERE `entry`=1322 AND `text_id`=1954; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1322,1954); +DELETE FROM `gossip_menu` WHERE `entry`=1362 AND `text_id`=1994; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1362,1994); diff --git a/sql/old/3.3.5a/2012_02_22_00_world_sai.sql b/sql/old/3.3.5a/2012_02_22_00_world_sai.sql new file mode 100644 index 00000000000..2e392f3a45f --- /dev/null +++ b/sql/old/3.3.5a/2012_02_22_00_world_sai.sql @@ -0,0 +1,39 @@ +-- SAI for Kalaran Windblade +SET @ENTRY=8479; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +-- AI +(@ENTRY,0,0,1,62,0,100,0,1321,0,0,0,26,3441,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - quest credit'), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - close gossip'), +(@ENTRY,0,2,3,62,0,100,0,1323,2,0,0,11,19797,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - cast 19797'), +(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - close gossip'), +(@ENTRY,0,4,0,62,0,100,0,1323,3,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - run script'), +-- Script +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - script - close gossip'), +(@ENTRY*100,9,1,0,0,0,100,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - remove npc flags'), +(@ENTRY*100,9,2,0,0,0,100,0,1000,1000,1000,1000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - say 0'), +(@ENTRY*100,9,3,0,0,0,100,0,1000,1000,1000,1000,17,69,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - emotestate usestanding'), +(@ENTRY*100,9,4,0,0,0,100,0,60000,60000,60000,60000,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - emotestate none'), +(@ENTRY*100,9,5,0,0,0,100,0,1000,1000,1000,1000,26,3453,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - script - give quest credit'), +(@ENTRY*100,9,6,0,0,0,100,0,1000,1000,1000,1000,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - add npc flags'); +-- npc text +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(@ENTRY,0,0,'Please be patient, $N',12,0,100,0,0,0,'Kalaran Windblade'); +-- Gossip options +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1321,1322,1323); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(1321,0,0,'Let me confer with my colleagues.',1,1,0,0,0,0,''), +(1322,0,0,'Continue please.',1,1,1321,0,0,0,''), +(1323,0,0,'Tell me what drives this vengeance?',1,1,1322,0,0,0,''), +(1323,2,0,'Kalaran, I have misplaced my torch. I require another.',1,1,0,0,0,0,''), +(1323,3,0,'Kalaran, please enchant the torch.',1,1,0,0,0,0,''); +-- Gossip option conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (1323); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,1323,0,0,0,9,3441,0,0,0,0,'','Show gossip option if player has quest 3441 but not complete'), +(15,1323,2,0,0,8,3454,0,0,0,0,'','Show gossip option if player has quest 3441 complete'), +(15,1323,2,0,0,2,10515,0,1,0,0,'','Show gossip option if player does not have item 10515'), +(15,1323,3,0,0,9,3453,0,0,0,0,'','Show gossip option if player has quest 3453 but not complete'); diff --git a/sql/old/3.3.5a/2012_02_22_01_world_creature_text.sql b/sql/old/3.3.5a/2012_02_22_01_world_creature_text.sql new file mode 100644 index 00000000000..8b7761e48a0 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_22_01_world_creature_text.sql @@ -0,0 +1,34 @@ +-- Invisible Stalker text for Wintergrasp from sniff +DELETE FROM `creature_text` WHERE `entry`=15214; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(15214,0,0, 'Let the battle begin!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,1,0, 'The Broken Temple siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,2,0, 'The Broken Temple siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,3,0, 'The Broken Temple siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,4,0, 'The Broken Temple siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,5,0, 'The Sunken Ring siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,6,0, 'The Sunken Ring siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,7,0, 'The Sunken Ring siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,8,0, 'The Sunken Ring siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,9,0, 'The Eastspark siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,10,0, 'The Eastspark siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,11,0, 'The Eastspark siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,12,0, 'The Eastspark siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,13,0, 'The Westspark siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,14,0, 'The Westspark siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,15,0, 'The Westspark siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,16,0, 'The Westspark siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,17,0, 'The north-western keep tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,18,0, 'The north-western keep tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,19,0, 'The south-eastern keep tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,20,0, 'The south-eastern keep tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,21,0, 'The western tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,22,0, 'The western tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,23,0, 'The southern tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,24,0, 'The southern tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,25,0, 'The eastern tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,26,0, 'The eastern tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,27,0, 'The Horde has defended Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,28,0, 'The Horde has captured Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,29,0, 'The Alliance has defended Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'), +(15214,30,0, 'The Alliance has captured Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'); diff --git a/sql/old/3.3.5a/2012_02_22_02_world_misc.sql b/sql/old/3.3.5a/2012_02_22_02_world_misc.sql new file mode 100644 index 00000000000..33bec2a9b78 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_22_02_world_misc.sql @@ -0,0 +1,57 @@ +-- Mounting Hodir's Helm (12987) + +-- cleanup after Discovered +-- clean all related to npc Hodir's Helm KC Bunny +DELETE FROM `smart_scripts` WHERE `entryorguid`=30210 AND `source_type`=0; +DELETE FROM `creature` WHERE `id`=30210; +DELETE FROM `creature_text` WHERE `entry`=30210; + +SET @HELM := 192080; -- Hodir's Helm +SET @TEMP := 300230; -- TEMP Northern Ice Spike +SET @BUNNY_TARGET := 30215; -- Ice Spike Target Bunny +SET @GUID_GO := 270; -- set by TDB +SET @GUID_NPC := 40514; -- set by TDB +SET @SPELL_READ_PRONOUNCEMENT := 56278; +SET @QUEST := 12987; +SET @AREA := 4438; -- Dun Niffelem +SET @SPELL_AREA := 56305; -- See Quest Invisibility 1 (Ice Spike Bunny) +SET @QUEST := 13006; -- Polishing the Helm + +UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33554432|256,`InhabitType`=7,`flags_extra`=`flags_extra`|128 WHERE `entry`=@BUNNY_TARGET; + +UPDATE `gameobject_template` SET `flags`=`flags`|32 WHERE `entry`=@HELM; +UPDATE `gameobject` SET `phaseMask`=4 WHERE `id`=@TEMP; + +DELETE FROM `gameobject` WHERE `guid`=@GUID_GO; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@GUID_GO,@HELM,571,1,4,7390.143,-2725.382,874.2561,-3.089183,0,0,-0.9996567,0.02620165,600,255,1); + +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID_NPC+0 AND @GUID_NPC+1; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@GUID_NPC+0,@BUNNY_TARGET,571,1,4,0,0,7386.51,-2726.489,872.5089,5.88176,300,0,0,4979,0,0,0,0,0), +(@GUID_NPC+1,@BUNNY_TARGET,571,1,4,0,0,7388.424,-2724.909,869.8643,0.5934119,300,0,0,4979,0,0,0,0,0); + +DELETE FROM `creature_template_addon` WHERE `entry`=@BUNNY_TARGET; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@BUNNY_TARGET,0,0,65536,1,0, '61333 56304 61334'); -- Gigantic Helm Sparkle / Hodir's Helm Bunny: Invisibility / Extra Large Helm Sparkle + +DELETE FROM `spell_script_names` WHERE `spell_id`=@SPELL_READ_PRONOUNCEMENT; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(@SPELL_READ_PRONOUNCEMENT, 'spell_q12987_read_pronouncement'); + +DELETE FROM `spell_area` WHERE `spell`=@SPELL_AREA; +INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_start_active`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`) VALUES +(@SPELL_AREA,@AREA,@QUEST,1,@QUEST,0,0,2,1); + +-- relation for the daily quest that should be available after finishing Mounting Hodir's Helm + +-- removing flag 4 or else player can't interract with Q giver +UPDATE `gameobject_template` SET `flags`=`flags`&~4 WHERE `entry`=@HELM; + +DELETE FROM `gameobject_questrelation` WHERE `id`=@HELM; +INSERT INTO `gameobject_questrelation` (`id`,`quest`) VALUES +(@HELM,@QUEST); + +DELETE FROM `gameobject_involvedrelation` WHERE `id`=@HELM; +INSERT INTO `gameobject_involvedrelation` (`id`,`quest`) VALUES +(@HELM,@QUEST); diff --git a/sql/old/3.3.5a/2012_02_22_03_world_conditions.sql b/sql/old/3.3.5a/2012_02_22_03_world_conditions.sql new file mode 100644 index 00000000000..9c4d0cdec95 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_22_03_world_conditions.sql @@ -0,0 +1,3 @@ +UPDATE `conditions` SET `SourceTypeOrReferenceId`=13 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=1; +UPDATE `conditions` SET `ConditionValue2`=1 WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=1323 AND `SourceEntry`=2 AND `ConditionTypeOrReference`=2; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=17465 AND `SourceEntry`=22554 AND `ConditionTypeOrReference`=7; diff --git a/sql/old/3.3.5a/2012_02_23_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_02_23_00_world_spell_script_names.sql new file mode 100644 index 00000000000..6ea96033091 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_23_00_world_spell_script_names.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` in (11885,11886,11887,11888,11889); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(11885,'spell_item_muisek_vessel'), +(11886,'spell_item_muisek_vessel'), +(11887,'spell_item_muisek_vessel'), +(11888,'spell_item_muisek_vessel'), +(11889,'spell_item_muisek_vessel'); diff --git a/sql/old/3.3.5a/2012_02_24_00_world_gameobject_loot_template.sql b/sql/old/3.3.5a/2012_02_24_00_world_gameobject_loot_template.sql new file mode 100644 index 00000000000..daecfc02dfc --- /dev/null +++ b/sql/old/3.3.5a/2012_02_24_00_world_gameobject_loot_template.sql @@ -0,0 +1,10 @@ +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (28058,28074,28088,28064,28082,28096) AND `item`=49908; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Deathbringer's Cache +(28058,49908,20,1,0,1,1), -- Primordial Saronite 10H +(28074,49908,20,1,0,1,1), -- Primordial Saronite 25N +(28088,49908,20,1,0,1,1), -- Primordial Saronite 25H +-- Cache of the Dreamwalker +(28064,49908,20,1,0,1,1), -- Primordial Saronite 10H +(28082,49908,20,1,0,1,1), -- Primordial Saronite 25N +(28096,49908,20,1,0,1,1); -- Primordial Saronite 25H diff --git a/sql/old/3.3.5a/2012_02_24_01_world_sai.sql b/sql/old/3.3.5a/2012_02_24_01_world_sai.sql new file mode 100644 index 00000000000..19e4e8fb772 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_24_01_world_sai.sql @@ -0,0 +1,44 @@ +-- Fix for quest "You've Really Done It This Time, Kul" 14096 Alliance / 14142 Horde +-- SAI for Black Cage +SET @ENTRY=195310; +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=1); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Black Cage - On activate - Run Script'), +(@ENTRY*100,9,0,0,0,0,100,0,6000,6000,6000,6000,32,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Black Cage - Script - set go state'); +-- SAI for Captive Aspirant +SET @ENTRY=34716; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,8,0,100,0,66531,0,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Captive Aspirant - On spellhit - Run Script'), +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Captive Aspirant - Script - Say random text'), +(@ENTRY*100,9,1,0,0,0,100,0,2000,2000,2000,2000,33,@ENTRY,0,0,0,0,0,7,0,0,0,0,0,0,0,'Captive Aspirant - Script - Kill credit'), +(@ENTRY*100,9,2,0,0,0,100,0,2000,2000,2000,2000,46,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'Captive Aspirant - Script - move 10 yards'), +(@ENTRY*100,9,3,0,0,0,100,0,4000,4000,4000,4000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Captive Aspirant - Script - despawn'); +-- SAI for Kul the Reckless +SET @ENTRY=34956; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,8,0,100,0,66531,0,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kul the Reckless - On spellhit - Run Script'), +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kul the Reckless - Script - Say random text'), +(@ENTRY*100,9,1,0,0,0,100,0,2000,2000,2000,2000,33,@ENTRY,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kul the Reckless - Script - Kill credit'), +(@ENTRY*100,9,2,0,0,0,100,0,2000,2000,2000,2000,46,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kul the Reckless - Script - move 10 yards'), +(@ENTRY*100,9,3,0,0,0,100,0,4000,4000,4000,4000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kul the Reckless - Script - despawn'); +-- Captive Aspirant & Kul the Reckless text from sniff +DELETE FROM `creature_text` WHERE `entry` IN (34716,34956); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(34716,0,0, 'Thank you, $c.',12,0,100,5,0,0, 'Captive Aspirant'), +(34716,0,1, 'They''re killing the prisoners! Hurry, help the others.',12,0,100,5,0,0, 'Captive Aspirant'), +(34716,0,2, 'I knew I shouldn''t have come to the tournament!',12,0,100,5,0,0, 'Captive Aspirant'), +(34716,0,3, 'I thought I was going to die in there!',12,0,100,5,0,0, 'Captive Aspirant'), +(34956,0,0, 'They were seconds from strapping me to one of those altars and sucking my soul out. Let''s get out of here!',12,0,100,5,0,0, 'Kul the Reckless'); +-- Target conditions for spell 66531 +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=66531; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,2,66531,0,0,31,3,34716,0,0,0,'','Spell 66531 targets npc 34716 or npc 34956'), +(13,2,66531,0,1,31,3,34956,0,0,0,'','Spell 66531 targets npc 34716 or npc 34956'); diff --git a/sql/old/3.3.5a/2012_02_25_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_02_25_00_world_spell_script_names.sql new file mode 100644 index 00000000000..9619121e982 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_25_00_world_spell_script_names.sql @@ -0,0 +1 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sindragosa_collision_filter'; diff --git a/sql/old/3.3.5a/2012_02_25_01_world_command.sql b/sql/old/3.3.5a/2012_02_25_01_world_command.sql new file mode 100644 index 00000000000..de708b7a9cc --- /dev/null +++ b/sql/old/3.3.5a/2012_02_25_01_world_command.sql @@ -0,0 +1,6 @@ +DELETE FROM `command` WHERE `name` IN ('group','group leader','group disband','group remove'); +INSERT INTO `command` (`name`,`security`,`help`) VALUES +('group', 3, 'Syntax: .group $subcommand\nType .group to see the list of possible subcommands or .help group $subcommand to see info on subcommands'), +('group leader', 3, 'Syntax: .group leader [$characterName]\n\nSets the given character as his group''s leader.'), +('group disband', 3, 'Syntax: .group disband [$characterName]\n\nDisbands the given character''s group.'), +('group remove', 3, 'Syntax: .group remove [$characterName]\n\nRemoves the given character from his group.'); diff --git a/sql/old/3.3.5a/2012_02_25_01_world_misc.sql b/sql/old/3.3.5a/2012_02_25_01_world_misc.sql new file mode 100644 index 00000000000..deedd50a819 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_25_01_world_misc.sql @@ -0,0 +1,11 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (61698); +INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) VALUES +(61698,'spell_gen_ds_flush_knockback'); + +DELETE FROM `spell_dbc` WHERE `id`=61698; +INSERT INTO `spell_dbc` (`Id`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `Stances`, `StancesNot`, `Targets`, `CastingTimeIndex`, `AuraInterruptFlags`, `ProcFlags`, `ProcChance`, `ProcCharges`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `StackAmount`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `Effect1`, `Effect2`, `Effect3`, `EffectDieSides1`, `EffectDieSides2`, `EffectDieSides3`, `EffectRealPointsPerLevel1`, `EffectRealPointsPerLevel2`, `EffectRealPointsPerLevel3`, `EffectBasePoints1`, `EffectBasePoints2`, `EffectBasePoints3`, `EffectMechanic1`, `EffectMechanic2`, `EffectMechanic3`, `EffectImplicitTargetA1`, `EffectImplicitTargetA2`, `EffectImplicitTargetA3`, `EffectImplicitTargetB1`, `EffectImplicitTargetB2`, `EffectImplicitTargetB3`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectRadiusIndex3`, `EffectApplyAuraName1`, `EffectApplyAuraName2`, `EffectApplyAuraName3`, `EffectAmplitude1`, `EffectAmplitude2`, `EffectAmplitude3`, `EffectMultipleValue1`, `EffectMultipleValue2`, `EffectMultipleValue3`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectMiscValue3`, `EffectMiscValueB1`, `EffectMiscValueB2`, `EffectMiscValueB3`, `EffectTriggerSpell1`, `EffectTriggerSpell2`, `EffectTriggerSpell3`, `EffectSpellClassMaskA1`, `EffectSpellClassMaskA2`, `EffectSpellClassMaskA3`, `EffectSpellClassMaskB1`, `EffectSpellClassMaskB2`, `EffectSpellClassMaskB3`, `EffectSpellClassMaskC1`, `EffectSpellClassMaskC2`, `EffectSpellClassMaskC3`, `MaxTargetLevel`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `MaxAffectedTargets`, `DmgClass`, `PreventionType`, `DmgMultiplier1`, `DmgMultiplier2`, `DmgMultiplier3`, `AreaGroupId`, `SchoolMask`, `Comment`) VALUES +(61698,0,0,536871296,269058048,67108868,268894272,2048,0,1024,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Flush - Knockback effect'); + +UPDATE `battleground_template` SET `HordeStartO`=3.14159 WHERE `id`=10; + +UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry`=28567; diff --git a/sql/old/3.3.5a/2012_02_25_02_world_sai.sql b/sql/old/3.3.5a/2012_02_25_02_world_sai.sql new file mode 100644 index 00000000000..e2ff99534b4 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_25_02_world_sai.sql @@ -0,0 +1,28 @@ +-- Fix for Quest: 12843 "They Took Our Men!" +-- SAI for Rusty Cage +SET @ENTRY=191544; +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=1); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,1,0,1,70,0,100,0,2,0,0,0,45,0,1,0,0,0,0,11,29466,5,0,0,0,0,0,'Rusty Cage - On activate - set data on Goblin Prisoner'), +(@ENTRY,1,1,0,61,0,100,0,0,0,0,0,33,29466,0,0,0,0,0,7,0,0,0,0,0,0,0,'Rusty Cage - On activate - quest credit'); +-- SAI for Goblin Prisoner +SET @ENTRY=29466; +UPDATE `creature` SET `modelid`=0,`spawntimesecs`=120,`curhealth`=1 WHERE `id`=29466; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,11,0,100,1,0,0,0,0,32,0,0,0,0,0,0,15,191544,5,0,0,0,0,0,'Goblin Prisoner - On respawn - reset cage'), +(@ENTRY,0,1,0,38,0,100,0,0,1,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Goblin Prisoner - On dataset - Run Script'), +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Goblin Prisoner - Script - set data 0'), +(@ENTRY*100,9,1,0,0,0,100,0,1000,1000,1000,1000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Goblin Prisoner - Script - Say random text'), +(@ENTRY*100,9,2,0,0,0,100,0,2000,2000,2000,2000,46,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'Goblin Prisoner - Script - move 10 yards'), +(@ENTRY*100,9,3,0,0,0,100,0,4000,4000,4000,4000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Goblin Prisoner - Script - despawn'); +-- Goblin Prisoner +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0, 'I can''t believe it! I''m free to go!',12,0,100,5,0,0, 'Goblin Prisoner'), +(@ENTRY,0,1, 'I''m free? I''m free!',12,0,100,5,0,0, 'Goblin Prisoner'), +(@ENTRY,0,2, 'Time to hightail it! Thanks, friend!',12,0,100,5,0,0, 'Goblin Prisoner'); diff --git a/sql/old/3.3.5a/2012_02_26_00_world_misc.sql b/sql/old/3.3.5a/2012_02_26_00_world_misc.sql new file mode 100644 index 00000000000..3df42934aa9 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_26_00_world_misc.sql @@ -0,0 +1,13 @@ +UPDATE `spell_area` SET `quest_start`=12987,`quest_end`=12987 WHERE `spell`=56305; + +DELETE FROM `reference_loot_template` WHERE `entry` IN (28058,28074,28088,28064,28082,28096) AND `item`=49908; -- bad data +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (28058,28074,28088,28064,28082,28096) AND `item`=49908; +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Deathbringer's Cache +(28058,49908,20,1,0,1,1), -- Primordial Saronite 10H +(28074,49908,20,1,0,1,1), -- Primordial Saronite 25N +(28088,49908,20,1,0,1,1), -- Primordial Saronite 25H +-- Cache of the Dreamwalker +(28064,49908,20,1,0,1,1), -- Primordial Saronite 10H +(28082,49908,20,1,0,1,1), -- Primordial Saronite 25N +(28096,49908,20,1,0,1,1); -- Primordial Saronite 25H diff --git a/sql/old/3.3.5a/2012_02_26_01_world_spell_script_names.sql b/sql/old/3.3.5a/2012_02_26_01_world_spell_script_names.sql new file mode 100644 index 00000000000..7bb38d5f2e0 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_26_01_world_spell_script_names.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (48018, 48020); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(48018,'spell_warl_demonic_circle_summon'), +(48020,'spell_warl_demonic_circle_teleport'); diff --git a/sql/old/3.3.5a/2012_02_27_00_world_creature_template.sql b/sql/old/3.3.5a/2012_02_27_00_world_creature_template.sql new file mode 100644 index 00000000000..b8936774e36 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_27_00_world_creature_template.sql @@ -0,0 +1,8 @@ +-- Update gold drops in ICC bosses based on old.wowhead.com data +UPDATE `creature_template` SET `mingold`=250000,`maxgold`=300000 WHERE `entry` IN(36612,37957,37958,37959); -- Lord Marrowgar +UPDATE `creature_template` SET `mingold`=175000,`maxgold`=225000 WHERE `entry` IN (36626,37504,37505,37506); -- Festergut +UPDATE `creature_template` SET `mingold`=400000,`maxgold`=500000 WHERE `entry` IN (36627,38390,38549,38550); -- Rotface +UPDATE `creature_template` SET `mingold`=400000,`maxgold`=500000 WHERE `entry` IN (36678,38431,38585,38586); -- Professor Putricide +UPDATE `creature_template` SET `mingold`=300000,`maxgold`=350000 WHERE `entry` IN (37955,38434,38435,38436); -- Blood-Queen Lana'thel +UPDATE `creature_template` SET `mingold`=1330000,`maxgold`=1400000 WHERE `entry` IN (36853,38265,38266,38267); -- Sindragosa +UPDATE `creature_template` SET `mingold`=1300000,`maxgold`=1500000 WHERE `entry` IN (36597,39166,39167,39168); -- The Lich King diff --git a/sql/old/3.3.5a/2012_02_28_00_world_wintergrasp_spawns.sql b/sql/old/3.3.5a/2012_02_28_00_world_wintergrasp_spawns.sql new file mode 100644 index 00000000000..9c07709246f --- /dev/null +++ b/sql/old/3.3.5a/2012_02_28_00_world_wintergrasp_spawns.sql @@ -0,0 +1,366 @@ +-- Delete unused creature_data rows +DELETE FROM `creature_addon` WHERE `guid` IN (131728,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131326,131327,131328,131350,131351,131352,131353,131354,131376,131377,131378,131379,131380,131392,131437,131458,131631,131632,131633,131634,131635,131636,131706,131727,13128,131729,131730,131731); + +-- Replace Wintergrasp spawns with properly phased spawns +SET @GUID := 88310; +DELETE FROM `creature` WHERE `id` IN (31841,31842,30400,30499,30489,30869,31036,31051,31052,31054,31108,31109,31153,39172,30870,31053,31091,31101,31102,31106,31107,31151,32294,39173,32296,30488); +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES +-- Taunka Spirit Guide (Horde) +(@GUID+0,31841,571,1,0x00000010,0,0,4318.436,2408.06738,392.675751,6.23082542,120,0,0,1,0,0), -- Eastspark Workshop +(@GUID+1,31841,571,1,0x00000010,0,0,4336.25439,3235.51978,390.334,0.628318548,120,0,0,1,0,0), -- Westspark Workshop +(@GUID+2,31841,571,1,0x00000010,0,0,5104.753,2300.9458,368.568054,0.7330383,120,0,0,1,0,0), -- The Sunken Ring +(@GUID+3,31841,571,1,0x00000010,0,0,5103.133,3462.128,368.568054,5.270895,120,0,0,1,0,0), -- The Chilled Quagmire "Outside broker Temple" +(@GUID+4,31841,571,1,0x00000040,0,0,5537.482,2898.90674,517.2589,4.86946869,120,0,0,1,0,0), -- Fortress +(@GUID+5,31841,571,1,0x00000001,0,0,5031.84131,3710.74878,372.4835,0,120,5,0,1,0,0), -- Horde Landing Zone +-- Dwarven Spirit Guide (Alliance) +(@GUID+6,31842,571,1,0x00000020,0,0,4318.436,2408.06738,392.675751,6.23082542,120,0,0,1,0,0), -- Eastspark Workshop +(@GUID+7,31842,571,1,0x00000020,0,0,4336.25439,3235.51978,390.334,0.628318548,120,0,0,1,0,0), -- Westspark Workshop +(@GUID+8,31842,571,1,0x00000020,0,0,5104.753,2300.9458,368.568054,0.7330383,120,0,0,1,0,0), -- The Sunken Ring +(@GUID+9,31842,571,1,0x00000020,0,0,5103.133,3462.128,368.568054,5.270895,120,0,0,1,0,0), -- The Chilled Quagmire "Outside The Broken Temple" +(@GUID+10,31842,571,1,0x00000080,0,0,5537.482,2898.90674,517.2589,4.86946869,120,0,0,1,0,0), -- Fortress +(@GUID+11,31842,571,1,0x00000001,0,0,5140.7876,2179.12451,390.9512,1.97222209,120,0,0,1,0,0), -- Aliance Landing Zone +-- Goblin Mechanic (Horde) +(@GUID+12,30400,571,1,0x00000010,0,0,4964.89,3383.06,382.911,6.12611,180,0,0,1,0,0), -- The Broken Temple +(@GUID+13,30400,571,1,0x00000010,0,0,4939.76,2389.06,326.153,3.26377,180,0,0,1,0,0), -- The Sunken Ring +(@GUID+14,30400,571,1,0x00000010,0,0,4357.67,2357.99,382.007,1.67552,180,0,0,1,0,0), -- Eastspark Workshop +(@GUID+15,30400,571,1,0x00000010,0,0,4354.15,3312.82,378.046,1.67552,180,0,0,1,0,0), -- Westspark Workshop +(@GUID+16,30400,571,1,0x00000040,0,0,5391.61,2707.72,415.051,4.55531,180,0,0,1,0,0), -- Wintergrasp Fortress +(@GUID+17,30400,571,1,0x00000040,0,0,5392.91,2975.26,415.223,4.55531,180,0,0,1,0,0), -- Wintergrasp Fortress +-- Gnomish Engineer (Alliance) +(@GUID+18,30499,571,1,0x00000020,0,0,4964.89,3383.06,382.911,6.12611,180,0,0,1,0,0), -- The Broken Temple +(@GUID+19,30499,571,1,0x00000020,0,0,4939.76,2389.06,326.153,3.26377,180,0,0,1,0,0), -- The Sunken Ring +(@GUID+20,30499,571,1,0x00000020,0,0,4357.67,2357.99,382.007,1.67552,180,0,0,1,0,0), -- Eastspark Workshop +(@GUID+21,30499,571,1,0x00000020,0,0,4354.15,3312.82,378.046,1.67552,180,0,0,1,0,0), -- Westspark Workshop +(@GUID+22,30499,571,1,0x00000080,0,0,5391.61,2707.72,415.051,4.55531,180,0,0,1,0,0), -- Wintergrasp Fortress +(@GUID+23,30499,571,1,0x00000080,0,0,5392.91,2975.26,415.223,4.55531,180,0,0,1,0,0), -- Wintergrasp Fortress +-- Alliance NPC's +(@GUID+24,30489,571,1,0x00000080,0,0,5369.973,2874.83081,409.3225,3.12413931,120,0,0,1,0,0), -- Morgan Day +(@GUID+25,30869,571,1,0x00000001,0,0,5102.75049,2187.82837,365.707855,3.996804,120,0,0,1,0,0), -- Arzo Safeflight +(@GUID+26,31036,571,1,0x00000040,0,0,5078.281,2183.704,365.028564,1.46607661,120,0,0,1,0,0), -- Commander Zanneth +(@GUID+27,31036,571,1,0x00000080,0,0,5358.641,2841.76416,409.3225,1.13262534,120,0,0,1,0,0), +(@GUID+28,31051,571,1,0x00000040,0,0,5081.697,2173.73,365.8777,0.8552113,120,0,0,1,0,0), -- Sorceress Kaylana +(@GUID+29,31051,571,1,0x00000080,0,0,5296.869,2887.67114,409.274658,5.60250664,120,0,0,1,0,0), +(@GUID+30,31052,571,1,0x00000040,0,0,5100.06543,2168.89,365.7788,1.97222209,120,0,0,1,0,0), -- Bowyer Randolph +(@GUID+31,31052,571,1,0x00000080,0,0,5302.57373,2750.40332,409.274658,5.46288061,120,0,0,1,0,0), +(@GUID+32,31054,571,1,0x00000040,0,0,5088.611,2167.66235,365.688751,0.6806784,120,0,0,1,0,0), -- Anchorite Tessa +(@GUID+33,31054,571,1,0x00000080,0,0,5372.05859,3028.33618,409.206024,0.012565271,120,0,0,1,0,0), +(@GUID+34,31108,571,1,0x00000040,0,0,5095.673,2193.284,365.9236,4.939282,120,0,0,1,0,0), -- Siege Master Stouthandle +(@GUID+35,31108,571,1,0x00000080,0,0,5298.267,2924.97632,409.274658,0.9075712,120,0,0,1,0,0), +(@GUID+36,31109,571,1,0x00000040,0,0,5080.403,2199.00244,359.4894,2.96705961,120,0,0,1,0,0), -- Senior Demolitionist Legoso +(@GUID+37,31109,571,1,0x00000080,0,0,5228.2915,2809.888,409.274658,3.19395256,120,0,0,1,0,0), +(@GUID+38,31153,571,1,0x00000040,0,0,5088.48633,2188.17871,365.646973,5.253441,120,0,0,1,0,0), -- Tactical Officer Ahbramis +(@GUID+39,31153,571,1,0x00000080,0,0,5364.784,2835.135,409.3225,3.12413931,120,0,0,1,0,0), +(@GUID+40,32294,571,1,0x00000080,0,0,5374.568,2790.784,409.3225,2.72271371,120,0,0,1,0,0), -- Knight Dameron +(@GUID+41,39172,571,1,0x00000080,0,0,5372.672,2786.74048,409.4423,2.80998015,120,0,0,1,0,0), -- Marshal Magruder +(@GUID+42,30488,571,1,0x00000080,0,0,5370.428,2814.274,409.3225,3.054326,120,0,0,1,0,0), -- Travis Day +-- Horde NPC's +(@GUID+43,30870,571,1,0x00000001,0,0,5023.4043,3686.03345,363.1192,5.131268,120,0,0,1,0,0), -- Herzo Safeflight +(@GUID+44,31053,571,1,0x00000040,0,0,5379.875,3027.43359,409.206024,0,120,0,0,1,0,0), -- Primalist Mulfort +(@GUID+45,31053,571,1,0x00000080,0,0,5034.703125,3666.703125,363.273865,4.310963,120,0,0,1,0,0), +(@GUID+46,31091,571,1,0x00000040,0,0,5347.7915,2837.38574,409.3466,2.62603331,120,0,0,1,0,0), -- Commander Dardosh +(@GUID+47,31091,571,1,0x00000080,0,0,5018.662109,3672.279541,362.862885,2.209141,120,0,0,1,0,0), +(@GUID+48,31101,571,1,0x00000040,0,0,5296.564,2789.87378,409.274658,0.7330383,120,0,0,1,0,0), -- Hoodoo Master Fu'jin +(@GUID+49,31101,571,1,0x00000080,0,0,5014.065430,3678.846436,362.995575,5.096361,120,0,0,1,0,0), +(@GUID+50,31102,571,1,0x00000040,0,0,5295.455,2732.87549,409.274658,4.7211113,120,0,0,1,0,0), -- Vieron Blazefeather +(@GUID+51,31102,571,1,0x00000080,0,0,5031.676270,3655.820801,362.234558,5.131268,120,0,0,1,0,0), +(@GUID+52,31106,571,1,0x00000040,0,0,5295.56348,2926.67188,409.274658,0.87266463,120,0,0,1,0,0), -- Siegesmith Stronghoof +(@GUID+53,31106,571,1,0x00000080,0,0,5037.602051,3675.459717,363.147888,3.176499,120,0,0,1,0,0), +(@GUID+54,31107,571,1,0x00000040,0,0,5230.09033,2876.635,409.316254,-2.19854617,120,0,0,1,0,0), -- Lieutenant Murp +(@GUID+55,31107,571,1,0x00000080,0,0,5004.455078,3661.089111,361.335785,3.979351,120,0,0,1,0,0), +(@GUID+56,31151,571,1,0x00000040,0,0,5363.2876,2834.52954,409.3606,2.76273036,120,0,0,1,0,0), -- Tactical Officer Kilrath +(@GUID+57,31151,571,1,0x00000080,0,0,5034.698242,3683.268799,363.129120,4.310963,120,0,0,1,0,0), +(@GUID+58,32296,571,1,0x00000040,0,0,5374.568,2790.784,409.3225,2.60054,120,0,0,1,0,0), -- Stone Guard Mukar +-- Missing noc in fortress +(@GUID+60,39173,571,1,0x00000040,0,0,5372.672,2786.74048,409.4423,2.80998015,120,0,0,1,0,0); -- Champion Ros'slai + +-- corrects previously inserted creature +UPDATE `creature` SET `spawndist`=0 WHERE `guid`=88315; + +-- Pathing for Anchorite Tessa Entry: 31054 +SET @NPC := @GUID+33; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,5382.507,3028.468,409.206,0,0,0,100,0), +(@PATH,2,5392.744,3028.737,409.206,0,0,0,100,0), +(@PATH,3,5382.507,3028.468,409.206,0,0,0,100,0), +(@PATH,4,5371.491,3028.329,409.206,0,0,0,100,0), +(@PATH,5,5360.032,3028.516,409.3161,0,0,0,100,0), +(@PATH,6,5371.491,3028.329,409.206,0,0,0,100,0); + +-- Pathing for Commander Zanneth Entry: 31036 +SET @NPC := @GUID+27; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5358.854,`position_y`=2859.232,`position_z`=409.5425 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,14337, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,5359.788,2846.359,409.3642,0,0,0,100,0), +(@PATH,2,5359.187,2839.211,409.3642,0,0,0,100,0), +(@PATH,3,5360.083,2823.116,409.5381,0,0,0,100,0), +(@PATH,4,5359.187,2839.211,409.3642,0,0,0,100,0), +(@PATH,5,5359.788,2846.359,409.3642,0,0,0,100,0), +(@PATH,6,5358.854,2859.232,409.5425,0,0,0,100,0); + +-- Pathing for Commander Dardosh Entry: 31091 +SET @NPC := @GUID+46; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `MovementType`=2,`position_x`=5359.546,`position_y`=2858.049,`position_z`=409.3642 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,5359.202,2843.208,409.3642,0,0,0,100,0), +(@PATH,2,5358.997,2827.974,409.3639,0,0,0,100,0), +(@PATH,3,5359.202,2843.208,409.3642,0,0,0,100,0), +(@PATH,4,5359.546,2858.049,409.3642,0,0,0,100,0); + +-- Pathing for Commander Dardosh Entry: 31091 +SET @NPC := @GUID+47; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `MovementType`=2,`position_x`=5018.411133,`position_y`=3672.615967,`position_z`=362.863525 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,5022.827637,3666.665771,362.205750,0,0,0,100,0), +(@PATH,2,5024.270508,3658.739258,361.705750,0,0,0,100,0), +(@PATH,3,5022.827637,3666.665771,362.205750,0,0,0,100,0), +(@PATH,4,5018.411133,3672.615967,362.863525,0,0,0,100,0); + +-- Pathing for Primalist Mulfort Entry: 31053 +SET @NPC := @GUID+44; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,5390.624,3027.994,409.206,0,0,0,100,0), +(@PATH,2,5379.875,3027.434,409.206,0,0,0,100,0), +(@PATH,3,5371.404,3026.511,409.206,0,0,0,100,0), +(@PATH,4,5379.875,3027.434,409.206,0,0,0,100,0); + +-- Pathing for Vieron Blazefeather Entry: 31102 +SET @NPC := @GUID+50; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `MovementType`=2,`position_x`=5296.644,`position_y`=2731.107,`position_z`=409.3163 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,5295.544,2722.631,409.3163,0,0,0,100,0), +(@PATH,2,5296.644,2731.107,409.3163,0,0,0,100,0), +(@PATH,3,5297.874,2738.155,409.3163,0,0,0,100,0), +(@PATH,4,5305.192,2746.161,409.3061,0,0,0,100,0), +(@PATH,5,5297.874,2738.155,409.3163,0,0,0,100,0), +(@PATH,6,5296.644,2731.107,409.3163,0,0,0,100,0); + +-- Guards "Alliance" (Valiance Expedition Champion) +SET @GUID := 88371; +DELETE FROM `creature` WHERE `id`=30740; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES +-- Fortress +(@GUID+0,30740,571,1,0x00000080,0,0,5150.26855,2786.02173,409.5469,3.22885919,120,0,0,1,0,0), +(@GUID+1,30740,571,1,0x00000080,0,0,5150.657,2777.9502,409.4053,2.94960642,120,0,0,1,0,0), +(@GUID+2,30740,571,1,0x00000080,0,0,5193.632,2734.172,409.272552,4.694936,120,0,0,1,0,0), +(@GUID+3,30740,571,1,0x00000080,0,0,5200.497,2733.88843,409.272552,4.677482,120,0,0,1,0,0), +(@GUID+4,30740,571,1,0x00000080,0,0,5264.64648,2670.1936,409.1819,3.07177949,120,0,0,1,0,0), +(@GUID+5,30740,571,1,0x00000080,0,0,5265.30566,2663.15381,409.1819,3.12413931,120,0,0,1,0,0), +(@GUID+6,30740,571,1,0x00000080,0,0,5307.02051,2613.89771,409.172363,4.694936,120,0,0,1,0,0), +(@GUID+7,30740,571,1,0x00000080,0,0,5311.133,3061.04248,408.809937,1.50098312,120,0,0,1,0,0), +(@GUID+8,30740,571,1,0x00000080,0,0,5315.87354,2614.21924,408.972748,4.677482,120,0,0,1,0,0), +(@GUID+9,30740,571,1,0x00000080,0,0,5318.09,3060.634,408.882782,1.62315619,120,0,0,1,0,0), +(@GUID+10,30740,571,1,0x00000080,0,0,5149.395,2897.044,409.304443,3.03687286,120,0,0,1,0,0), +(@GUID+11,30740,571,1,0x00000080,0,0,5149.51953,2904.19336,409.276062,3.07177949,120,0,0,1,0,0), +(@GUID+12,30740,571,1,0x00000080,0,0,5192.79248,2948.454,409.2746,1.50098312,120,0,0,1,0,0), +(@GUID+13,30740,571,1,0x00000080,0,0,5201.645,2948.77612,409.2746,1.62315619,120,0,0,1,0,0), +(@GUID+14,30740,571,1,0x00000080,0,0,5265.28,3010.10083,408.895782,2.82743335,120,0,0,1,0,0), +(@GUID+15,30740,571,1,0x00000080,0,0,5265.47559,3017.39941,408.582977,3.07177949,120,0,0,1,0,0), +(@GUID+16,30740,571,1,0x00000080,0,0,5367.91455,2826.52026,409.3225,3.33357882,120,0,0,1,0,0), +(@GUID+17,30740,571,1,0x00000080,0,0,5368.71338,2856.36035,409.3225,2.94960642,120,0,0,1,0,0), +(@GUID+18,30740,571,1,0x00000080,0,0,5388.56,2834.76782,418.7585,3.07177949,120,0,0,1,0,0), +(@GUID+19,30740,571,1,0x00000080,0,0,5389.272,2847.36816,418.7585,3.106686,120,0,0,1,0,0), +(@GUID+20,30740,571,1,0x00000080,0,0,4684.475,2414.28979,369.9621,-2.85779858,120,0,0,1,0,0), +(@GUID+21,30740,571,1,0x00000080,0,0,4692.75635,2392.88574,369.0177,-2.82921553,120,0,0,1,0,0), +(@GUID+22,30740,571,1,0x00000080,0,0,5327.264648,2659.455322,409.178711,3.069901,120,0,0,1,0,0), -- F1307814000A2DAD path +(@GUID+23,30740,571,1,0x00000080,0,0,5154.225586,2833.824219,409.262451,3.124139,120,0,0,1,0,0), +(@GUID+24,30740,571,1,0x00000080,0,0,5154.119629,2847.892822,409.247559,3.071779,120,0,0,1,0,0), +(@GUID+25,30740,571,1,0x00000080,0,0,5179.111328,2837.129639,409.274658,3.211406,120,0,0,1,0,0), +(@GUID+26,30740,571,1,0x00000080,0,0,5179.666504,2846.597900,409.274658,3.089233,120,0,0,1,0,0), +(@GUID+27,30740,571,1,0x00000080,0,0,5270.163086,2833.479248,409.274658,3.124139,120,0,0,1,0,0), +(@GUID+28,30740,571,1,0x00000080,0,0,5270.057129,2847.547607,409.274658,3.071779,120,0,0,1,0,0), +(@GUID+29,30740,571,1,0x00000080,0,0,5307.750000,3008.872559,409.193024,4.781681,120,0,0,1,0,0), -- F1307814000A43AE path +(@GUID+30,30740,571,1,0x00000080,0,0,5335.117188,2916.802002,409.443756,1.500983,120,0,0,1,0,0), +(@GUID+31,30740,571,1,0x00000080,0,0,5350.681152,2917.011719,409.274658,1.466077,120,0,0,1,0,0), +(@GUID+32,30740,571,1,0x00000080,0,0,5335.306152,2764.110352,409.274567,4.834562,120,0,0,1,0,0), +(@GUID+33,30740,571,1,0x00000080,0,0,5349.811523,2763.634766,409.333374,4.660029,120,0,0,1,0,0), +-- Eastspark Workshop +(@GUID+34,30740,571,1,0x00000080,0,0,4349.537,2411.25781,374.743317,2.05948853,120,0,0,1,0,0), +(@GUID+35,30740,571,1,0x00000080,0,0,4388.13135,2411.97827,374.743317,1.6406095,120,0,0,1,0,0), +(@GUID+36,30740,571,1,0x00000080,0,0,4391.6665,2300.60913,374.7433,4.92182827,120,0,0,1,0,0), +(@GUID+37,30740,571,1,0x00000080,0,0,4413.42969,2393.44946,376.3599,1.06465089,120,0,0,1,0,0), +(@GUID+38,30740,571,1,0x00000080,0,0,4417.92,2331.237,370.9189,5.846853,120,0,0,1,0,0), +(@GUID+39,30740,571,1,0x00000080,0,0,4349.11768,2299.27954,374.7433,4.904375,120,0,0,1,0,0), +(@GUID+40,30740,571,1,0x00000080,0,0,4418.608,2355.28735,372.4907,6.02138567,120,0,0,1,0,0); + +-- banners +SET @OGUID := 75939; +DELETE FROM `gameobject` WHERE `id` IN (192254,192255,192269,192284,192285,192286,192287,192292,192299,192304,192305,192306,192307,192308,192309,192310,192312,192313,192314,192316,192317,192318,192319,192320,192321, + 192322,192323,192324,192325,192326,192327,192328,192329,192330,192331,192332,192333,192334,192335,192336,192338,192339,192349,192350,192351,192352,192353,192354,192355,192356, + 192357,192358,192359,192360,192361,192362,192363,192364,192366,192367,192368,192369,192370,192371,192372,192373,192374,192375,192376,192377,192378,192379,192487,192488,192501, + 192502); +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID AND @OGUID+115; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +-- Fortress Banners "Alliance" +(@OGUID+0,192286,571,1,128,5371.44873,2820.79346,409.426575,3.124123,0,0,0,0,120,0,1), +(@OGUID+1,192287,571,1,128,5372.42432,2862.47925,409.3659,3.14159274,0,0,0,0,120,0,1), +(@OGUID+2,192292,571,1,128,5154.35059,2862.08423,445.0105,3.14159274,0,0,0,0,120,0,1), +(@OGUID+3,192299,571,1,128,5155.21631,2820.63013,444.9789,-3.115388,0,0,0,0,120,0,1), +(@OGUID+4,192304,571,1,128,5398.03564,2873.013,455.203552,3.132858,0,0,0,0,120,0,1), +(@OGUID+5,192305,571,1,128,5397.31348,2809.264,455.101624,3.132858,0,0,0,0,120,0,1), +(@OGUID+6,192306,571,1,128,5270.55469,2861.68237,444.917236,-3.124123,0,0,0,0,120,0,1), +(@OGUID+7,192307,571,1,128,5271.16064,2820.10864,445.109,-3.132858,0,0,0,0,120,0,1), +(@OGUID+8,192308,571,1,128,5235.12744,2942.12329,444.2792,1.58824873,0,0,0,0,120,0,1), +(@OGUID+9,192309,571,1,128,5272.549,2976.54175,444.493,3.132858,0,0,0,0,120,0,1), +(@OGUID+10,192310,571,1,128,5352.19775,3055.0166,444.5646,1.57952213,0,0,0,0,120,0,1), +(@OGUID+11,192312,571,1,128,5236.315,2739.21533,444.992828,-1.60570168,0,0,0,0,120,0,1), +(@OGUID+12,192313,571,1,128,5271.634,2704.829,445.182617,-3.124123,0,0,0,0,120,0,1), +(@OGUID+13,192314,571,1,128,5350.905,2622.48,444.649323,-1.56206989,0,0,0,0,120,0,1), +(@OGUID+14,192316,571,1,128,5322.013,2781.13281,435.6727,1.57952213,0,0,0,0,120,0,1), +(@OGUID+15,192317,571,1,128,5363.387,2781.27856,435.634125,1.58824873,0,0,0,0,120,0,1), +(@OGUID+16,192318,571,1,128,5322.24854,2898.94629,435.642975,-1.57952213,0,0,0,0,120,0,1), +(@OGUID+17,192319,571,1,128,5364.30371,2899.216,435.690826,-1.55334139,0,0,0,0,120,0,1), +(@OGUID+18,192320,571,1,128,5289.048,2820.22656,435.6738,0,0,0,0,0,120,0,1), +(@OGUID+19,192321,571,1,128,5288.847,2861.82128,435.590485,0.0261791088,0,0,0,0,120,0,1), +(@OGUID+20,192322,571,1,128,5322.89258,2917.14233,445.1543,1.56206989,0,0,0,0,120,0,1), +(@OGUID+21,192323,571,1,128,5364.283,2917.264,445.332184,1.58824611,0,0,0,0,120,0,1), +(@OGUID+22,192324,571,1,128,5290.514,2976.56177,435.087463,0.008724241,0,0,0,0,120,0,1), +(@OGUID+23,192325,571,1,128,5352.37744,3036.95483,435.111053,-1.56206989,0,0,0,0,120,0,1), +(@OGUID+24,192326,571,1,128,5392.64063,3036.967,433.648682,-1.51843357,0,0,0,0,120,0,1), +(@OGUID+25,192327,571,1,128,5172.336,2862.57544,435.65802,0,0,0,0,0,120,0,1), +(@OGUID+26,192328,571,1,128,5173.12842,2820.95654,435.657623,0.0261791088,0,0,0,0,120,0,1), +(@OGUID+27,192329,571,1,128,5235.32227,2924.31079,434.8981,-1.56206989,0,0,0,0,120,0,1), +(@OGUID+28,192330,571,1,128,5237.02344,2757.35669,435.625641,1.55334139,0,0,0,0,120,0,1), +(@OGUID+29,192331,571,1,128,5289.78125,2704.62158,435.714325,0.008724241,0,0,0,0,120,0,1), +(@OGUID+30,192332,571,1,128,5350.93945,2640.43066,435.2642,1.56206989,0,0,0,0,120,0,1), +(@OGUID+31,192333,571,1,128,5392.28027,2639.84033,435.207916,1.52716041,0,0,0,0,120,0,1), +(@OGUID+32,192334,571,1,128,5322.17041,2763.20142,444.9744,-1.56206715,0,0,0,0,120,0,1), +(@OGUID+33,192335,571,1,128,5363.71631,2763.24731,445.023132,-1.54461551,0,0,0,0,120,0,1), +(@OGUID+34,192487,571,1,128,5145.11133,2934.948,433.254852,-3.10665226,0,0,0,0,120,0,1), +(@OGUID+35,192487,571,1,128,5146.04443,2747.30249,433.527039,3.124123,0,0,0,0,120,0,1), +(@OGUID+36,192487,571,1,128,5158.71,2882.90161,431.27417,3.14159274,0,0,0,0,120,0,1), +(@OGUID+37,192487,571,1,128,5160.28369,2798.59766,430.6037,-3.124123,0,0,0,0,120,0,1), +(@OGUID+38,192487,571,1,128,5162.90674,2952.59766,433.368,1.57079577,0,0,0,0,120,0,1), +(@OGUID+39,192487,571,1,128,5163.85,2729.677,433.327545,-1.60570168,0,0,0,0,120,0,1), +(@OGUID+40,192487,571,1,128,5260.82471,2631.81763,433.181061,3.124123,0,0,0,0,120,0,1), +(@OGUID+41,192487,571,1,128,5262.544,3047.93018,431.96524,3.124123,0,0,0,0,120,0,1), +(@OGUID+42,192487,571,1,128,5278.43066,2613.83276,433.294434,-1.62315571,0,0,0,0,120,0,1), +(@OGUID+43,192487,571,1,128,5280.894,3064.95386,431.9758,1.55334139,0,0,0,0,120,0,1), +-- Fortress Banners "Horde" +(@OGUID+44,192269,571,1,64,4526.46,2810.18,391.2,-2.99322,0,0,0,1,180,0,1), +(@OGUID+45,192284,571,1,64,5372.48,2862.5,409.049,3.14159,0,0,0,1,180,0,1), +(@OGUID+46,192285,571,1,64,5371.49,2820.8,409.177,3.14159,0,0,0,1,180,0,1), +(@OGUID+47,192338,571,1,64,5397.76,2873.08,455.461,3.10665,0,0,0,1,180,0,1), +(@OGUID+48,192339,571,1,64,5397.39,2809.33,455.344,3.10665,0,0,0,1,180,0,1), +(@OGUID+49,192349,571,1,64,5155.31,2820.74,444.979,-3.13286,0,0,0,1,180,0,1), +(@OGUID+50,192350,571,1,64,5270.69,2861.78,445.058,-3.11539,0,0,0,1,180,0,1), +(@OGUID+51,192351,571,1,64,5271.28,2820.16,445.201,-3.13286,0,0,0,1,180,0,1), +(@OGUID+52,192352,571,1,64,5173.02,2820.93,435.72,0.017452,0,0,0,1,180,0,1), +(@OGUID+53,192353,571,1,64,5172.11,2862.57,435.721,0.017452,0,0,0,1,180,0,1), +(@OGUID+54,192354,571,1,64,5288.41,2861.79,435.721,0.017452,0,0,0,1,180,0,1), +(@OGUID+55,192355,571,1,64,5288.92,2820.22,435.721,0.017452,0,0,0,1,180,0,1), +(@OGUID+56,192356,571,1,64,5237.07,2757.03,435.796,1.51844,0,0,0,1,180,0,1), +(@OGUID+57,192357,571,1,64,5235.34,2924.34,435.04,-1.5708,0,0,0,1,180,0,1), +(@OGUID+58,192358,571,1,64,5322.23,2899.43,435.808,-1.58825,0,0,0,1,180,0,1), +(@OGUID+59,192359,571,1,64,5364.35,2899.4,435.839,-1.5708,0,0,0,1,180,0,1), +(@OGUID+60,192360,571,1,64,5352.37,3037.09,435.252,-1.5708,0,0,0,1,180,0,1), +(@OGUID+61,192361,571,1,64,5392.65,3037.11,433.713,-1.52716,0,0,0,1,180,0,1), +(@OGUID+62,192362,571,1,64,5322.12,2763.61,444.974,-1.55334,0,0,0,1,180,0,1), +(@OGUID+63,192363,571,1,64,5363.61,2763.39,445.024,-1.54462,0,0,0,1,180,0,1), +(@OGUID+64,192364,571,1,64,5350.88,2622.72,444.686,-1.5708,0,0,0,1,180,0,1), +(@OGUID+65,192366,571,1,64,5236.27,2739.46,444.992,-1.59698,0,0,0,1,180,0,1), +(@OGUID+66,192367,571,1,64,5271.8,2704.87,445.183,-3.13286,0,0,0,1,180,0,1), +(@OGUID+67,192368,571,1,64,5289.46,2704.68,435.875,-0.017451,0,0,0,1,180,0,1), +(@OGUID+68,192369,571,1,64,5350.95,2640.36,435.408,1.5708,0,0,0,1,180,0,1), +(@OGUID+69,192370,571,1,64,5392.27,2639.74,435.331,1.50971,0,0,0,1,180,0,1), +(@OGUID+70,192371,571,1,64,5364.29,2916.94,445.331,1.57952,0,0,0,1,180,0,1), +(@OGUID+71,192372,571,1,64,5322.86,2916.95,445.154,1.56207,0,0,0,1,180,0,1), +(@OGUID+72,192373,571,1,64,5290.35,2976.56,435.221,0.017452,0,0,0,1,180,0,1), +(@OGUID+73,192374,571,1,64,5272.94,2976.55,444.492,3.12412,0,0,0,1,180,0,1), +(@OGUID+74,192375,571,1,64,5235.19,2941.9,444.278,1.58825,0,0,0,1,180,0,1), +(@OGUID+75,192376,571,1,64,5352.19775,3055.0166,444.5646,1.57952,0,0,0,0,120,0,1), +(@OGUID+76,192377,571,1,64,5414.19,3069.8,415.187,1.64061,0,0,0,1,180,0,1), +(@OGUID+77,192378,571,1,64,5322.02,2781.13,435.811,1.5708,0,0,0,1,180,0,1), +(@OGUID+78,192379,571,1,64,5363.42,2781.03,435.763,1.5708,0,0,0,1,180,0,1), +(@OGUID+79,192254,571,1,64,5154.46,2828.94,409.189,3.14159,0,0,0,1,180,0,1), +(@OGUID+80,192255,571,1,64,5154.52,2853.31,409.183,3.14159,0,0,0,1,180,0,1), +(@OGUID+81,192336,571,1,64,5154.49,2862.15,445.012,3.14159,0,0,0,1,180,0,1), +(@OGUID+82,192488,571,1,64,5160.34,2798.61,430.769,3.14159,0,0,0,1,180,0,1), +(@OGUID+83,192488,571,1,64,5158.81,2883.13,431.618,3.14159,0,0,0,1,180,0,1), +(@OGUID+84,192488,571,1,64,5278.38,2613.83,433.409,-1.58825,0,0,0,1,180,0,1), +(@OGUID+85,192488,571,1,64,5260.82,2631.8,433.324,3.05433,0,0,0,1,180,0,1), +(@OGUID+86,192488,571,1,64,5163.13,2952.59,433.503,1.53589,0,0,0,1,180,0,1), +(@OGUID+87,192488,571,1,64,5145.11,2935,433.386,3.14159,0,0,0,1,180,0,1), +(@OGUID+88,192488,571,1,64,5262.54,3047.95,432.055,3.10665,0,0,0,1,180,0,1), +(@OGUID+89,192488,571,1,64,5146.04,2747.21,433.584,3.07177,0,0,0,1,180,0,1), +(@OGUID+90,192488,571,1,64,5163.78,2729.68,433.394,-1.58825,0,0,0,1,180,0,1), +(@OGUID+91,192488,571,1,64,5280.894,3064.95386,431.9758,1.55334139,0,0,0,0,120,0,1), +-- Tower Banners "Alliance" +(@OGUID+92,192501,571,1,64,4398.82,2804.7,429.792,-1.58825,0,0,0,1,180,0,1), +(@OGUID+93,192501,571,1,64,4416,2822.67,429.851,-0.017452,0,0,0,1,180,0,1), +(@OGUID+94,192501,571,1,64,4559.11,3606.22,419.999,-1.48353,0,0,0,1,180,0,1), +(@OGUID+95,192501,571,1,64,4539.42,3622.49,420.034,-3.07177,0,0,0,1,180,0,1), +(@OGUID+96,192501,571,1,64,4555.26,3641.65,419.974,1.67551,0,0,0,1,180,0,1), +(@OGUID+97,192501,571,1,64,4574.87,3625.91,420.079,0.087266,0,0,0,1,180,0,1), +(@OGUID+98,192501,571,1,64,4466.79,1960.42,459.144,1.15192,0,0,0,1,180,0,1), +(@OGUID+99,192501,571,1,64,4475.35,1937.03,459.07,-0.436332,0,0,0,1,180,0,1), +(@OGUID+100,192501,571,1,64,4451.76,1928.1,459.076,-2.00713,0,0,0,1,180,0,1), +(@OGUID+101,192501,571,1,64,4442.99,1951.9,459.093,2.74016,0,0,0,1,180,0,1), +(@OGUID+102,192501,571,1,64,4380.36328,2822.38013,429.8818,-3.106652,0,0,0,0,120,0,1), +(@OGUID+103,192501,571,1,64,4397.6626,2840.299,429.921661,1.58824873,0,0,0,0,120,0,1), +-- Tower Banners "Horde" +(@OGUID+104,192502,571,1,128,4398.82,2804.7,429.792,-1.58825,0,0,0,1,180,0,1), +(@OGUID+105,192502,571,1,128,4416,2822.67,429.851,-0.017452,0,0,0,1,180,0,1), +(@OGUID+106,192502,571,1,128,4559.11,3606.22,419.999,-1.48353,0,0,0,1,180,0,1), +(@OGUID+107,192502,571,1,128,4539.42,3622.49,420.034,-3.07177,0,0,0,1,180,0,1), +(@OGUID+108,192502,571,1,128,4555.26,3641.65,419.974,1.67551,0,0,0,1,180,0,1), +(@OGUID+109,192502,571,1,128,4574.87,3625.91,420.079,0.087266,0,0,0,1,180,0,1), +(@OGUID+110,192502,571,1,128,4466.79,1960.42,459.144,1.15192,0,0,0,1,180,0,1), +(@OGUID+111,192502,571,1,128,4475.35,1937.03,459.07,-0.436332,0,0,0,1,180,0,1), +(@OGUID+112,192502,571,1,128,4451.76,1928.1,459.076,-2.00713,0,0,0,1,180,0,1), +(@OGUID+113,192502,571,1,128,4442.99,1951.9,459.093,2.74016,0,0,0,1,180,0,1), +(@OGUID+114,192502,571,1,128,4380.36328,2822.38013,429.8818,-3.106652,0,0,0,0,120,0,1), +(@OGUID+115,192502,571,1,128,4397.6626,2840.299,429.921661,1.58824873,0,0,0,0,120,0,1); + +SET @OGUID := 17780; +DELETE FROM `gameobject` WHERE `id` IN (192458,192459,192460,192461,192289,192290,192434,192435,192280,192283,192425,192426,192427,192428,192288,192291,192400,192401,192281,192282); +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +-- The Sunken Ring "Horde" +(@OGUID+0,192458,571,1,16,4811.4,2441.9,358.207,-2.0333,0,0,0,1,180,0,1), +(@OGUID+1,192459,571,1,16,4805.67,2407.48,358.191,1.78023,0,0,0,1,180,0,1), +(@OGUID+2,192460,571,1,16,5004.35,2486.36,358.449,2.17294,0,0,0,1,180,0,1), +(@OGUID+3,192461,571,1,16,4983.28,2503.09,358.177,-0.427603,0,0,0,1,180,0,1), +(@OGUID+4,192289,571,1,16,4778.19,2438.06,345.644,-2.94088,0,0,0,1,180,0,1), +(@OGUID+5,192290,571,1,16,5024.57,2532.75,344.023,-1.93732,0,0,0,1,180,0,1), +-- The Sunken Ring "Alliance" +(@OGUID+6,192425,571,1,32,4811.435,2441.84546,357.982483,-2.02457881,0,0,0,0,120,0,1), +(@OGUID+7,192426,571,1,32,4805.514,2407.84375,357.940765,1.7715075,0,0,0,0,120,0,1), +(@OGUID+8,192427,571,1,32,5004.35,2486.36,358.449,2.17294,0,0,0,1,180,0,1), +(@OGUID+9,192428,571,1,32,4983.221,2503.27271,357.959534,-0.43633157,0,0,0,0,120,0,1), +(@OGUID+10,192288,571,1,32,4778.065,2438.02441,345.7063,-2.932139,0,0,0,0,120,0,1), +(@OGUID+11,192291,571,1,32,5024.608,2532.72583,344.4308,-1.94604158,0,0,0,0,120,0,1), +-- The Broken Temple "Horde" +(@OGUID+12,192434,571,1,16,5041.61,3294.4,382.15,-1.63188,0,0,0,1,180,0,1), +(@OGUID+13,192435,571,1,16,4855.63,3297.62,376.739,-3.13286,0,0,0,1,180,0,1), +(@OGUID+14,192280,571,1,16,4857.97,3335.44,368.881,-2.94959,0,0,0,1,180,0,1), +(@OGUID+15,192283,571,1,16,5006.34,3280.4,371.163,2.22529,0,0,0,1,180,0,1), +-- The Broken Temple "Alliance" +(@OGUID+16,192400,571,1,32,5041.650879,3294.318604,381.919952,-1.605702,0,0,0,1,180,0,1), +(@OGUID+17,192401,571,1,32,4855.444336,3297.600830,376.495758,-3.115388,0,0,0,1,180,0,1), +(@OGUID+18,192281,571,1,32,4857.971191,3335.415771,369.291901,-2.888511,0,0,0,1,180,0,1), +(@OGUID+19,192282,571,1,32,5006.322754,3280.362061,371.242249,2.242746,0,0,0,1,180,0,1); diff --git a/sql/old/3.3.5a/2012_02_29_00_world_conditions_misc.sql b/sql/old/3.3.5a/2012_02_29_00_world_conditions_misc.sql new file mode 100644 index 00000000000..34eb1261ed1 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_29_00_world_conditions_misc.sql @@ -0,0 +1,126 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup` IN(34125,33796,33798,33799,33791,33792,33790, +33795,33793,33800,33794,33843,33842,26421,26477,28161,29856,32788,32790); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`, +`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`Comment`) VALUES +-- Stabled Campagin Warhorse Requires Any of the Dailies +(18,34125,63215,1,9,0,13847,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,2,9,0,13851,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,3,9,0,13852,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,4,9,0,13854,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,5,9,0,13855,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,6,9,0,13856,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,7,9,0,13857,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,8,9,0,13858,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,9,9,0,13859,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,10,9,0,13860,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,11,9,0,13861,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,12,9,0,13862,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,13,9,0,13863,0,0,0,'Required quest active for spellclick'), +(18,34125,63215,14,9,0,13864,0,0,0,'Required quest active for spellclick'), +-- Raptor requires (A) Valiant of Sen'Jin +(18,33796,62784,1,8,0,13693,0,0,0,'Required quest rewarded for spellclick'), +(18,33796,62784,2,8,0,13708,0,0,0,'Required quest rewarded for spellclick'), +-- Forsaken Warhorse requires (A) Valiant of Undercity +(18,33798,62787,1,8,0,13695,0,0,0,'Required quest rewarded for spellclick'), +(18,33798,62787,2,8,0,13710,0,0,0,'Required quest rewarded for spellclick'), +-- Orgrimmar Wolf requires (A) Valiant of Orgrimmar +(18,33799,62783,1,8,0,13691,0,0,0,'Required quest rewarded for spellclick'), +(18,33799,62783,2,8,0,13707,0,0,0,'Required quest rewarded for spellclick'), +-- Silvermoon Hawkstrider requires (A) Valiant of Silvermoon +(18,33791,62786,1,8,0,13696,0,0,0,'Required quest rewarded for spellclick'), +(18,33791,62786,2,8,0,13711,0,0,0,'Required quest rewarded for spellclick'), +-- Thunder Bluff Kodo requires (A) Valiant of Thunder Bluff +(18,33792,62785,1,8,0,13694,0,0,0,'Required quest rewarded for spellclick'), +(18,33792,62785,2,8,0,13709,0,0,0,'Required quest rewarded for spellclick'), +-- Exodar Elekk requires (A) Valiant of the Exodar +(18,33790,62781,1,8,0,13690,0,0,0,'Required quest rewarded for spellclick'), +(18,33790,62781,2,8,0,13705,0,0,0,'Required quest rewarded for spellclick'), +-- Ironforge Ram requires (A) Valiant of Ironforge +(18,33795,62779,1,8,0,13685,0,0,0,'Required quest rewarded for spellclick'), +(18,33795,62779,2,8,0,13703,0,0,0,'Required quest rewarded for spellclick'), +-- Gnomeregan Mechanostrider requires (A) Valiant of Gnomeregan +(18,33793,62780,1,8,0,13688,0,0,0,'Required quest rewarded for spellclick'), +(18,33793,62780,2,8,0,13704,0,0,0,'Required quest rewarded for spellclick'), +-- Stormwind Steed requires (A) Valiant of Stormwind +(18,33800,62774,1,8,0,13593,0,0,0,'Required quest rewarded for spellclick'), +(18,33800,62774,2,8,0,13684,0,0,0,'Required quest rewarded for spellclick'), +-- Darnassian Nightsaber requires (A) Valiant of Darnassus +(18,33794,62782,1,8,0,13689,0,0,0,'Required quest rewarded for spellclick'), +(18,33794,62782,2,8,0,13706,0,0,0,'Required quest rewarded for spellclick'), +-- Stabled Quel'Dorei steeds requires The Argent Tournament rewarded +(18,33843,63792,0,8,0,13667,0,0,0,'Required quest rewarded for spellclick'), +-- Stabled Quel'Dorei steed forbids Alliance Eligibility Marker rewarded +(18,33843,63792,0,8,0,13686,0,0,1,'Forbidden rewarded quest for spellclick'), +-- Sunreaver Hawkstrider requires The Argent Tournament rewarded +(18,33842,63791,0,8,0,13668,0,0,0,'Required quest rewarded for spellclick'), +-- Sunreaver Hawkstrider forbids Horde Eligibility Marker rewarded +(18,33842,63791,0,8,0,13687,0,0,1,'Forbidden rewarded quest for spellclick'), +-- Misc +(18,26421,47575,0,8,0,12092,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26421,47575,0,8,0,12096,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26421,47575,1,9,0,12092,0,0,0,'Required quest active for spellclick'), +(18,26421,47575,2,9,0,12096,0,0,0,'Required quest active for spellclick'), +(18,26477,47096,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,47096,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61286,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61286,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61832,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61832,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,26477,61286,1,9,0,11999,0,0,0,'Required quest active for spellclick'), +(18,26477,61286,2,9,0,12000,0,0,0,'Required quest active for spellclick'), +(18,26477,47096,1,9,0,11999,0,0,0,'Required quest active for spellclick'), +(18,26477,47096,2,9,0,12000,0,0,0,'Required quest active for spellclick'), +(18,26477,61832,1,9,0,11999,0,0,0,'Required quest active for spellclick'), +(18,26477,61832,2,9,0,12000,0,0,0,'Required quest active for spellclick'), +(18,28161,39996,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,39996,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,39996,1,9,0,12532,0,0,0,'Required quest active for spellclick'), +(18,28161,39996,2,9,0,12702,0,0,0,'Required quest active for spellclick'), +(18,28161,51037,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51037,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51037,1,9,0,12532,0,0,0,'Required quest active for spellclick'), +(18,28161,51037,2,9,0,12702,0,0,0,'Required quest active for spellclick'), +(18,28161,51961,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51961,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,28161,51961,1,9,0,12532,0,0,0,'Required quest active for spellclick'), +(18,28161,51961,2,9,0,12702,0,0,0,'Required quest active for spellclick'), +(18,29856,55363,0,8,0,12629,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29856,55363,0,8,0,12643,0,0,1,'Forbidden rewarded quest for spellclick'), +(18,29856,55363,1,9,0,12629,0,0,0,'Required quest active for spellclick'), +(18,29856,55363,2,9,0,12643,0,0,0,'Required quest active for spellclick'), +(18,32788,57539,1,8,0,13075,0,0,0,'Required quest rewarded for spellclick'), +(18,32788,57539,2,9,0,13075,0,0,0,'Required quest active for spellclick'), +(18,32790,57654,1,8,0,13073,0,0,0,'Required quest rewarded for spellclick'), +(18,32790,57654,2,9,0,13073,0,0,0,'Required quest active for spellclick'); + +-- Remove duplicate entries in npc_spellclick_spells (leave 1) +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` IN(34125,26421,26477,28161, +31157,33790,33791,33792,33793,33794,33795,33796,33798,33799,33800,34944,29856,30564,29414,31269); +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(26477,47096,2,0), +(26477,61286,2,0), +(26477,61832,0,0), +(29414,18277,1,0), +(29856,55363,2,0), +(31269,46598,1,0), +(33794,62782,1,0), +(28161,51037,2,0), +(28161,39996,1,0), +(30564,57401,1,0), +(34125,63215,1,0), +(34944,68458,1,0), +(33790,62781,1,0), +(33793,62780,1,0), +(33795,62779,1,0), +(33800,62774,1,0), +(33798,62787,1,0), +(31157,46598,1,0), +(26421,47575,1,0), +(28161,51961,1,0), +(33791,62786,1,0), +(33792,62785,1,0), +(33796,62784,1,0), +(33799,62783,1,0); + +-- If this query fails, fix your custom content +ALTER TABLE `npc_spellclick_spells` ADD PRIMARY KEY(`npc_entry`,`spell_id`); \ No newline at end of file diff --git a/sql/old/3.3.5a/2012_02_29_01_world_conditions.sql b/sql/old/3.3.5a/2012_02_29_01_world_conditions.sql new file mode 100644 index 00000000000..bae8baf51a9 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_29_01_world_conditions.sql @@ -0,0 +1,5 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=29488 AND `SourceEntry`=54568; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`, +`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`Comment`) VALUES +(18,29488,54568,15,8,0,12670,0,0,0,'Required quest rewarded for spellclick'), +(18,29488,54568,15,9,0,12670,0,0,0,'Required quest active for spellclick'); diff --git a/sql/old/3.3.5a/2012_02_29_02_world_conditions.sql b/sql/old/3.3.5a/2012_02_29_02_world_conditions.sql new file mode 100644 index 00000000000..a28e6d6424f --- /dev/null +++ b/sql/old/3.3.5a/2012_02_29_02_world_conditions.sql @@ -0,0 +1,5 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=29488 AND `SourceEntry`=54568; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`, +`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`Comment`) VALUES +(18,29488,54568,1,8,0,12670,0,0,0,'Required quest rewarded for spellclick'), +(18,29488,54568,2,9,0,12670,0,0,0,'Required quest active for spellclick'); diff --git a/sql/old/3.3.5a/2012_02_29_03_world_creature_text.sql b/sql/old/3.3.5a/2012_02_29_03_world_creature_text.sql new file mode 100644 index 00000000000..2e1d3d77dde --- /dev/null +++ b/sql/old/3.3.5a/2012_02_29_03_world_creature_text.sql @@ -0,0 +1,18 @@ +-- NPC talk text insert from sniff +DELETE FROM `script_texts` WHERE `npc_entry`=28923; +DELETE FROM `creature_text` WHERE `entry`=28923; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(28923,0,0, 'I have witnessed the rise and fall of empires... the birth and extinction of entire species... Over countless millennia the foolishness of mortals has remained the only constant. Your presence here confirms this.',14,0,100,0,0,14160, 'Loken'), +(28923,1,0, 'My master has shown me the future, and you have no place in it. Azeroth will be reborn in darkness. Yogg-Saron shall be released! The Pantheon shall fall!',14,0,100,0,0,14161, 'Loken'), +(28923,2,0, 'What hope is there for you? None!',14,0,100,0,0,14162, 'Loken'), +(28923,3,0, 'You cannot hide from fate!',14,0,100,0,0,14163, 'Loken'), +(28923,3,1, 'Come closer. I will make it quick.',14,0,100,0,0,14164, 'Loken'), +(28923,3,2, 'Your flesh cannot hold out for long.',14,0,100,0,0,14165, 'Loken'), +(28923,4,0, 'Only mortal...',14,0,100,0,0,14166, 'Loken'), +(28923,4,1, 'I... am... FOREVER!',14,0,100,0,0,14167, 'Loken'), +(28923,4,2, 'What little time you had, you wasted!',14,0,100,0,0,14168, 'Loken'), +(28923,5,0, 'You stare blindly into the abyss!',14,0,100,0,0,14169, 'Loken'), +(28923,6,0, 'Your ignorance is profound. Can you not see where this path leads?',14,0,100,0,0,14170, 'Loken'), +(28923,7,0, 'You cross the precipice of oblivion!',14,0,100,0,0,14171, 'Loken'), +(28923,8,0, 'My death... heralds the end of this world.',14,0,100,0,0,14172, 'Loken'), +(28923,9,0, '%s begins to cast Lightning Nova!',41,0,100,0,0,0, 'Loken'); diff --git a/sql/old/3.3.5a/2012_02_29_04_world_creature_text.sql b/sql/old/3.3.5a/2012_02_29_04_world_creature_text.sql new file mode 100644 index 00000000000..d8b7c2c048a --- /dev/null +++ b/sql/old/3.3.5a/2012_02_29_04_world_creature_text.sql @@ -0,0 +1,11 @@ +-- NPC talk text insert from sniff +DELETE FROM `script_texts` WHERE `npc_entry`=28546; +DELETE FROM `creature_text` WHERE `entry`=28546; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(28546,0,0, 'You wish to confront the master? You must first weather the storm!',14,0,100,0,0,14453, 'Ionar'), +(28546,1,0, 'The slightest spark shall be your undoing.',14,0,100,0,0,14454, 'Ionar'), +(28546,1,1, 'No one is safe!',14,0,100,0,0,14455, 'Ionar'), +(28546,2,0, 'Shocking ... I know!',14,0,100,0,0,14456, 'Ionar'), +(28546,2,1, 'You atempt the unpossible.',14,0,100,0,0,14457, 'Ionar'), +(28546,2,2, 'Your spark of light is ... extinguish.',14,0,100,0,0,14458, 'Ionar'), +(28546,3,0, 'Master... you have guests.',14,0,100,0,0,14459, 'Ionar'); diff --git a/sql/old/3.3.5a/2012_02_29_05_world_creature_text.sql b/sql/old/3.3.5a/2012_02_29_05_world_creature_text.sql new file mode 100644 index 00000000000..332fecf6326 --- /dev/null +++ b/sql/old/3.3.5a/2012_02_29_05_world_creature_text.sql @@ -0,0 +1,15 @@ +-- NPC talk text insert from sniff +DELETE FROM `script_texts` WHERE `npc_entry`=28587; +DELETE FROM `creature_text` WHERE `entry`=28587; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(28587,0,0, 'It is you who have destroyed my children? You... shall... pay!',14,0,100,0,0,13960, 'Volkhan'), +(28587,1,0, 'Life from lifelessness... death for you.',14,0,100,0,0,13961, 'Volkhan'), +(28587,1,1, 'Nothing is wasted in the process. You will see....',14,0,100,0,0,13962, 'Volkhan'), +(28587,2,0, 'I will crush you beneath my boots!',14,0,100,0,0,13963, 'Volkhan'), +(28587,2,1, 'All my work... undone!',14,0,100,0,0,13964, 'Volkhan'), +(28587,3,0, 'The armies of iron will conquer all!',14,0,100,0,0,13965, 'Volkhan'), +(28587,3,1, 'Ha, pathetic!',14,0,100,0,0,13966, 'Volkhan'), +(28587,3,2, 'You have cost me too much work!',14,0,100,0,0,13967, 'Volkhan'), +(28587,4,0, 'The master was right... to be concerned.',14,0,100,0,0,13968, 'Volkhan'), +(28587,5,0, '%s runs to his anvil!',41,0,100,0,0,0, 'Volkhan'), +(28587,6,0, '%s prepares to shatter his Brittle Golems!',41,0,100,0,0,0, 'Volkhan'); diff --git a/sql/old/3.3.5a/2012_03_01_00_world_conditions.sql b/sql/old/3.3.5a/2012_03_01_00_world_conditions.sql new file mode 100644 index 00000000000..794a5ce1210 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_01_00_world_conditions.sql @@ -0,0 +1,5 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=29488 AND `SourceEntry`=54568; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`, +`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`Comment`) VALUES +(18,29488,54568,1,8,0,12670,0,0,0,'Required quest rewarded for spellclick'), +(18,29488,54568,2,28,0,12670,0,0,0,'Required quest completed for spellclick'); diff --git a/sql/old/3.3.5a/2012_03_01_01_world_creature_text.sql b/sql/old/3.3.5a/2012_03_01_01_world_creature_text.sql new file mode 100644 index 00000000000..dd4f6693654 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_01_01_world_creature_text.sql @@ -0,0 +1,15 @@ +-- NPC talk text insert from sniff +DELETE FROM `script_texts` WHERE `npc_entry`=28586; +DELETE FROM `creature_text` WHERE `entry`=28586; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(28586,0,0, 'I am the greatest of my father''s sons! Your end has come!',14,0,100,0,0,14149, 'General Bjarngrim'), +(28586,1,0, 'Give me your worst!',14,0,100,0,0,14150, 'General Bjarngrim'), +(28586,2,0, 'Defend yourself, for all the good it will do!',14,0,100,0,0,14151, 'General Bjarngrim'), +(28586,3,0, 'GRAAAAAH! Behold the fury of iron and steel!',14,0,100,0,0,14152, 'General Bjarngrim'), +(28586,4,0, 'So ends your curse!',14,0,100,0,0,14153, 'General Bjarngrim'), +(28586,4,1, 'Flesh... is... weak!',14,0,100,0,0,14154, 'General Bjarngrim'), +(28586,4,2, '...',14,0,100,0,0,14155, 'General Bjarngrim'), +(28586,5,0, 'How can it be...? Flesh is not... stronger!',14,0,100,0,0,14156, 'General Bjarngrim'), +(28586,6,0, '%s switches to Defensive Stance!',41,0,100,0,0,0, 'General Bjarngrim'), +(28586,7,0, '%s switches to Battle Stance!',41,0,100,0,0,0, 'General Bjarngrim'), +(28586,8,0, '%s switches to Berserker Stance!',41,0,100,0,0,0, 'General Bjarngrim'); diff --git a/sql/old/3.3.5a/2012_03_01_02_world_locales_creature_text.sql b/sql/old/3.3.5a/2012_03_01_02_world_locales_creature_text.sql new file mode 100644 index 00000000000..c44ca191835 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_01_02_world_locales_creature_text.sql @@ -0,0 +1,15 @@ +DROP TABLE IF EXISTS `locales_creature_text`; +CREATE TABLE `locales_creature_text` ( + `entry` int(10) UNSIGNED NOT NULL, + `textGroup` tinyint(3) UNSIGNED NOT NULL, + `id` int(10) UNSIGNED NOT NULL, + `text_loc1` text, + `text_loc2` text, + `text_loc3` text, + `text_loc4` text, + `text_loc5` text, + `text_loc6` text, + `text_loc7` text, + `text_loc8` text, + PRIMARY KEY (`entry`,`textGroup`,`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/sql/old/3.3.5a/2012_03_03_00_world_command.sql b/sql/old/3.3.5a/2012_03_03_00_world_command.sql new file mode 100644 index 00000000000..52938c0b76b --- /dev/null +++ b/sql/old/3.3.5a/2012_03_03_00_world_command.sql @@ -0,0 +1,9 @@ +DELETE FROM `command` WHERE `name` LIKE 'debug moveflags'; +INSERT INTO `command` (`name`,`security`,`help`) VALUES +('debug moveflags',3,'Syntax: .debug moveflags [$newMoveFlags [$newMoveFlags2]]\r\nNo params given will output the current moveflags of the target'); + +DELETE FROM `trinity_string` WHERE `entry` IN(1143,1144); +INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES +(1143,'Target''s moveFlags: %u, moveFlagsExtra: %u.'), +(1144,'Target''s moveFlags set to: %u, moveFlagsExtra to: %u'); + diff --git a/sql/old/3.3.5a/2012_03_04_00_world_misc.sql b/sql/old/3.3.5a/2012_03_04_00_world_misc.sql new file mode 100644 index 00000000000..af556f648b8 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_04_00_world_misc.sql @@ -0,0 +1,13 @@ +-- Spotlight aura for spotlight NPC +DELETE FROM `creature_template_addon` WHERE `entry`=19913; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(19913,0,0,0,0,'39312'); + +-- Scriptnames for areatriggers +SET @AT_AREA_52_SOUTH := 4472; +SET @AT_AREA_52_NORTH := 4466; +SET @AT_AREA_52_WEST := 4471; +SET @AT_AREA_52_EAST := 4422; +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (@AT_AREA_52_SOUTH,@AT_AREA_52_NORTH,@AT_AREA_52_WEST,@AT_AREA_52_EAST); +INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES +(@AT_AREA_52_SOUTH,"at_area_52_entrance"),(@AT_AREA_52_NORTH,"at_area_52_entrance"),(@AT_AREA_52_WEST,"at_area_52_entrance"),(@AT_AREA_52_EAST,"at_area_52_entrance"); diff --git a/sql/old/3.3.5a/2012_03_04_01_world_areatrigger_scripts.sql b/sql/old/3.3.5a/2012_03_04_01_world_areatrigger_scripts.sql new file mode 100644 index 00000000000..ae4a0bc1f77 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_04_01_world_areatrigger_scripts.sql @@ -0,0 +1,7 @@ +-- Add Area trigger scripts +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (4422,4466,4471,4472); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(4422,'at_area_52_entrance'), +(4466,'at_area_52_entrance'), +(4471,'at_area_52_entrance'), +(4472,'at_area_52_entrance'); diff --git a/sql/old/3.3.5a/2012_03_06_00_world_commands.sql b/sql/old/3.3.5a/2012_03_06_00_world_commands.sql new file mode 100644 index 00000000000..d782a76c70d --- /dev/null +++ b/sql/old/3.3.5a/2012_03_06_00_world_commands.sql @@ -0,0 +1,3 @@ +DELETE FROM `command` WHERE `name` = 'reload locales_creature_text'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('reload locales_creature_text', 3, 'Syntax: .reload locales_creature_text\nReload locales_creature_text Table.'); \ No newline at end of file diff --git a/sql/old/3.3.5a/2012_03_06_01_world_misc.sql b/sql/old/3.3.5a/2012_03_06_01_world_misc.sql new file mode 100644 index 00000000000..7eb208a9673 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_06_01_world_misc.sql @@ -0,0 +1,4 @@ +ALTER TABLE `warden_checks` ENGINE=MYISAM; +ALTER TABLE `achievement_dbc` ENGINE=MYISAM; +ALTER TABLE `creature_text` ENGINE=MYISAM; +ALTER TABLE `game_event_seasonal_questrelation` ENGINE=MYISAM; diff --git a/sql/old/3.3.5a/2012_03_06_02_world_queststatus_seasonal.sql b/sql/old/3.3.5a/2012_03_06_02_world_queststatus_seasonal.sql new file mode 100644 index 00000000000..0efbb6609cf --- /dev/null +++ b/sql/old/3.3.5a/2012_03_06_02_world_queststatus_seasonal.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `character_queststatus_seasonal`; diff --git a/sql/old/3.3.5a/2012_03_06_03_world_smart_scripts.sql b/sql/old/3.3.5a/2012_03_06_03_world_smart_scripts.sql new file mode 100644 index 00000000000..cb2468c4d5c --- /dev/null +++ b/sql/old/3.3.5a/2012_03_06_03_world_smart_scripts.sql @@ -0,0 +1,17 @@ +-- SAI for Elrodan +SET @ENTRY=18743; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,5000,8000,15000,25000,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Elrodan - OOC - run script'), +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,11,18744,20,0,0,0,0,0,'Elrodan - Script - Aurosalia say random'), +(@ENTRY*100,9,1,0,0,0,100,0,3000,3000,3000,3000,11,32826,0,0,0,0,0,1,0,0,0,0,0,0,0,'Elrodan - Script - cast Polymorph Cast Visual'); +-- Aurosalia fix model +UPDATE `creature_model_info` SET `modelid_other_gender`=0 WHERE `modelid`=18145; +-- Aurosalia text +DELETE FROM `creature_text` WHERE `entry`=18744; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(18744,0,0, 'Stop!',1,0,100,5,0,0, 'Aurosalia'), +(18744,0,1, 'Will you stop--',1,0,100,274,0,0, 'Aurosalia'), +(18744,0,2, '',1,0,100,6,0,0, 'Aurosalia'); diff --git a/sql/old/3.3.5a/2012_03_06_04_world_creature_text.sql b/sql/old/3.3.5a/2012_03_06_04_world_creature_text.sql new file mode 100644 index 00000000000..f49599e1ba0 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_06_04_world_creature_text.sql @@ -0,0 +1,6 @@ +-- Aurosalia text +DELETE FROM `creature_text` WHERE `entry`=18744; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(18744,0,0, 'Stop!',12,1,100,5,0,0, 'Aurosalia'), +(18744,0,1, 'Will you stop--',12,1,100,6,0,0, 'Aurosalia'), +(18744,0,2, '',12,1,100,274,0,0, 'Aurosalia'); diff --git a/sql/old/3.3.5a/2012_03_07_00_world_trinity_string.sql b/sql/old/3.3.5a/2012_03_07_00_world_trinity_string.sql new file mode 100644 index 00000000000..df5afea5d4f --- /dev/null +++ b/sql/old/3.3.5a/2012_03_07_00_world_trinity_string.sql @@ -0,0 +1,3 @@ +DELETE FROM `trinity_string` WHERE `entry`=175; +INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES +(175, 'Liquid level: %f, ground: %f, type: %u, flags %u, status: %d.'); diff --git a/sql/old/3.3.5a/2012_03_10_00_world_creature.sql b/sql/old/3.3.5a/2012_03_10_00_world_creature.sql new file mode 100644 index 00000000000..a0143af73c7 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_10_00_world_creature.sql @@ -0,0 +1,21 @@ +-- Add some missing guids +SET @GUID := 42153; +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+4; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES +(@GUID,32666,530,1,1,0,0,9830.201,-7389.711,13.68803,5.532694,120,0,0,1,0,0), +(@GUID+1,32667,530,1,1,0,0,9859.044,-7406.975,13.7113,1.658063,120,0,0,1,0,0), +(@GUID+2,31144,530,1,1,0,0,9869.401,-7389.657,13.69022,3.90953755,120,0,0,1,0,0), +(@GUID+3,31144,530,1,1,0,0,9871.973,-7392.763,13.6818113,3.35103226,120,0,0,1,0,0), +(@GUID+4,31146,530,1,1,0,0,9850.529,-7395.442,13.72216,4.694936,120,0,0,1,0,0); +-- Addons +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID AND @GUID+4; +DELETE FROM `creature_addon` WHERE `guid`=66686; +INSERT INTO `creature_addon` (`guid`,`bytes2`,`auras`) VALUES +(@GUID,1, '7056 61573'), +(@GUID+1,1, '7056 61573'), +(@GUID+2,1, '7056 61573'), +(@GUID+3,1, '7056 61573'), +(@GUID+4,1, '7056 61573'), +(66686,1, '7056'); +-- convert npc to trigger +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=18504; diff --git a/sql/old/3.3.5a/2012_03_10_00_world_smart_scripts.sql b/sql/old/3.3.5a/2012_03_10_00_world_smart_scripts.sql new file mode 100644 index 00000000000..aaa02c2e3df --- /dev/null +++ b/sql/old/3.3.5a/2012_03_10_00_world_smart_scripts.sql @@ -0,0 +1,129 @@ +-- SAI for Champion Vranesh +SET @ENTRY=18146; +UPDATE `creature` SET `position_x`=9834.044,`position_y`=-7480.845,`position_z`=14.93467 WHERE `id`=@ENTRY; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +UPDATE `creature_template_addon` SET `mount`=0 WHERE `entry`=@ENTRY; -- 19085 +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (@ENTRY*100,@ENTRY*100+1,@ENTRY*100+2,@ENTRY*100+3,@ENTRY*100+4); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +-- AI +(@ENTRY,0,0,0,11,0,100,1,0,0,0,0,53,0,@ENTRY,1,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On respawn - load path'), +(@ENTRY,0,1,2,40,0,100,0,7,@ENTRY,0,0,54,6000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Pause Path'), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Run Script'), +(@ENTRY,0,3,4,40,0,100,0,11,@ENTRY,0,0,54,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Pause Path'), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,80,@ENTRY*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Run Script'), +(@ENTRY,0,5,6,40,0,100,0,25,@ENTRY,0,0,54,8000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Pause Path'), +(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,80,@ENTRY*100+2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Run Script'), +(@ENTRY,0,7,8,40,0,100,0,34,@ENTRY,0,0,54,8000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Pause Path'), +(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,80,@ENTRY*100+3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Run Script'), +(@ENTRY,0,9,10,40,0,100,0,50,@ENTRY,0,0,54,7000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Pause Path'), +(@ENTRY,0,10,0,61,0,100,0,0,0,0,0,80,@ENTRY*100+4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Run Script'), +(@ENTRY,0,11,0,40,0,100,0,57,@ENTRY,0,0,54,600000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - On waypoint reached - Pause Path'), +-- Script 0 +(@ENTRY*100,9,0,0,0,0,100,0,3500,3500,3500,3500,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 0 - emote bow'), +-- Script 1 +(@ENTRY*100+1,9,0,0,0,0,100,0,100,100,100,100,43,0,19085,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 1 - mount horse'), +(@ENTRY*100+1,9,1,0,0,0,100,0,100,100,100,100,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 1 - say 0'), +(@ENTRY*100+1,9,2,0,0,0,100,0,100,100,100,100,5,16,0,0,0,0,0,11,16222,10,0,0,0,0,0,'Champion Vranesh - Script 1 - Silvermoon City Guardian emote bow'), +(@ENTRY*100+1,9,3,0,0,0,100,0,100,100,100,100,1,0,0,0,0,0,0,19,16222,10,0,0,0,0,0,'Champion Vranesh - Script 1 - Silvermoon City Guardian say 0'), +-- Script 2 +(@ENTRY*100+2,9,0,0,0,0,100,0,3000,3000,3000,3000,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 2 - say 1'), +(@ENTRY*100+2,9,1,0,0,0,100,0,100,100,100,100,5,16,0,0,0,0,0,11,16222,18,0,0,0,0,0,'Champion Vranesh - Script 2 - Silvermoon City Guardian emote bow'), +(@ENTRY*100+2,9,2,0,0,0,100,0,100,100,100,100,1,1,0,0,0,0,0,19,16222,18,0,0,0,0,0,'Champion Vranesh - Script 2 - Silvermoon City Guardian say 1'), +-- Script 3 +(@ENTRY*100+3,9,0,0,0,0,100,0,3000,3000,3000,3000,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 3 - say 2'), +(@ENTRY*100+3,9,1,0,0,0,100,0,100,100,100,100,5,16,0,0,0,0,0,11,16222,30,0,0,0,0,0,'Champion Vranesh - Script 3 - Silvermoon City Guardian emote bow'), +-- Script 4 +(@ENTRY*100+4,9,0,0,0,0,100,0,1000,1000,1000,1000,43,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 4 - dismount horse'), +(@ENTRY*100+4,9,1,0,0,0,100,0,1000,1000,1000,1000,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Champion Vranesh - Script 3 - say 3'); + +-- NPC talk text for Champion Vranesh and Silvermoon City Guardian +DELETE FROM `creature_text` WHERE `entry` IN (@ENTRY,16222); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0, 'Champion Vranesh inclines his head slightly to the pair of guardians in greeting.',16,1,100,0,0,0, 'Champion Vranesh'), +(@ENTRY,1,0, 'Champion Vranesh arches a scrulpled brow at the guards. a disapproving scowl on his face',16,1,100,0,0,0, 'Champion Vranesh'), +(@ENTRY,2,0, 'Champion Vranesh glances from guard to guard.',16,1,100,0,0,0, 'Champion Vranesh'), +(@ENTRY,3,0, 'Champion Vranesh surveys the small ranger practice ground with a condescending smirk.',16,1,100,0,0,0, 'Champion Vranesh'), +(16222,0,0, 'Glory to the Sun K-- ah... Silvermoon!',12,1,100,0,0,0, 'Silvermoon City Guardian'), +(16222,1,0, 'Our lives are yours, Blood Knight.',12,1,100,0,0,0, 'Silvermoon City Guardian'); + +-- Pathing for Champion Vranesh +DELETE FROM `waypoints` WHERE `entry`=@ENTRY; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(@ENTRY,1,9834.044,-7480.845,14.93467, 'Champion Vranesh'), +(@ENTRY,2,9829.106,-7493.609,14.93653, 'Champion Vranesh'), +(@ENTRY,3,9826.172,-7516.15,19.73714, 'Champion Vranesh'), +(@ENTRY,4,9841.332,-7518.849,19.70547, 'Champion Vranesh'), +(@ENTRY,5,9845.063,-7512.885,19.68096, 'Champion Vranesh'), +(@ENTRY,6,9850.942,-7512.470,19.71548, 'Champion Vranesh'), +(@ENTRY,7,9850.934,-7513.604,19.71813, 'Champion Vranesh'), -- pause 6000 +(@ENTRY,8,9872.733,-7517.256,19.75283, 'Champion Vranesh'), +(@ENTRY,9,9872.419,-7489.979,14.91272, 'Champion Vranesh'), +(@ENTRY,10,9851.401,-7490.209,14.93464, 'Champion Vranesh'), +(@ENTRY,11,9850.948,-7470.096,14.91403, 'Champion Vranesh'), -- pause 1000 +(@ENTRY,12,9851.16,-7469.154,14.91319, 'Champion Vranesh'), +(@ENTRY,13,9849.688,-7442.579,13.50931, 'Champion Vranesh'), +(@ENTRY,14,9848.726,-7423.561,13.31949, 'Champion Vranesh'), +(@ENTRY,15,9816.583,-7423.817,13.30332, 'Champion Vranesh'), +(@ENTRY,16,9794.673,-7424.877,13.50989, 'Champion Vranesh'), +(@ENTRY,17,9794.48,-7442.293,14.40225, 'Champion Vranesh'), +(@ENTRY,18,9767.989,-7442.611,14.39258, 'Champion Vranesh'), +(@ENTRY,19,9767.406,-7422.982,13.35852, 'Champion Vranesh'), +(@ENTRY,20,9739.563,-7422.83,13.28878, 'Champion Vranesh'), +(@ENTRY,21,9736.46,-7440.873,13.53963, 'Champion Vranesh'), +(@ENTRY,22,9740.345,-7464.682,13.57483, 'Champion Vranesh'), +(@ENTRY,23,9746.739,-7482.594,13.55744, 'Champion Vranesh'), +(@ENTRY,24,9748.767,-7486.576,13.54981, 'Champion Vranesh'), +(@ENTRY,25,9753.25,-7486.52,13.5461, 'Champion Vranesh'), -- pause 8000 +(@ENTRY,26,9720.037,-7486.478,13.52865, 'Champion Vranesh'), +(@ENTRY,27,9681.502,-7475.868,13.52783, 'Champion Vranesh'), +(@ENTRY,28,9666.59,-7479.547,13.53783, 'Champion Vranesh'), +(@ENTRY,29,9638.033,-7492.629,13.50889, 'Champion Vranesh'), +(@ENTRY,30,9620.123,-7488.486,13.53853, 'Champion Vranesh'), +(@ENTRY,31,9605.795,-7475.276,13.55774, 'Champion Vranesh'), +(@ENTRY,32,9597.921,-7460.307,13.54336, 'Champion Vranesh'), +(@ENTRY,33,9594.605,-7450.369,13.5353, 'Champion Vranesh'), +(@ENTRY,34,9592.944,-7450.381,13.53116, 'Champion Vranesh'), -- pause 8000 +(@ENTRY,35,9594.605,-7450.369,13.5353, 'Champion Vranesh'), +(@ENTRY,36,9615.793,-7419.515,13.30549, 'Champion Vranesh'), +(@ENTRY,37,9654.939,-7420.383,13.29342, 'Champion Vranesh'), +(@ENTRY,38,9673.072,-7429.818,13.2933, 'Champion Vranesh'), +(@ENTRY,39,9689.373,-7431.429,13.2933, 'Champion Vranesh'), +(@ENTRY,40,9709.577,-7422.25,13.2933, 'Champion Vranesh'), +(@ENTRY,41,9722.3,-7415.217,13.39988, 'Champion Vranesh'), +(@ENTRY,42,9748.049,-7414.597,13.32135, 'Champion Vranesh'), +(@ENTRY,43,9766.792,-7413.542,13.38617, 'Champion Vranesh'), +(@ENTRY,44,9767.26,-7396.828,14.43101, 'Champion Vranesh'), +(@ENTRY,45,9793.145,-7395.393,14.3936, 'Champion Vranesh'), +(@ENTRY,46,9794.217,-7415.122,13.48684, 'Champion Vranesh'), +(@ENTRY,47,9817.575,-7415.299,13.30596, 'Champion Vranesh'), +(@ENTRY,48,9837.021,-7414.861,13.30863, 'Champion Vranesh'), +(@ENTRY,49,9848.048,-7414.794,13.31137, 'Champion Vranesh'), +(@ENTRY,50,9848.199,-7414.07,13.31068, 'Champion Vranesh'), -- pause 7000 +(@ENTRY,51,9847.695,-7415.903,13.31243, 'Champion Vranesh'), +(@ENTRY,52,9848.259,-7428.576,13.33225, 'Champion Vranesh'), +(@ENTRY,53,9846.748,-7446.964,13.56501, 'Champion Vranesh'), +(@ENTRY,54,9850.373,-7465.03,14.9097, 'Champion Vranesh'), +(@ENTRY,55,9850.84,-7480.409,14.93768, 'Champion Vranesh'), +(@ENTRY,56,9840.165,-7480.267,14.92917, 'Champion Vranesh'), +(@ENTRY,57,9843.284,-7480.133,14.92655, 'Champion Vranesh'); -- pause 60000 + +-- SAI for Silvermoon Farstrider +SET @ENTRY=18507; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Farstrider - Reset - Set Phase 1'), +(@ENTRY,0,1,2,1,1,100,0,3000,3000,5000,5000,11,36802,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Farstrider - OOC - Cast Spell (Phase 1)'), +(@ENTRY,0,2,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Farstrider - OOC - Set Phase 2 (Phase 1)'), +(@ENTRY,0,3,4,1,2,100,0,3000,3000,5000,5000,11,36803,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Farstrider - OOC - Cast Spell (Phase 2)'), +(@ENTRY,0,4,0,61,2,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Farstrider - OOC - Set Phase 1 (Phase 2)'); +-- SAI for Silvermoon Ranger +SET @ENTRY=18147; +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (-64950,-64951,-64952,-64953); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(-64950,0,0,0,1,0,100,0,18000,22000,18000,22000,11,29121,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Ranger - OOC - Cast Spell'), +(-64951,0,0,0,1,0,100,0,18000,22000,18000,22000,11,29121,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Ranger - OOC - Cast Spell'), +(-64952,0,0,0,1,0,100,0,18000,22000,18000,22000,11,29120,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Ranger - OOC - Cast Spell'), +(-64953,0,0,0,1,0,100,0,18000,22000,18000,22000,11,29122,0,0,0,0,0,1,0,0,0,0,0,0,0,'Silvermoon Ranger - OOC - Cast Spell'); diff --git a/sql/old/3.3.5a/2012_03_10_00_world_waypoint_data.sql b/sql/old/3.3.5a/2012_03_10_00_world_waypoint_data.sql new file mode 100644 index 00000000000..01c2bc50402 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_10_00_world_waypoint_data.sql @@ -0,0 +1,25 @@ +-- Silvermoon City Guardian pathing +SET @NPC := 56902; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=9595.755,`position_y`=-7366.754,`position_z`=13.50131 WHERE `guid`=@NPC; +UPDATE `creature_addon` SET `path_id`=@PATH WHERE `guid`=@NPC; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,9595.755,-7366.754,13.50131,0,0,0,100,0), +(@PATH,2,9594.553,-7336.536,14.15131,0,0,0,100,0), +(@PATH,3,9586.897,-7325.241,14.1312,0,0,0,100,0), +(@PATH,4,9561.705,-7326.179,14.05934,0,0,0,100,0), +(@PATH,5,9519.901,-7327.064,14.12175,0,0,0,100,0), +(@PATH,6,9508.228,-7352.014,14.33403,0,0,0,100,0), +(@PATH,7,9505.697,-7394.406,14.32095,0,0,0,100,0), +(@PATH,8,9535.751,-7396.176,16.8303,0,0,0,100,0), +(@PATH,9,9564.451,-7396.184,16.84703,0,0,0,100,0), +(@PATH,10,9563.777,-7415.961,19.47212,0,0,0,100,0), +(@PATH,11,9559.149,-7418.953,19.47643,0,0,0,100,0), +(@PATH,12,9563.34,-7432.895,15.4851,0,0,0,100,0), +(@PATH,13,9564.645,-7464.229,15.51088,0,0,0,100,0), +(@PATH,14,9588.409,-7464.643,13.52051,0,0,0,100,0), +(@PATH,15,9603.896,-7430.126,13.30448,0,0,0,100,0), +(@PATH,16,9595.137,-7387.862,13.52731,0,0,0,100,0), +(@PATH,17,9572.599,-7384.971,14.39343,0,0,0,100,0), +(@PATH,18,9573.106,-7369.531,14.40827,0,0,0,100,0); diff --git a/sql/old/3.3.5a/2012_03_11_00_world_sai.sql b/sql/old/3.3.5a/2012_03_11_00_world_sai.sql new file mode 100644 index 00000000000..a8cab265ac0 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_11_00_world_sai.sql @@ -0,0 +1,60 @@ +-- Coilfang Guardian + +DELETE FROM `smart_scripts` WHERE `entryorguid`=21873 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(21873, 0, 0, 0, 0, 0, 0, 0, 5000, 5000, 15000, 15000, 11, 28168, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Guardian - IC - Cast Arcing Smash'), +(21873, 0, 1, 0, 0, 0, 0, 0, 2000, 2000, 10000, 10000, 11, 9080, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Guardian - IC - Cast Harmstring'), +(21873, 0, 2, 0, 0, 0, 50, 0, 3000, 4000, 10000, 20000, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Guardian - IC - Say 0'); -- randomly guessed timers + +DELETE FROM `creature_text` WHERE `entry`=21873; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(21873, 0, 0, 'By Nazjatar''s Depths!', 12, 0, 0, 0, 0, 0, 'Coilfang Guardian'), +(21873, 0, 1, 'Die, warmblood!', 12, 0, 0, 0, 0, 0, 'Coilfang Guardian'), +(21873, 0, 2, 'For the Master!', 12, 0, 0, 0, 0, 0, 'Coilfang Guardian'), +(21873, 0, 3, 'Illidan reigns!', 12, 0, 0, 0, 0, 0, 'Coilfang Guardian'), +(21873, 0, 4, 'My blood is like venom!', 12, 0, 0, 0, 0, 0, 'Coilfang Guardian'); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=21873; + +-- Coilfang Strider + +DELETE FROM `smart_scripts` WHERE `entryorguid`=22056 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22056, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 11, 38257, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Strider - On Reset - Cast Panic Periodic'), +(22056, 0, 1, 0, 0, 0, 0, 0, 8000, 8000, 30000, 40000, 11, 38259, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Strider - IC - Cast Mind Blast'); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=22056; + +-- Coilfang Elite + +DELETE FROM `smart_scripts` WHERE `entryorguid`=22055 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22055, 0, 0, 0, 0, 0, 0, 0, 5000, 5000, 15000, 20000, 11, 38260, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Elite - IC - Cast Cleave'), +(22055, 0, 1, 0, 0, 0, 0, 0, 2000, 2000, 10000, 10000, 11, 38262, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Elite - IC - Cast Harmstring'); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=22055; + +-- Core Hound + +DELETE FROM `smart_scripts` WHERE `entryorguid`=11673 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` BETWEEN 11673*100+0 AND 11673*100+5 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(11673, 0, 0, 0, 0, 0, 0, 0, 10000, 10000, 7000, 7000, 11, 19272, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - IC - Cast Lava Breath'), +(11673, 0, 1, 0, 0, 0, 0, 0, 4000, 4000, 6000, 6000, 11, 19319, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - IC - Cast Vicious Bite'), +(11673, 0, 2, 0, 0, 0, 0, 0, 15000, 15000, 24000, 24000, 88, 11673*100+0, 11673*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - IC - Call random script'), +(11673*100+0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19364, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - Random 0 - Cast Ground Stomp'), +(11673*100+1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19366, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - Random 1 - Cast Cauterizing Flames'), +(11673*100+2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19367, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - Random 2 - Cast Withering Heat'), +(11673*100+3, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19369, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - Random 3 - Cast Ancient Despair'), +(11673*100+4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19372, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - Random 4 - Cast Ancient Hysteria'), +(11673*100+5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19365, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Core Hound - Random 5 - Cast Ancient Dread'); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=11673; + +-- Shadow of Aran + +DELETE FROM `smart_scripts` WHERE `entryorguid`=18254 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18254, 0, 0, 0, 0, 0, 0, 0, 1000, 1000, 5000, 5000, 11, 29978, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Shadow of Aran - IC - Cast Pyro Blast'); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=18254; diff --git a/sql/old/3.3.5a/2012_03_12_00_world_creature_template.sql b/sql/old/3.3.5a/2012_03_12_00_world_creature_template.sql new file mode 100644 index 00000000000..cc70ff7a557 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_12_00_world_creature_template.sql @@ -0,0 +1 @@ +ALTER TABLE `creature_template` ADD COLUMN `HoverHeight` FLOAT NOT NULL DEFAULT 1 AFTER `InhabitType`; diff --git a/sql/old/3.3.5a/2012_03_12_01_world_conditions.sql b/sql/old/3.3.5a/2012_03_12_01_world_conditions.sql new file mode 100644 index 00000000000..d58d8f54ddf --- /dev/null +++ b/sql/old/3.3.5a/2012_03_12_01_world_conditions.sql @@ -0,0 +1,3 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=72257; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,72257,0,0,32,0,144,0,0,0,0,'','Remove Marks of the Fallen Champion - target player'); diff --git a/sql/old/3.3.5a/2012_03_12_01_world_gameobject.sql b/sql/old/3.3.5a/2012_03_12_01_world_gameobject.sql new file mode 100644 index 00000000000..38c615a3b0a --- /dev/null +++ b/sql/old/3.3.5a/2012_03_12_01_world_gameobject.sql @@ -0,0 +1,4 @@ +UPDATE `gameobject_template` SET `flags`=0x32 WHERE `entry` IN (202239,202240,202238,202241,201959,202339,202338,202340); + +-- Set Deathbringer's Cache spawned by default +UPDATE `gameobject` SET `spawntimesecs`=604800 WHERE `id` IN (202239,202240,202238,202241); diff --git a/sql/old/3.3.5a/2012_03_12_01_world_spell_script_names.sql b/sql/old/3.3.5a/2012_03_12_01_world_spell_script_names.sql new file mode 100644 index 00000000000..db98aa0fbea --- /dev/null +++ b/sql/old/3.3.5a/2012_03_12_01_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_deathbringer_remove_marks'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(72257,'spell_deathbringer_remove_marks'); diff --git a/sql/old/3.3.5a/2012_03_14_00_world_creature_addon.sql b/sql/old/3.3.5a/2012_03_14_00_world_creature_addon.sql new file mode 100644 index 00000000000..c7e4edb97ed --- /dev/null +++ b/sql/old/3.3.5a/2012_03_14_00_world_creature_addon.sql @@ -0,0 +1,2 @@ +UPDATE `creature_addon` SET `bytes1`=0x3000000 WHERE `guid`=207210; +UPDATE `creature_addon` SET `bytes1`=0x3000000 WHERE `guid`=207211; diff --git a/sql/old/3.3.5a/2012_03_19_00_world_smart_scripts.sql b/sql/old/3.3.5a/2012_03_19_00_world_smart_scripts.sql new file mode 100644 index 00000000000..20241efa9cc --- /dev/null +++ b/sql/old/3.3.5a/2012_03_19_00_world_smart_scripts.sql @@ -0,0 +1,21 @@ +-- SAI for Unrestrained Dragonhawk +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=25236; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=25236 AND `source_type`=0); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(25236,0,0,1,62,0,100,0,9143,0,0,0,11,45353,0,0,0,0,0,7,0,0,0,0,0,0,0,'Unrestrained Dragonhawk - On Gossip option select - cast "Quest - Sunwell Daily - Ship Bombing Run Return" on player'), +(25236,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Unrestrained Dragonhawk - On Gossip option select - Close Gossip'); +-- Unrestrained Dragonhawk Gossip +UPDATE `creature_template` SET `gossip_menu_id`=9143 WHERE `entry`=25236; +-- Gossip_menu from UDB +DELETE FROM `gossip_menu` WHERE `entry`=9143; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(9143,12371); +-- Gossip_menu_option Update from UDB +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9143; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES +(9143,0,0, '',1,1,0,0,0,0, ''); +-- Gossip option Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9143; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,9143,0,0,9,11542,0,0,0,'','Show gossip option if player has quest 11542 but not complete'), +(15,9143,0,1,9,11543,0,0,0,'','Show gossip option if player has quest 11543 but not complete'); diff --git a/sql/old/3.3.5a/2012_03_20_00_world_gossip.sql b/sql/old/3.3.5a/2012_03_20_00_world_gossip.sql new file mode 100644 index 00000000000..00214d805e7 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_20_00_world_gossip.sql @@ -0,0 +1,88 @@ +-- Creature Gossip_menu_id Update from sniff +UPDATE `creature_template` SET `gossip_menu_id`=9052 WHERE `entry`=24965; -- Vindicator Xayann +UPDATE `creature_template` SET `gossip_menu_id`=9050 WHERE `entry`=24975; -- Mar'nah +UPDATE `creature_template` SET `gossip_menu_id`=9126 WHERE `entry`=25032; -- Eldara Dawnrunner +UPDATE `creature_template` SET `gossip_menu_id`=9087 WHERE `entry`=25046; -- Smith Hauthaa +UPDATE `creature_template` SET `gossip_menu_id`=9064 WHERE `entry`=25057; -- Battlemage Arynna +UPDATE `creature_template` SET `gossip_menu_id`=9062, `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=25059; -- Ayren Cloudbreaker +UPDATE `creature_template` SET `gossip_menu_id`=9063 WHERE `entry`=25061; -- Harbinger Inuuro +UPDATE `creature_template` SET `gossip_menu_id`=9127 WHERE `entry`=25069; -- Magister Ilastar +UPDATE `creature_template` SET `gossip_menu_id`=9115 WHERE `entry`=25112; -- Anchorite Ayuri +UPDATE `creature_template` SET `gossip_menu_id`=9105 WHERE `entry`=25169; -- Archmage Ne'thul +UPDATE `creature_template` SET `gossip_menu_id`=9286 WHERE `entry`=25632; -- Vindicator Moorba +UPDATE `creature_template` SET `gossip_menu_id`=9285 WHERE `entry`=25638; -- Captain Selana +UPDATE `creature_template` SET `gossip_menu_id`=9198 WHERE `entry`=25950; -- Shaani + +-- Gossip Menu insert from sniff +DELETE FROM `gossip_menu` WHERE `entry`=9050 AND `text_id`=12237; +DELETE FROM `gossip_menu` WHERE `entry`=9052 AND `text_id`=12241; +DELETE FROM `gossip_menu` WHERE `entry`=9062 AND `text_id`=12252; +DELETE FROM `gossip_menu` WHERE `entry`=9063 AND `text_id`=12256; +DELETE FROM `gossip_menu` WHERE `entry`=9064 AND `text_id`=12258; +DELETE FROM `gossip_menu` WHERE `entry`=9087 AND `text_id`=12286; +DELETE FROM `gossip_menu` WHERE `entry`=9115 AND `text_id`=12323; +DELETE FROM `gossip_menu` WHERE `entry`=9126 AND `text_id`=12338; +DELETE FROM `gossip_menu` WHERE `entry`=9127 AND `text_id`=12340; +DELETE FROM `gossip_menu` WHERE `entry`=9198 AND `text_id`=12497; +DELETE FROM `gossip_menu` WHERE `entry`=9285 AND `text_id`=12596; +DELETE FROM `gossip_menu` WHERE `entry`=9286 AND `text_id`=12597; +DELETE FROM `gossip_menu` WHERE `entry`=9287 AND `text_id`=12598; +DELETE FROM `gossip_menu` WHERE `entry`=9288 AND `text_id`=12599; +DELETE FROM `gossip_menu` WHERE `entry`=9289 AND `text_id`=12600; +DELETE FROM `gossip_menu` WHERE `entry`=9290 AND `text_id`=12601; +DELETE FROM `gossip_menu` WHERE `entry`=9293 AND `text_id`=12604; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(9050,12237), +(9052,12241), +(9062,12252), +(9063,12256), +(9064,12258), +(9087,12286), +(9115,12323), +(9126,12338), +(9127,12340), +(9198,12497), +(9285,12596), +(9286,12597), +(9287,12598), +(9288,12599), +(9289,12600), +(9290,12601), +(9293,12604); + +-- Creature Gossip_menu_option insert from sniff +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9050,9087,9126,9198,9285,9287,9288,9289) AND `id`=0; +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9062 AND `id` IN (0,1); +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9286 AND `id`=2; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES +(9050,0,1,'Let me browse your goods.',3,128,0,0,0,0,''), +(9062,0,0,'Speaking of action, I''ve been ordered to undertake an air strike.',1,1,0,0,0,0,''), +(9062,1,0,'I need to intercept the Dawnblade reinforcements.',1,1,0,0,0,0,''), +(9087,0,1,'Let me browse your goods.',3,128,0,0,0,0,''), +(9126,0,1,'Let me browse your goods.',3,128,0,0,0,0,''), +(9198,0,1,'Let me browse your goods.',3,128,0,0,0,0,''), +(9285,0,0,'Give me a situation report, Captain.',1,1,9287,0,0,0,''), +(9286,2,0,'What is the current state of the Sunwell''s Gates?',1,1,9293,0,0,0,''), +(9287,0,0,'What went wrong?',1,1,9288,0,0,0,''), +(9288,0,0,'Why did they stop?',1,1,9289,0,0,0,''), +(9289,0,0,'Your insight is appreciated.',1,1,9290,0,0,0,''); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9062 AND `SourceEntry` IN (0,1); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,9062,0,0,0,9,11532,0,0,0,0,'','Show gossip option only if player has taken quest 11532'), +(15,9062,0,0,1,9,11533,0,0,0,0,'','Show gossip option only if player has taken quest 11533'), +(15,9062,1,0,0,9,11542,0,0,0,0,'','Show gossip option only if player has taken quest 11542'), +(15,9062,1,0,1,9,11543,0,0,0,0,'','Show gossip option only if player has taken quest 11543'); + +-- SmartAI +DELETE FROM `smart_scripts` WHERE `entryorguid`=25059 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(25059,0,0,2,62,0,100,0,9062,0,0,0,11,45071,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ayren Cloudbreaker - On Gossip option select - Cast "Quest - Sunwell Daily - Dead Scar Bombing Run" on player'), +(25059,0,1,2,62,0,100,0,9062,1,0,0,11,45113,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ayren Cloudbreaker - On Gossip option select - Cast "Quest - Sunwell Daily - Ship Bombing Run" on player'), +(25059,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ayren Cloudbreaker - On Gossip option select - Close Gossip'); + +-- Spell scripts from sniff +DELETE FROM `spell_scripts` WHERE `id`=45071; +INSERT INTO `spell_scripts` (`id`,`effIndex`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES +(45071,2,0,16,12318,1,0,0,0,0,0); -- Play sound diff --git a/sql/old/3.3.5a/2012_03_21_00_world_creature.sql b/sql/old/3.3.5a/2012_03_21_00_world_creature.sql new file mode 100644 index 00000000000..def72f74cd6 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_21_00_world_creature.sql @@ -0,0 +1,71 @@ +-- ToC missing trigger spawns + +SET @GUID := 88412; +SET @NPC_TRIGGER1 := 34704; -- Val'kyr Twins Bullet Stalker Dark +SET @NPC_TRIGGER2 := 34720; -- Val'kyr Twins Bullet Stalker Light + +UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry` IN (@NPC_TRIGGER1,@NPC_TRIGGER2); +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID+0 AND @GUID+61; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES +(@GUID+0,@NPC_TRIGGER1,649,15,1,0,0,619.771,143.71,395.244,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+1,@NPC_TRIGGER1,649,15,1,0,0,515.352,115.349,395.288,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+2,@NPC_TRIGGER1,649,15,1,0,0,605.514,103.863,395.29,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+3,@NPC_TRIGGER1,649,15,1,0,0,615.137,156.997,395.28,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+4,@NPC_TRIGGER1,649,15,1,0,0,539.179,184.132,395.282,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+5,@NPC_TRIGGER1,649,15,1,0,0,547.76,184.634,395.289,2.93215,7200,0,0,1,0,0,0,0,0), +(@GUID+6,@NPC_TRIGGER1,649,15,1,0,0,549.764,86.4444,395.266,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+7,@NPC_TRIGGER1,649,15,1,0,0,511.417,127.158,395.266,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+8,@NPC_TRIGGER1,649,15,1,0,0,597.38,183.672,395.28,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+9,@NPC_TRIGGER1,649,15,1,0,0,573.578,187.665,395.492,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+10,@NPC_TRIGGER1,649,15,1,0,0,620.465,134.66,395.233,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+11,@NPC_TRIGGER1,649,15,1,0,0,560.484,187.743,395.959,2.93215,7200,0,0,1,0,0,0,0,0), +(@GUID+12,@NPC_TRIGGER1,649,15,1,0,0,577.299,186.854,395.289,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+13,@NPC_TRIGGER1,649,15,1,0,0,563.467,81.9323,395.288,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+14,@NPC_TRIGGER1,649,15,1,0,0,534.748,92.6424,395.289,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+15,@NPC_TRIGGER1,649,15,1,0,0,518.503,170.649,395.289,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+16,@NPC_TRIGGER1,649,15,1,0,0,514.566,159.918,395.287,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+17,@NPC_TRIGGER1,649,15,1,0,0,568.049,187.67,395.563,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+18,@NPC_TRIGGER1,649,15,1,0,0,522.955,102.127,395.29,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+19,@NPC_TRIGGER1,649,15,1,0,0,611.656,114.281,395.288,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+20,@NPC_TRIGGER1,649,15,1,0,0,616.432,126.418,395.264,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+21,@NPC_TRIGGER1,649,15,1,0,0,526.833,181.783,395.285,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+22,@NPC_TRIGGER1,649,15,1,0,0,578.722,87.4444,395.272,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+23,@NPC_TRIGGER1,649,15,1,0,0,509.743,149.005,395.253,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+24,@NPC_TRIGGER1,649,15,1,0,0,592.736,93.6667,395.289,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+25,@NPC_TRIGGER1,649,15,1,0,0,506.038,139.517,395.288,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+26,@NPC_TRIGGER1,649,15,1,0,0,608.116,171.731,395.289,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+27,@NPC_TRIGGER1,649,15,1,0,0,586.344,184.078,395.283,4.60767,7200,0,0,1,0,0,0,0,0), +(@GUID+28,@NPC_TRIGGER1,649,15,1,0,0,554.818,187.568,395.288,2.93215,7200,0,0,1,0,0,0,0,0), +(@GUID+29,@NPC_TRIGGER2,649,15,1,0,0,557.743,187.729,395.915,0,7200,0,0,1,0,0,0,0,0), +(@GUID+30,@NPC_TRIGGER2,649,15,1,0,0,544.094,184.648,395.286,0,7200,0,0,1,0,0,0,0,0), +(@GUID+31,@NPC_TRIGGER2,649,15,1,0,0,551.328,187.646,395.596,0,7200,0,0,1,0,0,0,0,0), +(@GUID+32,@NPC_TRIGGER2,649,15,1,0,0,615.137,150.818,395.269,0,7200,0,0,1,0,0,0,0,0), +(@GUID+33,@NPC_TRIGGER2,649,15,1,0,0,571.158,187.691,395.629,0,7200,0,0,1,0,0,0,0,0), +(@GUID+34,@NPC_TRIGGER2,649,15,1,0,0,606.686,106.731,395.289,0,7200,0,0,1,0,0,0,0,0), +(@GUID+35,@NPC_TRIGGER2,649,15,1,0,0,612.118,118.844,395.287,0,7200,0,0,1,0,0,0,0,0), +(@GUID+36,@NPC_TRIGGER2,649,15,1,0,0,546.057,88.7691,395.284,0,7200,0,0,1,0,0,0,0,0), +(@GUID+37,@NPC_TRIGGER2,649,15,1,0,0,517.722,169.069,395.289,0,7200,0,0,1,0,0,0,0,0), +(@GUID+38,@NPC_TRIGGER2,649,15,1,0,0,507.181,142.285,395.255,0,7200,0,0,1,0,0,0,0,0), +(@GUID+39,@NPC_TRIGGER2,649,15,1,0,0,515.399,159.75,395.287,0,7200,0,0,1,0,0,0,0,0), +(@GUID+40,@NPC_TRIGGER2,649,15,1,0,0,592.151,183.8,395.279,0,7200,0,0,1,0,0,0,0,0), +(@GUID+41,@NPC_TRIGGER2,649,15,1,0,0,510.759,127.333,395.263,0,7200,0,0,1,0,0,0,0,0), +(@GUID+42,@NPC_TRIGGER2,649,15,1,0,0,524.257,178.134,395.29,0,7200,0,0,1,0,0,0,0,0), +(@GUID+43,@NPC_TRIGGER2,649,15,1,0,0,570.779,86.2986,395.253,0,7200,0,0,1,0,0,0,0,0), +(@GUID+44,@NPC_TRIGGER2,649,15,1,0,0,588.675,93.0938,395.289,0,7200,0,0,1,0,0,0,0,0), +(@GUID+45,@NPC_TRIGGER2,649,15,1,0,0,603.528,175.476,395.289,0,7200,0,0,1,0,0,0,0,0), +(@GUID+46,@NPC_TRIGGER2,649,15,1,0,0,509.639,133.26,395.247,0,7200,0,0,1,0,0,0,0,0), +(@GUID+47,@NPC_TRIGGER2,649,15,1,0,0,618.965,139.174,395.288,0,7200,0,0,1,0,0,0,0,0), +(@GUID+48,@NPC_TRIGGER2,649,15,1,0,0,514.785,118.731,395.287,0,7200,0,0,1,0,0,0,0,0), +(@GUID+49,@NPC_TRIGGER2,649,15,1,0,0,581.243,184.062,395.287,0,7200,0,0,1,0,0,0,0,0), +(@GUID+50,@NPC_TRIGGER2,649,15,1,0,0,577.757,184.436,395.289,0,7200,0,0,1,0,0,0,0,0), +(@GUID+51,@NPC_TRIGGER2,649,15,1,0,0,580.486,89.691,395.287,0,7200,0,0,1,0,0,0,0,0), +(@GUID+52,@NPC_TRIGGER2,649,15,1,0,0,511.132,151.156,395.264,0,7200,0,0,1,0,0,0,0,0), +(@GUID+53,@NPC_TRIGGER2,649,15,1,0,0,615.401,130.816,395.263,0,7200,0,0,1,0,0,0,0,0), +(@GUID+54,@NPC_TRIGGER2,649,15,1,0,0,599.307,98.8003,395.29,0,7200,0,0,1,0,0,0,0,0), +(@GUID+55,@NPC_TRIGGER2,649,15,1,0,0,520.212,108.429,395.289,0,7200,0,0,1,0,0,0,0,0), +(@GUID+56,@NPC_TRIGGER2,649,15,1,0,0,610.983,164.696,395.288,0,7200,0,0,1,0,0,0,0,0), +(@GUID+57,@NPC_TRIGGER2,649,15,1,0,0,526.337,99.5556,395.29,0,7200,0,0,1,0,0,0,0,0), +(@GUID+58,@NPC_TRIGGER2,649,15,1,0,0,563.997,187.644,395.489,0,7200,0,0,1,0,0,0,0,0), +(@GUID+59,@NPC_TRIGGER2,649,15,1,0,0,555.695,86.0208,395.253,0,7200,0,0,1,0,0,0,0,0), +(@GUID+60,@NPC_TRIGGER2,649,15,1,0,0,535.924,184.207,395.279,0,7200,0,0,1,0,0,0,0,0), +(@GUID+61,@NPC_TRIGGER2,649,15,1,0,0,538.024,92.441,395.289,0,7200,0,0,1,0,0,0,0,0); diff --git a/sql/old/3.3.5a/2012_03_22_00_world_creature_template.sql b/sql/old/3.3.5a/2012_03_22_00_world_creature_template.sql new file mode 100644 index 00000000000..e6c03ed589c --- /dev/null +++ b/sql/old/3.3.5a/2012_03_22_00_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Flame Sphere should not be visible to players(only their visual) +UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry` IN (30106,31686,31687); diff --git a/sql/old/3.3.5a/2012_03_22_01_world_conditions.sql b/sql/old/3.3.5a/2012_03_22_01_world_conditions.sql new file mode 100644 index 00000000000..074328137a5 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_22_01_world_conditions.sql @@ -0,0 +1,2 @@ +-- Manual: Heavy Frostweave Bandage should be lootable if you have at least 390 skills in First Aid +UPDATE `conditions` SET `ConditionValue2`=390 WHERE `SourceTypeOrReferenceId`=1 AND `SourceEntry`=39152 AND `ConditionTypeOrReference`=7 AND `ConditionValue1`=129; diff --git a/sql/old/3.3.5a/2012_03_23_00_world_ip2nation.sql b/sql/old/3.3.5a/2012_03_23_00_world_ip2nation.sql new file mode 100644 index 00000000000..dadeaddf85a --- /dev/null +++ b/sql/old/3.3.5a/2012_03_23_00_world_ip2nation.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS ip2nation; + +CREATE TABLE ip2nation ( + ip int(11) unsigned NOT NULL default '0', + country char(2) NOT NULL default '', + KEY ip (ip) +); + +DROP TABLE IF EXISTS ip2nationCountries; + +CREATE TABLE ip2nationCountries ( + code varchar(4) NOT NULL default '', + iso_code_2 varchar(2) NOT NULL default '', + iso_code_3 varchar(3) default '', + iso_country varchar(255) NOT NULL default '', + country varchar(255) NOT NULL default '', + lat float NOT NULL default '0', + lon float NOT NULL default '0', + PRIMARY KEY (code), + KEY code (code) +); diff --git a/sql/old/3.3.5a/2012_03_24_00_world_misc.sql b/sql/old/3.3.5a/2012_03_24_00_world_misc.sql new file mode 100644 index 00000000000..e6f6ce77307 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_24_00_world_misc.sql @@ -0,0 +1,22 @@ +-- Beam Visual +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=60342; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,60342,0,0,31,0,3,29308,0,0,0,'','Beam Visual target Prince Taldaram'); + +-- script texts for Prince Taldaram +DELETE FROM `creature_text` WHERE `entry`=29308; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(29308,0,0,'The hum of magic energy in the air diminishes...',16,0,100,0,0,0,'prince taldaram SAY_1'), +(29308,1,0,'Intruders! Who trespasses in the Old Kingdom?',14,0,100,0,0,0,'prince taldaram SAY_WARNING'), +(29308,2,0,'I will feast on your remains.',14,0,100,0,0,14360,'prince taldaram SAY_AGGRO'), +(29308,3,0,'',14,10,100,0,0,14365,'prince taldaram SAY_SLAY_0'), +(29308,3,1,'I will drink no blood before it''s time.',14,0,100,0,0,14366,'prince taldaram SAY_SLAY_1'), +(29308,3,2,'One final embrace.',14,0,100,0,0,14367,'prince taldaram SAY_SLAY_2'), +(29308,4,0,'Still I hunger. Still... I... thirst.',14,0,100,0,0,14368,'prince taldaram SAY_DEATH'), +(29308,5,0,'So... appetizing.',14,0,100,0,0,14363,'prince taldaram SAY_FEED1'), +(29308,5,1,'Fresh, warm blood. It has been too long.',14,0,100,0,0,14364,'prince taldaram SAY_FEED2'), +(29308,6,0,'Your heartbeat is... music to my ears.',14,0,100,0,0,14361,'prince taldaram SAY_VANISH1'), +(29308,6,1,'I am nowhere... I am everywhere. I am the watcher, unseen.',14,0,100,0,0,14362,'prince taldaram SAY_VANISH2'); + +-- cleanup +DELETE FROM `script_texts` WHERE `npc_entry`=29308; diff --git a/sql/old/3.3.5a/2012_03_24_01_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_03_24_01_world_creature_loot_template.sql new file mode 100644 index 00000000000..078c48a47b7 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_24_01_world_creature_loot_template.sql @@ -0,0 +1,290 @@ +-- ----------------------------------- +-- -- Loot for The Siege of Ulduar -- +-- ----------------------------------- + +-- Old Cleanups: +DELETE FROM `reference_loot_template` WHERE `entry` IN ( 34116,34117,34118,34119,34120,34121,34157,34158,34159,34160,34161,34162); +-- ------------------- +-- -- Set Variables -- +-- ------------------- +-- 10 man mode npcids +SET @FlameLevi10 :=33113; +SET @IgnisFM10 :=33118; +SET @Razorscale10 :=33186; +SET @XT002_10 :=33293; +-- 25 man mode npcids (via procedure) +call `sp_get_npc_diffentry`(@FlameLevi10,1,@FlameLevi25); +call `sp_get_npc_diffentry`(@IgnisFM10,1,@IgnisFM25); +call `sp_get_npc_diffentry`(@Razorscale10,1,@Razorscale25); +call `sp_get_npc_diffentry`(@XT002_10,1,@XT002_25); + +SET @Emblem := 47241; +SET @Orb := 45087; +-- ------------------------------------- +-- -- Set Reference Loot Template ids -- +-- ------------------------------------- + +SET @EmblemRef := 34349; -- First Free ID +SET @OrbRef := @EmblemRef+1; +SET @Flame10Ref := @EmblemRef+2; +SET @Flame25Ref := @EmblemRef+3; +SET @Ignis10Ref := @EmblemRef+4; +SET @Ignis25Ref := @EmblemRef+5; +SET @Razor10Ref := @EmblemRef+6; +SET @Razor25Ref := @EmblemRef+7; +SET @XT002_10Ref := @EmblemRef+8; +SET @XT002_25Ref := @EmblemRef+9; +-- Flame Levithian +DELETE FROM `reference_loot_template` WHERE `entry` BETWEEN @EmblemRef AND @EmblemRef+9; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Emblem Ref +(@EmblemRef,47241,0,1,1,1,1), -- Emblem of Triumph 1x +-- OrbRef +(@OrbRef,45087,0,1,1,1,1), -- Runed Orb 1x +-- Flame Levithian 10man +(@Flame10Ref,45286,0,1,1,1,1), -- Pyrite Infuser +(@Flame10Ref,45287,0,1,1,1,1), -- Firesoul +(@Flame10Ref,45288,0,1,1,1,1), -- Firestrider Chestguard +(@Flame10Ref,45289,0,1,1,1,1), -- Lifespark Visage +(@Flame10Ref,45291,0,1,1,1,1), -- Combustion Bracers +(@Flame10Ref,45284,0,1,1,1,1), -- Kinetic Ripper +(@Flame10Ref,45282,0,1,1,1,1), -- Ironsoul +(@Flame10Ref,45285,0,1,1,1,1), -- Might of the Leviathan +(@Flame10Ref,45292,0,1,1,1,1), -- Energy Siphon +(@Flame10Ref,45283,0,1,1,1,1), -- Flamewatch Armguards +-- Flame Levithian 25man +(@Flame25Ref,45117,0,1,1,1,1), -- Constructors Handwraps +(@Flame25Ref,45119,0,1,1,1,1), -- Embrace of the Leviathan +(@Flame25Ref,45113,0,1,1,1,1), -- Glowing Ring of Reclamation +(@Flame25Ref,45115,0,1,1,1,1), -- Leviathan Fueling Manual +(@Flame25Ref,45108,0,1,1,1,1), -- Mechanists Bindings +(@Flame25Ref,45106,0,1,1,1,1), -- Strenght of the Automaton +(@Flame25Ref,45109,0,1,1,1,1), -- Gloves of the Fiery Behemoth +(@Flame25Ref,45114,0,1,1,1,1), -- Steamcallers Totem +(@Flame25Ref,45118,0,1,1,1,1), -- Steamworkers Goggles +(@Flame25Ref,45116,0,1,1,1,1), -- Freya's Choker of Warding +(@Flame25Ref,45111,0,1,1,1,1), -- Mimiron's Inferno Couplings +(@Flame25Ref,45112,0,1,1,1,1), -- The Leviathan's Coil +(@Flame25Ref,45107,0,1,1,1,1), -- Iron Riveted War Helm + +-- Ignis the Furnace Master 10man +(@Ignis10Ref,45309,0,1,1,1,1), -- Rifle of the Platinum Guard +(@Ignis10Ref,45310,0,1,1,1,1), -- Gauntlets of the Iron Furnace +(@Ignis10Ref,45311,0,1,1,1,1), -- Relentless Edge +(@Ignis10Ref,45312,0,1,1,1,1), -- Gloves of Smoldering Touch +(@Ignis10Ref,45313,0,1,1,1,1), -- Furnace Stone +(@Ignis10Ref,45314,0,1,1,1,1), -- Igniter Rod +(@Ignis10Ref,45316,0,1,1,1,1), -- Armbraces of the Vibrant Flame +(@Ignis10Ref,45317,0,1,1,1,1), -- Shawl of the Caretaker +(@Ignis10Ref,45318,0,1,1,1,1), -- Drape of Fuming Anger +(@Ignis10Ref,45321,0,1,1,1,1), -- Pauldrons of Tempered Will +-- Ignis the Furnace Master 25man +(@Ignis25Ref,45157,0,1,1,1,1), -- Cindershard Ring +(@Ignis25Ref,45158,0,1,1,1,1), -- Heart of Iron +(@Ignis25Ref,45161,0,1,1,1,1), -- Girdle of Embers +(@Ignis25Ref,45162,0,1,1,1,1), -- Flamestalker Boots +(@Ignis25Ref,45164,0,1,1,1,1), -- Helm of the Furnace Master +(@Ignis25Ref,45165,0,1,1,1,1), -- Worldcarver +(@Ignis25Ref,45166,0,1,1,1,1), -- Charred Saronite Greaves +(@Ignis25Ref,45167,0,1,1,1,1), -- Lifeforge Breastplate +(@Ignis25Ref,45168,0,1,1,1,1), -- Pyrelight Circle +(@Ignis25Ref,45169,0,1,1,1,1), -- Totem of the Dancing Flame +(@Ignis25Ref,45170,0,1,1,1,1), -- Scepter of Creation +(@Ignis25Ref,45171,0,1,1,1,1), -- Intensity +(@Ignis25Ref,45185,0,1,1,1,1), -- Flamewrought Cinch +(@Ignis25Ref,45186,0,1,1,1,1), -- Soot-Covered Mantle +(@Ignis25Ref,45187,0,1,1,1,1), -- Wristguards of the Firetender + +-- Razorscale 10man +(@Razor10Ref,45298,0,1,1,1,1), -- RazoRazorcale Talon +(@Razor10Ref,45299,0,1,1,1,1), -- Dragonsteel Faceplate +(@Razor10Ref,45301,0,1,1,1,1), -- BraceRazor of the Smothering Inferno +(@Razor10Ref,45302,0,1,1,1,1), -- Treads of the Invader +(@Razor10Ref,45303,0,1,1,1,1), -- Band of Draconic Guile +(@Razor10Ref,45304,0,1,1,1,1), -- Stormtempered Girdle +(@Razor10Ref,45305,0,1,1,1,1), -- Breastplate of the Afterlife +(@Razor10Ref,45306,0,1,1,1,1), -- Binding of the Dragon Matriarch +(@Razor10Ref,45307,0,1,1,1,1), -- Ironscale Leggings +(@Razor10Ref,45308,0,1,1,1,1), -- Eye of the Broodmother +-- Razorscale 25man +(@Razor25Ref,45137,0,1,1,1,1), -- Veranus' Bane +(@Razor25Ref,45138,0,1,1,1,1), -- Drape of the Drakerider +(@Razor25Ref,45139,0,1,1,1,1), -- Dragonslayer's Brace +(@Razor25Ref,45140,0,1,1,1,1), -- RazoRazorcale Shoulderguards +(@Razor25Ref,45141,0,1,1,1,1), -- Proto-hide Leggings +(@Razor25Ref,45142,0,1,1,1,1), -- RemoRazore +(@Razor25Ref,45143,0,1,1,1,1), -- Saronite Mesh Legguards +(@Razor25Ref,45144,0,1,1,1,1), -- Sigil of Deflection +(@Razor25Ref,45146,0,1,1,1,1), -- Shackles of the Odalisque +(@Razor25Ref,45147,0,1,1,1,1), -- Guiding Star +(@Razor25Ref,45148,0,1,1,1,1), -- Living Flame +(@Razor25Ref,45149,0,1,1,1,1), -- BraceRazor of the Broodmother +(@Razor25Ref,45150,0,1,1,1,1), -- Collar of the Wyrmhunter +(@Razor25Ref,45151,0,1,1,1,1), -- Belt of the Fallen Wyrm +(@Razor25Ref,45510,0,1,1,1,1), -- Libram of Discord + +-- XT-002 Deconstructor 10man +(@XT002_10Ref,45675,0,1,1,1,1), -- Power Enchancing Loop +(@XT002_10Ref,45676,0,1,1,1,1), -- Chestplate of Vicious Potency +(@XT002_10Ref,45677,0,1,1,1,1), -- Treacherous shoulderpads +(@XT002_10Ref,45679,0,1,1,1,1), -- Gloves of Taut grip +(@XT002_10Ref,45680,0,1,1,1,1), -- Armbands of the construct +(@XT002_10Ref,45682,0,1,1,1,1), -- Pulsing spellshield +(@XT002_10Ref,45685,0,1,1,1,1), -- Plasma Foil +(@XT002_10Ref,45686,0,1,1,1,1), -- Vest of the glowing Cresent +(@XT002_10Ref,45687,0,1,1,1,1), -- Helm of Veiled Energies +(@XT002_10Ref,45694,0,1,1,1,1), -- Conductive cord +(@XT002_10Ref,45867,0,2,2,1,1), -- Breasktplate of the Stoneshaper +(@XT002_10Ref,45868,0,2,2,1,1), -- Aesir's Edge +(@XT002_10Ref,45869,0,2,2,1,1), -- Fluxing Energy Coils +(@XT002_10Ref,45870,0,2,2,1,1), -- Magnetized Projectile Emitter +(@XT002_10Ref,45871,0,2,2,1,1), -- Seal of Ulduar +-- XT-002 Deconstructor 25man +(@XT002_25Ref,45254,0,1,1,1,1), -- Sigil of the Vengeful Heart +(@XT002_25Ref,45251,0,1,1,1,1), -- Shoulderplates of the Deconstructor +(@XT002_25Ref,45247,0,1,1,1,1), -- Signet of the Earthshaker +(@XT002_25Ref,45256,0,1,1,1,1), -- Twisted Visage +(@XT002_25Ref,45250,0,1,1,1,1), -- Crazed Construct Ring +(@XT002_25Ref,45257,0,1,1,1,1), -- Quartz Crystal Wand +(@XT002_25Ref,45260,0,1,1,1,1), -- Boots of Hasty Revival +(@XT002_25Ref,45252,0,1,1,1,1), -- Horologist's Wristguards +(@XT002_25Ref,45253,0,1,1,1,1), -- Mantle of Wavering Calm +(@XT002_25Ref,45258,0,1,1,1,1), -- Sandals of Rash Temperament +(@XT002_25Ref,45249,0,1,1,1,1), -- Brass-lined Boots +(@XT002_25Ref,45246,0,1,1,1,1), -- Golem-Shard Sticker +(@XT002_25Ref,45248,0,1,1,1,1), -- Clockwork Legplates +(@XT002_25Ref,45259,0,1,1,1,1), -- Quartz-studded Harness +(@XT002_25Ref,45255,0,1,1,1,1); -- Thunderfall Totem +-- ----------------------------------------------------------------------------------------------- +-- -- END OF REFERENCES -- -- END OF REFERENCES -- -- END OF REFERENCES -- -- END OF REFERENCES -- +-- -- END OF REFERENCES -- -- END OF REFERENCES -- -- END OF REFERENCES -- -- END OF REFERENCES -- +-- -- END OF REFERENCES -- -- END OF REFERENCES -- -- END OF REFERENCES -- -- END OF REFERENCES -- +-- ----------------------------------------------------------------------------------------------- + +-- Flame Levithian 10Man: +-- NORMAL MODE : 2x [Normal Loot Item] + 1x [Emblem of Valor] +-- ONE TOWER : 2x [Normal Loot Item] + 2x [Emblem of Conquest] + CHANCE TO [Recipe] +-- TWO TOWERS : 2x [Normal Loot Item] + 2x [Emblem of Conquest] + 1x [Runed Orb] + CHANCE TO [Recipe] +-- THREE TOWERS: 2x [Normal Loot Item] + 3x [Emblem of Conquest] + 1x [Runed Orb] + CHANCE TO [Recipe] + 1x [Recipe] +-- FOUR TOWERS : 2x [Normal Loot Item] + 3x [Emblem of Conquest] + 1x [Runed Orb] + CHANCE TO [Recipe] + 1x [Recipe] + 1x [Hard Loot Item] +-- Flame Levithian 25 man +-- NORMAL MODE : 3x [Normal Loot Item] + 1x [Emblem of Conquest] + CHANCE TO [Runed Orb] + CHANCE TO [Recipe] +-- ONE TOWER : 3x [Normal Loot Item] + 2x [Emblem of Conquest] + CHANCE TO [Runed Orb] + CHANCE TO [Recipe] +-- TWO TOWERS : 3x [Normal Loot Item] + 2x [Emblem of Conquest] + CHANCE TO [Runed Orb] + CHANCE TO [Recipe] + 2x [Runed Orb] +-- THREE TOWERS: 3x [Normal Loot Item] + 3x [Emblem of Conquest] + CHANCE TO [Runed Orb] + CHANCE TO [Recipe] + 2x [Runed Orb] + [Recipe] +-- FOUR TOWERS : 3x [Normal Loot Item] + 3x [Emblem of Conquest] + CHANCE TO [Runed Orb] + CHANCE TO [Recipe] + 2x [Runed Orb] + [Recipe] + 1x [Hard Loot Item] + +DELETE FROM `creature_loot_template` WHERE `entry` IN (@FlameLevi10,@FlameLevi25,@IgnisFM10,@IgnisFM25,@Razorscale10,@Razorscale25,@XT002_10,@XT002_25); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- --------------------------- +-- -- Flame Levithian 10man -- +-- --------------------------- +(@FlameLevi10,1,100,1,0,-@EmblemRef,1), -- 1x emblem +(@FlameLevi10,2,100,1,0,-@Flame10Ref,2), -- 2 from 10man reference +-- Hardmode: 1 tower left +(@FlameLevi10,3,100,2,0,-@EmblemRef,2), -- 2x emblem +(@FlameLevi10,4,100,2,0,-@Flame10Ref,2), -- 2 from 10man reference +-- Hardmode: 2 towers left +(@FlameLevi10,5,100,4,0,-@EmblemRef,2), -- 2x emblem +(@FlameLevi10,6,100,4,0,-@Flame10Ref,2), -- 2 from 10man reference +-- Hardmode: 3 towers left +(@FlameLevi10,7,100,8,0,-@EmblemRef,3), -- 3x emblem +(@FlameLevi10,8,100,8,0,-@Flame10Ref,2), -- 2 from 10man reference +-- Hardmode: 4 towers left +(@FlameLevi10,9,100,16,0,-@EmblemRef,3), -- 3x emblem +(@FlameLevi10,10,100,16,0,-@Flame10Ref,2), -- 2 from 10man reference +-- one from hardmodeloot: +(@FlameLevi10,45296,0,16,1,1,1), -- Twirling Blades +(@FlameLevi10,45293,0,16,1,1,1), -- Handguards of Potent Cures +(@FlameLevi10,45295,0,16,1,1,1), -- Gilded Steel Legplates +(@FlameLevi10,45300,0,16,1,1,1), -- Mantle of Fiery Vengeance +(@FlameLevi10,45297,0,16,1,1,1), -- Shimmering Seal +-- Shared Loot over the modes (masked) +-- Non-Normal (Modes 2|4|8|16) +(@FlameLevi10,11,5,30,0,-34154,1), -- 1 from recepies (chanced) +-- More then 1 tower up (Modes 4|8|16) +(@FlameLevi10,@Orb,100,28,0,1,3), -- Runed Orb (1-3) +-- More then 2 towers up (Modes 8|16) +(@FlameLevi10,12,100,24,0,-34154,1), -- 1 from recepies +-- --------------------------- +-- -- Flame Levithian 25man -- +-- --------------------------- +(@FlameLevi25,1,100,1,0,-@EmblemRef,1), -- 1x emblem +(@FlameLevi25,2,100,1,0,-@Flame25Ref,3), -- 3 from 25man reference +-- Hardmode: 1 tower left +(@FlameLevi25,3,100,2,0,-@EmblemRef,2), -- 2x emblem +(@FlameLevi25,4,100,2,0,-@Flame25Ref,3), -- 3 from 25man reference +-- Hardmode: 2 towers left +(@FlameLevi25,5,100,4,0,-@EmblemRef,2), -- 2x emblem +(@FlameLevi25,6,100,4,0,-@Flame25Ref,3), -- 3 from 25man reference +-- Hardmode: 3 towers left +(@FlameLevi25,7,100,8,0,-@EmblemRef,3), -- 3x emblem +(@FlameLevi25,8,100,8,0,-@Flame25Ref,3), -- 3 from 25man reference +-- Hardmode: 4 towers left +(@FlameLevi25,9,100,16,0,-@EmblemRef,3), -- 3x emblem +(@FlameLevi25,10,100,16,0,-@Flame25Ref,3), -- 3 from 25man reference +-- one from hardmodeloot: +(@FlameLevi25,45132,0,16,1,1,1), -- Golden Saronite Dragon +(@FlameLevi25,45133,0,16,1,1,1), -- Pendant of Fiery Havoc +(@FlameLevi25,45134,0,16,1,1,1), -- Plated Leggings of Ruination +(@FlameLevi25,45135,0,16,1,1,1), -- Boots of Fiery Resolution +(@FlameLevi25,45136,0,16,1,1,1), -- Shoulderpads of Dormant Energies +(@FlameLevi25,45086,0,16,1,1,1), -- Rising Sun +(@FlameLevi25,45110,0,16,1,1,1), -- Titanguard +-- Shared Loot over the modes (masked) +-- All Modes (1|2|4|8|16): +(@FlameLevi25,11,5,31,0,-@OrbRef,1), -- Runed Orb (1x Chanced) +(@FlameLevi25,45038,8,1,0,1,1), -- Fragment of Val'anyr (quest only!?) +(@FlameLevi25,12,5,31,0,-34154,1), -- 1 from recepies (chanced) +-- More then 1 tower up (Modes 4|8|16) +(@FlameLevi25,13,100,28,0,-@OrbRef,2), -- Runed Orb (2x garanteed) +-- More then 2 towers up (Modes 8|16) +(@FlameLevi25,14,100,24,0,-34154,1), -- 1 from recepies +-- ------------------------------ +-- -- IGNIS THE FURNACE MASTER -- +-- ------------------------------ +-- Ignis the Furnace Master 10man +(@IgnisFM10,1,100,1,0,-@Ignis10Ref,2), -- 2 items from Ref loot +(@IgnisFM10,@Emblem,100,1,0,1,1), -- 1 Emblem +-- Ignis the Furnace Master 25man +(@IgnisFM25,1,100,1,0,-@Ignis25Ref,3), -- 3 items from Ref loot +(@IgnisFM25,@Emblem,100,1,0,2,2), -- 2 Emblem +(@IgnisFM25,3,10,1,0,-34154,1), -- 1 from recepies +(@IgnisFM25,45038,8,1,0,1,1), -- Fragment of Val'anyr (quest only!?) +(@IgnisFM25,45087,75,1,0,1,1), -- Runed Orb +-- ---------------- +-- -- RAZORSCALE -- +-- ---------------- +-- Razorscale 10man +(@Razorscale10,1,100,1,0,-@Razor10Ref ,2), -- 2 items from ref loot +(@Razorscale10,@Emblem,100,1,0,1,1), -- Emblem of Triumph +-- Razorscale 25man +(@Razorscale25,1,100,1,0,-@Razor25Ref,3), -- 3 items from Ref loot +(@Razorscale25,@Emblem,100,1,0,1,2), -- 2 Emblems +(@Razorscale25,2,10,1,0,-34154,1), -- 1 from recepies +(@Razorscale25,45038,8,1,0,1,1), -- Fragment of Val'anyr (quest only!?) +(@Razorscale25,45087,75,1,0,1,1), -- Runed Orb +-- ------------------------- +-- -- XT002 DECONSTRUCTOR -- +-- ------------------------- +-- X002 Deconstructor 10man (and hardmode) +(@XT002_10,1,100,3,0,-@XT002_10Ref,2), -- 2items from Ref loot +(@XT002_10,@Emblem,100,3,0,1,1), -- 1x Emblem +-- Hard mode 10man only: +(@XT002_10,45442,0,2,1,1,1), -- Sorthalis,Hammer of the Watchers +(@XT002_10,45443,0,2,1,1,1), -- Charm of Meticulous Timing +(@XT002_10,45444,0,2,1,1,1), -- Gloves of the Steady Hand +(@XT002_10,45445,0,2,1,1,1), -- Breastplate of the Devoted +(@XT002_10,45446,0,2,1,1,1), -- Grasps of Reason +-- X002 Deconstructor 25man (and hardmode) +(@XT002_25,1,100,3,0,-@XT002_25Ref,3), -- 3 items from Ref loot +(@XT002_25,2,10,3,0,-34154,1), -- 1 from recepies +(@XT002_25,45038,8,3,0,1,1), -- Fragment of Val'anyr (quest only!?) +(@XT002_25,45087,75,3,0,1,1), -- Runed Orb +(@XT002_25,47241,100,3,0,1,2), -- 2 Emblem of Triumph +-- Hard Mode 25man only: +(@XT002_25,45442,0,2,1,1,1), -- Sorthalis,Hammer of the Watchers +(@XT002_25,45443,0,2,1,1,1), -- Charm of Meticulous Timing +(@XT002_25,45444,0,2,1,1,1), -- Gloves of the Steady Hand +(@XT002_25,45445,0,2,1,1,1), -- Breastplate of the Devoted +(@XT002_25,45446,0,2,1,1,1); -- Grasps of Reason diff --git a/sql/old/3.3.5a/2012_03_24_02_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_03_24_02_world_creature_loot_template.sql new file mode 100644 index 00000000000..cdac3335aed --- /dev/null +++ b/sql/old/3.3.5a/2012_03_24_02_world_creature_loot_template.sql @@ -0,0 +1,136 @@ +-- (re) Add reference 26042 +SET @NEC := 26042; -- Northrend Emotion Cooking Recipe Reference +DELETE FROM `reference_loot_template` WHERE `entry`=@NEC; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@NEC,43507,0,1,1,1,1), -- Recipe: Tasty cupcake +(@NEC,43508,0,1,1,1,1), -- Recipe: Last Week's Mammoth +(@NEC,43509,0,1,1,1,1), -- Recipe: Bad Clams +(@NEC,43510,0,1,1,1,1); -- Recipe: Haunted Herring + +DELETE FROM `creature_loot_template` WHERE `entry` IN (2436,5928,5936,12239,12240,12241,12242,12243,14527,14529,14531,16506,16836,17307,21166,23809,23954,23963,23964,23983,24175,25234,28027,28113,28138,28494,29554,30177,30954,31779,40419); +UPDATE `creature_template`SET `lootid`=entry WHERE `entry` IN (2436,5928,5936,12239,12240,12241,12242,12243,14527,14529,14531,16506,16836,21166,23809,23963,23964,23983,25234,28027,28138,28494,29554,30954,31779,40419); +UPDATE `creature_template` SET `lootid`=0 WHERE `entry` IN (17307,23954,24175,28113,30177); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Farmer Kent (friendly?) +(2436,3692,-100,1,0,1,1), -- Hilsbrad Human Skull +-- Sorrow Wing +(5928,5808,-50,1,0,1,1), -- Pridewing Venom Sac +(5928,5137,80,1,0,1,1), -- Bright Eyeball +(5928,5136,10,1,0,1,1), -- Torn Furry Ear +(5928,1,100,1,0,-@NEC,1), -- Random world green drop ilvl 25-30 +-- Orca +(5936,26000,3,1,1,-26000,1), -- Northrend World Grey Reference #1 +(5936,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(5936,26003,1,1,1,-26003,1), -- Northrend World Green Reference #1 +(5936,26004,1,1,1,-26004,1), -- Northrend World Green Reference #2 +(5936,26005,1,1,1,-26005,1), -- Northrend World Green Reference #3 +(5936,26006,1,1,1,-26006,1), -- Northrend World Green Reference #4 +(5936,26017,0.5,1,1,-26017,1), -- Northrend World Blue Reference #1 +(5936,26018,0.5,1,1,-26018,1), -- Northrend World Blue Reference #2 +(5936,26019,0.5,1,1,-26019,1), -- Northrend World Blue Reference #3 +(5936,26020,0.5,1,1,-26020,1), -- Northrend World Blue Reference #4 +-- Add Theradric Crystal Carving (17684) to the following creatures +(12239,17684,-25,1,0,1,1), -- Spirit of Gelk +(12240,17684,-25,1,0,1,1), -- Spirit of Kolk +(12241,17684,-25,1,0,1,1), -- Spirit of Magra +(12242,17684,-25,1,0,1,1), -- Spirit of Maraudos +(12243,17684,-25,1,0,1,1), -- Spirit of Veng +(14527,18952,-100,1,0,1,1), -- Simone the Inconspicuous - Simone's Head +(14529,18953,-100,1,0,1,1), -- Franklin the Friendly - Klinfran's Head +(14531,18955,-100,1,0,1,1), -- Artorius the Amiable - Artorius's Head +(16506,22708,-100,1,0,1,1), -- Naxxramas Worshipper - Fate of Ramaladni +(16836,23460,-100,1,0,1,1), -- Escaped Dreghood - Broken Blood Sample +(21166,30451,-15,1,0,1,1), -- Illidari Dreadlord - Lohn'goron, Bow of the Torn-heart +-- Vengeance Landing Cannoneer +(23809,26000,3,1,1,-26000,1), -- Northrend World Grey Reference #1 +(23809,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(23809,26005,1,1,1,-26005,1), -- Northrend World Green Reference #3 +-- Sergeant Lorric +(23963,26000,3,1,1,-26000,1), -- Northrend World Grey Reference #1 +(23963,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(23963,26003,1,1,1,-26003,1), -- Northrend World Green Reference #1 +(23963,26004,1,1,1,-26004,1), -- Northrend World Green Reference #2 +(23963,26017,0.5,1,1,-26017,1), -- Northrend World Blue Reference #1 +(23963,26018,0.5,1,1,-26018,1), -- Northrend World Blue Reference #2 +(23963,26044,2,1,0,-@NEC,1), -- Northrend Emotion Cooking Recipes +-- Lieutenant Celeyne +(23964,26000,3,1,1,-26000,1), -- Northrend World Grey Reference #1 +(23964,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(23964,26003,1,1,1,-26003,1), -- Northrend World Green Reference #1 +(23964,26004,1,1,1,-26004,1), -- Northrend World Green Reference #2 +(23964,26017,0.5,1,1,-26017,1), -- Northrend World Blue Reference #1 +(23964,26018,0.5,1,1,-26018,1), -- Northrend World Blue Reference #2 +(23964,26044,2,1,0,-@NEC,1), -- Northrend Emotion Cooking Recipes +-- North Fleet Marine +(23983,26000,3,1,1,-26000,1), -- Northrend World Grey Reference #1 +(23983,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(23983,26003,1,1,1,-26003,1), -- Northrend World Green Reference #1 +(23983,26004,1,1,1,-26004,1), -- Northrend World Green Reference #2 +(23983,26017,0.5,1,1,-26017,1), -- Northrend World Blue Reference #1 +(23983,26018,0.5,1,1,-26018,1), -- Northrend World Blue Reference #2 +(23983,26044,2,1,0,-@NEC,1), -- Northrend Emotion Cooking Recipes +-- Stormfleet Deckhand +(25234,26000,3,1,1,-26000,1), -- Northrend World Grey Reference #1 +(25234,26003,1,1,1,-26003,1), -- Northrend World Green Reference #1 +-- High-Oracle Soo-say +(28027,17058,50,1,0,1,1), -- Fish Oil +(28027,17057,30,1,0,1,1), -- Shiny Fish Scales +(28027,33470,15,1,0,2,4), -- Frostweave Cloth +(28027,35951,10,1,0,1,3), -- Poached Emperor Salmon +(28027,38642,-1,1,0,1,1), -- Golden Engagement Ring +-- Elder Harkek +(28138,33470,40,1,0,2,4), -- Frostweave Cloth +(28138,33447,4,1,0,1,1), -- Runic Healing Potion +(28138,38642,-1,1,0,1,1), -- Golden Engagement Ring +-- Kutube'sa +(28494,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(28494,26002,3,1,1,-26002,1), -- Northrend World Grey Reference #3 +(28494,26010,1,1,1,-26010,1), -- Northrend World Green Reference #4 +(28494,26011,1,1,1,-26011,1), -- Northrend World Green Reference #5 +(28494,26012,1,1,1,-26012,1), -- Northrend World Green Reference #6 +(28494,26023,0.5,1,1,-26023,1), -- Northrend World Blue Reference #3 +(28494,26025,0.5,1,1,-26025,1), -- Northrend World Blue Reference #4 +(28494,26026,0.5,1,1,-26026,1), -- Northrend World Blue Reference #5 +(28494,26044,2,1,0,-@NEC,1), -- Northrend Emotion Cooking Recipes +(28494,39152,35,1,0,1,1), -- Manual: Heavy Frostweave Bandage +(28494,43297,1,1,0,1,1), -- Damaged Necklace +-- Snowblind Devotee +(29554,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(29554,26002,3,1,1,-26002,1), -- Northrend World Grey Reference #3 +(29554,26009,1,1,1,-26009,1), -- Northrend World Green Reference #3 +(29554,26010,1,1,1,-26010,1), -- Northrend World Green Reference #4 +(29554,26011,1,1,1,-26011,1), -- Northrend World Green Reference #5 +(29554,26012,1,1,1,-26012,1), -- Northrend World Green Reference #6 +(29554,26013,1,1,1,-26013,1), -- Northrend World Green Reference #7 +(29554,26023,0.5,1,1,-26023,1), -- Northrend World Blue Reference #3 +(29554,26024,0.5,1,1,-26024,1), -- Northrend World Blue Reference #4 +(29554,26025,0.5,1,1,-26025,1), -- Northrend World Blue Reference #5 +(29554,26026,0.5,1,1,-26026,1), -- Northrend World Blue Reference #6 +(29554,26044,2,1,0,-@NEC,1), -- Northrend Emotion Cooking Recipes +(29554,39152,35,1,0,1,1), -- Manual: Heavy Frostweave Bandage +(29554,43297,1,1,0,1,1), -- Damaged Necklace +-- Rokir +(30954,26001,6,1,1,-26001,1), -- Northrend World Grey Reference #2 +(30954,26002,6,1,1,-26002,1), -- Northrend World Grey Reference #3 +(30954,26014,2,1,1,-26014,1), -- Northrend World Green Reference #8 +(30954,26015,2,1,1,-26015,1), -- Northrend World Green Reference #9 +-- Skeletal Archmage +(31779,26001,3,1,1,-26001,1), -- Northrend World Grey Reference #2 +(31779,26002,3,1,1,-26002,1), -- Northrend World Grey Reference #3 +(31779,26013,1,1,1,-26013,1), -- Northrend World Green Reference #7 +(31779,26014,1,1,1,-26014,1), -- Northrend World Green Reference #8 +(31779,26015,1,1,1,-26015,1), -- Northrend World Green Reference #9 +(31779,26028,0.5,1,1,-26028,1), -- Northrend World Blue Reference #8 +(31779,39152,50,1,0,1,1), -- Manual: Heavy Frostweave Bandage +(31779,43297,1,1,0,1,1), -- Damaged Necklace +-- Charscale Assaulter +(40419,26001,6,1,1,-26001,1), -- Northrend World Grey Reference #2 +(40419,26002,6,1,1,-26002,1), -- Northrend World Grey Reference #3 +(40419,26015,2,1,1,-26015,1), -- Northrend World Green Reference #9 +(40419,26016,2,1,1,-26016,1); -- Northrend World Green Reference #10 +-- conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 1 AND `SourceGroup` IN (28494,29554,31779); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`Comment`) VALUES +(1,28494,39152,7,129,390,'Manual: Heavy Frostweave Bandage will drop only if the player has first aid at 390'), +(1,29554,39152,7,129,390,'Manual: Heavy Frostweave Bandage will drop only if the player has first aid at 390'), +(1,31779,39152,7,129,390,'Manual: Heavy Frostweave Bandage will drop only if the player has first aid at 390'); diff --git a/sql/old/3.3.5a/2012_03_25_00_auth_misc.sql b/sql/old/3.3.5a/2012_03_25_00_auth_misc.sql new file mode 100644 index 00000000000..f34882af8f6 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_25_00_auth_misc.sql @@ -0,0 +1,8 @@ +ALTER TABLE `account_banned` + CHANGE `bandate` `bandate` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + CHANGE `unbandate` `unbandate` INT(10) UNSIGNED DEFAULT 0 NOT NULL; + +ALTER TABLE `ip_banned` + CHANGE `ip` `ip` VARCHAR(15) CHARSET utf8 COLLATE utf8_general_ci DEFAULT '127.0.0.1' NOT NULL, + CHANGE `bandate` `bandate` INT(10) UNSIGNED NOT NULL, + CHANGE `unbandate` `unbandate` INT(10) UNSIGNED NOT NULL; diff --git a/sql/old/3.3.5a/2012_03_25_00_world_game_event.sql b/sql/old/3.3.5a/2012_03_25_00_world_game_event.sql new file mode 100644 index 00000000000..82dfaa3f494 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_25_00_world_game_event.sql @@ -0,0 +1,4 @@ +-- darkmoon faerie resync, again +UPDATE `game_event` SET `start_time`='2012-04-01 00:01:00' WHERE `eventEntry`=5; +UPDATE `game_event` SET `start_time`='2012-05-06 00:01:00' WHERE `eventEntry`=3; +UPDATE `game_event` SET `start_time`='2012-06-03 00:01:00' WHERE `eventEntry`=4; diff --git a/sql/old/3.3.5a/2012_03_26_00_auth_realmlist.sql b/sql/old/3.3.5a/2012_03_26_00_auth_realmlist.sql new file mode 100644 index 00000000000..0a570a31773 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_26_00_auth_realmlist.sql @@ -0,0 +1,2 @@ +ALTER TABLE `realmlist` + CHANGE `color` `flag` tinyint(3) unsigned NOT NULL DEFAULT '2'; diff --git a/sql/old/3.3.5a/2012_03_26_00_world_creature_template.sql b/sql/old/3.3.5a/2012_03_26_00_world_creature_template.sql new file mode 100644 index 00000000000..f60849476bd --- /dev/null +++ b/sql/old/3.3.5a/2012_03_26_00_world_creature_template.sql @@ -0,0 +1,73 @@ +UPDATE `creature_template` SET `HoverHeight`=10.8, `VehicleId`=232 WHERE `entry`=30393; +UPDATE `creature_template` SET `HoverHeight`=10.8, `VehicleId`=237 WHERE `entry`=30461; +UPDATE `creature_template` SET `HoverHeight`=10 WHERE `entry`=27530; +UPDATE `creature_template` SET `HoverHeight`=10 WHERE `entry`=26277; +UPDATE `creature_template` SET `HoverHeight`=10 WHERE `entry`=26276; +UPDATE `creature_template` SET `HoverHeight`=1.2 WHERE `entry`=31070; +UPDATE `creature_template` SET `HoverHeight`=12 WHERE `entry`=37126; +UPDATE `creature_template` SET `HoverHeight`=15 WHERE `entry`=27608; +UPDATE `creature_template` SET `HoverHeight`=15 WHERE `entry`=27608; +UPDATE `creature_template` SET `HoverHeight`=1.6 WHERE `entry`=38392; +UPDATE `creature_template` SET `HoverHeight`=2.25 WHERE `entry`=30272; +UPDATE `creature_template` SET `HoverHeight`=2.58, `Scale`=1.72 WHERE `entry`=26607; +UPDATE `creature_template` SET `HoverHeight`=25 WHERE `entry`=37755; +UPDATE `creature_template` SET `HoverHeight`=26 WHERE `entry`=29790; +UPDATE `creature_template` SET `HoverHeight`=2.7 WHERE `entry`=25451; +UPDATE `creature_template` SET `HoverHeight`=2 WHERE `entry`=29048; +UPDATE `creature_template` SET `HoverHeight`=2, `VehicleId`=234 WHERE `entry`=30228; +UPDATE `creature_template` SET `HoverHeight`=2 WHERE `entry`=25445; +UPDATE `creature_template` SET `HoverHeight`=2 WHERE `entry`=26761; +UPDATE `creature_template` SET `HoverHeight`=2 WHERE `entry`=26761; +UPDATE `creature_template` SET `HoverHeight`=2 WHERE `entry`=25721; +UPDATE `creature_template` SET `HoverHeight`=35 WHERE `entry`=27789; +UPDATE `creature_template` SET `HoverHeight`=3 WHERE `entry`=34567; +UPDATE `creature_template` SET `HoverHeight`=3 WHERE `entry`=26668; +UPDATE `creature_template` SET `HoverHeight`=3, `VehicleId`=390 WHERE `entry`=34120; +UPDATE `creature_template` SET `HoverHeight`=3, `VehicleId`=108 WHERE `entry`=24083; +UPDATE `creature_template` SET `HoverHeight`=3, `VehicleId`=270 WHERE `entry`=31137; +UPDATE `creature_template` SET `HoverHeight`=4 WHERE `entry`=24272; +UPDATE `creature_template` SET `HoverHeight`=4 WHERE `entry`=37098; +UPDATE `creature_template` SET `HoverHeight`=4 WHERE `entry`=28534; +UPDATE `creature_template` SET `HoverHeight`=4 WHERE `entry`=28511; +UPDATE `creature_template` SET `HoverHeight`=5.85 WHERE `entry`=26736; +UPDATE `creature_template` SET `HoverHeight`=5.85 WHERE `entry`=26736; +UPDATE `creature_template` SET `HoverHeight`=5.85 WHERE `entry`=32534; +UPDATE `creature_template` SET `HoverHeight`=5, `VehicleId`=348 WHERE `entry`=33214; +UPDATE `creature_template` SET `HoverHeight`=5 WHERE `entry`=27693; +UPDATE `creature_template` SET `HoverHeight`=5 WHERE `entry`=34203; +UPDATE `creature_template` SET `HoverHeight`=6.25 WHERE `entry`=40083; +UPDATE `creature_template` SET `HoverHeight`=6.25 WHERE `entry`=40100; +UPDATE `creature_template` SET `HoverHeight`=6 WHERE `entry`=34496; +UPDATE `creature_template` SET `HoverHeight`=6 WHERE `entry`=34496; +UPDATE `creature_template` SET `HoverHeight`=6 WHERE `entry`=34497; +UPDATE `creature_template` SET `HoverHeight`=7.5 WHERE `entry`=26933; +UPDATE `creature_template` SET `HoverHeight`=8.4, `VehicleId`=232 WHERE `entry`=30420; +UPDATE `creature_template` SET `HoverHeight`=8 WHERE `entry`=33186; +UPDATE `creature_template` SET `HoverHeight`=9 WHERE `entry`=26933; +UPDATE `creature_template` SET `HoverHeight`=9 WHERE `entry`=37528; +UPDATE `creature_template` SET `HoverHeight`=9 WHERE `entry`=37230; +UPDATE `creature_template` SET `HoverHeight`=9, `VehicleId`=375 WHERE `entry`=33687; +UPDATE `creature_template` SET `HoverHeight`=9, `VehicleId`=535 WHERE `entry`=36661; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=10.8, `VehicleId`=232 WHERE `entry`=30393; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=10 WHERE `entry`=27608; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=10 WHERE `entry`=27608; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=15 WHERE `entry`=32630; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=1.6 WHERE `entry`=38391; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=2.25, `VehicleId`=247 WHERE `entry`=30564; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=2.25 WHERE `entry`=30272; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=2 WHERE `entry`=25721; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=2 WHERE `entry`=29570; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=2 WHERE `entry`=26761; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=3.12, `Scale`=2.08 WHERE `entry`=26607; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=3 WHERE `entry`=26668; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=3, `VehicleId`=108 WHERE `entry`=24083; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=4 WHERE `entry`=37098; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=4 WHERE `entry`=30945; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=5.85 WHERE `entry`=26736; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=5.85 WHERE `entry`=26736; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=5, `VehicleId`=276 WHERE `entry`=31432; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=6 WHERE `entry`=30501; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=7.5 WHERE `entry`=26933; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=8.4, `VehicleId`=232 WHERE `entry`=30420; +UPDATE `creature_template` SET `InhabitType`=0x4, `HoverHeight`=9 WHERE `entry`=26933; + diff --git a/sql/old/3.3.5a/2012_03_26_01_world_spell_script_names.sql b/sql/old/3.3.5a/2012_03_26_01_world_spell_script_names.sql new file mode 100644 index 00000000000..0a5c90f798f --- /dev/null +++ b/sql/old/3.3.5a/2012_03_26_01_world_spell_script_names.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (34477, 35079); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(34477,'spell_hun_misdirection'), +(35079,'spell_hun_misdirection_proc'); diff --git a/sql/old/3.3.5a/2012_03_27_00_world_misc.sql b/sql/old/3.3.5a/2012_03_27_00_world_misc.sql new file mode 100644 index 00000000000..132c91b81d7 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_27_00_world_misc.sql @@ -0,0 +1,49 @@ +ALTER TABLE `battleground_template` CHANGE `Weight` `Weight` tinyint(3) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `conditions` CHANGE `SourceId` `SourceId` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `creature` CHANGE `equipment_id` `equipment_id` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_addon` CHANGE `path_id` `path_id` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_ai_scripts` CHANGE `id` `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Identifier'; +ALTER TABLE `creature_ai_scripts` CHANGE `creature_id` `creature_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Creature Template Identifier'; +ALTER TABLE `creature_ai_scripts` CHANGE `event_type` `event_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Event Type'; +ALTER TABLE `creature_ai_scripts` CHANGE `event_chance` `event_chance` int(10) unsigned NOT NULL DEFAULT '100'; +ALTER TABLE `creature_ai_scripts` CHANGE `event_flags` `event_flags` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_ai_scripts` CHANGE `action1_type` `action1_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Action Type'; +ALTER TABLE `creature_ai_scripts` CHANGE `action2_type` `action2_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Action Type'; +ALTER TABLE `creature_ai_scripts` CHANGE `action3_type` `action3_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Action Type'; +ALTER TABLE `creature_ai_summons` CHANGE `id` `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Location Identifier'; +ALTER TABLE `creature_ai_summons` CHANGE `spawntimesecs` `spawntimesecs` int(10) unsigned NOT NULL DEFAULT '120'; +ALTER TABLE `creature_classlevelstats` CHANGE `level` `level` tinyint(4) NOT NULL; +ALTER TABLE `creature_classlevelstats` CHANGE `class` `class` tinyint(4) NOT NULL; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` smallint(6) NOT NULL; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` smallint(6) NOT NULL; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` smallint(6) NOT NULL; +ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` smallint(6) NOT NULL; +ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` smallint(6) NOT NULL; +ALTER TABLE `creature_formations` CHANGE `leaderGUID` `leaderGUID` int(10) unsigned NOT NULL; +ALTER TABLE `creature_formations` CHANGE `memberGUID` `memberGUID` int(10) unsigned NOT NULL; +ALTER TABLE `creature_formations` CHANGE `groupAI` `groupAI` int(10) unsigned NOT NULL; +ALTER TABLE `creature_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_onkill_reputation` CHANGE `RewOnKillRepValue1` `RewOnKillRepValue1` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `KillCredit1` `KillCredit1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `KillCredit2` `KillCredit2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `exp` `exp` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `resistance1` `resistance1` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `resistance2` `resistance2` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `resistance3` `resistance3` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `resistance4` `resistance4` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `resistance5` `resistance5` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `resistance6` `resistance6` smallint(6) NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `questItem1` `questItem1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `questItem2` `questItem2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `questItem3` `questItem3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `questItem4` `questItem4` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `questItem5` `questItem5` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `questItem6` `questItem6` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_template` CHANGE `WDBVerified` `WDBVerified` smallint(6) NULL DEFAULT '1'; +ALTER TABLE `creature_template_addon` CHANGE `path_id` `path_id` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `creature_transport` CHANGE `guid` `guid` int(11) NOT NULL AUTO_INCREMENT COMMENT 'GUID of NPC on transport - not the same as creature.guid'; +ALTER TABLE `creature_transport` CHANGE `transport_entry` `transport_entry` int(11) NOT NULL COMMENT 'Transport entry'; +ALTER TABLE `creature_transport` CHANGE `npc_entry` `npc_entry` int(11) NOT NULL COMMENT 'NPC entry'; +ALTER TABLE `creature_transport` CHANGE `emote` `emote` int(11) NOT NULL; +ALTER TABLE `db_script_string` CHANGE `entry` `entry` int(10) unsigned NOT NULL DEFAULT '0'; + \ No newline at end of file diff --git a/sql/old/3.3.5a/2012_03_27_01_world_misc.sql b/sql/old/3.3.5a/2012_03_27_01_world_misc.sql new file mode 100644 index 00000000000..38c11c8ae65 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_27_01_world_misc.sql @@ -0,0 +1,15 @@ +ALTER TABLE `exploration_basexp` CHANGE `level` `level` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `exploration_basexp` CHANGE `basexp` `basexp` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `fishing_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `game_event_creature` CHANGE `eventEntry` `eventEntry` tinyint(4) NOT NULL COMMENT 'Entry of the game event. Put negative entry to remove during event.'; +ALTER TABLE `game_event_gameobject` CHANGE `eventEntry` `eventEntry` tinyint(4) NOT NULL COMMENT 'Entry of the game event. Put negative entry to remove during event.'; +ALTER TABLE `game_event_model_equip` CHANGE `eventEntry` `eventEntry` tinyint(4) NOT NULL COMMENT 'Entry of the game event.'; +ALTER TABLE `game_event_npc_vendor` CHANGE `eventEntry` `eventEntry` tinyint(4) NOT NULL COMMENT 'Entry of the game event.'; +ALTER TABLE `game_event_pool` CHANGE `eventEntry` `eventEntry` tinyint(4) NOT NULL COMMENT 'Entry of the game event. Put negative entry to remove during event.'; +ALTER TABLE `gameobject_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `gameobject_template` CHANGE `WDBVerified` `WDBVerified` smallint(6) NULL DEFAULT '1'; +ALTER TABLE `gossip_menu` CHANGE `entry` `entry` smallint(5) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `gossip_menu_option` CHANGE `menu_id` `menu_id` smallint(5) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `gossip_menu_option` CHANGE `id` `id` smallint(5) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `gossip_menu_option` CHANGE `box_money` `box_money` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `gossip_menu_option` CHANGE `action_menu_id` `action_menu_id` int(10) unsigned NOT NULL DEFAULT '0'; diff --git a/sql/old/3.3.5a/2012_03_27_02_world_misc.sql b/sql/old/3.3.5a/2012_03_27_02_world_misc.sql new file mode 100644 index 00000000000..f83a98b8100 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_27_02_world_misc.sql @@ -0,0 +1,78 @@ +ALTER TABLE `instance_template` CHANGE `allowMount` `allowMount` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `ip2nation` CHANGE `ip` `ip` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `item_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `item_set_names` CHANGE `WDBVerified` `WDBVerified` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `item_template` CHANGE `spellcharges_1` `spellcharges_1` smallint(6) NULL DEFAULT NULL; +ALTER TABLE `item_template` CHANGE `spellcharges_2` `spellcharges_2` smallint(6) NULL DEFAULT NULL; +ALTER TABLE `item_template` CHANGE `spellcharges_3` `spellcharges_3` smallint(6) NULL DEFAULT NULL; +ALTER TABLE `item_template` CHANGE `spellcharges_4` `spellcharges_4` smallint(6) NULL DEFAULT NULL; +ALTER TABLE `item_template` CHANGE `spellcharges_5` `spellcharges_5` smallint(6) NULL DEFAULT NULL; +ALTER TABLE `item_template` CHANGE `BagFamily` `BagFamily` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `TotemCategory` `TotemCategory` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `socketContent_1` `socketContent_1` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `socketContent_2` `socketContent_2` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `socketContent_3` `socketContent_3` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `socketBonus` `socketBonus` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `GemProperties` `GemProperties` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `item_template` CHANGE `WDBVerified` `WDBVerified` smallint(6) NULL DEFAULT '1'; +ALTER TABLE `item_template` CHANGE `ScalingStatValue` `ScalingStatValue` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `mail_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `milling_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `npc_spellclick_spells` CHANGE `user_type` `user_type` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'relation with summoner: 0-no 1-friendly 2-raid 3-party player can click'; +ALTER TABLE `outdoorpvp_template` CHANGE `TypeId` `TypeId` tinyint(3) unsigned NOT NULL; +ALTER TABLE `page_text` CHANGE `WDBVerified` `WDBVerified` smallint(6) NULL DEFAULT '1'; +ALTER TABLE `pet_name_generation` CHANGE `half` `half` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `pickpocketing_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `player_factionchange_achievement` CHANGE `alliance_id` `alliance_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_achievement` CHANGE `horde_id` `horde_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_items` CHANGE `race_A` `race_A` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_items` CHANGE `alliance_id` `alliance_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_items` CHANGE `race_H` `race_H` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_items` CHANGE `horde_id` `horde_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_reputations` CHANGE `alliance_id` `alliance_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_reputations` CHANGE `horde_id` `horde_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_spells` CHANGE `alliance_id` `alliance_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_factionchange_spells` CHANGE `horde_id` `horde_id` int(10) unsigned NOT NULL; -- also changed to unsigned +ALTER TABLE `player_xp_for_level` CHANGE `lvl` `lvl` tinyint(3) unsigned NOT NULL; -- also changed from int to tinyint +ALTER TABLE `playercreateinfo_action` CHANGE `action` `action` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `playercreateinfo_item` CHANGE `amount` `amount` tinyint(4) NOT NULL DEFAULT '1'; +ALTER TABLE `playercreateinfo_spell_custom` DROP `Active`; -- delete field, it's not used anywhere +ALTER TABLE `prospecting_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `quest_poi` CHANGE `objIndex` `objIndex` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_poi_points` CHANGE `x` `x` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_poi_points` CHANGE `y` `y` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredFactionValue1` `RequiredFactionValue1` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredFactionValue2` `RequiredFactionValue2` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredMinRepValue` `RequiredMinRepValue` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredMinRepValue` `RequiredMinRepValue` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredMaxRepValue` `RequiredMaxRepValue` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `PrevQuestId` `PrevQuestId` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `NextQuestId` `NextQuestId` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `ExclusiveGroup` `ExclusiveGroup` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardSpellCast` `RewardSpellCast` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardHonor` `RewardHonor` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardXPId` `RewardXPId` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueId1` `RewardFactionValueId1` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueId2` `RewardFactionValueId2` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueId3` `RewardFactionValueId3` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueId4` `RewardFactionValueId4` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueId5` `RewardFactionValueId5` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueIdOverride1` `RewardFactionValueIdOverride1` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueIdOverride2` `RewardFactionValueIdOverride2` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueIdOverride3` `RewardFactionValueIdOverride3` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueIdOverride4` `RewardFactionValueIdOverride4` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RewardFactionValueIdOverride5` `RewardFactionValueIdOverride5` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredNpcOrGo1` `RequiredNpcOrGo1` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredNpcOrGo2` `RequiredNpcOrGo2` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredNpcOrGo3` `RequiredNpcOrGo3` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `RequiredNpcOrGo4` `RequiredNpcOrGo4` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `Unknown0` `Unknown0` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `DetailsEmoteDelay1` `DetailsEmoteDelay1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `DetailsEmoteDelay2` `DetailsEmoteDelay2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `DetailsEmoteDelay3` `DetailsEmoteDelay3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `DetailsEmoteDelay4` `DetailsEmoteDelay4` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `OfferRewardEmoteDelay1` `OfferRewardEmoteDelay1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `OfferRewardEmoteDelay2` `OfferRewardEmoteDelay2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `OfferRewardEmoteDelay3` `OfferRewardEmoteDelay3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `OfferRewardEmoteDelay4` `OfferRewardEmoteDelay4` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `quest_template` CHANGE `WDBVerified` `WDBVerified` smallint(6) NOT NULL DEFAULT '1'; diff --git a/sql/old/3.3.5a/2012_03_27_03_world_misc.sql b/sql/old/3.3.5a/2012_03_27_03_world_misc.sql new file mode 100644 index 00000000000..aba847dbc3f --- /dev/null +++ b/sql/old/3.3.5a/2012_03_27_03_world_misc.sql @@ -0,0 +1,59 @@ +ALTER TABLE `reference_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `reputation_spillover_template` CHANGE `faction` `faction` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'faction entry'; +ALTER TABLE `reputation_spillover_template` CHANGE `faction1` `faction1` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'faction to give spillover for'; +ALTER TABLE `reputation_spillover_template` CHANGE `faction2` `faction2` smallint(5) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `reputation_spillover_template` CHANGE `faction3` `faction3` smallint(5) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `reputation_spillover_template` CHANGE `faction4` `faction4` smallint(5) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `skinning_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `spell_area` CHANGE `quest_start_active` `quest_start_active` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_area` CHANGE `gender` `gender` tinyint(3) unsigned NOT NULL DEFAULT '2'; +ALTER TABLE `spell_area` CHANGE `autocast` `autocast` tinyint(3) unsigned NOT NULL DEFAULT '0'; +-- All the fields in spell_dbc where changed to full int32 since the DBC structure is used +ALTER TABLE `spell_dbc` CHANGE `Dispel` `Dispel` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `Mechanic` `Mechanic` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `CastingTimeIndex` `CastingTimeIndex` int(10) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `spell_dbc` CHANGE `DurationIndex` `DurationIndex` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `ProcChance` `ProcChance` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `ProcCharges` `ProcCharges` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `BaseLevel` `BaseLevel` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `MaxLevel` `MaxLevel` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `SpellLevel` `SpellLevel` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `RangeIndex` `RangeIndex` int(10) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `spell_dbc` CHANGE `Effect1` `Effect1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `Effect2` `Effect2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `Effect3` `Effect3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectMechanic1` `EffectMechanic1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectMechanic2` `EffectMechanic2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectMechanic3` `EffectMechanic3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectImplicitTargetA1` `EffectImplicitTargetA1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectImplicitTargetA2` `EffectImplicitTargetA2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectImplicitTargetA3` `EffectImplicitTargetA3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectImplicitTargetB1` `EffectImplicitTargetB1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectImplicitTargetB2` `EffectImplicitTargetB2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectImplicitTargetB3` `EffectImplicitTargetB3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectRadiusIndex1` `EffectRadiusIndex1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectRadiusIndex2` `EffectRadiusIndex2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectRadiusIndex3` `EffectRadiusIndex3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectApplyAuraName1` `EffectApplyAuraName1` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectApplyAuraName2` `EffectApplyAuraName2` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `EffectApplyAuraName3` `EffectApplyAuraName3` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `MaxTargetLevel` `MaxTargetLevel` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `SpellFamilyName` `SpellFamilyName` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `MaxAffectedTargets` `MaxAffectedTargets` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `DmgClass` `DmgClass` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_dbc` CHANGE `PreventionType` `PreventionType` int(10) unsigned NOT NULL DEFAULT '0'; +-- +ALTER TABLE `spell_group` CHANGE `id` `id` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `spell_loot_template` CHANGE `mincountOrRef` `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1'; +ALTER TABLE `spell_proc` CHANGE `spellPhaseMask` `spellPhaseMask` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `spell_proc` CHANGE `hitMask` `hitMask` int(11) NOT NULL DEFAULT '0'; +ALTER TABLE `spell_enchant_proc_data` CHANGE `procEx` `procEx` int(10) unsigned NOT NULL DEFAULT '0'; -- changed from float to int +ALTER TABLE `spell_required` CHANGE `spell_id` `spell_id` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `spell_required` CHANGE `req_spell` `req_spell` mediumint(8) NOT NULL DEFAULT '0'; +ALTER TABLE `spell_threat` CHANGE `flatMod` `flatMod` int(11) NULL DEFAULT NULL; +ALTER TABLE `vehicle_accessory` CHANGE `seat_id` `seat_id` tinyint(4) NOT NULL DEFAULT '0'; +ALTER TABLE `vehicle_accessory` CHANGE `minion` `minion` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `vehicle_template_accessory` CHANGE `seat_id` `seat_id` tinyint(4) NOT NULL DEFAULT '0'; +ALTER TABLE `vehicle_template_accessory` CHANGE `minion` `minion` tinyint(3) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `version` CHANGE `cache_id` `cache_id` int(11) NULL DEFAULT '0'; +ALTER TABLE `waypoint_data` CHANGE `move_flag` `move_flag` tinyint(4) NOT NULL DEFAULT '0'; diff --git a/sql/old/3.3.5a/2012_03_27_04_world_misc.sql b/sql/old/3.3.5a/2012_03_27_04_world_misc.sql new file mode 100644 index 00000000000..e85350476c9 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_27_04_world_misc.sql @@ -0,0 +1,3 @@ +ALTER TABLE `spell_dbc` CHANGE `StackAmount` `StackAmount` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `waypoint_data` CHANGE `action_chance` `action_chance` smallint(6) NOT NULL DEFAULT '100'; +ALTER TABLE `item_loot_template` CHANGE `maxcount` `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1'; diff --git a/sql/old/3.3.5a/2012_03_28_00_auth_account.sql b/sql/old/3.3.5a/2012_03_28_00_auth_account.sql new file mode 100644 index 00000000000..199baac5178 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_00_auth_account.sql @@ -0,0 +1,13 @@ +ALTER TABLE `account` + CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Identifier', + CHANGE `sessionkey` `sessionkey` VARCHAR(80) NOT NULL DEFAULT '', + CHANGE `v` `v` VARCHAR(64) NOT NULL DEFAULT '', + CHANGE `s` `s` VARCHAR(64) NOT NULL DEFAULT '', + CHANGE `email` `email` VARCHAR(254) NOT NULL DEFAULT '', + CHANGE `last_ip` `last_ip` VARCHAR(15) NOT NULL DEFAULT '127.0.0.1', + CHANGE `failed_logins` `failed_logins` INT(10) UNSIGNED NOT NULL DEFAULT '0', + CHANGE `online` `online` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + CHANGE `mutetime` `mutetime` BIGINT(20) NOT NULL DEFAULT '0', + CHANGE `os` `os` VARCHAR(3) NOT NULL DEFAULT '', + CHANGE `recruiter` `recruiter` INT(10) UNSIGNED NOT NULL DEFAULT '0', + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_01_auth_account_access.sql b/sql/old/3.3.5a/2012_03_28_01_auth_account_access.sql new file mode 100644 index 00000000000..456dbf6c104 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_01_auth_account_access.sql @@ -0,0 +1,3 @@ +ALTER TABLE `account_access` + CHANGE `id` `id` INT(10) UNSIGNED NOT NULL, + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_01_world_spell_bonus_data.sql b/sql/old/3.3.5a/2012_03_28_01_world_spell_bonus_data.sql new file mode 100644 index 00000000000..e150cad1c2e --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_01_world_spell_bonus_data.sql @@ -0,0 +1,2 @@ +-- Hunter Volley +UPDATE `spell_bonus_data` SET `ap_bonus`=0.0837 WHERE `entry`=42243; diff --git a/sql/old/3.3.5a/2012_03_28_02_auth_account_banned.sql b/sql/old/3.3.5a/2012_03_28_02_auth_account_banned.sql new file mode 100644 index 00000000000..917cea1a684 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_02_auth_account_banned.sql @@ -0,0 +1,4 @@ +ALTER TABLE `account_banned` + CHANGE `id` `id` INT(10) UNSIGNED DEFAULT '0' NOT NULL COMMENT 'Account id', + CHANGE `active` `active` TINYINT(3) UNSIGNED DEFAULT '1' NOT NULL, + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_03_auth_ip_banned.sql b/sql/old/3.3.5a/2012_03_28_03_auth_ip_banned.sql new file mode 100644 index 00000000000..2e754effc60 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_03_auth_ip_banned.sql @@ -0,0 +1,2 @@ +ALTER TABLE `ip_banned` + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_04_auth_logs.sql b/sql/old/3.3.5a/2012_03_28_04_auth_logs.sql new file mode 100644 index 00000000000..4c837a47ed1 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_04_auth_logs.sql @@ -0,0 +1,5 @@ +ALTER TABLE `logs` + CHANGE `time` `time` INT(10) UNSIGNED NOT NULL, + CHANGE `realm` `realm` INT(10) UNSIGNED NOT NULL, + CHANGE `type` `type` TINYINT(3) UNSIGNED NOT NULL, + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_05_auth_realmcharacters.sql b/sql/old/3.3.5a/2012_03_28_05_auth_realmcharacters.sql new file mode 100644 index 00000000000..e50b3c3f331 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_05_auth_realmcharacters.sql @@ -0,0 +1,4 @@ +ALTER TABLE `realmcharacters` + CHANGE `realmid` `realmid` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + CHANGE `acctid` `acctid` INT(10) UNSIGNED NOT NULL, + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_06_auth_realmlist.sql b/sql/old/3.3.5a/2012_03_28_06_auth_realmlist.sql new file mode 100644 index 00000000000..725702a9803 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_06_auth_realmlist.sql @@ -0,0 +1,6 @@ +ALTER TABLE `realmlist` + CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + CHANGE `address` `address` VARCHAR(15) DEFAULT '127.0.0.1' NOT NULL, + CHANGE `port` `port` SMALLINT(5) UNSIGNED DEFAULT '8085' NOT NULL, + CHANGE `gamebuild` `gamebuild` INT(10) UNSIGNED DEFAULT '12340' NOT NULL, + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_28_07_auth_uptime.sql b/sql/old/3.3.5a/2012_03_28_07_auth_uptime.sql new file mode 100644 index 00000000000..0ea4e3321df --- /dev/null +++ b/sql/old/3.3.5a/2012_03_28_07_auth_uptime.sql @@ -0,0 +1,6 @@ +ALTER TABLE `uptime` + DROP COLUMN `startstring`, + CHANGE `realmid` `realmid` INT(10) UNSIGNED NOT NULL, + CHANGE `starttime` `starttime` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + CHANGE `uptime` `uptime` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + ROW_FORMAT=DEFAULT ENGINE=INNODB; diff --git a/sql/old/3.3.5a/2012_03_30_00_world_smart_scripts.sql b/sql/old/3.3.5a/2012_03_30_00_world_smart_scripts.sql new file mode 100644 index 00000000000..3ec709d76c1 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_30_00_world_smart_scripts.sql @@ -0,0 +1,94 @@ +-- revised from Unholys original works +-- quest 12702 chicken party! +-- quest 12532 flown the coop! +-- +SET @ENTRY := 28161; -- the chicken +SET @PARTY := 12702; -- chicken party quest +SET @COOP := 12532; -- flown the coop quest +SET @LIFE := 900000; -- minutes + +-- set up required spells for the spells to work as they should +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=@ENTRY; +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(@ENTRY,39996,1,0), -- cover spell (dummy) +(@ENTRY,51037,2,0); -- creates item in players back pack + +-- set npc up to use event script +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; + +-- convert over to smart script +DELETE FROM `creature_ai_scripts` WHERE `id`=@ENTRY; -- delete old eai scripts +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,1000,1000,2000,3000,89,35,0,0,0,0,0,1,0,0,0,0,0,0,0, 'create random movement every 2-3 secs'), +(@ENTRY,0,1,0,8,0,100,0,51951,0,0,0,11,50839,0,0,0,0,0,1,0,0,0,0,0,0,0, 'when hit with net cast self stun'), +(@ENTRY,0,2,0,8,0,100,0,39996,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'force despawn @1 sec when hit with dummy spell'); + +-- Remove previous scripts that may interfere with this work +DELETE FROM `quest_start_scripts` WHERE `id` IN (@PARTY,@COOP); + +-- start script for quest chicken party (they do not all spawn at same time) +UPDATE `quest_template` SET `StartScript`=@PARTY WHERE `id`=@PARTY; -- 12072 +INSERT INTO `quest_start_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES +(@PARTY,1,10,@ENTRY,@LIFE, 0,5251.09,4413.76,-96.086,4.8714), +(@PARTY,2,10,@ENTRY,@LIFE, 0,5251.22,4419.74,-95.8995,3.58335), +(@PARTY,23,10,@ENTRY,@LIFE, 0,5257.58,4421.77,-95.9072,2.62124), +(@PARTY,4,10,@ENTRY,@LIFE,0, 5255.97,4420.37,-95.9999,0.0451326), +(@PARTY,5,10,@ENTRY,@LIFE,0, 5256.78,4420.63,-95.9957,0.320021), +(@PARTY,6,10,@ENTRY,@LIFE,0, 5257.58,4421.77,-95.9072,0.956194), +(@PARTY,27,10,@ENTRY,@LIFE,0, 5258.54,4420.49,-96.0195,0.551714), +(@PARTY,8,10,@ENTRY,@LIFE,0, 5250.67,4417.98,-95.9787,4.39231), +(@PARTY,9,10,@ENTRY,@LIFE,0, 5273.53,4430.32,-96.0241,1.0897), +(@PARTY,40,10,@ENTRY,@LIFE,0, 5158.3,4605.25,-130.988,3.7522), +(@PARTY,21,10,@ENTRY,@LIFE,0, 5164.6,4609.43,-130.427,3.70115), +(@PARTY,22,10,@ENTRY,@LIFE,0, 5169.53,4612.44,-130.817,4.05065), +(@PARTY,23,10,@ENTRY,@LIFE,0, 5188.49,4627.85,-132.485,3.60691), +(@PARTY,44,10,@ENTRY,@LIFE,0, 5203.19,4631.63,-132.611,2.849), +(@PARTY,25,10,@ENTRY,@LIFE,0, 5219.62,4632.46,-134.232,0.378917), +(@PARTY,26,10,@ENTRY,@LIFE,0, 5219.62,4632.46,-134.232,0.66166), +(@PARTY,27,10,@ENTRY,@LIFE,0, 5203.5,4595.02,-111.327,5.51542), +(@PARTY,48,10,@ENTRY,@LIFE,0, 5179.35,4558,-100.344,0.579192), +(@PARTY,29,10,@ENTRY,@LIFE,0, 5179.35,4558,-100.344,1.09756), +(@PARTY,30,10,@ENTRY,@LIFE,0, 5172.43,4533.25,-97.3836,1.15253), +(@PARTY,41,10,@ENTRY,@LIFE,0, 5186.29,4522.69,-91.0957,3.02571), +(@PARTY,32,10,@ENTRY,@LIFE,0, 5214.67,4485.22,-91.3113,2.40524), +(@PARTY,33,10,@ENTRY,@LIFE,0, 5221.85,4475.99,-96.8801,4.89495), +(@PARTY,34,10,@ENTRY,@LIFE,0, 5222.95,4438.1,-96.8062,1.6277), +(@PARTY,35,10,@ENTRY,@LIFE,0, 5224.36,4427.83,-96.9221,2.63301), +(@PARTY,36,10,@ENTRY,@LIFE,0, 5234.72,4406.44,-95.2917,0.0647549), +(@PARTY,47,10,@ENTRY,@LIFE,0, 5227.28,4407.01,-95.3888,3.79933), +(@PARTY,38,10,@ENTRY,@LIFE,0, 5227.28,4407.01,-95.3888,4.29414), +(@PARTY,39,10,@ENTRY,@LIFE,0, 5251.09,4413.76,-96.086,3.90536), +(@PARTY,40,10,@ENTRY,@LIFE,0, 5251.09,4413.76,-96.086,4.36089); + +-- start script for quest flown the coop (they do not all spawn at same time) +UPDATE `quest_template` SET `StartScript`=@COOP WHERE `id`=@COOP; -- 12532 +INSERT INTO `quest_start_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES +(@COOP,23,10,@ENTRY,@LIFE,0, 5257.58,4421.77,-95.9072,2.62124), +(@COOP,4,10,@ENTRY,@LIFE,0, 5255.97,4420.37,-95.9999,0.0451326), +(@COOP,5,10,@ENTRY,@LIFE,0, 5256.78,4420.63,-95.9957,0.320021), +(@COOP,6,10,@ENTRY,@LIFE,0, 5257.58,4421.77,-95.9072,0.956194), +(@COOP,27,10,@ENTRY,@LIFE,0, 5258.54,4420.49,-96.0195,0.551714), +(@COOP,8,10,@ENTRY,@LIFE,0, 5250.67,4417.98,-95.9787,4.39231), +(@COOP,9,10,@ENTRY,@LIFE,0, 5273.53,4430.32,-96.0241,1.0897), +(@COOP,40,10,@ENTRY,@LIFE,0, 5158.3,4605.25,-130.988,3.7522), +(@COOP,21,10,@ENTRY,@LIFE,0, 5164.6,4609.43,-130.427,3.70115), +(@COOP,22,10,@ENTRY,@LIFE,0, 5169.53,4612.44,-130.817,4.05065), +(@COOP,23,10,@ENTRY,@LIFE,0, 5188.49,4627.85,-132.485,3.60691), +(@COOP,44,10,@ENTRY,@LIFE,0, 5203.19,4631.63,-132.611,2.849), +(@COOP,25,10,@ENTRY,@LIFE,0, 5219.62,4632.46,-134.232,0.378917), +(@COOP,26,10,@ENTRY,@LIFE,0, 5219.62,4632.46,-134.232,0.66166), +(@COOP,27,10,@ENTRY,@LIFE,0, 5203.5,4595.02,-111.327,5.51542), +(@COOP,48,10,@ENTRY,@LIFE,0, 5179.35,4558,-100.344,0.579192), +(@COOP,29,10,@ENTRY,@LIFE,0, 5179.35,4558,-100.344,1.09756), +(@COOP,30,10,@ENTRY,@LIFE,0, 5172.43,4533.25,-97.3836,1.15253), +(@COOP,41,10,@ENTRY,@LIFE,0, 5186.29,4522.69,-91.0957,3.02571), +(@COOP,32,10,@ENTRY,@LIFE,0, 5214.67,4485.22,-91.3113,2.40524), +(@COOP,33,10,@ENTRY,@LIFE,0, 5221.85,4475.99,-96.8801,4.89495), +(@COOP,34,10,@ENTRY,@LIFE,0, 5222.95,4438.1,-96.8062,1.6277), +(@COOP,35,10,@ENTRY,@LIFE,0, 5224.36,4427.83,-96.9221,2.63301), +(@COOP,36,10,@ENTRY,@LIFE,0, 5234.72,4406.44,-95.2917,0.0647549), +(@COOP,47,10,@ENTRY,@LIFE,0, 5227.28,4407.01,-95.3888,3.79933), +(@COOP,38,10,@ENTRY,@LIFE,0, 5227.28,4407.01,-95.3888,4.29414), +(@COOP,39,10,@ENTRY,@LIFE,0, 5251.09,4413.76,-96.086,3.90536), +(@COOP,40,10,@ENTRY,@LIFE,0, 5251.09,4413.76,-96.086,4.36089); diff --git a/sql/old/3.3.5a/2012_03_31_00_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_03_31_00_world_creature_loot_template.sql new file mode 100644 index 00000000000..a817cdccf50 --- /dev/null +++ b/sql/old/3.3.5a/2012_03_31_00_world_creature_loot_template.sql @@ -0,0 +1,191 @@ +-- ------------------------------- +-- -- The Antechamber of Ulduar -- +-- ------------------------------- +-- Creatures +SET @Brundir10 :=32857; +call `sp_get_npc_diffentry`(@Brundir10,1,@Brundir25); -- Get 25man id using procedure +SET @Molgeim10 :=32927; +call `sp_get_npc_diffentry`(@Molgeim10,1,@Molgeim25); -- Get 25man id using procedure +SET @Steelbreaker10 :=32867; +call `sp_get_npc_diffentry`(@Steelbreaker10,1,@Steelbreaker25); -- Get 25man id using procedure +SET @Auriaya10 :=33515; +call `sp_get_npc_diffentry`(@Auriaya10,1,@Auriaya25); -- Get 25man id using procedure +-- Gameobjects +SET @Kologarn10 := 195046; -- Cache of the Living Stone 10man +CALL `sp_get_go_lootid`(@Kologarn10,@CacheLivingStone10); -- Get Lootid from data1 field using procedure +SET @Kologarn25 := 195047; -- Cache of the Living Stone 25man +CALL `sp_get_go_lootid`(@Kologarn25,@CacheLivingStone25); -- Get Lootid from data1 field using procedure +-- bosses +SET @Assembly10Ref := 34359; +SET @Assembly25Ref := @Assembly10Ref+1; +SET @Kologarn10Ref := @Assembly10Ref+2; +SET @Kologarn25Ref := @Assembly10Ref+3; +SET @Auriaya10Ref := @Assembly10Ref+4; +SET @Auriaya25Ref := @Assembly10Ref+5; + +-- ------------------------------ +-- -- Reference Loot Templates -- +-- ------------------------------ +-- Delete previous templates if existing +DELETE FROM `reference_loot_template` WHERE `entry` IN (12019,34122,34123,34124,34163,34216); +-- Delete the current if existing & add +DELETE FROM `reference_loot_template` WHERE `entry` BETWEEN @Assembly10Ref AND @Assembly10Ref+5; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Assembly Of Iron 10man +(@Assembly10Ref,45322,0,1,1,1,1), -- Cloak of the Iron Council +(@Assembly10Ref,45324,0,1,1,1,1), -- Leggings of Swift Reflexes +(@Assembly10Ref,45329,0,1,1,1,1), -- Circlet of True Sight +(@Assembly10Ref,45330,0,1,1,1,1), -- Greaves of Iron Intensity +(@Assembly10Ref,45331,0,1,1,1,1), -- Rune-Etched Nightblade +(@Assembly10Ref,45332,0,1,1,1,1), -- Stormtip +(@Assembly10Ref,45333,0,1,1,1,1), -- Belt of the Iron Servant +(@Assembly10Ref,45378,0,1,1,1,1), -- Boots of the Petrified Forest +(@Assembly10Ref,45418,0,1,1,1,1), -- Lady Maye's Sapphire Ring +(@Assembly10Ref,45423,0,1,1,1,1), -- Runetouch Wristwraps +-- Assembly Of Iron 25man +(@Assembly25Ref,45233,0,1,1,1,1), -- Stormrune Edge +(@Assembly25Ref,45234,0,1,1,1,1), -- Rapture +(@Assembly25Ref,45237,0,1,1,1,1), -- Phaelia's Vestments of the Sprouting Seed +(@Assembly25Ref,45193,0,1,1,1,1), -- Insurmountable Fervor +(@Assembly25Ref,45236,0,1,1,1,1), -- Unblinking Eye +(@Assembly25Ref,45225,0,1,1,1,1), -- Steelbreaker's Embrace +(@Assembly25Ref,45240,0,1,1,1,1), -- Raiments of the Iron Council +(@Assembly25Ref,45226,0,1,1,1,1), -- Ancient Iron Heaume +(@Assembly25Ref,45235,0,1,1,1,1), -- Radiant Seal +(@Assembly25Ref,45227,0,1,1,1,1), -- Iron-studded Mantle +(@Assembly25Ref,45239,0,1,1,1,1), -- Runeshaper's Gloves +(@Assembly25Ref,45224,0,1,1,1,1), -- Drape of the Lithe +(@Assembly25Ref,45232,0,1,1,1,1), -- Runed Ironhide Boots +(@Assembly25Ref,45228,0,1,1,1,1), -- Handguards of the Enclave +(@Assembly25Ref,45238,0,1,1,1,1), -- Overload Legwraps +-- Cache of Living Stone 10man +(@Kologarn10Ref,45701,0,1,1,1,1), -- Greaves of the Earthbinder +(@Kologarn10Ref,45965,0,1,1,1,1), -- Spire of Withering Dreams +(@Kologarn10Ref,45702,0,1,1,1,1), -- Emerald Signet Ring +(@Kologarn10Ref,45696,0,1,1,1,1), -- Mark of the Unyielding +(@Kologarn10Ref,45698,0,1,1,1,1), -- Sabatons of the Iron Watcher +(@Kologarn10Ref,45697,0,1,1,1,1), -- Shoulderguards of the Solemn Watch +(@Kologarn10Ref,45703,0,2,2,1,1), -- Spark of Hope +(@Kologarn10Ref,45700,0,2,2,1,1), -- Stoneguard +(@Kologarn10Ref,45699,0,2,2,1,1), -- Pendant of the Piercing Glare +(@Kologarn10Ref,45704,0,2,2,1,1), -- Shawl of the Shattered Giant +-- Cache of Living Stone 25man +(@Kologarn25Ref,45261,0,1,1,1,1), -- Giant's Bane +(@Kologarn25Ref,45266,0,1,1,1,1), -- Malice +(@Kologarn25Ref,45274,0,1,1,1,1), -- Leggings of the Stoneweaver +(@Kologarn25Ref,45269,0,1,1,1,1), -- Unfaltering Armguards +(@Kologarn25Ref,45268,0,1,1,1,1), -- Gloves of the Pythonic Guardian +(@Kologarn25Ref,45262,0,1,1,1,1), -- Necklace of Unerring Mettle +(@Kologarn25Ref,45275,0,1,1,1,1), -- Bracers of Unleashed Magic +(@Kologarn25Ref,45272,0,1,1,1,1), -- Robes of the Umbral Brute +(@Kologarn25Ref,45267,0,1,1,1,1), -- Saronite Plated Legguards +(@Kologarn25Ref,45263,0,1,1,1,1), -- Wrathstone +(@Kologarn25Ref,45271,0,1,1,1,1), -- Ironmender +(@Kologarn25Ref,45264,0,1,1,1,1), -- Decimator's Armguards +(@Kologarn25Ref,45265,0,1,1,1,1), -- Shoulderpads of the Monolith +(@Kologarn25Ref,45273,0,1,1,1,1), -- Handwraps of Plentiful Recovery +(@Kologarn25Ref,45270,0,1,1,1,1), -- Idol of the Crying Wind +-- Auriaya 10man +(@Auriaya10Ref,45707,0,1,1,1,1), -- Shieldwall of the Breaker +(@Auriaya10Ref,45708,0,1,1,1,1), -- Archaedas' Lost Legplates +(@Auriaya10Ref,45709,0,1,1,1,1), -- Nimble Climber's Belt +(@Auriaya10Ref,45711,0,1,1,1,1), -- Ironaya's Discarded Mantle +(@Auriaya10Ref,45712,0,1,1,1,1), -- Chestplate of Titanic Fury +(@Auriaya10Ref,45713,0,1,1,1,1), -- Nurturing Touch +(@Auriaya10Ref,45832,0,1,1,1,1), -- Mantle of the Preserver +(@Auriaya10Ref,45864,0,1,1,1,1), -- Cover of the Keepers +(@Auriaya10Ref,45865,0,1,1,1,1), -- Raiments of the Corrupted +(@Auriaya10Ref,45866,0,1,1,1,1), -- Elemental Focus Stone +-- Auriaya 25man +(@Auriaya25Ref,45327,0,1,1,1,1), -- Siren's Cry +(@Auriaya25Ref,45437,0,1,1,1,1), -- Runescribed Blade +(@Auriaya25Ref,45315,0,1,1,1,1), -- Stonerender +(@Auriaya25Ref,45439,0,1,1,1,1), -- Unwavering Stare +(@Auriaya25Ref,45326,0,1,1,1,1), -- Platinum Band of the Aesir +(@Auriaya25Ref,45441,0,1,1,1,1), -- Sandals of the Ancient Keeper +(@Auriaya25Ref,45435,0,1,1,1,1), -- Cowl of the Absolute +(@Auriaya25Ref,45438,0,1,1,1,1), -- Ring of the Faithful Servant +(@Auriaya25Ref,45434,0,1,1,1,1), -- Greaves of the Rockmender +(@Auriaya25Ref,45320,0,1,1,1,1), -- Shoulderplates of the Eternal +(@Auriaya25Ref,45325,0,1,1,1,1), -- Gloves of the Stonereaper +(@Auriaya25Ref,45440,0,1,1,1,1), -- Amice of the Stoic Watch +(@Auriaya25Ref,45334,0,1,1,1,1), -- Unbreakable Chestguard +(@Auriaya25Ref,45319,0,1,1,1,1), -- Cloak of the Makers +(@Auriaya25Ref,45436,0,1,1,1,1); -- Libram of the Resolute + +-- --------------------------- +-- -- ASSIGN CREATURE LOOTS -- +-- --------------------------- +UPDATE `creature_template` SET `lootid`=`entry` WHERE `entry` IN (@Brundir10,@Molgeim10,@Steelbreaker10,@Brundir25,@Molgeim25,@Steelbreaker25,@Auriaya10,@Auriaya25); +DELETE FROM `creature_loot_template` WHERE `entry` IN (@Brundir10,@Molgeim10,@Steelbreaker10,@Brundir25,@Molgeim25,@Steelbreaker25); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- ASSEMBLY OF IRON 10-man +-- Stormcaller Brundir killed last +(@Brundir10,1,100,1,0,-@Assembly10Ref,2), -- 2 items from reference loot +(@Brundir10,47241,100,1,0,1,1), -- 1 Emblem of Triumph +-- Runemaster Molgeim killed last +(@Molgeim10,1,100,1,0,-@Assembly10Ref,2), -- 2 items from reference loot +(@Molgeim10,47241,100,1,0,2,2), -- 2 Emblem of Triumph +(@Molgeim10,45506,100,2,0,1,1), -- Archivum Data Disc +(@Molgeim10,45087,75,1,0,1,1), -- Runed Orb +-- Steelbreaker killed last +(@Steelbreaker10,1,100,1,0,-@Assembly10Ref,2), -- 2 items from reference loot +(@Steelbreaker10,47241,100,1,0,2,2), -- 2 Emblem of Triumph +(@Steelbreaker10,45087,75,1,0,1,1), -- Runed Orb +(@Steelbreaker10,45506,100,1,0,1,1), -- Archivum Data Disc for Quest +(@Steelbreaker10,25455,0,1,1,1,1), -- Belt fo the Crystal Tree +(@Steelbreaker10,45447,0,1,1,1,1), -- Watchful Eye of Fate +(@Steelbreaker10,45456,0,1,1,1,1), -- Loop of the Agile +(@Steelbreaker10,45449,0,1,1,1,1), -- The Masticator +(@Steelbreaker10,45448,0,1,1,1,1), -- Perilous Bite +-- ASSEMBLY OF IRON 25-man +-- Stormcaller Brundir killed last +(@Brundir25,1,100,1,0,-@Assembly25Ref,3), -- 3 items from reference loot +(@Brundir25,2,10,1,0,-34154,1), -- Chance on Recipe +(@Brundir25,45038,8,1,0,1,1), -- Fragment of Val'anyr +(@Brundir25,45087,75,1,0,1,1), -- Runed Orb +(@Brundir25,47241,100,1,0,1,2), -- 2 Emblems of Triumph +-- Runemaster Molgeim killed last +(@Molgeim25,1,100,1,0,-@Assembly25Ref,3), -- 3 items from reference loot +(@Molgeim25,2,10,1,0,-34154,1), -- Chance on Recipe +(@Molgeim25,45038,8,1,0,1,1), -- Fragment of Val'anyr +(@Molgeim25,45087,75,1,0,1,1), -- Runed Orb +(@Molgeim25,47241,100,1,0,2,2), -- 2 Emblems of Triumph +(@Molgeim25,45506,100,1,0,1,1), -- Archivum Data Disc +-- Steelbreaker killed last +(@Steelbreaker25,1,100,1,0,-@Assembly25Ref,3), -- 3 items from reference loot +(@Steelbreaker25,2,10,1,0,-34154,1), -- Chance on Recipe +(@Steelbreaker25,45038,18,1,0,1,1), -- Fragment of Val'anyr +(@Steelbreaker25,45087,75,1,0,2,2), -- 2x Runed Orb +(@Steelbreaker25,47241,100,1,0,2,2), -- 2 Emblems of Triumph +(@Steelbreaker25,45506,100,1,0,1,1), -- Archivum Data Disc +(@Steelbreaker25,45241,0,1,1,1,1), -- Belt of Colossal Rage +(@Steelbreaker25,45242,0,1,1,1,1), -- Drape of Mortal Downfall +(@Steelbreaker25,45607,0,1,1,1,1), -- Fang of Oblivion +(@Steelbreaker25,45244,0,1,1,1,1), -- Greaves of Swift Vengeance +(@Steelbreaker25,45243,0,1,1,1,1), -- Sapphire Amulet of Renewal +(@Steelbreaker25,45245,0,1,1,1,1); -- Shoulderpads of the Intruder + +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (@CacheLivingStone10,@CacheLivingStone25); +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- KOLOGARN 10-man +(@CacheLivingStone10,1,100,1,0,-@Kologarn10Ref,2), -- 2 items from reference loot +(@CacheLivingStone10,47241,100,1,0,1,1), -- 1 Emblem of Triumph +-- KOLOGARN 25-Man +(@CacheLivingStone25,1,100,1,0,-@Kologarn25Ref,3), -- 3 items from reference loot +(@CacheLivingStone25,2,10,1,0,-34154,1), -- Chance on Recipe +(@CacheLivingStone25,45038,8,1,0,1,1), -- Fragment of Val'anyr +(@CacheLivingStone25,45087,50,1,0,1,1), -- Runed Orb +(@CacheLivingStone25,47241,100,1,0,1,2); -- 2 Emblems of Triumph + +DELETE FROM `creature_loot_template` WHERE `entry` IN (@Auriaya10,@Auriaya25); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- AURIAYA 10-man +(@Auriaya10,1,100,1,0,-@Auriaya10Ref,2), -- 2 items from reference loot +(@Auriaya10,47241,100,1,0,1,1), -- 1 Emblem of Triumph +-- AURIAYA 25-man +(@Auriaya25,1,100,1,0,-@Auriaya25Ref,3), -- 3 items from reference loot +(@Auriaya25,2,10,1,0,-34154,1), -- Chance on Recipe +(@Auriaya25,45038,8,1,0,1,1), -- Fragment of Val'anyr +(@Auriaya25,45087,75,1,0,1,1), -- Runed Orb +(@Auriaya25,47241,100,1,0,1,2); -- 2 Emblems of Triumph diff --git a/sql/old/3.3.5a/2012_04_01_00_auth_realmlist.sql b/sql/old/3.3.5a/2012_04_01_00_auth_realmlist.sql new file mode 100644 index 00000000000..e2e1efaf993 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_00_auth_realmlist.sql @@ -0,0 +1 @@ +ALTER TABLE `realmlist` CHANGE `address` `address` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '127.0.0.1'; diff --git a/sql/old/3.3.5a/2012_04_01_00_world_creature.sql b/sql/old/3.3.5a/2012_04_01_00_world_creature.sql new file mode 100644 index 00000000000..f6a42a6ef08 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_00_world_creature.sql @@ -0,0 +1,17 @@ +-- Add missing spawns to db +DELETE FROM `creature` WHERE `guid` IN (4764,28648,40266,40267,40470,40471,40510,40516,40517,40518,40601,40602,40603,41320); +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `curhealth`) VALUES +(4764,33608,530,1,1,-2263.63,5559.49,67.0918,5.91667,180,0,9156), -- Alchemy +(28648,33609,530,1,1,-2262.64,5561.96,67.0948,5.89921,180,0,9156), -- Blacksmithing +(40266,33610,530,1,1,-2261.59,5564.54,67.095,5.93412,180,0,9156), -- Enchanting +(40267,33611,530,1,1,-2260.64,5567.08,67.092,5.93412,180,0,9156), -- Engineering +(40470,33612,530,1,1,-2264.54,5562.77,67.0939,2.79253,180,0,9156), -- Leatherworking +(40471,33613,530,1,1,-2265.57,5560.32,67.0911,2.80998,180,0,9156), -- Tailoring +(40510,33614,530,1,1,-2263.47,5565.35,67.0937,2.80998,180,0,9156), -- Jewelcrafting +(40516,33615,530,1,1,-2262.36,5567.8,67.0909,2.79253,180,0,9156), -- Inscription +(40517,33616,530,1,1,-2268.1,5563.18,67.0919,5.89921,180,0,9156), -- Herbalism +(40518,33617,530,1,1,-2266.98,5565.78,67.0927,5.89921,180,0,9156), -- Mining +(40601,33618,530,1,1,-2265.86,5568.36,67.0911,5.84685,180,0,9156), -- Skinning +(40602,33619,530,1,1,-2267.52,5569.19,67.0896,2.74017,180,0,9156), -- Cooking +(40603,33621,530,1,1,-2269.93,5564.2,67.09,2.75762,180,0,9156), -- First Aid +(41320,33623,530,1,1,-2268.81,5566.68,67.0905,2.74017,180,0,9156); -- Fishing diff --git a/sql/old/3.3.5a/2012_04_01_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_01_00_world_spell_script_names.sql new file mode 100644 index 00000000000..9d37f6ad4cb --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_00_world_spell_script_names.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_spinning_pain_spike'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(66316,'spell_spinning_pain_spike'), +(67100,'spell_spinning_pain_spike'), +(67101,'spell_spinning_pain_spike'), +(67102,'spell_spinning_pain_spike'); diff --git a/sql/old/3.3.5a/2012_04_01_01_world_creature.sql b/sql/old/3.3.5a/2012_04_01_01_world_creature.sql new file mode 100644 index 00000000000..f6dff34cfa9 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_01_world_creature.sql @@ -0,0 +1,26 @@ +-- Re-add deleted data +DELETE FROM `creature` WHERE `guid` IN (4764,28648,40266,40267,40470,40471,40510,40516,40517,40518,40601,40602,40603,41320); +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(4764,26796,576,2,1,0,0,424.547,185.962,-34.9367,4.72984,3600,0,0,1,0,0,0,0,0), +(28648,17148,530,1,1,0,0,-2910.22,6473.03,82.4898,2.49669,300,0,0,5914,0,0,0,0,0), +(40267,37671,1,1,1,0,0,1391.2,-4486.23,31.4544,3.3355,300,0,0,42,0,0,0,0,0), +(40470,37671,1,1,1,0,0,1392.66,-4481.87,31.3782,1.97284,300,0,0,42,0,0,0,0,0), +(40471,37671,1,1,1,0,0,1393.92,-4489.57,31.4737,4.93701,300,0,0,42,0,0,0,0,0); + +-- Add missing spawns to db (trainers) +DELETE FROM `creature` WHERE `guid` IN (40266,40510,40516,40517,40518,40601,40602,40603,41320,41674,41723,41775,41779,41780); +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`curhealth`) VALUES +(40266,33608,530,1,1,-2263.63,5559.49,67.0918,5.91667,180,0,1), -- Alchemy +(40510,33609,530,1,1,-2262.64,5561.96,67.0948,5.89921,180,0,1), -- Blacksmithing +(40516,33610,530,1,1,-2261.59,5564.54,67.095,5.93412,180,0,1), -- Enchanting +(40517,33611,530,1,1,-2260.64,5567.08,67.092,5.93412,180,0,1), -- Engineering +(40518,33612,530,1,1,-2264.54,5562.77,67.0939,2.79253,180,0,1), -- Leatherworking +(40601,33613,530,1,1,-2265.57,5560.32,67.0911,2.80998,180,0,1), -- Tailoring +(40602,33614,530,1,1,-2263.47,5565.35,67.0937,2.80998,180,0,1), -- Jewelcrafting +(40603,33615,530,1,1,-2262.36,5567.8,67.0909,2.79253,180,0,1), -- Inscription +(41320,33616,530,1,1,-2268.1,5563.18,67.0919,5.89921,180,0,1), -- Herbalism +(41674,33617,530,1,1,-2266.98,5565.78,67.0927,5.89921,180,0,1), -- Mining +(41723,33618,530,1,1,-2265.86,5568.36,67.0911,5.84685,180,0,1), -- Skinning +(41775,33619,530,1,1,-2267.52,5569.19,67.0896,2.74017,180,0,1), -- Cooking +(41779,33621,530,1,1,-2269.93,5564.2,67.09,2.75762,180,0,1), -- First Aid +(41780,33623,530,1,1,-2268.81,5566.68,67.0905,2.74017,180,0,1); -- Fishing diff --git a/sql/old/3.3.5a/2012_04_01_02_world_spell_group_stack_rules.sql b/sql/old/3.3.5a/2012_04_01_02_world_spell_group_stack_rules.sql new file mode 100644 index 00000000000..d42afd1d955 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_02_world_spell_group_stack_rules.sql @@ -0,0 +1,9 @@ +-- Greater Blessing of Wisdom and Mana Spring Totem should not stack (hotfix) +SET @GROUP := 1117; +DELETE FROM `spell_group` WHERE id=@GROUP; +INSERT INTO `spell_group`(`id`,`spell_id`) VALUES +(@GROUP,25894), -- Greater Blessing of Wisdom +(@GROUP,5677); -- Mana Spring (cast by Mana Spring Totem) +DELETE FROM `spell_group_stack_rules` WHERE `group_id`=@GROUP; +INSERT INTO `spell_group_stack_rules`(`group_id`,`stack_rule`) VALUES +(@GROUP,3); -- Make them SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT diff --git a/sql/old/3.3.5a/2012_04_01_03_world_trainers.sql b/sql/old/3.3.5a/2012_04_01_03_world_trainers.sql new file mode 100644 index 00000000000..1edc9ae09af --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_03_world_trainers.sql @@ -0,0 +1,83 @@ +-- Template updates +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33608; -- Alchemy +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16/*80*/,`trainer_type`=2 WHERE `entry`=33609; -- Blacksmithing +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33610; -- Enchanting +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33611; -- Engineering +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33612; -- Leatherworking +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16 WHERE `entry`=33613; -- Tailoring +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33614; -- Jewelcrafting +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33616; -- Herbalism +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33618; -- Skinning (guessed) +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33617; -- Mining (guessed) +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16 WHERE `entry`=33619; -- Cooking (guessed) +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16 WHERE `entry`=33621; -- First Aid (guessed) +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33615; -- Inscription (guessed) +UPDATE `creature_template` SET `faction_A`=1744,`faction_H`=1744,`npcflag`=`npcflag`|16,`trainer_type`=2 WHERE `entry`=33623; -- Fishing (guessed) + +-- Model data +UPDATE `creature_model_info` SET `bounding_radius`=0.11,`combat_reach`=0,`gender`=2 WHERE `modelid`=28738; -- shared by many +UPDATE `creature_model_info` SET `bounding_radius`=0.14,`combat_reach`=0,`gender`=2 WHERE `modelid`=28758; -- shared by many + +-- Addon data +DELETE FROM `creature_template_addon` WHERE `entry` IN (33608,33609,33610,33611,33612,33613,33614,33616,33618,33617,33619,33621,33615,33623); +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(33608,0,0,1,0, NULL), -- Alchemy +(33609,0,0,1,0, NULL), -- Blacksmithing +(33610,0,0,1,0, NULL), -- Enchanting +(33611,0,0,1,0, NULL), -- Engineering +(33612,0,0,1,0, NULL), -- Leatherworking +(33613,0,0,1,0, NULL), -- Tailoring +(33614,0,0,1,0, NULL), -- Jewelcrafting +(33616,0,0,1,0, NULL), -- Herbalism +(33618,0,0,1,0, NULL), -- Skinning (guessed) +(33617,0,0,1,0, NULL), -- Mining (guessed) +(33619,0,0,1,0, NULL), -- Cooking (guessed) +(33621,0,0,1,0, NULL), -- First Aid (guessed) +(33615,0,0,1,0, NULL), -- Inscription (guessed) +(33623,0,0,1,0, NULL); -- Fishing (guessed) + +-- Trainer spells +DELETE FROM `npc_trainer` WHERE `entry` IN (33608,33609,33610,33611,33612,33613,33614,33616,33618,33617,33619,33621,33615,33623); +INSERT INTO `npc_trainer` (`entry`, `spell`, `spellcost`, `reqskill`, `reqskillvalue`, `reqlevel`) VALUES +(33608, -201001, 0, 0, 0, 0), -- Alchemy +(33608, -201002, 0, 0, 0, 0), -- Alchemy +(33608, -201003, 0, 0, 0, 0), -- Alchemy +(33609, -201004, 0, 0, 0, 0), -- Blacksmithing +(33609, -201005, 0, 0, 0, 0), -- Blacksmithing +(33609, -201006, 0, 0, 0, 0), -- Blacksmithing +(33610, -201009, 0, 0, 0, 0), -- Enchanting +(33610, -201010, 0, 0, 0, 0), -- Enchanting +(33610, -201011, 0, 0, 0, 0), -- Enchanting +(33611, -201012, 0, 0, 0, 0), -- Engineering +(33611, -201013, 0, 0, 0, 0), -- Engineering +(33611, -201014, 0, 0, 0, 0), -- Engineering +(33612, -201027, 0, 0, 0, 0), -- Leatherworking +(33612, -201028, 0, 0, 0, 0), -- Leatherworking +(33612, -201029, 0, 0, 0, 0), -- Leatherworking +(33613, -201039, 0, 0, 0, 0), -- Tailoring +(33613, -201040, 0, 0, 0, 0), -- Tailoring +(33613, -201041, 0, 0, 0, 0), -- Tailoring +(33614, -201024, 0, 0, 0, 0), -- Jewelcrafting +(33614, -201025, 0, 0, 0, 0), -- Jewelcrafting +(33614, -201026, 0, 0, 0, 0), -- Jewelcrafting +(33616, -201018, 0, 0, 0, 0), -- Herbalism +(33616, -201019, 0, 0, 0, 0), -- Herbalism +(33616, -201020, 0, 0, 0, 0), -- Herbalism +(33618, -201036, 0, 0, 0, 0), -- Skinning +(33618, -201037, 0, 0, 0, 0), -- Skinning +(33618, -201038, 0, 0, 0, 0), -- Skinning +(33617, -201033, 0, 0, 0, 0), -- Mining +(33617, -201034, 0, 0, 0, 0), -- Mining +(33617, -201035, 0, 0, 0, 0), -- Mining +(33619, -202004, 0, 0, 0, 0), -- Cooking +(33619, -202005, 0, 0, 0, 0), -- Cooking +(33619, -202006, 0, 0, 0, 0), -- Cooking +(33621, -202007, 0, 0, 0, 0), -- First Aid +(33621, -202008, 0, 0, 0, 0), -- First Aid +(33621, -202009, 0, 0, 0, 0), -- First Aid +(33615, -201021, 0, 0, 0, 0), -- Inscription +(33615, -201022, 0, 0, 0, 0), -- Inscription +(33615, -201023, 0, 0, 0, 0), -- Inscription +(33623, -202001, 0, 0, 0, 0), -- Fishing +(33623, -202002, 0, 0, 0, 0), -- Fishing +(33623, -202003, 0, 0, 0, 0); -- Fishing diff --git a/sql/old/3.3.5a/2012_04_01_04_world_conditions.sql b/sql/old/3.3.5a/2012_04_01_04_world_conditions.sql new file mode 100644 index 00000000000..e84307e0b05 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_04_world_conditions.sql @@ -0,0 +1,5 @@ +-- Quest: Blending In (11633) +-- Spell from Cape only Appliable in City Area +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=45614; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(17,0,45614,11633,23,4125,0,0,0, '', 'Shroud of the Scourge - Temple City of En''kilah'); diff --git a/sql/old/3.3.5a/2012_04_01_05_world_creature_template.sql b/sql/old/3.3.5a/2012_04_01_05_world_creature_template.sql new file mode 100644 index 00000000000..a4d13f1513a --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_05_world_creature_template.sql @@ -0,0 +1,2 @@ +-- CREATURE_FLAG_EXTRA_NO_XP_AT_KILL +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|64 WHERE `entry`=21267; -- Mana Beast diff --git a/sql/old/3.3.5a/2012_04_01_06_world_sai.sql b/sql/old/3.3.5a/2012_04_01_06_world_sai.sql new file mode 100644 index 00000000000..9b8857da1e4 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_06_world_sai.sql @@ -0,0 +1,7 @@ +-- Fix quest 11468 - Falcon versus hawk +SET @entry := 24747; -- Fjord Hawk +UPDATE creature_template SET AIName='SmartAI' WHERE entry=@entry; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@entry AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@entry,0,0,1,8,0,100,0,44407,0,0,0,11,44408,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Fjord Hawk - On Spellhit - Cast spell on invoker'), +(@entry,0,1,0,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Fjord Hawk - On Spellhit - Despawn'); diff --git a/sql/old/3.3.5a/2012_04_01_07_world_misc.sql b/sql/old/3.3.5a/2012_04_01_07_world_misc.sql new file mode 100644 index 00000000000..346627fd88b --- /dev/null +++ b/sql/old/3.3.5a/2012_04_01_07_world_misc.sql @@ -0,0 +1,4 @@ +UPDATE `conditions` SET `ElseGroup`=0 WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=45614; -- typo fix for previous commit +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=47431; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(17,0,47431,0,23,4195,0,0,64,'','Capture Jormungar Spawn can only be used in Ice Heart Cavern'); diff --git a/sql/old/3.3.5a/2012_04_03_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_03_00_world_spell_script_names.sql new file mode 100644 index 00000000000..70f675daa20 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_03_00_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` = 36444; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(36444, 'spell_gen_wg_water'); diff --git a/sql/old/3.3.5a/2012_04_04_00_auth_realmlist.sql b/sql/old/3.3.5a/2012_04_04_00_auth_realmlist.sql new file mode 100644 index 00000000000..18f2d7b3d4c --- /dev/null +++ b/sql/old/3.3.5a/2012_04_04_00_auth_realmlist.sql @@ -0,0 +1 @@ +ALTER TABLE `realmlist` CHANGE `address` `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '127.0.0.1'; diff --git a/sql/old/3.3.5a/2012_04_04_00_world_conditions.sql b/sql/old/3.3.5a/2012_04_04_00_world_conditions.sql new file mode 100644 index 00000000000..55cab4ca730 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_04_00_world_conditions.sql @@ -0,0 +1,7 @@ +-- Will of Sartharion should only target the drakes and Sartharion +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=61254; +INSERT INTO `conditions`(`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13, 1, 61254, 0, 0, 31, 0, 3, 30449, 0, 0, 0, '', 'Will of Sartharion'), +(13, 1, 61254, 0, 1, 31, 0, 3, 30451, 0, 0, 0, '', 'Will of Sartharion'), +(13, 1, 61254, 0, 2, 31, 0, 3, 30452, 0, 0, 0, '', 'Will of Sartharion'), +(13, 1, 61254, 0, 3, 31, 0, 3, 28860, 0, 0, 0, '', 'Will of Sartharion'); diff --git a/sql/old/3.3.5a/2012_04_04_01_world_spell_dbc.sql b/sql/old/3.3.5a/2012_04_04_01_world_spell_dbc.sql new file mode 100644 index 00000000000..7eccdf811e4 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_04_01_world_spell_dbc.sql @@ -0,0 +1 @@ +UPDATE `spell_dbc` SET `EffectApplyAuraName1`=4 WHERE `Id`=56817; diff --git a/sql/old/3.3.5a/2012_04_05_00_world_gameobject_template.sql b/sql/old/3.3.5a/2012_04_05_00_world_gameobject_template.sql new file mode 100644 index 00000000000..d50c4ad8d1c --- /dev/null +++ b/sql/old/3.3.5a/2012_04_05_00_world_gameobject_template.sql @@ -0,0 +1,32 @@ +DELETE FROM `gameobject_template` WHERE `entry`=202931; +INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `data0`, `data1`, `data2`, `data3`, `data4`, `data5`, `data6`, `data7`, `data8`, `data9`, `data10`, `data11`, `data12`, `data13`, `data14`, `data15`, `data16`, `data17`, `data18`, `data19`, `data20`, `data21`, `data22`, `data23`, `size`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `WDBVerified`) VALUES +(202931, 5, 9463, 'Serpent Offering', '', '', '', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.17, 0, 0, 0, 0, 0, 0, 12340); -- -Unknown- + +UPDATE `gameobject_template` SET `questItem1`=30527, `questItem2`=30524, `questItem3`=30525, `questItem4`=30526 WHERE `entry`=184815; -- Sealed Coffin +-- UPDATE `gameobject_template` SET `data0`=2061, `WDBVerified`=12340 WHERE `entry`=151951; -- Idol Oven Fire +-- UPDATE `gameobject_template` SET `type`=5, `data3`=0, `data5`=0 WHERE `entry`=188187; -- Snow Pile +UPDATE `gameobject_template` SET `size`=0.45 WHERE `entry`=190169; -- Tiger Lily +UPDATE `gameobject_template` SET `unk1`='' WHERE `entry`=190549; -- The Zephyr +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=191300; -- Fire +UPDATE `gameobject_template` SET `displayId`=7836 WHERE `entry`=196485; -- Saronite Rock +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=126337; -- 126337 +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=126338; -- 126338 +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=126339; -- 126339 +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=126340; -- 126340 +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=126341; -- 126341 +-- UPDATE `gameobject_template` SET `data0`=2061 WHERE `entry`=126345; -- 126345 +UPDATE `gameobject_template` SET `data2`=23787, `data7`=3605, `data19`=0 WHERE `entry`=202443; -- Dedication of Honor +UPDATE `gameobject_template` SET `type`=10 WHERE `entry`=166872; -- Supply Crate +UPDATE `gameobject_template` SET `data6`=-1000 WHERE `entry`=178559; -- Larva Spewer + +/* +GameObject (Entry: 126337 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 126338 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 126339 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 126340 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 126341 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 126345 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 151951 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +GameObject (Entry: 191300 GoType: 8) have data0=2061 but SpellFocus (Id: 2061) not exist. +Gameobject (Entry: 188192 GoType: 3) have data7=188187 but GO (Entry 188187) have not GAMEOBJECT_TYPE_TRAP (6) type. +*/ diff --git a/sql/old/3.3.5a/2012_04_05_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_05_00_world_spell_script_names.sql new file mode 100644 index 00000000000..43f6760e8d6 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_05_00_world_spell_script_names.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` in (7384,7887,11584,11585); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(7384, 'spell_warr_overpower'), +(7887, 'spell_warr_overpower'), +(11584, 'spell_warr_overpower'), +(11585, 'spell_warr_overpower'); diff --git a/sql/old/3.3.5a/2012_04_05_01_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_05_01_world_spell_proc_event.sql new file mode 100644 index 00000000000..076f97b8736 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_05_01_world_spell_proc_event.sql @@ -0,0 +1,2 @@ +UPDATE `spell_proc_event` SET `SpellFamilyMask0`=0x80000000, `SpellFamilyMask1`=0 WHERE `entry`=67363; -- Fixes Libram of Veracity proc + diff --git a/sql/old/3.3.5a/2012_04_06_00_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_06_00_world_spell_proc_event.sql new file mode 100644 index 00000000000..0fba3bb46d6 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_06_00_world_spell_proc_event.sql @@ -0,0 +1 @@ +UPDATE `spell_proc_event` SET `SpellFamilyMask0`=0x10 WHERE `entry`=60132; -- Oblit/Scourge Strike Runic Power Up (T7 4s) diff --git a/sql/old/3.3.5a/2012_04_06_01_world_spell_dbc.sql b/sql/old/3.3.5a/2012_04_06_01_world_spell_dbc.sql new file mode 100644 index 00000000000..c0dc38ebf83 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_06_01_world_spell_dbc.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_dbc` WHERE `Id`=64748; -- Item - Death Knight T8 Tank 4P Bonus +INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES +(64748,1,0,384,0,0,0,0,131080,0,0,0,0,0,1,0,0,101,0,0,80,80,28,1,0,-1,0,0,6,0,0,1,0,1,'0','0','0',-11,0,-11,0,0,0,1,0,0,0,0,0,0,0,0,87,0,0,0,0,0,'0','0','0',1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777829,0,0,0,15,0,0,0,0,0,0,'1','1','1',0,32,'Item - Death Knight T8 Tank 4P Bonus'); diff --git a/sql/old/3.3.5a/2012_04_06_02_world_gameobject_template.sql b/sql/old/3.3.5a/2012_04_06_02_world_gameobject_template.sql new file mode 100644 index 00000000000..5089579998d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_06_02_world_gameobject_template.sql @@ -0,0 +1,4 @@ +-- GO required by spell 70477 - Cleanse Quel'Delar +DELETE FROM `gameobject_template` WHERE `entry`=300246; +INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `faction`, `flags`, `size`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `data0`, `data1`, `data2`, `data3`, `data4`, `data5`, `data6`, `data7`, `data8`, `data9`, `data10`, `data11`, `data12`, `data13`, `data14`, `data15`, `data16`, `data17`, `data18`, `data19`, `data20`, `data21`, `data22`, `data23`, `AIName`, `ScriptName`, `WDBVerified`) VALUES +(300246, 8, 0, 'TEMP Sunwell', '', '', '', 0, 0, 1, 0, 0, 0, 0, 0, 0, 1641, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 1); diff --git a/sql/old/3.3.5a/2012_04_06_03_world_spell_dbc.sql b/sql/old/3.3.5a/2012_04_06_03_world_spell_dbc.sql new file mode 100644 index 00000000000..90ac4ac0f51 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_06_03_world_spell_dbc.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_dbc` WHERE `Id`=64934; -- Item - Warrior T8 Protection 4P Bonus +INSERT INTO `spell_dbc`(`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES +(64934,1,0,384,0,0,0,0,131080,0,0,0,0,0,1,0,0,101,0,0,80,80,28,1,0,-1,0,0,6,0,0,1,0,1,'0','0','0',-21,0,-11,0,0,0,1,0,0,0,0,0,0,0,0,87,0,0,0,0,0,'0','0','0',126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777829,0,0,0,4,0,0,0,0,0,0,'1','1','1',0,32, 'Item - Warrior T8 Protection 4P Bonus'); diff --git a/sql/old/3.3.5a/2012_04_06_04_world_page_text.sql b/sql/old/3.3.5a/2012_04_06_04_world_page_text.sql new file mode 100644 index 00000000000..97c0d9afe2d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_06_04_world_page_text.sql @@ -0,0 +1,25 @@ +DELETE FROM `page_text` WHERE entry IN (2177,2295,2296,2297,2301,2302,2303,2308,2309,3036,3045,3046,3047,3049,3050,3051,3052,3053,3378,3544,3563,3564,3565); +INSERT INTO `page_text` (`entry`, `text`, `next_page`) VALUES +(2177, 'Valea Twinblades \nWarrior of the Scarlet Crusade\nCitizen of Alterac \nLast seen deep in the Eastern Plaguelands', 0), +(2295, 'Before the Age of Memory, the gentle Earthmother breathed upon the golden mists of dawn. Where the amber clouds came to rest, there were endless fields of flowing wheat and barley. This was the basin of her works - the great basket of life and hope.', 2296), +(2296, 'The Earthmother\'s eyes shone down upon the lands she had breathed into creation. Her right eye, An\'she (the sun), gave warmth and light to the land. Her left eye, Mu\'sha (the moon), gave peace and sleep to the stirring creatures of the dawning. Such was the power of her gaze that the Earthmother closed one dreaming eye for every turning of the sky. Thus, her loving gaze turned day into night for the first dawning of the world. $B', 2297), +(2297, 'While the right eye shone down upon the golden dawn, the Earthmother\'s gentle hands spread out across the golden plains. Wherever the shadow of her arms passed, a noble people arose from the rich soil. The Shu\'halo (the tauren) arose to give thanks and prayer to their loving mother. There, in the endless fields of dawn, the children of the earth swore themselves to her grace and vowed to bless her name until the final darkening of the world.', 0), +(2301, 'Into the brave hearts of her pure children, the Earthmother placed the love of the hunt. For the creatures of the first dawn were savage and fierce. They hid from the Earthmother, finding solace in the shadows and the wild places of the land. The Shu\'halo hunted these beasts wherever they could be found and tamed them with the Earthmother\'s blessing. ', 2302), +(2302, 'One great spirit eluded them, however. Apa\'ro (known as Malorne to the night elves), was a proud stag of snow white fur. His antlers scraped the roof of the heavens and his mighty hooves stamped out the deep places of the world. The Shu\'halo hunted Apa\'ro to the corners of the dawning world - and closed in to snare the proud stag.', 2303), +(2303, 'Seeking to escape, the great stag leapt into the sky. Yet, as his escape seemed assured, his mighty antlers tangled in the stars which held him fast. Though he kicked and struggled, Apa\'ro could not loose himself from the heavens. It was then that Mu\'sha found him as she chased her brother, An\'she, towards the dawn. Mu\'sha saw the mighty stag as he struggled and fell in love with him immediately. ', 2304), +(2308, 'As the mists of dawn faded and the Age of Memory advanced, the demigod, Cenarius, went his own way through the fields of the world. The Shu\'halo (tauren) were sorrowful at his passing and forgot much of the druidism he had taught them. As the generations passed, they forgot how to speak with the trees and the wild things of the land. The dark whispers from the deeps of the world drifted up to their ears once again.', 2309), +(2309, 'Though the children of the earth closed out the evil whisperings, a terrible curse befell their roaming tribes. Out of the black lands of the west came a horde of murderous creatures - the centaur. Cannibals and ravagers, the centaur fell upon the Shu\'halo like a plague. Though the braves and hunters fought with the Earthmother\'s blessing in their hearts, the centaur could not be defeated.', 2310), +(3544, 'You have found the wreckage of a mysterious object. Beyond the flames, you are able to make out an insignia marked "M:1815212085". You wonder what world this object must be from...', 0), +(3378, 'INVINCIBLE$B$BBeloved steed of Prince Arthas Menethil$B$BLoyal and great of heart in life, may you find peace in death.$B$BPure streams and green pastures, devoted friend.', 0), +(3565, 'Gritting his teeth, Marcus gestured as light flashed over him, restoring his strength.$B$BTavi stared anxiously as he rose to his full height, engulfing her in his shadow. He thrust his hand forward, sending a wave of righteous force through her. Eyes rolled back as she wavered for several seconds before regaining consciousness.$B$B"I\'ve recently taken the path of... retribution."$B$BThe mischievous smirk returned to her face, "Well then, this is going to be fun."$B$B', 0), +(3564, 'Marcus took both her hands in one of his as he reassured her, "It\'s fine. What is your specialization?"$B$BHer head snapped up, eyes burning with renewed life as shadowy energy channeled through her hands into Marcus, dropping him to his knees in agony.$B$B"Affliction, actually."$B', 3565), +(3563, '"Interested in some more company?" she purred as her hands weaved through a complex summoning ritual, stopping only when she felt the warmth of a new presence behind her.$B$BAll color drained from Marcus\'s face as he struggled to protest. "I... I don\'t think that\'s appropriate."$B$BConfused, Tavi turned to see what was wrong. A hideous fel hound stood ready, drooling onto the floor as it stared intently at the half-armored paladin.$B$B"No! No that\'s not what I meant." she stammered as she dispelled the hungry demon. "I\'m sorry, that\'s not really my specialization...."', 3564), +(3045, 'First Watch, Eight Bells$BWatches changed. All is well.', 3046), +(3046, 'Middle Watch, One Bell$BCedric found attempting to break into Captain\'s wine cabinet. Disciplined.', 3047), +(3047, 'Middle Watch, Two Bells$BCedric climbed rigging, became tangled and fell. Attended by ship\'s surgeon. Sent below to sober up.', 3049), +(3049, 'Middle Watch, Four Bells$BBottle of rum found in Cedric\'s pants. Disciplined.', 3050), +(3050, 'Middle Watch, Five Bells$BCedric\'s clothes found. Cedric found separately. Cedric disciplined.', 3051), +(3051, 'Middle Watch, Six Bells$BCedric singing loudly. Woke Captain. Cedric disciplined by Captain.', 3052), +(3052, 'Middle Watch, Eight Bells$BWatches changed. All quiet. Two men sent to locate Cedric.$B', 3053), +(3053, 'Morning Watch, One Bell$BFire in Captain\'s quarters. All hands roused. Throwing powder overboard. ', 0), +(3036, 'The mighty creature\'s maw opened wide, tossing bolts of icy water toward our vessel. Those terrible jaws clamped down upon the bow of our ship, tearing it from the hull. Sailors and cargo were thrown violently into the sea as the remnants of the ship disappeared beneath the waves.$B$BThe last thing I remember was flying from the broken hull, hitting the inky waters, and plunging beneath the waves. The world went dark and I thought for certain I\'d drawn my last breath. When I awoke in Theramore\'s infirmary, I knew someone had to tell our story.', 0); diff --git a/sql/old/3.3.5a/2012_04_07_00_characters_lag_reports.sql b/sql/old/3.3.5a/2012_04_07_00_characters_lag_reports.sql new file mode 100644 index 00000000000..151ace1c976 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_07_00_characters_lag_reports.sql @@ -0,0 +1,2 @@ +ALTER TABLE `lag_reports` ADD `latency` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `lag_reports` ADD `createTime` int(10) unsigned NOT NULL DEFAULT '0'; diff --git a/sql/old/3.3.5a/2012_04_07_00_world_gameobject.sql b/sql/old/3.3.5a/2012_04_07_00_world_gameobject.sql new file mode 100644 index 00000000000..c63fc753d32 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_07_00_world_gameobject.sql @@ -0,0 +1,5 @@ +UPDATE `gameobject_template` SET `faction`=54 WHERE `entry`=178164; +SET @GUID := 247; +DELETE FROM `gameobject` WHERE `guid`=@GUID; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@GUID,178164,409,1,1,736.6528,-1176.32,-118.0967,-0.6806787,0,0,0,1,120,255,1); -- Hot Coal, damage diff --git a/sql/old/3.3.5a/2012_04_07_01_world_game_event.sql b/sql/old/3.3.5a/2012_04_07_01_world_game_event.sql new file mode 100644 index 00000000000..7b74a90b49d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_07_01_world_game_event.sql @@ -0,0 +1,2 @@ +UPDATE `game_event` SET `start_time` = '2012-04-08 00:01:00' WHERE `eventEntry` =9; -- Noblegarden +UPDATE `game_event` SET `start_time` = '2012-04-29 00:01:00' WHERE `eventEntry` =10; -- Children's Week diff --git a/sql/old/3.3.5a/2012_04_07_02_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_07_02_world_spell_proc_event.sql new file mode 100644 index 00000000000..62ef49bc657 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_07_02_world_spell_proc_event.sql @@ -0,0 +1 @@ +UPDATE `spell_proc_event` SET `procFlags`=0 WHERE `entry`=70805; diff --git a/sql/old/3.3.5a/2012_04_08_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_08_00_world_spell_script_names.sql new file mode 100644 index 00000000000..ca97f419e11 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_08_00_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sindragosa_ice_tomb_dummy'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(69712,'spell_sindragosa_ice_tomb_dummy'); diff --git a/sql/old/3.3.5a/2012_04_08_01_world_creature_template.sql b/sql/old/3.3.5a/2012_04_08_01_world_creature_template.sql new file mode 100644 index 00000000000..c6665729b75 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_08_01_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Gymer +UPDATE `creature_template` SET `unit_class`=4,`spell1`=55426,`spell2`=55429,`spell3`=55516,`spell4`=55421,`VehicleId`=205 WHERE `entry`=29884; diff --git a/sql/old/3.3.5a/2012_04_08_02_world_spell_dbc.sql b/sql/old/3.3.5a/2012_04_08_02_world_spell_dbc.sql new file mode 100644 index 00000000000..5775428668d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_08_02_world_spell_dbc.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_dbc` WHERE `Id`=31934; -- Blessed Life +INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES +(31934,0,0,384,0,0,0,0,0,0,0,131072,0,0,1,0,1048576,100,1,0,0,0,21,1,0,-1,0,0,6,0,0,1,0,0,'0','0','0',-51,0,0,0,0,0,1,0,0,0,0,0,0,0,0,87,0,0,0,0,0,'0','0','0',127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'1','0','0',0,0,'Blessed Life'); diff --git a/sql/old/3.3.5a/2012_04_08_02_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_08_02_world_spell_script_names.sql new file mode 100644 index 00000000000..dd23c9ef560 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_08_02_world_spell_script_names.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sindragosa_mystic_buffet'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(70127,'spell_sindragosa_mystic_buffet'), +(72528,'spell_sindragosa_mystic_buffet'), +(72529,'spell_sindragosa_mystic_buffet'), +(72530,'spell_sindragosa_mystic_buffet'); diff --git a/sql/old/3.3.5a/2012_04_08_03_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_08_03_world_spell_script_names.sql new file mode 100644 index 00000000000..744a8bad10d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_08_03_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id`=-1064; +INSERT INTO `spell_script_names` VALUES +(-1064, 'spell_sha_chain_heal'); diff --git a/sql/old/3.3.5a/2012_04_12_00_world_creature_template.sql b/sql/old/3.3.5a/2012_04_12_00_world_creature_template.sql new file mode 100644 index 00000000000..ef4596939f5 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_12_00_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Update proper modelid for Celestial Steed (31957 is wrong) +UPDATE `creature_template` SET `modelid1`=31958,`modelid2`=0 WHERE `entry`=40625; diff --git a/sql/old/3.3.5a/2012_04_12_01_world_creature_template.sql b/sql/old/3.3.5a/2012_04_12_01_world_creature_template.sql new file mode 100644 index 00000000000..bfe7b698ae9 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_12_01_world_creature_template.sql @@ -0,0 +1,6 @@ +UPDATE `creature_template` SET `WDBVerified`=12340 WHERE `entry`=40624; -- Verified + +-- Remove temp entry 68686 and replace with wdb verified 38686 +UPDATE `creature_template` SET `difficulty_entry_3`=38686 WHERE `entry`=36950; +UPDATE `creature_template` SET `minlevel`=82,`maxlevel`=82,`exp`=2,`faction_A`=84,`faction_H`=84,`mindmg`=488,`maxdmg`=642,`attackpower`=782,`unit_flags`=32832,`dynamicflags`=8,`minrangedmg`=363,`maxrangedmg`=521,`rangedattackpower`=121 WHERE `entry`=38686; +DELETE FROM `creature_template` WHERE `entry`=68686; diff --git a/sql/old/3.3.5a/2012_04_12_02_world_spell_bonus_data.sql b/sql/old/3.3.5a/2012_04_12_02_world_spell_bonus_data.sql new file mode 100644 index 00000000000..db35f5d97ee --- /dev/null +++ b/sql/old/3.3.5a/2012_04_12_02_world_spell_bonus_data.sql @@ -0,0 +1,29 @@ +-- Druid +UPDATE `spell_bonus_data` SET `direct_bonus`=0,`dot_bonus`=0 WHERE `entry` IN (779,1822,60089); +DELETE FROM `spell_bonus_data` WHERE `entry` IN (1079,9007,22568); +INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`ap_dot_bonus`,`comments`) VALUES +(1079,0,0,-1,-1, 'Druid - Rip'), +(9007,0,0,-1,-1, 'Druid - Pounce Bleed'), +(22568,0,0,-1,-1, 'Druid - Ferocious Bite'); + +-- Hunter +UPDATE `spell_bonus_data` SET `direct_bonus`=0,`dot_bonus`=0 WHERE `entry` IN (3044,3674,53352,13812,13797,1978,42243); +UPDATE `spell_bonus_data` SET `ap_dot_bonus`=0.1 WHERE `entry`=13812; +DELETE FROM `spell_bonus_data` WHERE `entry` IN (24131,53353); +INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`ap_dot_bonus`,`comments`) VALUES +(24131,0,0,-1,-1, 'Hunter - Wyvern Sting (triggered)'), +(53353,0,0,-1,-1, 'Hunter - Chimera Shot (Serpent)'); +DELETE FROM `spell_ranks` WHERE `first_spell_id`=24131; +INSERT INTO `spell_ranks` VALUES +(24131,24131,1), +(24131,24134,2), +(24131,24135,3), +(24131,27069,4), +(24131,49009,5), +(24131,49010,6); + +-- Rogue +UPDATE `spell_bonus_data` SET `direct_bonus`=0,`dot_bonus`=0 WHERE `entry` IN (2818,2819,11353,11354,25349,26968,27187,57969,57970); + +-- Howling blast +UPDATE `spell_bonus_data` SET `ap_bonus`=0.2 WHERE `entry`=49184; diff --git a/sql/old/3.3.5a/2012_04_12_03_world_spell_bonus_data.sql b/sql/old/3.3.5a/2012_04_12_03_world_spell_bonus_data.sql new file mode 100644 index 00000000000..d2262e52e98 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_12_03_world_spell_bonus_data.sql @@ -0,0 +1,8 @@ +-- Fixes some spell power stacking exploits +DELETE FROM `spell_bonus_data` WHERE `entry` IN (44525,18798,16614,7712,13897); +INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`ap_dot_bonus`,`comments`) VALUES +(44525,0,0,-1,-1, 'Enchant Weapon - Icebreaker'), +(18798,0,0,-1,-1, 'Item - Freezing Band'), +(16614,0,0,-1,-1, 'Item - Storm Gauntlets'), +(7712,0,0,-1,-1, 'Item - Fiery Retributer | Blazefury Medallion'), +(13897,0,0,-1,-1, 'Enchant Weapon - Fiery Weapon'); diff --git a/sql/old/3.3.5a/2012_04_12_04_world_creature_template.sql b/sql/old/3.3.5a/2012_04_12_04_world_creature_template.sql new file mode 100644 index 00000000000..35664ec5198 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_12_04_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Update modelid for Invincible (with not bugged animation) +UPDATE `creature_template` SET `modelid1`=31007,`modelid2`=0,`WDBVerified`=-12340 WHERE `entry`=38545; diff --git a/sql/old/3.3.5a/2012_04_12_05_world_command.sql b/sql/old/3.3.5a/2012_04_12_05_world_command.sql new file mode 100644 index 00000000000..8eb87155cb2 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_12_05_world_command.sql @@ -0,0 +1,2 @@ +DELETE FROM `trinity_string` WHERE `entry` IN(555,556); +DELETE FROM `command` WHERE `name`='hover'; diff --git a/sql/old/3.3.5a/2012_04_13_00_world_sai.sql b/sql/old/3.3.5a/2012_04_13_00_world_sai.sql new file mode 100644 index 00000000000..0fd4bdddd9b --- /dev/null +++ b/sql/old/3.3.5a/2012_04_13_00_world_sai.sql @@ -0,0 +1,25 @@ +UPDATE `smart_scripts` SET `target_type`=`action_param6` WHERE +(`entryorguid`=369200 AND `source_type`=9 AND `id`=3) OR +(`entryorguid`=369201 AND `source_type`=9 AND `id`=3) OR +(`entryorguid`=3692 AND `source_type`=0 AND `id`=2) OR +(`entryorguid`=3692 AND `source_type`=0 AND `id`=3) OR +(`entryorguid`=3584 AND `source_type`=0 AND `id`=3) OR +(`entryorguid`=3584 AND `source_type`=0 AND `id`=4) OR +(`entryorguid`=954600 AND `source_type`=9 AND `id`=2) OR +(`entryorguid`=954600 AND `source_type`=9 AND `id`=3) OR +(`entryorguid`=7207 AND `source_type`=0 AND `id`=1) OR +(`entryorguid`=7207 AND `source_type`=0 AND `id`=2) OR +(`entryorguid`=911700 AND `source_type`=9 AND `id`=3); + +UPDATE `smart_scripts` SET `action_param6`=0 WHERE +(`entryorguid`=369200 AND `source_type`=9 AND `id`=3) OR +(`entryorguid`=369201 AND `source_type`=9 AND `id`=3) OR +(`entryorguid`=3692 AND `source_type`=0 AND `id`=2) OR +(`entryorguid`=3692 AND `source_type`=0 AND `id`=3) OR +(`entryorguid`=3584 AND `source_type`=0 AND `id`=3) OR +(`entryorguid`=3584 AND `source_type`=0 AND `id`=4) OR +(`entryorguid`=954600 AND `source_type`=9 AND `id`=2) OR +(`entryorguid`=954600 AND `source_type`=9 AND `id`=3) OR +(`entryorguid`=7207 AND `source_type`=0 AND `id`=1) OR +(`entryorguid`=7207 AND `source_type`=0 AND `id`=2) OR +(`entryorguid`=911700 AND `source_type`=9 AND `id`=3); diff --git a/sql/old/3.3.5a/2012_04_13_01_world_misc.sql b/sql/old/3.3.5a/2012_04_13_01_world_misc.sql new file mode 100644 index 00000000000..e4d04449a3f --- /dev/null +++ b/sql/old/3.3.5a/2012_04_13_01_world_misc.sql @@ -0,0 +1,219 @@ +-- Gnomish Playback Device (item 52709) Targeting condition -- by norfik closes #2169 +DELETE FROM `conditions` WHERE `SourceEntry`=74222 AND `ConditionValue2` IN (1268, 7955, 6119); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 0, 74222, 1, 31, 3, 1268, 0, 63, '', 'Gnomish Playback Device on Ozzie Togglevolt'), +(17, 0, 74222, 2, 31, 3, 7955, 0, 63, '', 'Gnomish Playback Device on Milli Featherwhistle'), +(17, 0, 74222, 3, 31, 3, 6119, 0, 63, '', 'Gnomish Playback Device on Tog Rustsprocket'); + +-- fix revenge ap coeff -- by ric101 closes #3344 +UPDATE `spell_bonus_data` SET `ap_bonus` = 0.310 WHERE `entry` = 6572; + +-- fix life seed sp coeff -- by warpten closes #4162 +DELETE FROM `spell_bonus_data` WHERE `entry`=48503; +INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`, `ap_bonus`, `ap_dot_bonus`, `comments`) VALUES +(48503,0,0,0,0, 'Druid - Living Seed Heal'); + +-- fix glyph of shadowflame proc only allow on damage. by kandera closes #3530 +UPDATE `spell_proc_event` SET `procEx` = procEx|262144 WHERE`entry` = 63310; -- Glyph of shadowflame fix + +-- Disable deprecated quests /in 2.4/ from Midsummer Festival - The Festival of Fire {A/H} by trista closes #5982 +DELETE FROM `disables` WHERE `sourceType` = 1 AND `entry` in (9367,9368); +INSERT INTO `disables` (`sourceType`,`entry`,`flags`,`params_0`,`params_1`,`comment`) VALUES +(1,9367,0,0,0,'Disable quest The Festival of Fire {A}/Deprecated after 2.4 Midsummer Festival revamp/'), +(1,9368,0,0,0,'Disable quest The Festival of Fire {H}/Deprecated after 2.4 Midsummer Festival revamp/'); + +-- fix gameobject spawn for just maces sign -- by mrsmite closes #5849 +DELETE FROM `gameobject` WHERE `guid` = 10714; +UPDATE `gameobject` SET `guid` = 10714 WHERE `guid` = 61895 AND `id` = 2157; + +-- update npc texts. by helias closes #6098 +DELETE FROM `npc_text` WHERE `ID` IN (10719,10782,10783,10787,10788,2838,9072,9110,10310,13293,13641,14089,15077,15155,15240,15412,15866,15873,15877,8663,8244,8254,8255,8282,8291,8296,8298,11093,3464,4776,4713,12130,13002,9984,12977,12978,10918,10999,10986,10991); +INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `lang0`, `prob0`, `em0_0`, `em0_1`, `em0_2`, `em0_3`, `em0_4`, `em0_5`) VALUES +(10719, '$B$BWorry not, child. Look in your pack and you will find it once more.', NULL, 0, 1, 0, 0, 0, 0, 0, 0), +(10782, 'Sayoc, da ugly orc here, teach you daggers. You want teaching in other places, you talk to Ileda in da Farstrider Square of Silvermoon or Archibald in the War Quarter of Undercity, hokay?', 'Sayoc, da ugly orc here, teach you daggers. You want teaching in other places, you talk to Ileda in da Farstrider Square of Silvermoon or Archibald in the War Quarter of Undercity, hokay?', 1, 1, 0, 0, 0, 0, 0, 0), +(10783, 'You want to punch things, yah? Talk to Sayoc right here. He teach you.', 'You want to punch things, yah? Talk to Sayoc right here. He teach you.', 1, 1, 0, 0, 0, 0, 0, 0), +(10787, 'Ileda of da blood elves, in Farstrider Square of Silvermoon, train her students in both one and two-handed swords. Archibald, da Undercity"s weapon master, also train you, mon. He in da War Quarter.', 'Ileda of da blood elves, in Farstrider Square of Silvermoon, train her students in both one and two-handed swords. Archibald, da Undercity"s weapon master, also train you, mon. He in da War Quarter.', 1, 1, 0, 0, 0, 0, 0, 0), +(10788, 'Hanashi here knows staves. If you want a sturdier instructor, go to Thunder Bluff. Ansekhwa will teach you on the lower central rise there.', '', 1, 1, 0, 0, 0, 0, 0, 0), +(2838, '', 'Sure thing, $N. Here"s another for you.', 0, 1, 0, 0, 0, 0, 0, 0), +(9072, 'A search of the corpse"s clothing and equipment reveals the insignia you need, undamaged by the battle and foul environment.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(9110, 'Say, you happen to see that arch in the lake to the west? I wonder where that goes? I should go divin" over there.', '', 0, 1, 0, 1, 0, 0, 0, 0), +(10310, 'You must be exalted with the blood elves before I will teach you a riding skill, $c.', '', 1, 1, 0, 1, 0, 0, 0, 0), +(13293, 'Please hurry, $N. I am in a great deal of pain and time is running out.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(13641, '', '', 0, 1, 0, 0, 0, 0, 0, 0), +(14089, 'I"ve got a lead on Norgannon"s keystone, which guards access to Ulduar"s archives, but the Titans divided it into two pieces and secreted them away.$B$BOne of the pieces, the keystone"s shell, is held within the Inventor"s Library on the northern coast, south of Ulduar itself. The first thing you"ll need to do is retrieve the fragments of an access disk from the library"s guardians.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(15077, 'There you are! I was beginning to think that the Sunreavers had intercepted you. Are you ready to deliver the tome to our representatives in Icecrown?', '', 0, 1, 0, 0, 0, 0, 0, 0), +(15155, 'These appear to be the remains of Thalorien Dawnseeker, the last wielder of Quel"Delar.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(15240, 'I will escort you into the Sunwell when you"re ready.', 'I will escort you into the Sunwell when you"re ready.', 0, 1, 0, 0, 0, 0, 0, 0), +(15412, 'We got the final barrier blockin" entry to Frostwing Halls down, $g lad:lass;. Only Sindragosa stands between the Lich King and divine retribution! What are ye waitin" for?!', '', 0, 1, 0, 5, 0, 0, 0, 0), +(15866, 'De Darkspears have a home again! An" we couldn"t have done it wit"out ya helpin", $N. Now, we celebrate!', '', 0, 1, 0, 1, 0, 1, 0, 0), +(15873, 'Vol"jin told me ta keep hittin" da drum till he gets back. If ya be waitin" for him, he"d be back soon to take back da Isles.$B$BJust wait here and enjoy da music!', '', 0, 1, 0, 0, 0, 0, 0, 0), +(15877, 'We require da help of allies on da islands.$B$BZen"tabra has been watching over da animals of de Islands for some time now. We"d need her help and da help of da animal creatures.$B$BBwonsamdi is a powerful loa dat controls de spirits of de dead on da islands. His blessing is crucial for our attack.$B$BOnce our allies have joined us, Zalazane and his army of mind-controlled trolls will have no chance! Then, da Echo Isles will be de Darkspears!', '', 0, 1, 0, 0, 0, 0, 0, 0), +(8663, 'Thank you for delivering that list! My leg is almost recovered enough that I"ll be able to walk back to the crash site.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(8244, 'We"ve been so wrapped up in this war, some of us forgot to make time for love.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(8254, 'You work with machines for so long, sometimes you forget about real hearts.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(8255, '', 'When you have lived as long as I, it becomes easy to forget about love for years. It is always good to be reminded.', 0, 1, 0, 0, 0, 0, 0, 0), +(8282, '', 'You look like you"ve had your heart broken. Come back when you"re not so sad.', 0, 1, 0, 25, 0, 153, 0, 0), +(8291, 'What, you don"t have a token to give me? Don"t you love me?', '', 0, 1, 0, 18, 0, 0, 0, 0), +(8296, 'It looks like you"ve already found love. You can give me a love token, but I"m not giving you anything nice. I"m waiting for someone special.', 'It looks like you"ve already found love. You can give me a love token, but I"m not giving you anything nice. I"m waiting for someone special.', 0, 1, 0, 1, 0, 0, 0, 0), +(8298, 'I"d like you better if you would apply some perfume.', 'I"d like you better if you would apply some perfume.', 0, 1, 0, 24, 0, 0, 0, 0), +(11093, 'Let"s get out of here!', '', 0, 1, 0, 5, 0, 0, 0, 0), +(3464, '', 'You do fine work, but it"s a bit rough around the edges. Don"t worry about it, it will come with practice. Speaking of which, how about we see what you"ve been working on?', 7, 1, 0, 0, 0, 0, 0, 0), +(4776, 'The battle is over, and the people of Darrowshire are saved.', '', 0, 1, 0, 0, 0, 0, 0, 0), +(4713, 'The Nightmare is finally over! Darrowshire, forgive me!', '', 0, 1, 0, 15, 0, 0, 0, 0), +(12130, '', '', 0, 1, 0, 0, 0, 0, 0, 0), +(13002, 'There ya go, mon. Try ta be more careful with this one, won"t ya?$b$bNow head down ta Drak"Zin Ruins and drink it near the pedestal!', NULL, 0, 1, 0, 0, 0, 0, 0, 0), +(9984, 'What are ye doin" here?! Get yer chatty self ta Alterac Vallery, where ye"re needed!', '', 7, 1, 1, 5, 0, 0, 0, 0), +(12977, 'Blight, Blight, Blight... that"s all I hear about around here. I miss the diversity!$b$bHere, here. You have pets, yes? Of course you do. Of course. Little pets. I have a mixture for them. It will make them ca-- ah, clever and strong creatures, yes. Yes. ', '', 1, 1, 396, 5, 0, 0, 0, 0), +(12978, 'Careful with it. It"s unstable and loses its potency quickly. Use it soon! And... preferably within eyesight, yes...', '', 1, 1, 5, 0, 0, 0, 0, 0), +(10918, 'The boy"s too stupid still to say it -- not enough crystal exposure yet -- but, he"s thankful for what you did in getting him those flasks.$B$BNow, only nine more sons to go. Gah!$B$B$B$BWant to take one of them off of our hands? We"ll sell him to you cheap.', '', 0, 1, 0, 1, 0, 5, 0, 6), +(10999, 'Friend! It"s been too long. What can we get for you?', '', 0, 1, 1, 1, 0, 0, 0, 0), +(10986, 'Our drinks should quench even the mightiest of thirsts.', '', 0, 1, 1, 396, 0, 0, 0, 0), +(10991, 'What can I say, $N? Yer the finest o" the Sha"tari Skyguard!$B$BJust don"t be lettin" that go ta yer head. I can still teach ya a thing or two, $G lad : lass;!$B$B', '', 0, 0, 0, 0, 0, 0, 0, 0); + +-- Fix Kor'kron War Rider flying by trista closes #5569 +UPDATE `creature_template` SET `inhabittype`=5,`speed_walk`=1, `speed_run`=1 WHERE `entry`=26813; + +-- Gretta the Arbiter (Storm Peaks, Brunhilldar) by mweinelt closes #5493 +-- Daily Quest Pooling +-- Source: http://www.wowwiki.com/Gretta_the_Arbiter +SET @pool_id := 354; + +DELETE FROM `pool_template` WHERE `entry` = @pool_id; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@pool_id, 1, 'Gretta the Arbiter - Daily Quests'); + +DELETE FROM `pool_quest` WHERE `entry` IN (13424, 13423, 13422, 13425); +INSERT INTO `pool_quest` (`entry`, `pool_entry`, `description`) VALUES +(13424, @pool_id, 'Back to the Pit'), +(13423, @pool_id, 'Defending Your Title'), +(13422, @pool_id, 'Maintaining Discipline'), +(13425, @pool_id, 'The Aberrations Must Die'); + +-- Pathing for Arzeth the Merciless Entry: 19354 by kiperr closes #5510 +SET @NPC := 69051; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-617.6182,`position_y`=4800.323,`position_z`=38.53064 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-546.5514,4799.893,33.83914,0,0,0,100,0), +(@PATH,2,-512.5808,4799.929,32.09928,0,0,0,100,0), +(@PATH,3,-480.9247,4799.97,28.25657,0,0,0,100,0), +(@PATH,4,-512.6269,4799.873,32.09928,0,0,0,100,0), +(@PATH,5,-542.1885,4799.724,33.71414,0,0,0,100,0), +(@PATH,6,-570.3811,4800.449,34.60215,0,0,0,100,0), +(@PATH,7,-592.3809,4800.299,35.85215,0,0,0,100,0), +(@PATH,8,-617.6182,4800.323,38.53064,0,0,0,100,0), +(@PATH,9,-659.4124,4799.819,49.09505,0,0,0,100,0), +(@PATH,10,-582.4199,4800.242,34.97715,0,0,0,100,0), +(@PATH,11,-546.5514,4799.893,33.83914,0,0,0,100,0), +(@PATH,12,-542.1885,4799.724,33.71414,0,0,0,100,0), +(@PATH,13,-570.3811,4800.449,34.60215,0,0,0,100,0), +(@PATH,14,-592.3809,4800.299,35.85215,0,0,0,100,0), +(@PATH,15,-617.6182,4800.323,38.53064,0,0,0,100,0), +(@PATH,16,-659.4124,4799.819,49.09505,0,0,0,100,0), +(@PATH,17,-512.5808,4799.929,32.09928,0,0,0,100,0), +(@PATH,18,-480.9247,4799.97,28.25657,0,0,0,100,0), +(@PATH,19,-512.6269,4799.873,32.09928,0,0,0,100,0), +(@PATH,20,-542.1885,4799.724,33.71414,0,0,0,100,0), +(@PATH,21,-570.3811,4800.449,34.60215,0,0,0,100,0), +(@PATH,22,-592.3809,4800.299,35.85215,0,0,0,100,0), +(@PATH,23,-617.6182,4800.323,38.53064,0,0,0,100,0), +(@PATH,24,-659.4124,4799.819,49.09505,0,0,0,100,0), +(@PATH,25,-582.4199,4800.242,34.97715,0,0,0,100,0), +(@PATH,26,-512.6269,4799.873,32.09928,0,0,0,100,0), +(@PATH,27,-542.1885,4799.724,33.71414,0,0,0,100,0), +(@PATH,28,-570.3811,4800.449,34.60215,0,0,0,100,0), +(@PATH,29,-592.3809,4800.299,35.85215,0,0,0,100,0), +(@PATH,30,-617.6182,4800.323,38.53064,0,0,0,100,0); + +-- Dark Portal - corrects the entry position and orientation by cdawg closes #5470 +UPDATE `areatrigger_teleport` SET `target_position_x`=-248.149292, `target_position_y`=921.874953, `target_position_z`=84.388448, `target_orientation`=1.584155 WHERE `id`=4354; + +-- Add pamphlets to mail loot by gecko32 closes #5408 +DELETE FROM `mail_loot_template` WHERE `entry` BETWEEN 224 AND 233; +INSERT INTO `mail_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `lootmode`, `groupid`, `mincountOrRef`, `maxcount`) VALUES +(224, 46875, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Elwynn Forest +(225, 46876, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Darnassus +(226, 46877, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Dun Morogh drawf +(227, 46879, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Azuremyst Isle +(228, 46878, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Dun Morogh gnome +(229, 46884, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Mulgore +(230, 46883, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Durator +(231, 46880, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Orgrimmar +(232, 46882, 100, 1, 0, 1, 1), -- Riding Training Pamphlet Eversong Woods +(233, 46881, 100, 1, 0, 1, 1); -- Riding Training Pamphlet Tirisfal Glades + +-- fix coordinates for cannoneer whessan by mosoo closes #5406 +UPDATE `creature` SET `position_x`=-2093.53, `position_y`=-3496.47, `position_z`=130.084, `orientation`=3.008 WHERE `id`=3455 LIMIT 1; + +-- fix quest requirement for the last of her kind by shlomi 1515 closes #4875 +UPDATE `quest_template` SET `PrevQuestID` = 12900 WHERE `id` = 12983; + +-- Add rep reward to ICC25 Trash by gecko32 closes #5457 +DELETE FROM `creature_onkill_reputation` WHERE `creature_id` IN (37655,38031,38057,38058,38059,38061,38062,38063,38064,38072,38073,38074,38075,38076,38098,38099,38100,38101,38102,38103,38105,38108,38110,38126,38130,38131,38132,38133,38139,38151,38219,38220,38418,38445,38446,38479,38480,38481); +INSERT INTO `creature_onkill_reputation` (`creature_id`, `RewOnKillRepFaction1`, `RewOnKillRepFaction2`, `MaxStanding1`, `IsTeamAward1`, `RewOnKillRepValue1`, `MaxStanding2`, `IsTeamAward2`, `RewOnKillRepValue2`, `TeamDependent`) VALUES +(37655, 1156, 0, 7, 0, 45, 0, 0, 0, 0), -- Decaying colossus +(38031, 1156, 0, 7, 0, 45, 0, 0, 0, 0), -- Deathbound Ward +(38057, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Servant of the throne +(38058, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Nerub'ar Broodkeeper +(38059, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Ancient Skeletal Soldier +(38061, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- The Damned +(38062, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Plague Scientist +(38063, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Vengeful Fleshreaper +(38064, 1156, 0, 7, 0, 150, 0, 0, 0, 0), -- Stinky +(38072, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Deathspeacker Attedent +(38073, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Deathspeacker Disciple +(38074, 1156, 0, 7, 0, 45, 0, 0, 0, 0), -- Deathspeacker High Preist +(38075, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Deathspeacker Servant +(38076, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Deathspeacker Zealot +(38098, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Advisor +(38099, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Archmage +(38100, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Blood Knight +(38101, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Lieutenant +(38102, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Commander +(38103, 1156, 0, 7, 0, 150, 0, 0, 0, 0), -- Precious +(38105, 1156, 0, 7, 0, 2, 0, 0, 0, 0), -- Plagued Zombie +(38108, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Blighted Abomination +(38110, 1156, 0, 7, 0, 30, 0, 0, 0, 0), -- Pustulating Horror +(38126, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Ymirjar Frostbinder +(38130, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Ymirjar Deathbringer +(38131, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Ymirjar Huntress +(38132, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Ymirjar Battle-Maiden +(38133, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Ymirjar Warlord +(38139, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Frostwarden Handler +(38151, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Frostwing Whelp +(38219, 1156, 0, 7, 0, 150, 0, 0, 0, 0), -- Spinestalker +(38220, 1156, 0, 7, 0, 150, 0, 0, 0, 0), -- Rimefang +(38418, 1156, 0, 7, 0, 45, 0, 0, 0, 0), -- Val'kyr Herald +(38445, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Spire Minion +(38446, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Frenzied Abomination +(38479, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Tactician +(38480, 1156, 0, 7, 0, 15, 0, 0, 0, 0), -- Darkfallen Noble +(38481, 1156, 0, 7, 0, 15, 0, 0, 0, 0); -- Spire Gargoyle + +-- fix procs by warpten closes #4467 for +-- Needle-Encrusted Scorpion +DELETE FROM `spell_proc_event` WHERE `entry`=71404; +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(71404,0,0,0,0,0,0,2,0,0,50); + +-- Black Magic +DELETE FROM `spell_proc_event` WHERE `entry`=59630; +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(59630,0,0,0,0,0,0,0,0,0,35); + +-- Environment Creature Hight Update by shlomi1515 closes #4043 +UPDATE `creature` SET `position_z`=558.210022 WHERE `guid` IN (85141,85143,85154,85153,85142,85151,85152,85150); +UPDATE `creature` SET `position_z`=586.302 WHERE `guid` IN (85145,85144,85146); +UPDATE `creature` SET `position_z`=586.263 WHERE `guid` IN (85147,85148,85149); + +-- fix winterskorn raider not landing by nayd closes #3899 +UPDATE `creature_template` SET `InhabitType`=`InhabitType`|1 WHERE `entry`=23665; + +-- fix head of onyxia's loot closes by kandera #3851 +UPDATE `item_template` SET `flags` = flags|4096 WHERE `entry` IN (18422,18423,49644,49643); + +-- fix visual for plagued dragonsflayer tribesman by shlomi1515 closes #3518 +DELETE FROM `creature_addon` WHERE `guid` = 97540; diff --git a/sql/old/3.3.5a/2012_04_13_02_world_misc.sql b/sql/old/3.3.5a/2012_04_13_02_world_misc.sql new file mode 100644 index 00000000000..7c71af78cd7 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_13_02_world_misc.sql @@ -0,0 +1,18 @@ +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (38308,38309,37824); -- Professor Putricide triggers +UPDATE `creature_template` SET `ScriptName`='npc_gas_cloud' WHERE `entry`=37562; -- Gas Cloud +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_putricide_ooze_summon'; +DELETE FROM `spell_target_position` WHERE `id` IN (71413,71414); +INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES +(71414,631,4335.00,3206.75,389.399,0), +(71413,631,4380.43,3206.55,389.398,0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (71615,71618,71412,71415); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`Comment`) VALUES +(13,4,71615,31,3,37690,'Putricide - Tear Gas on Slime Puddle'), +(13,1,71618,31,3,37562,'Putricide - Tear Gas on Gas Cloud'), +(13,2,71618,31,3,37697,'Putricide - Tear Gas on Volatile Ooze'), +(13,4,71618,31,3,38159,'Putricide - Tear Gas on Choking Gas Bomb'); + +UPDATE `spell_script_names` SET `ScriptName`='spell_putricide_clear_aura_effect_value' WHERE `ScriptName`='spell_putricide_clear_mutated_plague'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(71620,'spell_putricide_clear_aura_effect_value'); diff --git a/sql/old/3.3.5a/2012_04_13_03_world_bg_template.sql b/sql/old/3.3.5a/2012_04_13_03_world_bg_template.sql new file mode 100644 index 00000000000..a426d7c6831 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_13_03_world_bg_template.sql @@ -0,0 +1,7 @@ +ALTER TABLE `battleground_template` ADD `StartMaxDist` float NOT NULL DEFAULT 0 AFTER `HordeStartO`; + +UPDATE `battleground_template` SET `StartMaxDist`=200 WHERE `id`=30; -- IC +UPDATE `battleground_template` SET `StartMaxDist`=100 WHERE `id`=1; -- AV +UPDATE `battleground_template` SET `StartMaxDist`=75 WHERE `id` IN (2,3,7); -- WSG, AB, EotS + +UPDATE `battleground_template` SET `MinLvl`=1 WHERE `id`=32; diff --git a/sql/old/3.3.5a/2012_04_13_04_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_13_04_world_spell_proc_event.sql new file mode 100644 index 00000000000..3ea68187687 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_13_04_world_spell_proc_event.sql @@ -0,0 +1,4 @@ +-- Blackened Naaru Silver proc cooldown +DELETE FROM `spell_proc_event` WHERE `entry`=45355; +INSERT INTO `spell_proc_event`(`entry`,`schoolmask`,`spellfamilyname`,`spellfamilymask0`,`spellfamilymask1`,`spellfamilymask2`,`procflags`,`procex`,`ppmrate`,`customchance`,`cooldown`) VALUES +(45355,0,0,0,0,0,0,0,0,0,45); \ No newline at end of file diff --git a/sql/old/3.3.5a/2012_04_14_00_world_gameobject_loot_template.sql b/sql/old/3.3.5a/2012_04_14_00_world_gameobject_loot_template.sql new file mode 100644 index 00000000000..dea4b771068 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_14_00_world_gameobject_loot_template.sql @@ -0,0 +1,3 @@ +-- Add Bogblossom to this Bogblossom object for the druid quest (other one already contains it) +DELETE FROM `gameobject_loot_template` WHERE (`entry`=10961) AND (`item`=31950); +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES (10961,31950,-100,0,0,1,1); diff --git a/sql/old/3.3.5a/2012_04_14_01_world_gameobject_loot_template.sql b/sql/old/3.3.5a/2012_04_14_01_world_gameobject_loot_template.sql new file mode 100644 index 00000000000..a3dd0c39865 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_14_01_world_gameobject_loot_template.sql @@ -0,0 +1,11 @@ +-- Add missing gameobject_loot_templates to prevent startup errors +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (3458,3459,3460,3461,15920,16841,26878,27725); +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(3458,4594,100,0,0,1,1), -- Rockscale Cod on Feast Fish +(3459,3771,100,0,0,1,1), -- Wild Hog Shank On Feast Boar +(3460,4538,100,0,0,1,1), -- Snapvine Watermelon on Feast Fruit +(3461,1708,100,0,0,1,1), -- Sweet Nectar on Feast Goblet +(15920,17822,-100,0,0,1,1), -- Weird Map on weird object +(16841,18950,-100,0,0,1,1), -- Chambermaid Pillaclenchers Pillow on Pillaclencher's Ornate Pillow +(26878,45062,100,0,0,1,1), -- Dusty Journal on Dusty Journal (different ID) +(27725,49648,100,0,0,1,1); -- Borrowed Tabard on Clean Laundry (might need condition!) diff --git a/sql/old/3.3.5a/2012_04_14_02_world_creature_template_addon.sql b/sql/old/3.3.5a/2012_04_14_02_world_creature_template_addon.sql new file mode 100644 index 00000000000..6aaa7da383e --- /dev/null +++ b/sql/old/3.3.5a/2012_04_14_02_world_creature_template_addon.sql @@ -0,0 +1,3 @@ +UPDATE `creature_template_addon` SET `auras`='50453' WHERE `entry`=28017; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=28017; +UPDATE `creature_template` SET `ainame` = '' WHERE `entry`=28017; \ No newline at end of file diff --git a/sql/old/3.3.5a/2012_04_14_03_world_spell_bonus_data.sql b/sql/old/3.3.5a/2012_04_14_03_world_spell_bonus_data.sql new file mode 100644 index 00000000000..ee081c17078 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_14_03_world_spell_bonus_data.sql @@ -0,0 +1 @@ +UPDATE `spell_bonus_data` SET `direct_bonus`=0.8930 WHERE `entry`=51505; diff --git a/sql/old/3.3.5a/2012_04_14_04_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_14_04_world_spell_proc_event.sql new file mode 100644 index 00000000000..78a869e655a --- /dev/null +++ b/sql/old/3.3.5a/2012_04_14_04_world_spell_proc_event.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_proc_event` WHERE `entry`=53601; +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(53601, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0, 0, 6); diff --git a/sql/old/3.3.5a/2012_04_14_05_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_14_05_world_spell_proc_event.sql new file mode 100644 index 00000000000..8cb2b1d3d2b --- /dev/null +++ b/sql/old/3.3.5a/2012_04_14_05_world_spell_proc_event.sql @@ -0,0 +1 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (51486,51485,51483); diff --git a/sql/old/3.3.5a/2012_04_16_00_world_game_event.sql b/sql/old/3.3.5a/2012_04_16_00_world_game_event.sql new file mode 100644 index 00000000000..1dc3fe3ad91 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_16_00_world_game_event.sql @@ -0,0 +1,4 @@ +SET @Event = 26; -- Pilgrim's Bounty +DELETE FROM `game_event` WHERE `eventEntry`=@Event; +INSERT INTO `game_event` (`eventEntry`,`start_time`,`end_time`,`occurence`,`length`,`holiday`,`description`,`world_event`) VALUES +(@Event,'2012-11-18 01:00:00','2020-12-31 05:00:00',525600,10020,404,'Pilgrim\'s Bounty',0); diff --git a/sql/old/3.3.5a/2012_04_17_00_world_creature.sql b/sql/old/3.3.5a/2012_04_17_00_world_creature.sql new file mode 100644 index 00000000000..ebf0fb42a59 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_17_00_world_creature.sql @@ -0,0 +1,28 @@ +SET @GUID1 := 41781; +SET @GUID2 := 41783; + +DELETE FROM creature WHERE guid IN (@GUID1,@GUID2); +INSERT INTO `creature` +(`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`) +VALUES +(@GUID1 ,38453,571,1,1,3561.821,-2736.367,136.0317,0), -- Arcturis in Grizzly Hills +(@GUID2,35189,571,1,1,7101.845,-1443.734,924.2609,0.178631); -- Skoll in The Storm Peaks + +UPDATE `creature_template` SET `faction_A` = 190, `faction_H`=190 WHERE `entry` IN (38453,35189); + +SET @NPC= @GUID1*10; +-- Add pathing for Arcturis +DELETE FROM `creature_addon` WHERE `guid` = @GUID1; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@GUID1,@NPC,0,0,0,0,''); -- Add path for Acturis +-- Add waypoint data for the path: +DELETE FROM `waypoint_data` WHERE `id`=@NPC; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES +(@NPC,1,3563.499,-2737.698,137.1898), +(@NPC,2,3565.249,-2738.698,138.4398), +(@NPC,3,3566.749,-2739.948,139.9398), +(@NPC,4,3568.249,-2740.698,140.6898), +(@NPC,5,3567.839,-2741.380,141.9256), +(@NPC,6,3569.999,-2741.948,142.1898), +(@NPC,7,3570.749,-2742.448,143.1898), +(@NPC,8,3572.676,-2743.528,144.8479); diff --git a/sql/old/3.3.5a/2012_04_18_00_world_npc_spellclick_spells.sql b/sql/old/3.3.5a/2012_04_18_00_world_npc_spellclick_spells.sql new file mode 100644 index 00000000000..3bad860290b --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_00_world_npc_spellclick_spells.sql @@ -0,0 +1,2 @@ +UPDATE `npc_spellclick_spells` SET `spell_id`=57053 WHERE `npc_entry`=30066 AND `spell_id`=56678; +UPDATE `creature_template` SET `spell1`=55812 WHERE `entry`=30066; diff --git a/sql/old/3.3.5a/2012_04_18_01_world_creature.sql b/sql/old/3.3.5a/2012_04_18_01_world_creature.sql new file mode 100644 index 00000000000..e2d6bdac95b --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_01_world_creature.sql @@ -0,0 +1 @@ +UPDATE `creature` SET `spawntimesecs`=39600 WHERE `guid` IN (41781,41783); -- Set the spawntime to 11 hours for Arcturis & Skoll diff --git a/sql/old/3.3.5a/2012_04_18_02_world_reference_loot_template.sql b/sql/old/3.3.5a/2012_04_18_02_world_reference_loot_template.sql new file mode 100644 index 00000000000..4ed922060d9 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_02_world_reference_loot_template.sql @@ -0,0 +1,377 @@ +-- ---------------------- +-- -- Various Cleanups -- +-- ---------------------- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=10 AND `SourceGroup`=34105; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=4 AND `SourceGroup` IN (27081,27085,27073,26963,26955); +DELETE FROM `reference_loot_template` WHERE `entry` IN (12020,12021,12022,34105,34125,34126,34127,34128,34129,34130); +DELETE FROM `gameobject_loot_template` WHERE `entry`=10961; -- Bad Bogblossom fix was bad +UPDATE `gameobject_template` SET `data1`=26956 WHERE `entry`=194315; +-- ------------------------------- +-- -- Variables and definitions -- +-- ------------------------------- +-- Freya 10 man +SET @Freya10k0ID := 194324; -- Freyas Gift 10man ALL elders alive +SET @Freya10k1ID := 194326; -- Freyas Gift 10man killed 1 elder +SET @Freya10k2ID := 194328; -- Freyas Gift 10man killed 2 elder +SET @Freya10k3ID := 194330; -- Freyas Gift 10man killed 3 elder +-- Freya 25 man +SET @Freya25k0ID := 194325; -- Freyas Gift 25man ALL elders alive +SET @Freya25k1ID := 194327; -- Freyas Gift 25man killed 1 elder +SET @Freya25k2ID := 194329; -- Freyas Gift 25man killed 2 elder +SET @Freya25k3ID := 194331; -- Freyas Gift 25man killed 3 elder +-- Hodir +SET @Hodir10nID := 194307; -- Cache of Winter 10man +SET @Hodir10hID := 194200; -- Rare Cache of Winter 10man +SET @Hodir25nID := 194308; -- Cache of Winter 25man +SET @Hodir25hID := 194201; -- Rare Cache of Winter 25man +-- Mimiron +SET @Mimiron10nID := 194789; -- Cache of Innovations 10man +SET @Mimiron25nID := 194956; -- Cache of Innovations 25man +SET @Mimiron10hID := 194957; -- Cache of Innovation 10 man Hardmode +SET @Mimiron25hID := 194958; -- Cache of Innovation 25 man Hardmode +-- Thorim +SET @Thorim10nID := 194312; -- Cache of Storms 10man +SET @Thorim10hID := 194313; -- Cache of Storms 10 man Hardmode +SET @Thorim25nID := 194314; -- Cache of Storms 25man +SET @Thorim25hID := 194315; -- Cache of Storms 25 man Hardmode + +-- Use procedure to get Lootid from data1 field and assign it to a variable +-- Freya 10 +CALL `sp_get_go_lootid`(@Freya10k0ID,@Freya10k0); +CALL `sp_get_go_lootid`(@Freya10k1ID,@Freya10k1); +CALL `sp_get_go_lootid`(@Freya10k2ID,@Freya10k2); +CALL `sp_get_go_lootid`(@Freya10k3ID,@Freya10k3); +-- Freya 25 +CALL `sp_get_go_lootid`(@Freya25k0ID,@Freya25k0); +CALL `sp_get_go_lootid`(@Freya25k1ID,@Freya25k1); +CALL `sp_get_go_lootid`(@Freya25k2ID,@Freya25k2); +CALL `sp_get_go_lootid`(@Freya25k3ID,@Freya25k3); +-- Hodir 10 +CALL `sp_get_go_lootid`(@Hodir10nID,@Hodir10n); +CALL `sp_get_go_lootid`(@Hodir10hID,@Hodir10h); +-- Hodir 25 +CALL `sp_get_go_lootid`(@Hodir25nID,@Hodir25n); +CALL `sp_get_go_lootid`(@Hodir25hID,@Hodir25h); +-- Mimiron +CALL `sp_get_go_lootid`(@Mimiron10nID,@Mimiron10n); +CALL `sp_get_go_lootid`(@Mimiron10hID,@Mimiron10h); +CALL `sp_get_go_lootid`(@Mimiron25nID,@Mimiron25n); +CALL `sp_get_go_lootid`(@Mimiron25hID,@Mimiron25h); +-- Thorim +CALL `sp_get_go_lootid`(@Thorim10nID,@Thorim10n); +CALL `sp_get_go_lootid`(@Thorim10hID,@Thorim10h); +CALL `sp_get_go_lootid`(@Thorim25nID,@Thorim25n); +CALL `sp_get_go_lootid`(@Thorim25hID,@Thorim25h); +-- Set References +SET @Freya10Ref := 34365; +SET @Freya25Ref := @Freya10Ref+1; +SET @Hodir10Ref := @Freya10Ref+2; +SET @Hodir25Ref := @Freya10Ref+3; +SET @Mimiron10Ref := @Freya10Ref+4; +SET @Mimiron25Ref := @Freya10Ref+5; +SET @Thorim10Ref := @Freya10Ref+6; +SET @Thorim25Ref := @Freya10Ref+7; +SET @HandToken := 12026; +SET @LegToken := @HandToken+1; +SET @LegsToken := @HandToken+2; +SET @ChestToken := @HandToken+3; +SET @HeadToken := @HandToken+4; +SET @GloveToken := @HandToken+5; +SET @ShoulderToken := @HandToken+6; +SET @HelmToken := @HandToken+7; +SET @Recipe := 34154; +-- ------------------------- +-- -- Reference Templates -- +-- ------------------------- +-- Delete previous templates if existing +DELETE FROM `reference_loot_template` WHERE `entry` BETWEEN @Freya10Ref AND @Freya10Ref+7; +DELETE FROM `reference_loot_template` WHERE `entry` BETWEEN @HandToken AND @HandToken+7; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Freya 10 man +(@Freya10Ref,45934,0,1,1,1,1), -- Unraveling Reach +(@Freya10Ref,45935,0,1,1,1,1), -- Ironbark Faceguard +(@Freya10Ref,45941,0,1,1,1,1), -- Chestguard of the Lasher +(@Freya10Ref,45936,0,1,1,1,1), -- Legplates of Flourishing Resolve +(@Freya10Ref,45940,0,1,1,1,1), -- Tunic of the Limber Stalker +-- Freya 25 man +(@Freya25Ref,45483,0,1,1,1,1), -- Boots of the Servant +(@Freya25Ref,45482,0,1,1,1,1), -- Leggings of the Lifetender +(@Freya25Ref,45481,0,1,1,1,1), -- Gauntlets of Ruthless Reprisal +(@Freya25Ref,45480,0,1,1,1,1), -- Nymph Heart Charm +(@Freya25Ref,45479,0,1,1,1,1), -- The Lifebinder +-- Freya Tokens +(@HandToken,45644,0,1,1,1,1), -- Gloves of the Wayward Conqueror +(@HandToken,45645,0,1,1,1,1), -- Gloves of the Wayward Protector +(@HandToken,45646,0,1,1,1,1), -- Gloves of the Wayward Vanquisher +(@LegToken,45653,0,1,1,1,1), -- Legplates of the Wayward Conqueror +(@LegToken,45654,0,1,1,1,1), -- Legplates of the Wayward Protector +(@LegToken,45655,0,1,1,1,1), -- Legplates of the Wayward Vanquisher +-- Hodir 10 man +(@Hodir10Ref,45874,0,1,1,1,1), -- Signet of Winter +(@Hodir10Ref,45458,0,1,1,1,1), -- Stormedge +(@Hodir10Ref,45873,0,1,1,1,1), -- Winter's Frigid Embrace +(@Hodir10Ref,45872,0,1,1,1,1), -- Avalanche +(@Hodir10Ref,45454,0,1,1,1,1), -- Cowl of Icy Breaths +-- Hodir 25 man +(@Hodir25Ref,45452,0,1,1,1,1), -- Frostplate Greaves +(@Hodir25Ref,45454,0,1,1,1,1), -- Frost-Bound Chain Bracers +(@Hodir25Ref,45453,0,1,1,1,1), -- Winter's Icy Embrace +(@Hodir25Ref,45450,0,1,1,1,1), -- Northern Barrier +(@Hodir25Ref,45451,0,1,1,1,1), -- Frozen Loop +-- Hodir Tokens +(@LegsToken,45650,0,1,1,1,1), -- Leggings of the Wayward Conqueror +(@LegsToken,45651,0,1,1,1,1), -- Leggings of the Wayward Protector +(@LegsToken,45652,0,1,1,1,1), -- Leggings of the Wayward Vanquisher +(@ChestToken,45632,0,1,1,1,1), -- Breastplate of the Wayward Conqueror +(@ChestToken,45633,0,1,1,1,1), -- Breastplate of the Wayward Protector +(@ChestToken,45634,0,1,1,1,1), -- Breastplate of the Wayward Vanquisher +-- Mimiron 10 man +(@Mimiron10Ref,45974,0,1,1,1,1), -- Shoulderguards of Assimilation +(@Mimiron10Ref,45976,0,1,1,1,1), -- Static Charge Handwraps +(@Mimiron10Ref,45972,0,1,1,1,1), -- Pulse Baton +(@Mimiron10Ref,45973,0,1,1,1,1), -- Stylish Power Cape +(@Mimiron10Ref,45975,0,1,1,1,1), -- Cable of the Metrognome +-- Mimiron 25 man +(@Mimiron25Ref,45492,0,1,1,1,1), -- Malleable Steelweave Mantle +(@Mimiron25Ref,45493,0,1,1,1,1), -- Asimov's Drape +(@Mimiron25Ref,45490,0,1,1,1,1), -- Pandora's Plea +(@Mimiron25Ref,45491,0,1,1,1,1), -- Waistguard of the Creator +(@Mimiron25Ref,45489,0,1,1,1,1), -- Insanity's Grip +-- Mimiron Tokens +(@HeadToken,45647,0,1,1,1,1), -- Helm of the Wayward Conqueror +(@HeadToken,45648,0,1,1,1,1), -- Helm of the Wayward Protector +(@HeadToken,45649,0,1,1,1,1), -- Helm of the Wayward Vanquisher +(@GloveToken,45641,0,1,1,1,1), -- Gauntlets of the Wayward Conqueror +(@GloveToken,45642,0,1,1,1,1), -- Gauntlets of the Wayward Protector +(@GloveToken,45643,0,1,1,1,1), -- Gauntlets of the Wayward Vanquisher +-- Thorim 10 man +(@Thorim10Ref,45927,0,1,1,1,1), -- Handwraps of Resonance +(@Thorim10Ref,45894,0,1,1,1,1), -- Leggings of Unstable Discharge +(@Thorim10Ref,45895,0,1,1,1,1), -- Belt of the Blood Pit +(@Thorim10Ref,45893,0,1,1,1,1), -- Guise of the Midgard Serpent +(@Thorim10Ref,45892,0,1,1,1,1), -- Legacy of Thunder +-- Throim 25 man +(@Thorim25Ref,45468,0,1,1,1,1), -- Leggings of Lost Love +(@Thorim25Ref,45466,0,1,1,1,1), -- Scale of Fates +(@Thorim25Ref,45467,0,1,1,1,1), -- Belt of the Betrayed +(@Thorim25Ref,45469,0,1,1,1,1), -- Sif's Promise +(@Thorim25Ref,45463,0,1,1,1,1), -- Vulmir, the Northern Tempest +-- Thorim Tokens +(@ShoulderToken,45659,0,1,1,1,1), -- Spaulders of the Wayward Conqueror +(@ShoulderToken,45660,0,1,1,1,1), -- Spaulders of the Wayward Protector +(@ShoulderToken,45661,0,1,1,1,1), -- Spaulders of the Wayward Vanquisher +(@HelmToken,45638,0,1,1,1,1), -- Crown of the Wayward Conqueror +(@HelmToken,45639,0,1,1,1,1), -- Crown of the Wayward Protector +(@HelmToken,45640,0,1,1,1,1); -- Crown of the Wayward Vanquisher +-- ------------------------------- +-- -- Gameobject Loot Templates -- +-- ------------------------------- +-- Delete previous templates if existing +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (@Freya10k3,@Freya10k2,@Freya10k1,@Freya10k0,@Freya25k3,@Freya25k2,@Freya25k1,@Freya25k0,@Hodir10n,@Hodir10h,@Hodir25n,@Hodir25h,@Mimiron10n,@Mimiron10h,@Mimiron25n,@Mimiron25h,@Thorim10n,@Thorim10h,@Thorim25n,@Thorim25h); +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- ------------------ +-- -- Freya 10 man -- +-- ------------------ +-- Normal Mode: +(@Freya10k3,1,100,1,0,-@Freya10Ref,1), -- 1 from normal loot +(@Freya10k3,2,100,1,0,-@HandToken,1), -- 1 from tokens +(@Freya10k3,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya10k3,47241,100,1,0,1,1), -- 1x Emblem of Triumph +-- Hard Mode: 1 elder alive +(@Freya10k2,1,100,1,0,-@Freya10Ref,1), -- 1 from normal loot +(@Freya10k2,2,100,1,0,-@HandToken,1), -- 1 from tokens +(@Freya10k2,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya10k2,47241,100,1,0,2,2), -- 2x Emblem of Triumph +(@Freya10k2,45087,100,1,0,1,1), -- Runed Orb +(@Freya10k2,3,100,1,0,-34349,1), -- 1x Emblem of Triumph for Alive Elders +-- Hard Mode: 2 elders alive +(@Freya10k1,1,100,1,0,-@Freya10Ref,1), -- 1 from normal loot +(@Freya10k1,2,100,1,0,-@HandToken,1), -- 1 from tokens +(@Freya10k1,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya10k1,47241,100,1,0,3,3), -- 3x Emblem of Triumph +(@Freya10k1,45087,100,1,0,1,1), -- Runed Orb +(@Freya10k1,3,100,1,0,-@Recipe,1), -- 1 from Recipe +(@Freya10k1,4,100,1,0,-34349,2), -- 2x Emblem of Triumph for Alive Elders +-- Hard Mode: 3 elders alive +(@Freya10k0,1,100,1,0,-@Freya10Ref,1), -- 1 from normal loot +(@Freya10k0,2,100,1,0,-@HandToken,1), -- 1 from tokens +(@Freya10k0,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya10k0,47241,100,1,0,3,3), -- 3x Emblem of Triumph (self) +(@Freya10k0,45087,100,1,0,1,1), -- Runed Orb +(@Freya10k0,3,100,1,0,-@Recipe,1), -- 1 from Recipe +(@Freya10k0,45788,-100,1,0,1,1), -- Freya's Sigil 10 man QUEST ONLY +(@Freya10k0,4,100,1,0,-34349,1), -- 3x Emblem of Triumph for Alive Elders +-- 1 from Hardmode items: +(@Freya10k0,45943,0,1,1,1,1), -- Gloves of Whispering Winds +(@Freya10k0,45946,0,1,1,1,1), -- Fire Orchid Signet +(@Freya10k0,45945,0,1,1,1,1), -- Seed of Budding Carnage +(@Freya10k0,45947,0,1,1,1,1), -- Serilas, Blood Blade of Invar One-Arm +(@Freya10k0,45294,0,1,1,1,1), -- Petrified Ivy Sprig +-- ------------------ +-- -- Freya 25 man -- +-- ------------------ +-- Normal Mode: +(@Freya25k3,1,100,1,0,-@Freya25Ref,1), -- 1 from normal loot +(@Freya25k3,2,100,1,0,-@LegToken,2), -- 2 from tokens +(@Freya25k3,47241,100,1,0,1,1), -- 1x Emblem of Triumph +(@Freya25k3,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya25k3,3,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Freya25k3,45087,10,1,0,1,1), -- Chance on Runed Orb +(@Freya25k3,45083,5,1,0,1,1), -- Fragment of Val'anyr +-- Hard Mode: 1 elder alive +(@Freya25k2,1,100,1,0,-@Freya25Ref,1), -- 1 from normal loot +(@Freya25k2,2,100,1,0,-@LegToken,2), -- 2 from tokens +(@Freya25k2,47241,100,1,0,2,2), -- 2x Emblem of Triumph +(@Freya25k2,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya25k2,3,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Freya25k2,4,10,1,0,-34350,1), -- Chance on Runed Orb +(@Freya25k2,45087,100,1,0,2,2), -- 2x Runed Orb +(@Freya25k2,45083,7,1,0,1,1), -- Fragment of Val'anyr +(@Freya25k2,5,100,1,0,-34349,1), -- 1x Emblem of Triumph for Alive Elder +-- Hard Mode: 2 elders alive +(@Freya25k1,1,100,1,0,-@Freya25Ref,1), -- 1 from normal loot +(@Freya25k1,2,100,1,0,-@LegToken,2), -- 2 from tokens +(@Freya25k1,47241,100,1,0,3,3), -- 3x Emblem of Triumph +(@Freya25k1,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya25k1,3,10,1,0,-34350,1), -- Chance on Runed Orb +(@Freya25k1,45087,100,1,0,2,2), -- 2x Runed Orb +(@Freya25k1,4,100,1,0,-@Recipe,1), -- Recipe +(@Freya25k1,5,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Freya25k1,45083,9,1,0,1,1), -- Fragment of Val'anyr +(@Freya25k1,6,100,1,0,-34349,2), -- 2x Emblem of Triumph for Alive Elder +-- Hard Mode: 3 elders alive +(@Freya25k0,1,100,1,0,-@Freya25Ref,1), -- 1 from normal loot +(@Freya25k0,2,100,1,0,-@LegToken,2), -- 2 from tokens +(@Freya25k0,47241,100,1,0,3,3), -- 3x Emblem of Triumph +(@Freya25k0,46110,100,1,0,1,1), -- Alchemist's Cache +(@Freya25k0,3,10,1,0,-34350,1), -- Chance on Runed Orb +(@Freya25k0,45087,100,1,0,2,2), -- 2x Runed Orb +(@Freya25k0,4,100,1,0,-@Recipe,1), -- Recipe +(@Freya25k0,5,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Freya25k0,45814,-100,1,0,1,1), -- Freya's Sigil 25 man QUEST ONLY +(@Freya25k0,45083,20,1,0,1,1), -- Fragment of Val'anyr +(@Freya25k2,6,100,1,0,-34349,3), -- 3x Emblem of Triumph for Alive Elder +-- 1 from Hardmode items +(@Freya25k0,45484,0,1,1,1,1), -- Bladetwister +(@Freya25k0,45486,0,1,1,1,1), -- Drape of the Sullen Goddess +(@Freya25k0,45487,0,1,1,1,1), -- Handguards of Revitalization +(@Freya25k0,45488,0,1,1,1,1), -- Leggings of the Enslaved Idol +(@Freya25k0,45613,0,1,1,1,1), -- Dreambinder +(@Freya25k0,45485,0,1,1,1,1), -- Bronze Pendant of the Vanir +-- ------------------ +-- -- Hodir 10 man -- +-- ------------------ +(@Hodir10n,1,100,1,0,-@Hodir10Ref,1), -- 1x Normal Loot Item +(@Hodir10n,2,100,1,0,-@LegsToken,1), -- 1x Token +(@Hodir10n,47241,100,1,0,1,1), -- Emblem of Triumph +-- Hard mode: +(@Hodir10h,1,100,1,0,-@Hodir10Ref,1), -- 1x Normal Loot Item +(@Hodir10h,2,100,1,0,-@LegsToken,1), -- 1x Token +(@Hodir10h,47241,100,1,0,1,1), -- Emblem of Triumph +(@Hodir10h,45786,-100,1,0,1,1), -- Hodir's Sigil +-- 1 from Hardmode items +(@Hodir10h,45887,0,1,1,1,1), -- Ice Layered Barrier +(@Hodir10h,45888,0,1,1,1,1), -- Bitter Cold Armguards +(@Hodir10h,45886,0,1,1,1,1), -- Icecore Staff +(@Hodir10h,45876,0,1,1,1,1), -- Shiver +(@Hodir10h,45877,0,1,1,1,1), -- The Boreal Guard +-- ------------------ +-- -- Hodir 25 man -- +-- ------------------ +(@Hodir25n,1,100,1,0,-@Hodir25Ref,1), -- 1x Normal Loot Item +(@Hodir25n,2,100,1,0,-@ChestToken,1), -- 1x Token +(@Hodir25n,47241,100,1,0,1,1), -- Emblem of Triumph +(@Hodir25n,3,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Hodir25n,45087,10,1,0,1,1), -- Chance on Runed Orb +(@Hodir25n,45083,10,1,0,1,1), -- Fragment of Val'anyr +-- Hard mode: +(@Hodir25h,1,100,1,0,-@Hodir25Ref,1), -- 1x Normal Loot Item +(@Hodir25h,2,100,1,0,-@ChestToken,2), -- 2x Token +(@Hodir25h,47241,100,1,0,1,1), -- Emblem of Triumph +(@Hodir25h,45815,-100,1,0,1,1), -- Hodir's Sigil +(@Hodir25h,3,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Hodir25h,45087,10,1,0,1,1), -- Chance on Runed Orb +(@Hodir25h,45083,20,1,0,1,1), -- Fragment of Val'anyr +-- -------------------- +-- -- Mimiron 10 man -- +-- -------------------- +(@Mimiron10n,1,100,1,0,-@Mimiron10Ref,1), -- 1x Normal Loot Item +(@Mimiron10n,2,100,1,0,-@HeadToken,1), -- 1x Token +(@Mimiron10n,47241,100,1,0,1,1), -- 1x Emblem of Triumph +-- Hardmode 10 man +(@Mimiron10h,1,100,1,0,-@Mimiron10Ref,1), -- 1x Normal Loot Item +(@Mimiron10h,2,100,1,0,-@HeadToken,1), -- 1x Token +(@Mimiron10h,47241,100,1,0,1,1), -- 1x Emblem of Triumph +(@Mimiron10h,45787,-100,1,0,1,1), -- Mimiron's Sigel (QUEST ONLY, HARDMODE ONLY) +-- 1 from Hardmode items +(@Mimiron10h,45989,0,1,1,1,1), -- Tempered Mercury Greaves +(@Mimiron10h,45982,0,1,1,1,1), -- Fused Alloy Legplates +(@Mimiron10h,45993,0,1,1,1,1), -- Mimiron's Flight Goggles +(@Mimiron10h,45988,0,1,1,1,1), -- Greaves of the Iron Army +(@Mimiron10h,45990,0,1,1,1,1), -- Fusion Blade +-- -------------------- +-- -- Mimiron 25 man -- +-- -------------------- +(@Mimiron25n,1,100,1,0,-@Mimiron25Ref,1), -- 1x Normal Loot Item +(@Mimiron25n,2,100,1,0,-@GloveToken,2), -- 2x Token +(@Mimiron25n,47241,100,1,0,1,1), -- 1x Emblem of Triumph +(@Mimiron25n,3,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Mimiron25n,45087,10,1,0,1,1), -- Chance on Runed Orb +(@Mimiron25n,45083,8,1,0,1,1), -- Fragment of Val'anyr Normal +-- Hard Mode 25 man +(@Mimiron25h,1,100,1,0,-@Mimiron25Ref,1), -- 1x Normal Loot Item +(@Mimiron25h,2,100,1,0,-@GloveToken,2), -- 2x Token +(@Mimiron25h,47241,100,1,0,1,1), -- 1x Emblem of Triumph +(@Mimiron25h,3,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Mimiron25h,45087,10,1,0,1,1), -- Chance on Runed Orb +(@Mimiron25h,45816,-100,1,0,1,1), -- Mimiron's Sigel (QUEST ONLY, HARDMODE ONLY) +(@Mimiron25h,45083,18,1,0,1,1), -- Fragment of Val'anyr Hardmode +-- 1 from Hardmode items +(@Mimiron25h,45496,0,1,1,1,1), -- Titanskin Cloak +(@Mimiron25h,45494,0,1,1,1,1), -- Delirium's Touch +(@Mimiron25h,45663,0,1,1,1,1), -- Armbands of Bedlam +(@Mimiron25h,45620,0,1,1,1,1), -- Starshard Edge +(@Mimiron25h,45495,0,1,1,1,1), -- Conductive Seal +(@Mimiron25h,45497,0,1,1,1,1), -- Crown of Luminescence +-- ------------------- +-- -- Thorim 10 man -- +-- ------------------- +(@Thorim10n,1,100,1,0,-@Thorim10Ref,1), -- 1x Normal Loot Item +(@Thorim10n,2,100,1,0,-@ShoulderToken,1), -- 1x Token +(@Thorim10n,47241,100,1,0,1,1), -- 1x Emblem of Triumph +-- Hardmode 10 man +(@Thorim10h,1,100,1,0,-@Thorim10Ref,1), -- 1x Normal Loot Item +(@Thorim10h,2,100,1,0,-@ShoulderToken,1), -- 1x Token +(@Thorim10h,47241,100,1,0,1,1), -- 1x Emblem of Triumph +(@Thorim10h,45784,-100,2,0,1,1), -- Thorim's Sigil (QUEST ONLY, HARDMODE ONLY) +-- 1 from Hardmode items +(@Thorim10h,45933,0,2,1,1,1), -- Pendant of the Shallow Grave +(@Thorim10h,45929,0,2,1,1,1), -- Sif's Remembrance +(@Thorim10h,45928,0,2,1,1,1), -- Gauntlets of the Thunder God +(@Thorim10h,45931,0,2,1,1,1), -- Mjolnir Runestone +(@Thorim10h,45930,0,2,1,1,1), -- Combatant's Bootblade +-- ------------------- +-- -- Thorim 25 man -- +-- ------------------- +(@Thorim25n,1,100,3,0,-@Thorim25Ref,1), -- 1x Normal Loot Item +(@Thorim25n,2,100,3,0,-@HelmToken,2), -- 2x Token +(@Thorim25n,47241,100,3,0,1,1), -- 1x Emblem of Triumph +(@Thorim25n,3,10,3,0,-@Recipe,1), -- Chance on Recipe +(@Thorim25n,45087,10,3,0,1,1), -- Chance on Runed Orb +(@Thorim25n,45083,8,1,0,1,1), -- Fragment of Val'anyr Normal +-- Hardmode 25 man +(@Thorim25h,1,100,3,0,-@Thorim25Ref,1), -- 1x Normal Loot Item +(@Thorim25h,2,100,3,0,-@HelmToken,2), -- 2x Token +(@Thorim25h,47241,100,3,0,1,1), -- 1x Emblem of Triumph +(@Thorim25h,3,10,3,0,-@Recipe,1), -- Chance on Recipe +(@Thorim25h,45087,10,3,0,1,1), -- Chance on Runed Orb +(@Thorim25h,45817,-100,1,0,1,1), -- Thorim's Sigil (QUEST ONLY, HARDMODE ONLY) +(@Thorim25h,45083,18,1,0,1,1), -- Fragment of Val'anyr Hardmode +-- 1 from Hardmode items +(@Thorim25h,45471,0,1,1,1,1), -- Fate's Clutch +(@Thorim25h,45570,0,1,1,1,1), -- Skyforge Crossbow +(@Thorim25h,45472,0,1,1,1,1), -- Warhelm of the Champion +(@Thorim25h,45474,0,1,1,1,1), -- Pauldrons of the Combatant +(@Thorim25h,45470,0,1,1,1,1), -- Wisdom's Hold +(@Thorim25h,45473,0,1,1,1,1); -- Embrace of the Gladiator + diff --git a/sql/old/3.3.5a/2012_04_18_03_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_18_03_world_creature_loot_template.sql new file mode 100644 index 00000000000..5ad26809cdf --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_03_world_creature_loot_template.sql @@ -0,0 +1,2 @@ +-- Increase dropchance for Venture Co. Explosives +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=-10 WHERE `entry` IN(28123,28124) AND `item`=39651; diff --git a/sql/old/3.3.5a/2012_04_18_04_world_pickpocketing_loot_template.sql b/sql/old/3.3.5a/2012_04_18_04_world_pickpocketing_loot_template.sql new file mode 100644 index 00000000000..ab1c562f7dd --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_04_world_pickpocketing_loot_template.sql @@ -0,0 +1,501 @@ +-- implement missing Northrend pickpocket loot +-- reference IDs +SET @NEWREF0 := 10026; +SET @NEWREF1 := @NEWREF0+1; +SET @NEWREF2 := @NEWREF0+2; +SET @NEWREF3 := @NEWREF0+3; +SET @NEWREF4 := @NEWREF0+4; +SET @NEWREF5 := @NEWREF0+5; +SET @NEWREF6 := @NEWREF0+6; +SET @NEWREF7 := @NEWREF0+7; +SET @NEWREF8 := @NEWREF0+8; +SET @NEWREF9 := @NEWREF0+9; +-- new references +DELETE FROM `reference_loot_template` WHERE entry IN (@NEWREF0, @NEWREF1, @NEWREF2, @NEWREF3, @NEWREF4, @NEWREF5, @NEWREF6, @NEWREF7, @NEWREF8, @NEWREF9); +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`mincountOrRef`,`maxcount`) VALUES +(@NEWREF0,33447,25,1,1),-- Runic Healing Potion +(@NEWREF0,35953,30,1,1),-- Mead Basted Caribou +(@NEWREF0,38260,50,1,1),-- Empty Tobacco Pouch +(@NEWREF0,43575,80,1,1),-- Reinforced Junkbox +(@NEWREF1,36862,4,1,1),-- Wrogn Troll Dice +(@NEWREF1,40202,20,1,1),-- Sizzling Grizzly Flank +(@NEWREF2,33452,30,1,1),-- Honey-Spiced Lichen +(@NEWREF2,38269,35,1,1),-- Soggy Handkerchief +(@NEWREF3,33454,15,1,1),-- Salted Venison +(@NEWREF3,38261,13,1,1),-- Ben House Key +(@NEWREF4,38263,19,1,1),-- Too-Small Amband +(@NEWREF4,38264,18,1,1),-- A Very Pretty Rock +(@NEWREF5,29448,9,1,1),-- Mag'har Mild Cheese +(@NEWREF5,29450,13,1,1),-- Telaari Grapes +(@NEWREF5,37467,40,1,1),-- A Steamy Romance Novel: Forbidden Love +(@NEWREF6,35947,25,1,1),-- Sparkling Frostcap +(@NEWREF6,38269,40,1,1),-- Soggy Handkerchief +(@NEWREF7,33447,25,1,1),-- Runic Healing Potion +(@NEWREF7,35947,25,1,1),-- Sparkling Frostcap +(@NEWREF7,38269,40,1,1),-- Soggy Handkerchief +(@NEWREF7,43575,80,1,1),-- Reinforced Junkbox +(@NEWREF8,35948,11,1,1),-- Savory Snowplum +(@NEWREF8,35950,9,1,1),-- Sweet Potato Bread +(@NEWREF8,35952,8,1,1),-- Briny Hardcheese +(@NEWREF9,33447,25,1,1),-- Runic Healing Potion +(@NEWREF9,38260,50,1,1),-- Empty Tobacco Pouch +(@NEWREF9,43575,80,1,1); -- Reinforced Junkbox +-- implement pickpokect loot +UPDATE `creature_template` SET `pickpocketloot`=entry WHERE `entry` IN (25800,23667,23674,23760,23796,23865,23875,23963,24069,24262,24400,24460,25351,25427,25428,25429,25430,25601,25801,26073,26202,26334,26413,26447,26480,26481,26620,26621,26624,26626,26635,26636,26637,26639,26658,26681,26696,26727,26729,26800,26802,26836,26948,27105,27210,27211,/**/27234,27235,27247,27278,27289,27334,27342,27431,27533,27580,27639,27640,27699,27800,27859,27860,27961,27964,27965,28494,28496,28565,28803,28837,28838,28848,28961,28965,29369,29407,29553,29554,29656,29793,29820,29822,29836,29874,29875,29885,29920,30283,30319,30856,30868,31396,31554,32263); +UPDATE `creature_template` SET `pickpocketloot`=25430 WHERE `entry` IN (23654,23656,23663,23665,25434,26728,26827,26926,27554,32572); +UPDATE `creature_template` SET `pickpocketloot`=26481 WHERE `entry` IN (23662,23940,24016,24161,26493,26655,27007,27009); +UPDATE `creature_template` SET `pickpocketloot`=25351 WHERE `entry` IN (23993,24540,25224,25383,26343,26492,26891,26946,27224,27226,27283,27360,27552,27799,27823,27826,28564,28750); +UPDATE `creature_template` SET `pickpocketloot`=27533 WHERE `entry` IN (26555,26669,26670,26694,26830,27871,28022,28108,28242,28268,28419,29123,29133,29722,29738,30701,30894,30922,30949,31139,31150,31779,31847,32278,32505); +UPDATE `creature_template` SET `pickpocketloot`=30319 WHERE `entry` IN (30111,30179); +DELETE FROM `pickpocketing_loot_template` WHERE entry IN (25800,23656,23662,23663,23665,23667,23674,23760,23796,23865,23875,23940,23963,23993,24016,24069,24161,24262,24400,24460,24540,25224,25351,25383,25427,25428,25429,25430,25434,25601,25801,26073,26202,26334,26343,26413,26447,26480,26481,26492,26493,26555,26620,26621,26624,26626,26635,26636,26637,26639,26655,26658,26669,26670,26681,26694,26696,26727,26728,26729,26800,26802,26827,26830,26836,26891,26926,26946,26948,27007,27009,27105,27210,27211,27224,27226,27234,27235,27247,27278,27283,27289,27334,27342,27360,27431,27533,27552,27554,27580,27639,27640,27699,27799,27800,27823,27826,27859,27860,27871,27961,27964,27965,28022,28108,28242,28268,28419,28494,28496,28564,28565,28750,28803,28837,28838,28848,28961,28965,29123,29133,29369,29407,29553,29554,29656,29722,29738,29793,29820,29822,29836,29874,29875,29885,29920,30111,30179,30283,30319,30701,30856,30868,30894,30922,30949,31139,31150,31396,31554,31779,31847,32263,32278,32505,32572); +INSERT INTO `pickpocketing_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Plague Walker +(30283,43575,100,0,1,1),-- Reinforced Junkbox +(30283,0,100,0,-@NEWREF6,1), +-- Twilight Darkcaster +(30319,0,100,0,-@NEWREF0,1), +(30319,33449,11,0,1,1),-- Crusty Flatbread +(30319,1,100,0,-@NEWREF1,1), +(30319,2,100,0,-@NEWREF3,1), +-- High Priest Talet-Kha +(26073,43575,58,0,1,1),-- Reinforced Junkbox +(26073,0,100,0,-@NEWREF5,1), +(26073,33449,8,0,1,1),-- Crusty Flatbread +(26073,33447,8,0,1,1),-- Runic Healing Potion +-- Nedar, Lord of Rhinos +(25801,0,100,0,-@NEWREF5,1), +(25801,33447,6,0,1,1),-- Runic Healing Potion +(25801,38261,6,0,1,1),-- Bent House Key +-- Clam Master K +(25800,43575,47,0,1,1),-- Reinforced Junkbox +(25800,0,100,0,-@NEWREF5,1), +(25800,38261,15,0,1,1),-- Bent House Key +(25800,33449,5,0,1,1),-- Crusty Flatbread +(25800,33447,5,0,1,1),-- Runic Healing Potion +-- Magmothregar +(25430,0,100,0,-@NEWREF3,1), +(25430,1,100,0,-@NEWREF9,1), +(25430,33449,7,0,1,1),-- Crusty Flatbread +(25430,36862,4,0,1,1),-- Wrogn Troll Dice +-- Kaganishu +(25427,43575,43,0,1,1),-- Reinforced Junkbox +(25427,33454,35,0,1,1),-- Salted Venison +(25427,0,100,0,-@NEWREF4,1), +(25427,33447,8,0,1,1),-- Runic Healing Potion +-- Prince Valanar +(25601,43575,43,0,1,1),-- Reinforced Junkbox +(25601,37467,39,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(25601,33447,9,0,1,1),-- Runic Healing Potion +(25601,38261,9,0,1,1),-- Bent House Key +(25601,33449,4,0,1,1),-- Crusty Flatbread +(25601,29450,4,0,1,1),-- Telaari Grapes +-- Ghostly Sage +(25351,43575,42,0,1,1),-- Reinforced Junkbox +(25351,0,100,0,-@NEWREF2,1), +(25351,33447,10,0,1,1),-- Runic Healing Potion +-- Luthion the Vile +(27860,43575,42,0,1,1),-- Reinforced Junkbox +(27860,0,100,0,-@NEWREF5,1), +(27860,38261,13,0,1,1),-- Bent House Key +(27860,33449,6,0,1,1),-- Crusty Flatbread +(27860,33447,6,0,1,1),-- Runic Healing Potion +-- Reckless Scavenger +(26658,0,100,0,-@NEWREF2,1), +(26658,43575,40,0,1,1),-- Reinforced Junkbox +-- Ziggurat Defender +(26202,43575,40,0,1,1),-- Reinforced Junkbox +(26202,0,100,0,-@NEWREF2,1), +(26202,33447,7,0,1,1),-- Runic Healing Potion +(26202,29569,3,0,1,1),-- Strong Junkbox +-- Magmoth Forager +(25429,43575,39,0,1,1),-- Reinforced Junkbox +(25429,33454,27,0,1,1),-- Salted Venison +(25429,0,100,0,-@NEWREF4,1), +(25429,33447,10,0,1,1),-- Runic Healing Potion +(25429,38266,0.5,0,1,1),-- Rotund Relic +-- Magmoth Shaman +(25428,43575,39,0,1,1),-- Reinforced Junkbox +(25428,33454,28,0,1,1),-- Salted Venison +(25428,0,100,0,-@NEWREF4,1), +(25428,33447,9,0,1,1),-- Runic Healing Potion +(25428,38266,0.5,0,1,1),-- Rotund Relic +-- Vanthryn the Merciless +(27859,43575,39,0,1,1),-- Reinforced Junkbox +(27859,0,100,0,-@NEWREF5,1), +(27859,33449,12,0,1,1),-- Crusty Flatbread +(27859,38261,12,0,1,1),-- Bent House Key +(27859,33447,3,0,1,1),-- Runic Healing Potion +-- Unbound Corrupter +(30868,43575,47,0,1,1),-- Reinforced Junkbox +(30868,40202,18,0,1,1),-- Sizzling Grizzly Flank +(30868,33447,16,0,1,1),-- Runic Healing Potion +(30868,0,100,0,-@NEWREF4,1), +-- Unbound Trickster +(30856,43575,38,0,1,1),-- Reinforced Junkbox +(30856,0,100,0,-@NEWREF4,1), +(30856,33447,19,0,1,1),-- Runic Healing Potion +(30856,40202,14,0,1,1),-- Sizzling Grizzly Flank +-- Kreug Oathbreaker +(27105,43575,63,0,1,1),-- Reinforced Junkbox +(27105,33447,25,0,1,1),-- Runic Healing Potion +(27105,38269,13,0,1,1),-- Soggy Handkerchief +-- Lead Cannoneer Zierhut +(27235,43575,53,0,1,1),-- Reinforced Junkbox +(27235,0,100,0,-@NEWREF5,1), +(27235,33447,8,0,1,1),-- Runic Healing Potion +(27235,38261,8,0,1,1),-- Bent House Key +-- Devout Bodyguard +(27247,43575,50,0,1,1),-- Reinforced Junkbox +(27247,37467,42,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(27247,33447,8,0,1,1),-- Runic Healing Potion +(27247,29450,8,0,1,1),-- Telaari Grapes +(27247,38261,8,0,1,1),-- Bent House Key +-- Magnataur Alpha +(26481,0,100,0,-@NEWREF9,1), +(26481,1,100,0,-@NEWREF3,1), +(26481,33449,5,0,1,1),-- Crusty Flatbread +-- High General Abbendis +(27210,43575,48,0,1,1),-- Reinforced Junkbox +(27210,0,100,0,-@NEWREF5,1), +(27210,33449,10,0,1,1),-- Crusty Flatbread +(27210,33447,10,0,1,1),-- Runic Healing Potion +(27210,38261,8,0,1,1),-- Bent House Key +-- Anub'ar Dreadweaver +(26413,43575,44,0,1,1),-- Reinforced Junkbox +(26413,43576,22,0,1,1),-- Chitin Polish +(26413,33452,11,0,1,1),-- Honey-Spiced Lichen +(26413,33447,11,0,1,1),-- Runic Healing Potion +(26413,43577,11,0,1,1),-- Carapace Cleanser +-- Naxxramas Necrolord +(27289,33452,44,0,1,1),-- Honey-Spiced Lichen +(27289,43575,44,0,1,1),-- Reinforced Junkbox +(27289,33447,11,0,1,1),-- Runic Healing Potion +-- Onslaught Commander Iustus +(27334,37467,50,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(27334,43575,44,0,1,1),-- Reinforced Junkbox +(27334,29448,13,0,1,1),-- Mag'har Mild Cheese +(27334,38261,6,0,1,1),-- Bent House Key +-- Blacksmith Goodman +(27234,43575,41,0,1,1),-- Reinforced Junkbox +(27234,0,100,0,-@NEWREF5,1), +(27234,38261,13,0,1,1),-- Bent House Key +(27234,33447,9,0,1,1),-- Runic Healing Potion +(27234,33449,7,0,1,1),-- Crusty Flatbread +-- Magnataur Youngling +(26480,33449,19,0,1,1),-- Crusty Flatbread +(26480,0,100,0,-@NEWREF3,1), +(26480,1,100,0,-@NEWREF9,1), +-- Bloodpaw Warrior +(27342,43575,40,0,1,1),-- Reinforced Junkbox +(27342,33454,26,0,1,1),-- Salted Venison +(27342,0,100,0,-@NEWREF4,1), +(27342,33447,11,0,1,1),-- Runic Healing Potion +(27342,38266,0.6,0,1,1),-- Rotund Relic +-- Frigid Geist +(27533,0,100,0,-@NEWREF7,1), +-- Snowplain Zealot +(27278,43575,40,0,1,1),-- Reinforced Junkbox +(27278,33454,22,0,1,1),-- Salted Venison +(27278,0,100,0,-@NEWREF4,1), +(27278,33447,12,0,1,1),-- Runic Healing Potion +(27278,38266,0.3,0,1,1),-- Rotund Relic +-- Hulking Atrocity +(26948,43575,39,0,1,1),-- Reinforced Junkbox +(26948,0,100,0,-@NEWREF2,1), +(26948,33447,9,0,1,1),-- Runic Healing Potion +(26948,29569,0.3,0,1,1),-- Strong Junkbox +(26948,38268,0.3,0,1,1),-- Spare Hand +-- Onslaught Executioner +(27211,43575,39,0,1,1),-- Reinforced Junkbox +(27211,0,100,0,-@NEWREF5,1), +(27211,33449,12,0,1,1),-- Crusty Flatbread +(27211,38261,11,0,1,1),-- Bent House Key +(27211,33447,5,0,1,1),-- Runic Healing Potion +-- Gigantaur +(26836,0,100,0,-@NEWREF9,1), +(26836,1,100,0,-@NEWREF3,1), +(26836,33449,12,0,1,1),-- Crusty Flatbread +-- Leprous Servant +(27800,43575,38,0,1,1),-- Reinforced Junkbox +(27800,0,100,0,-@NEWREF2,1), +(27800,33447,7,0,1,1),-- Runic Healing Potion +(27800,38268,2,0,1,1),-- Spare Hand +-- Wretched Belcher +(26624,43575,100,0,1,1),-- Reinforced Junkbox +(26624,0,100,0,-@NEWREF2,1), +(26624,33447,25,0,1,1),-- Runic Healing Potion +(26624,35947,25,0,1,1),-- Sparkling Frostcap +-- Drakkari Commander +(27431,43575,90,0,1,1),-- Reinforced Junkbox +(27431,0,100,0,-@NEWREF2,1), +(27431,33447,26,0,1,1),-- Runic Healing Potion +(27431,35947,10,0,1,1),-- Sparkling Frostcap +-- Drakkari Guardian +(26620,0,100,0,-@NEWREF0,1), +(26620,33454,17,0,1,1),-- Salted Venison +(26620,33449,9,0,1,1),-- Crusty Flatbread +(26620,38261,9,0,1,1),-- Bent House Key +(26620,1,100,0,-@NEWREF1,1), +-- Risen Drakkari Soulmage +(26636,43575,85,0,1,1),-- Reinforced Junkbox +(26636,0,100,0,-@NEWREF2,1), +(26636,35947,21,0,1,1),-- Sparkling Frostcap +(26636,33447,16,0,1,1),-- Runic Healing Potion +-- Ghoul Tormentor +(26621,43575,81,0,1,1),-- Reinforced Junkbox +(26621,0,100,0,-@NEWREF2,1), +(26621,35947,24,0,1,1),-- Sparkling Frostcap +(26621,33447,14,0,1,1),-- Runic Healing Potion +-- Risen Drakkari Warrior +(26635,43575,71,0,1,1),-- Reinforced Junkbox +(26635,0,100,0,-@NEWREF2,1), +(26635,33447,29,0,1,1),-- Runic Healing Potion +(26635,35947,18,0,1,1),-- Sparkling Frostcap +(26635,38268,0.8,0,1,1),-- Spare Hand +-- Risen Drakkari Handler +(26637,0,100,0,-@NEWREF2,1), +(26637,43575,67,0,1,1),-- Reinforced Junkbox +(26637,33447,30,0,1,1),-- Runic Healing Potion +(26637,35947,18,0,1,1),-- Sparkling Frostcap +-- Scourge Reanimator +(26626,0,100,0,-@NEWREF2,1), +(26626,43575,67,0,1,1),-- Reinforced Junkbox +(26626,33447,21,0,1,1),-- Runic Healing Potion +(26626,35947,21,0,1,1),-- Sparkling Frostcap +-- Drakkari Shaman +(26639,0,100,0,-@NEWREF0,1), +(26639,33449,18,0,1,1),-- Crusty Flatbread +(26639,1,100,0,-@NEWREF3,1), +(26639,40202,11,0,1,1),-- Sizzling Grizzly Flank +-- Selas +(27580,43575,50,0,1,1),-- Reinforced Junkbox +(27580,0,100,0,-@NEWREF3,1), +(27580,38260,20,0,1,1),-- Empty Tobacco Pouch +-- Forgemaster Damrath +(26334,43575,48,0,1,1),-- Reinforced Junkbox +(26334,0,100,0,-@NEWREF5,1), +(26334,33447,9,0,1,1),-- Runic Healing Potion +(26334,38261,9,0,1,1),-- Bent House Key +-- Grumbald One-Eye +(26681,43575,39,0,1,1),-- Reinforced Junkbox +(26681,33454,28,0,1,1),-- Salted Venison +(26681,0,100,0,-@NEWREF4,1), +(26681,33447,9,0,1,1),-- Runic Healing Potion +-- Drakkari Shaman +(26447,0,100,0,-@NEWREF9,1), +(26447,1,100,0,-@NEWREF3,1), +(26447,33449,10,0,1,1),-- Crusty Flatbread +(26447,35799,0.2,0,1,1),-- Frozen Mojo +(26447,36862,0.2,0,1,1),-- Wrogn Troll Dice +-- Drakkari God Hunter +(29820,0,100,0,-@NEWREF0,1), +(29820,1,100,0,-@NEWREF1,1), +-- Drakkari Battle Rider +(29836,0,100,0,-@NEWREF0,1), +(29836,40202,18,0,1,1),-- Sizzling Grizzly Flank +-- Ruins Dweller +(29920,43575,71,0,1,1),-- Reinforced Junkbox +(29920,37452,69,0,1,1),-- Fatty Bluefin +(29920,38274,58,0,1,1),-- Large Snail Shell +(29920,38273,35,0,1,1),-- Brain Coral +(29920,33447,16,0,1,1),-- Runic Healing Potion +-- Drakkari Fire Weaver +(29822,0,100,0,-@NEWREF0,1), +(29822,40202,24,0,1,1),-- Sizzling Grizzly Flank +-- Drakkari Inciter +(29874,0,100,0,-@NEWREF0,1), +(29874,36862,16,0,1,1),-- Wrogn Troll Dice +(29874,40202,12,0,1,1),-- Sizzling Grizzly Flank +-- Titanium Siegebreaker +(28961,0,100,0,-@NEWREF0,1), +(28961,40202,35,0,1,1),-- Sizzling Grizzly Flank +-- Stormforged Sentinel +(28837,0,100,0,-@NEWREF0,1), +(28837,40202,16,0,1,1),-- Sizzling Grizzly Flank +-- Titanium Thunderer +(28965,0,100,0,-@NEWREF0,1), +(28965,40202,44,0,1,1),-- Sizzling Grizzly Flank +-- Titanium Vanguard +(28838,0,100,0,-@NEWREF0,1), +(28838,40202,27,0,1,1),-- Sizzling Grizzly Flank +-- Dark Rune Scholar +(27964,0,100,0,-@NEWREF9,1), +(27964,1,100,0,-@NEWREF1,1), +-- Dark Rune Worker +(27961,0,100,0,-@NEWREF0,1), +(27961,40202,29,0,1,1),-- Sizzling Grizzly Flank +(27961,36862,4,0,1,1),-- Wrogn Troll Dice +-- Dark Rune Shaper +(27965,0,100,0,-@NEWREF0,1), +(27965,40202,28,0,1,1),-- Sizzling Grizzly Flank +-- Steel Gate Archaeologist +(24400,0,100,0,-@NEWREF0,1), +(24400,1,100,0,-@NEWREF5,1), +(24400,33449,7,0,1,1),-- Crusty Flatbread +(24400,38261,9,0,1,1),-- Bent House Key +-- Blacksouled Keeper +(23875,0,100,0,-@NEWREF0,1), +(23875,1,100,0,-@NEWREF3,1), +(23875,33449,14,0,1,1),-- Crusty Flatbread +-- Winterskorn Rune-Seer +(23667,0,100,0,-@NEWREF0,1), +(23667,33449,7,0,1,1),-- Crusty Flatbread +(23667,33454,7,0,1,1),-- Salted Venison +-- Sergeant Lorric +(23963,43575,45,0,1,1),-- Reinforced Junkbox +(23963,0,100,0,-@NEWREF5,1), +(23963,33447,13,0,1,1),-- Runic Healing Potion +(23963,38261,11,0,1,1),-- Bent House Key +(23963,33449,7,0,1,1),-- Crusty Flatbread +-- Gjalerhorn Scavenger +(27699,0,100,0,-@NEWREF4,1), +(27699,43575,43,0,1,1),-- Reinforced Junkbox +(27699,33454,22,0,1,1),-- Salted Venison +(27699,33447,7,0,1,1),-- Runic Healing Potion +(27699,29569,0.8,0,1,1),-- Strong Junkbox +-- Iron Rune Binder +(23796,0,100,0,-@NEWREF5,1), +(23796,43575,42,0,1,1),-- Reinforced Junkbox +(23796,38261,12,0,1,1),-- Bent House Key +(23796,33449,11,0,1,1),-- Crusty Flatbread +(23796,33447,9,0,1,1),-- Runic Healing Potion +(23796,29569,0.5,0,1,1),-- Strong Junkbox +-- Forsaken Plaguebringer +(23760,0,100,0,-@NEWREF2,1), +(23760,43575,41,0,1,1),-- Reinforced Junkbox +(23760,33447,10,0,1,1),-- Runic Healing Potion +(23760,38268,0.3,0,1,1),-- Spare Hand +-- Chillmere Tidehunter +(24460,43575,40,0,1,1),-- Reinforced Junkbox +(24460,38274,33,0,1,1),-- Large Snail Shell +(24460,37452,18,0,1,1),-- Fatty Bluefin +(24460,38273,15,0,1,1),-- Brain Coral +(24460,33447,7,0,1,1),-- Runic Healing Potion +-- Vrykul Soul +(24262,0,100,0,-@NEWREF2,1), +(24262,43575,40,0,1,1),-- Reinforced Junkbox +(24262,33447,3,0,1,1),-- Runic Healing Potion +-- Iron Rune Sage +(23674,0,100,0,-@NEWREF5,1), +(23674,43575,39,0,1,1),-- Reinforced Junkbox +(23674,38261,13,0,1,1),-- Bent House Key +(23674,33449,9,0,1,1),-- Crusty Flatbread +(23674,33447,6,0,1,1),-- Runic Healing Potion +-- Vengeance Bringer +(23865,43575,39,0,1,1),-- Reinforced Junkbox +(23865,0,100,0,-@NEWREF2,1), +-- Restless Lookout +(31554,43575,80,0,1,1),-- Reinforced Junkbox +(31554,35947,40,0,1,1),-- Sparkling Frostcap +-- Val'kyr Taskmistress +(31396,43575,56,0,1,1),-- Reinforced Junkbox +(31396,35947,38,0,1,1),-- Sparkling Frostcap +(31396,33447,15,0,1,1),-- Runic Healing Potion +-- Overseer Veraj +(32263,43575,42,0,1,1),-- Reinforced Junkbox +(32263,37467,28,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(32263,38261,15,0,1,1),-- Bent House Key +(32263,33447,13,0,1,1),-- Runic Healing Potion +(32263,0,100,0,-@NEWREF8,1), +-- Steward +(26729,0,100,0,-@NEWREF0,1), +(26729,1,100,0,-@NEWREF3,1), +(26729,33449,31,0,1,1),-- Crusty Flatbread +(26729,29569,0.5,0,1,1),-- Strong Junkbox +-- Alliance Berserker +(26800,43575,62,0,1,1),-- Reinforced Junkbox +(26800,33449,19,0,1,1),-- Crusty Flatbread +(26800,38261,16,0,1,1),-- Bent House Key +(26800,33447,10,0,1,1),-- Runic Healing Potion +(26800,0,100,0,-@NEWREF5,1), +-- Alliance Ranger +(26802,0,100,0,-@NEWREF5,1), +(26802,43575,60,0,1,1),-- Reinforced Junkbox +(26802,38261,34,0,1,1),-- Bent House Key +(26802,33449,24,0,1,1),-- Crusty Flatbread +(26802,33447,12,0,1,1),-- Runic Healing Potion +-- Mage Hunter Ascendant +(26727,0,100,0,-@NEWREF0,1), +(26727,1,100,0,-@NEWREF3,1), +(26727,33449,29,0,1,1),-- Crusty Flatbread +-- Ring-Lord Sorceress +(27639,43575,87,0,1,1),-- Reinforced Junkbox +(27639,37467,46,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(27639,38261,28,0,1,1),-- Bent House Key +(27639,33447,19,0,1,1),-- Runic Healing Potion +(27639,0,100,0,-@NEWREF8,1), +(27639,36863,1.6,0,1,1),-- Decahedral Dwarven Dice +-- Ring-Lord Conjurer +(27640,37467,67,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(27640,43575,64,0,1,1),-- Reinforced Junkbox +(27640,33447,30,0,1,1),-- Runic Healing Potion +(27640,38261,26,0,1,1),-- Bent House Key +(27640,0,100,0,-@NEWREF8,1), +-- Mildred the Cruel +(29885,0,100,0,-@NEWREF0,1), +(29885,40202,13,0,1,1),-- Sizzling Grizzly Flank +-- Snowblind Devotee +(29407,43575,42,0,1,1),-- Reinforced Junkbox +(29407,40202,29,0,1,1),-- Sizzling Grizzly Flank +(29407,0,100,0,-@NEWREF4,1), +(29407,33447,12,0,1,1),-- Runic Healing Potion +-- Snowblind Devotee +(29554,43575,43,0,1,1),-- Reinforced Junkbox +(29554,40202,27,0,1,1),-- Sizzling Grizzly Flank +(29554,0,100,0,-@NEWREF4,1), +(29554,33447,12,0,1,1),-- Runic Healing Potion +(29554,38266,0.2,0,1,1),-- Rotund Relic +-- Frostfeather Witch +(29793,43575,40,0,1,1),-- Reinforced Junkbox +(29793,40202,21,0,1,1),-- Sizzling Grizzly Flank +(29793,0,100,0,-@NEWREF4,1), +(29793,33447,16,0,1,1),-- Runic Healing Potion +-- Icemane Yeti +(29875,43575,39,0,1,1),-- Reinforced Junkbox +(29875,40202,23,0,1,1),-- Sizzling Grizzly Flank +(29875,0,100,0,-@NEWREF4,1), +(29875,33447,15,0,1,1),-- Runic Healing Potion +(29875,38266,0.3,0,1,1),-- Rotund Relic +-- Garm Watcher +(29553,0,100,0,-@NEWREF0,1), +(29553,1,100,0,-@NEWREF1,1), +(29553,24231,0.3,0,2,2),-- Coarse Snuff +-- Stormforged Taskmaster +(29369,43575,38,0,1,1),-- Reinforced Junkbox +(29369,37467,34,0,1,1),-- A Steamy Romance Novel: Forbidden Love +(29369,33447,13,0,1,1),-- Runic Healing Potion +(29369,38261,6,0,1,1),-- Bent House Key +(29369,0,100,0,-@NEWREF8,1), +-- Dragonflayer Bonecrusher +(24069,0,100,0,-@NEWREF0,1), +(24069,1,100,0,-@NEWREF1,1), +(24069,29569,47,0,1,1),-- Strong Junkbox +(24069,29570,34,0,1,1),-- A Gnome Effigy +(24069,27855,22,0,1,1),-- Mag'har Grainbread +(24069,27854,19,0,1,1),-- Smoked Talbuk Venison +(24069,22829,10,0,1,1),-- Super Healing Potion +(24069,23438,1.2,0,1,1),-- Star of Elune +-- Ymirjar Berserker +(26696,0,100,0,-@NEWREF7,1), +(26696,29569,1.1,0,1,1),-- Strong Junkbox +-- Kutube'sa +(28494,0,100,0,-@NEWREF0,1), +(28494,1,100,0,-@NEWREF1,1), +-- Chulo the Mad +(28496,0,100,0,-@NEWREF0,1), +(28496,40202,6,0,1,1),-- Sizzling Grizzly Flank +-- Drakuru's Guard +(28803,43575,50,0,1,1),-- Reinforced Junkbox +(28803,33447,33,0,1,1),-- Runic Healing Potion +(28803,38269,17,0,1,1),-- Soggy Handkerchief +-- Prophet of Har'koa +(28848,0,100,0,-@NEWREF0,1), +(28848,40202,3,0,1,1),-- Sizzling Grizzly Flank +-- Decaying Ghoul +(28565,0,100,0,-@NEWREF7,1), +(28565,22829,0.9,0,1,1),-- Super Healing Potion +-- Drakuru Berserker +(29656,0,100,0,-@NEWREF0,1), +(29656,1,100,0,-@NEWREF3,1), +(29656,33449,11,0,1,1),-- Crusty Flatbread +(29656,29569,0.9,0,1,1); -- Strong Junkbox diff --git a/sql/old/3.3.5a/2012_04_18_05_world_conditions.sql b/sql/old/3.3.5a/2012_04_18_05_world_conditions.sql new file mode 100644 index 00000000000..ecf80f270a3 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_05_world_conditions.sql @@ -0,0 +1,4 @@ +-- Add condition to the Lovely Charm aura +DELETE FROM conditions WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`= 69511; +INSERT INTO conditions (SourceTypeOrReferenceId, SourceGroup, SourceEntry, ElseGroup, ConditionTypeOrReference, ConditionValue1, ConditionValue2, ConditionValue3, ErrorTextId, ScriptName, COMMENT) VALUES +(17,0,69511,0,12,8,0,0,0, '', 'Lovely Charm - Only during event'); diff --git a/sql/old/3.3.5a/2012_04_18_06_world_creature_template.sql b/sql/old/3.3.5a/2012_04_18_06_world_creature_template.sql new file mode 100644 index 00000000000..8c167c2ffa1 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_06_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Remove Skinning loot from Blackwing Spellbinder +UPDATE `creature_template` SET `skinloot`=0 WHERE `entry`=12457; diff --git a/sql/old/3.3.5a/2012_04_18_07_world_fishing_loot_template.sql b/sql/old/3.3.5a/2012_04_18_07_world_fishing_loot_template.sql new file mode 100644 index 00000000000..6c39cc95b48 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_07_world_fishing_loot_template.sql @@ -0,0 +1,2 @@ +-- update wrong area. +UPDATE `fishing_loot_template` SET `entry`=4560 WHERE `entry`=4395 AND `item`=11026; diff --git a/sql/old/3.3.5a/2012_04_18_08_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_18_08_world_creature_loot_template.sql new file mode 100644 index 00000000000..4b00685ed55 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_18_08_world_creature_loot_template.sql @@ -0,0 +1,22 @@ +-- Add loot for Hrothgar's Landing +DELETE FROM `creature_loot_template` WHERE `entry` IN (34980,34838,34839,34965); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- AURIAYA 10-man +-- Drottinn Hrothgar - http://old.wowhead.com/npc=34980 +(34980,46859,-100,1,0,1,1), -- Stolen Tallstrider Leg +-- Kvaldir Reaver +(34838,46859,-100,1,0,1,1), -- Stolen Tallstrider Leg +(34838,49676,5,1,0,1,1), -- Kvaldir Attack Plans +(34838,33470,35,1,0,1,4), -- 1-4x Frostweave Cloth +(34838,1,10,1,0,-24727,1), -- 1 of Northrend scrolls +(34838,2,10,1,0,-26002,1), -- Northrend Grey Item Reference1 +(34838,3,2,1,0,-35080,1), -- Northrend Green Item Reference +-- Kvaldir Mist Binder +(34839,46859,-100,1,0,1,1), -- Stolen Tallstrider Leg +(34839,49676,5,1,0,1,1), -- Kvaldir Attack Plans +(34839,33470,35,1,0,1,4), -- 1-4x Frostweave Cloth +(34839,1,10,1,0,-24727,1), -- 1 of Northrend scrolls +(34839,2,10,1,0,-26002,1), -- Northrend Grey Item Reference1 +(34839,3, 2,1,0,-35080,1), -- Northrend Green Item Reference +-- Mistcaller Yngvar +(34965,46859,-100,1,0,1,1); -- Stolen Tallstrider Leg diff --git a/sql/old/3.3.5a/2012_04_19_00_world_creature_template.sql b/sql/old/3.3.5a/2012_04_19_00_world_creature_template.sql new file mode 100644 index 00000000000..e9abd40095e --- /dev/null +++ b/sql/old/3.3.5a/2012_04_19_00_world_creature_template.sql @@ -0,0 +1,7 @@ +-- update Plague Slime & Marauding Geist to naxx25 trash lootid +UPDATE `creature_template` SET `lootid`=100005 WHERE `entry` IN(29575,30424); +-- update Plague Slime & Marauding Geist to naxx10 trash lootid +UPDATE `creature_template` SET `lootid`=100003 WHERE `entry` IN(16243,30083); +DELETE FROM `creature_loot_template` WHERE `entry` IN(30424,29575,16243,30083); +-- Remove scraps for naxx10 from creature creature_loot_template +DELETE FROM `creature_loot_template` WHERE `item` IN (22373,22374,22375,22376); diff --git a/sql/old/3.3.5a/2012_04_19_01_world_pickpocketing_loot_template.sql b/sql/old/3.3.5a/2012_04_19_01_world_pickpocketing_loot_template.sql new file mode 100644 index 00000000000..997b16ff65d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_19_01_world_pickpocketing_loot_template.sql @@ -0,0 +1,202 @@ +-- Fix to add pickpocketing loot for humoniods in borean tundra +SET @GORLOCREF := 25100; +SET @BERYLREF := @GORLOCREF+1; +SET @BLOODREF := @GORLOCREF+2; +SET @CHIEFREF := @GORLOCREF+3; +SET @CULTREF := @GORLOCREF+4; +SET @KVALDIRREF := @GORLOCREF+5; +SET @CLAXREF := @GORLOCREF+6; +SET @MAGMOTHREF := @GORLOCREF+7; +-- Create reference templates +DELETE FROM `reference_loot_template` WHERE `entry` BETWEEN @GORLOCREF AND @GORLOCREF+7; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@GORLOCREF,29576,57,1,0,1,1), -- Shark Bait +(@GORLOCREF,29569,30,1,0,1,1), -- Strong Junkbox +(@GORLOCREF,27858,8,1,0,1,1), -- Sunspring Carp +(@GORLOCREF,22829,3,1,0,1,1), -- Super Healing Potion +(@GORLOCREF,23436,0.5,1,0,1,1), -- Living Ruby +(@GORLOCREF,23437,0.5,1,0,1,1), -- Talasite +(@GORLOCREF,23440,0.5,1,0,1,1), -- Dawnstone +(@GORLOCREF,23438,0.5,1,0,1,1), -- Star of Elune +(@GORLOCREF,23439,0.5,1,0,1,1), -- Noble Topaz +-- -------------------------------------------------- +(@BERYLREF,37467,32.5,1,0,1,1), -- A Steamy Romance Novel: Forbidden Love +(@BERYLREF,43575,31,1,0,1,1), -- Reinforced Junkbox +(@BERYLREF,38261,10,1,0,1,1), -- Bent House Key +(@BERYLREF,29448,7,1,0,1,1), -- Mag'har Mild Cheese +(@BERYLREF,29450,7,1,0,1,1), -- Telaari Grapes +(@BERYLREF,33447,6,1,0,1,1), -- Runic Healing Potion +(@BERYLREF,33449,6,1,0,1,1), -- Crusty Flatbread +(@BERYLREF,36863,0.5,1,0,1,1), -- Decahedral Dwarven Dice +-- -------------------------------------------------- +(@BLOODREF,29572,37,1,0,1,1), -- Aboriginal Carvings +(@BLOODREF,29569,33,1,0,1,1), -- Strong Junkbox +(@BLOODREF,8952,20,1,0,1,1), -- Roasted Quail +(@BLOODREF,22829,8,1,0,1,1), -- Super Healing Potion +(@BLOODREF,23438,0.5,1,0,1,1), -- Star of Elune +(@BLOODREF,23436,0.5,1,0,1,1), -- Living Ruby +(@BLOODREF,23441,0.5,1,0,1,1), -- Nightseye +(@BLOODREF,23437,0.5,1,0,1,1), -- Talasite +(@BLOODREF,23440,0.5,1,0,1,1), -- Dawnstone +-- -------------------------------------------------- +(@CHIEFREF,29569,50,1,0,1,1), -- Strong Junkbox +(@CHIEFREF,27858,20,1,0,1,1), -- Sunspring Carp +(@CHIEFREF,29576,20,1,0,1,1), -- Shark Bait +(@CHIEFREF,22829,10,1,0,1,1), -- Super Healing Potion +-- -------------------------------------------------- +(@CULTREF,29569,40,1,0,1,1), -- Strong Junkbox +(@CULTREF,29571,37,1,0,1,1), -- A Steamy Romance Novel +(@CULTREF,30458,8,1,0,1,1), -- Stromgarde Muenster +(@CULTREF,27855,7,1,0,1,1), -- Mag'har Grainbread +(@CULTREF,27856,6,1,0,1,1), -- Skethyl Berries +(@CULTREF,22829,2,1,0,1,1), -- Super Healing Potion +(@CULTREF,36863,0.5,1,0,1,1), -- Decahedral Dwarven Dice +-- -------------------------------------------------- +(@KVALDIRREF,29569,39,1,0,1,1), -- Strong Junkbox +(@KVALDIRREF,29570,28,1,0,1,1), -- A Gnome Effigy +(@KVALDIRREF,27855,12,1,0,1,1), -- Mag'har Grainbread +(@KVALDIRREF,27854,12,1,0,1,1), -- Smoked Talbuk Venison +(@KVALDIRREF,22829,7,1,0,1,1), -- Super Healing Potion +(@KVALDIRREF,23436,0.5,1,0,1,1), -- Living Ruby +(@KVALDIRREF,23441,0.5,1,0,1,1), -- Nightseye +(@KVALDIRREF,23440,0.5,1,0,1,1), -- Dawnstone +(@KVALDIRREF,23439,0.5,1,0,1,1), -- Noble Topaz +(@KVALDIRREF,23437,0.5,1,0,1,1), -- Talasite +-- -------------------------------------------------- +(@CLAXREF,43575,28,1,0,1,1), -- Reinforced Junkbox +(@CLAXREF,38273,26,1,0,1,1), -- Brain Coral +(@CLAXREF,38274,23,1,0,1,1), -- Large Snail Shell +(@CLAXREF,37452,17,1,0,1,1), -- Fatty Bluefin +(@CLAXREF,33447,6,1,0,1,1), -- Runic Healing Potion +-- -------------------------------------------------- +(@MAGMOTHREF,38260,33,1,0,1,1), -- Empty Tobacco Pouch +(@MAGMOTHREF,38261,21,1,0,1,1), -- Bent House Key +(@MAGMOTHREF,33449,16,1,0,1,1), -- Crusty Flatbread +(@MAGMOTHREF,43575,16,1,0,1,1), -- Reinforced Junkbox +(@MAGMOTHREF,33454,9,1,0,1,1), -- Salted Venison +(@MAGMOTHREF,33447,5,1,0,1,1), -- Runic Healing Potion +(@MAGMOTHREF,36862,1,1,0,1,1); -- Worn Troll Dice +-- ------------------- +-- -- NPC Variables -- +-- ------------------- +SET @NPC := 25686; +SET @NPC1 := 25700; +SET @NPC2 := 25687; +SET @NPC3 := 25685; +SET @NPC4 := 25449; +SET @NPC5 := 25316; +SET @NPC6 := 25353; +SET @NPC7 := 25719; +SET @NPC8 := 25804; +SET @NPC9 := 25392; +SET @NPC10 := 25651; +SET @NPC11 := 25836; +SET @NPC12 := 25979; +SET @NPC13 := 25806; +SET @NPC14 := 25720; +SET @NPC15 := 25803; +SET @NPC16 := 25880; +SET @NPC17 := 25618; +SET @NPC18 := 25839; +SET @NPC19 := 25470; +SET @NPC20 := 24567; +SET @NPC21 := 25467; +SET @NPC22 := 25468; +SET @NPC23 := 25501; +SET @NPC24 := 25726; +SET @NPC25 := 25701; +SET @NPC26 := 25725; +SET @NPC27 := 25699; +SET @NPC28 := 24576; +SET @NPC29 := 25605; +SET @NPC30 := 25609; +SET @NPC31 := 25378; +SET @NPC32 := 25843; +SET @NPC33 := 25496; +SET @NPC34 := 25479; +SET @NPC35 := 25760; +SET @NPC36 := 26266; +SET @NPC37 := 26451; +SET @NPC38 := 25521; +SET @NPC39 := 25613; +SET @NPC40 := 25522; +SET @NPC41 := 25520; +SET @NPC42 := 25209; +SET @NPC43 := 25210; +SET @NPC44 := 25216; +SET @NPC45 := 25215; +SET @NPC46 := 25217; +SET @NPC47 := 25789; +SET @NPC48 := 24469; +SET @NPC49 := 25432; +SET @NPC50 := 25433; +SET @NPC51 := 25615; +SET @NPC52 := 25523; +-- ---------------------- +-- -- Assign the loots -- +-- ---------------------- +UPDATE `creature_template` SET `pickpocketloot`=`entry` WHERE `entry` IN (@NPC,@NPC1,@NPC2,@NPC3,@NPC4,@NPC5,@NPC6,@NPC7,@NPC8,@NPC9,@NPC10,@NPC11,@NPC12,@NPC13,@NPC14,@NPC15,@NPC16,@NPC17,@NPC18,@NPC19,@NPC20,@NPC21,@NPC22,@NPC23,@NPC24,@NPC25,@NPC26,@NPC27,@NPC28,@NPC29,@NPC30,@NPC31,@NPC32,@NPC33,@NPC34,@NPC35,@NPC36,@NPC37,@NPC38,@NPC39,@NPC40,@NPC41,@NPC42,@NPC43,@NPC44,@NPC45,@NPC46,@NPC47,@NPC48,@NPC49,@NPC50,@NPC51,@NPC52); +DELETE FROM `pickpocketing_loot_template` WHERE `entry` IN (@NPC,@NPC1,@NPC2,@NPC3,@NPC4,@NPC5,@NPC6,@NPC7,@NPC8,@NPC9,@NPC10,@NPC11,@NPC12,@NPC13,@NPC14,@NPC15,@NPC16,@NPC17,@NPC18,@NPC19,@NPC20,@NPC21,@NPC22,@NPC23,@NPC24,@NPC25,@NPC26,@NPC27,@NPC28,@NPC29,@NPC30,@NPC31,@NPC32,@NPC33,@NPC34,@NPC35,@NPC36,@NPC37,@NPC38,@NPC39,@NPC40,@NPC41,@NPC42,@NPC43,@NPC44,@NPC45,@NPC46,@NPC47,@NPC48,@NPC49,@NPC50,@NPC51,@NPC52); +INSERT INTO `pickpocketing_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- ----------------------------------------------------------------------------------------------- +(@NPC,1,100,1,0,-@GORLOCREF,1), -- Gorloc ref loot template on Gorloc Gibberer +(@NPC1,1,100,1,0,-@GORLOCREF,1), -- Gorloc ref loot template on Gorloc Hunter +(@NPC2,1,100,1,0,-@GORLOCREF,1), -- Gorloc ref loot template on Gorloc Steam Belcher +(@NPC3,1,100,1,0,-@GORLOCREF,1), -- Gorloc ref loot template on Gorloc Waddler +-- ----------------------------------------------------------------------------------------------- +(@NPC4,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Beryl Reclaimer +(@NPC5,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Beryl Sorcerer +(@NPC6,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Beryl Treasure Hunter +(@NPC7,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Coldarra Spellbinder +(@NPC8,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Harold Lane +(@NPC9,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on High Priest Andorath +(@NPC10,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Cultist Necrolyte +(@NPC11,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Loot Crazed Diver +(@NPC12,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Loot Crazed Hunter +(@NPC13,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Loot Crazed Poacher +(@NPC14,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Inquisitor Caleras +(@NPC15,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Karen "I Don't Caribou" the Culler +(@NPC16,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Minion of Kaw +(@NPC17,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Varidus the Flenser +(@NPC18,1,100,1,0,-@BERYLREF,1), -- Beryl ref loot template on Northsea Mercenary +-- ----------------------------------------------------------------------------------------------- +(@NPC19,1,100,1,0,-@BLOODREF,1), -- Bloodspore ref loot template on Bloodspore Firestarter +(@NPC20,1,100,1,0,-@BLOODREF,1), -- Bloodspore ref loot template on Den Vermin +(@NPC21,1,100,1,0,-@BLOODREF,1), -- Bloodspore ref loot template on Bloodspore Harvester +(@NPC22,1,100,1,0,-@BLOODREF,1), -- Bloodspore ref loot template on Bloodspore Roaster +(@NPC23,1,100,1,0,-@BLOODREF,1), -- Bloodspore ref loot template on Gammoth Tender +-- ----------------------------------------------------------------------------------------------- +(@NPC24,1,100,1,0,-@CHIEFREF,1), -- Chieftian ref loot template on Chieftain Burblegobble +(@NPC25,1,100,1,0,-@CHIEFREF,1), -- Chieftian ref loot template on Gorloc Dredger +(@NPC26,1,100,1,0,-@CHIEFREF,1), -- Chieftian ref loot template on Chieftain GurgleBoggle +(@NPC27,1,100,1,0,-@CHIEFREF,1), -- Chieftian ref loot template on Gorloc Mud Splasher +(@NPC28,1,100,1,0,-@CHIEFREF,1), -- Chieftian ref loot template on Riplash Myrmidon +-- ----------------------------------------------------------------------------------------------- +(@NPC29,1,100,1,0,-@CULTREF,1), -- Cultist ref loot template on Clandestine Cultist +(@NPC30,1,100,1,0,-@CULTREF,1), -- Cultist ref loot template on En'kilah Necrolord +(@NPC31,1,100,1,0,-@CULTREF,1), -- Cultist ref loot template on En'kilah Necromancer +(@NPC32,1,100,1,0,-@CULTREF,1), -- Cultist ref loot template on Northsea Thug +-- ----------------------------------------------------------------------------------------------- +(@NPC33,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Kvaldir Mist Lord +(@NPC34,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Kvaldir Mistweaver +(@NPC35,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Kvaldir Raider +(@NPC36,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Heigarr the Horrible +(@NPC37,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Ragnar Drakkarlund +(@NPC37,35774,-100,1,0,1,1), -- Trident of Naz'jan on Ragnar Drakkarlund +(@NPC38,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Skadir Longboatsman +(@NPC39,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Skadir Mistweaver +(@NPC40,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Skadir Raider +(@NPC41,1,100,1,0,-@KVALDIRREF,1), -- Kvaldir ref loot template on Skadir Runecaster +-- ----------------------------------------------------------------------------------------------- +(@NPC42,1,100,1,0,-@CLAXREF,1), -- Clax ref loot template on Claximus +(@NPC43,1,100,1,0,-@CLAXREF,1), -- Clax ref loot template on Keymaster Urmgrgl +(@NPC44,1,100,1,0,-@CLAXREF,1), -- Clax ref loot template on Winterfin Oracle +(@NPC45,1,100,1,0,-@CLAXREF,1), -- Clax ref loot template on Winterfin Shorestriker +(@NPC46,1,100,1,0,-@CLAXREF,1), -- Clax ref loot template on Winterfin Warrior +-- ----------------------------------------------------------------------------------------------- +(@NPC47,1,100,1,0,-@MAGMOTHREF,1), -- Magmoth2 ref loot template on Gammothra the Tormentor +(@NPC48,1,100,1,0,-@MAGMOTHREF,1), -- Magmoth ref loot template on Magnataur Huntress +(@NPC49,1,100,1,0,-@MAGMOTHREF,1), -- Magmoth ref loot template on Mate of Magmothregar +(@NPC50,1,100,1,0,-@MAGMOTHREF,1), -- Magmoth ref loot template on Offspring of Magmothregar +(@NPC51,1,100,1,0,-@MAGMOTHREF,1), -- Magmoth ref loot template on Plagued Magnataur +(@NPC52,1,100,1,0,-@MAGMOTHREF,1); -- Magmoth ref loot template on Skadir Mariner diff --git a/sql/old/3.3.5a/2012_04_19_02_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_19_02_world_creature_loot_template.sql new file mode 100644 index 00000000000..336cd61c0eb --- /dev/null +++ b/sql/old/3.3.5a/2012_04_19_02_world_creature_loot_template.sql @@ -0,0 +1,2 @@ +-- fix DB-error on startup +DELETE FROM `creature_loot_template` WHERE `entry` IN (34965,34980); diff --git a/sql/old/3.3.5a/2012_04_19_03_world_instance_ulduar.sql b/sql/old/3.3.5a/2012_04_19_03_world_instance_ulduar.sql new file mode 100644 index 00000000000..a39ed9c01d5 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_19_03_world_instance_ulduar.sql @@ -0,0 +1,174 @@ +DELETE FROM `script_texts` WHERE `entry` BETWEEN -1603019 AND -1603000; +UPDATE `creature_template` SET `ScriptName`='' WHERE `ScriptName` IN ('boss_algalon','mob_collapsing_star'); + +-- Difficulty linking +UPDATE `creature_template` SET `difficulty_entry_1`=34296 WHERE `entry`=32953; -- Black Hole + +UPDATE `creature_template` SET `minlevel`=80,`maxlevel`=80,`faction_A`=35,`faction_H`=35,`unit_flags`=0x8300,`equipment_id`=2478 WHERE `entry`=34064; -- Brann Bronzebeard +UPDATE `creature_template` SET `speed_walk`=4,`speed_run`=2.14286,`exp`=2,`minlevel`=83,`maxlevel`=83,`faction_A`=190,`faction_H`=190,`unit_flags`=0x8100,`BaseAttackTime`=1000,`equipment_id`=2479 WHERE `entry` IN (32871,33070); -- Algalon the Observer +UPDATE `creature_template` SET `faction_A`=190,`faction_H`=190,`exp`=2,`minlevel`=83,`maxlevel`=83,`unit_flags`=0x2000000,`speed_run`=1,`InhabitType`=4 WHERE `entry`=34246; -- Azeroth +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`exp`=2,`minlevel`=74,`maxlevel`=74,`unit_flags`=0x2000000,`flags_extra`=0x80,`InhabitType`=4 WHERE `entry`=33086; -- Algalon Stalker +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`unit_flags`=0x2008000,`speed_run`=1,`equipment_id`=2480,`InhabitType`=4 WHERE `entry` IN (33052,33116); -- Living Constellation +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`speed_run`=1,`RegenHealth`=0 WHERE `entry` IN (32955,34215); -- Collapsing Star +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`exp`=2,`minlevel`=80,`maxlevel`=80,`unit_flags`=0x2000000,`speed_run`=1,`InhabitType`=4 WHERE `entry` IN (32953,34296); -- Black Hole +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`minlevel`=81,`maxlevel`=81,`unit_flags`=0x8000,`speed_walk`=4,`speed_run`=1.42857,`InhabitType`=4 WHERE `entry` IN(33089,34097,34221,34222); -- Dark Matter +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`unit_flags`=0x2000000,`flags_extra`=0x80 WHERE `entry`=34100; -- Algalon Void Zone Visual Stalker +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`unit_flags`=0x2000000,`speed_run`=1,`InhabitType`=4 WHERE `entry`=34099; -- Worm Hole +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`exp`=2,`minlevel`=74,`maxlevel`=74,`unit_flags`=0x2000000,`flags_extra`=0x80,`InhabitType`=4 WHERE `entry`=33104; -- Algalon Stalker Asteroid Target 01 +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`exp`=2,`minlevel`=74,`maxlevel`=74,`unit_flags`=0x2000000,`flags_extra`=0x80,`InhabitType`=4 WHERE `entry`=33105; -- Algalon Stalker Asteroid Target 02 + +UPDATE `creature_model_info` SET `bounding_radius`=0.93,`combat_reach`=9,`gender`=0 WHERE `modelid`=28641; -- Algalon the Observer +UPDATE `creature_model_info` SET `bounding_radius`=0.02,`combat_reach`=0.2,`gender`=2 WHERE `modelid`=29133; -- Azeroth +UPDATE `creature_model_info` SET `bounding_radius`=0.62,`combat_reach`=0,`gender`=2 WHERE `modelid`=28741; -- Living Constellation +UPDATE `creature_model_info` SET `bounding_radius`=1,`combat_reach`=1,`gender`=2 WHERE `modelid`=28988; -- Collapsing Star +UPDATE `creature_model_info` SET `bounding_radius`=1,`combat_reach`=1,`gender`=2 WHERE `modelid`=28460; -- Black Hole + +UPDATE `gameobject_template` SET `faction`=114,`flags`=32 WHERE `entry`=194910; -- Doodad_UL_SigilDoor_03 +UPDATE `gameobject_template` SET `data0`=579 WHERE `entry`=194628; -- Celestial Planetarium Access + +UPDATE `creature_template` SET `ScriptName`='boss_algalon_the_observer' WHERE `entry`=32871; -- Algalon the Observer +UPDATE `creature_template` SET `ScriptName`='npc_living_constellation' WHERE `entry`=33052; -- Living Constellation +UPDATE `creature_template` SET `ScriptName`='npc_collapsing_star' WHERE `entry`=32955; -- Collapsing Star +UPDATE `creature_template` SET `ScriptName`='npc_brann_bronzebeard_algalon' WHERE `entry`=34064; -- Brann Bronzebeard +UPDATE `gameobject_template` SET `ScriptName`='go_celestial_planetarium_access' WHERE `entry` IN (194628,194752); -- Celestial Planetarium Access +UPDATE `creature_template` SET `AIName`='NullCreatureAI' WHERE `entry` IN (32953,34099); -- Black Hole + +DELETE FROM `creature` WHERE `guid` IN (41781,41783,41790,41811,41812,41814,41819,41820,41821,41822,41823,41875); +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`MovementType`) VALUES +(41781,33086,603,3,1,1627.400,-339.4133,417.4044,1.378810,7200,0,0), -- Algalon Stalker +(41783,33086,603,3,1,1622.681,-344.2576,417.3955,1.378810,7200,0,0), -- Algalon Stalker +(41790,33086,603,3,1,1629.984,-271.4798,417.4045,4.782202,7200,0,0), -- Algalon Stalker +(41811,33086,603,3,1,1630.005,-345.5189,417.3955,1.378810,7200,0,0), -- Algalon Stalker +(41812,33089,603,3,16,1622.451,-321.1563,417.6188,4.677482,7200,20,1), -- Dark Matter +(41814,33089,603,3,16,1649.438,-319.8127,418.3941,1.082104,7200,20,1), -- Dark Matter +(41819,33089,603,3,16,1615.060,-291.6816,417.7796,3.490659,7200,20,1), -- Dark Matter +(41820,33089,603,3,16,1647.005,-288.6790,417.3955,3.490659,7200,20,1), -- Dark Matter +(41821,33089,603,3,16,1622.451,-321.1563,417.6188,4.677482,7200,20,1), -- Dark Matter +(41822,33089,603,3,16,1649.438,-319.8127,418.3941,1.082104,7200,20,1), -- Dark Matter +(41823,33089,603,3,16,1615.060,-291.6816,417.7796,3.490659,7200,20,1), -- Dark Matter +(41875,33089,603,3,16,1647.005,-288.6790,417.3955,3.490659,7200,20,1); -- Dark Matter + +SET @OGUID := 252; +DELETE FROM `gameobject` WHERE `id` IN (194767,194910,194911,194715,194716,194148,194253,194628,194752,194821,194822); +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@OGUID+00,194767,603,3,17,1632.024,-182.9211,427.6681,0.000000,0,0,8.742278E-08,1, 604800,255,1), -- Doodad_UL_SigilDoor_01 +(@OGUID+04,194911,603,3,17,1632.024,-182.9211,408.4224,3.141593,0,0,8.742278E-08,1, 604800,255,1), -- Doodad_UL_SigilDoor_02 +(@OGUID+10,194910,603,3,17,1632.053,-266.1495,438.5608,0.000000,0,0,8.742278E-08,1, 604800,255,0), -- Doodad_UL_SigilDoor_03 +(@OGUID+12,194715,603,3,17,1632.053,-307.6541,417.3211,0.000000,0,0,8.742278E-08,1, 604800,255,0), -- Doodad_UL_UniverseFloor_01 +(@OGUID+19,194716,603,3,17,1632.251,-307.5483,416.2641,0.000000,0,0,8.742278E-08,1, 604800,255,1), -- Doodad_UL_UniverseFloor_02 +(@OGUID+22,194148,603,3,17,1632.053,-307.6541,417.3211,0.000000,0,0,8.742278E-08,1, 604800,255,1), -- Doodad_UL_UniverseGlobe01 +(@OGUID+24,194253,603,3,17,1631.908,-246.4970,417.3211,0.000000,0,0,8.742278E-08,1, 604800,255,1), -- Doodad_UL_Ulduar_Trapdoor_03 +(@OGUID+29,194628,603,1, 1,1646.182,-174.6881,427.2536,1.553341,0,0,0.000000E-00,1, 604800,255,1), -- Celestial Planetarium Access +(@OGUID+33,194752,603,2, 1,1646.182,-174.6881,427.2536,1.553341,0,0,0.000000E-00,1, 604800,255,1), -- Celestial Planetarium Access +(@OGUID+37,194821,603,1, 1,1632.099,-306.5609,417.3210,4.694937,0,0,0.000000E-00,1,-604800,255,1), -- Gift of the Observer (10 man) +(@OGUID+46,194822,603,2, 1,1632.099,-306.5609,417.3210,4.694937,0,0,0.000000E-00,1,-604800,255,1); -- Gift of the Observer (25 man) + +DELETE FROM `creature_equip_template` WHERE `entry` IN (2478,2479,2480); +INSERT INTO `creature_equip_template` (`entry`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES +(2478,1903,25972,0), +(2479,45985,45985,0), +(2480,44952,0,0); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (32871,33070,33052,33116,33089,34221,34097,34222,33105); +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES +(32871,0,0x0000000,0x0,NULL), -- Algalon the Observer +(33070,0,0x0000000,0x0,NULL), -- Algalon the Observer +(33052,0,0x3000000,0x1,NULL), -- Living Constellation +(33116,0,0x3000000,0x1,NULL), -- Living Constellation +(33089,0,0x3000000,0x1,NULL), -- Dark Matter +(34221,0,0x3000000,0x1,NULL), -- Dark Matter +(34097,0,0x3000000,0x1,NULL), -- Unleashed Dark Matter +(34222,0,0x3000000,0x1,NULL), -- Unleashed Dark Matter +(33105,0,0x3000000,0x1,NULL); -- Algalon Stalker Asteroid Target 02 + +DELETE FROM `creature_text` WHERE `entry` IN (32871,34064); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`sound`,`emote`,`comment`) VALUES +(34064,0,0,'We did it, lads! We got here before Algalon''s arrival. Maybe we can rig the systems to interfere with his analysis--',14,15824,0,'Brann Bronzebeard - SAY_BRANN_ALGALON_INTRO_1'), +(34064,1,0,'I''ll head back to the Archivum and see if I can jam his signal. I might be able to buy us some time while you take care of him.',12,15825,0,'Brann Bronzebeard - SAY_BRANN_ALGALON_INTRO_2'), +(34064,2,0,'I know just the place. Will you be all right?',14,15823,6,'Brann Bronzebeard - SAY_BRANN_ALGALON_OUTRO'), +(32871,0,0,'Translocation complete. Commencing planetary analysis of Azeroth.',12,15405,0,'Algalon the Observer - SAY_ALGALON_INTRO_1'), +(32871,1,0,'Stand back, mortals. I''m not here to fight you.',12,15406,0,'Algalon the Observer - SAY_ALGALON_INTRO_2'), +(32871,2,0,'It is in the universe''s best interest to re-originate this planet should my analysis find systemic corruption. Do not interfere.',12,15407,0,'Algalon the Observer - SAY_ALGALON_INTRO_3'), +(32871,3,0,'Your actions are illogical. All possible results for this encounter have been calculated. The Pantheon will receive the Observer''s message regardless of outcome.',14,15386,0,'Algalon the Observer - SAY_ALGALON_START_TIMER'), +(32871,4,0,'See your world through my eyes: A universe so vast as to be immeasurable - incomprehensible even to your greatest minds.',14,15390,1,'Algalon the Observer - SAY_ALGALON_AGGRO'), +(32871,5,0,'The stars come to my aid!',14,15392,0,'Algalon the Observer - SAY_ALGALON_COLLAPSING_STAR'), +(32871,6,0,'%s begins to Summon Collapsing Stars!',41,0,0,'Algalon the Observer - EMOTE_ALGALON_COLLAPSING_STAR'), +(32871,7,0,'Witness the fury of the cosmos!',14,15396,0,'Algalon the Observer - SAY_ALGALONG_BIG_BANG'), +(32871,8,0,'%s begins to cast Big Bang!',41,0,0,'Algalon the Observer - EMOTE_ALGALON_BIG_BANG'), +(32871,9,0,'You are out of time.',14,15394,0,'Algalon the Observer - SAY_ALGALON_ASCEND'), +(32871,10,0,'%s begins to cast Cosmic Smash!',41,0,0,'Algalon the Observer - EMOTE_ALGALON_COSMIC_SMASH'), +(32871,11,0,'Behold the tools of creation!',14,15397,0,'Algalon the Observer - SAY_ALGALON_PHASE_TWO'), +(32871,12,0,'I have seen worlds bathed in the Makers'' flames, their denizens fading without as much as a whimper. Entire planetary systems born and razed in the time that it takes your mortal hearts to beat once. Yet all throughout, my own heart devoid of emotion... of empathy. I. Have. Felt. Nothing. A million-million lives wasted. Had they all held within them your tenacity? Had they all loved life as you do?',14,15393,1,'Algalon the Observer - SAY_ALGALON_OUTRO_1'), +(32871,13,0,'Perhaps it is your imperfections... that which grants you free will... that allows you to persevere against all cosmically calculated odds. You prevail where the Titan''s own perfect creations have failed.',14,15401,1,'Algalon the Observer - SAY_ALGALON_OUTRO_2'), +(32871,14,0,'I''ve rearranged the reply code - your planet will be spared. I cannot be certain of my own calculations anymore.',14,15402,1,'Algalon the Observer - SAY_ALGALON_OUTRO_3'), +(32871,15,0,'I lack the strength to transmit the signal. You must... hurry... find a place of power... close to the skies.',14,15403,1,'Algalon the Observer - SAY_ALGALON_OUTRO_4'), +(32871,16,0,'Do not worry about my fate, Bronzen. If the signal is not transmitted in time, re-origination will proceed regardless. Save... your world...',14,15404,1,'Algalon the Observer - SAY_ALGALON_OUTRO_5'), +(32871,17,0,'Analysis complete. There is partial corruption in the planet''s life-support systems as well as complete corruption in most of the planet''s defense mechanisms.',12,15398,0,'Algalon the Observer - SAY_ALGALON_DESPAWN_1'), +(32871,18,0,'Begin uplink: Reply Code: ''Omega''. Planetary re-origination requested.',12,15399,0,'Algalon the Observer - SAY_ALGALON_DESPAWN_2'), +(32871,19,0,'Farewell, mortals. Your bravery is admirable, for such flawed creatures.',12,15400,0,'Algalon the Observer - SAY_ALGALON_DESPAWN_3'), +(32871,20,0,'Loss of life unavoidable.',14,15387,0,'Algalon the Observer - SAY_ALGALON_KILL'), +(32871,20,1,'I do what I must.',14,15388,0,'Algalon the Observer - SAY_ALGALON_KILL'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (64996,62266,65509,62304,64597); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`Comment`) VALUES +(13,1,64996,31,3,34246,'Algalon the Observer - Reorigination on Azeroth'), +(13,1,62266,31,3,33052,'Algalon Stalker - target Living Constellation'), +(13,1,65509,31,3,33052,'Black Hole - target Living Constellation'), +(13,1,62304,31,3,33104,'Cosmic Smash - target trigger'), +(13,1,64597,31,3,33104,'Cosmic Smash - target trigger'); + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_phase_punch'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_arcane_barrage'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_trigger_3_adds'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_collapse'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_big_bang'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_remove_phase'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_cosmic_smash'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_cosmic_smash_damage'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_algalon_supermassive_fail'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(64412,'spell_algalon_phase_punch'), +(64599,'spell_algalon_arcane_barrage'), +(64607,'spell_algalon_arcane_barrage'), +(62266,'spell_algalon_trigger_3_adds'), +(62018,'spell_algalon_collapse'), +(64443,'spell_algalon_big_bang'), +(64584,'spell_algalon_big_bang'), +(64445,'spell_algalon_remove_phase'), +(62295,'spell_algalon_cosmic_smash'), +(62311,'spell_algalon_cosmic_smash_damage'), +(64596,'spell_algalon_cosmic_smash_damage'), +(65311,'spell_algalon_supermassive_fail'); + +SET @DIFF_ID := 3262; +DELETE FROM `spelldifficulty_dbc` WHERE `id` BETWEEN @DIFF_ID AND @DIFF_ID+5; +INSERT INTO `spelldifficulty_dbc` (`id`,`spellid0`,`spellid1`) VALUES +(@DIFF_ID+0,64395,64592), +(@DIFF_ID+1,64599,64607), +(@DIFF_ID+2,64443,64584), +(@DIFF_ID+3,64122,65108), +(@DIFF_ID+4,62301,64598), +(@DIFF_ID+5,62304,64597); + +UPDATE `instance_encounters` SET `creditType`=1,`creditEntry`=65184 WHERE `entry` IN (757,771); -- Algalon the Observer + +DELETE FROM `disables` WHERE `sourceType`=4 AND `entry` IN (10565,10566,10678,9990,9991,10567,10569,10698,10780,10781,10782,10783,10568,10570); +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (10565,10566,10678,9990,9991,10567,10569,10698,10780,10781,10782,10783,10568,10570); +INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES +(10565,12,0,0,''), -- Algalon the Observer kills (Ulduar 10 player) +(10566,12,1,0,''), -- Algalon the Observer kills (Ulduar 25 player) +(10678,12,0,0,''), -- Herald of the Titans +(10678,18,0,0,''), -- Herald of the Titans +(9990,12,0,0,''), -- Lich King 10-player bosses killed +(9991,12,1,0,''), -- Lich King 25-player bosses killed +(10567,12,0,0,''), -- Observed (10 player) +(10569,12,1,0,''), -- Observed (25 player) +(10698,12,1,0,''), -- Realm First! Celestial Defender +(10780,12,0,0,''), -- Supermassive (10 player) +(10781,12,0,0,''), -- Supermassive (10 player) +(10782,12,1,0,''), -- Supermassive (25 player) +(10783,12,1,0,''), -- Supermassive (25 player) +(10568,11,0,0,'achievement_he_feeds_on_your_tears'), -- He Feeds On Your Tears (10 player) +(10568,12,0,0,''), -- He Feeds On Your Tears (10 player) +(10570,11,0,0,'achievement_he_feeds_on_your_tears'), -- He Feeds On Your Tears (25 player) +(10570,12,1,0,''); -- He Feeds On Your Tears (25 player) diff --git a/sql/old/3.3.5a/2012_04_20_00_world_gameobject_loot_template.sql b/sql/old/3.3.5a/2012_04_20_00_world_gameobject_loot_template.sql new file mode 100644 index 00000000000..47a22d519d0 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_20_00_world_gameobject_loot_template.sql @@ -0,0 +1,15 @@ +SET @Ref := 12002; +DELETE FROM `reference_loot_template` WHERE `entry`=@Ref; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@Ref,47242,100,1,0,1,1); +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (195668,195667,195666,195665,195672,195671,195670,195669) AND `item`=47242; +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (195668,195667,195666,195665,195672,195671,195670,195669) AND `mincountOrRef` = -@Ref; +INSERT INTO gameobject_loot_template (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(195665,5,100,1,0,-@Ref,4), -- 10 man,50 attempts +(195666,3,100,1,0,-@Ref,4), -- 10 man,45+ attempts +(195667,3,100,1,0,-@Ref,2), -- 10 man,25+ attempts +(195668,1,100,1,0,-@Ref,2), -- 10 man,0+ attempts +(195669,6,100,1,0,-@Ref,4), -- 25 man,50 attempts +(195670,4,100,1,0,-@Ref,4), -- 25 man,45+ attempts +(195671,4,100,1,0,-@Ref,2), -- 25 man,25+ attempts +(195672,2,100,1,0,-@Ref,2); -- 25 man,0+ attempts diff --git a/sql/old/3.3.5a/2012_04_20_01_world_item_loot_template.sql b/sql/old/3.3.5a/2012_04_20_01_world_item_loot_template.sql new file mode 100644 index 00000000000..af52ade0b25 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_20_01_world_item_loot_template.sql @@ -0,0 +1,10 @@ +SET @Bag := 52676; +DELETE FROM `item_loot_template` WHERE `entry`=@Bag; +INSERT INTO `item_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@Bag,36933,0,1,1,1,3),-- Forest Emerald +(@Bag,36918,0,1,1,1,3),-- Scarlet Ruby +(@Bag,36921,0,1,1,1,3),-- Autumn's Glow +(@Bag,36930,0,1,1,1,3),-- Monarch Topaz +(@Bag,36924,0,1,1,1,3),-- Sky Sapphire +(@Bag,36927,0,1,1,1,3),-- Twilight Opal +(@Bag,43953,5,1,0,1,1); -- Reins of the Blue Drake diff --git a/sql/old/3.3.5a/2012_04_20_02_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_20_02_world_creature_loot_template.sql new file mode 100644 index 00000000000..09b5beee75c --- /dev/null +++ b/sql/old/3.3.5a/2012_04_20_02_world_creature_loot_template.sql @@ -0,0 +1,4 @@ +DELETE FROM `creature_loot_template` WHERE `entry` IN (31702,32297) AND `item`=44564; +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(31702,44564,0.5,1,0,1,1), -- Recipe: Mighty Arcane Protection Potion on Frostbrood Spawn +(32297,44564,0.5,1,0,1,1); -- Recipe: Mighty Arcane Protection Potion on Cult Researcher diff --git a/sql/old/3.3.5a/2012_04_20_03_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_20_03_world_creature_loot_template.sql new file mode 100644 index 00000000000..a0b586ee0d9 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_20_03_world_creature_loot_template.sql @@ -0,0 +1,7 @@ +SET @ITEM := 50406; -- Formula: Enchant Gloves - Angler +UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` IN(26343,26344,26336); +DELETE FROM `creature_loot_template` WHERE `item`=@ITEM; +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(26343, @ITEM, 1.1, 1, 0, 1, 1), -- Indu'Le Fisherman +(26336, @ITEM, 0.9, 1, 0, 1, 1), -- Indu'Le Mystic +(26344, @ITEM, 1, 1, 0, 1, 1); -- Indu'Le Warrior diff --git a/sql/old/3.3.5a/2012_04_20_04_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_20_04_world_creature_loot_template.sql new file mode 100644 index 00000000000..73e01efa23e --- /dev/null +++ b/sql/old/3.3.5a/2012_04_20_04_world_creature_loot_template.sql @@ -0,0 +1,3 @@ +-- Make Grimscale Murlocs drop their heads faster... +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=-66 WHERE `item`=21757; + diff --git a/sql/old/3.3.5a/2012_04_20_05_gameobject_template.sql b/sql/old/3.3.5a/2012_04_20_05_gameobject_template.sql new file mode 100644 index 00000000000..24400b16a5c --- /dev/null +++ b/sql/old/3.3.5a/2012_04_20_05_gameobject_template.sql @@ -0,0 +1,8 @@ +-- Restore horrible mistake in UP34 from myself +UPDATE `gameobject_template` SET `data1`=27512 WHERE `entry`=195669; +UPDATE `gameobject_template` SET `data1`=27517 WHERE `entry`=195670; +UPDATE `gameobject_template` SET `data1`=27518 WHERE `entry`=195671; +-- Fix loottemplates along with it +UPDATE `gameobject_loot_template` SET `entry`=27512 WHERE `entry`=195669; +UPDATE `gameobject_loot_template` SET `entry`=27517 WHERE `entry`=195670; +UPDATE `gameobject_loot_template` SET `entry`=27518 WHERE `entry`=195671; diff --git a/sql/old/3.3.5a/2012_04_21_00_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_21_00_world_spell_script_names.sql new file mode 100644 index 00000000000..e61ef4aec74 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_21_00_world_spell_script_names.sql @@ -0,0 +1,14 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (20625,29142,35139,42393,49882,55269,56578,38441,66316,67100,67101,67102); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(20625,'spell_gen_default_count_pct_from_max_hp'), -- Ritual of Doom Sacrifice +(29142,'spell_gen_default_count_pct_from_max_hp'), -- Eyesore Blaster +(35139,'spell_gen_default_count_pct_from_max_hp'), -- Throw Boom's Doom +(42393,'spell_gen_default_count_pct_from_max_hp'), -- Brewfest - Attack Keg +(49882,'spell_gen_default_count_pct_from_max_hp'), -- Leviroth Self-Impale +(55269,'spell_gen_default_count_pct_from_max_hp'), -- Deathly Stare +(56578,'spell_gen_default_count_pct_from_max_hp'), -- Rapid-Fire Harpoon +(38441,'spell_gen_50pct_count_pct_from_max_hp'), -- Cataclysmic Bolt +(66316,'spell_gen_50pct_count_pct_from_max_hp'), -- Spinning Pain Spike 10m +(67100,'spell_gen_50pct_count_pct_from_max_hp'), -- Spinning Pain Spike 25m +(67101,'spell_gen_50pct_count_pct_from_max_hp'), -- Spinning Pain Spike 10m heroic +(67102,'spell_gen_50pct_count_pct_from_max_hp'); -- Spinning Pain Spike 25m heroic diff --git a/sql/old/3.3.5a/2012_04_22_00_world_sai.sql b/sql/old/3.3.5a/2012_04_22_00_world_sai.sql new file mode 100644 index 00000000000..f223883c8a7 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_22_00_world_sai.sql @@ -0,0 +1,63 @@ +-- SAI for Tabard Vendor Elizabeth Ross +SET @ROSS := 28776; +SET @GOSSIP := 9832; + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ROSS; + +DELETE FROM `gossip_menu_option` WHERE `menu_id`=@GOSSIP AND `id`>0 AND `id`<11; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES +(@GOSSIP, 1, 0, 'I''ve lost my Blood Knight Tabard.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 2, 0, 'I''ve lost my Tabard of the Hand.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 3, 0, 'I''ve lost my Tabard of the Protector.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 4, 0, 'I''ve lost my Green Trophy Tabard of the Illidari.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 5, 0, 'I''ve lost my Purple Trophy Tabard of the Illidari.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 6, 0, 'I''ve lost my Tabard of Summer Skies.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 7, 0, 'I''ve lost my Tabard of Summer Flames.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 8, 0, 'I''ve lost my Loremaster''s Colors.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 9, 0, 'I''ve lost my Tabard of the Explorer.', 1, 1, 0, 0, 0, 0, ''), +(@GOSSIP, 10, 0, 'I''ve lost my Tabard of the Achiever.', 1, 1, 0, 0, 0, 0, ''); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ROSS AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ROSS, 0, 0, 10, 62, 0, 100, 0, @GOSSIP, 1, 0, 0, 11, 54974, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Blood Knight Tabard'), +(@ROSS, 0, 1, 10, 62, 0, 100, 0, @GOSSIP, 2, 0, 0, 11, 54976, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Tabard of the Hand'), +(@ROSS, 0, 2, 10, 62, 0, 100, 0, @GOSSIP, 3, 0, 0, 11, 55008, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Tabard of the Protector'), +(@ROSS, 0, 3, 10, 62, 0, 100, 0, @GOSSIP, 4, 0, 0, 11, 54977, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Green Trophy Tabard of the Illidari'), +(@ROSS, 0, 4, 10, 62, 0, 100, 0, @GOSSIP, 5, 0, 0, 11, 54982, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Purple Trophy Tabard of the Illidari'), +(@ROSS, 0, 5, 10, 62, 0, 100, 0, @GOSSIP, 6, 0, 0, 11, 62768, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Tabard of Summer Skies'), +(@ROSS, 0, 6, 10, 62, 0, 100, 0, @GOSSIP, 7, 0, 0, 11, 62769, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Tabard of Summer Flames'), +(@ROSS, 0, 7, 10, 62, 0, 100, 0, @GOSSIP, 8, 0, 0, 11, 58194, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Loremaster''s Colors'), +(@ROSS, 0, 8, 10, 62, 0, 100, 0, @GOSSIP, 9, 0, 0, 11, 58224, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Tabard of the Explorer'), +(@ROSS, 0, 9, 10, 62, 0, 100, 0, @GOSSIP, 10, 0, 0, 11, 55006, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Cast Spell Create Tabard of the Achiever'), +(@ROSS, 0, 10, 0, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Elizabeth Ross - On Gossip Select - Close Gossip'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,@GOSSIP,1,0,2,25549,1,1,1,0,'','Only show gossip if player doesn''t have Blood Knight Tabard'), +(15,@GOSSIP,1,0,8,9737,0,0,0,0,'','Only show gossip if player already finished quest True Masters of Light'), +(15,@GOSSIP,2,0,2,24344,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of the Hand'), +(15,@GOSSIP,2,0,8,9762,0,0,0,0,'','Only show gossip if player already finished quest The Unwritten Prophecy'), +(15,@GOSSIP,3,0,2,28788,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of the protector'), +(15,@GOSSIP,3,0,8,10259,0,0,0,0,'','Only show gossip if player already finished quest Into the Breach'), +(15,@GOSSIP,4,0,2,31404,1,1,1,0,'','Only show gossip if player doesn''t have Green Trophy Tabard of Illidari'), +(15,@GOSSIP,4,0,2,31405,1,1,1,0,'','Only show gossip if player doesn''t have Purple Trophy Tabard of Illidari'), +(15,@GOSSIP,4,0,2,31408,1,1,1,0,'','Only show gossip if player doesn''t have Offering of the Sha''tar'), +(15,@GOSSIP,4,0,8,10781,0,0,0,0,'','Only show gossip if player already finished quest Battle of the Crimson Watch'), +(15,@GOSSIP,5,0,2,31404,1,1,1,0,'','Only show gossip if player doesn''t have Green Trophy Tabard of Illidari'), +(15,@GOSSIP,5,0,2,31405,1,1,1,0,'','Only show gossip if player doesn''t have Purple Trophy Tabard of Illidari'), +(15,@GOSSIP,5,0,2,31408,1,1,1,0,'','Only show gossip if player doesn''t have Offering of the Sha''tar'), +(15,@GOSSIP,5,0,8,10781,0,0,0,0,'','Only show gossip if player already finished quest Battle of the Crimson Watch'), +(15,@GOSSIP,6,0,2,35279,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of Summer Skies'), +(15,@GOSSIP,6,0,2,35280,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of Summer Flames'), +(15,@GOSSIP,6,0,8,11972,0,0,0,0,'','Only show gossip if player already finished quest Shards of Ahune'), +(15,@GOSSIP,7,0,2,35279,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of Summer Skies'), +(15,@GOSSIP,7,0,2,35280,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of Summer Flames'), +(15,@GOSSIP,7,0,8,11972,0,0,0,0,'','Only show gossip if player already finished quest Shards of Ahune'), +(15,@GOSSIP,8,0,2,43300,1,1,1,0,'','Only show gossip if player doesn''t have Loremaster''s Colors'), +(15,@GOSSIP,8,0,17,1681,0,0,0,0,'','Only show gossip if player have achievement Loremaster (A)'), +(15,@GOSSIP,8,1,2,43300,1,1,1,0,'','Only show gossip if player doesn''t have Loremaster''s Colors'), +(15,@GOSSIP,8,1,17,1682,0,0,0,0,'','Only show gossip if player have achievement Loremaster (H)'), +(15,@GOSSIP,9,0,2,43348,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of the Explorer'), +(15,@GOSSIP,9,0,17,45,0,0,0,0,'','Only show gossip if player have achievement Explore Northrend'), +(15,@GOSSIP,10,0,2,40643,1,1,1,0,'','Only show gossip if player doesn''t have Tabard of the Explorer'), +(15,@GOSSIP,10,0,17,1021,0,0,0,0,'','Only show gossip if player have achievement Twenty-Five Tabards'); diff --git a/sql/old/3.3.5a/2012_04_23_00_world_creatures.sql b/sql/old/3.3.5a/2012_04_23_00_world_creatures.sql new file mode 100644 index 00000000000..3730fabf552 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_23_00_world_creatures.sql @@ -0,0 +1,12 @@ +UPDATE `creature_template` SET `flags_extra`=0x82,`ModelId1`=1126,`ModelId2`=16925 WHERE `entry` IN (38008,38641,38773,38774); -- Blood Orb Controller +UPDATE `creature_template` SET `flags_extra`=0x80,`ModelId1`=19725,`ModelId2`=31095,`baseattacktime`=2000,`speed_walk`=0.8,`speed_run`=0.28571 WHERE `entry` IN (38454,38775,38776,38777); -- Kinetic Bomb +UPDATE `creature_template` SET `exp`=2,`baseattacktime`=2000,`ModelId1`=19725,`ModelId2`=21342 WHERE `entry`=38458; -- Kinetic Bomb Target +UPDATE `creature_template` SET `baseattacktime`=2000,`speed_walk`=4.4,`ModelId1`=19725,`ModelId2`=26767 WHERE `entry` IN (38332,38451); -- Ball of Flame +UPDATE `creature_template` SET `flags_extra`=0x80 WHERE `entry`=37950; -- Valithria Dreamwalker +UPDATE `creature_template` SET `InhabitType`=4 WHERE `InhabitType`&4 AND `flags_extra`&0x80; -- make flying triggers fly +UPDATE `creature_template` SET `InhabitType`=4,`HoverHeight`=12 WHERE `entry`=37126; -- Sister Svalna +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=37950; -- Valithria Dreamwalker +UPDATE `creature_model_info` SET `bounding_radius`=1,`combat_reach`=0,`gender`=0 WHERE `modelid`=31095; -- Kinetic Bomb +UPDATE `creature_model_info` SET `bounding_radius`=0.5,`combat_reach`=1,`gender`=0 WHERE `modelid`=21342; -- Kinetic Bomb Target +UPDATE `creature_model_info` SET `bounding_radius`=0.5,`combat_reach`=1,`gender`=0 WHERE `modelid`=26767; -- Ball of Flame +UPDATE `creature_template_addon` SET `bytes1`=50331648,`bytes2`=1,`mount`=0,`emote`=0,`auras`=NULL WHERE `entry`=38454; -- Kinetic Bomb diff --git a/sql/old/3.3.5a/2012_04_23_01_world_conditions.sql b/sql/old/3.3.5a/2012_04_23_01_world_conditions.sql new file mode 100644 index 00000000000..c731426aa3f --- /dev/null +++ b/sql/old/3.3.5a/2012_04_23_01_world_conditions.sql @@ -0,0 +1,5 @@ +-- setup alternate conditions for spell 46488 +DELETE FROM `conditions` WHERE `SourceEntry` = 46488 AND `ElseGroup` = 1; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,46488,0,1,31,1,3,26817,0,0,0,'',''), +(13,1,46488,0,1,36,1,0,0,0,1,0,'',''); diff --git a/sql/old/3.3.5a/2012_04_23_02_world_prospecting_loot_template.sql b/sql/old/3.3.5a/2012_04_23_02_world_prospecting_loot_template.sql new file mode 100644 index 00000000000..6ea44d92722 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_23_02_world_prospecting_loot_template.sql @@ -0,0 +1,112 @@ +SET @TinRef := 13000; +SET @TBC1 := @TinRef+1; +SET @TBC2 := @TinRef+2; +SET @WOTLK1 := @TinRef+3; +SET @WOTLK2 := @TinRef+4; +SET @WOTLK3 := @TinRef+5; + +SET @Copper := 2770; +SET @Tin := 2771; +SET @Iron := 2772; +SET @Mithril := 3858; +SET @Thorium := 10620; +SET @FelIron := 23424; +SET @Adamantite := 23425; +SET @Cobalt := 36909; +SET @Saronite := 36912; +SET @Titanium := 36910; + +-- Reference Loot Templates +DELETE FROM `reference_loot_template` WHERE `entry` BETWEEN @TinRef AND @TinRef+5; +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Stupid Tin +(@TinRef,1529,0,1,1,1,1), -- Jade +(@TinRef,3864,0,1,1,1,1), -- Citrine +(@TinRef,7909,0,1,1,1,1), -- Aquamarine +-- TBC Greens +(@TBC1,21929,0,1,1,1,2), -- Flame Spessarite +(@TBC1,23077,0,1,1,1,2), -- Blood Garnet +(@TBC1,23079,0,1,1,1,2), -- Deep Peridot +(@TBC1,23107,0,1,1,1,2), -- Shadow Draenite +(@TBC1,23112,0,1,1,1,2), -- Golden Draenite +(@TBC1,23117,0,1,1,1,2), -- Azure Moonstone +-- TBC Blues +(@TBC2,23436,0,1,1,1,1), -- Living Ruby +(@TBC2,23437,0,1,1,1,1), -- Talasite +(@TBC2,23438,0,1,1,1,1), -- Star of Elune +(@TBC2,23439,0,1,1,1,1), -- Noble Topaz +(@TBC2,23440,0,1,1,1,1), -- Dawnstone +(@TBC2,23441,0,1,1,1,1), -- Nightseye +-- WOTLK Greens +(@WOTLK1,36917,0,1,1,1,2), -- Bloodstone +(@WOTLK1,36920,0,1,1,1,2), -- Sun Crystal +(@WOTLK1,36923,0,1,1,1,2), -- Chalcedony +(@WOTLK1,36926,0,1,1,1,2), -- Shadow Crystal +(@WOTLK1,36929,0,1,1,1,2), -- Huge Citrine +(@WOTLK1,36932,0,1,1,1,2), -- Dark Jade +-- WOTLK Blues +(@WOTLK2,36918,0,1,1,1,2), -- Scarlet Ruby +(@WOTLK2,36921,0,1,1,1,2), -- Autumn's Glow +(@WOTLK2,36924,0,1,1,1,2), -- Sky Sapphire +(@WOTLK2,36927,0,1,1,1,2), -- Twilight Opal +(@WOTLK2,36930,0,1,1,1,2), -- Monarch Topaz +(@WOTLK2,36933,0,1,1,1,2), -- Forest Emerald +-- WOTLK Epics +(@WOTLK3,36919,0,1,1,1,1), -- Cardinal Ruby +(@WOTLK3,36922,0,1,1,1,1), -- King's Amber +(@WOTLK3,36925,0,1,1,1,1), -- Majestic Zircon +(@WOTLK3,36928,0,1,1,1,1), -- Dreadstone +(@WOTLK3,36931,0,1,1,1,1), -- Ametrine +(@WOTLK3,36934,0,1,1,1,1); -- Eye of Zul +-- -------------------------------------------------------- +-- Prospecting Loot Templates +DELETE FROM `prospecting_loot_template` WHERE `entry` IN (@Copper,@Tin,@Iron,@Mithril,@Thorium,@FelIron,@Adamantite,@Cobalt,@Saronite,@Titanium); +INSERT INTO `prospecting_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Copper Ore +(@Copper,774,0,1,1,1,1), -- Malachite +(@Copper,818,0,1,1,1,1), -- Tigerseye +(@Copper,1210,10,1,0,1,1), -- Shadowgem +-- Tin Ore +(@Tin,1210,0,1,1,1,2), -- Shadowgem +(@Tin,1705,0,1,1,1,2), -- Lesser Moonstone +(@Tin,1206,0,1,1,1,2), -- Moss Agate +(@Tin,1,10,1,0,-@TinRef,1), -- One Rare gem chance +-- Iron Ore +(@Iron,1529,30,1,1,1,2), -- Jade +(@Iron,1705,30,1,1,1,2), -- Lesser Moonstone +(@Iron,3864,30,1,1,1,2), -- Citrine +(@Iron,7909,5,1,1,1,1), -- Aquamarine +(@Iron,7910,5,1,1,1,1), -- Star Ruby +-- Mithril Ore +(@Mithril,3864,30,1,1,1,2), -- Citrine +(@Mithril,7909,30,1,1,1,2), -- Aquamarine +(@Mithril,7910,30,1,1,1,2), -- Star Ruby +(@Mithril,12361,2.5,1,1,1,1), -- Blue Sapphire +(@Mithril,12364,2.5,1,1,1,1), -- Huge Emerald +(@Mithril,12799,2.5,1,1,1,1), -- Large Opal +(@Mithril,12800,2.5,1,1,1,1), -- Azerothian Diamond +-- Thorium Ore +(@Thorium,7910,30,1,1,1,2), -- Star Ruby +(@Thorium,12361,15,1,1,1,2), -- Blue Sapphire +(@Thorium,12364,15,1,1,1,2), -- Huge Emerald +(@Thorium,12799,15,1,1,1,2), -- Large Opal +(@Thorium,12800,15,1,1,1,2), -- Azerothian Diamond +(@Thorium,1,10,1,1,-@TBC1,1), -- one from TBC Greens +-- Fel Iron Ore +(@FelIron,1,95,1,1,-@TBC1,1), -- One from TBC Greens +(@FelIron,2,05,1,1,-@TBC2,1), -- One from TBC Blues +-- Adamantite Ore +(@Adamantite,24243,100,1,0,1,1), -- Adamantite Powder +(@Adamantite,1,100,1,1,-@TBC1,1), -- One from TBC Greens +(@Adamantite,2, 10,1,1,-@TBC2,1), -- One from TBC Blues +-- Cobalt Ore +(@Cobalt,1,95,1,1,-@WOTLK1,1), -- One from WOTLK Greens +(@Cobalt,2,05,1,1,-@WOTLK2,1), -- One from WOTLK Blues +-- Saronite Ore +(@Saronite,1,85,1,1,-@WOTLK1,2), -- One from WOTLK Greens +(@Saronite,2,15,1,1,-@WOTLK2,1), -- One from WOTLK Blues +-- Titanium Ore +(@Titanium,46849,75,1,0,1,1), -- Titanium Powder +(@Titanium,1,75,1,1,-@WOTLK1,2), -- Two from WOTLK Greens +(@Titanium,2,25,1,1,-@WOTLK2,1), -- One from WOTLK Blues +(@Titanium,3,20,1,0,-@WOTLK3,1); -- One from WOTLK Epics diff --git a/sql/old/3.3.5a/2012_04_23_03_world_skinning_loot_template.sql b/sql/old/3.3.5a/2012_04_23_03_world_skinning_loot_template.sql new file mode 100644 index 00000000000..a1aa9e070f2 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_23_03_world_skinning_loot_template.sql @@ -0,0 +1,44 @@ +UPDATE `creature_template` SET `skinloot`=entry WHERE `entry` IN (30260, 32517, 27641, 28860); +UPDATE `creature_template` SET `skinloot`=70202 WHERE `entry` IN (25774,29693); +UPDATE `creature_template` SET `skinloot`=70203 WHERE `entry`=28257; +UPDATE `creature_template` SET `skinloot`=70207 WHERE `entry`=34137; +UPDATE `creature_template` SET `skinloot`=70208 WHERE `entry` IN (32572,25448,25716,25713); +UPDATE `creature_template` SET `skinloot`=70210 WHERE `entry` IN (33528,40419,26723,31134,36891); +UPDATE `creature_template` SET `skinloot`=70211 WHERE `entry` IN (28847,30206,29875,29931,28203,30432); +UPDATE `creature_template` SET `skinloot`=70212 WHERE `entry` IN (27645,32377,29838,26628,26622,32490,38453,32485,26633,32400,32361,29768,29735,26641,27644,27642,26735,26730,26722,33776,35189,26716,26672,29664,29774); +UPDATE `creature_template` SET `skinloot`=70213 WHERE `entry` IN (27483,29312); +UPDATE `creature_template` SET `skinloot`=70214 WHERE `entry` IN (37217,34564); +UPDATE `creature_template` SET `skinloot`=27641 WHERE `entry` IN (31385,34269,34270,27641,30905,30353); + +DELETE FROM `skinning_loot_template` WHERE entry IN (30260,32517,70212,70213,70214,28860,27641); +INSERT INTO `skinning_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `groupid`, `mincountOrRef`, `maxcount`) VALUES +-- Stoic Mammoth +(30260,33568,100,0,1,3), -- Borean Leather +(30260,42542,-50,0,1,1), -- Stoic Mammoth Hide +-- Loque'nahak +(32517,33568,0,1,1,3), -- Borean Leather +(32517,44128,2,1,1,1), -- Arctic Fur +(32517,44687,100,0,1,1), -- Loque'Nahak's Pelt +-- skinloot 70212 +(70212,33568,0,1,1,3), -- Borean Leather +(70212,44128,1,1,1,1), -- Arctic Fur +-- skinloot 70213 +(70213,33568,0,1,5,12), -- Borean Leather +(70213,44128,1,1,1,1), -- Arctic Fur +-- skinloot 70214 +(70214,33568,0,1,12,16), -- Borean Leather +(70214,44128,25,1,1,1), -- Arctic Fur +-- Sartharion +(28860,33568,0,1,8,12), -- Borean Leather +(28860,38557,0,1,8,12),-- Icy Dragonscale +(28860,44128,1,1,1,1), -- Arctic Fur +-- Centrifuge Construct +(27641,41337,85,0,1,3), -- Whizzed-Out Gizmo +(27641,41338,80,0,1,3), -- Sprung Whirlygig +(27641,39690,15,0,1,3), -- Volatile Blasting Trigger +(27641,39684,8,0,1,1), -- Hair Trigger +(27641,36813,8,0,1,3), -- Sprung Sprocket +(27641,39681,8,0,2,4), -- Handful of Cobalt Bolts +(27641,49050,2,0,1,1), -- Schematic: Jeeves +(27641,39682,1,0,1,1), -- Overcharged Capacitor +(27641,39685,1,0,1,1); -- Indestructible Frame diff --git a/sql/old/3.3.5a/2012_04_23_04_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_23_04_world_creature_loot_template.sql new file mode 100644 index 00000000000..94d2b092d12 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_23_04_world_creature_loot_template.sql @@ -0,0 +1,2 @@ +-- Correct dropchance for Mote of Life, wowhead was wrong (as usual) +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=18.5307 WHERE `entry`=22307 AND `item`=22575; diff --git a/sql/old/3.3.5a/2012_04_23_05_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_23_05_world_creature_loot_template.sql new file mode 100644 index 00000000000..ddf0780d362 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_23_05_world_creature_loot_template.sql @@ -0,0 +1,3 @@ +-- Update the dropchance to 100% if on quest +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=-100 WHERE `entry`=21477 AND `item`=31372; -- Rocknail Flayer Carcass +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=-100 WHERE `entry`=21478 AND `item`=31373; -- Rocknail Flayer Giblets diff --git a/sql/old/3.3.5a/2012_04_24_00_world_command.sql b/sql/old/3.3.5a/2012_04_24_00_world_command.sql new file mode 100644 index 00000000000..25912392347 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_00_world_command.sql @@ -0,0 +1,10 @@ +DELETE FROM `command` WHERE `name` IN ('modify tp','modify bwalk','modify swim','modify fly','modify arena','modify aspeed','modify morph'); +INSERT INTO `command` (`name`, `security`, `help`) VALUES ('modify speed all', 1, 'Syntax: .modify aspeed #rate\r\n\r\nModify all speeds -run,swim,run back,swim back- of the selected player to "normalbase speed for this move type"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 50.'), +('modify speed backwalk', 1, 'Syntax: .modify speed backwalk #rate\r\n\r\nModify the speed of the selected player while running backwards to "normal walk back speed"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 50.'), +('modify speed fly', 1, '.modify speed fly #rate\nModify the flying speed of the selected player to "normal flying speed"*rate. If no player is selected, modify your speed.\n #rate may range from 0.1 to 50.'), +('modify speed swim', 1, 'Syntax: .modify speed swim #rate\r\n\r\nModify the swim speed of the selected player to "normal swim speed"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 50.'), +('modify speed walk', 1, 'Syntax: .modify speed bwalk #rate\r\n\r\nModify the speed of the selected player while running to "normal walk speed"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 50.'), +('modify talentpoints', 1, 'Syntax: .modify talentpoints #amount\r\n\r\nSet free talent points for selected character or character\'s pet. It will be reset to default expected at next levelup/login/quest reward.'), +('morph', 2, 'Syntax: .morph #displayid\r\n\r\nChange your current model id to #displayid.'), +('modify arenapoints', 1, 'Syntax: .modify arenapoints #value\r\nAdd $amount arena points to the selected player.'); +UPDATE `command` SET `help`='Syntax: .modify speed $speedtype #rate\r\n\r\nModify the running speed of the selected player to "normal base run speed"= 1. If no player is selected, modify your speed.\r\n\r\n$speedtypes may be fly, all, walk, backwalk, or swim.\r\n\r\n #rate may range from 0.1 to 50.' WHERE `name`='modify speed' LIMIT 1; diff --git a/sql/old/3.3.5a/2012_04_24_01_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_24_01_world_spell_proc_event.sql new file mode 100644 index 00000000000..6e997931bb5 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_01_world_spell_proc_event.sql @@ -0,0 +1,4 @@ +-- Honor Among Thieves proc chance +UPDATE `spell_proc_event` SET `CustomChance`=33 WHERE `entry`=51698; -- Rank 1 +UPDATE `spell_proc_event` SET `CustomChance`=66 WHERE `entry`=51700; -- Rank 2 +UPDATE `spell_proc_event` SET `CustomChance`=100 WHERE `entry`=51701; -- Rank 3 diff --git a/sql/old/3.3.5a/2012_04_24_02_world_warden_checks.sql b/sql/old/3.3.5a/2012_04_24_02_world_warden_checks.sql new file mode 100644 index 00000000000..74539f99fb3 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_02_world_warden_checks.sql @@ -0,0 +1,8 @@ +UPDATE `warden_checks` SET `comment`='Swimming_FallCalc - movement state' WHERE `id`=15; +UPDATE `warden_checks` SET `comment`='CreateMovementStatus' WHERE `id`=72; +UPDATE `warden_checks` SET `comment`='OnStartSwim OnSplineStartSwim - movement state' WHERE `id`=170; +UPDATE `warden_checks` SET `comment`='DefaultServerLogin - account name' WHERE `id`=198; +UPDATE `warden_checks` SET `comment`='Login Checksum - authentication process' WHERE `id`=320; +UPDATE `warden_checks` SET `comment`='CalcFallStartElevation - (some kind of wall climb)' WHERE `id`=329; +UPDATE `warden_checks` SET `comment`='Code injection at 0x40100A' WHERE `id`=381; +UPDATE `warden_checks` SET `comment`='Login State - (May be false positive)' WHERE `id`=437; diff --git a/sql/old/3.3.5a/2012_04_24_03_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_24_03_world_spell_script_names.sql new file mode 100644 index 00000000000..a53d8bd585c --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_03_world_spell_script_names.sql @@ -0,0 +1,4 @@ +-- Earthen Power +DELETE FROM `spell_script_names` WHERE `spell_id`=59566; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(59566,'spell_sha_earthen_power'); diff --git a/sql/old/3.3.5a/2012_04_24_04_world_spell_proc_event.sql b/sql/old/3.3.5a/2012_04_24_04_world_spell_proc_event.sql new file mode 100644 index 00000000000..5ba6f24ccf8 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_04_world_spell_proc_event.sql @@ -0,0 +1,4 @@ + -- Rogue T9 2P - Should proc only from Rupture ticks. +DELETE FROM `spell_proc_event` WHERE `entry` IN(67209); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `procFlags`) VALUES +(67209, 0x01, 8, 0x100000, 0x50000); diff --git a/sql/old/3.3.5a/2012_04_24_05_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_04_24_05_world_creature_loot_template.sql new file mode 100644 index 00000000000..c524999b492 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_05_world_creature_loot_template.sql @@ -0,0 +1,9 @@ +-- Apply same loot template to below mentioned Bloodsail NPCs as that of Bloodsail Raider 1561 +-- (Mage 1562, Swashbuckler 1563, Warlock 1564, Sea Dog 1565) +UPDATE `creature_template` SET `lootid`=1561 WHERE `entry` IN (1562,1563,1564,1565); +-- Remove Loot from `creature_loot_template` for above mentioned NPCs because it contains only 2 items. +-- Those 2 items, along with complete loot template for these mobs is applied in query above. +DELETE FROM `creature_loot_template` WHERE `entry` IN (1562,1563,1564,1565); +-- Remove loot and gold drop from Bloodsail Warlock's Minions +UPDATE `creature_template` SET `lootid`=0, `mingold`=0 AND `maxgold`=0 WHERE `entry` IN (10928,12922); +DELETE FROM `creature_loot_template` WHERE `entry` IN (10928,12922); diff --git a/sql/old/3.3.5a/2012_04_24_06_world_misc.sql b/sql/old/3.3.5a/2012_04_24_06_world_misc.sql new file mode 100644 index 00000000000..2e095a76cd9 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_24_06_world_misc.sql @@ -0,0 +1,31 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` = 46485; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(46485,'spell_item_greatmothers_soulcatcher'); + +DELETE FROM `conditions` WHERE `SourceEntry` IN (46485,46488); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,46485,0,1,31,1,3,26817,0,0,0,'',''), +(13,1,46485,0,1,36,1,0,0,0,1,0,'',''), +(13,1,46488,0,1,31,1,3,26817,0,0,0,'',''), +(13,1,46488,0,1,36,1,0,0,0,1,0,'',''); + +-- Gnome Soul SAI +SET @ENTRY := 26096; +SET @SPELL_ARCANE_EXPLOSION := 35426; +UPDATE creature_template SET AIName="SmartAI" WHERE entry=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,54,0,100,0,0,0,0,0,33,@ENTRY,0,0,0,0,0,7,0,0,0,0,0,0,0,"Gnome Soul - On Just Summoned - Quest Credit"), +(@ENTRY,0,1,2,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,25814,10,1,0,0,0,0,"Gnome Soul - On Just Summoned - Set Data Fizzcrank Mechagnome"), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,69,1,0,0,0,0,0,7,0,0,0,0,0,0,0,"Gnome Soul - On Just Summoned - Move to Summoner"), + +(@ENTRY,0,3,4,34,0,100,0,1,0,0,0,11,@SPELL_ARCANE_EXPLOSION,0,0,0,0,0,1,0,0,0,0,0,0,0,"Gnome Soul - Reached Summoner - Cast Arcane Explosion Visual"), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Gnome Soul - Reached Summoner - Forced Despawn"); + +-- Fizzcrank Mechagnome SAI +SET @ENTRY := 25814; +UPDATE creature_template SET AIName="SmartAI" WHERE entry=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,4,0,100,0,0,0,0,0,1,1,10000,0,0,0,0,0,0,0,0,0,0,0,0,"Fizzcrank Mechagnome - Chance Say on Aggro"), +(@ENTRY,1,0,0,38,0,100,0,1,1,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Fizzcrank Mechagnome - On Data Set - Forced Despawn"); diff --git a/sql/old/3.3.5a/2012_04_25_00_world_misc.sql b/sql/old/3.3.5a/2012_04_25_00_world_misc.sql new file mode 100644 index 00000000000..3d2f20fdc8c --- /dev/null +++ b/sql/old/3.3.5a/2012_04_25_00_world_misc.sql @@ -0,0 +1,3 @@ +UPDATE `smart_scripts` SET `source_type`=0,`id`=1 WHERE `entryorguid`=24814 AND `source_type`=1 AND `event_type`=38; +UPDATE `conditions` SET `SourceTypeOrReferenceId`=17 WHERE `SourceEntry` IN (46485,46488); +UPDATE `conditions` SET `ElseGroup`=0 WHERE `SourceEntry` IN (46485,46488) AND `ConditionValue1`=26817; diff --git a/sql/old/3.3.5a/2012_04_25_01_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_25_01_world_spell_script_names.sql new file mode 100644 index 00000000000..7b7135860ab --- /dev/null +++ b/sql/old/3.3.5a/2012_04_25_01_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` = 33110; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(33110,'spell_pri_prayer_of_mending_heal'); diff --git a/sql/old/3.3.5a/2012_04_25_02_world_spell_script_names.sql b/sql/old/3.3.5a/2012_04_25_02_world_spell_script_names.sql new file mode 100644 index 00000000000..ad63bc87837 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_25_02_world_spell_script_names.sql @@ -0,0 +1,11 @@ +DELETE FROM `spell_scripts` WHERE `id` IN (15998,25952,29435,45980,51592,51910,52267,54420); +DELETE FROM `spell_script_names` WHERE `spell_id` IN (15998,25952,29435,45980,51592,51910,52267,54420); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(15998, 'spell_gen_despawn_self'), +(25952, 'spell_gen_despawn_self'), +(29435, 'spell_gen_despawn_self'), +(45980, 'spell_gen_despawn_self'), +(51592, 'spell_gen_despawn_self'), +(51910, 'spell_gen_despawn_self'), +(52267, 'spell_gen_despawn_self'), +(54420, 'spell_gen_despawn_self'); diff --git a/sql/old/3.3.5a/2012_04_25_03_world_spell_group.sql b/sql/old/3.3.5a/2012_04_25_03_world_spell_group.sql new file mode 100644 index 00000000000..a6fa90ad41d --- /dev/null +++ b/sql/old/3.3.5a/2012_04_25_03_world_spell_group.sql @@ -0,0 +1,11 @@ +DELETE FROM `spell_group` WHERE `id` IN (1117,1118); +INSERT INTO `spell_group` (`id`,`spell_id`) VALUES +(1117,25898), +(1117,25899), +(1118,20911), +(1118,20217); + +DELETE FROM `spell_group_stack_rules` WHERE `group_id` in (1117,1118); +INSERT INTO `spell_group_stack_rules` (`group_id`,`stack_rule`) VALUES +(1117,3), +(1118,3); diff --git a/sql/old/3.3.5a/2012_04_26_00_world_conditions.sql b/sql/old/3.3.5a/2012_04_26_00_world_conditions.sql new file mode 100644 index 00000000000..8d525cad057 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_26_00_world_conditions.sql @@ -0,0 +1 @@ +UPDATE `conditions` SET `ElseGroup` = 0, `SourceGroup` = 0 WHERE `SourceEntry` IN (46485,46488); diff --git a/sql/old/3.3.5a/2012_04_26_01_world_smart_scripts.sql b/sql/old/3.3.5a/2012_04_26_01_world_smart_scripts.sql new file mode 100644 index 00000000000..e90e7b58433 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_26_01_world_smart_scripts.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `source_type` = 0, `id` = 1 WHERE `entryorguid` = 25814 AND `source_type` = 1 AND `id` = 0; diff --git a/sql/old/3.3.5a/2012_04_27_00_world_instance_icc.sql b/sql/old/3.3.5a/2012_04_27_00_world_instance_icc.sql new file mode 100644 index 00000000000..6738e4904ab --- /dev/null +++ b/sql/old/3.3.5a/2012_04_27_00_world_instance_icc.sql @@ -0,0 +1,5 @@ +DELETE FROM `creature_text` WHERE `entry`=37813 AND `groupid`=14; +INSERT INTO `creature_text` (`entry`,`groupid`,`text`,`type`,`comment`) VALUES (37813,14,'%s''s Blood Beasts gain the scent of blood!',41,'Deathbringer Saurfang - EMOTE_SCENT_OF_BLOOD'); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=72771; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`Comment`) VALUES +(13,3,72771,31,3,38508,'Deathbringer Saurfang - Scent of Blood on Blood Beast'); diff --git a/sql/old/3.3.5a/2012_04_28_00_world_reference_loot_template.sql b/sql/old/3.3.5a/2012_04_28_00_world_reference_loot_template.sql new file mode 100644 index 00000000000..07c53a8f7c9 --- /dev/null +++ b/sql/old/3.3.5a/2012_04_28_00_world_reference_loot_template.sql @@ -0,0 +1,158 @@ +-- The Descent into Madness +-- References +-- ------------------------------- +-- -- Variables and definitions -- +-- ------------------------------- +-- Set References +SET @Vezax10Ref := 34373; +SET @Vezax25Ref := @Vezax10Ref+1; +SET @Yogg10Ref := @Vezax10Ref+2; +SET @Yogg25Ref := @Vezax10Ref+3; +SET @Chest := 12034; +SET @Shoulder := 12035; +SET @EmblemRef := 34349; +SET @Recipe := 34154; +SET @Vezax10 := 33271; +SET @Vezax25 := 33449; +SET @Yogg10 := 33288; +SET @Yogg25 := 33955; + +-- ------------------------- +-- -- Reference Templates -- +-- ------------------------- +-- Delete previous templates if existing +DELETE FROM `reference_loot_template` WHERE `entry` IN (34131,34132,34133,34164,34165); +DELETE FROM `reference_loot_template` WHERE `entry` IN (@Vezax10Ref,@Vezax25Ref,@Yogg10Ref,@Yogg25Ref,@Chest,@Shoulder); +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Vezax 10 man +(@Vezax10Ref,46014,0,1,1,1,1), -- Saronite Animus Cloak +(@Vezax10Ref,46008,0,1,1,1,1), -- Choker of the Abyss +(@Vezax10Ref,46010,0,1,1,1,1), -- Darkstone Ring +(@Vezax10Ref,45996,0,1,1,1,1), -- Hoperender +(@Vezax10Ref,46015,0,1,1,1,1), -- Pendant of Endless Despair +(@Vezax10Ref,46013,0,1,1,1,1), -- Underworld Mantle +(@Vezax10Ref,46012,0,1,1,1,1), -- Vestments of the Piercing Light +(@Vezax10Ref,46009,0,1,1,1,1), -- Bindings of the Depths +(@Vezax10Ref,45997,0,1,1,1,1), -- Gauntlets of the Wretched +(@Vezax10Ref,46011,0,1,1,1,1), -- Shadowbite +-- Vezax 25 man +(@Vezax25Ref,45513,0,1,1,1,1), -- Boots of the Forgotten Dephts +(@Vezax25Ref,45509,0,1,1,1,1), -- Idol of the Corruptor +(@Vezax25Ref,45501,0,1,1,1,1), -- Boots of the Underdweller +(@Vezax25Ref,45512,0,1,1,1,1), -- Grips of the Unbroken +(@Vezax25Ref,45503,0,1,1,1,1), -- Metallic Loop of the Sufferer +(@Vezax25Ref,45505,0,1,1,1,1), -- Belt of Clinging Hope +(@Vezax25Ref,45502,0,1,1,1,1), -- Helm of the Faceless +(@Vezax25Ref,45145,0,1,1,1,1), -- Libram of the Sacred Shield +(@Vezax25Ref,45508,0,1,1,1,1), -- Belt of the Darkspeaker +(@Vezax25Ref,45504,0,1,1,1,1), -- Darkcore Leggings +(@Vezax25Ref,45514,0,1,1,1,1), -- Mantle of the Unknowing +(@Vezax25Ref,45515,0,1,1,1,1), -- Ring of the Vacant Eye +(@Vezax25Ref,45507,0,1,1,1,1), -- The General's Heart +-- Yogg 10 man +(@Yogg10Ref,46016,0,1,1,1,1), -- Abaddon +(@Yogg10Ref,46018,0,1,1,1,1), -- Deliverance +(@Yogg10Ref,46019,0,1,1,1,1), -- Leggings of the Insatiable +(@Yogg10Ref,46021,0,1,1,1,1), -- Royal Seal of King Llane +(@Yogg10Ref,46022,0,1,1,1,1), -- Pendant of a Thousand Maws +(@Yogg10Ref,46024,0,1,1,1,1), -- Kingsbane +(@Yogg10Ref,46025,0,1,1,1,1), -- Devotion +(@Yogg10Ref,46028,0,1,1,1,1), -- Faceguard of the Eyeless Horror +(@Yogg10Ref,46030,0,1,1,1,1), -- Threads of the Dragon Council +(@Yogg10Ref,46031,0,1,1,1,1), -- Touch of Madness +-- Yogg 25 man +(@Yogg25Ref,45521,0,1,1,1,1), -- Earthshaper +(@Yogg25Ref,45522,0,1,1,1,1), -- Blood of the Old God +(@Yogg25Ref,45523,0,1,1,1,1), -- Garona's Guise +(@Yogg25Ref,45524,0,1,1,1,1), -- Chestguard of Insidious Intent +(@Yogg25Ref,45525,0,1,1,1,1), -- Godbane Signet +(@Yogg25Ref,45527,0,1,1,1,1), -- Soulscribe +(@Yogg25Ref,45529,0,1,1,1,1), -- Shawl of Haunted Memories +(@Yogg25Ref,45530,0,1,1,1,1), -- Sanity's Bond +(@Yogg25Ref,45531,0,1,1,1,1), -- Chestguard of the Fallen God +(@Yogg25Ref,45532,0,1,1,1,1), -- Cowl of Dark Whispers +-- Chest for Yogg +(@Chest,45635,0,1,1,1,1), -- Chestguard of the Wayward Conqueror +(@Chest,45636,0,1,1,1,1), -- Chestguard of the Wayward Protector +(@Chest,45637,0,1,1,1,1), -- Chestguard of the Wayward Vanquisher +(@Shoulder,45656,0,1,1,1,1), -- Mantle of the Wayward Conqueror +(@Shoulder,45657,0,1,1,1,1), -- Mantle of the Wayward Protector +(@Shoulder,45658,0,1,1,1,1); -- Mantle of the Wayward Vanquisher + +DELETE FROM `creature_loot_template` WHERE `entry` IN(@Vezax10,@Vezax25,@Yogg10,@Yogg25); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- ---------------------------------------------------------- +-- General Vezax +-- ---------------------------------------------------------- +-- 10 man mode +(@Vezax10,1,100,3,0,-@Vezax10Ref,2), -- 2x Normal Loot Item +(@Vezax10,47241,100,3,0,1,1), -- 1x Emblem of Triumph +-- hardmode loot 10 +(@Vezax10,46032,0,2,1,1,1), -- Drape of the Faceless General +(@Vezax10,46034,0,2,1,1,1), -- Leggings of Profound Darkness +(@Vezax10,46033,0,2,1,1,1), -- Tortured Earth +(@Vezax10,46035,0,2,1,1,1), -- Aesuga, Hand of the Ardent Champion +(@Vezax10,46036,0,2,1,1,1), -- Void Sabre +-- 25 man mode +(@Vezax25,1,100,3,0,-@Vezax25Ref,3), -- 3x Normal Loot Item +(@Vezax25,47241,100,3,0,1,1), -- 1x Emblem of Triumph +(@Vezax25,2,10,1,0,-@Recipe,1), -- Chance on Recipe +(@Vezax25,3,10,1,0,-34350,1), -- Chance on Runed Orb +-- hardmode loot 25 +(@Vezax25,45498,0,2,1,1,1), -- Lotrafen, Spear of the Damned +(@Vezax25,45511,0,2,1,1,1), -- Scepter of Lost Souls +(@Vezax25,45516,0,2,1,1,1), -- Voldrethar, Dark Blade of Oblivion +(@Vezax25,45517,0,2,1,1,1), -- Pendulum of Infinity +(@Vezax25,45519,0,2,1,1,1), -- Vestments of the Blind Denizen +(@Vezax25,45518,0,2,1,1,1), -- Flare of the Heavens +(@Vezax25,45520,0,2,1,1,1), -- Handwraps of the Vigilant +-- ---------------------------------------------------------- +-- Yogg Saron +-- ---------------------------------------------------------- +-- 10 man +-- All modes +(@Yogg10,1,100,31,0,-@Yogg10Ref,1), -- 1x Normal Loot item for modes 0&1&2&3&4 +(@Yogg10,2,100,31,0,-@Chest,1), -- 1x Tier token for modes 0&1&2&3&4 +(@Yogg10,47241,100,31,0,1,1), -- 1x Emblem of Triumph for modes 0&1&2&3&4 +-- Extra for <3 watchers +(@Yogg10,3,100,30,0,-@EmblemRef,1), -- additional Emblem for modes2&3 +-- Extra for <2 watchers +(@Yogg10,4,100,28,0,-34350,1), -- Runed Orb for 0&1&2 +(@Yogg10,5,10,28,0,-@Recipe,1), -- Chance on Recipe for 0&1&2 +-- Extra for <1 watchers +(@Yogg10,6,100,24,0,-@EmblemRef,1), -- additional Emblem for 0&1 +(@Yogg10,7,100,24,0,-@Recipe,1), -- Garanteed Recipe for 0&1 +-- Hardmode 10 loot +(@Yogg10,46067,0,24,1,1,1), -- Hammer of Crushing Whispers +(@Yogg10,46068,0,24,1,1,1), -- Amice of Inconceivable Horror +(@Yogg10,46095,0,24,1,1,1), -- Soul-Devouring Cinch +(@Yogg10,46096,0,24,1,1,1), -- Signet of Soft Lament +(@Yogg10,46097,0,24,1,1,1), -- Caress of Insanity +-- Extra for 0 watchers +(@Yogg10,46312,100,16,0,1,1), -- Vanquished Clutches of Yogg-Saron +-- 25 man mode +-- All modes +(@Yogg25,1,100,31,0,-@Yogg25Ref,2), -- 2x Normal Loot item for modes 0&1&2&3&4 +(@Yogg25,2,100,31,0,-@Shoulder,2), -- 2x Tier token for modes 0&1&2&3&4 +(@Yogg25,47241,100,31,0,1,1), -- 1x Emblem of Triumph for modes 0&1&2&3&4 +(@Yogg25,3,10,31,0,-34350,1), -- Chance on Runed Orb for modes 0&1&2&3&4 +(@Yogg25,4,10,31,0,-@Recipe,1), -- Chance on Recipe for 0&1&2&3&4 +(@Yogg25,45897,100,31,0,1,1), -- Fragment of Val'anyr +-- Extra for <3 watchers +(@Yogg25,5,100,30,0,-@EmblemRef,1), -- additional Emblem for modes2&3 +-- Extra for <2 watchers +(@Yogg25,6,100,28,0,-34350,1), -- Runed Orb for 0&1&2 +-- Extra for <1 watchers +(@Yogg25,7,100,24,0,-@EmblemRef,1), -- additional Emblem for 0&1 +(@Yogg25,8,100,24,0,-@Recipe,1), -- Garanteed Recipe for 0&1 +-- Hardmode 25 loot +(@Yogg25,45533,0,24,1,1,1), -- Dark Edge of Depravity +(@Yogg25,45534,0,24,1,1,1), -- Seal of the Betrayed King +(@Yogg25,45535,0,24,1,1,1), -- Show of Faith +(@Yogg25,45536,0,24,1,1,1), -- Legguards of Cunning Deception +(@Yogg25,45537,0,24,1,1,1), -- Threads of the False Oracle +-- Extra for 0 watchers +(@Yogg25,45693,100,16,0,1,1); -- Mimiron's Head + +-- Cleanups +DELETE FROM `conditions` WHERE `SourceEntry`=45897 AND `SourceGroup`=33955; diff --git a/sql/old/3.3.5a/2012_04_28_01_world_reference_loot_template.sql b/sql/old/3.3.5a/2012_04_28_01_world_reference_loot_template.sql new file mode 100644 index 00000000000..e46c45e497a --- /dev/null +++ b/sql/old/3.3.5a/2012_04_28_01_world_reference_loot_template.sql @@ -0,0 +1,22 @@ +SET @Triumph :=47241; +-- Cleanup some unneeded references +DELETE FROM `reference_loot_template` WHERE `entry` IN (34167,34168,34169); +UPDATE `creature_loot_template` SET `mincountOrRef`=-34349 WHERE `mincountOrRef` IN (-34167,-34168,-34169); +-- Fix this weird defined reference for ulduar +UPDATE `reference_loot_template` SET `ChanceOrQuestChance`=100,`groupid`=0 WHERE `entry`=34349; +-- Remove Emblem of Triumph from reference_loot +DELETE FROM `reference_loot_template` WHERE `item`=@Triumph AND `entry`IN (12025,35034,35040,35049); +-- Actual Emblem on creature as it should be +DELETE FROM `creature_loot_template` WHERE `entry` IN (30397,30398,31365,31367,31656,31679) AND `item`=@Triumph; +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(30397,@Triumph,100,1,0,1,1), -- Commander Kolurg (1) +(30398,@Triumph,100,1,0,1,1), -- Commander Stoutbeard (1) +(31365,@Triumph,100,1,0,1,1), -- Drakkari Colossus (1) +(31367,@Triumph,100,1,0,1,1), -- Drakkari Elemental (1) +(31656,@Triumph,100,1,0,1,1), -- Dalronn the Controller (1) +(31679,@Triumph,100,1,0,1,1); -- Skarvald the Constructor (1) +-- Similar action for gameobjects +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (27416,27417) AND `item`=@Triumph; +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(27417,@Triumph,100,1,0,1,1), -- Confessor's Cache +(27416,@Triumph,100,1,0,1,1); -- Eadric's Cache diff --git a/sql/old/3.3.5a/2012_05_01_00_world_creature.sql b/sql/old/3.3.5a/2012_05_01_00_world_creature.sql new file mode 100644 index 00000000000..c0509d0d132 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_01_00_world_creature.sql @@ -0,0 +1,9 @@ +-- Add missing Challe & Orphan Matron Aria Spawns +SET @GUID := 41876; +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+1; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES +(@GUID,23101,530,1,1,0,0,-480.4989,7499.029,181.2889,3.560472,120,0,0,1,0,0), +(@GUID+1,34365,571,1,1,0,0,5716.604,642.8611,646.2927,5.88176,120,0,0,1,0,0); +-- Add to game event creature +DELETE FROM `game_event_creature` WHERE `guid`=@GUID+1; +INSERT INTO `game_event_creature` (`eventEntry`,`guid`) VALUES (10,@GUID+1); diff --git a/sql/old/3.3.5a/2012_05_02_00_world_creature_loot_template.sql b/sql/old/3.3.5a/2012_05_02_00_world_creature_loot_template.sql new file mode 100644 index 00000000000..f0721e63635 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_02_00_world_creature_loot_template.sql @@ -0,0 +1,8 @@ +DELETE FROM `creature_loot_template` WHERE `entry` IN(38064,38103); +INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Precious 25 man +(38103,1,100,1,0,-35069,2), -- Two From ICC Trashgenerated on Precious +(38103,52019,30,1,0,1,1), -- Precious Ribbon on Precious +(38064,1,100,1,0,-35069,2); -- Two From ICC Trashgenerated on Stinky +-- add skinning loot for Stinky & Precious +UPDATE `creature_template` SET `skinloot`=70214 WHERE `entry` IN (37025,38064,37217,38103); diff --git a/sql/old/3.3.5a/2012_05_03_00_world_creature.sql b/sql/old/3.3.5a/2012_05_03_00_world_creature.sql new file mode 100644 index 00000000000..d906dba78bc --- /dev/null +++ b/sql/old/3.3.5a/2012_05_03_00_world_creature.sql @@ -0,0 +1,29 @@ +SET @GUID1 := 42158; +SET @GUID2 := 42159; +-- add creature +DELETE FROM creature WHERE guid IN (@GUID1,@GUID2); +INSERT INTO `creature` +(`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`) +VALUES +(@GUID1 ,38453,571,1,1,3561.821,-2736.367,136.0317,0), -- Arcturis in Grizzly Hills +(@GUID2,35189,571,1,1,7101.845,-1443.734,924.2609,0.178631); -- Skoll in The Storm Peaks +-- Update template +UPDATE `creature_template` SET `faction_A` = 190, `faction_H`=190 WHERE `entry` IN (38453,35189); +SET @NPC= @GUID1*10; +-- Add pathing for Arcturis +DELETE FROM `creature_addon` WHERE `guid` = @GUID1; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@GUID1,@NPC,0,0,0,0,''); -- Add path for Acturis +-- Add waypoint data for the path: +DELETE FROM `waypoint_data` WHERE `id`=@NPC; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES +(@NPC,1,3563.499,-2737.698,137.1898), +(@NPC,2,3565.249,-2738.698,138.4398), +(@NPC,3,3566.749,-2739.948,139.9398), +(@NPC,4,3568.249,-2740.698,140.6898), +(@NPC,5,3567.839,-2741.380,141.9256), +(@NPC,6,3569.999,-2741.948,142.1898), +(@NPC,7,3570.749,-2742.448,143.1898), +(@NPC,8,3572.676,-2743.528,144.8479); +-- Spawntimefix +UPDATE `creature` SET `spawntimesecs`=39600 WHERE `guid` IN (@GUID1,@GUID2); -- Set the spawntime to 11 hours for Arcturis & Skoll diff --git a/sql/old/3.3.5a/2012_05_03_01_world_cos_misc.sql b/sql/old/3.3.5a/2012_05_03_01_world_cos_misc.sql new file mode 100644 index 00000000000..6c2ea6d3a95 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_03_01_world_cos_misc.sql @@ -0,0 +1,153 @@ +UPDATE `script_texts` SET `emote` = 432 WHERE `entry` IN (-1595111); +UPDATE `script_texts` SET `emote` = 396 WHERE `entry` IN (-1595070,-1595075,-1595078,-1595079,-1595088,-1595103,-1595106,-1595107,-1595108,-1595109,-1595113,-1595114,-1595115,-1595116); +UPDATE `script_texts` SET `emote` = 397 WHERE `entry` IN (-1595071,-1595084,-1595093); +UPDATE `script_texts` SET `emote` = 274 WHERE `entry` IN (-1595091); +UPDATE `script_texts` SET `emote` = 5 WHERE `entry` IN (-1595073,-1595118); +UPDATE `script_texts` SET `emote` = 6 WHERE `entry` IN (-1595076); +UPDATE `script_texts` SET `emote` = 1 WHERE `entry` IN (-1595083,-1595100,-1595104,-1595120); +UPDATE `script_texts` SET `emote` = 0 WHERE `entry` IN (-1595009,-1595010,-1595081,-1595082,-1595085,-1595119); + +UPDATE `script_texts` SET `type` = 1 WHERE `entry` IN (-1595009,-1595010,-1595087,-1595094,-1595095,-1595093); +UPDATE `script_texts` SET `type` = 0 WHERE `entry` IN (-1595077,-1595078,-1595119); + +UPDATE `script_texts` SET `content_default` = "Champions, meet me at the Town Hall at once. We must take the fight to Mal'Ganis." WHERE `entry` = -1595095; +UPDATE `script_texts` SET `content_default` = "Follow me, I know the way through." WHERE `entry` = -1595096; +UPDATE `script_texts` SET `content_default` = "Take position here, and I will lead a small force inside Stratholme to begin the culling. We must contain and purge the infected for the sake of all of Lordaeron!" WHERE entry = -1595087; +UPDATE `script_texts` SET `content_default` = "Ah, you've finally arrived Prince Arthas. You're here just in the nick of time." WHERE `entry` = -1595097; +UPDATE `script_texts` SET `content_default` = "Yes, I'm glad I could get to you before the plague." WHERE `entry` = -1595098; +UPDATE `script_texts` SET `content_default` = "As if I could forget. Listen, Uther, there's something about the plague you should know..." WHERE `entry` = -1595072; +UPDATE `script_texts` SET `content_default` = "There's no need for you to understand, Arthas. All you need to do is die." WHERE `entry` = -1595100; +UPDATE `script_texts` SET `content_default` = "More vile sorcery! Be ready for anything!" WHERE `entry` = -1595102; +UPDATE `script_texts` SET `content_default` = "Watch your backs: they have us surrounded in this hall." WHERE `entry` = -1595104; +UPDATE `script_texts` SET `content_default` = "Mal'Ganis is not making this easy." WHERE `entry` = -1595106; +UPDATE `script_texts` SET `content_default` = "What else can he put in my way?" WHERE `entry` = -1595108; +UPDATE `script_texts` SET `content_default` = "I do what I must for Lordaeron, and neither your words nor your actions will stop me." WHERE `entry` = -1595109; +UPDATE `script_texts` SET `content_default` = "The quickest path to Mal'Ganis lies behind that bookshelf ahead." WHERE `entry` = -1595110; +UPDATE `script_texts` SET `content_default` = "I'm relieved this secret passage still works." WHERE `entry` = -1595112; +UPDATE `script_texts` SET `content_default` = "Let's move through here as quickly as possible. If the undead don't kill us, the fires might." WHERE `entry` = -1595113; +UPDATE `script_texts` SET `content_default` = "Rest a moment and clear your lungs, but we must move again soon." WHERE `entry` = -1595114; +UPDATE `script_texts` SET `content_default` = "That's enough; we must move again. Mal'Ganis awaits." WHERE `entry` = -1595115; +UPDATE `script_texts` SET `content_default` = "At last some good luck. Market Row has not caught fire yet. Mal'Ganis is supposed to be in Crusaders' Square, which is just ahead. Tell me when you're ready to move forward." WHERE `entry` = -1595116; +UPDATE `script_texts` SET `content_default` = "Justice will be done." WHERE `entry` = -1595117; +UPDATE `script_texts` SET `content_default` = "We're going to finish this right now, Mal'Ganis. Just you... and me." WHERE `entry` = -1595118; + +UPDATE `script_texts` SET `comment` = concat(`comment`,". NEEDS VERIFICATION") WHERE `entry` IN (-1595101,-1595105); + +SET @GUID := 88474; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, +`MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) +VALUES +(@GUID+00,27737,595,3,1,25543,0,2319.89,1285.78,131.407,1.72169,60,10,0,630,0,1,0,0,0), +(@GUID+01,27737,595,3,1,10979,0,2308.12,1304.21,127.601,4.39662,60,10,0,630,0,1,0,0,0), +(@GUID+02,27737,595,3,1,25542,0,2335.47,1262.04,132.921,1.42079,60,10,0,630,0,1,0,0,0), +(@GUID+03,27737,595,3,1,25543,0,2297.73,1338.75,124.622,2.5574,60,10,0,630,0,1,0,0,0), +(@GUID+04,27737,595,3,1,10979,0,2322.65,1265.39,133.033,5.6524,60,10,0,630,0,1,0,0,0), +(@GUID+05,27737,595,3,1,10973,0,2277.83,1331.92,124.19,3.48045,60,10,0,630,0,1,0,0,0), +(@GUID+06,27737,595,3,1,25543,0,2294.18,1316.93,125.672,6.05649,60,10,0,630,0,1,0,0,0), +(@GUID+07,27737,595,3,1,10973,0,2310.56,1369,128.372,5.03364,60,10,0,630,0,1,0,0,0), +(@GUID+08,27737,595,3,1,10979,0,2306.15,1322.85,125.708,4.99133,60,10,0,630,0,1,0,0,0), +(@GUID+09,27737,595,3,1,10973,0,2320.14,1297.48,129.694,1.35248,60,10,0,630,0,1,0,0,0), +(@GUID+10,27737,595,3,1,25542,0,2291.57,1327.27,124.545,5.32358,60,10,0,630,0,1,0,0,0), +(@GUID+11,27737,595,3,1,25542,0,2308.04,1352.65,126.907,5.83741,60,10,0,630,0,1,0,0,0), +(@GUID+12,27737,595,3,1,10979,0,2329.44,1281.11,132.636,2.25207,60,10,0,630,0,1,0,0,0), +(@GUID+13,27737,595,3,1,0,0,2407.32,1423.8,131.522,6.24743,60,10,0,706,0,1,0,0,0), +(@GUID+14,27737,595,3,1,0,0,2417.26,1428.41,131.652,6.20423,60,10,0,730,0,1,0,0,0), +(@GUID+15,27737,595,3,1,0,0,2420.48,1419.99,130.716,0.0977616,60,10,0,706,0,1,0,0,0), +(@GUID+16,27737,595,3,1,0,0,2426.63,1413.41,130.464,0.404064,60,10,0,730,0,1,0,0,0), +(@GUID+17,27737,595,3,1,0,0,2430.46,1417.6,130.557,0.125247,60,10,0,730,0,1,0,0,0), +(@GUID+18,27737,595,3,1,0,0,2433.94,1427.03,131.18,0.0584885,60,10,0,706,0,1,0,0,0), +(@GUID+19,27737,595,3,1,0,0,2446.5,1428.37,131.013,6.10606,60,10,0,756,0,1,0,0,0), +(@GUID+20,27737,595,3,1,0,0,2449.49,1423.35,130.588,5.77619,60,10,0,706,0,1,0,0,0), +(@GUID+21,27737,595,3,1,0,0,2441.92,1424.41,130.606,6.07857,60,10,0,706,0,1,0,0,0), +(@GUID+22,27737,595,3,1,0,0,2450.6,1438.61,132.213,4.74889,60,10,0,730,0,1,0,0,0), +(@GUID+23,27737,595,3,1,0,0,2460.17,1436.46,131.501,4.73711,60,10,0,756,0,1,0,0,0), +(@GUID+24,27737,595,3,1,0,0,2444.68,1421.68,130.324,6.01338,60,10,0,756,0,1,0,0,0), +(@GUID+25,27737,595,3,1,0,0,2456.87,1419.07,130.488,5.39763,60,10,0,706,0,1,0,0,0), +(@GUID+26,27737,595,3,1,0,0,2464.27,1422.15,130.976,5.22092,60,10,0,756,0,1,0,0,0), +(@GUID+27,27737,595,3,1,0,0,2468.21,1403.06,130.39,5.6364,60,10,0,756,0,1,0,0,0), +(@GUID+28,27737,595,3,1,0,0,2460.88,1406.8,130.508,5.96234,60,10,0,756,0,1,0,0,0), +(@GUID+29,27737,595,3,1,0,0,2485.77,1398.35,130.795,4.71591,60,10,0,756,0,1,0,0,0), +(@GUID+30,27737,595,3,1,0,0,2485.79,1380.46,130.15,5.02928,60,10,0,730,0,1,0,0,0), +(@GUID+31,27737,595,3,1,0,0,2475.77,1396.31,130.124,4.84079,60,10,0,730,0,1,0,0,0), +(@GUID+32,27737,595,3,1,0,0,2476.92,1387.21,129.401,5.05128,60,10,0,730,0,1,0,0,0), +(@GUID+33,27737,595,3,1,0,0,2483.24,1389.37,130.123,4.74104,60,10,0,730,0,1,0,0,0), +(@GUID+34,27737,595,3,1,0,0,2480.2,1370.15,129.533,5.79583,60,10,0,706,0,1,0,0,0), +(@GUID+35,27737,595,3,1,0,0,2481.54,1375.11,129.642,5.4644,60,10,0,730,0,1,0,0,0), +(@GUID+36,27737,595,3,1,0,0,2489.44,1359.42,131.233,5.378,60,10,0,730,0,1,0,0,0), +(@GUID+37,27737,595,3,1,0,0,2486.59,1356.19,131.876,5.7275,60,10,0,756,0,1,0,0,0), +(@GUID+38,27737,595,3,1,0,0,2495.53,1348.61,133.072,5.52722,60,10,0,730,0,1,0,0,0), +(@GUID+39,27737,595,3,1,0,0,2504.48,1349.65,132.856,5.11881,60,10,0,730,0,1,0,0,0), +(@GUID+40,27737,595,3,1,0,0,2493.11,1380.29,130.24,4.93189,60,10,0,706,0,1,0,0,0), +(@GUID+41,27737,595,3,1,0,0,2487.18,1392.64,130.512,4.93818,60,10,0,706,0,1,0,0,0), +(@GUID+42,27737,595,3,1,0,0,2506.49,1336.89,132.794,5.19343,60,10,0,756,0,1,0,0,0), +(@GUID+43,27737,595,3,1,0,0,2518.2,1306.39,130.623,4.81723,60,10,0,756,0,1,0,0,0), +(@GUID+44,27737,595,3,1,0,0,2513.4,1299.67,130.868,4.4206,60,10,0,756,0,1,0,0,0), +(@GUID+45,27737,595,3,1,0,0,2511.45,1291.47,130.808,5.00729,60,10,0,756,0,1,0,0,0), +(@GUID+46,27737,595,3,1,0,0,2518.56,1292.32,130.528,5.16438,60,10,0,756,0,1,0,0,0), +(@GUID+47,27737,595,3,1,0,0,2515.49,1279.85,129.214,5.28847,60,10,0,730,0,1,0,0,0), +(@GUID+48,27737,595,3,1,0,0,2514.37,1285.92,129.934,5.70473,60,10,0,706,0,1,0,0,0), +(@GUID+49,27737,595,3,1,0,0,2522.65,1274.29,128.576,5.44634,60,10,0,706,0,1,0,0,0), +(@GUID+50,27737,595,3,1,0,0,2535.38,1275.77,127.42,5.49817,60,10,0,756,0,1,0,0,0), +(@GUID+51,27737,595,3,1,0,0,2537.59,1273.1,127.05,5.02693,60,10,0,730,0,1,0,0,0), +(@GUID+52,27737,595,3,1,0,0,2547.49,1261.7,126.44,4.78425,60,10,0,730,0,1,0,0,0), +(@GUID+53,27737,595,3,1,0,0,2534.36,1261.06,127.125,4.3994,60,10,0,756,0,1,0,0,0), +(@GUID+54,27737,595,3,1,0,0,2532.69,1251.44,127.452,5.4479,60,10,0,730,0,1,0,0,0), +(@GUID+55,27737,595,3,1,0,0,2551.84,1252.35,125.455,5.04342,60,10,0,706,0,1,0,0,0), +(@GUID+56,27737,595,3,1,0,0,2536.1,1244,126.928,5.16515,60,10,0,756,0,1,0,0,0), +(@GUID+57,27737,595,3,1,0,0,2543.63,1247.23,126.131,5.19735,60,10,0,706,0,1,0,0,0), +(@GUID+58,27737,595,3,1,0,0,2554.21,1238.95,125.475,4.64836,60,10,0,730,0,1,0,0,0), +(@GUID+59,27737,595,3,1,0,0,2548.89,1227.37,126.375,5.31517,60,10,0,756,0,1,0,0,0), +(@GUID+60,27737,595,3,1,0,0,2560.46,1225.4,125.496,4.85335,60,10,0,706,0,1,0,0,0), +(@GUID+61,27737,595,3,1,0,0,2555.11,1218.55,125.944,5.11646,60,10,0,730,0,1,0,0,0), +(@GUID+62,27737,595,3,1,0,0,2561.91,1211.56,125.38,5.5877,60,10,0,730,0,1,0,0,0), +(@GUID+63,27737,595,3,1,0,0,2568.67,1202.96,125.509,4.96095,60,10,0,756,0,1,0,0,0), +(@GUID+64,27737,595,3,1,0,0,2571.93,1193.48,125.619,5.07641,60,10,0,756,0,1,0,0,0), +(@GUID+65,27737,595,3,1,0,0,2577.77,1180.88,125.562,4.64522,60,10,0,756,0,1,0,0,0), +(@GUID+66,27737,595,3,1,0,0,2574.2,1166.63,126.089,4.44966,60,10,0,706,0,1,0,0,0), +(@GUID+67,27737,595,3,1,0,0,2564.78,1166.82,127.092,4.2266,60,10,0,756,0,1,0,0,0), +(@GUID+68,27737,595,3,1,0,0,2577.56,1158.41,126.385,4.07738,60,10,0,756,0,1,0,0,0), +(@GUID+69,27737,595,3,1,0,0,2567.93,1176.56,126.2,4.7489,60,10,0,706,0,1,0,0,0), +(@GUID+70,27737,595,3,1,0,0,2559.28,1189.46,126.642,4.73319,60,10,0,756,0,1,0,0,0), +(@GUID+71,27737,595,3,1,0,0,2554.14,1213.37,126.599,5.13845,60,10,0,706,0,1,0,0,0), +(@GUID+72,27737,595,3,1,0,0,2560.58,1218.48,125.281,4.97351,60,10,0,730,0,1,0,0,0), +(@GUID+73,27737,595,3,1,0,0,2570.2,1170.58,126.311,4.64365,60,10,0,756,0,1,0,0,0), +(@GUID+74,27729,595,3,1,0,0,2496.57,1354.66,132.217,5.13691,120,5,0,63000,0,1,0,0,0), +(@GUID+75,27729,595,3,1,0,0,2494.22,1365.17,130.812,5.15654,120,5,0,63000,0,1,0,0,0), +(@GUID+76,27729,595,3,1,0,0,2440.41,1434.46,131.456,5.69372,120,5,0,63000,0,1,0,0,0), +(@GUID+77,27729,595,3,1,0,0,2433.18,1421.13,130.644,0.046706,120,5,0,63000,0,1,0,0,0), +(@GUID+78,27734,595,3,1,0,0,2546.07,1239.17,125.945,5.07801,120,5,0,63000,0,1,0,0,0), +(@GUID+79,27734,595,3,1,0,0,2458.58,1426.22,131.056,5.42984,120,5,0,63000,0,1,0,0,0), +(@GUID+80,27736,595,3,1,0,0,2488.11,1364.91,130.402,5.35524,120,5,0,130330,0,1,0,0,0), +(@GUID+81,28199,595,3,1,0,0,2527.63,1267.59,128.168,5.12906,120,5,0,63000,0,1,0,0,0), +(@GUID+82,28199,595,3,1,0,0,2528.06,1284.34,128.877,5.14869,120,5,0,63000,0,1,0,0,0), +(@GUID+83,28199,595,3,1,0,0,2466.27,1414.57,130.977,5.18637,120,5,0,63000,0,1,0,0,0), +(@GUID+84,28200,595,3,1,0,0,2570.51,1181.4,125.809,4.61855,120,5,0,50400,44070,1,0,0,0), +(@GUID+85,28200,595,3,1,0,0,2560.45,1202.05,126.031,4.85417,120,5,0,50400,44070,1,0,0,0), +(@GUID+86,28200,595,3,1,0,0,2487.85,1373.29,130.236,5.078,120,5,0,50400,44070,1,0,0,0), +(@GUID+87,28200,595,3,1,0,0,2416.7,1416.52,130.379,0.191224,120,5,0,50400,44070,1,0,0,0), +(@GUID+88,28200,595,3,1,0,0,2424.42,1422.68,130.868,0.25327,120,5,0,50400,44070,1,0,0,0), +(@GUID+89,28201,595,3,1,0,0,2540.67,1254.82,126.274,4.97198,120,5,0,130330,0,1,0,0,0), +(@GUID+90,28201,595,3,1,0,0,2410.03,1417.19,130.577,0.191229,120,5,0,130330,0,1,0,0,0), +(@GUID+91,28249,595,3,1,0,0,2562.66,1177.9,126.716,4.77171,120,5,0,63000,0,1,0,0,0), +(@GUID+92,28249,595,3,1,0,0,2566.72,1190.41,125.837,4.7992,120,5,0,63000,0,1,0,0,0), +(@GUID+93,28249,595,3,1,0,0,2472.34,1404.76,130.752,5.20601,120,5,0,63000,0,1,0,0,0), +(@GUID+94,28249,595,3,1,0,0,2460.59,1413.26,130.46,5.4377,120,5,0,63000,0,1,0,0,0), +(@GUID+95,28249,595,3,1,0,0,2415.04,1423.52,131.111,0.214785,120,5,0,63000,0,1,0,0,0); + +DELETE FROM `script_texts` WHERE entry BETWEEN -1595052 AND -1595048; +INSERT INTO `script_texts` (npc_entry,entry, content_default, comment) VALUES +(27913,-1595048, "Scourge forces have been spotted near the Elder's Square Gate!","Spawns near elder's square gate."), +(27913,-1595059, "Scourge forces have been spotted near the Town Hall!","Spawns near town hall."), +(27913,-1595050, "Scourge forces have been spotted near the King's Square fountain!","Spawns near king's square."), +(27913,-1595051, "Scourge forces have been spotted near the Market Row Gate!", "Spawns near market row gate."), +(27913,-1595052, "Scourge forces have been spotted near the Festival Lane Gate!", "Spawns near festval lane gate."); + +UPDATE `creature_template` SET `dynamicflags` = 0 WHERE `entry` IN (32273,32313); +UPDATE `areatrigger_teleport` SET id = 5181 WHERE id = 5148; +UPDATE `creature_template` SET `flags_extra` = 128 WHERE `entry` = 20562; +UPDATE `script_waypoint` SET location_x = 2449.32, location_y = 1191.09 WHERE entry = 26499 AND pointid = 26; + +UPDATE `creature_template` SET `lootid` = 32273 WHERE `entry` IN (32273, 32313); + +-- thx warpten (fix for credit spell) +UPDATE `spell_dbc` SET `Attributes` = '8388992', `AttributesEx2` = '5', `AttributesEx3` = '269484288' WHERE `Id` = 58630; diff --git a/sql/old/3.3.5a/2012_05_03_02_world_quest_template.sql b/sql/old/3.3.5a/2012_05_03_02_world_quest_template.sql new file mode 100644 index 00000000000..49953bd2166 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_03_02_world_quest_template.sql @@ -0,0 +1,28 @@ +-- Wolvar Orphan quest order +UPDATE `quest_template` SET `prevquestid`=13927,`exclusivegroup`=-13930 WHERE `id` IN (13930,13934,13951); +UPDATE `quest_template` SET `prevquestid`=13930,`exclusivegroup`=-13955 WHERE `id` IN (13955,13957); +UPDATE `quest_template` SET `prevquestid`=13955,`exclusivegroup`=0 WHERE `id`=13938; +UPDATE `quest_template` SET `prevquestid`=13938,`exclusivegroup`=0 WHERE `id`=13960; +-- Oracle Orphan quest order +UPDATE `quest_template` SET `prevquestid`=13926,`exclusivegroup`=-13929 WHERE `id` IN (13929,13933,13950); +UPDATE `quest_template` SET `prevquestid`=13929,`exclusivegroup`=-13954 WHERE `id` IN (13954,13956); +UPDATE `quest_template` SET `prevquestid`=13954,`exclusivegroup`=0 WHERE `id`=13937; +UPDATE `quest_template` SET `prevquestid`=13937,`exclusivegroup`=0 WHERE `id`=13959; +-- Human Orphan quest order +UPDATE `quest_template` SET `prevquestid`=1468,`exclusivegroup`=-1479 WHERE `id` IN (1479,1558,1687); +UPDATE `quest_template` SET `prevquestid`=1479,`exclusivegroup`=-558 WHERE `id` IN (558,4822); +UPDATE `quest_template` SET `prevquestid`=558,`exclusivegroup`=0 WHERE `id`=171; +-- Orcish Orphan quest order +UPDATE `quest_template` SET `prevquestid`=172,`exclusivegroup`=-910 WHERE `id` IN (910,911,1800); +UPDATE `quest_template` SET `prevquestid`=910,`exclusivegroup`=-915 WHERE `id` IN (915,925); +UPDATE `quest_template` SET `prevquestid`=915,`exclusivegroup`=0 WHERE `id`=5502; +-- Draenei Orphan quest order +UPDATE `quest_template` SET `prevquestid`=10943,`exclusivegroup`=-10950 WHERE `id` IN (10950,10952,10954); +UPDATE `quest_template` SET `prevquestid`=10950,`exclusivegroup`=-10956 WHERE `id` IN (10956,10962); +UPDATE `quest_template` SET `NextQuestIdChain`=10968 WHERE `id`=10956; +UPDATE `quest_template` SET `prevquestid`=10968,`exclusivegroup`=0 WHERE `id`=10966; +-- Blood Elf Orphan quest order +UPDATE `quest_template` SET `prevquestid`=10942,`exclusivegroup`=-10945 WHERE `id` IN (10945,10951,10953); +UPDATE `quest_template` SET `prevquestid`=10945,`exclusivegroup`=-10960 WHERE `id` IN (10960,10963); +UPDATE `quest_template` SET `prevquestid`=10960,`exclusivegroup`=0 WHERE `id`=11975; +UPDATE `quest_template` SET `prevquestid`=11975,`exclusivegroup`=0 WHERE `id`=10967; diff --git a/sql/old/3.3.5a/2012_05_03_03_world_creature_questrelation.sql b/sql/old/3.3.5a/2012_05_03_03_world_creature_questrelation.sql new file mode 100644 index 00000000000..1da4f6d29ad --- /dev/null +++ b/sql/old/3.3.5a/2012_05_03_03_world_creature_questrelation.sql @@ -0,0 +1,2 @@ +-- Set correct NPC for A Warden of the Alliance +UPDATE `creature_questrelation` SET `id`=14305 WHERE `quest`=171; diff --git a/sql/old/3.3.5a/2012_05_03_04_world_game_event_creature_quest.sql b/sql/old/3.3.5a/2012_05_03_04_world_game_event_creature_quest.sql new file mode 100644 index 00000000000..62fd4415549 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_03_04_world_game_event_creature_quest.sql @@ -0,0 +1,57 @@ +DELETE FROM `creature_questrelation` WHERE `id` IN (14305,14444,22817,22818,33532,33533,34365); +DELETE FROM `game_event_creature_quest` WHERE `eventEntry`=10; +INSERT INTO `game_event_creature_quest` (`eventEntry`,`id`,`quest`) VALUES +-- Alliance +(10,14450,1468), -- Orphan Matron Nightingale - Children's Week +(10,14305,1479), -- Human Orphan - The Bough of the Eternals +(10,14305,1558), -- Human Orphan - The Stonewrought Dam +(10,14305,1687), -- Human Orphan - Spooky Lighthouse +(10,14305,558), -- Human Orphan - Jaina's Autograph +(10,14305,4822), -- Human Orphan - You Scream, I Scream... +-- Horde +(10,14451,172), -- Orphan Matron Battlewail - Children's Week +(10,14444,910), -- Orcish Orphan - Down at the Docks +(10,14444,911), -- Orcish Orphan - Gateway to the Frontier +(10,14444,1800), -- Orcish Orphan - Lordaeron Throne Room +(10,14444,915), -- Orcish Orphan - You Scream, I Scream... +(10,14444,925), -- Orcish Orphan - Cairne's Hoofprint +(10,14444,5502), -- Orcish Orphan - A Warden of the Horde +-- Outlands: Blood Elfs +(10,22819,10942), -- Orphan Matron Mercy - Children's Week +(10,22817,10945), -- Blood Elf Orphan - Hch'uu and the Mushroom People +(10,22817,10951), -- Blood Elf Orphan - A Trip to the Dark Portal +(10,22817,10953), -- Blood Elf Orphan - Visit the Throne of the Elements +(10,22817,11975), -- Blood Elf Orphan - Now, When I Grow Up... +(10,22817,10963), -- Blood Elf Orphan - Time to Visit the Caverns +(10,22817,10967), -- Blood Elf Orphan - Back to the Orphanage +-- Outlands: Draenei +(10,22819,10943), -- Orphan Matron Mercy - Children's Week +(10,22818,10950), -- Draenei Orphan - Auchindoun and the Ring of Observance +(10,22818,10952), -- Draenei Orphan - A Trip to the Dark Portal +(10,22818,10954), -- Draenei Orphan - Jheel is at Aeris Landing! +(10,22818,10956), -- Draenei Orphan - The Seat of the Naaru +(10,22818,10962), -- Draenei Orphan - Time to Visit the Caverns +(10,22818,10966), -- Draenei Orphan - Back to the Orphanage +-- Northrend: Wolvar +(10,34365,13927), -- Orphan Matron Aria - Little Orphan Kekek Of The Wolvar +(10,33532,13930), -- Wolvar Orphan - Home Of The Bear-Men +(10,33532,13934), -- Wolvar Orphan - The Bronze Dragonshrine +(10,33532,13951), -- Wolvar Orphan - Playmates! +(10,33532,13955), -- Wolvar Orphan - The Dragon Queen +(10,33532,13957), -- Wolvar Orphan - The Mighty Hemet Nesingwary +(10,33532,13960), -- Wolvar Orphan - Back To The Orphanage +-- Northrend: Oracles +(10,34365,13926), -- Orphan Matron Aria - Little Orphan Roo Of The Oracles +(10,33533,13929), -- Oracle Orphan - The Biggest Tree Ever! +(10,33533,13933), -- Oracle Orphan - The Bronze Dragonshrine +(10,33533,13937), -- Oracle Orphan - A Trip To The Wonderworks +(10,33533,13950), -- Oracle Orphan - Playmates! +(10,33533,13954), -- Oracle Orphan - The Dragon Queen +(10,33533,13956), -- Oracle Orphan - Meeting a Great One +(10,33533,13959); -- Oracle Orphan - Back To The Orphanage + +-- Removed "When I Grow Up..." and replace it with "Now, When I Grow Up..." +UPDATE `quest_template` SET `prevquestid`=10945,`exclusivegroup`=-11975 WHERE `id` IN (11975,10963); +DELETE FROM `disables` WHERE `sourceType`=1 AND `entry`=10960; +INSERT INTO `disables` (`sourceType`,`entry`,`flags`,`params_0`,`params_1`,`comment`) VALUES +(1,10960,0,'','','Deprecated quest: When I grow up...'); diff --git a/sql/old/3.3.5a/2012_05_04_00_world_waypoints.sql b/sql/old/3.3.5a/2012_05_04_00_world_waypoints.sql new file mode 100644 index 00000000000..a07bde59d49 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_04_00_world_waypoints.sql @@ -0,0 +1,137 @@ +-- Thrallmar Grunt pathing +SET @NPC := 57505; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=168.3949,`position_y`=2641.357,`position_z`=86.32077 WHERE `guid`=@NPC; +UPDATE `creature_addon` SET `path_id`=@PATH WHERE `guid`=@NPC; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,168.3949,2641.357,86.32077,0,0,0,100,0), +(@PATH,2,186.5067,2615.882,87.28357,0,0,0,100,0), +(@PATH,3,188.9113,2601.655,87.28357,0,0,0,100,0), +(@PATH,4,198.3909,2602.661,87.28357,0,0,0,100,0), +(@PATH,5,201.5686,2609.845,87.28357,0,0,0,100,0), +(@PATH,6,187.2484,2616.44,87.28357,0,0,0,100,0), +(@PATH,7,168.7871,2641.268,86.32077,0,0,0,100,0), +(@PATH,8,155.2003,2681.998,84.82113,0,0,0,100,0), +(@PATH,9,194.6133,2692.07,90.61374,0,0,0,100,0), +(@PATH,10,215.4427,2693.589,90.69872,0,0,0,100,0), +(@PATH,11,219.0203,2692.25,90.69665,0,0,0,100,0), +(@PATH,12,225.5117,2680.063,90.68996,0,0,0,100,0), +(@PATH,13,235.309,2679.308,90.69373,0,0,0,100,0), +(@PATH,14,246.9184,2682.646,90.70419,0,0,0,100,0), +(@PATH,15,252.4411,2688.479,90.70386,0,0,0,100,0), +(@PATH,16,255.0155,2699.197,90.70283,0,0,0,100,0), +(@PATH,17,251.5234,2707.998,90.70486,0,0,0,100,0), +(@PATH,18,243.2346,2712.791,90.70392,0,0,0,100,0), +(@PATH,19,231.9871,2713.626,90.70399,0,0,0,100,0), +(@PATH,20,221.1457,2709.591,90.69753,0,0,0,100,0), +(@PATH,21,218.8803,2695.845,90.69318,0,0,0,100,0), +(@PATH,22,215.4517,2693.612,90.69869,0,0,0,100,0), +(@PATH,23,194.7944,2692.039,90.65273,0,0,0,100,0), +(@PATH,24,175.8115,2687.591,86.68189,0,0,0,100,0), +(@PATH,25,155.2143,2682.375,84.82113,0,0,0,100,0), +(@PATH,26,131.8727,2679.832,84.56969,0,0,0,100,0), +(@PATH,27,130.0859,2666.262,84.1262,0,0,0,100,0), +(@PATH,28,153.1291,2650.22,86.15128,0,0,0,100,0); + +-- Remove dup Thrallmar Grunt spawn +DELETE FROM `creature` WHERE `guid`=57532; +DELETE FROM `creature_addon` WHERE `guid`=57532; + +-- Bat Rider Guard pathing +SET @NPC := 54840; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=156.9029,`position_y`=2554.784,`position_z`=170.8949 WHERE `guid`=@NPC; +UPDATE `creature_addon` SET `path_id`=@PATH WHERE `guid`=@NPC; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,156.9029,2554.784,170.8949,0,0,0,100,0), +(@PATH,2,52.51677,2602.816,139.7838,0,0,0,100,0), +(@PATH,3,42.10146,2627.056,139.7838,0,0,0,100,0), +(@PATH,4,37.17329,2663.729,139.7838,0,0,0,100,0), +(@PATH,5,62.91933,2687.96,139.7838,0,0,0,100,0), +(@PATH,6,96.1871,2688.141,148.4226,0,0,0,100,0), +(@PATH,7,129.818,2690.786,151.256,0,0,0,100,0), +(@PATH,8,165.6888,2715.398,170.8949,0,0,0,100,0), +(@PATH,9,199.7751,2744.93,170.8949,0,0,0,100,0), +(@PATH,10,246.0857,2761.154,170.8949,0,0,0,100,0), +(@PATH,11,295.0904,2757.991,170.8949,0,0,0,100,0), +(@PATH,12,309.3468,2726.089,170.8949,0,0,0,100,0), +(@PATH,13,303.8448,2682.588,170.8949,0,0,0,100,0), +(@PATH,14,289.3104,2650.866,170.8949,0,0,0,100,0), +(@PATH,15,261.2743,2618.831,170.8949,0,0,0,100,0), +(@PATH,16,233.6436,2578.997,170.8949,0,0,0,100,0), +(@PATH,17,199.3375,2546.226,170.8949,0,0,0,100,0); + +-- Bat Rider Guard pathing +SET @NPC := 54841; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=65.97776,`position_y`=2661.205,`position_z`=163.6752 WHERE `guid`=@NPC; +UPDATE `creature_addon` SET `path_id`=@PATH WHERE `guid`=@NPC; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,65.97776,2661.205,163.6752,0,0,0,100,0), +(@PATH,2,85.52612,2668.312,163.6752,0,0,0,100,0), +(@PATH,3,119.9537,2689.26,163.6752,0,0,0,100,0), +(@PATH,4,121.8238,2721.88,163.6752,0,0,0,100,0), +(@PATH,5,142.6907,2750.891,163.6752,0,0,0,100,0), +(@PATH,6,149.9812,2788.504,163.6752,0,0,0,100,0), +(@PATH,7,142.9353,2830.464,163.6752,0,0,0,100,0), +(@PATH,8,115.1711,2822.444,163.6752,0,0,0,100,0), +(@PATH,9,57.16672,2791.644,163.6752,0,0,0,100,0), +(@PATH,10,38.80463,2758.823,163.6752,0,0,0,100,0), +(@PATH,11,19.69282,2714.784,163.6752,0,0,0,100,0), +(@PATH,12,23.22027,2677.714,163.6752,0,0,0,100,0); + +-- Bat Rider Guard pathing +SET @NPC := 54842; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=263.5968,`position_y`=2694.818,`position_z`=169.7312 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,4097); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,263.5968,2694.818,169.7312,0,0,0,100,0), +(@PATH,2,184.0861,2784.899,154.4534,0,0,0,100,0), +(@PATH,3,154.2815,2754.787,154.3701,0,0,0,100,0), +(@PATH,4,127.0308,2740.488,154.3701,0,0,0,100,0), +(@PATH,5,118.0444,2706.509,154.3701,0,0,0,100,0), +(@PATH,6,115.7577,2669.386,158.6756,0,0,0,100,0), +(@PATH,7,131.4314,2622.531,162.1478,0,0,0,100,0), +(@PATH,8,154.8241,2607.207,164.4812,0,0,0,100,0), +(@PATH,9,176.3283,2571.343,168.5645,0,0,0,100,0), +(@PATH,10,221.6267,2559.683,172.1201,0,0,0,100,0), +(@PATH,11,245.392,2593.423,169.8978,0,0,0,100,0), +(@PATH,12,251.0069,2617.749,169.7312,0,0,0,100,0), +(@PATH,13,263.0581,2644.614,169.7312,0,0,0,100,0); + +-- Bat Rider Guard pathing +SET @NPC := 54843; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=62.42025,`position_y`=2785.719,`position_z`=192.1124 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,4097); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,62.42025,2785.719,192.1124,0,0,0,100,0), +(@PATH,2,159.9371,2842.977,208.279,0,0,0,100,0), +(@PATH,3,183.0578,2845.035,208.279,0,0,0,100,0), +(@PATH,4,211.2432,2864.757,214.2235,0,0,0,100,0), +(@PATH,5,238.1182,2871.979,220.9457,0,0,0,100,0), +(@PATH,6,252.9173,2853.913,220.9457,0,0,0,100,0), +(@PATH,7,255.0203,2812.634,220.9457,0,0,0,100,0), +(@PATH,8,240.4993,2780.929,220.9457,0,0,0,100,0), +(@PATH,9,195.4901,2773.965,209.3901,0,0,0,100,0), +(@PATH,10,162.1341,2742.294,212.9179,0,0,0,100,0), +(@PATH,11,125.4935,2720.611,197.9457,0,0,0,100,0), +(@PATH,12,93.49241,2699.757,192.1124,0,0,0,100,0), +(@PATH,13,58.35324,2681.49,192.1124,0,0,0,100,0), +(@PATH,14,22.8833,2715.123,192.1124,0,0,0,100,0), +(@PATH,15,30.10514,2764.5,192.1124,0,0,0,100,0); + +-- Fix Bat Rider Guard InhabitType +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=15242; + +-- Remove dup Bat Rider Guard spawns +DELETE FROM `creature` WHERE `guid` IN (54839,54844,54845); +DELETE FROM `creature_addon` WHERE `guid` IN (54839,54844,54845); diff --git a/sql/old/3.3.5a/2012_05_04_01_world_sai.sql b/sql/old/3.3.5a/2012_05_04_01_world_sai.sql new file mode 100644 index 00000000000..7021fc92548 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_04_01_world_sai.sql @@ -0,0 +1,32 @@ +-- Speech by Martik Tor'seldoi, Thrallmar +SET @ENTRY := 16577; +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid`=@ENTRY*100; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,30000,50000,360000,360000,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Martik Tor''seldoi - OOC - Load script every 6 min ooc'), +(@ENTRY,0,1,0,25,0,100,0,0,0,0,0,11,18100,32,0,0,0,0,1,0,0,0,0,0,0,0, 'Martik Tor''seldoi - Reset - Cast Frost Armor'), +(@ENTRY*100,9,0,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi Say text 0'), +(@ENTRY*100,9,1,0,0,0,100,0,3000,3000,0,0,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi emote'), +(@ENTRY*100,9,2,0,0,0,100,0,3000,3000,0,0,5,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi emote'), +(@ENTRY*100,9,3,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,10,57487,16578,0,0,0,0,0,'Blood Elf Pilgrim Say text 0'), +(@ENTRY*100,9,4,0,0,0,100,0,3000,3000,0,0,5,6,0,0,0,0,0,10,57487,16578,0,0,0,0,0,'Blood Elf Pilgrim emote'), +(@ENTRY*100,9,5,0,0,0,100,0,3000,3000,0,0,66,0,0,0,0,0,0,10,57487,16578,0,0,0,0,0,'Martik Tor''seldoi turn to'), +(@ENTRY*100,9,6,0,0,0,100,0,1000,1000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi Say text 1'), +(@ENTRY*100,9,7,0,0,0,100,0,4000,4000,0,0,1,1,0,0,0,0,0,10,57487,16578,0,0,0,0,0,'Blood Elf Pilgrim Say text 1'), +(@ENTRY*100,9,8,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi Say text 2'), +(@ENTRY*100,9,9,0,0,0,100,0,3000,3000,0,0,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi emote'), +(@ENTRY*100,9,10,0,0,0,100,0,3000,3000,0,0,5,273,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi emote'), +(@ENTRY*100,9,11,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,10,57487,16578,0,0,0,0,0,'Blood Elf Pilgrim Say text 2'), +(@ENTRY*100,9,12,0,0,0,100,0,1000,1000,0,0,5,15,0,0,0,0,0,9,16578,0,20,0,0,0,0,'Blood Elf Pilgrim emote'), +(@ENTRY*100,9,13,0,0,0,100,0,3000,3000,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Martik Tor''seldoi turn to'); +-- NPC talk text insert from sniff +DELETE FROM `creature_text` WHERE `entry` IN (16577,16578); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(16577,0,0, 'Brothers and sisters, I have been to the promised land. I have tasted in the sublim energy. I have felt bliss - bliss so engrossing and all encompassing that I was left wondering if I had stumbled upon the dreams of gods.!',12,0,100,5,0,0, 'Martik Tor''seldoi'), +(16577,1,0, 'In paradise, you merely reach out and take from the Nether.',12,0,100,1,0,0, 'Martik Tor''seldoi'), +(16577,2,0, 'From the very air! Tendrils of arcane energy light up the obsidian sky as plumes of raw magic rise up from fissures in the land. Kneel and drink from the fissure as you do from a stream or well. Pluck a tendril from the heavens as if it were an apple hanging from a branch.',12,0,100,5,0,0, 'Martik Tor''seldoi'), +(16578,0,0, 'Tell us more, Martik. What is it? What does it feel like?',12,0,100,1,0,0, 'Blood Elf Pilgrim'), +(16578,1,0, 'But how?',12,0,100,6,0,0, 'Blood Elf Pilgrim'), +(16578,2,0, '%s smiles/gasps.',16,0,100,0,0,0, 'Blood Elf Pilgrim'); diff --git a/sql/old/3.3.5a/2012_05_05_00_world_sai.sql b/sql/old/3.3.5a/2012_05_05_00_world_sai.sql new file mode 100644 index 00000000000..e03c36337af --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_00_world_sai.sql @@ -0,0 +1,205 @@ +-- Forge of Souls Trash update + +-- Npc Updates + +-- Spiteful Apparition +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=36551; +UPDATE `creature` SET `spawndist`=20,`MovementType`=1,`curhealth`=1,`curmana`=0 WHERE `id`=36551; +DELETE FROM `creature_template_addon` WHERE `entry`=36551; +INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (36551,1, '69105 69136'); +-- Spiteful Apparition (Ambient) +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=36967; +UPDATE `creature` SET `spawndist`=20,`MovementType`=1,`curhealth`=1,`curmana`=0 WHERE `id`=36967; +DELETE FROM `creature_template_addon` WHERE `entry`=36967; +INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (36967,1, '69663 69658'); +-- Spectral Warden +UPDATE `creature_addon` SET `auras`='69144' WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=36666); + +-- SAI Updates + +-- Spiteful Apparition SAI +SET @ENTRY := 36551; -- NPC entry +SET @SPELL1 := 41253; -- Greater Invisibility +SET @SPELL2 := 68895; -- Spite (Normal) +SET @SPELL3 := 70212; -- Spite (Heroic) +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,25,0,100,6,0,0,0,0,11,@SPELL1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Spiteful Apparition - On Reset - Cast Greater Invisibility'), +(@ENTRY,0,1,0,10,0,100,6,0,10,3000,4000,28,@SPELL1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Spiteful Apparition - OOC range - Remove Greater Invisibility'), +(@ENTRY,0,2,0,0,0,100,2,7000,9000,7000,9000,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Spiteful Apparition - Combat - Cast Spite "Normal"'), +(@ENTRY,0,3,0,0,0,100,4,7000,9000,7000,9000,11,@SPELL3,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Spiteful Apparition - Combat - Cast Spite "Heroic"'); + +-- Soulguard Reaper SAI +SET @ENTRY := 36499; -- NPC entry +SET @SPELL1 := 68797; -- Soulguard Channel +SET @SPELL2 := 69058; -- Shadow Lance +SET @SPELL3 := 69060; -- Frost Nova (Normal) +SET @SPELL4 := 70209; -- Frost Nova (Heroic) +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,7,0,0,0,0,11,@SPELL1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Reaper - OOC - Cast Soulguard Channel'), +(@ENTRY,0,1,0,0,0,100,6,5000,6000,7000,9000,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Reaper - Combat - Cast Shadow Lance'), +(@ENTRY,0,2,0,0,0,100,2,7000,9000,8000,10000,11,@SPELL3,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Soulguard Reaper - Combat - Cast Frost Nova "Normal"'), +(@ENTRY,0,3,0,0,0,100,4,7000,9000,8000,10000,11,@SPELL4,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Soulguard Reaper - Combat - Cast Frost Nova "Heroic"'), +(@ENTRY,0,4,0,4,0,100,6,0,0,0,0,39,30,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Reaper - Aggro - Call for help'); + +-- Soulguard Beam Focus Target +SET @ENTRY := 36508; -- NPC entry +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (-201770,-201785,-201741); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(-201770,0,0,0,1,0,100,6,1000,1000,5000,5000,45,0,1,0,0,0,0,19,36620,60,0,0,0,0,0, 'Soulguard Beam Focus Target - OOC - Set data on Soulguard Adept'), +(-201785,0,0,0,1,0,100,6,1000,1000,5000,5000,45,0,1,0,0,0,0,19,36620,60,0,0,0,0,0, 'Soulguard Beam Focus Target - OOC - Set data on Soulguard Adept'), +(-201741,0,0,0,1,0,100,6,1000,1000,5000,5000,45,0,1,0,0,0,0,19,36620,60,0,0,0,0,0, 'Soulguard Beam Focus Target - OOC - Set data on Soulguard Adept'), +(-201741,0,1,0,1,0,100,6,1000,1000,5000,5000,45,0,1,0,0,0,0,19,36564,60,0,0,0,0,0, 'Soulguard Beam Focus Target - OOC - Set data on Soulguard Bonecaster'); + +-- Spectral Warden SAI +SET @ENTRY := 36666; -- NPC entry +SET @SPELL1 := 69633; -- Veil of Shadow +SET @SPELL2 := 69148; -- Wail of Souls (Normal) +SET @SPELL3 := 70210; -- Wail of Souls (Heroic) +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,6,5000,6000,9000,10000,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Spectral Warden - Combat - Cast Veil of Shadow'), +(@ENTRY,0,1,0,0,0,100,2,9000,11000,5000,6000,11,@SPELL1,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Spectral Warden - Combat - Cast Wail of Souls'), +(@ENTRY,0,2,0,0,0,100,4,9000,11000,5000,6000,11,@SPELL2,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Spectral Warden - Combat - Cast Wail of Souls'); + +-- Soulguard Watchman SAI +SET @ENTRY := 36478; -- NPC entry +SET @SPELL1 := 69056; -- Shroud of Runes +SET @SPELL2 := 69053; -- Unholy Rage +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,50,6,0,10000,16000,20000,11,@SPELL1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Watchman - Combat - Cast Shroud of Runes'), +(@ENTRY,0,1,2,0,0,100,6,8000,16000,32000,40000,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Watchman - Combat - Cast Unholy Rage'), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Watchman - Combat - Say 0'), +(@ENTRY,0,3,0,4,0,100,6,0,0,0,0,39,20,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Watchman - Aggro - Call for help'); +-- NPC talk text insert +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0, '%s goes into a frenzy!',16,0,100,0,0,0, 'Soulguard Watchman'); + +-- Soul Horror SAI +SET @ENTRY := 36522; -- NPC entry +SET @SPELL1 := 69088; -- Soul Strike (Normal) +SET @SPELL2 := 70211; -- Soul Strike (Heroic) +SET @SPELL3 := 69107; -- Killing Spree Invis Aura +SET @SPELL4 := 69106; -- Killing Spree Aura +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,2,5000,6000,5000,6000,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soul Horror - Combat - Cast Soul Strike'), +(@ENTRY,0,1,0,0,0,100,4,5000,6000,5000,6000,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soul Horror - Combat - Cast Soul Strike'), +(@ENTRY,0,4,0,4,0,100,6,0,0,0,0,39,35,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soul Horror - Aggro - Call for help'); + +-- Soulguard Animator SAI +SET @ENTRY := 36516; -- NPC entry +SET @SPELL1 := 68834; -- Soulguard Channel Beam02 +SET @SPELL2 := 69562; -- Raise Dead +SET @SPELL3 := 69131; -- Soul Sickness +SET @SPELL4 := 69128; -- Soul Siphon +SET @SPELL5 := 69068; -- Shadow Bolt (Normal) +SET @SPELL6 := 70208; -- Shadow Bolt (Heroic) +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,7,1000,1000,1000,1000,11,@SPELL1,0,0,0,0,0,9,36522,1,15,0,0,0,0, 'Soulguard Animator - OOC - Cast Soulguard Channel Beam02'), +(@ENTRY,0,1,0,0,1,100,6,20000,25000,20000,25000,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Combat - Cast Raise Dead'), +(@ENTRY,0,2,0,0,0,100,6,7000,9000,9000,11000,11,@SPELL3,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Soulguard Animator - Combat - Cast Soul Sickness'), +(@ENTRY,0,3,0,0,0,100,6,9000,11000,7000,9000,11,@SPELL4,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Soulguard Animator - Combat - Cast Soul Siphon'), +(@ENTRY,0,4,0,0,0,100,2,4000,5000,3500,4500,11,@SPELL5,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Animator - Combat - Cast Shadow Bolt "Normal"'), +(@ENTRY,0,5,0,0,0,100,4,4000,5000,3500,4500,11,@SPELL6,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Animator - Combat - Cast Shadow Bolt "Heroic"'), +(@ENTRY,0,6,7,4,0,100,6,0,0,0,0,39,35,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Aggro - Call for help'), +(@ENTRY,0,7,0,61,0,100,6,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Aggro - Set phase 1'), +(@ENTRY,0,8,9,38,0,100,7,0,2,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Data set 2 - Set data'), +(@ENTRY,0,9,0,61,0,100,6,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Data set 2 - Set phase 2'), +(@ENTRY,0,10,11,38,0,100,7,0,3,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Data set 3 - Set data'), +(@ENTRY,0,11,0,61,0,100,6,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Animator - Data set 3 - Set phase 1'); + +-- Soulguard Adept SAI +SET @ENTRY := 36620; -- NPC entry +SET @SPELL1 := 68834; -- Soulguard Channel Beam02 +SET @SPELL2 := 69562; -- Raise Dead +SET @SPELL3 := 69068; -- Shadow Bolt (Normal) +SET @SPELL4 := 70208; -- Shadow Bolt (Heroic) +SET @SPELL5 := 69066; -- Drain Life (Normal) +SET @SPELL6 := 70213; -- Drain Life (Heroic) +SET @SPELL7 := 69564; -- Shadow Mend (Normal) +SET @SPELL8 := 70205; -- Shadow Mend (Heroic) +SET @SPELL9 := 68797; -- Soulguard Channel +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,7,1000,1000,1000,1000,11,@SPELL1,0,0,0,0,0,9,36522,1,15,0,0,0,0, 'Soulguard Adept - OOC - Cast Soulguard Channel Beam02'), +(@ENTRY,0,1,0,0,4,100,6,20000,25000,20000,25000,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Raise Dead'), +(@ENTRY,0,2,0,0,0,100,2,7000,8000,3500,4500,11,@SPELL3,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Shadow Bolt "Normal"'), +(@ENTRY,0,3,0,0,0,100,4,7000,8000,3500,4500,11,@SPELL4,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Shadow Bolt "Heroic"'), +(@ENTRY,0,4,0,0,0,100,2,6000,7000,8000,10000,11,@SPELL5,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Drain Life "Normal"'), +(@ENTRY,0,5,0,0,0,100,4,6000,7000,8000,10000,11,@SPELL6,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Drain Life "Heroic"'), +(@ENTRY,0,6,0,0,0,100,2,30000,35000,18000,22000,11,@SPELL7,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Shadow Mend "Normal"'), +(@ENTRY,0,7,0,0,0,100,4,30000,35000,18000,22000,11,@SPELL8,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Adept - Combat - Cast Shadow Mend "Heroic"'), +(@ENTRY,0,8,0,25,0,100,6,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - On Reset - Set phase 1'), +(@ENTRY,0,9,0,38,1,100,6,0,1,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - On dataset 0 1 - Set phase 2'), +(@ENTRY,0,10,0,1,2,100,7,0,0,0,0,11,@SPELL9,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - OOC - Cast Soulguard Channel'), +(@ENTRY,0,11,12,4,0,100,6,0,0,0,0,39,35,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Aggro - Call for help'), +(@ENTRY,0,12,0,61,0,100,6,0,0,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Aggro - Set phase 3'), +(@ENTRY,0,13,14,38,0,100,7,0,2,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Data set 2 - Set data'), +(@ENTRY,0,14,0,61,0,100,6,0,0,0,0,22,4,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Data set 2 - Set phase 4'), +(@ENTRY,0,15,16,38,0,100,7,0,3,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Data set 3 - Set data'), +(@ENTRY,0,16,0,61,0,100,6,0,0,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Adept - Data set 3 - Set phase 3'); + +-- Soulguard Bonecaster SAI +SET @ENTRY := 36564; -- NPC entry +SET @SPELL1 := 68834; -- Soulguard Channel Beam02 +SET @SPELL2 := 69562; -- Raise Dead +SET @SPELL3 := 69080; -- Bone Volley (Normal) +SET @SPELL4 := 70206; -- Bone Volley (Heroic) +SET @SPELL5 := 69069; -- Shield of Bones (Normal) +SET @SPELL6 := 70207; -- Shield of Bones (Heroic) +SET @SPELL7 := 68797; -- Soulguard Channel +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,7,1000,1000,1000,1000,11,@SPELL1,0,0,0,0,0,9,36522,1,15,0,0,0,0, 'Soulguard Bonecaster - OOC - Cast Soulguard Channel Beam02'), +(@ENTRY,0,1,0,0,4,100,6,20000,25000,20000,25000,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Combat - Cast Raise Dead'), +(@ENTRY,0,2,0,0,0,100,2,5000,7000,6000,8000,11,@SPELL3,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Combat - Cast Bone Volley "Normal"'), +(@ENTRY,0,3,0,0,0,100,4,5000,7000,6000,8000,11,@SPELL4,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Combat - Cast Bone Volley "Heroic"'), +(@ENTRY,0,4,0,0,0,100,2,5000,7000,7000,9000,11,@SPELL5,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Combat - Cast Shield of Bones "Normal"'), +(@ENTRY,0,5,0,0,0,100,4,5000,7000,7000,9000,11,@SPELL6,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Combat - Cast Shield of Bones "Heroic"'), +(@ENTRY,0,6,0,25,0,100,6,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - On Reset - Set phase 1'), +(@ENTRY,0,7,0,38,1,100,6,0,1,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - On dataset 0 1 - Set phase 2'), +(@ENTRY,0,8,0,1,2,100,7,0,0,0,0,11,@SPELL7,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - OOC - Cast Soulguard Channel'), +(@ENTRY,0,9,10,4,0,100,6,0,0,0,0,39,35,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Aggro - Call for help'), +(@ENTRY,0,10,0,61,0,100,6,0,0,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Aggro - Set phase 3'), +(@ENTRY,0,11,12,38,0,100,7,0,2,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Data set 2 - Set data'), +(@ENTRY,0,12,0,61,0,100,6,0,0,0,0,22,4,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Data set 2 - Set phase 4'), +(@ENTRY,0,13,14,38,0,100,7,0,3,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Data set 3 - Set data'), +(@ENTRY,0,14,0,61,0,100,6,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Soulguard Bonecaster - Data set 3 - Set phase 3'); + +-- Ghoul Minion SAI +SET @ENTRY := 36916; -- NPC entry +SET @SPELL1 := 69088; -- Soul Strike (Normal) +SET @SPELL2 := 70211; -- Soul Strike (Heroic) +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,54,0,100,6,0,0,0,0,45,0,2,0,0,0,0,23,0,0,0,0,0,0,0, 'Ghoul Minion - Just Summoned - Set Data Summoner'), +(@ENTRY,0,1,0,61,0,100,6,0,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ghoul Minion - Just Summoned - Set Random Movement'), +(@ENTRY,0,2,0,0,0,100,6,115000,115000,115000,115000,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ghoul Minion - combat - die after 2 min'), +(@ENTRY,0,3,0,1,0,100,6,15000,15000,15000,15000,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ghoul Minion - OOC - die after 15 sec'), +(@ENTRY,0,4,5,6,0,100,6,15000,15000,15000,15000,45,0,3,0,0,0,0,23,0,0,0,0,0,0,0, 'Ghoul Minion - on Death - Set data summoner'), +(@ENTRY,0,5,0,61,0,100,6,15000,15000,15000,15000,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ghoul Minion - on Death - despawn after 3 sec'); diff --git a/sql/old/3.3.5a/2012_05_05_01_world_creature_template.sql b/sql/old/3.3.5a/2012_05_05_01_world_creature_template.sql new file mode 100644 index 00000000000..2eeaf2f40d2 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_01_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Set proper faction for Ymirjar Skycaller (Heroic) +UPDATE `creature_template` SET `faction_A`=1885,`faction_H`=1885 WHERE `entry`=37643; diff --git a/sql/old/3.3.5a/2012_05_05_02_world_gameobject.sql b/sql/old/3.3.5a/2012_05_05_02_world_gameobject.sql new file mode 100644 index 00000000000..c0b2c6b147b --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_02_world_gameobject.sql @@ -0,0 +1,10 @@ +-- Add some missing Blood of Heroes spawns +SET @GUID := 5276; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @GUID AND @GUID+5; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@GUID,176213,0,1,1,1529.10242,-1427.06946,65.49049,-3.001947,0,0,-0.9975634,0.06976615,7200,100,1), +(@GUID+1,176213,0,1,1,1705.87439,-4690.138,48.9742165,-3.08918333,0,0,-0.9996567,0.02620165,7200,100,1), +(@GUID+2,176213,0,1,1,1846.79382,-3825.265,135.5159,1.83259487,0,0,0.7933531,0.6087617,7200,100,1), +(@GUID+3,176213,0,1,1,1748.16333,-4453.13525,74.26272,-2.0594883,0,0,0,0,7200,100,1), +(@GUID+4,176213,0,1,1,2159.835,-2442.754,62.0804,-0.4886912,0,0,-0.2419214,0.9702958,7200,100,1), +(@GUID+5,176213,0,1,1,1342.557,-1382.568,46.89193,2.775069,0,0,0.9832544,0.182238,7200,100,1); diff --git a/sql/old/3.3.5a/2012_05_05_03_world_sai.sql b/sql/old/3.3.5a/2012_05_05_03_world_sai.sql new file mode 100644 index 00000000000..fce3b5bc957 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_03_world_sai.sql @@ -0,0 +1,17 @@ +-- Wrathbone Laborer SAI +SET @ENTRY := 36830; -- NPC entry +SET @SPELL1 := 70302; -- Blinding Dirt +SET @SPELL2 := 70278; -- Puncture Wound (Normal) +SET @SPELL3 := 70279; -- Puncture Wound (Heroic) +SET @SPELL4 := 69572; -- Shovelled! (Normal) +SET @SPELL5 := 70280; -- Shovelled! (Heroic) +UPDATE `creature_template` SET `unit_flags`=`unit_flags`&~256,`AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,6,7000,8000,10000,11000,11,@SPELL1,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Blinding Dirt'), +(@ENTRY,0,1,0,0,0,100,2,8000,9000,9000,10000,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Puncture Wound (Normal)'), +(@ENTRY,0,2,0,0,0,100,4,8000,9000,9000,10000,11,@SPELL3,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Puncture Wound (Heroic)'), +(@ENTRY,0,3,0,0,0,100,2,5000,6000,7000,8000,11,@SPELL4,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Shovelled! (Normal)'), +(@ENTRY,0,4,0,0,0,100,4,5000,6000,7000,8000,11,@SPELL5,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Shovelled! (Heroic)'), +(@ENTRY,0,5,0,1,0,100,6,1000,3000,3000,3000,5,38,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Wrathbone Laborer - OOC - emote'); diff --git a/sql/old/3.3.5a/2012_05_05_04_world_creature_template.sql b/sql/old/3.3.5a/2012_05_05_04_world_creature_template.sql new file mode 100644 index 00000000000..7c4f13dd667 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_04_world_creature_template.sql @@ -0,0 +1,27 @@ +-- Fix InhabitType for Eye of the Lich King +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=36913; +-- Updates From CDawg +-- Wrathbone Laborer (heroic) - fix hostility and adds equipment +UPDATE `creature_template` SET `unit_flags`=`unit_flags`&~256,`equipment_id`=104 WHERE `entry`=37638; +-- Wrathbone Siegesmith (Heroic) add equipment +UPDATE `creature_template` SET `equipment_id`=122 WHERE `entry`=37639; +-- Fallen Warrior add equipment +UPDATE `creature_template` SET `equipment_id`=2328 WHERE `entry`=37612; +-- Forgemaster Garfrost add equipment +UPDATE `creature_template` SET `equipment_id`=2325 WHERE `entry`=37613; +-- Deathwhisper Necrolyte add equipment +UPDATE `creature_template` SET `equipment_id`=2365 WHERE `entry`=37609; +-- Deathwhisper Shadowcaster - add equipment +UPDATE `creature_template` SET `equipment_id`=2365 WHERE `entry`=38025; +-- Alliance slaves add equipments +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37645; +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37646; +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37647; +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37648; +-- horde slaves add equipments +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37649; +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37650; +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37651; +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=37652; +-- Ymirjar Skycaller (heroic) - Fix unit flags and add equipment +UPDATE `creature_template` SET `unit_flags`=`unit_flags`|32832,`equipment_id`=2438 WHERE `entry`=37643; diff --git a/sql/old/3.3.5a/2012_05_05_05_world_creature_template.sql b/sql/old/3.3.5a/2012_05_05_05_world_creature_template.sql new file mode 100644 index 00000000000..a2f2a217252 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_05_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Fix skillup on some target dummys +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|262144 WHERE `entry` IN (31144,2674,2673); diff --git a/sql/old/3.3.5a/2012_05_05_06_world_sai.sql b/sql/old/3.3.5a/2012_05_05_06_world_sai.sql new file mode 100644 index 00000000000..7b064af4a4e --- /dev/null +++ b/sql/old/3.3.5a/2012_05_05_06_world_sai.sql @@ -0,0 +1,13 @@ +-- Wrathbone Laborer SAI +SET @ENTRY := 36830; -- NPC entry +SET @SPELL1 := 70302; -- Blinding Dirt +SET @SPELL2 := 70278; -- Puncture Wound +SET @SPELL3 := 69572; -- Shovelled! +UPDATE `creature_template` SET `unit_flags`=`unit_flags`&~256,`AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,6,7000,8000,10000,11000,11,@SPELL1,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Blinding Dirt'), +(@ENTRY,0,1,0,0,0,100,6,8000,9000,9000,10000,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Puncture Wound (Normal)'), +(@ENTRY,0,2,0,0,0,100,6,5000,6000,7000,8000,11,@SPELL3,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Shovelled! (Normal)'), +(@ENTRY,0,3,0,1,0,100,6,1000,3000,3000,3000,5,38,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Wrathbone Laborer - OOC - emote'); diff --git a/sql/old/3.3.5a/2012_05_06_00_world_creature_template.sql b/sql/old/3.3.5a/2012_05_06_00_world_creature_template.sql new file mode 100644 index 00000000000..30dbf85c28d --- /dev/null +++ b/sql/old/3.3.5a/2012_05_06_00_world_creature_template.sql @@ -0,0 +1,5 @@ +-- Gold for Toc based on old.wowhead +UPDATE `creature_template` SET `mingold`=850000,`maxgold`=950000 WHERE `entry` IN(34797,35447,35448,35449); -- Icehowl +UPDATE `creature_template` SET `mingold`=550000,`maxgold`=650000 WHERE `entry` IN(34780,35216,35268,35269); -- Lord Jaraxxus +UPDATE `creature_template` SET `mingold`=650000,`maxgold`=700000 WHERE `entry` IN(34497,35350,35351,35352,34496,35347,35348,35359); -- Fjola Lightbane & Eydis Darkbane +UPDATE `creature_template` SET `mingold`=500000,`maxgold`=600000 WHERE `entry` IN(34564,34566,35615,35616); -- Anub'arak diff --git a/sql/old/3.3.5a/2012_05_06_01_world_creature_template.sql b/sql/old/3.3.5a/2012_05_06_01_world_creature_template.sql new file mode 100644 index 00000000000..fa0c9af5805 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_06_01_world_creature_template.sql @@ -0,0 +1,11 @@ +-- Based on old.wowhead.com +UPDATE `creature_template` SET `mingold`=1600000,`maxgold`=1800000 WHERE `entry` IN (33113,34003); -- Flame Levithian +UPDATE `creature_template` SET `mingold`=1100000,`maxgold`=1300000 WHERE `entry` IN (33118,33190); -- Ignis the Furnace Master +UPDATE `creature_template` SET `mingold`=280000,`maxgold`=360000 WHERE `entry` IN (33186,33724); -- Razorscale +UPDATE `creature_template` SET `mingold`=670000,`maxgold`=750000 WHERE `entry` IN (33293,33885); -- XT-002 Deconstructor +UPDATE `creature_template` SET `mingold`=1680000,`maxgold`=1900000 WHERE `entry` IN (32857,33694); -- Stormcaller Brundir +UPDATE `creature_template` SET `mingold`=1680000,`maxgold`=1900000 WHERE `entry` IN (32927,33692); -- Runemaster Molgeim +UPDATE `creature_template` SET `mingold`=1680000,`maxgold`=1900000 WHERE `entry` IN (32867,33693); -- Steelbreaker +UPDATE `creature_template` SET `mingold`=1220000,`maxgold`=1500000 WHERE `entry` IN (33515,34175); -- Auriaya +UPDATE `creature_template` SET `mingold`=1650000,`maxgold`=1950000 WHERE `entry` IN (33271,33449); -- General Vezax +UPDATE `creature_template` SET `mingold`=2020000,`maxgold`=2220000 WHERE `entry` IN (33288,33955); -- Yogg-Saron diff --git a/sql/old/3.3.5a/2012_05_07_00_world_waypoints.sql b/sql/old/3.3.5a/2012_05_07_00_world_waypoints.sql new file mode 100644 index 00000000000..f24b7c9c254 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_07_00_world_waypoints.sql @@ -0,0 +1,73 @@ +-- Wrathbone Siegesmith pathing +SET @NPC := 202159; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=646.5851,`position_y`=-191.1892,`position_z`=526.8476 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,646.5851,-191.1892,526.8476,0,0,0,100,0), +(@PATH,2,648.8837,-181.967,526.7226,0,0,0,100,0), +(@PATH,3,649.4167,-179.4531,526.7226,14000,0,0,100,0), +(@PATH,4,652.1736,-183.3594,526.7226,0,0,0,100,0), +(@PATH,5,648.5643,-188.309,526.8476,0,0,0,100,0), +(@PATH,6,642.5313,-193.4826,527.3874,0,0,0,100,0), +(@PATH,7,633.688,-200.741,528.941,12000,0,0,100,0), +(@PATH,8,641.9254,-196.5747,528.9726,0,0,0,100,0); + +-- Wrathbone Siegesmith pathing +SET @NPC := 201855; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=723.5469,`position_y`=-170.9497,`position_z`=527.5121 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,723.5469,-170.9497,527.5121,13000,0,0,100,0), +(@PATH,2,726.6484,-173.3438,527.1627,0,0,0,100,0), +(@PATH,3,726.6484,-174.3438,527.1627,0,0,0,100,0), +(@PATH,4,725.25,-175.2379,526.8134,0,0,0,100,0), +(@PATH,5,722.0521,-181.5122,526.8134,0,0,0,100,0), +(@PATH,6,721.2031,-187.8142,526.8134,0,0,0,100,0), +(@PATH,7,717.7917,-194.4358,526.8134,0,0,0,100,0), +(@PATH,8,719.3073,-202.2691,527.1509,0,0,0,100,0), +(@PATH,9,720.3403,-206.1198,527.7932,12000,0,0,100,0), +(@PATH,10,717.6111,-199.5035,526.9384,0,0,0,100,0), +(@PATH,11,717.566,-189.0642,526.8134,0,0,0,100,0), +(@PATH,12,718.5764,-182.3958,526.8134,0,0,0,100,0), +(@PATH,13,719.9531,-176.0729,526.8134,0,0,0,100,0); + +-- Forgemaster Garfrost pathing +SET @NPC := 201992; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=712.1371,`position_y`=-215.7014,`position_z`=527.066 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`auras`) VALUES (@NPC,@PATH,1,'68792'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,712.1371,-215.7014,527.066,0,0,0,100,0), +(@PATH,2,719.507,-227.8559,527.066,3000,0,0,100,0), +(@PATH,3,712.1371,-215.7014,527.066,0,0,0,100,0), +(@PATH,4,685.1805,-207.349,526.8424,0,0,0,100,0), +(@PATH,5,664.5191,-203.3472,526.816,0,0,0,100,0), +(@PATH,6,645.033,-208.5295,528.941,0,0,0,100,0), +(@PATH,7,653.0729,-194.3681,526.7226,0,0,0,100,0), +(@PATH,8,664.8646,-195.2135,526.7226,0,0,0,100,0), +(@PATH,9,686.0816,-213.8264,526.8424,0,0,0,100,0), +(@PATH,10,697.9757,-221.6215,526.8424,0,0,0,100,0), +(@PATH,11,708.0903,-211.908,527.066,0,0,0,100,0), +(@PATH,12,717.8924,-204.6979,527.191,0,0,0,100,0), +(@PATH,13,699.0504,-201.3438,526.8424,0,0,0,100,0), +(@PATH,14,672.066,-201.1493,526.8424,0,0,0,100,0), +(@PATH,15,655.9496,-203.4931,526.816,0,0,0,100,0), +(@PATH,16,672.066,-201.1493,526.8424,0,0,0,100,0), +(@PATH,17,699.0504,-201.3438,526.8424,0,0,0,100,0), +(@PATH,18,717.8924,-204.6979,527.191,0,0,0,100,0), +(@PATH,19,708.0903,-211.908,527.066,0,0,0,100,0), +(@PATH,20,697.9757,-221.6215,526.8424,0,0,0,100,0), +(@PATH,21,686.0816,-213.8264,526.8424,0,0,0,100,0), +(@PATH,22,664.8646,-195.2135,526.7226,0,0,0,100,0), +(@PATH,23,653.0729,-194.3681,526.7226,0,0,0,100,0), +(@PATH,24,645.033,-208.5295,528.941,0,0,0,100,0), +(@PATH,25,664.5191,-203.3472,526.816,0,0,0,100,0), +(@PATH,26,685.1805,-207.349,526.8424,0,0,0,100,0); diff --git a/sql/old/3.3.5a/2012_05_07_01_world_sai.sql b/sql/old/3.3.5a/2012_05_07_01_world_sai.sql new file mode 100644 index 00000000000..83676d31df9 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_07_01_world_sai.sql @@ -0,0 +1,51 @@ +-- Ymirjar Skycaller SAI addition +SET @ENTRY := 31260; -- NPC entry +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,2,0,25,0,100,6,0,0,0,0,11,46598,0,0,0,0,0,19,36891,20,0,0,0,0,0, 'Ymirjar Skycaller - Reset - Cast Ride Vehicle Hardcoded'); + +-- Wrathbone Laborer SAI +SET @ENTRY := -201800; -- NPC entry +SET @SPELL1 := 70302; -- Blinding Dirt +SET @SPELL2 := 70278; -- Puncture Wound +SET @SPELL3 := 69572; -- Shovelled! +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,6,7000,8000,10000,11000,11,@SPELL1,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Blinding Dirt'), +(@ENTRY,0,1,0,0,0,100,6,8000,9000,9000,10000,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Puncture Wound (Normal)'), +(@ENTRY,0,2,0,0,0,100,6,5000,6000,7000,8000,11,@SPELL3,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Wrathbone Laborer - Combat - Cast Shovelled! (Normal)'); + +-- Wrathbone Laborer pathing +SET @NPC := 201800; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=584.4202,`position_y`=188.9149,`position_z`=509.6726 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,584.4202,188.9149,509.6726,0,0,0,100,0), +(@PATH,2,583.6736,193.9653,509.7404,3000,0,48,100,0), +(@PATH,3,583.6736,193.9653,509.7404,3000,0,48,100,0), +(@PATH,4,583.6736,193.9653,509.7404,3000,0,48,100,0), +(@PATH,5,583.6736,193.9653,509.7404,3000,0,48,100,0), +(@PATH,6,594.0781,190.2622,508.8613,0,0,0,100,0), +(@PATH,7,604.9809,191.5451,507.6583,0,0,0,100,0), +(@PATH,8,617.8438,191.3455,507.5206,0,0,0,100,0), +(@PATH,9,633.1597,186.8281,508.6275,3000,0,48,100,0), +(@PATH,10,633.1597,186.8281,508.6275,3000,0,48,100,0), +(@PATH,11,624.3472,190.9705,507.7706,0,0,0,100,0), +(@PATH,12,613.3229,189.9236,507.3956,0,0,0,100,0), +(@PATH,13,604.5156,189.651,507.3956,0,0,0,100,0), +(@PATH,14,593.9844,187.4479,508.9778,0,0,0,100,0), +(@PATH,15,584.4202,188.9149,509.6726,0,0,0,100,0); +DELETE FROM `waypoint_scripts` WHERE `id`=48; +INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`guid`) VALUES +(48,0,1,38,67); + +-- Add Overlord Drakuru riders to Stonespine Gargoyle +UPDATE creature_template SET InhabitType=4,`flags_extra`=`flags_extra`|128 WHERE entry=28717; +DELETE FROM `creature` WHERE `id`=28717 AND `map`=658; +DELETE FROM `vehicle_template_accessory` WHERE `entry`=36896; +INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`) VALUES +(36896,28717,1,0, 'Overlord Drakuru on Stonespine Gargoyle',6,30000); diff --git a/sql/old/3.3.5a/2012_05_08_00_world_sai.sql b/sql/old/3.3.5a/2012_05_08_00_world_sai.sql new file mode 100644 index 00000000000..8a776b5f2d2 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_08_00_world_sai.sql @@ -0,0 +1,89 @@ +-- [Q] Arelion's Mistress +-- Viera Sunwhisper SAI +-- Twinkle SAI +SET @ENTRY_VIERA := 17226; +SET @ENTRY_TWINKLE := 17230; +SET @QUEST_PLEASURES := 9483; +SET @SPELL_RETRIBUTION := 30077; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@ENTRY_VIERA,@ENTRY_TWINKLE); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@ENTRY_VIERA,@ENTRY_TWINKLE,@ENTRY_VIERA*100,@ENTRY_VIERA*100+1); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY_VIERA,0,0,0,20,0,100,0,@QUEST_PLEASURES,0,0,0,80,@ENTRY_VIERA*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Quest Finish - Run Script'), +(@ENTRY_VIERA*100,9,0,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Viera Sunwhisper - On Script - Remove Quest Flag"), +(@ENTRY_VIERA*100,9,1,0,0,0,100,0,2000,2000,0,0,53,0,@ENTRY_VIERA,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Start WP 1'), +(@ENTRY_VIERA*100,9,2,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Say Line 0'), +(@ENTRY_VIERA*100,9,3,0,0,0,100,0,0,0,0,0,91,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Stand Up'), +(@ENTRY_VIERA*100,9,4,0,0,0,100,0,6500,6500,0,0,45,0,1,0,0,0,0,10,61963,@ENTRY_TWINKLE,0,0,0,0,0,'Viera Sunwhisper - On Script - Set Data 0 1 Twinkle'), +(@ENTRY_VIERA,0,1,2,40,0,100,0,10,@ENTRY_VIERA,0,0,66,0,0,0,0,0,0,11,@ENTRY_TWINKLE,15,0,0,0,0,0,'Viera Sunwhisper - On WP 10 - Face Twinkle'), +(@ENTRY_VIERA,0,2,0,61,0,100,0,0,0,0,0,54,1000000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On WP 10 - Pause WP'), + +(@ENTRY_TWINKLE,0,0,0,38,0,100,0,0,1,0,0,53,1,@ENTRY_TWINKLE,0,0,0,0,1,0,0,0,0,0,0,0,'Twinkle - On Data 0 1 Set - Start WP 1 (run)'), +(@ENTRY_TWINKLE,0,1,0,40,0,100,0,13,@ENTRY_TWINKLE,0,0,54,1000000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Twinkle - On WP 13 - Pause WP'), +(@ENTRY_TWINKLE,0,2,0,38,0,100,0,1,2,0,0,53,1,@ENTRY_TWINKLE*10,0,0,0,0,1,0,0,0,0,0,0,0,'Twinkle - On Data Set 1 2 - Start WP 2 (run)'), +(@ENTRY_TWINKLE,0,3,0,40,0,100,0,4,@ENTRY_TWINKLE*10,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On WP 4 (2) - Force Despawn'), + +(@ENTRY_VIERA,0,3,0,8,0,100,0,@SPELL_RETRIBUTION,0,0,0,80,@ENTRY_VIERA*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Spellhit - Run Second Script'), +(@ENTRY_VIERA*100+1,9,0,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Say Line 1'), +(@ENTRY_VIERA*100+1,9,1,0,0,0,100,0,0,0,0,0,33,@ENTRY_VIERA,0,0,0,0,0,7,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Quest Credit'), +(@ENTRY_VIERA*100+1,9,2,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Say Line 2'), +(@ENTRY_VIERA*100+1,9,3,0,0,0,100,0,5000,5000,0,0,1,0,0,0,0,0,0,9,@ENTRY_TWINKLE,0,25,0,0,0,0,'Twinkle - On Script - Say Line 0'), +(@ENTRY_VIERA*100+1,9,4,0,0,0,100,0,2000,2000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Say Line 3'), +(@ENTRY_VIERA*100+1,9,5,0,0,0,100,0,0,0,0,0,45,1,2,0,0,0,0,10,61963,@ENTRY_TWINKLE,0,0,0,0,0,'Viera Sunwhisper - On Script - Set Data 1 2 Twinkle'), +(@ENTRY_VIERA*100+1,9,6,0,0,0,100,0,0,0,0,0,53,1,@ENTRY_VIERA*10,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On Script - Start WP 2 (run)'), +(@ENTRY_VIERA,0,4,0,40,0,100,0,4,@ENTRY_VIERA*10,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Viera Sunwhisper - On WP 4 (2) - Force Despawn'); + +-- Waypoints for Viera Sunwhisper +DELETE FROM `waypoints` WHERE `entry` IN (@ENTRY_VIERA,@ENTRY_VIERA*10); +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(@ENTRY_VIERA,1,-653.739197,4145.138184,64.200729,'Viera Sunwhisper'), +(@ENTRY_VIERA,2,-658.875732,4147.715332,64.168304,'Viera Sunwhisper'), +(@ENTRY_VIERA,3,-681.465088,4147.636230,64.118073,'Viera Sunwhisper'), +(@ENTRY_VIERA,4,-686.400696,4161.865234,59.707859,'Viera Sunwhisper'), +(@ENTRY_VIERA,5,-695.956909,4179.237305,57.618931,'Viera Sunwhisper'), +(@ENTRY_VIERA,6,-699.832153,4189.959473,57.503750,'Viera Sunwhisper'), +(@ENTRY_VIERA,7,-708.518616,4184.436035,55.275894,'Viera Sunwhisper'), +(@ENTRY_VIERA,8,-716.137268,4178.130371,52.637508,'Viera Sunwhisper'), +(@ENTRY_VIERA,9,-719.865295,4174.992676,51.554867,'Viera Sunwhisper'), +(@ENTRY_VIERA,10,-720.839417,4162.232422,50.805923,'Viera Sunwhisper'), + +(@ENTRY_VIERA*10,1,-722.323486,4147.936523,50.337898,'Viera Sunwhisper'), +(@ENTRY_VIERA*10,2,-726.639343,4125.156250,48.479683,'Viera Sunwhisper'), +(@ENTRY_VIERA*10,3,-727.648315,4109.684082,47.528461,'Viera Sunwhisper'), +(@ENTRY_VIERA*10,4,-727.874329,4093.438721,46.446579,'Viera Sunwhisper'); + +-- Waypoints for Twinkle +DELETE FROM `waypoints` WHERE `entry` IN (@ENTRY_TWINKLE,@ENTRY_TWINKLE*10); +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(@ENTRY_TWINKLE,1,-605.445190,4165.205078,64.081802,'Twinkle'), +(@ENTRY_TWINKLE,2,-619.293335,4161.776855,63.217815,'Twinkle'), +(@ENTRY_TWINKLE,3,-629.536560,4153.708984,64.067123,'Twinkle'), +(@ENTRY_TWINKLE,4,-644.773438,4151.062988,64.174675,'Twinkle'), +(@ENTRY_TWINKLE,5,-658.875732,4147.715332,64.168304,'Twinkle'), +(@ENTRY_TWINKLE,6,-681.465088,4147.636230,64.118073,'Twinkle'), +(@ENTRY_TWINKLE,7,-686.400696,4161.865234,59.707859,'Twinkle'), +(@ENTRY_TWINKLE,8,-695.956909,4179.237305,57.618931,'Twinkle'), +(@ENTRY_TWINKLE,9,-699.832153,4189.959473,57.503750,'Twinkle'), +(@ENTRY_TWINKLE,10,-708.518616,4184.436035,55.275894,'Twinkle'), +(@ENTRY_TWINKLE,11,-716.137268,4178.130371,52.637508,'Twinkle'), +(@ENTRY_TWINKLE,12,-719.865295,4174.992676,51.554867,'Twinkle'), +(@ENTRY_TWINKLE,13,-720.636292,4166.637695,50.815567,'Twinkle'), + +(@ENTRY_TWINKLE*10,1,-722.323486,4147.936523,50.337898,'Twinkle'), +(@ENTRY_TWINKLE*10,2,-726.639343,4125.156250,48.479683,'Twinkle'), +(@ENTRY_TWINKLE*10,3,-727.648315,4109.684082,47.528461,'Twinkle'), +(@ENTRY_TWINKLE*10,4,-727.874329,4093.438721,46.446579,'Twinkle'); + +-- Spawn spell focus object on correct position +DELETE FROM `gameobject` WHERE `id`=300071 AND `guid`=303; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(303,300071,530,1,1,-720.803,4162.77,50.7916,4.61029,0,0,0.742267,-0.670104,300,0,1); + +-- Texts +DELETE FROM `creature_text` WHERE `entry` IN (@ENTRY_VIERA,@ENTRY_TWINKLE); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY_VIERA,0,0,"Ok, let's go. I know just the perfect spot!",12,0,100,0,0,0,'Viera Sunwhisper'), +(@ENTRY_VIERA,1,0,"I can't wait to try this wine!",12,0,100,0,0,0,'Viera Sunwhisper'), +(@ENTRY_VIERA,2,0,"What... is happening... to me? Get this cat away from me!",12,0,100,0,0,0,'Viera Sunwhisper'), +(@ENTRY_VIERA,3,0,"%s scurries away, attempting to flee from Twinkle",16,0,100,0,0,0,'Viera Sunwhisper'), + +(@ENTRY_TWINKLE,0,0,"%s looks at Viera Sunwhisper with very hungry eyes",16,0,100,0,0,0,'Twinkle'); diff --git a/sql/old/3.3.5a/2012_05_08_01_world_gameobject.sql b/sql/old/3.3.5a/2012_05_08_01_world_gameobject.sql new file mode 100644 index 00000000000..b83d02b4762 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_08_01_world_gameobject.sql @@ -0,0 +1,5 @@ +-- Add Missing Ice Wall, Pit of Saron +SET @GUID := 305; +DELETE FROM `gameobject` WHERE `guid`=@GUID; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@GUID,201885,658,3,1,932.2674,-80.6684,591.6761,2.286379,0,0,0,0,300,100,1); diff --git a/sql/old/3.3.5a/2012_05_08_01_world_misc.sql b/sql/old/3.3.5a/2012_05_08_01_world_misc.sql new file mode 100644 index 00000000000..8f19132fa27 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_08_01_world_misc.sql @@ -0,0 +1,9 @@ +-- Spell area spells for entering POS +DELETE FROM `spell_area` WHERE `spell` IN (70056,70057); +INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_start_active`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`) VALUES +(70056,4904,0,0,0,0,690,2,1), -- Send Script Event (22717) +(70057,4904,0,0,0,0,1101,2,1); -- Send Script Event (22718) + +-- Fix flags and equipment for Ymirjar Deathbringer +UPDATE `creature_template` SET `unit_flags`=`unit_flags`&~256 WHERE `entry` IN (36892,37641); +UPDATE `creature_template` SET `equipment_id`=2444 WHERE `entry`=37641; diff --git a/sql/old/3.3.5a/2012_05_09_00_world_spell_target_position.sql b/sql/old/3.3.5a/2012_05_09_00_world_spell_target_position.sql new file mode 100644 index 00000000000..a6e9d7289b7 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_09_00_world_spell_target_position.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_target_position` WHERE `id` IN (67834, 68081); +INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES +(67834, 571, 3167.01, 5586.04, 880.067, 0), +(68081, 571, 5857.252, 516.8015, 599.82, 2.987); + +UPDATE `spell_target_position` SET `target_position_x`=6136.89,`target_position_y`=4785.55,`target_position_z`=100.673 WHERE `id`=67835; +UPDATE `spell_target_position` SET `target_position_x`=8301.39,`target_position_y`=1501.34,`target_position_z`=870.555 WHERE `id`=67836; diff --git a/sql/old/3.3.5a/2012_05_09_01_world_commands.sql b/sql/old/3.3.5a/2012_05_09_01_world_commands.sql new file mode 100644 index 00000000000..dcd4c9130eb --- /dev/null +++ b/sql/old/3.3.5a/2012_05_09_01_world_commands.sql @@ -0,0 +1,8 @@ +DELETE FROM `trinity_string` WHERE `entry` = 555; +INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES +(555,"SetData performed on [GUID: %u, entry: %u, name: %s] Field: %u, Data: %u, with %s"); + +DELETE FROM `command` WHERE `name` = "npc set data"; +INSERT INTO `command` (`name`,`security`,`help`) VALUES +("npc set data", 3, "Syntax: .npc set data $field $data +Sets data for the selected creature. Used for testing Scripting"); diff --git a/sql/old/3.3.5a/2012_05_09_02_world_sai.sql b/sql/old/3.3.5a/2012_05_09_02_world_sai.sql new file mode 100644 index 00000000000..01004b23505 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_09_02_world_sai.sql @@ -0,0 +1,116 @@ +-- Fixup for Quest Quest:The Path to the Citadel "Alliance and Horde" + +-- Alliance slave add missing equipments +UPDATE `creature_template` SET `equipment_id`=254 WHERE `entry`=36767; + +-- Horde Slave SAI +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` IN (36770,36771,36772,36773); +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (36770,36771,36772,36773); +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (3677000); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(36770,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Reset - Emotestate'), +(36771,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Reset - Emotestate'), +(36772,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Reset - Emotestate'), +(36773,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Reset - Emotestate'), +(36770,0,1,0,8,0,100,7,71281,0,0,0,80,3677000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Spellhit - Run Script'), +(36771,0,1,0,8,0,100,7,71281,0,0,0,80,3677000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Spellhit - Run Script'), +(36772,0,1,0,8,0,100,7,71281,0,0,0,80,3677000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Spellhit - Run Script'), +(36773,0,1,0,8,0,100,7,71281,0,0,0,80,3677000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - On Spellhit - Run Script'), +-- Script +(3677000,9,0,0,0,0,100,0,500,500,500,500,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Horde Slave - Script - Turnto envoker'), +(3677000,9,1,0,0,0,100,0,500,500,500,500,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - Script - say text'), +(3677000,9,2,0,0,0,100,0,100,100,100,100,18,512,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - Script - set unitflag'), +(3677000,9,3,0,0,0,100,0,100,100,100,100,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - Script - set faction'), +(3677000,9,4,0,0,0,100,0,100,100,100,100,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - Script - set Emotestate'), +(3677000,9,5,0,0,0,100,0,100,100,100,100,33,36770,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Horde Slave - Script - give quest credit'), +(3677000,9,6,0,0,0,100,0,100,100,100,100,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - Script - set run on'), +(3677000,9,7,0,0,0,100,0,500,500,500,500,69,1,0,0,0,0,0,19,23837,70,0,0,0,0,0, 'Horde Slave - Script - move to closest trigger'), +(3677000,9,8,0,0,0,100,0,8000,8000,8000,8000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horde Slave - Script - despawn'); + +-- Alliance Slave SAI +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` IN (36764,36765,36766,36767); +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (36764,36765,36766,36767); +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (3676400); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(36764,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Reset - Emotestate'), +(36765,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Reset - Emotestate'), +(36766,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Reset - Emotestate'), +(36767,0,0,0,11,0,100,6,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Reset - Emotestate'), +(36764,0,1,0,8,0,100,7,71281,0,0,0,80,3676400,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Spellhit - Run Script'), +(36765,0,1,0,8,0,100,7,71281,0,0,0,80,3676400,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Spellhit - Run Script'), +(36766,0,1,0,8,0,100,7,71281,0,0,0,80,3676400,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Spellhit - Run Script'), +(36767,0,1,0,8,0,100,7,71281,0,0,0,80,3676400,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - On Spellhit - Run Script'), +-- Script +(3676400,9,0,0,0,0,100,0,500,500,500,500,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Alliance Slave - Script - Turnto envoker'), +(3676400,9,1,0,0,0,100,0,500,500,500,500,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - Script - say text'), +(3676400,9,2,0,0,0,100,0,100,100,100,100,18,512,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - Script - set unitflag'), +(3676400,9,3,0,0,0,100,0,100,100,100,100,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - Script - set faction'), +(3676400,9,4,0,0,0,100,0,100,100,100,100,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - Script - set Emotestate'), +(3676400,9,5,0,0,0,100,0,100,100,100,100,33,36764,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Alliance Slave - Script - give quest credit'), +(3676400,9,6,0,0,0,100,0,100,100,100,100,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - Script - set run on'), +(3676400,9,7,0,0,0,100,0,500,500,500,500,69,1,0,0,0,0,0,19,23837,70,0,0,0,0,0, 'Alliance Slave - Script - move to closest trigger'), +(3676400,9,8,0,0,0,100,0,8000,8000,8000,8000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Alliance Slave - Script - despawn'); + +-- Ball and chain SAI +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (201969); +DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid` IN (201969); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(201969,1,0,0,64,0,100,6,0,0,0,0,85,71281,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Ball and chain - On Gossip Hello - Envoker cast on self'); + +-- Spell Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=71281; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,71281,0,31,3,36770,0,0,'','Spell 71281 targets entry 36770'), +(13,1,71281,1,31,3,36771,0,0,'','Spell 71281 targets entry 36771'), +(13,1,71281,2,31,3,36772,0,0,'','Spell 71281 targets entry 36772'), +(13,1,71281,3,31,3,36773,0,0,'','Spell 71281 targets entry 36773'), +(13,1,71281,4,31,3,36764,0,0,'','Spell 71281 targets entry 36764'), +(13,1,71281,5,31,3,36765,0,0,'','Spell 71281 targets entry 36765'), +(13,1,71281,6,31,3,36766,0,0,'','Spell 71281 targets entry 36766'), +(13,1,71281,7,31,3,36767,0,0,'','Spell 71281 targets entry 36767'); + +-- Creature text from sniff +DELETE FROM `creature_text` WHERE `entry` IN (36770,36771,36772,36773,36764,36765,36766,36767); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +-- Alliance Slaves +(36764,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Alliance Slave'), +(36764,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Alliance Slave'), +(36764,0,2, 'Have my babies.',12,0,100,0,0,0, 'Alliance Slave'), +(36764,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Alliance Slave'), +(36764,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Alliance Slave'), +(36765,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Alliance Slave'), +(36765,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Alliance Slave'), +(36765,0,2, 'Have my babies.',12,0,100,0,0,0, 'Alliance Slave'), +(36765,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Alliance Slave'), +(36765,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Alliance Slave'), +(36766,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Alliance Slave'), +(36766,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Alliance Slave'), +(36766,0,2, 'Have my babies.',12,0,100,0,0,0, 'Alliance Slave'), +(36766,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Alliance Slave'), +(36766,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Alliance Slave'), +(36767,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Alliance Slave'), +(36767,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Alliance Slave'), +(36767,0,2, 'Have my babies.',12,0,100,0,0,0, 'Alliance Slave'), +(36767,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Alliance Slave'), +(36767,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Alliance Slave'), +-- Horde Slaves +(36770,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Horde Slave'), +(36770,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Horde Slave'), +(36770,0,2, 'Have my babies.',12,0,100,0,0,0, 'Horde Slave'), +(36770,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Horde Slave'), +(36770,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Horde Slave'), +(36771,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Horde Slave'), +(36771,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Horde Slave'), +(36771,0,2, 'Have my babies.',12,0,100,0,0,0, 'Horde Slave'), +(36771,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Horde Slave'), +(36771,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Horde Slave'), +(36772,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Horde Slave'), +(36772,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Horde Slave'), +(36772,0,2, 'Have my babies.',12,0,100,0,0,0, 'Horde Slave'), +(36772,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Horde Slave'), +(36772,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Horde Slave'), +(36773,0,0, 'You''re a beautiful sight... you have no idea.',12,0,100,0,0,0, 'Horde Slave'), +(36773,0,1, '%s lets his mining pick drag on the ground as she approaches, clearly exhausted.',16,0,100,0,0,0, 'Horde Slave'), +(36773,0,2, 'Have my babies.',12,0,100,0,0,0, 'Horde Slave'), +(36773,0,3, 'If by life or death I can repay you, I will.',12,0,100,0,0,0, 'Horde Slave'), +(36773,0,4, 'I''m going to return to the front of the quarry. Kill a few extra for me.',12,0,100,0,0,0, 'Horde Slave'); diff --git a/sql/old/3.3.5a/2012_05_09_03_world_misc.sql b/sql/old/3.3.5a/2012_05_09_03_world_misc.sql new file mode 100644 index 00000000000..63e162fcfce --- /dev/null +++ b/sql/old/3.3.5a/2012_05_09_03_world_misc.sql @@ -0,0 +1,56 @@ +-- Update Scourgelord Tyrannus "Make him fly" +UPDATE `creature_template_addon` SET `bytes1`=50331648 WHERE `entry`=36794; + +-- Put Rimefang in the air and make him fly +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=36661; +UPDATE `creature_template_addon` SET `bytes1`=50331648 WHERE `entry`=36661; + +-- Deathwhisper Necrolyte SAI +SET @ENTRY := 36788; -- NPC entry +SET @SPELL1 := 69577; -- Shadow Bolt +SET @SPELL2 := 69578; -- Conversion Beam +SET @SPELL3 := 45104; -- Shadow Channelling +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,6,100,100,3000,3000,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Deathwhisper Necrolyte - Combat - Cast Shadow Bolt'), +(@ENTRY,0,1,0,0,0,100,6,9000,9000,24000,24000,11,@SPELL2,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Deathwhisper Necrolyte - Combat - Cast Conversion Beam'); + +-- Deathwhisper Necrolyte pathing +SET @NPC := 202231; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=592.975,`position_y`=176.104,`position_z`=508.746 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,596.0208,175.5243,508.3654,0,0,0,100,0), +(@PATH,2,605.2656,157.7101,507.2126,0,0,0,100,0), +(@PATH,3,604.4063,146.283,507.3376,0,0,0,100,0), +(@PATH,4,592.2899,131.4271,507.8163,0,0,0,100,0), +(@PATH,5,577.4531,118.224,508.3163,0,0,0,100,0), +(@PATH,6,563.0695,103.7309,514.1504,0,0,0,100,0), +(@PATH,7,557.7743,89.41319,523.1727,0,0,0,100,0), +(@PATH,8,560.9583,77.65278,525.4227,0,0,0,100,0), +(@PATH,9,560.9583,77.65278,525.4227,0,0,0,100,0), +(@PATH,10,571.0139,69.43403,525.2753,0,0,0,100,0), +(@PATH,11,560.9583,77.65278,525.4227,0,0,0,100,0), +(@PATH,12,557.7743,89.41319,523.1727,0,0,0,100,0), +(@PATH,13,563.0695,103.7309,514.1504,0,0,0,100,0), +(@PATH,14,577.4531,118.224,508.3163,0,0,0,100,0), +(@PATH,15,592.2899,131.4271,507.8163,0,0,0,100,0), +(@PATH,16,604.4063,146.283,507.3376,0,0,0,100,0), +(@PATH,17,605.2656,157.7101,507.2126,0,0,0,100,0), +(@PATH,18,596.0208,175.5243,508.3654,0,0,0,100,0); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=202231; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(202231,202231,0,0,2), +(202231,202099,7,288,2), +(202231,202282,7,324,2), +(202231,202125,7,360,2), +(202231,202203,7,36,2), +(202231,201960,7,72,2); + +-- Remove a dupe spawn +DELETE FROM `creature` WHERE `guid`=201998; +DELETE FROM `creature_addon` WHERE `guid`=201998; diff --git a/sql/old/3.3.5a/2012_05_10_00_world_sai.sql b/sql/old/3.3.5a/2012_05_10_00_world_sai.sql new file mode 100644 index 00000000000..c6d6e914345 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_00_world_sai.sql @@ -0,0 +1,42 @@ +-- [Q] See You on the Other Side + +-- Gan'jo SAI +SET @ENTRY := 26924; +SET @QUEST := 12121; +SET @GOSSIP := 10220; +SET @SPELL_RESURRECT := 61613; +UPDATE `creature_template` SET `npcflag`=3,`AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,@GOSSIP,0,0,0,11,@SPELL_RESURRECT,1,0,0,0,0,7,0,0,0,0,0,0,0,"Gan'jo - On Gossip Select - Cast Ganjo Resurrection"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Gan'jo - On Gossip Select - Close Gossip"); + +-- Essence of Warlord Jin'arrak SAI +SET @ENTRY := 26902; +SET @SPELL_DIE_EFFECT := 61611; +SET @SPELL_CAMERA_SHAKE := 47533; +UPDATE `creature_template` SET `AIName`='SmartAI',`flags_extra`=128 WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@ENTRY,@ENTRY*100) AND `source_type` IN (0,9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,"Essence of Warlord Jin'arrak - On Just Summoned - Run Script"), +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,85,@SPELL_CAMERA_SHAKE,0,0,0,0,0,7,0,0,0,0,0,0,0,"Essence of Warlord Jin'arrak - On Script - Invoker Cast Camera Shake - Small"), +(@ENTRY*100,9,1,0,0,0,100,0,4000,4000,0,0,33,@ENTRY,0,0,0,0,0,7,0,0,0,0,0,0,0,"Essence of Warlord Jin'arrak - On Script - Killed Monster Credit"), +(@ENTRY*100,9,2,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Essence of Warlord Jin'arrak - On Script - Monster Whisper Line 0"), +(@ENTRY*100,9,3,0,0,0,100,0,0,0,0,0,85,@SPELL_CAMERA_SHAKE,0,0,0,0,0,7,0,0,0,0,0,0,0,"Essence of Warlord Jin'arrak - On Script - Invoker Cast Camera Shake - Small"), +(@ENTRY*100,9,4,0,0,0,100,0,3000,3000,0,0,85,@SPELL_DIE_EFFECT,0,0,0,0,0,7,0,0,0,0,0,0,0,"Essence of Warlord Jin'arrak - On Script - Invoker Cast On The Other Side"); + +-- Essence of Warlord Jin'arrak text +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0,"How dare you summon me without an offering!",42,0,0,0,0,0,"Essence of Warlord Jin'arrak"); + +-- Ganjo's Resurrection removes On The Other Side +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=@SPELL_RESURRECT; +INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES +(@SPELL_RESURRECT,-@SPELL_DIE_EFFECT,1,"Ganjo's Resurrection removes On The Other Side"); + +-- Conditions for Gan'jo's gossip option +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@GOSSIP; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTarget`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`comment`) VALUES +(15,@GOSSIP,0,0,0,1,@SPELL_DIE_EFFECT,0,"Ganjo's Gossip - requires aura See You On The Other Side"), +(15,@GOSSIP,0,0,1,9,@QUEST,0,"Ganjo's Gossip - requires quest See You On The Other Side to be rewarded"); diff --git a/sql/old/3.3.5a/2012_05_10_01_world_misc.sql b/sql/old/3.3.5a/2012_05_10_01_world_misc.sql new file mode 100644 index 00000000000..a7a30d518a2 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_01_world_misc.sql @@ -0,0 +1,37 @@ +-- [Q] Leave Nothing to Chance + +-- Lower Wintergarde Mine Shaft and Upper Wintergarde Mine Shaft +UPDATE `creature_template` SET `MovementType`=0,`flags_extra`=`flags_extra`|128 WHERE `entry`IN (27437,27436); +UPDATE `creature` SET `MovementType`=0,`spawndist`=0 WHERE `id` IN (27437,27436); + +-- Wintergarde Mine Bomb SAI +SET @ENTRY := 27435; +SET @SPELL_EXPLOSION := 48742; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,1,0,100,1,14000,14000,0,0,11,@SPELL_EXPLOSION,2,0,0,0,0,1,0,0,0,0,0,0,0,"Wintergarde Mine Bomb - Out of Combat - Cast Wintergarde Mine Explosion"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Wintergarde Mine Bomb - On Wintergarde Mine Explosion Cast - Forced Despawn"); + +-- Spawn missing spell focus object for upper mine +DELETE FROM `gameobject` WHERE `id`=188711 AND `guid`=370; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(370,188711,571,1,1,3898.18,-881.748,119.533,0.421023,0,0,0.20896,0.977924,300,0,1); + +-- Spawn missing Upper Wintergarde Mine Shaft +DELETE FROM `creature` WHERE `id`=27436 AND `guid`=42576; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(42576,27436,571,1,1,0,0,3899.86,-883.613,119.536,0.0636665,300,0,0,42,0,0,0,0,0); + +-- Spellscriptname +DELETE FROM `spell_script_names` WHERE `spell_id`=@SPELL_EXPLOSION; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(@SPELL_EXPLOSION,'spell_q12277_wintergarde_mine_explosion'); + +-- The conditions will make it works exactly like it should. Thanks a lot Josh. +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=@SPELL_EXPLOSION; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,@SPELL_EXPLOSION,0,31,3,27437,0,0,'',"Wintergarde Mine Explosion - Lower Wintergarde Mine Shaft"), -- Effect 0 - SPELL_EFFECT_DUMMY +(13,1,@SPELL_EXPLOSION,1,31,3,27436,0,0,'',"Wintergarde Mine Explosion - Upper Wintergarde Mine Shaft"), -- Effect 0 - SPELL_EFFECT_DUMMY +(13,2,@SPELL_EXPLOSION,0,31,4,0,0,0,'',"Wintergarde Mine Explosion - Targets Players"), -- Effect 1 - SPELL_EFFECT_KNOCK_BACK +(13,4,@SPELL_EXPLOSION,0,31,5,188712,0,0,'',"Wintergarde Mine Explosion - Wintergarde Mine Cave In (2)"); -- Effect 2 - SPELL_EFFECT_ACTIVATE_OBJECT diff --git a/sql/old/3.3.5a/2012_05_10_02_world_creature_template.sql b/sql/old/3.3.5a/2012_05_10_02_world_creature_template.sql new file mode 100644 index 00000000000..28893f24fdf --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_02_world_creature_template.sql @@ -0,0 +1,2 @@ +-- fix creauture_template loot id for infinite corruptor. could have sworn this was already in the db. +UPDATE `creature_template` SET `lootid` = 0 WHERE `entry` IN (32313,32273); diff --git a/sql/old/3.3.5a/2012_05_10_03_world_misc.sql b/sql/old/3.3.5a/2012_05_10_03_world_misc.sql new file mode 100644 index 00000000000..339f52ac0bb --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_03_world_misc.sql @@ -0,0 +1,129 @@ + -- Remove obsolete requirement 'cooking profession' from quest 'Beer Basted Boar Ribs' (thx tifkat) closes #5198 +UPDATE `quest_template` SET `RequiredSkillId`=0, `RequiredSkillPoints`=0 WHERE `Id`=384; + +-- Fix proc for Death's Verdict/Choice (author: kandera) closes #6041 +UPDATE `spell_proc_event` SET `procFlags` = 0, `procEx` = `procEx`|262144 WHERE `entry` in (67702, 67771); + +-- Disables quest "Desperate Research" for all factions author trista closes #5285 +DELETE FROM `disables` WHERE `sourceType` = 1 AND `entry` in (12782,12783,12811,12784,12752,12775,12777,12753,12808,12772); +INSERT INTO `disables` (`sourceType`,`entry`,`flags`,`params_0`,`params_1`,`comment`) VALUES +(1,12782,0,0,0,'Disable quest from Scourge Invasion for Blood Elves'), +(1,12783,0,0,0,'Disable quest from Scourge Invasion for Orcs'), +(1,12811,0,0,0,'Disable quest from Scourge Invasion for Trolls'), +(1,12784,0,0,0,'Disable quest from Scourge Invasion for Tauren'), +(1,12752,0,0,0,'Disable quest from Scourge Invasion for undead'), +(1,12775,0,0,0,'Disable quest from Scourge Invasion for Human'), +(1,12777,0,0,0,'Disable quest from Scourge Invasion for Draenei'), +(1,12753,0,0,0,'Disable quest from Scourge Invasion for Dwarves'), +(1,12808,0,0,0,'Disable quest from Scourge Invasion for Gnomes'), +(1,12772,0,0,0,'Disable quest from Scourge Invasion for Night Elves'); +-- Disables scourge invasion connected quests listed below +DELETE FROM `disables` WHERE `sourceType` = 1 AND `entry` in (12788,12812,12785,12786,12787,12774,12776,12771,12809,12773); +INSERT INTO `disables` (`sourceType`,`entry`,`flags`,`params_0`,`params_1`,`comment`) VALUES +(1,12788,0,0,0,'Disable quest from Scourge Invasion for Blood Elves'), +(1,12812,0,0,0,'Disable quest from Scourge Invasion for Orcs'), +(1,12785,0,0,0,'Disable quest from Scourge Invasion for Trolls'), +(1,12786,0,0,0,'Disable quest from Scourge Invasion for Tauren'), +(1,12787,0,0,0,'Disable quest from Scourge Invasion for undead'), +(1,12774,0,0,0,'Disable quest from Scourge Invasion for Human'), +(1,12776,0,0,0,'Disable quest from Scourge Invasion for Draenei'), +(1,12771,0,0,0,'Disable quest from Scourge Invasion for Dwarves'), +(1,12809,0,0,0,'Disable quest from Scourge Invasion for Gnomes'), +(1,12773,0,0,0,'Disable quest from Scourge Invasion for Night Elves'); + +-- Limit Bloodgem Shard use to Netherstorm Cristal Target author: nelegalno closes #4165 +DELETE FROM `conditions` WHERE (`SourceEntry`=34367 AND `SourceTypeOrReferenceId`=17 AND `ConditionTypeOrReference`=29); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(17,0,34367,0,29,19421,15,0,64,'','Limit Bloodgem Shard use to Netherstorm Cristal Target'); + +-- Path of xx and A Change of Heart (Ashen Band rings) author: studioworks closes #2544 +UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `id` IN +(24827,24834,24835,24823,24828,24829,25239,25240,25242,24826,24832,24833,24825,24830,24831,24819,24820,24821,24822,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,25246,25247,25248,25249); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=19 AND `SourceEntry` IN +-- Paths +(24827,24834,24835,24823,24828,24829,25239,25240,25242,24826,24832,24833,24825,24830,24831, +-- A Change of Heart +24819,24820,24821,24822,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,25246,25247,25248,25249); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`Comment`) VALUES +-- Path of Courage +(19,0,24827,0,2,50375,1,0,'Path of Courage 1'), +(19,0,24834,0,2,50388,1,0,'Path of Courage 2'), +(19,0,24835,0,2,50403,1,0,'Path of Courage 3'), +-- Path of Destruction +(19,0,24823,0,2,50384,1,0,'Path of Destruction 1'), +(19,0,24828,0,2,50377,1,0,'Path of Destruction 2'), +(19,0,24829,0,2,50397,1,0,'Path of Destruction 3'), +-- Path of Might +(19,0,25239,0,2,52569,1,0,'Path of Might 1'), +(19,0,25240,0,2,52570,1,0,'Path of Might 2'), +(19,0,25242,0,2,52571,1,0,'Path of Might 3'), +-- Path of Vengeance +(19,0,24826,0,2,50376,1,0,'Path of Vengeance 1'), +(19,0,24832,0,2,50387,1,0,'Path of Vengeance 2'), +(19,0,24833,0,2,50401,1,0,'Path of Vengeance 3'), +-- Path of Wisdom +(19,0,24825,0,2,50378,1,0,'Path of Wisdom 1'), +(19,0,24830,0,2,50386,1,0,'Path of Wisdom 2'), +(19,0,24831,0,2,50399,1,0,'Path of Wisdom 3'), +-- A Change of Heart +(19,0,24819,0,2,50377,1,0,'A Change of Heart'), +(19,0,24820,0,2,50376,1,0,'A Change of Heart'), +(19,0,24821,0,2,50375,1,0,'A Change of Heart'), +(19,0,24822,0,2,50378,1,0,'A Change of Heart'), +(19,0,24836,0,2,50384,1,0,'A Change of Heart'), +(19,0,24837,0,2,50386,1,0,'A Change of Heart'), +(19,0,24838,0,2,50387,1,0,'A Change of Heart'), +(19,0,24839,0,2,50388,1,0,'A Change of Heart'), +(19,0,24840,0,2,50397,1,0,'A Change of Heart'), +(19,0,24841,0,2,50399,1,0,'A Change of Heart'), +(19,0,24842,0,2,50401,1,0,'A Change of Heart'), +(19,0,24843,0,2,50403,1,0,'A Change of Heart'), +(19,0,24844,0,2,50398,1,0,'A Change of Heart'), +(19,0,24845,0,2,50400,1,0,'A Change of Heart'), +(19,0,24846,0,2,50402,1,0,'A Change of Heart'), +(19,0,24847,0,2,50404,1,0,'A Change of Heart'), +(19,0,25246,0,2,52572,1,0,'A Change of Heart'), +(19,0,25247,0,2,52569,1,0,'A Change of Heart'), +(19,0,25248,0,2,52570,1,0,'A Change of Heart'), +(19,0,25249,0,2,52571,1,0,'A Change of Heart'); + +-- spawn farmer torp author: zxbiohazardzx closes #6256 +SET @guid := 42652; +DELETE FROM `creature` WHERE `guid`=@guid; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`) +VALUES +(@guid,25607,571,1,1,2886.325,6385.55,92.96985,1.4512,120); -- Farmer Torp + +-- Disgusting Oozeling aura author: gecko32 closes #6197 +UPDATE `creature_template_addon` SET `auras`='25163' WHERE `entry`=15429; +-- Mr. Chilly +-- Add aura chilly for Periodic slide +DELETE FROM `creature_template_addon` WHERE `entry`=29726; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(29726, 0, 0, 0, 0, 0, '61811'); + +-- Update to Change to $n in page text author: gecko32 closes #5930 +UPDATE `page_text` SET `text`='This proof of deed is to verify that $n slew Margol the Rager, scourge of the searing gorge.$B$BThe Ironforge museum recognizes this achievement and thanks the bearer for their generous contribution.$B$B-Head Curator Thorius Stonetender' WHERE `entry`=1231; + +-- Update frost shock and you to only be for shamans. author: whit33r closes #4727 +UPDATE `quest_template` SET `RequiredClasses`=64 WHERE `id` = 7505; + +-- fixes ashen band of destruction proc author: kandera +DELETE FROM `spell_proc_event` WHERE `entry` = 72417; +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(72417,0,0,0,0,0,327680,0,0,0,60); + +-- fixes quest credit from Fel reaver no thanks! author: tREAk & shlomi1515 closes #3715 +UPDATE `spell_dbc` SET `Effect1`=16,`EffectMiscValue1`=10855 WHERE `id`=38758; +DELETE FROM `creature_ai_scripts` WHERE creature_id=22293; + +-- fix areatrigger for wickerman camp author: boomper closes #3549 +DELETE FROM `areatrigger_involvedrelation` WHERE `id` =3991; +INSERT INTO `areatrigger_involvedrelation` (`id`, `quest`) +VALUES (3991,1658); + +-- yous have da darkrune should be daily author: kaelima closes #3457 +UPDATE `quest_template` SET `SpecialFlags` = `SpecialFlags` | 1 WHERE `id` = 11027; + +-- fix infinite corruptor loot id author: vincent-michael +UPDATE `creature_template` SET `lootid` = 32313 WHERE `entry` =32313; diff --git a/sql/old/3.3.5a/2012_05_10_04_world_ceature_sai.sql b/sql/old/3.3.5a/2012_05_10_04_world_ceature_sai.sql new file mode 100644 index 00000000000..5f01e951c4b --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_04_world_ceature_sai.sql @@ -0,0 +1,14 @@ +-- Spawn Disturbed Glacial Revenant +DELETE FROM `creature` WHERE `guid`=201998; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`, `position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(201998,36874,658,2,1,0,0,1053.894,-93.05556,632.8575,4.223697,86400,0,0,1,0,0,0,0,0); +DELETE FROM `creature_addon` WHERE `guid`=201998; +INSERT INTO `creature_addon` (`guid`,`bytes2`) VALUES +(201998,1); + +-- Disturbed Glacial Revenant SAI +SET @ENTRY := 36874; -- NPC entry +UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,4,0,0,12000,15000,11,55216,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Disturbed Glacial Revenant - Combat - Cast Avalanche'); diff --git a/sql/old/3.3.5a/2012_05_10_05_world_waypoints.sql b/sql/old/3.3.5a/2012_05_10_05_world_waypoints.sql new file mode 100644 index 00000000000..1677d74c4a7 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_05_world_waypoints.sql @@ -0,0 +1,88 @@ +-- Deathwhisper Necrolyte pathing +SET @NPC := 202103; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,555.3976,303.5347,507.6232,0,0,0,100,0), +(@PATH,2,568.4896,297.9913,506.9572,0,0,0,100,0), +(@PATH,3,586.1476,292.5486,506.3322,0,0,0,100,0), +(@PATH,4,598.5833,292.6007,506.3322,0,0,0,100,0), +(@PATH,5,602.3438,300.2135,506.9457,0,0,0,100,0), +(@PATH,6,603.0573,307.5399,507.6957,0,0,0,100,0), +(@PATH,7,611.7239,316.1129,508.4457,0,0,0,100,0), +(@PATH,8,620.0677,312.684,508.1957,0,0,0,100,0), +(@PATH,9,622.184,305.0868,508.3207,0,0,0,100,0), +(@PATH,10,616.684,295.2083,507.8819,0,0,0,100,0), +(@PATH,11,613.9236,287.4288,507.0737,0,0,0,100,0), +(@PATH,12,618.5174,272.882,507.6097,0,0,0,100,0), +(@PATH,13,621.4445,263.4861,507.9438,0,0,0,100,0), +(@PATH,14,618.5174,272.882,507.6097,0,0,0,100,0), +(@PATH,15,613.9236,287.4288,507.0737,0,0,0,100,0), +(@PATH,16,616.684,295.2083,507.8819,0,0,0,100,0), +(@PATH,17,622.184,305.0868,508.3207,0,0,0,100,0), +(@PATH,18,620.0677,312.684,508.1,0,0,0,100,0), +(@PATH,19,611.7239,316.1129,508.4457,0,0,0,100,0), +(@PATH,20,603.0573,307.5399,507.6629,0,0,0,100,0), +(@PATH,21,602.3438,300.2135,506.8405,0,0,0,100,0), +(@PATH,22,598.5833,292.6007,506.3498,0,0,0,100,0), +(@PATH,23,586.1476,292.5486,506.3322,0,0,0,100,0), +(@PATH,24,568.4896,297.9913,506.9572,0,0,0,100,0); +DELETE FROM `creature_formations` WHERE `leaderGUID`=@NPC; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@NPC,@NPC,0,0,2), +(@NPC,201819,7,270,2), +(@NPC,201934,7,306,2), +(@NPC,202121,7,342,2), +(@NPC,202196,7,18,2), +(@NPC,202098,7,54,2), +(@NPC,201954,7,90,2); + +-- Deathwhisper Necrolyte pathing +SET @NPC := 202273; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +UPDATE `creature` SET `position_x`=611.9375,`position_y`=117.441,`position_z`=508.0308 WHERE `guid` IN (202273,202054,201845,201914,202145,202227,201988); +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,611.9375,117.441,508.0308,0,0,0,100,0), +(@PATH,2,620.9531,139.3004,506.531,0,0,0,100,0), +(@PATH,3,624.3854,153.9531,507.3376,0,0,0,100,0), +(@PATH,4,625.8316,167.6233,507.4478,0,0,0,100,0), +(@PATH,5,622.8368,183.6788,507.7706,0,0,0,100,0), +(@PATH,6,625.8316,167.6233,507.4478,0,0,0,100,0), +(@PATH,7,624.3854,153.9531,507.3376,0,0,0,100,0), +(@PATH,8,620.9531,139.3004,506.531,0,0,0,100,0), +(@PATH,9,611.9375,117.441,508.0308,0,0,0,100,0), +(@PATH,10,610.8828,99.47656,510.0737,0,0,0,100,0); +DELETE FROM `creature_formations` WHERE `leaderGUID`=@NPC; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@NPC,@NPC,0,0,2), +(@NPC,202054,7,270,2), +(@NPC,201845,7,306,2), +(@NPC,201914,7,342,2), +(@NPC,202145,7,18,2), +(@NPC,202227,7,54,2), +(@NPC,201988,7,90,2); + +-- Fix previous creature removal +DELETE FROM `creature` WHERE `id`=42160; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`, `position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES +(42160,36881,658,3,1,0,0,592.975,176.104,510.1582,508.746,86400,0,0,1,0,0); +UPDATE `creature` SET `position_x`=611.9375,`position_y`=117.441,`position_z`=508.0308 WHERE `guid` IN (202273,202054,201845,201914,202145,202227,201988); +DELETE FROM `creature_formations` WHERE `leaderGUID`=202231; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(202231,202231,0,0,2), +(202231,202099,7,270,2), +(202231,202282,7,306,2), +(202231,202125,7,342,2), +(202231,202203,7,18,2), +(202231,201960,7,54,2), +(202231,42160,7,90,2); + +-- Update Scourgelord Tyrannus "Make him fly" +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=36794; diff --git a/sql/old/3.3.5a/2012_05_10_06_world_waypoints.sql b/sql/old/3.3.5a/2012_05_10_06_world_waypoints.sql new file mode 100644 index 00000000000..6fd04d0e4da --- /dev/null +++ b/sql/old/3.3.5a/2012_05_10_06_world_waypoints.sql @@ -0,0 +1,40 @@ +-- Deathwhisper Necrolyte pathing +SET @NPC := 202063; +SET @PATH := @NPC*10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +UPDATE `creature` SET `position_x`=631.8229,`position_y`=229.7292,`position_z`=508.0604 WHERE `guid` IN (202028,202000,201957,201820,202122,202199); +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,631.8229,229.7292,508.0604,0,0,0,100,0), +(@PATH,2,643.8733,215.2674,508.2268,0,0,0,100,0), +(@PATH,3,659.0139,215.9635,507.8518,0,0,0,100,0), +(@PATH,4,674.184,213.5833,508.8467,0,0,0,100,0), +(@PATH,5,678.8004,201.066,508.4717,0,0,0,100,0), +(@PATH,6,662.4636,183.0694,507.9585,0,0,0,100,0), +(@PATH,7,650.8941,171.5642,507.7085,0,0,0,100,0), +(@PATH,8,637.7292,155.2569,507.9196,0,0,0,100,0), +(@PATH,9,644.6389,130.2639,510.4212,0,0,0,100,0), +(@PATH,10,654.9896,121.3038,511.9212,0,0,0,100,0), +(@PATH,11,677.7448,136.6528,512.7715,0,0,0,100,0), +(@PATH,12,678.2847,149.1233,507.8965,0,0,0,100,0), +(@PATH,13,677.7448,136.6528,512.7715,0,0,0,100,0), +(@PATH,14,654.9896,121.3038,511.9212,0,0,0,100,0), +(@PATH,15,644.6389,130.2639,510.4212,0,0,0,100,0), +(@PATH,16,637.7292,155.2569,507.9196,0,0,0,100,0), +(@PATH,17,650.8941,171.5642,507.7085,0,0,0,100,0), +(@PATH,18,662.4636,183.0694,507.9585,0,0,0,100,0), +(@PATH,19,678.8004,201.066,508.4717,0,0,0,100,0), +(@PATH,20,674.184,213.5833,508.8467,0,0,0,100,0), +(@PATH,21,659.0139,215.9635,507.8518,0,0,0,100,0), +(@PATH,22,643.8733,215.2674,508.2268,0,0,0,100,0); +DELETE FROM `creature_formations` WHERE `leaderGUID`=@NPC; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@NPC,@NPC,0,0,2), +(@NPC,202028,7,270,2), +(@NPC,202000,7,306,2), +(@NPC,201957,7,342,2), +(@NPC,201820,7,18,2), +(@NPC,202122,7,54,2), +(@NPC,202199,7,90,2); diff --git a/sql/old/3.3.5a/2012_05_11_00_world_waypoints.sql b/sql/old/3.3.5a/2012_05_11_00_world_waypoints.sql new file mode 100644 index 00000000000..fa4e18f6468 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_11_00_world_waypoints.sql @@ -0,0 +1,31 @@ +-- Scourgelord Tyrannus pathing +SET @NPC := 201951; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=873.783,`position_y`=136.9774,`position_z`=623.6115,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes1`,`bytes2`) VALUES (@NPC,@PATH,50331648,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,873.783,136.9774,623.6115,0,0,0,100,0), +(@PATH,2,872.9045,139.2743,622.4446,0,0,0,100,0), +(@PATH,3,888.7917,171.3403,591.3615,0,0,0,100,0), +(@PATH,4,861.3073,209.8455,591.3615,0,0,0,100,0), +(@PATH,5,830.4913,254.5556,591.3615,0,0,0,100,0), +(@PATH,6,780.4844,277.6406,591.3615,0,0,0,100,0), +(@PATH,7,732.6771,272.4635,591.3615,0,0,0,100,0), +(@PATH,8,683.9028,265.276,591.3615,0,0,0,100,0), +(@PATH,9,612.3368,284.7934,553.4998,0,0,0,100,0), +(@PATH,10,554.816,303.1858,553.4998,0,0,0,100,0), +(@PATH,11,498.1024,309.0625,553.4998,0,0,0,100,0), +(@PATH,12,470.4167,230.0174,553.4998,0,0,0,100,0), +(@PATH,13,454.0087,175.2135,553.4998,0,0,0,100,0), +(@PATH,14,492.4288,127.1806,583.1108,0,0,0,100,0), +(@PATH,15,551.2604,121.6354,583.1108,0,0,0,100,0), +(@PATH,16,647.5573,126.3542,583.1108,0,0,0,100,0), +(@PATH,17,766.2222,130.9254,583.1108,0,0,0,100,0), +(@PATH,18,829.408,42.33854,583.1108,0,0,0,100,0), +(@PATH,19,746.7101,-53.03299,583.1108,0,0,0,100,0), +(@PATH,20,663.2379,-77.32291,583.1108,0,0,0,100,0), +(@PATH,21,618.6389,3.369792,583.1108,0,0,0,100,0), +(@PATH,22,641.8559,89.27604,583.1108,0,0,0,100,0), +(@PATH,23,794.1667,115.6858,583.1108,0,0,0,100,0); diff --git a/sql/old/3.3.5a/2012_05_11_01_world_gameobject_template.sql b/sql/old/3.3.5a/2012_05_11_01_world_gameobject_template.sql new file mode 100644 index 00000000000..630a166276b --- /dev/null +++ b/sql/old/3.3.5a/2012_05_11_01_world_gameobject_template.sql @@ -0,0 +1,4 @@ +-- Lock Ice Wall and make untargetable +UPDATE `gameobject_template` SET `flags`=18 WHERE `entry`=201885; +-- Saronite Rock Should be untargetable +UPDATE `gameobject_template` SET `flags`=18 WHERE `entry`=196485; diff --git a/sql/old/3.3.5a/2012_05_11_02_world_conditions.sql b/sql/old/3.3.5a/2012_05_11_02_world_conditions.sql new file mode 100644 index 00000000000..a10c27a0ef5 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_11_02_world_conditions.sql @@ -0,0 +1,23 @@ +-- Spell Conditions for spell Necromantic Power 69347 +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=69347; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,69347,0,31,3,37496,0,0,'','Spell 69347 targets entry 37496'), +(13,1,69347,1,31,3,37497,0,0,'','Spell 69347 targets entry 37497'), +(13,1,69347,2,31,3,37498,0,0,'','Spell 69347 targets entry 37498'), +(13,1,69347,3,31,3,37584,0,0,'','Spell 69347 targets entry 37584'), +(13,1,69347,4,31,3,37587,0,0,'','Spell 69347 targets entry 37587'), +(13,1,69347,5,31,3,37588,0,0,'','Spell 69347 targets entry 37588'); + +-- Spell Conditions for spell Shriek of the Highborne 70512 +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=70512; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,70512,3,31,3,37584,0,0,'','Spell 70512 targets entry 37584'), +(13,1,70512,4,31,3,37587,0,0,'','Spell 70512 targets entry 37587'), +(13,1,70512,5,31,3,37588,0,0,'','Spell 70512 targets entry 37588'); + +-- Spell Conditions for spell Empowered Blizzard 70130 +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=70130; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,70130,0,31,3,37496,0,0,'','Spell 70130 targets entry 37496'), +(13,1,70130,1,31,3,37497,0,0,'','Spell 70130 targets entry 37497'), +(13,1,70130,2,31,3,37498,0,0,'','Spell 70130 targets entry 37498'); diff --git a/sql/old/3.3.5a/2012_05_12_00_world_gameobject_template.sql b/sql/old/3.3.5a/2012_05_12_00_world_gameobject_template.sql new file mode 100644 index 00000000000..ffa932c8640 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_12_00_world_gameobject_template.sql @@ -0,0 +1,2 @@ +-- Lock Halls of Reflection Portcullis +UPDATE `gameobject_template` SET `flags`=18 WHERE `entry`=201848; diff --git a/sql/old/3.3.5a/2012_05_12_01_world_item_loot_template.sql b/sql/old/3.3.5a/2012_05_12_01_world_item_loot_template.sql new file mode 100644 index 00000000000..052b749c48c --- /dev/null +++ b/sql/old/3.3.5a/2012_05_12_01_world_item_loot_template.sql @@ -0,0 +1,92 @@ +DELETE FROM `item_loot_template` WHERE `entry` BETWEEN 51999 AND 52005; +INSERT INTO `item_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Satchel of Helpfull Goods (level 0-25) +(51999,51964,0,1,1,1,1), -- Vigorous Belt +(51999,51968,0,1,1,1,1), -- Enumerated Wrap +(51999,51978,0,1,1,1,1), -- Earthbound Girdle +(51999,51994,25,1,1,1,1), -- Tumultuous Cloak +-- Satchel of Helpfull Goods (level 26-35) +(52000,51965,0,1,1,1,1), -- Vigorous Handguards +(52000,51973,0,1,1,1,1), -- Enumerated Handwraps +(52000,51980,0,1,1,1,1), -- Earthbound Handgrips +(52000,51996,25,1,1,1,1), -- Tumultuous Necklace +-- Satchel of Helpfull Goods (level 36-45) +(52001,51966,0,1,1,1,1), -- Vigorous Spaulders +(52001,51974,0,1,1,1,1), -- Enumerated Shoulderpads +(52001,51976,0,1,1,1,1), -- Earthbound Shoulderguards +(52001,51984,0,1,1,1,1), -- Stalwart Shoulderpads +(52001,51992,25,1,1,1,1), -- Tumultuous Ring +-- Satchel of Helpfull Goods (level 46-55) +(52002,51962,0,1,1,1,1), -- Vigorous Bracers +(52002,51963,0,1,1,1,1), -- Vigorous Stompers +(52002,51967,0,1,1,1,1), -- Enumerated Sandals +(52002,51972,0,1,1,1,1), -- Enumerated Bracers +(52002,51981,0,1,1,1,1), -- Earthbound Wristguards +(52002,51982,0,1,1,1,1), -- Earthbound Boots +(52002,51989,0,1,1,1,1), -- Stalwart Bands +(52002,51990,0,1,1,1,1), -- Stalwart Treads +-- Satchel of Helpfull Goods (level 56-60) +(52003,51959,0,1,1,1,1), -- Vigorous Belt +(52003,51971,0,1,1,1,1), -- Enumerated Belt +(52003,51977,0,1,1,1,1), -- Earthbound Girdle +(52003,51985,0,1,1,1,1), -- Stalwart Belt +(52003,51993,25,1,1,1,1), -- Turbulent Cloak +-- Satchel of Helpfull Goods (level 61-64) +(52004,51960,0,1,1,1,1), -- Vigorous Gloves +(52004,51970,0,1,1,1,1), -- Enumerated Gloves +(52004,51979,0,1,1,1,1), -- Earthbound Grips +(52004,51987,0,1,1,1,1), -- Stalwart Grips +(52004,51995,25,1,1,1,1), -- Turbulent Necklace +-- Satchel of Helpfull Goods (level 65-70) +(52005,51961,0,1,1,1,1), -- Vigorous Shoulderguards +(52005,51969,0,1,1,1,1), -- Enumerated Shoulders +(52005,51975,0,1,1,1,1), -- Earthbound Shoulders +(52005,51983,0,1,1,1,1), -- Stalwart Shoulderguards +(52005,51991,25,1,0,1,1); -- Turbulent Signet +-- ------------------------------------------------------------------- +-- Set some Parameters +-- ------------------------------------------------------------------- +SET @Cloth := 400; -- Class Bitmask: 16 (Priest) +128 (Mage) +256 (Warlock) +SET @Leather1 := 1100; -- Class Bitmask: 4 (Hunter) +8 (Rogue) +64 (Shaman) +1024 (Druid) +SET @Leather2 := 1032; -- Class Bitmask: 8 (Rogue) +1024 (Druid) +SET @Mail1 := 3; -- Class Bitmask: 1 (Warrior) +2 (Paladin) +SET @Mail2 := 68; -- Class Bitmask: 4 (Hunter) +8 (Shaman) +SET @Plate := 35; -- Class Bitmask: 1 (Warrior) +2 (Paladin) +32 (DeathKnight) +-- Add conditions to make sure everyone gets beneficial loot for their class +-- ------------------------------------------------------------------- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=5 AND `SourceGroup` BETWEEN 51999 AND 52005 ; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +-- Cloth Items +(5,51999,51968,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Wrap only for clothusers'), +(5,52000,51973,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Handwraps only for clothusers'), +(5,52001,51974,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Shoulderpads only for clothusers'), +(5,52002,51967,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Sandals only for clothusers'), +(5,52002,51972,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Bracers only for clothusers'), +(5,52003,51971,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Belt only for clothusers'), +(5,52004,51970,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Gloves only for clothusers'), +(5,52005,51969,0,0,15,0,@Cloth,0,0,0,0,'','SOHG: Enumerated Shoulders only for clothusers'), +-- Leather Items +(5,51999,51964,0,0,15,0,@Leather1,0,0,0,0,'','SOHG: Vigorous Belt only for leatherusers'), +(5,52000,51965,0,0,15,0,@Leather1,0,0,0,0,'','SOHG: Vigorous Handguards only for leatherusers'), +(5,52001,51966,0,0,15,0,@Leather2,0,0,0,0,'','SOHG: Vigorous Spaulders only for leatherusers'), +(5,52002,51962,0,0,15,0,@Leather2,0,0,0,0,'','SOHG: Vigorous Bracers only for leatherusers'), +(5,52002,51963,0,0,15,0,@Leather2,0,0,0,0,'','SOHG: Vigorous Stompers only for leatherusers'), +(5,52003,51959,0,0,15,0,@Leather2,0,0,0,0,'','SOHG: Vigorous Belt only for leatherusers'), +(5,52004,51960,0,0,15,0,@Leather2,0,0,0,0,'','SOHG: Vigorous Gloves only for leatherusers'), +(5,52005,51961,0,0,15,0,@Leather2,0,0,0,0,'','SOHG: Vigorous Shoulderguards only for leatherusers'), +-- Mail Items +(5,51999,51978,0,0,15,0,@Mail1,0,0,0,0,'','SOHG: Earthbound Girdle only for mail users'), +(5,52000,51980,0,0,15,0,@Mail1,0,0,0,0,'','SOHG: Earthbound Handgrips only for mail users'), +(5,52001,51976,0,0,15,0,@Mail2,0,0,0,0,'','SOHG: Earthbound Shoulderguards only for mail users'), +(5,52002,51982,0,0,15,0,@Mail2,0,0,0,0,'','SOHG: Earthbound Boots only for mail users'), +(5,52002,51981,0,0,15,0,@Mail2,0,0,0,0,'','SOHG: Earthbound Wristguards only for mail users'), +(5,52003,51977,0,0,15,0,@Mail2,0,0,0,0,'','SOHG: Earthbound Girdle only for mail users'), +(5,52004,51979,0,0,15,0,@Mail2,0,0,0,0,'','SOHG: Earthbound Grips only for mail users'), +(5,52005,51975,0,0,15,0,@Mail2,0,0,0,0,'','SOHG: Earthbound Shoulders only for mail users'), +-- Plate Items +(5,52001,51984,0,0,15,0,@Plate,0,0,0,0,'','SOHG: Stalwart Shoulderpads only for plate users'), +(5,52002,51989,0,0,15,0,@Plate,0,0,0,0,'','SOHG: Stalwart Bands only for plate users'), +(5,52002,51990,0,0,15,0,@Plate,0,0,0,0,'','SOHG: Stalwart Treads only for plate users'), +(5,52003,51985,0,0,15,0,@Plate,0,0,0,0,'','SOHG: Stalwart Belt only for plate users'), +(5,52004,51987,0,0,15,0,@Plate,0,0,0,0,'','SOHG: Stalwart Grips only for plate users'), +(5,52005,51983,0,0,15,0,@Plate,0,0,0,0,'','SOHG: Stalwart Shoulderguards only for plate users'); diff --git a/sql/old/3.3.5a/2012_05_12_02_world_gameobject_loot_template.sql b/sql/old/3.3.5a/2012_05_12_02_world_gameobject_loot_template.sql new file mode 100644 index 00000000000..b1f445faa59 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_12_02_world_gameobject_loot_template.sql @@ -0,0 +1,37 @@ +-- Add Reference Loots +SET @RefNormal := 35091; +SET @RefHeroic := 35092; +DELETE FROM `reference_loot_template` WHERE `entry` IN (@RefNormal,@RefHeroic); +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Normal Loot +(@RefNormal,49839,0,1,1,1,1), -- Mourning Malice +(@RefNormal,49840,0,1,1,1,1), -- Hate-Forged Cleaver +(@RefNormal,49841,0,1,1,1,1), -- Blackened Geist Ribs +(@RefNormal,49842,0,1,1,1,1), -- Tapestry of the Frozen Throne +(@RefNormal,49843,0,1,1,1,1), -- Crystalline Citadel Gauntlets +(@RefNormal,49844,0,1,1,1,1), -- Crypt Fiend Slayer +(@RefNormal,49845,0,1,1,1,1), -- Bone Golem Scapula +(@RefNormal,49846,0,1,1,1,1), -- Chilled Heart of the Glacier +(@RefNormal,49847,0,1,1,1,1), -- Legguards of Untimely Demise +(@RefNormal,49848,0,1,1,1,1), -- Grim Lasher Shoulderguards +(@RefNormal,49849,0,1,1,1,1), -- Tattered Glacial-Woven Hood +(@RefNormal,49851,0,1,1,1,1), -- Greathelm of the Silver Hand +-- Heroic Loot +(@RefHeroic,50303,0,1,1,1,1), -- Black Icicle +(@RefHeroic,50302,0,1,1,1,1), -- Liar's Tongue +(@RefHeroic,50311,0,1,1,1,1), -- Second Helm of the Executioner +(@RefHeroic,50312,0,1,1,1,1), -- Chestguard of Broken Branches +(@RefHeroic,50310,0,1,1,1,1), -- Fossilized Ammonite Choker +(@RefHeroic,50313,0,1,1,1,1), -- Oath of Empress Zoe +(@RefHeroic,50309,0,1,1,1,1), -- Shriveled Heart +(@RefHeroic,50314,0,1,1,1,1), -- Strip of Remorse +(@RefHeroic,50308,0,1,1,1,1), -- Blighted Leather Footpads +(@RefHeroic,50305,0,1,1,1,1), -- Grinning Skull Boots +(@RefHeroic,50306,0,1,1,1,1), -- The Lady's Promise +(@RefHeroic,50304,0,1,1,1,1); -- Hoarfrost Gauntlets +-- Assign to the chest +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (27985,27993); +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(27985,1,100,1,0,-@RefNormal,2), -- Two from Normal Reference Loot +(27993,1,100,1,0,-@RefHeroic,2), -- Two from Heroic Reference Loot +(27993,43102,85,1,0,1,1); -- Frozen Orb diff --git a/sql/old/3.3.5a/2012_05_13_00_world_creature_text.sql b/sql/old/3.3.5a/2012_05_13_00_world_creature_text.sql new file mode 100644 index 00000000000..8d083156fb0 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_13_00_world_creature_text.sql @@ -0,0 +1,13 @@ +-- NPC talk text insert from sniff +DELETE FROM `creature_text` WHERE `entry`=36494; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(36494,0,0, 'Tiny creatures under feet, you bring Garfrost something good to eat!',14,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,1,0, 'Axe too weak. Garfrost make better and CRUSH YOU.',14,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,2,0, 'Garfrost tired of puny mortals. Now your bones will freeze!',14,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,3,0, 'Garfrost hope giant underpants clean. Save boss great shame. For later.',14,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,4,0, 'Will save for snack. For later.',12,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,4,1, 'That one maybe not so good to eat now. Stupid Garfrost! BAD! BAD!',12,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,5,0, '%s hurls a massive saronite boulder at you!',16,0,100,0,0,0, 'Forgemaster Garfrost'), +(36494,6,0, '%s casts |cFF00AACCDeep Freeze|r at $n.',41,0,100,0,0,0, 'Forgemaster Garfrost'); +-- Remove old script text +DELETE FROM `script_texts` WHERE `entry` BETWEEN -1658006 AND -1658001; diff --git a/sql/old/3.3.5a/2012_05_13_01_world_creature_text.sql b/sql/old/3.3.5a/2012_05_13_01_world_creature_text.sql new file mode 100644 index 00000000000..8e983fd9a73 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_13_01_world_creature_text.sql @@ -0,0 +1,14 @@ +-- NPC talk text insert for Sara +DELETE FROM `creature_text` WHERE `entry`=33134; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(33134,0,0, 'Help me! Please get them off me!',14,0,100,0,0,15771, 'Sara YELL_PREFIGHT'), +(33134,0,1, 'What do you want from me? Leave me alone!',14,0,100,0,0,15772, 'Sara YELL_PREFIGHT'), +(33134,1,0, 'Yes! YES! Show them no mercy! Give no pause to your attacks!',14,0,100,0,0,15773, 'Sara YELL_COMBAT_PHASE_1'), +(33134,1,1, 'Let hatred and rage guide your blows!',14,0,100,0,0,15774, 'Sara YELL_COMBAT_PHASE_1'), +(33134,1,2, 'The time to strike at the head of the beast will soon be upon us! Focus your anger and hatred on his minions!',14,0,100,457,0,15775, 'Sara YELL_COMBAT_PHASE_1'), +(33134,2,0, 'Suffocate upon your own hate!',14,0,100,0,0,15776, 'Sara YELL_COMBAT_PHASE_2'), +(33134,2,1, 'Tremble, mortals, before the coming of the end!',14,0,100,0,0,15777, 'Sara YELL_COMBAT_PHASE_2'), +(33134,3,0, 'Powerless to act...',14,0,100,0,0,15778, 'Sara YELL_SLAY'), +(33134,3,1, 'Could they have been saved?',14,0,100,0,0,15779, 'YELL SAY_SLAY'); +-- remove script text +DELETE FROM script_texts WHERE entry BETWEEN -1603319 AND -1603310; diff --git a/sql/old/3.3.5a/2012_05_16_00_world_scripts.sql b/sql/old/3.3.5a/2012_05_16_00_world_scripts.sql new file mode 100644 index 00000000000..9997c09bd8d --- /dev/null +++ b/sql/old/3.3.5a/2012_05_16_00_world_scripts.sql @@ -0,0 +1,2 @@ +-- Add script to Dragonspire Hall Runes "UBRS" +UPDATE `gameobject_template` SET `ScriptName`= 'go_dragonspire_hall_rune' WHERE `entry` BETWEEN 175194 AND 175200; diff --git a/sql/old/3.3.5a/2012_05_17_00_world_creature_text.sql b/sql/old/3.3.5a/2012_05_17_00_world_creature_text.sql new file mode 100644 index 00000000000..d7df0f94c0b --- /dev/null +++ b/sql/old/3.3.5a/2012_05_17_00_world_creature_text.sql @@ -0,0 +1,7 @@ +-- NPC talk text insert from sniff +DELETE FROM `creature_text` WHERE `entry`=9816; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(9816,0,0, '%s begins to regain its strength!',16,0,100,0,0,0, 'Pyroguard Emberseer'), +(9816,1,0, '%s is nearly at full strength!',16,0,100,0,0,0, 'Pyroguard Emberseer'), +(9816,2,0, '%s regains its power and breaks free of its bonds!',16,0,100,0,0,0, 'Pyroguard Emberseer'), +(9816,3,0, 'Ha! Ha! Ha! Thank you for freeing me, fools. Now let me repay you by charring the flesh from your bones.',14,0,100,0,0,0, 'Pyroguard Emberseer'); diff --git a/sql/old/3.3.5a/2012_05_18_00_world_conditions.sql b/sql/old/3.3.5a/2012_05_18_00_world_conditions.sql new file mode 100644 index 00000000000..ad18a6c65ef --- /dev/null +++ b/sql/old/3.3.5a/2012_05_18_00_world_conditions.sql @@ -0,0 +1,3 @@ +DELETE FROM `conditions` WHERE `SourceEntry` = 52264; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,0,52264,0,0,29,0,28653,5,0,0,97,"","Creature conditions for spell 52264 (Deliver stolen horse)"); diff --git a/sql/old/3.3.5a/2012_05_18_01_world_misc.sql b/sql/old/3.3.5a/2012_05_18_01_world_misc.sql new file mode 100644 index 00000000000..bded6fae447 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_18_01_world_misc.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_proc_event` WHERE `entry` = 70656; + +UPDATE `quest_template` SET `NextQuestId` = 3761 WHERE `id` IN (936,3784,3762); + +DELETE FROM `spell_proc_event` WHERE `entry` = 63611; +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(63611,0,0,0,0,0,51154,0,0,0,0); diff --git a/sql/old/3.3.5a/2012_05_18_01_world_spell_target_position.sql b/sql/old/3.3.5a/2012_05_18_01_world_spell_target_position.sql new file mode 100644 index 00000000000..72ebc409d9d --- /dev/null +++ b/sql/old/3.3.5a/2012_05_18_01_world_spell_target_position.sql @@ -0,0 +1,9 @@ +DELETE FROM `spell_target_position` WHERE `id` IN (30719,53140,53141,53360,54406,68328,71512); +INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES +(30719,571,5807.75,588.347,661.505,1.663), +(53140,571,5807.75,588.347,661.505,1.663), +(53141,571,5807.75,588.347,661.505,1.663), +(53360,571,5807.75,588.347,661.505,1.663), +(54406,571,5807.75,588.347,661.505,1.663), +(68328,571,5807.75,588.347,661.505,1.663), +(71512,571,5807.75,588.347,661.505,1.663); diff --git a/sql/old/3.3.5a/2012_05_19_00_world_quest_template.sql b/sql/old/3.3.5a/2012_05_19_00_world_quest_template.sql new file mode 100644 index 00000000000..f18172ed836 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_19_00_world_quest_template.sql @@ -0,0 +1,2 @@ +-- Change Flags for the Body and Heart Quest +UPDATE `quest_template` SET `Flags`=`Flags`&~2, `SpecialFlags`=`SpecialFlags`|2 WHERE `id` IN (6001,6002); diff --git a/sql/old/3.3.5a/2012_05_19_01_world_smart_scripts.sql b/sql/old/3.3.5a/2012_05_19_01_world_smart_scripts.sql new file mode 100644 index 00000000000..06169d8610a --- /dev/null +++ b/sql/old/3.3.5a/2012_05_19_01_world_smart_scripts.sql @@ -0,0 +1,7 @@ +-- Fix Quest 9962,9967,9970,9972,9973 +UPDATE `smart_scripts` SET `target_type`=16 WHERE `entryorguid`=18398 AND `id`=1; -- Brokentoe +UPDATE `smart_scripts` SET `target_type`=16 WHERE `entryorguid`=18399 AND `id`=4; -- Murkblood Twin +UPDATE `smart_scripts` SET `target_type`=16 WHERE `entryorguid`=18400 AND `id`=5; -- Rokdar the Sundered Lord +UPDATE `smart_scripts` SET `target_type`=16 WHERE `entryorguid`=18401 AND `id`=3; -- Skra'gath +UPDATE `smart_scripts` SET `id`=5,`link`=6,`target_type`=16 WHERE `entryorguid`=18402 AND `action_type`=15; -- Warmaul Champion +UPDATE `smart_scripts` SET `id`=6 WHERE `entryorguid`=18402 AND `action_type`=45; -- Warmaul Champion diff --git a/sql/old/3.3.5a/2012_05_19_02_world_misc.sql b/sql/old/3.3.5a/2012_05_19_02_world_misc.sql new file mode 100644 index 00000000000..97a77ac0ab3 --- /dev/null +++ b/sql/old/3.3.5a/2012_05_19_02_world_misc.sql @@ -0,0 +1,6 @@ +-- 2012-05-19 12:48:24 SourceEntry 52264 in `condition` table, has incorrect SourceGroup 0 (spell effectMask) set , ignoring. +UPDATE `conditions` SET `SourceGroup`=1 WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=0 AND `SourceEntry`=52264 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=29 AND `ConditionTarget`=0 AND `ConditionValue1`=28653 AND `ConditionValue2`=5 AND `ConditionValue3`=0; + +-- 2012-05-19 12:48:18 Quest 384 has `ZoneOrSort` = -304 but `RequiredSkillId` does not have a corresponding value (185). +-- It is not clear if cooking was required on 3.3.5, so reverting it to its original state (however we are sure it is not required in Cata) +UPDATE `quest_template` SET `RequiredSkillId`=185, `RequiredSkillPoints`=1 WHERE `Id`=384; diff --git a/sql/updates/auth/2012_02_19_00_auth_account.sql b/sql/updates/auth/2012_02_19_00_auth_account.sql deleted file mode 100644 index a5b48ede3b4..00000000000 --- a/sql/updates/auth/2012_02_19_00_auth_account.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `account` - ADD COLUMN `os` VARCHAR(4) DEFAULT '' NOT NULL AFTER `locale`; diff --git a/sql/updates/characters/2012_02_19_00_characters_warden_action.sql b/sql/updates/characters/2012_02_19_00_characters_warden_action.sql deleted file mode 100644 index 6e317f5100d..00000000000 --- a/sql/updates/characters/2012_02_19_00_characters_warden_action.sql +++ /dev/null @@ -1,7 +0,0 @@ -DROP TABLE IF EXISTS `warden_action`; - -CREATE TABLE `warden_action` ( - `wardenId` smallint(5) unsigned NOT NULL, - `action` tinyint(3) unsigned DEFAULT NULL, - PRIMARY KEY (`wardenId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 diff --git a/sql/updates/world/2012_02_13_00_world_version.sql b/sql/updates/world/2012_02_13_00_world_version.sql deleted file mode 100644 index 2dd7ab92ddb..00000000000 --- a/sql/updates/world/2012_02_13_00_world_version.sql +++ /dev/null @@ -1 +0,0 @@ -UPDATE `version` SET `db_version`='TDB 335.11.46' LIMIT 1; diff --git a/sql/updates/world/2012_02_14_00_world_achievement_criteria_data.sql b/sql/updates/world/2012_02_14_00_world_achievement_criteria_data.sql deleted file mode 100644 index 4361f33cf38..00000000000 --- a/sql/updates/world/2012_02_14_00_world_achievement_criteria_data.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Criteria conditions for Once Bitten, Twice Shy achievement -DELETE FROM `achievement_criteria_data` WHERE `type`=12 AND `criteria_id` IN (13013, 13012, 13011, 12780); -INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`scriptname`) VALUES -(13013, 12, 1, 0, ""), -- heroic -(13012, 12, 1, 0, ""), -- heroic -(13011, 12, 0, 0, ""), -- normal -(12780, 12, 0, 0, ""); -- normal \ No newline at end of file diff --git a/sql/updates/world/2012_02_15_00_world_quest_template.sql b/sql/updates/world/2012_02_15_00_world_quest_template.sql deleted file mode 100644 index e26f52fd0fe..00000000000 --- a/sql/updates/world/2012_02_15_00_world_quest_template.sql +++ /dev/null @@ -1 +0,0 @@ -UPDATE `quest_template` SET `OfferRewardText` = 'Good, $C. You have done well in serving the Dark Lady. Your continued perseverance and ambition will be of great use to the Lady''s subjects. Return to me again in the future. Perhaps I will have other tasks for you that will aid the Dark Lady in her attempts at overtaking the Lich King and completely freeing the Scourge.', `RequestItemsText` = 'There are a hundred other tasks awaiting my attention, $C. Do you have the books?' WHERE `Id` = 14356; diff --git a/sql/updates/world/2012_02_15_01_world_areatrigger_tavern.sql b/sql/updates/world/2012_02_15_01_world_areatrigger_tavern.sql deleted file mode 100644 index 1c3d45dc490..00000000000 --- a/sql/updates/world/2012_02_15_01_world_areatrigger_tavern.sql +++ /dev/null @@ -1,13 +0,0 @@ -DELETE FROM `areatrigger_tavern` WHERE `id` IN (98, 4109, 4300, 4378, 4380, 4498, 4608, 5314, 5315, 5316, 5317); -INSERT INTO `areatrigger_tavern` (`id`, `name`) VALUES -(98, 'Nesingwary''s Expedition'), -(4109, 'Tranquillen - Upper level Inn'), -(4300, 'Cenarion Refugee - Outside Inn'), -(4378, 'Stonebreaker Hold Inn'), -(4380, 'Falcon Watch Inn'), -(4498, 'Old Hillsbrad Foothills Inn'), -(4608, 'Sanctum Of The Stars - Upper level Inn'), -(5314, 'Wyrmrest Temple'), -(5315, 'Wyrmrest Temple'), -(5316, 'Wyrmrest Temple'), -(5317, 'Wyrmrest Temple'); diff --git a/sql/updates/world/2012_02_15_02_world_item_template.sql b/sql/updates/world/2012_02_15_02_world_item_template.sql deleted file mode 100644 index 463d43368cd..00000000000 --- a/sql/updates/world/2012_02_15_02_world_item_template.sql +++ /dev/null @@ -1,3 +0,0 @@ -DELETE FROM `item_template` WHERE `entry`=49867; -INSERT INTO `item_template` (`entry`, `class`, `subclass`, `unk0`, `name`, `displayid`, `Quality`, `Flags`, `FlagsExtra`, `BuyCount`, `BuyPrice`, `SellPrice`, `InventoryType`, `AllowableClass`, `AllowableRace`, `ItemLevel`, `RequiredLevel`, `RequiredSkill`, `RequiredSkillRank`, `requiredspell`, `requiredhonorrank`, `RequiredCityRank`, `RequiredReputationFaction`, `RequiredReputationRank`, `maxcount`, `stackable`, `ContainerSlots`, `StatsCount`, `stat_type1`, `stat_value1`, `stat_type2`, `stat_value2`, `stat_type3`, `stat_value3`, `stat_type4`, `stat_value4`, `stat_type5`, `stat_value5`, `stat_type6`, `stat_value6`, `stat_type7`, `stat_value7`, `stat_type8`, `stat_value8`, `stat_type9`, `stat_value9`, `stat_type10`, `stat_value10`, `ScalingStatDistribution`, `ScalingStatValue`, `dmg_min1`, `dmg_max1`, `dmg_type1`, `dmg_min2`, `dmg_max2`, `dmg_type2`, `armor`, `holy_res`, `fire_res`, `nature_res`, `frost_res`, `shadow_res`, `arcane_res`, `delay`, `ammo_type`, `RangedModRange`, `spellid_1`, `spelltrigger_1`, `spellcharges_1`, `spellppmRate_1`, `spellcooldown_1`, `spellcategory_1`, `spellcategorycooldown_1`, `spellid_2`, `spelltrigger_2`, `spellcharges_2`, `spellppmRate_2`, `spellcooldown_2`, `spellcategory_2`, `spellcategorycooldown_2`, `spellid_3`, `spelltrigger_3`, `spellcharges_3`, `spellppmRate_3`, `spellcooldown_3`, `spellcategory_3`, `spellcategorycooldown_3`, `spellid_4`, `spelltrigger_4`, `spellcharges_4`, `spellppmRate_4`, `spellcooldown_4`, `spellcategory_4`, `spellcategorycooldown_4`, `spellid_5`, `spelltrigger_5`, `spellcharges_5`, `spellppmRate_5`, `spellcooldown_5`, `spellcategory_5`, `spellcategorycooldown_5`, `bonding`, `description`, `PageText`, `LanguageID`, `PageMaterial`, `startquest`, `lockid`, `Material`, `sheath`, `RandomProperty`, `RandomSuffix`, `block`, `itemset`, `MaxDurability`, `area`, `Map`, `BagFamily`, `TotemCategory`, `socketColor_1`, `socketContent_1`, `socketColor_2`, `socketContent_2`, `socketColor_3`, `socketContent_3`, `socketBonus`, `GemProperties`, `RequiredDisenchantSkill`, `ArmorDamageModifier`, `Duration`, `ItemLimitCategory`, `HolidayId`, `ScriptName`, `DisenchantID`, `FoodType`, `minMoneyLoot`, `maxMoneyLoot`, `WDBVerified`) VALUES -(49867, 12, 0, -1, 'Crown Chemical Co. Supplies', 11448, 1, 0, 8192, 1, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 0, 0, NULL, 0, -1, 0, -1, 4, 'You can hear the clink of glass... dont drop it!', 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 423, 0, 0, 0, 0, 14545); diff --git a/sql/updates/world/2012_02_15_03_world_quest_template.sql b/sql/updates/world/2012_02_15_03_world_quest_template.sql deleted file mode 100644 index 833d36b246c..00000000000 --- a/sql/updates/world/2012_02_15_03_world_quest_template.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Love is in the Air --- Quests Missing Text ... By Albis - -UPDATE `quest_template` SET `RequestItemsText` ='The cologne isn''t going to give itself out, you know.$B$BGet spraying!' , `OfferRewardText` ='Nice work, $N! People will be buying Crown colognes by the crate-load now that they''ve had a chance to try them.$B$BHere''s a little something for helping us out.' WHERE `Id` = 24635; -UPDATE `quest_template` SET `RequestItemsText` ='That perfume''s not going to spray itself, you know.$B$BGet going!' , `OfferRewardText` ='Great work, $N! People will come running to buy Crown perfumes now that they''ve had a chance to sample their wonders.$B$BHere''s a little something for helping us out.' WHERE `Id` = 24629; -UPDATE `quest_template` SET `RequestItemsText` ='You know, those chocolates aren''t going to fling themselves at people.$B$BYou need to get to work!' , `OfferRewardText` ='Lovely work, $N! People will be tripping over one another to get Crown chocolates now that they''ve had a chance to taste those sweet, romantic treats.$B$BHere''s a little something for helping us out.' WHERE `Id` = 24636; -UPDATE `quest_template` SET `OfferRewardText` ='Hey. You got some time on your hands? I could use someone like you.' WHERE `Id` IN (24804,24805); -UPDATE `quest_template` SET `RequestItemsText` ='You analyze that reek yet, kid?' , `OfferRewardText` ='Hey, thanks, kid. Give it over, let''s take a look.$B$B$B$BOh, that ain''t good.' WHERE `Id` IN (24655,24536); -UPDATE `quest_template` SET `RequestItemsText` ='Did they toss ya a crate to deliver?' , `OfferRewardText` ='You got it, huh? Good job, kid. Top notch. Let''s see what we what we got here.$B$B$B$BThat''s not like my Snivel, but what choice is there?' WHERE `Id` = 24848; -UPDATE `quest_template` SET `OfferRewardText` ='You''re not Snivel. He was supposed to be here an hour ago! What have you done with him?$B$B$B$BThis isn''t like my Snivel. Do you think something''s happened to him?' WHERE `Id` = 24850; -UPDATE `quest_template` SET `RequestItemsText` ='Who are you?' , `OfferRewardText` ='All he talked about was leaving town with all his money? Then he really has abandoned me, hasn''t he?$B$BOh, $N. I was such a fool to fall for him, but how could I help myself? He was so irresistible!' WHERE `Id` = 24849; -UPDATE `quest_template` SET `RequestItemsText` ='Who are you?' , `OfferRewardText` ='All he talked about was leaving town with all his money? Then he really has abandoned me, hasn''t he?$B$BI can''t believe I fell for such a horrible goblin! But he was so irresistible when we first met.' WHERE `Id` = 24851; -UPDATE `quest_template` SET `RequestItemsText` ='Did you find the guy, or did he crawl under a rock?' , `OfferRewardText` ='You got his ledger? Really? That''s great, $N. There''s probably loads of good information in here.' WHERE `Id` IN (24657,24576); -UPDATE `quest_template` SET `OfferRewardText` ='Fantastic. Help is exactly what I need.' WHERE `Id` IN (24792,24793); -UPDATE `quest_template` SET `RequestItemsText` ='I don''t remember ordering a cleaing service... why yes, I am Apothecary Hummel.$B$B...wait, what is the meaning of this? You think these meaningless papers can stop me? Hah!' , `OfferRewardText` ='What we do here is none of your business...' WHERE `Id` = 11488; -UPDATE `quest_template` SET `RequestItemsText` ='Did you take care of those no-good scheming villains?' , `OfferRewardText` ='What''ve you got there?$B$BOh hey, this is big. Real big. Most of the crazy details in one little package. Thanks - you really helped us reel this all in. Good working with ya.' WHERE `Id` IN (24745,14483); -UPDATE `quest_template` SET `RequestItemsText` ='Did you teach ''em a lesson?' , `OfferRewardText` ='Good job, kid. You deserve a little somethin''. And hey, come back tomorrow if you get the time; I might have a job for ya.' WHERE `Id` IN (24658,24665,24666,24664,24663,24659,24660,24662,24647,24638,24651,24652,24650,24649,24645,24648); diff --git a/sql/updates/world/2012_02_15_04_world_quest_template.sql b/sql/updates/world/2012_02_15_04_world_quest_template.sql deleted file mode 100644 index 8b6ad1d2cf9..00000000000 --- a/sql/updates/world/2012_02_15_04_world_quest_template.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Horde -UPDATE `quest_template` SET `PrevQuestId`=24805 WHERE `Id`=24536; -- Uncommon Scents completed before starting Something Stinks -UPDATE `quest_template` SET `PrevQuestId`=24536 WHERE `Id`=24541; -- Something Stinks completed before starting Pilfering Perfume -UPDATE `quest_template` SET `PrevQuestId`=24541 WHERE `Id`=24850; -- Pilfering Perfume completed before starting Snivel's Sweetheart -UPDATE `quest_template` SET `PrevQuestId`=24850 WHERE `Id`=24851; -- Snivel's Sweetheart completed before starting Hot On The Trail -UPDATE `quest_template` SET `PrevQuestId`=24851 WHERE `Id`=24576; -- Hot On The Trail completed before starting A Friendly Chat... - -UPDATE `quest_template` SET `PrevQuestId`=24576 WHERE `Id` IN (24638,24645,24647,24648,24649,24650,24651,24652); -- A Friendly Chat... completed before starting Crushing the Crown - --- Alliance -UPDATE `quest_template` SET `PrevQuestId`=24804 WHERE `Id`=24655; -- Uncommon Scents completed before starting Something Stinks -UPDATE `quest_template` SET `PrevQuestId`=24655 WHERE `Id`=24656; -- Something Stinks completed before starting Pilfering Perfume -UPDATE `quest_template` SET `PrevQuestId`=24656 WHERE `Id`=24848; -- Pilfering Perfume completed before starting Snivel's Sweetheart -UPDATE `quest_template` SET `PrevQuestId`=24848 WHERE `Id`=24849; -- Snivel's Sweetheart completed before starting Hot On The Trail -UPDATE `quest_template` SET `PrevQuestId`=24849 WHERE `Id`=24657; -- Hot On The Trail completed before starting A Friendly Chat... - -UPDATE `quest_template` SET `PrevQuestId`=24657 WHERE `Id` IN (24658,24659,24660,24662,24663,24664,24665,24666); -- A Friendly Chat... completed before starting Crushing the Crown diff --git a/sql/updates/world/2012_02_15_06_world_creature_involvedrelation.sql b/sql/updates/world/2012_02_15_06_world_creature_involvedrelation.sql deleted file mode 100644 index 431e23b53b8..00000000000 --- a/sql/updates/world/2012_02_15_06_world_creature_involvedrelation.sql +++ /dev/null @@ -1,3 +0,0 @@ -DELETE FROM `creature_involvedrelation` WHERE `quest`=24745; -INSERT INTO `creature_involvedrelation` (`id`, `quest`) VALUES -(38066, 24745); -- A - Something is in the Air (and it Ain't Love) - Inspector Snip Snagglebolt diff --git a/sql/updates/world/2012_02_15_07_00_world_creature.sql b/sql/updates/world/2012_02_15_07_00_world_creature.sql deleted file mode 100644 index 75beec97d67..00000000000 --- a/sql/updates/world/2012_02_15_07_00_world_creature.sql +++ /dev/null @@ -1,57 +0,0 @@ -SET @GUID := 40489; -SET @NPC :=3254; - -DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+7; -INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES -(@GUID ,@NPC,1,1,1,0,0, 10.3997021, -2316.43555, 92.1945343, 2.91896486,120,0,0,1,0,0,0,0,0), -(@GUID+1,@NPC,1,1,1,0,0,346.736572 , -2606.38916, 91.7916641, 1.58010352,120,0,0,1,0,0,0,0,0), -(@GUID+2,@NPC,1,1,1,0,0, 83.07206 , -2545.2085 , 98.107666 , 1.86412442,120,0,0,1,0,0,0,0,0), -(@GUID+3,@NPC,1,1,1,0,0,-93.53362 , -2287.0835 , 92.35358 , 0.8518014 ,120,0,0,1,0,0,0,0,0), -(@GUID+4,@NPC,1,1,1,0,0,-618.9995,-2738.234,91.91664,4.303216,120,0,0,1,0,0,0,0,0), -(@GUID+5,@NPC,1,1,1,0,0,-491.2982,-2473.443,93.66666,2.670027,120,0,0,1,0,0,0,0,0), -(@GUID+6,@NPC,1,1,1,0,0,-614.9523,-2721.66 ,93.85735,1.412064,120,0,0,1,0,0,0,0,0), -(@GUID+7,@NPC,1,1,1,0,0,-617.4864,-2710.463,96.7657 ,1.582084,120,0,0,1,0,0,0,0,0); - -SET @NPC1=@GUID*10; -SET @NPC2=(@GUID+1)*10; -SET @NPC3=(@GUID+2)*10; -SET @NPC4=(@GUID+3)*10; -SET @NPC5=(@GUID+6)*10; -SET @NPC6=(@GUID+7)*10; - -DELETE FROM `waypoint_data` WHERE `id` IN (@NPC1,@NPC2,@NPC3,@NPC4,@NPC5,@NPC6); -INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES --- 1st -(@NPC1,1,6.336712,-2322.309,92.16663,0,0,0,0,100,0), --- 2nd -(@NPC2,1,346.4289,-2573.332,91.79166,0,0,0,0,100,0), --- 3rd -(@NPC3,1,81.53384,-2540.826,97.38716,0,0,0,0,100,0), -(@NPC3,2,80.28384,-2537.076,96.63716,0,0,0,0,100,0), -(@NPC3,3,79.03384,-2533.326,95.38716,0,0,0,0,100,0), -(@NPC3,4,78.28384,-2530.326,94.63716,0,0,0,0,100,0), -(@NPC3,5,77.03384,-2526.576,93.63716,0,0,0,0,100,0), -(@NPC3,6,76.49564,-2523.443,93.66665,0,0,0,0,100,0), --- 4th -(@NPC4,1,-88.46167,-2281.137,92.69763,0,0,0,0,100,0), -(@NPC4,2,-92.46167,-2285.637,91.94763,0,0,0,0,100,0), --- 5th -(@NPC5,1,-614.9318,-2720.435,94.01199,0,0,0,0,100,0), --- 6th -(@NPC6,1,-617.2921,-2722.99,93.41664,0,0,0,0,100,0), -(@NPC6,2,-617.3077,-2721.99,93.41664,0,0,0,0,100,0), -(@NPC6,3,-617.3398,-2719.99,94.16664,0,0,0,0,100,0), -(@NPC6,4,-617.3867,-2716.99,95.04164,0,0,0,0,100,0), -(@NPC6,5,-617.4336,-2713.99,95.91664,0,0,0,0,100,0), -(@NPC6,6,-617.4805,-2710.99,96.66664,0,0,0,0,100,0), -(@NPC6,7,-617.503,-2708.995,97.04164,0,0,0,0,100,0), -(@NPC6,8,-617.503,-2708.995,97.04164,0,0,0,0,100,0); - -DELETE FROM `creature_addon` WHERE `guid` IN (@GUID,@GUID+1,@GUID+2,@GUID+3,@GUID+6,@GUID+7); -INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES -(@GUID ,@NPC1,0,0,0,0,''), -(@GUID+1,@NPC2,0,0,0,0,''), -(@GUID+2,@NPC3,0,0,0,0,''), -(@GUID+3,@NPC4,0,0,0,0,''), -(@GUID+6,@NPC5,0,0,0,0,''), -(@GUID+7,@NPC6,0,0,0,0,''); diff --git a/sql/updates/world/2012_02_15_07_01_world_waypoint_data.sql b/sql/updates/world/2012_02_15_07_01_world_waypoint_data.sql deleted file mode 100644 index e47572b2074..00000000000 --- a/sql/updates/world/2012_02_15_07_01_world_waypoint_data.sql +++ /dev/null @@ -1,147 +0,0 @@ -SET @NPC := 26841; -SET @GUID := 40497; -- need 9 - -SET @SPAWN0 := (@GUID )*10; -SET @SPAWN1 := (@GUID+1)*10; -SET @SPAWN2 := (@GUID+2)*10; -SET @SPAWN3 := (@GUID+3)*10; -SET @SPAWN4 := (@GUID+4)*10; -SET @SPAWN5 := (@GUID+5)*10; -SET @SPAWN6 := (@GUID+6)*10; -SET @SPAWN7 := (@GUID+7)*10; -SET @SPAWN8 := (@GUID+8)*10; - -DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+8; -INSERT INTO creature (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES -(@GUID ,@NPC,571,1,1,0,0,4690.292,859.291,154.1271,2.914072,120,0,0,1,0,0,0,0,0), -(@GUID+1,@NPC,571,1,1,0,0,4362.418,750.5102,123.7846,6.194367,120,0,0,1,0,0,0,0,0), -(@GUID+2,@NPC,571,1,1,0,0,4191.03,645.8215,109.6868,0.4027403,120,0,0,1,0,0,0,0,0), -(@GUID+3,@NPC,571,1,1,0,0,4098.345,657.0866,99.36436,5.185792,120,0,0,1,0,0,0,0,0), -(@GUID+4,@NPC,571,1,1,0,0,4065.753,709.2308,108.47,1.153499,120,0,0,1,0,0,0,0,0), -(@GUID+5,@NPC,571,1,1,0,0,4012.895,495.4877,82.1595,0.8684024,120,0,0,1,0,0,0,0,0), -(@GUID+6,@NPC,571,1,1,0,0,3941.605,552.9745,144.0994,0.06546114,120,0,0,1,0,0,0,0,0), -(@GUID+7,@NPC,571,1,1,0,0,3995.586,447.6094,88.55691,1.320955,120,0,0,1,0,0,0,0,0), -(@GUID+8,@NPC,571,1,1,0,0,3869.004,707.384,134.3378,4.695541,120,0,0,1,0,0,0,0,0); - -DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID AND @GUID+8; -INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES -(@GUID ,@SPAWN0,0,0,0,0,''), -(@GUID+1,@SPAWN1,0,0,0,0,''), -(@GUID+2,@SPAWN2,0,0,0,0,''), -(@GUID+3,@SPAWN3,0,0,0,0,''), -(@GUID+4,@SPAWN4,0,0,0,0,''), -(@GUID+5,@SPAWN5,0,0,0,0,''), -(@GUID+6,@SPAWN6,0,0,0,0,''), -(@GUID+7,@SPAWN7,0,0,0,0,''), -(@GUID+8,@SPAWN8,0,0,0,0,''); - -DELETE FROM `waypoint_data` WHERE `id` IN (@SPAWN0,@SPAWN1,@SPAWN2,@SPAWN3,@SPAWN4,@SPAWN5,@SPAWN6,@SPAWN7,@SPAWN8); -INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES --- 1st -(@SPAWN0,0,4716.777,833.6211,169.0006,0,0,0,0,100,0), -(@SPAWN0,1,4643.756,855.9798,132.5562,0,0,0,0,100,0), -(@SPAWN0,2,4550.864,812.4362,133.6673,0,0,0,0,100,0), -(@SPAWN0,3,4532.678,762.772,130.1951,0,0,0,0,100,0), -(@SPAWN0,4,4566.182,662.6984,132.7506,0,0,0,0,100,0), -(@SPAWN0,5,4592.511,595.6938,130.1674,0,0,0,0,100,0), -(@SPAWN0,6,4732.632,631.5569,164.584,0,0,0,0,100,0), -(@SPAWN0,7,4716.777,833.6211,169.0006,0,0,0,0,100,0), -(@SPAWN0,8,4643.756,855.9798,132.5562,0,0,0,0,100,0), -(@SPAWN0,9,4550.864,812.4362,133.6673,0,0,0,0,100,0), --- 2nd -(@SPAWN1,0,4431.805,596.8371,157.1775,0,0,0,0,100,0), -(@SPAWN1,1,4128.16,507.4055,198.8118,0,0,0,0,100,0), -(@SPAWN1,2,4102.405,567.1112,198.8118,0,0,0,0,100,0), -(@SPAWN1,3,4112.486,636.6321,86.95068,0,0,0,0,100,0), -(@SPAWN1,4,4141.771,704.1605,67.97847,0,0,0,0,100,0), -(@SPAWN1,5,4191.388,726.6014,98.11736,0,0,0,0,100,0), -(@SPAWN1,6,4247.502,724.9836,182.4229,0,0,0,0,100,0), -(@SPAWN1,7,4295.807,746.8245,210.1174,0,0,0,0,100,0), -(@SPAWN1,8,4387.15,744.5955,93.08962,0,0,0,0,100,0), -(@SPAWN1,9,4428.509,680.8868,91.33962,0,0,0,0,100,0), -(@SPAWN1,10,4431.805,596.8371,157.1775,0,0,0,0,100,0), -(@SPAWN1,11,4128.16,507.4055,198.8118,0,0,0,0,100,0), -(@SPAWN1,12,4102.405,567.1112,198.8118,0,0,0,0,100,0), --- 3rd -(@SPAWN2,0,4170.111,627.0887,100.283,0,0,0,0,100,0), -(@SPAWN2,1,4265.816,644.1154,136.2274,0,0,0,0,100,0), -(@SPAWN2,2,4272.799,551.5093,50.92185,0,0,0,0,100,0), -(@SPAWN2,3,4378.531,451.3199,54.28299,0,0,0,0,100,0), -(@SPAWN2,4,4277.019,345.219,121.2274,0,0,0,0,100,0), -(@SPAWN2,5,4185.893,458.5754,118.5608,0,0,0,0,100,0), -(@SPAWN2,6,4170.111,627.0887,100.283,0,0,0,0,100,0), -(@SPAWN2,7,4265.816,644.1154,136.2274,0,0,0,0,100,0), -(@SPAWN2,8,4272.799,551.5093,50.92185,0,0,0,0,100,0), --- 4th -(@SPAWN3,0,4464.15,712.9612,99.36437,0,0,0,0,100,0), -(@SPAWN3,1,4466.412,769.1019,99.36437,0,0,0,0,100,0), -(@SPAWN3,2,4427.949,785.3342,99.36437,0,0,0,0,100,0), -(@SPAWN3,3,4382.415,794.0613,99.36437,0,0,0,0,100,0), -(@SPAWN3,4,4312.128,808.5213,99.36437,0,0,0,0,100,0), -(@SPAWN3,5,4206.404,817.2534,99.36437,0,0,0,0,100,0), -(@SPAWN3,6,4089.363,771.5425,99.36437,0,0,0,0,100,0), -(@SPAWN3,7,4114.452,637.4808,99.36437,0,0,0,0,100,0), -(@SPAWN3,8,4265.095,661.3358,99.36437,0,0,0,0,100,0), -(@SPAWN3,9,4366.876,678.4272,99.36437,0,0,0,0,100,0), -(@SPAWN3,10,4433.122,674.1555,99.36437,0,0,0,0,100,0), -(@SPAWN3,11,4464.15,712.9612,99.36437,0,0,0,0,100,0), -(@SPAWN3,12,4466.412,769.1019,99.36437,0,0,0,0,100,0), -(@SPAWN3,13,4427.949,785.3342,99.36437,0,0,0,0,100,0), --- 5th -(@SPAWN4,0,4331.604,778.9,114.7446,0,0,0,0,100,0), -(@SPAWN4,1,4270.823,698.3784,130.4668,0,0,0,0,100,0), -(@SPAWN4,2,4232.598,681.8058,126.7724,0,0,0,0,100,0), -(@SPAWN4,3,4156.661,638.471,129.439,0,0,0,0,100,0), -(@SPAWN4,4,4062.89,681.9251,102.9113,0,0,0,0,100,0), -(@SPAWN4,5,4096.761,758.9566,123.5501,0,0,0,0,100,0), -(@SPAWN4,6,4134.598,799.989,109.8835,0,0,0,0,100,0), -(@SPAWN4,7,4189.475,840.5444,114.6335,0,0,0,0,100,0), -(@SPAWN4,8,4274.875,812.3191,101.3001,0,0,0,0,100,0), -(@SPAWN4,9,4331.604,778.9,114.7446,0,0,0,0,100,0), -(@SPAWN4,10,4270.823,698.3784,130.4668,0,0,0,0,100,0), -(@SPAWN4,11,4232.598,681.8058,126.7724,0,0,0,0,100,0), --- 6th -(@SPAWN5,0,3769.598,454.0081,82.1595,0,0,0,0,100,0), -(@SPAWN5,1,3879.825,441.5815,82.1595,0,0,0,0,100,0), -(@SPAWN5,2,3926.388,447.295,82.1595,0,0,0,0,100,0), -(@SPAWN5,3,4017.082,501.3171,82.1595,0,0,0,0,100,0), -(@SPAWN5,4,4015.132,597.8423,82.1595,0,0,0,0,100,0), -(@SPAWN5,5,3923.788,576.8113,82.1595,0,0,0,0,100,0), -(@SPAWN5,6,3865.991,561.2335,82.1595,0,0,0,0,100,0), -(@SPAWN5,7,3795.942,538.189,82.1595,0,0,0,0,100,0), -(@SPAWN5,8,3769.598,454.0081,82.1595,0,0,0,0,100,0), -(@SPAWN5,9,3879.825,441.5815,82.1595,0,0,0,0,100,0), -(@SPAWN5,10,3926.388,447.295,82.1595,0,0,0,0,100,0), --- 7th -(@SPAWN6,0,3886.876,810.7806,134.3378,0,0,0,0,100,0), -(@SPAWN6,1,3868.72,688.4549,134.3378,0,0,0,0,100,0), -(@SPAWN6,2,3883.254,607.1956,134.3378,0,0,0,0,100,0), -(@SPAWN6,3,3904.998,559.2425,134.3378,0,0,0,0,100,0), -(@SPAWN6,4,3969.396,561.8792,148.5877,0,0,0,0,100,0), -(@SPAWN6,5,4010.678,638.0726,130.6155,0,0,0,0,100,0), -(@SPAWN6,6,3976.813,756.3585,134.3378,0,0,0,0,100,0), -(@SPAWN6,7,3886.876,810.7806,134.3378,0,0,0,0,100,0), -(@SPAWN6,8,3868.72,688.4549,134.3378,0,0,0,0,100,0), -(@SPAWN6,9,3883.254,607.1956,134.3378,0,0,0,0,100,0), --- 8th -(@SPAWN7,0,4187.318,438.9777,88.55692,0,0,0,0,100,0), -(@SPAWN7,1,4151.397,351.4095,88.55692,0,0,0,0,100,0), -(@SPAWN7,2,4106.679,347.3126,88.55692,0,0,0,0,100,0), -(@SPAWN7,3,4056.414,373.3088,88.55692,0,0,0,0,100,0), -(@SPAWN7,4,3994.193,440.1974,88.55692,0,0,0,0,100,0), -(@SPAWN7,5,4076.892,564.8895,88.55692,0,0,0,0,100,0), -(@SPAWN7,6,4178.652,558.3406,88.55692,0,0,0,0,100,0), -(@SPAWN7,7,4187.318,438.9777,88.55692,0,0,0,0,100,0), -(@SPAWN7,8,4151.397,351.4095,88.55692,0,0,0,0,100,0), -(@SPAWN7,9,4106.679,347.3126,88.55692,0,0,0,0,100,0), --- 9th -(@SPAWN8,0,3886.876,810.7806,134.3378,0,0,0,0,100,0), -(@SPAWN8,1,3868.72,688.4549,134.3378,0,0,0,0,100,0), -(@SPAWN8,2,3883.254,607.1956,134.3378,0,0,0,0,100,0), -(@SPAWN8,3,3904.998,559.2425,134.3378,0,0,0,0,100,0), -(@SPAWN8,4,3969.396,561.8792,148.5877,0,0,0,0,100,0), -(@SPAWN8,5,4010.678,638.0726,130.6155,0,0,0,0,100,0), -(@SPAWN8,6,3976.813,756.3585,134.3378,0,0,0,0,100,0), -(@SPAWN8,7,3886.876,810.7806,134.3378,0,0,0,0,100,0), -(@SPAWN8,8,3868.72,688.4549,134.3378,0,0,0,0,100,0), -(@SPAWN8,9,3883.254,607.1956,134.3378,0,0,0,0,100,0); diff --git a/sql/updates/world/2012_02_15_07_02_world_misc.sql b/sql/updates/world/2012_02_15_07_02_world_misc.sql deleted file mode 100644 index e7ffe54e922..00000000000 --- a/sql/updates/world/2012_02_15_07_02_world_misc.sql +++ /dev/null @@ -1,120 +0,0 @@ --- Love is in the Air -SET @OGUID := 24399; -SET @CGUID := 40506; -SET @OLDGUID := 40489; -- wrong guids -SET @EVENT := 8; - --- Quest chain -DELETE FROM `creature_questrelation` WHERE `quest` IN (24804,24657,24656,24848,24849); -INSERT INTO `creature_questrelation` (`id`, `quest`) VALUES -(38293, 24804), -- A - Uncommon Scents - Junior Inspector -(38325, 24657), -- A - Friendly Chat... - Marion Sutton -(38066, 24656), -- A - Pilfering Perfume - Inspector Snip Snagglebolt -(38066, 24848), -- A - Fireworks At The Gilded Rose - Inspector Snip Snagglebolt -(38325, 24849); -- A - Hot On The Trail - Marion Sutton - -DELETE FROM `creature_involvedrelation` WHERE `quest` IN (24804,24657,24656,24848,24849); -INSERT INTO `creature_involvedrelation` (`id`, `quest`) VALUES -(38066, 24804), -- A - Uncommon Scents - Inspector Snip Snagglebolt -(38066, 24657), -- A - Friendly Chat... - Inspector Snip Snagglebolt -(38066, 24656), -- A - Pilfering Perfume - Inspector Snip Snagglebolt -(38325, 24848), -- A - Fireworks At The Gilded Rose - Marion Sutton -(38325, 24849); -- A - Hot On The Trail - Marion Sutton - --- Loot: Crown Chemical Co. Supplies -DELETE FROM `gameobject_loot_template` WHERE `entry`=27766; -INSERT INTO `gameobject_loot_template` VALUES -(27766, 49867, -100, 1, 0, 1, 1); -- Crown Chemical Co. Supplies - --- GO spawns -DELETE FROM `gameobject` WHERE `id` IN (181086,201752,201778) AND `guid` BETWEEN @OGUID+0 AND @OGUID+42; -INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES --- Valentine Arch -(@OGUID+0, 181086, 1, 1, 1, 9869.12, 2493.13, 1315.88, 6.16653, 0, 0, 0.0582931, -0.9983, 300, 0, 1), -(@OGUID+1, 181086, 530, 1, 1, -4004.66, -11844.5, 0.19541, 4.93701, 0, 0, 0.623403, -0.7819, 300, 0, 1), -(@OGUID+2, 181086, 0, 1, 1, -4918.78, -983.208, 501.455, 2.30465, 0, 0, 0.913711, 0.406364, 300, 0, 1), -(@OGUID+3, 181086, 0, 1, 1, -8869.51, 636.686, 95.7873, 0.794388, 0, 0, 0.386832, 0.92215, 300, 0, 1), -(@OGUID+4, 181086, 1, 1, 1, 1653.44, -4437.37, 18.1863, 1.72627, 0, 0, 0.759883, 0.65006, 300, 0, 1), -(@OGUID+5, 181086, 1, 1, 1, -1224.34, 68.3642, 129.71, 3.17285, 0, 0, 0.999878, -0.015627, 300, 0, 1), -(@OGUID+6, 181086, 530, 1, 1, 9612.28, -7184.77, 14.285, 1.82938, 0, 0, 0.792374, 0.610036, 300, 0, 1), -(@OGUID+7, 181086, 0, 1, 1, 1629.62, 240.116, 63.8516, 0.155664, 0, 0, 0.0777534, 0.996973, 300, 0, 1), --- Large Crate -(@OGUID+8, 201752, 0, 1, 1, -9029.77, 353.325, 92.923, 0.8808, 0, 0, 0.426301, 0.904581, 300, 0, 1), -(@OGUID+9, 201752, 0, 1, 1, -9029.87, 351.542, 92.9248, 0.489671, 0, 0, 0.242397, 0.970177, 300, 0, 1), -(@OGUID+10, 201752, 0, 1, 1, -9028.41, 352.69, 92.9163, 0.721364, 0, 0, 0.352912, 0.935656, 300, 0, 1), -(@OGUID+11, 201752, 0, 1, 1, -9027.7, 351.062, 92.9193, 0.689162, 0, 0, 0.337803, 0.941217, 300, 0, 1), -(@OGUID+12, 201752, 0, 1, 1, -9029.08, 349.917, 92.932, 0.657746, 0, 0, 0.322977, 0.946407, 300, 0, 1), -(@OGUID+13, 201752, 0, 1, 1, -9028.77, 352.62, 94.1596, 6.02202, 0, 0, 0.130214, -0.991486, 300, 0, 1), -(@OGUID+14, 201752, 0, 1, 1, -9028.84, 350.443, 94.1755, 0.771628, 0, 0, 0.376314, 0.926492, 300, 0, 1), -(@OGUID+15, 201752, 0, 1, 1, -9026.5, 348.864, 93.0359, 2.17356, 0, 0, 0.885134, 0.465337, 300, 0, 1), -(@OGUID+16, 201752, 0, 1, 1, -9028.21, 348.744, 93.024, 0.889436, 0, 0, 0.430203, 0.902732, 300, 0, 1), -(@OGUID+17, 201752, 1, 1, 1, 1381.97, -4431.17, 30.6588, 5.49617, 0, 0, 0.383432, -0.923569, 300, 0, 1), -(@OGUID+18, 201752, 1, 1, 1, 1380.98, -4432.28, 30.6586, 5.55507, 0, 0, 0.356069, -0.93446, 300, 0, 1), -(@OGUID+19, 201752, 1, 1, 1, 1379.73, -4433.4, 30.6569, 5.69644, 0, 0, 0.28918, -0.957275, 300, 0, 1), -(@OGUID+20, 201752, 1, 1, 1, 1377.96, -4432.16, 30.6489, 5.58649, 0, 0, 0.341345, -0.939938, 300, 0, 1), -(@OGUID+21, 201752, 1, 1, 1, 1379.23, -4431.41, 30.6768, 5.559, 0, 0, 0.354231, -0.935158, 300, 0, 1), -(@OGUID+22, 201752, 1, 1, 1, 1379.85, -4432.91, 31.8999, 5.66896, 0, 0, 0.302309, -0.95321, 300, 0, 1), -(@OGUID+23, 201752, 1, 1, 1, 1380.81, -4431.58, 31.902, 5.64147, 0, 0, 0.315381, -0.948965, 300, 0, 1), -(@OGUID+24, 201752, 1, 1, 1, 1377.67, -4434.36, 30.6055, 5.36265, 0, 0, 0.444186, -0.895935, 300, 0, 1), --- Crown Chemical Co. Supplies -(@OGUID+25, 201778, 0, 1, 1, -9031.18, 354.399, 92.9752, 6.12019, 0, 0, 0.0814081, -0.996681, 300, 0, 1), -(@OGUID+26, 201778, 0, 1, 1, -9028.76, 352.525, 95.4034, 0.503804, 0, 0, 0.249246, 0.96844, 300, 0, 1), -(@OGUID+27, 201778, 0, 1, 1, -9030.19, 351.409, 94.1683, 0.134668, 0, 0, 0.067283, 0.997734, 300, 0, 1), -(@OGUID+28, 201778, 0, 1, 1, -9031.52, 349.739, 92.9068, 0.338872, 0, 0, 0.168626, 0.98568, 300, 0, 1), -(@OGUID+29, 201778, 0, 1, 1, -9030.55, 347.899, 92.9635, 0.751206, 0, 0, 0.366833, 0.930287, 300, 0, 1), -(@OGUID+30, 201778, 0, 1, 1, -9027.59, 348.911, 94.2683, 1.784, 0, 0, 0.77833, 0.627855, 300, 0, 1), -(@OGUID+31, 201778, 0, 1, 1, -9028.87, 349.971, 95.4191, 1.82327, 0, 0, 0.790507, 0.612452, 300, 0, 1), -(@OGUID+32, 201778, 0, 1, 1, -9031.75, 354.82, 92.9939, 6.0605, 0, 0, 0.111113, -0.993808, 300, 0, 1), -(@OGUID+33, 201778, 0, 1, 1, -9032.22, 352.779, 92.9627, 6.0605, 0, 0, 0.111113, -0.993808, 300, 0, 1), -(@OGUID+34, 201778, 1, 1, 1, 1375.84, -4432.46, 30.5735, 5.69645, 0, 0, 0.289178, -0.957275, 300, 0, 1), -(@OGUID+35, 201778, 1, 1, 1, 1377.99, -4431.81, 31.8923, 5.5001, 0, 0, 0.381614, -0.924322, 300, 0, 1), -(@OGUID+36, 201778, 1, 1, 1, 1379.21, -4430.58, 31.9198, 4.81681, 0, 0, 0.669241, -0.743045, 300, 0, 1), -(@OGUID+37, 201778, 1, 1, 1, 1379.35, -4432.78, 33.143, 5.61791, 0, 0, 0.326536, -0.945185, 300, 0, 1), -(@OGUID+38, 201778, 1, 1, 1, 1380.87, -4431.5, 33.1452, 4.66994, 0, 0, 0.721955, -0.69194, 300, 0, 1), -(@OGUID+39, 201778, 1, 1, 1, 1380.96, -4429.36, 30.6772, 4.6503, 0, 0, 0.728713, -0.68482, 300, 0, 1), -(@OGUID+40, 201778, 1, 1, 1, 1383.08, -4429.42, 30.651, 4.53642, 0, 0, 0.766505, -0.642238, 300, 0, 1), -(@OGUID+41, 201778, 1, 1, 1, 1378.64, -4428.42, 30.6846, 5.23543, 0, 0, 0.500243, -0.865885, 300, 0, 1), -(@OGUID+42, 201778, 1, 1, 1, 1377.05, -4429.39, 30.6467, 5.31397, 0, 0, 0.465863, -0.884857, 300, 0, 1); - -DELETE FROM `game_event_gameobject` WHERE `eventEntry`=@EVENT AND `guid` BETWEEN @OGUID AND @OGUID+42; -INSERT INTO `game_event_gameobject` (`guid`, `eventEntry`) VALUES -(@OGUID, @EVENT),(@OGUID+1, @EVENT),(@OGUID+2, @EVENT), -(@OGUID+3, @EVENT),(@OGUID+4, @EVENT),(@OGUID+5, @EVENT), -(@OGUID+6, @EVENT),(@OGUID+7, @EVENT),(@OGUID+8, @EVENT), -(@OGUID+9, @EVENT),(@OGUID+10, @EVENT),(@OGUID+11, @EVENT), -(@OGUID+12, @EVENT),(@OGUID+13, @EVENT),(@OGUID+14, @EVENT), -(@OGUID+15, @EVENT),(@OGUID+16, @EVENT),(@OGUID+17, @EVENT), -(@OGUID+18, @EVENT),(@OGUID+19, @EVENT),(@OGUID+20, @EVENT), -(@OGUID+21, @EVENT),(@OGUID+22, @EVENT),(@OGUID+23, @EVENT), -(@OGUID+24, @EVENT),(@OGUID+25, @EVENT),(@OGUID+26, @EVENT), -(@OGUID+27, @EVENT),(@OGUID+28, @EVENT),(@OGUID+29, @EVENT), -(@OGUID+30, @EVENT),(@OGUID+31, @EVENT),(@OGUID+32, @EVENT), -(@OGUID+33, @EVENT),(@OGUID+34, @EVENT),(@OGUID+35, @EVENT), -(@OGUID+36, @EVENT),(@OGUID+37, @EVENT),(@OGUID+38, @EVENT), -(@OGUID+39, @EVENT),(@OGUID+40, @EVENT),(@OGUID+41, @EVENT), -(@OGUID+42, @EVENT); - --- [Q]: Pilfering Perfume --- Note: this is EndText (misleading field name), NOT ObjectiveText1 -UPDATE `quest_template` SET `EndText` = 'Steal perfume package from Crown Chemical Co. outside Stormind' WHERE `Id` = 24656; -- Alliance -UPDATE `quest_template` SET `EndText` = 'Steal perfume package from Crown Chemical Co. outside Orgrimmar' WHERE `Id` = 24541; -- Horde - --- Creature templates and spawns -UPDATE `creature_template` SET `minlevel`=70, `maxlevel`=75 WHERE `entry`=37671; -- Crown Supply Guard -UPDATE `creature_template` SET `npcflag`=`npcflag`|1, `gossip_menu_id`=10991 WHERE `entry`=38293; -- Junior Inspector (gossip menu not confirmed) - -DELETE FROM `creature` WHERE `id` IN (38293,38065,37671) AND `guid` BETWEEN @CGUID+0 AND @CGUID+3; -DELETE FROM `creature` WHERE `id` IN (38293,38065,37671) AND `guid` BETWEEN @OLDGUID+0 AND @OLDGUID+3; -INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES -(@CGUID+0, 38293, 530, 1, 1, 0, 0, -4022.81, -11842.7, 0.0062171, 5.89912, 300, 0, 0, 955, 0, 0, 0, 0, 0), -- Junior Inspector -(@CGUID+1, 38065, 1, 1, 1, 0, 0, 1380.22, -4426.79, 30.6681, 2.03572, 300, 0, 0, 12600, 0, 0, 0, 0, 0), -- Crown Supply Sentry -(@CGUID+2, 37671, 0, 1, 1, 30912, 0, -9033.01, 356.408, 93.1543, 2.09345, 300, 0, 0, 42, 0, 0, 0, 0, 0), -- Crown Supply Guard -(@CGUID+3, 37671, 0, 1, 1, 30912, 0, -9028.63, 344.994, 93.2389, 3.37679, 300, 0, 0, 42, 0, 0, 0, 0, 0); -- Crown Supply Guard - -DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+3 AND `eventEntry`=@EVENT; -DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @OLDGUID+0 AND @OLDGUID+3 AND `eventEntry`=@EVENT; -INSERT INTO `game_event_creature` (`guid`, `eventEntry`) VALUES -(@CGUID+0, @EVENT), -(@CGUID+1, @EVENT), -(@CGUID+2, @EVENT), -(@CGUID+3, @EVENT); diff --git a/sql/updates/world/2012_02_15_08_world_sai.sql b/sql/updates/world/2012_02_15_08_world_sai.sql deleted file mode 100644 index ef49ff484f3..00000000000 --- a/sql/updates/world/2012_02_15_08_world_sai.sql +++ /dev/null @@ -1,9 +0,0 @@ -SET @Pinata := 34632; - -DELETE FROM `smart_scripts` WHERE `entryorguid`=@Pinata AND `source_type`=0; -INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES -(@Pinata, 0, 0, 0, 6, 0, 100, 0, 0, 0, 0, 0, 11, 65788, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ogre Pinata - On death cast Pile of Candy'), -(@Pinata, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ogre Pinata - On reset set react state passive'); - --- same faction of the GO that is spawned by spell 65788 (not sniffed) -UPDATE `creature_template` SET `faction_A`=7,`faction_H`=7,`exp`=0,`AIName`='SmartAI' WHERE `entry`=@Pinata; diff --git a/sql/updates/world/2012_02_15_09_world_spell_proc_event.sql b/sql/updates/world/2012_02_15_09_world_spell_proc_event.sql deleted file mode 100644 index 4811e5d66fe..00000000000 --- a/sql/updates/world/2012_02_15_09_world_spell_proc_event.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Corrected proc of Misery -DELETE FROM `spell_proc_event` WHERE `entry` IN (33191, 33192, 33193); -INSERT INTO `spell_proc_event` VALUES -(33191, 0x00, 0x06, 0x00008000, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0), -(33192, 0x00, 0x06, 0x00008000, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0), -(33193, 0x00, 0x06, 0x00008000, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0); diff --git a/sql/updates/world/2012_02_16_00_world_conditions.sql b/sql/updates/world/2012_02_16_00_world_conditions.sql deleted file mode 100644 index a01792ef838..00000000000 --- a/sql/updates/world/2012_02_16_00_world_conditions.sql +++ /dev/null @@ -1,12800 +0,0 @@ -CREATE TABLE `temp_convert_spells` -( - `id` INT(11), - PRIMARY KEY (`id`) -); - -# spells with EffectImplicitTarget In (6,21, 25) + spells having Targets & 1115534 -# those spells are the ones which require explicit unit target to cast -INSERT INTO `temp_convert_spells` VALUES -(5), -(11), -(12), -(14), -(15), -(17), -(25), -(49), -(50), -(53), -(56), -(58), -(59), -(60), -(61), -(67), -(68), -(72), -(75), -(78), -(89), -(91), -(96), -(100), -(101), -(113), -(116), -(118), -(131), -(132), -(133), -(134), -(139), -(142), -(143), -(145), -(172), -(184), -(205), -(228), -(246), -(260), -(271), -(284), -(285), -(339), -(348), -(355), -(370), -(403), -(408), -(421), -(453), -(457), -(467), -(475), -(512), -(514), -(526), -(527), -(528), -(529), -(530), -(546), -(548), -(550), -(552), -(585), -(589), -(591), -(592), -(594), -(596), -(598), -(600), -(603), -(605), -(606), -(633), -(635), -(639), -(647), -(676), -(686), -(689), -(692), -(694), -(695), -(699), -(700), -(701), -(702), -(703), -(705), -(707), -(709), -(710), -(720), -(731), -(744), -(745), -(746), -(770), -(772), -(774), -(782), -(785), -(812), -(835), -(837), -(845), -(851), -(853), -(879), -(915), -(921), -(930), -(932), -(943), -(970), -(974), -(976), -(980), -(984), -(988), -(992), -(996), -(1004), -(1010), -(1014), -(1026), -(1035), -(1042), -(1044), -(1058), -(1062), -(1075), -(1079), -(1082), -(1088), -(1090), -(1094), -(1098), -(1106), -(1108), -(1120), -(1121), -(1126), -(1130), -(1139), -(1152), -(1159), -(1194), -(1196), -(1210), -(1214), -(1225), -(1228), -(1234), -(1241), -(1243), -(1244), -(1245), -(1249), -(1250), -(1251), -(1266), -(1267), -(1329), -(1330), -(1350), -(1364), -(1373), -(1413), -(1430), -(1446), -(1459), -(1460), -(1461), -(1462), -(1464), -(1467), -(1472), -(1473), -(1474), -(1475), -(1481), -(1485), -(1490), -(1495), -(1513), -(1515), -(1516), -(1536), -(1579), -(1588), -(1604), -(1608), -(1609), -(1650), -(1664), -(1665), -(1666), -(1669), -(1671), -(1672), -(1714), -(1715), -(1752), -(1753), -(1754), -(1755), -(1756), -(1757), -(1758), -(1759), -(1760), -(1766), -(1767), -(1768), -(1769), -(1770), -(1776), -(1777), -(1795), -(1796), -(1797), -(1798), -(1800), -(1809), -(1810), -(1811), -(1822), -(1823), -(1824), -(1831), -(1833), -(1852), -(1906), -(1908), -(1943), -(1950), -(1966), -(1978), -(1991), -(2000), -(2020), -(2021), -(2050), -(2052), -(2053), -(2054), -(2055), -(2060), -(2061), -(2070), -(2090), -(2091), -(2094), -(2096), -(2098), -(2110), -(2118), -(2119), -(2124), -(2125), -(2136), -(2137), -(2138), -(2139), -(2141), -(2142), -(2143), -(2147), -(2148), -(2154), -(2155), -(2275), -(2280), -(2313), -(2372), -(2373), -(2400), -(2425), -(2442), -(2443), -(2444), -(2446), -(2552), -(2589), -(2590), -(2591), -(2601), -(2602), -(2606), -(2607), -(2608), -(2609), -(2610), -(2626), -(2629), -(2630), -(2633), -(2634), -(2636), -(2637), -(2643), -(2647), -(2649), -(2650), -(2653), -(2691), -(2764), -(2767), -(2782), -(2791), -(2800), -(2816), -(2817), -(2818), -(2819), -(2834), -(2850), -(2855), -(2860), -(2871), -(2880), -(2893), -(2908), -(2912), -(2941), -(2944), -(2948), -(2949), -(2969), -(2972), -(2973), -(2974), -(2995), -(3007), -(3009), -(3010), -(3011), -(3018), -(3029), -(3034), -(3043), -(3044), -(3105), -(3108), -(3110), -(3120), -(3121), -(3130), -(3131), -(3132), -(3137), -(3140), -(3145), -(3147), -(3148), -(3150), -(3205), -(3206), -(3207), -(3229), -(3233), -(3234), -(3237), -(3242), -(3243), -(3246), -(3247), -(3252), -(3261), -(3263), -(3267), -(3268), -(3279), -(3280), -(3286), -(3332), -(3355), -(3356), -(3358), -(3360), -(3387), -(3388), -(3393), -(3396), -(3405), -(3409), -(3427), -(3429), -(3436), -(3442), -(3446), -(3465), -(3466), -(3472), -(3510), -(3514), -(3539), -(3542), -(3551), -(3553), -(3571), -(3578), -(3583), -(3584), -(3586), -(3602), -(3603), -(3604), -(3606), -(3607), -(3609), -(3627), -(3635), -(3636), -(3650), -(3674), -(3715), -(3716), -(3747), -(3812), -(3911), -(3912), -(3913), -(3921), -(4011), -(4039), -(4040), -(4041), -(4058), -(4060), -(4089), -(4090), -(4091), -(4101), -(4102), -(4130), -(4131), -(4132), -(4150), -(4159), -(4164), -(4165), -(4166), -(4167), -(4168), -(4169), -(4209), -(4221), -(4240), -(4243), -(4244), -(4262), -(4280), -(4281), -(4282), -(4285), -(4286), -(4294), -(4316), -(4362), -(4423), -(4500), -(4504), -(4505), -(4506), -(4538), -(4630), -(4659), -(4805), -(4877), -(4940), -(4961), -(4962), -(4974), -(4979), -(4980), -(4984), -(4987), -(4996), -(4997), -(4998), -(4999), -(5000), -(5003), -(5019), -(5025), -(5103), -(5105), -(5116), -(5133), -(5137), -(5138), -(5143), -(5144), -(5145), -(5164), -(5165), -(5171), -(5176), -(5177), -(5178), -(5179), -(5180), -(5185), -(5186), -(5187), -(5188), -(5189), -(5195), -(5196), -(5201), -(5208), -(5211), -(5213), -(5221), -(5232), -(5234), -(5246), -(5255), -(5259), -(5260), -(5263), -(5271), -(5276), -(5306), -(5308), -(5320), -(5321), -(5322), -(5323), -(5324), -(5325), -(5337), -(5374), -(5375), -(5376), -(5401), -(5413), -(5416), -(5422), -(5424), -(5433), -(5480), -(5503), -(5507), -(5508), -(5509), -(5513), -(5514), -(5547), -(5565), -(5566), -(5567), -(5570), -(5588), -(5589), -(5595), -(5597), -(5598), -(5614), -(5615), -(5648), -(5649), -(5676), -(5679), -(5696), -(5697), -(5703), -(5726), -(5727), -(5739), -(5760), -(5781), -(5782), -(5862), -(5884), -(5917), -(5918), -(5938), -(5940), -(5951), -(5967), -(6000), -(6016), -(6027), -(6028), -(6041), -(6060), -(6061), -(6063), -(6064), -(6065), -(6066), -(6074), -(6075), -(6076), -(6077), -(6078), -(6121), -(6128), -(6130), -(6132), -(6136), -(6142), -(6144), -(6146), -(6178), -(6199), -(6203), -(6205), -(6213), -(6215), -(6217), -(6222), -(6223), -(6245), -(6252), -(6253), -(6254), -(6255), -(6257), -(6273), -(6277), -(6278), -(6304), -(6327), -(6346), -(6348), -(6349), -(6350), -(6351), -(6352), -(6353), -(6357), -(6358), -(6359), -(6360), -(6362), -(6409), -(6435), -(6460), -(6465), -(6466), -(6483), -(6484), -(6509), -(6530), -(6531), -(6533), -(6546), -(6547), -(6548), -(6552), -(6554), -(6555), -(6572), -(6574), -(6576), -(6580), -(6581), -(6595), -(6607), -(6647), -(6655), -(6660), -(6664), -(6685), -(6713), -(6716), -(6719), -(6726), -(6728), -(6730), -(6742), -(6743), -(6744), -(6745), -(6746), -(6747), -(6748), -(6751), -(6753), -(6754), -(6756), -(6760), -(6761), -(6762), -(6766), -(6767), -(6768), -(6770), -(6774), -(6778), -(6780), -(6785), -(6787), -(6788), -(6789), -(6795), -(6798), -(6800), -(6807), -(6808), -(6809), -(6814), -(6866), -(6870), -(6873), -(6894), -(6907), -(6909), -(6917), -(6922), -(6927), -(6942), -(6946), -(6949), -(6950), -(6951), -(6957), -(6958), -(6960), -(6963), -(6965), -(6979), -(6980), -(6984), -(7001), -(7033), -(7054), -(7057), -(7068), -(7079), -(7081), -(7084), -(7092), -(7093), -(7098), -(7099), -(7101), -(7102), -(7105), -(7120), -(7122), -(7124), -(7125), -(7127), -(7140), -(7145), -(7154), -(7159), -(7160), -(7162), -(7211), -(7266), -(7288), -(7289), -(7290), -(7295), -(7321), -(7322), -(7329), -(7357), -(7365), -(7367), -(7369), -(7372), -(7373), -(7379), -(7384), -(7386), -(7399), -(7400), -(7402), -(7405), -(7414), -(7415), -(7416), -(7439), -(7482), -(7485), -(7588), -(7621), -(7638), -(7641), -(7645), -(7646), -(7648), -(7651), -(7655), -(7656), -(7712), -(7714), -(7715), -(7716), -(7717), -(7718), -(7719), -(7736), -(7761), -(7763), -(7764), -(7799), -(7800), -(7801), -(7802), -(7806), -(7807), -(7808), -(7809), -(7810), -(7811), -(7813), -(7814), -(7815), -(7816), -(7821), -(7829), -(7853), -(7874), -(7875), -(7876), -(7877), -(7878), -(7879), -(7880), -(7881), -(7882), -(7883), -(7884), -(7885), -(7887), -(7891), -(7896), -(7901), -(7914), -(7922), -(7925), -(7926), -(7927), -(7932), -(7933), -(7938), -(7947), -(7951), -(7967), -(7992), -(7994), -(7997), -(8004), -(8008), -(8010), -(8012), -(8014), -(8016), -(8026), -(8028), -(8029), -(8034), -(8037), -(8040), -(8042), -(8044), -(8045), -(8046), -(8050), -(8052), -(8053), -(8056), -(8058), -(8068), -(8070), -(8091), -(8092), -(8094), -(8095), -(8096), -(8097), -(8098), -(8099), -(8100), -(8101), -(8102), -(8103), -(8104), -(8105), -(8106), -(8112), -(8113), -(8114), -(8115), -(8116), -(8117), -(8118), -(8119), -(8120), -(8121), -(8129), -(8137), -(8138), -(8139), -(8140), -(8151), -(8208), -(8211), -(8221), -(8222), -(8242), -(8246), -(8255), -(8256), -(8257), -(8272), -(8275), -(8277), -(8282), -(8288), -(8289), -(8292), -(8295), -(8312), -(8313), -(8314), -(8318), -(8319), -(8344), -(8345), -(8346), -(8347), -(8352), -(8353), -(8355), -(8362), -(8363), -(8365), -(8379), -(8380), -(8382), -(8383), -(8384), -(8385), -(8391), -(8400), -(8401), -(8402), -(8406), -(8407), -(8408), -(8412), -(8413), -(8414), -(8415), -(8416), -(8417), -(8425), -(8426), -(8428), -(8440), -(8441), -(8442), -(8444), -(8445), -(8446), -(8447), -(8448), -(8449), -(8452), -(8453), -(8456), -(8459), -(8460), -(8463), -(8464), -(8493), -(8496), -(8497), -(8552), -(8554), -(8555), -(8595), -(8598), -(8600), -(8613), -(8615), -(8616), -(8617), -(8618), -(8619), -(8620), -(8621), -(8623), -(8624), -(8627), -(8629), -(8631), -(8632), -(8633), -(8637), -(8639), -(8640), -(8643), -(8645), -(8646), -(8647), -(8649), -(8650), -(8654), -(8673), -(8676), -(8680), -(8682), -(8685), -(8689), -(8699), -(8716), -(8721), -(8724), -(8725), -(8733), -(8735), -(8788), -(8806), -(8818), -(8820), -(8903), -(8905), -(8907), -(8910), -(8914), -(8921), -(8924), -(8925), -(8926), -(8927), -(8928), -(8929), -(8936), -(8938), -(8939), -(8940), -(8941), -(8946), -(8947), -(8949), -(8950), -(8951), -(8955), -(8972), -(8983), -(8992), -(8994), -(8998), -(9000), -(9005), -(9007), -(9034), -(9053), -(9057), -(9080), -(9159), -(9176), -(9234), -(9268), -(9275), -(9347), -(9373), -(9454), -(9455), -(9456), -(9459), -(9462), -(9472), -(9473), -(9474), -(9481), -(9482), -(9483), -(9484), -(9485), -(9487), -(9488), -(9492), -(9493), -(9532), -(9552), -(9574), -(9591), -(9612), -(9613), -(9614), -(9654), -(9658), -(9672), -(9734), -(9735), -(9739), -(9745), -(9750), -(9752), -(9756), -(9758), -(9771), -(9775), -(9786), -(9789), -(9790), -(9791), -(9796), -(9806), -(9823), -(9824), -(9826), -(9827), -(9829), -(9830), -(9833), -(9834), -(9835), -(9839), -(9840), -(9841), -(9849), -(9850), -(9852), -(9853), -(9856), -(9857), -(9858), -(9866), -(9867), -(9875), -(9876), -(9880), -(9881), -(9884), -(9885), -(9888), -(9889), -(9892), -(9894), -(9896), -(9901), -(9904), -(9910), -(9912), -(9949), -(9977), -(9991), -(9999), -(10055), -(10056), -(10060), -(10073), -(10101), -(10136), -(10141), -(10142), -(10143), -(10146), -(10147), -(10148), -(10149), -(10150), -(10151), -(10156), -(10157), -(10158), -(10162), -(10163), -(10164), -(10171), -(10172), -(10175), -(10176), -(10178), -(10179), -(10180), -(10181), -(10188), -(10189), -(10190), -(10194), -(10195), -(10196), -(10197), -(10198), -(10199), -(10200), -(10203), -(10204), -(10205), -(10206), -(10207), -(10208), -(10209), -(10210), -(10211), -(10212), -(10217), -(10218), -(10221), -(10222), -(10224), -(10226), -(10227), -(10231), -(10239), -(10244), -(10245), -(10246), -(10277), -(10308), -(10310), -(10312), -(10313), -(10314), -(10321), -(10326), -(10328), -(10329), -(10346), -(10370), -(10371), -(10373), -(10391), -(10392), -(10412), -(10413), -(10414), -(10435), -(10436), -(10444), -(10445), -(10447), -(10448), -(10452), -(10458), -(10466), -(10467), -(10468), -(10472), -(10473), -(10577), -(10578), -(10605), -(10617), -(10651), -(10653), -(10657), -(10659), -(10661), -(10663), -(10689), -(10730), -(10767), -(10768), -(10769), -(10771), -(10833), -(10838), -(10839), -(10843), -(10847), -(10851), -(10855), -(10863), -(10872), -(10892), -(10893), -(10894), -(10898), -(10899), -(10900), -(10901), -(10908), -(10909), -(10915), -(10916), -(10917), -(10921), -(10927), -(10928), -(10929), -(10933), -(10934), -(10937), -(10938), -(10945), -(10946), -(10947), -(10955), -(10957), -(10958), -(10960), -(10961), -(10963), -(10964), -(10965), -(10966), -(11014), -(11016), -(11020), -(11021), -(11027), -(11084), -(11085), -(11131), -(11132), -(11196), -(11197), -(11198), -(11203), -(11204), -(11205), -(11267), -(11268), -(11269), -(11273), -(11274), -(11275), -(11279), -(11280), -(11281), -(11285), -(11286), -(11289), -(11290), -(11293), -(11294), -(11297), -(11299), -(11300), -(11303), -(11335), -(11336), -(11337), -(11353), -(11354), -(11362), -(11366), -(11374), -(11391), -(11397), -(11409), -(11428), -(11430), -(11431), -(11436), -(11442), -(11443), -(11444), -(11446), -(11469), -(11470), -(11471), -(11512), -(11519), -(11520), -(11522), -(11525), -(11528), -(11538), -(11539), -(11545), -(11564), -(11565), -(11566), -(11567), -(11572), -(11573), -(11574), -(11578), -(11584), -(11585), -(11595), -(11596), -(11597), -(11600), -(11601), -(11604), -(11605), -(11608), -(11609), -(11610), -(11612), -(11639), -(11640), -(11641), -(11642), -(11650), -(11658), -(11659), -(11660), -(11661), -(11665), -(11667), -(11668), -(11671), -(11672), -(11675), -(11699), -(11700), -(11707), -(11708), -(11711), -(11712), -(11713), -(11719), -(11721), -(11722), -(11725), -(11726), -(11762), -(11763), -(11772), -(11773), -(11774), -(11775), -(11776), -(11777), -(11778), -(11779), -(11780), -(11781), -(11782), -(11783), -(11784), -(11785), -(11786), -(11787), -(11791), -(11820), -(11821), -(11824), -(11825), -(11835), -(11836), -(11839), -(11877), -(11879), -(11885), -(11886), -(11887), -(11888), -(11889), -(11918), -(11920), -(11921), -(11922), -(11960), -(11962), -(11963), -(11971), -(11972), -(11974), -(11976), -(11977), -(11978), -(11980), -(11981), -(11985), -(11986), -(11994), -(11998), -(12021), -(12023), -(12024), -(12039), -(12054), -(12057), -(12058), -(12096), -(12097), -(12098), -(12118), -(12127), -(12128), -(12130), -(12131), -(12160), -(12161), -(12162), -(12166), -(12167), -(12170), -(12174), -(12175), -(12176), -(12177), -(12178), -(12179), -(12181), -(12242), -(12245), -(12246), -(12248), -(12251), -(12279), -(12280), -(12289), -(12294), -(12355), -(12461), -(12466), -(12471), -(12479), -(12480), -(12484), -(12485), -(12486), -(12491), -(12492), -(12493), -(12494), -(12505), -(12509), -(12510), -(12521), -(12522), -(12523), -(12524), -(12525), -(12526), -(12531), -(12538), -(12540), -(12541), -(12542), -(12545), -(12548), -(12551), -(12553), -(12555), -(12578), -(12579), -(12654), -(12657), -(12668), -(12675), -(12693), -(12699), -(12705), -(12721), -(12723), -(12738), -(12739), -(12742), -(12747), -(12798), -(12809), -(12821), -(12824), -(12825), -(12826), -(12850), -(12868), -(12885), -(12888), -(12890), -(12998), -(13003), -(13005), -(13006), -(13009), -(13013), -(13022), -(13029), -(13044), -(13099), -(13119), -(13120), -(13138), -(13140), -(13142), -(13180), -(13181), -(13218), -(13222), -(13223), -(13224), -(13278), -(13279), -(13281), -(13298), -(13318), -(13319), -(13321), -(13322), -(13323), -(13325), -(13326), -(13327), -(13338), -(13339), -(13340), -(13341), -(13342), -(13374), -(13375), -(13398), -(13424), -(13438), -(13439), -(13440), -(13441), -(13442), -(13443), -(13444), -(13445), -(13446), -(13459), -(13480), -(13482), -(13486), -(13490), -(13491), -(13496), -(13518), -(13519), -(13524), -(13526), -(13527), -(13528), -(13530), -(13534), -(13549), -(13550), -(13551), -(13552), -(13553), -(13554), -(13555), -(13566), -(13567), -(13579), -(13583), -(13584), -(13585), -(13608), -(13619), -(13692), -(13728), -(13729), -(13737), -(13738), -(13748), -(13752), -(13797), -(13860), -(13864), -(13878), -(13880), -(13884), -(13897), -(13901), -(13902), -(13907), -(13921), -(13952), -(13953), -(13977), -(14030), -(14032), -(14033), -(14034), -(14053), -(14087), -(14099), -(14102), -(14103), -(14105), -(14106), -(14109), -(14110), -(14112), -(14118), -(14119), -(14120), -(14122), -(14126), -(14129), -(14130), -(14134), -(14145), -(14156), -(14157), -(14160), -(14178), -(14180), -(14183), -(14189), -(14200), -(14247), -(14251), -(14253), -(14260), -(14261), -(14262), -(14263), -(14264), -(14265), -(14266), -(14269), -(14270), -(14271), -(14278), -(14281), -(14282), -(14283), -(14284), -(14285), -(14286), -(14287), -(14288), -(14289), -(14290), -(14298), -(14299), -(14300), -(14301), -(14308), -(14309), -(14323), -(14324), -(14325), -(14326), -(14327), -(14331), -(14443), -(14515), -(14516), -(14517), -(14518), -(14537), -(14752), -(14792), -(14795), -(14818), -(14819), -(14867), -(14868), -(14873), -(14874), -(14875), -(14890), -(14892), -(14893), -(14894), -(14895), -(14897), -(14902), -(14903), -(14914), -(14916), -(14917), -(14918), -(14919), -(14920), -(14921), -(15037), -(15039), -(15040), -(15042), -(15043), -(15057), -(15065), -(15089), -(15090), -(15095), -(15096), -(15117), -(15120), -(15122), -(15123), -(15124), -(15128), -(15187), -(15207), -(15208), -(15211), -(15228), -(15229), -(15230), -(15232), -(15234), -(15235), -(15236), -(15238), -(15241), -(15242), -(15247), -(15248), -(15249), -(15250), -(15254), -(15257), -(15261), -(15262), -(15263), -(15264), -(15265), -(15266), -(15267), -(15277), -(15279), -(15280), -(15283), -(15284), -(15288), -(15305), -(15306), -(15331), -(15332), -(15342), -(15343), -(15344), -(15346), -(15357), -(15359), -(15362), -(15363), -(15366), -(15398), -(15407), -(15451), -(15471), -(15472), -(15487), -(15493), -(15495), -(15496), -(15497), -(15498), -(15499), -(15500), -(15501), -(15505), -(15530), -(15534), -(15535), -(15536), -(15537), -(15539), -(15547), -(15549), -(15570), -(15572), -(15574), -(15575), -(15580), -(15581), -(15582), -(15583), -(15586), -(15587), -(15592), -(15598), -(15605), -(15607), -(15608), -(15610), -(15611), -(15612), -(15614), -(15615), -(15616), -(15617), -(15618), -(15619), -(15620), -(15621), -(15643), -(15651), -(15652), -(15653), -(15654), -(15655), -(15656), -(15657), -(15659), -(15661), -(15662), -(15664), -(15665), -(15667), -(15691), -(15692), -(15695), -(15698), -(15699), -(15702), -(15708), -(15712), -(15713), -(15729), -(15730), -(15732), -(15734), -(15735), -(15736), -(15749), -(15752), -(15753), -(15784), -(15785), -(15790), -(15791), -(15793), -(15795), -(15797), -(15798), -(15801), -(15802), -(15848), -(15850), -(15859), -(15860), -(15876), -(15878), -(15968), -(15969), -(15970), -(15976), -(15980), -(15981), -(15982), -(16000), -(16001), -(16006), -(16007), -(16029), -(16031), -(16033), -(16034), -(16044), -(16045), -(16050), -(16053), -(16067), -(16071), -(16075), -(16095), -(16100), -(16101), -(16128), -(16143), -(16144), -(16145), -(16168), -(16170), -(16172), -(16176), -(16177), -(16186), -(16231), -(16235), -(16236), -(16237), -(16240), -(16243), -(16247), -(16249), -(16333), -(16336), -(16343), -(16344), -(16351), -(16352), -(16353), -(16366), -(16373), -(16375), -(16391), -(16392), -(16393), -(16400), -(16401), -(16402), -(16403), -(16405), -(16406), -(16407), -(16408), -(16409), -(16410), -(16411), -(16412), -(16413), -(16414), -(16415), -(16427), -(16429), -(16430), -(16431), -(16433), -(16448), -(16449), -(16451), -(16454), -(16455), -(16456), -(16458), -(16460), -(16461), -(16472), -(16495), -(16496), -(16498), -(16508), -(16509), -(16511), -(16527), -(16528), -(16530), -(16536), -(16549), -(16552), -(16553), -(16554), -(16555), -(16561), -(16564), -(16565), -(16568), -(16569), -(16570), -(16573), -(16583), -(16587), -(16588), -(16603), -(16608), -(16610), -(16612), -(16614), -(16618), -(16627), -(16628), -(16636), -(16697), -(16707), -(16708), -(16709), -(16711), -(16712), -(16713), -(16714), -(16716), -(16722), -(16782), -(16783), -(16784), -(16788), -(16790), -(16793), -(16798), -(16799), -(16804), -(16805), -(16827), -(16828), -(16829), -(16830), -(16831), -(16832), -(16844), -(16856), -(16857), -(16868), -(16869), -(16871), -(16898), -(16908), -(16921), -(16922), -(16927), -(16928), -(16953), -(16979), -(16997), -(17008), -(17009), -(17011), -(17012), -(17013), -(17105), -(17134), -(17137), -(17138), -(17139), -(17140), -(17141), -(17142), -(17143), -(17144), -(17146), -(17147), -(17148), -(17149), -(17150), -(17151), -(17153), -(17156), -(17157), -(17158), -(17159), -(17160), -(17165), -(17168), -(17170), -(17171), -(17172), -(17173), -(17174), -(17175), -(17183), -(17194), -(17195), -(17198), -(17201), -(17213), -(17227), -(17230), -(17233), -(17234), -(17238), -(17243), -(17244), -(17246), -(17253), -(17255), -(17256), -(17257), -(17258), -(17259), -(17260), -(17261), -(17273), -(17274), -(17276), -(17281), -(17284), -(17287), -(17289), -(17290), -(17292), -(17293), -(17307), -(17308), -(17311), -(17312), -(17313), -(17314), -(17315), -(17330), -(17331), -(17333), -(17334), -(17347), -(17348), -(17353), -(17364), -(17368), -(17393), -(17405), -(17407), -(17434), -(17435), -(17439), -(17445), -(17451), -(17452), -(17470), -(17483), -(17484), -(17492), -(17494), -(17496), -(17500), -(17503), -(17504), -(17505), -(17506), -(17509), -(17510), -(17511), -(17529), -(17547), -(17607), -(17608), -(17609), -(17610), -(17611), -(17613), -(17615), -(17620), -(17630), -(17633), -(17639), -(17648), -(17649), -(17672), -(17682), -(17692), -(17734), -(17736), -(17738), -(17744), -(17745), -(17749), -(17753), -(17754), -(17755), -(17776), -(17777), -(17794), -(17797), -(17798), -(17799), -(17800), -(17843), -(17855), -(17856), -(17857), -(17859), -(17860), -(17863), -(17877), -(17883), -(17919), -(17920), -(17921), -(17922), -(17923), -(17924), -(17925), -(17926), -(17939), -(17943), -(17944), -(17946), -(17948), -(17950), -(17961), -(17962), -(17963), -(18070), -(18072), -(18075), -(18077), -(18078), -(18081), -(18082), -(18083), -(18084), -(18085), -(18086), -(18088), -(18089), -(18090), -(18091), -(18092), -(18101), -(18103), -(18104), -(18105), -(18106), -(18107), -(18108), -(18111), -(18112), -(18118), -(18138), -(18145), -(18149), -(18151), -(18152), -(18153), -(18159), -(18164), -(18165), -(18172), -(18173), -(18187), -(18197), -(18199), -(18200), -(18202), -(18203), -(18204), -(18205), -(18206), -(18208), -(18209), -(18210), -(18211), -(18214), -(18217), -(18223), -(18266), -(18267), -(18270), -(18276), -(18278), -(18289), -(18347), -(18362), -(18367), -(18368), -(18375), -(18381), -(18387), -(18389), -(18390), -(18395), -(18396), -(18398), -(18425), -(18469), -(18476), -(18498), -(18502), -(18503), -(18543), -(18545), -(18557), -(18561), -(18562), -(18608), -(18610), -(18631), -(18632), -(18633), -(18647), -(18649), -(18651), -(18652), -(18654), -(18656), -(18657), -(18658), -(18663), -(18670), -(18702), -(18761), -(18763), -(18796), -(18798), -(18802), -(18805), -(18807), -(18809), -(18812), -(18813), -(18817), -(18819), -(18833), -(18867), -(18868), -(18869), -(18870), -(18871), -(18945), -(18952), -(18958), -(18968), -(18972), -(18980), -(18988), -(18996), -(19027), -(19128), -(19130), -(19131), -(19132), -(19133), -(19134), -(19136), -(19179), -(19196), -(19213), -(19244), -(19260), -(19276), -(19277), -(19278), -(19279), -(19280), -(19306), -(19319), -(19362), -(19386), -(19391), -(19393), -(19395), -(19397), -(19411), -(19434), -(19437), -(19439), -(19444), -(19445), -(19446), -(19447), -(19448), -(19450), -(19452), -(19460), -(19463), -(19469), -(19471), -(19472), -(19476), -(19481), -(19486), -(19501), -(19503), -(19505), -(19512), -(19548), -(19595), -(19597), -(19632), -(19633), -(19637), -(19639), -(19642), -(19643), -(19644), -(19647), -(19648), -(19650), -(19652), -(19653), -(19654), -(19658), -(19661), -(19662), -(19663), -(19664), -(19674), -(19675), -(19676), -(19677), -(19678), -(19679), -(19680), -(19681), -(19682), -(19683), -(19684), -(19685), -(19686), -(19687), -(19688), -(19689), -(19692), -(19693), -(19694), -(19696), -(19697), -(19699), -(19700), -(19701), -(19725), -(19727), -(19728), -(19729), -(19730), -(19731), -(19734), -(19736), -(19737), -(19738), -(19739), -(19740), -(19742), -(19750), -(19755), -(19767), -(19770), -(19771), -(19775), -(19776), -(19777), -(19779), -(19785), -(19797), -(19801), -(19816), -(19820), -(19834), -(19835), -(19836), -(19837), -(19838), -(19850), -(19852), -(19853), -(19854), -(19869), -(19872), -(19874), -(19881), -(19901), -(19931), -(19938), -(19939), -(19940), -(19941), -(19942), -(19943), -(19970), -(19971), -(19972), -(19973), -(19974), -(19975), -(19983), -(20000), -(20004), -(20005), -(20006), -(20019), -(20066), -(20170), -(20184), -(20185), -(20186), -(20187), -(20211), -(20217), -(20220), -(20221), -(20223), -(20228), -(20233), -(20236), -(20240), -(20243), -(20252), -(20253), -(20271), -(20276), -(20279), -(20294), -(20295), -(20297), -(20298), -(20367), -(20368), -(20369), -(20370), -(20371), -(20372), -(20373), -(20374), -(20410), -(20420), -(20424), -(20425), -(20463), -(20467), -(20473), -(20474), -(20475), -(20477), -(20508), -(20511), -(20534), -(20535), -(20536), -(20537), -(20539), -(20541), -(20543), -(20547), -(20559), -(20560), -(20564), -(20565), -(20569), -(20586), -(20604), -(20605), -(20614), -(20615), -(20616), -(20617), -(20618), -(20623), -(20625), -(20627), -(20629), -(20630), -(20647), -(20655), -(20656), -(20657), -(20658), -(20660), -(20661), -(20662), -(20663), -(20664), -(20665), -(20666), -(20668), -(20677), -(20678), -(20679), -(20682), -(20684), -(20685), -(20688), -(20690), -(20691), -(20692), -(20695), -(20696), -(20698), -(20700), -(20714), -(20720), -(20726), -(20733), -(20735), -(20736), -(20740), -(20751), -(20787), -(20788), -(20790), -(20791), -(20792), -(20793), -(20795), -(20797), -(20800), -(20801), -(20802), -(20804), -(20805), -(20806), -(20807), -(20808), -(20811), -(20812), -(20815), -(20816), -(20819), -(20820), -(20821), -(20822), -(20823), -(20824), -(20825), -(20826), -(20829), -(20830), -(20831), -(20832), -(20869), -(20882), -(20883), -(20893), -(20900), -(20901), -(20902), -(20903), -(20904), -(20909), -(20910), -(20911), -(20929), -(20930), -(20989), -(21008), -(21027), -(21030), -(21047), -(21049), -(21050), -(21055), -(21056), -(21059), -(21060), -(21062), -(21063), -(21064), -(21066), -(21067), -(21068), -(21072), -(21074), -(21077), -(21081), -(21100), -(21128), -(21140), -(21141), -(21150), -(21151), -(21159), -(21162), -(21163), -(21164), -(21170), -(21179), -(21183), -(21187), -(21330), -(21332), -(21335), -(21337), -(21343), -(21356), -(21357), -(21368), -(21369), -(21372), -(21388), -(21390), -(21398), -(21401), -(21402), -(21463), -(21464), -(21465), -(21541), -(21542), -(21543), -(21546), -(21549), -(21551), -(21552), -(21553), -(21647), -(21654), -(21667), -(21668), -(21669), -(21670), -(21731), -(21732), -(21734), -(21735), -(21737), -(21745), -(21787), -(21794), -(21807), -(21829), -(21832), -(21834), -(21835), -(21840), -(21847), -(21866), -(21889), -(21892), -(21898), -(21912), -(21939), -(21949), -(21952), -(21953), -(21960), -(21961), -(21971), -(21979), -(21987), -(21990), -(21992), -(22009), -(22012), -(22048), -(22068), -(22088), -(22108), -(22109), -(22110), -(22111), -(22112), -(22113), -(22114), -(22115), -(22116), -(22117), -(22118), -(22119), -(22120), -(22121), -(22127), -(22128), -(22167), -(22168), -(22187), -(22189), -(22207), -(22227), -(22272), -(22273), -(22274), -(22284), -(22289), -(22290), -(22291), -(22312), -(22335), -(22336), -(22355), -(22357), -(22371), -(22373), -(22411), -(22412), -(22414), -(22415), -(22416), -(22418), -(22423), -(22426), -(22427), -(22428), -(22429), -(22433), -(22438), -(22482), -(22565), -(22568), -(22570), -(22572), -(22574), -(22575), -(22582), -(22591), -(22592), -(22639), -(22641), -(22646), -(22651), -(22661), -(22662), -(22666), -(22667), -(22677), -(22678), -(22682), -(22687), -(22689), -(22690), -(22691), -(22692), -(22695), -(22709), -(22713), -(22715), -(22742), -(22744), -(22745), -(22751), -(22752), -(22784), -(22785), -(22799), -(22800), -(22814), -(22816), -(22817), -(22818), -(22820), -(22822), -(22823), -(22827), -(22828), -(22829), -(22856), -(22858), -(22859), -(22864), -(22883), -(22885), -(22886), -(22887), -(22893), -(22901), -(22907), -(22909), -(22911), -(22916), -(22919), -(22920), -(22935), -(22947), -(22950), -(22951), -(22959), -(22968), -(22993), -(22994), -(22995), -(22997), -(23015), -(23038), -(23059), -(23064), -(23065), -(23073), -(23102), -(23104), -(23106), -(23114), -(23115), -(23122), -(23123), -(23124), -(23125), -(23135), -(23139), -(23153), -(23154), -(23155), -(23169), -(23170), -(23174), -(23205), -(23206), -(23224), -(23256), -(23262), -(23267), -(23268), -(23275), -(23278), -(23298), -(23301), -(23304), -(23333), -(23335), -(23337), -(23340), -(23359), -(23379), -(23380), -(23381), -(23391), -(23392), -(23402), -(23416), -(23417), -(23451), -(23452), -(23454), -(23460), -(23490), -(23491), -(23493), -(23504), -(23505), -(23546), -(23552), -(23567), -(23568), -(23569), -(23577), -(23580), -(23590), -(23592), -(23601), -(23604), -(23605), -(23620), -(23621), -(23622), -(23623), -(23625), -(23626), -(23627), -(23658), -(23661), -(23675), -(23687), -(23693), -(23694), -(23695), -(23696), -(23699), -(23702), -(23735), -(23736), -(23737), -(23738), -(23765), -(23766), -(23767), -(23768), -(23769), -(23774), -(23775), -(23786), -(23848), -(23850), -(23853), -(23859), -(23860), -(23862), -(23865), -(23881), -(23892), -(23893), -(23894), -(23895), -(23921), -(23922), -(23923), -(23924), -(23925), -(23947), -(23948), -(23952), -(23953), -(23958), -(23959), -(23960), -(23961), -(23962), -(23963), -(23964), -(23967), -(23970), -(23978), -(23979), -(24002), -(24003), -(24016), -(24017), -(24020), -(24023), -(24042), -(24049), -(24053), -(24061), -(24064), -(24097), -(24109), -(24111), -(24131), -(24132), -(24133), -(24134), -(24135), -(24178), -(24179), -(24185), -(24187), -(24193), -(24199), -(24201), -(24208), -(24210), -(24212), -(24213), -(24238), -(24239), -(24241), -(24248), -(24251), -(24253), -(24254), -(24257), -(24259), -(24261), -(24267), -(24274), -(24275), -(24300), -(24306), -(24314), -(24315), -(24316), -(24317), -(24327), -(24331), -(24332), -(24333), -(24335), -(24336), -(24337), -(24339), -(24341), -(24374), -(24378), -(24379), -(24388), -(24393), -(24394), -(24407), -(24408), -(24412), -(24413), -(24414), -(24423), -(24435), -(24458), -(24466), -(24530), -(24573), -(24577), -(24578), -(24579), -(24583), -(24585), -(24586), -(24587), -(24596), -(24600), -(24601), -(24611), -(24617), -(24618), -(24619), -(24637), -(24640), -(24648), -(24649), -(24668), -(24671), -(24672), -(24674), -(24680), -(24684), -(24685), -(24686), -(24690), -(24705), -(24708), -(24709), -(24710), -(24711), -(24712), -(24713), -(24714), -(24715), -(24723), -(24725), -(24726), -(24727), -(24730), -(24732), -(24735), -(24736), -(24740), -(24742), -(24745), -(24747), -(24750), -(24751), -(24752), -(24753), -(24755), -(24757), -(24759), -(24761), -(24762), -(24766), -(24767), -(24769), -(24771), -(24773), -(24776), -(24785), -(24787), -(24791), -(24792), -(24793), -(24802), -(24803), -(24816), -(24817), -(24819), -(24824), -(24825), -(24826), -(24829), -(24831), -(24832), -(24844), -(24857), -(24872), -(24873), -(24875), -(24923), -(24928), -(24935), -(24937), -(24942), -(24950), -(24951), -(24952), -(24953), -(24954), -(24955), -(24957), -(24960), -(24961), -(24962), -(24963), -(24964), -(24965), -(24966), -(24974), -(24975), -(24976), -(24977), -(24982), -(24993), -(25006), -(25008), -(25009), -(25010), -(25011), -(25012), -(25021), -(25022), -(25025), -(25028), -(25050), -(25051), -(25052), -(25054), -(25055), -(25058), -(25104), -(25139), -(25140), -(25143), -(25165), -(25174), -(25185), -(25187), -(25189), -(25190), -(25191), -(25208), -(25210), -(25212), -(25213), -(25217), -(25218), -(25221), -(25222), -(25225), -(25231), -(25233), -(25234), -(25235), -(25236), -(25241), -(25242), -(25245), -(25246), -(25248), -(25251), -(25258), -(25262), -(25263), -(25266), -(25269), -(25272), -(25273), -(25274), -(25275), -(25281), -(25282), -(25286), -(25288), -(25290), -(25291), -(25292), -(25294), -(25295), -(25297), -(25298), -(25299), -(25300), -(25302), -(25304), -(25306), -(25307), -(25308), -(25309), -(25311), -(25312), -(25314), -(25315), -(25316), -(25345), -(25349), -(25363), -(25364), -(25367), -(25368), -(25371), -(25372), -(25373), -(25375), -(25383), -(25384), -(25387), -(25389), -(25391), -(25396), -(25420), -(25424), -(25433), -(25439), -(25442), -(25448), -(25449), -(25454), -(25457), -(25462), -(25464), -(25465), -(25467), -(25471), -(25488), -(25497), -(25501), -(25504), -(25514), -(25515), -(25530), -(25531), -(25595), -(25602), -(25603), -(25605), -(25645), -(25646), -(25650), -(25651), -(25652), -(25668), -(25671), -(25673), -(25677), -(25678), -(25686), -(25710), -(25712), -(25721), -(25725), -(25742), -(25748), -(25755), -(25760), -(25761), -(25762), -(25771), -(25772), -(25777), -(25778), -(25779), -(25781), -(25788), -(25800), -(25802), -(25803), -(25806), -(25807), -(25808), -(25809), -(25810), -(25811), -(25816), -(25821), -(25838), -(25840), -(25843), -(25845), -(25847), -(25848), -(25852), -(25854), -(25856), -(25861), -(25902), -(25903), -(25911), -(25912), -(25913), -(25914), -(25947), -(25992), -(25995), -(25997), -(25999), -(26001), -(26004), -(26005), -(26006), -(26007), -(26008), -(26012), -(26013), -(26017), -(26035), -(26044), -(26050), -(26077), -(26078), -(26079), -(26081), -(26082), -(26090), -(26095), -(26097), -(26098), -(26100), -(26108), -(26125), -(26126), -(26134), -(26141), -(26143), -(26170), -(26181), -(26194), -(26195), -(26196), -(26197), -(26198), -(26206), -(26207), -(26211), -(26218), -(26226), -(26233), -(26258), -(26259), -(26275), -(26281), -(26282), -(26339), -(26350), -(26363), -(26364), -(26365), -(26366), -(26367), -(26368), -(26369), -(26370), -(26371), -(26372), -(26374), -(26375), -(26377), -(26406), -(26408), -(26409), -(26410), -(26412), -(26414), -(26415), -(26419), -(26446), -(26448), -(26470), -(26476), -(26548), -(26556), -(26561), -(26565), -(26572), -(26584), -(26601), -(26610), -(26613), -(26616), -(26622), -(26623), -(26624), -(26625), -(26636), -(26639), -(26641), -(26649), -(26654), -(26663), -(26679), -(26688), -(26693), -(26740), -(26742), -(26748), -(26791), -(26796), -(26799), -(26800), -(26839), -(26861), -(26862), -(26863), -(26864), -(26865), -(26866), -(26867), -(26884), -(26890), -(26899), -(26923), -(26924), -(26968), -(26978), -(26979), -(26980), -(26981), -(26982), -(26984), -(26985), -(26986), -(26987), -(26988), -(26989), -(26990), -(26992), -(26995), -(26996), -(27000), -(27001), -(27002), -(27003), -(27004), -(27005), -(27006), -(27007), -(27008), -(27010), -(27013), -(27014), -(27016), -(27019), -(27021), -(27024), -(27030), -(27031), -(27047), -(27048), -(27049), -(27050), -(27051), -(27060), -(27065), -(27067), -(27068), -(27069), -(27070), -(27071), -(27072), -(27073), -(27074), -(27075), -(27078), -(27079), -(27126), -(27132), -(27135), -(27136), -(27137), -(27138), -(27140), -(27142), -(27154), -(27174), -(27175), -(27176), -(27177), -(27180), -(27187), -(27189), -(27209), -(27210), -(27211), -(27215), -(27216), -(27217), -(27218), -(27219), -(27220), -(27223), -(27224), -(27228), -(27243), -(27254), -(27255), -(27258), -(27261), -(27263), -(27267), -(27270), -(27274), -(27275), -(27276), -(27277), -(27281), -(27286), -(27288), -(27290), -(27360), -(27375), -(27376), -(27378), -(27379), -(27380), -(27381), -(27384), -(27385), -(27386), -(27387), -(27389), -(27390), -(27391), -(27392), -(27393), -(27395), -(27396), -(27397), -(27398), -(27441), -(27448), -(27486), -(27526), -(27527), -(27532), -(27541), -(27547), -(27548), -(27549), -(27550), -(27552), -(27553), -(27554), -(27555), -(27556), -(27557), -(27559), -(27565), -(27567), -(27571), -(27572), -(27573), -(27576), -(27577), -(27580), -(27581), -(27582), -(27584), -(27605), -(27606), -(27608), -(27609), -(27611), -(27613), -(27615), -(27620), -(27624), -(27626), -(27632), -(27633), -(27634), -(27635), -(27636), -(27637), -(27638), -(27640), -(27648), -(27655), -(27662), -(27673), -(27677), -(27686), -(27752), -(27754), -(27755), -(27756), -(27760), -(27765), -(27794), -(27806), -(27814), -(27819), -(27841), -(27849), -(27852), -(27860), -(27861), -(27863), -(27864), -(27865), -(27868), -(27873), -(27874), -(27891), -(27907), -(27909), -(27910), -(27915), -(27919), -(27931), -(27937), -(27983), -(27991), -(27992), -(27994), -(27995), -(28030), -(28099), -(28133), -(28147), -(28149), -(28167), -(28169), -(28239), -(28251), -(28252), -(28253), -(28254), -(28255), -(28256), -(28257), -(28258), -(28259), -(28260), -(28261), -(28262), -(28263), -(28265), -(28271), -(28272), -(28276), -(28287), -(28293), -(28299), -(28301), -(28303), -(28306), -(28308), -(28310), -(28314), -(28318), -(28319), -(28320), -(28321), -(28329), -(28336), -(28337), -(28342), -(28350), -(28351), -(28375), -(28393), -(28394), -(28396), -(28397), -(28410), -(28412), -(28418), -(28419), -(28420), -(28428), -(28431), -(28434), -(28439), -(28444), -(28445), -(28467), -(28470), -(28478), -(28516), -(28522), -(28597), -(28601), -(28608), -(28614), -(28624), -(28674), -(28676), -(28678), -(28684), -(28685), -(28689), -(28690), -(28691), -(28692), -(28696), -(28698), -(28702), -(28715), -(28718), -(28720), -(28722), -(28723), -(28724), -(28734), -(28750), -(28772), -(28776), -(28783), -(28788), -(28790), -(28791), -(28793), -(28795), -(28810), -(28824), -(28825), -(28826), -(28827), -(28836), -(28839), -(28858), -(28859), -(28872), -(28873), -(28880), -(28882), -(28883), -(28887), -(28896), -(28899), -(28900), -(28901), -(28902), -(28913), -(28969), -(28993), -(29001), -(29002), -(29003), -(29006), -(29044), -(29054), -(29058), -(29060), -(29098), -(29117), -(29126), -(29127), -(29128), -(29129), -(29134), -(29135), -(29136), -(29137), -(29138), -(29139), -(29151), -(29155), -(29157), -(29158), -(29160), -(29164), -(29166), -(29168), -(29170), -(29175), -(29182), -(29185), -(29188), -(29194), -(29196), -(29198), -(29228), -(29290), -(29295), -(29300), -(29306), -(29314), -(29317), -(29319), -(29320), -(29341), -(29362), -(29364), -(29380), -(29386), -(29395), -(29405), -(29407), -(29408), -(29425), -(29426), -(29427), -(29428), -(29435), -(29436), -(29443), -(29473), -(29487), -(29492), -(29494), -(29495), -(29497), -(29500), -(29502), -(29515), -(29516), -(29519), -(29522), -(29528), -(29539), -(29540), -(29543), -(29544), -(29546), -(29555), -(29560), -(29561), -(29562), -(29563), -(29564), -(29567), -(29570), -(29572), -(29574), -(29575), -(29576), -(29577), -(29578), -(29580), -(29581), -(29582), -(29583), -(29585), -(29586), -(29587), -(29607), -(29609), -(29638), -(29639), -(29640), -(29641), -(29644), -(29646), -(29647), -(29652), -(29653), -(29655), -(29661), -(29665), -(29666), -(29667), -(29670), -(29673), -(29675), -(29676), -(29677), -(29679), -(29684), -(29690), -(29703), -(29704), -(29707), -(29711), -(29712), -(29716), -(29722), -(29765), -(29768), -(29815), -(29832), -(29845), -(29847), -(29848), -(29850), -(29879), -(29881), -(29896), -(29901), -(29903), -(29906), -(29907), -(29909), -(29915), -(29916), -(29917), -(29925), -(29926), -(29927), -(29928), -(29930), -(29953), -(29954), -(29955), -(29956), -(29964), -(29990), -(29991), -(30010), -(30013), -(30014), -(30016), -(30019), -(30022), -(30036), -(30039), -(30044), -(30050), -(30053), -(30055), -(30069), -(30070), -(30077), -(30081), -(30099), -(30100), -(30102), -(30103), -(30104), -(30105), -(30108), -(30112), -(30113), -(30115), -(30121), -(30127), -(30128), -(30130), -(30131), -(30151), -(30153), -(30164), -(30173), -(30175), -(30177), -(30178), -(30180), -(30194), -(30195), -(30197), -(30198), -(30202), -(30213), -(30218), -(30219), -(30223), -(30238), -(30253), -(30269), -(30270), -(30271), -(30280), -(30285), -(30324), -(30330), -(30335), -(30351), -(30353), -(30356), -(30357), -(30358), -(30383), -(30395), -(30400), -(30401), -(30402), -(30404), -(30405), -(30412), -(30421), -(30422), -(30423), -(30424), -(30430), -(30433), -(30435), -(30448), -(30449), -(30451), -(30455), -(30459), -(30463), -(30464), -(30465), -(30466), -(30467), -(30468), -(30471), -(30474), -(30478), -(30479), -(30481), -(30493), -(30495), -(30500), -(30501), -(30504), -(30505), -(30507), -(30512), -(30520), -(30528), -(30530), -(30545), -(30546), -(30601), -(30605), -(30606), -(30607), -(30608), -(30609), -(30614), -(30615), -(30619), -(30621), -(30637), -(30638), -(30639), -(30641), -(30643), -(30646), -(30647), -(30648), -(30651), -(30652), -(30653), -(30654), -(30661), -(30686), -(30687), -(30688), -(30689), -(30691), -(30695), -(30719), -(30736), -(30740), -(30751), -(30753), -(30755), -(30756), -(30768), -(30817), -(30822), -(30830), -(30832), -(30838), -(30839), -(30846), -(30849), -(30850), -(30854), -(30875), -(30876), -(30877), -(30878), -(30888), -(30889), -(30890), -(30900), -(30901), -(30909), -(30910), -(30923), -(30926), -(30932), -(30936), -(30937), -(30942), -(30943), -(30944), -(30945), -(30967), -(30971), -(30977), -(30980), -(30981), -(30984), -(30986), -(30989), -(30990), -(30992), -(31008), -(31009), -(31012), -(31015), -(31016), -(31018), -(31022), -(31041), -(31042), -(31043), -(31046), -(31069), -(31117), -(31125), -(31139), -(31249), -(31257), -(31262), -(31263), -(31270), -(31271), -(31272), -(31274), -(31275), -(31279), -(31280), -(31281), -(31282), -(31284), -(31286), -(31287), -(31288), -(31289), -(31290), -(31292), -(31295), -(31296), -(31305), -(31306), -(31312), -(31316), -(31319), -(31330), -(31334), -(31337), -(31339), -(31345), -(31366), -(31367), -(31368), -(31376), -(31378), -(31381), -(31387), -(31389), -(31390), -(31394), -(31397), -(31399), -(31400), -(31401), -(31402), -(31404), -(31405), -(31406), -(31407), -(31410), -(31415), -(31416), -(31417), -(31418), -(31419), -(31420), -(31423), -(31425), -(31426), -(31427), -(31436), -(31445), -(31446), -(31457), -(31464), -(31477), -(31481), -(31486), -(31513), -(31516), -(31535), -(31547), -(31551), -(31552), -(31553), -(31566), -(31589), -(31595), -(31596), -(31600), -(31601), -(31602), -(31604), -(31609), -(31610), -(31618), -(31620), -(31622), -(31623), -(31626), -(31627), -(31629), -(31651), -(31662), -(31664), -(31703), -(31705), -(31707), -(31709), -(31713), -(31715), -(31717), -(31718), -(31721), -(31724), -(31729), -(31733), -(31734), -(31739), -(31740), -(31741), -(31742), -(31743), -(31747), -(31751), -(31754), -(31758), -(31759), -(31764), -(31766), -(31772), -(31779), -(31782), -(31784), -(31789), -(31790), -(31803), -(31804), -(31807), -(31808), -(31810), -(31811), -(31812), -(31813), -(31814), -(31815), -(31816), -(31819), -(31827), -(31843), -(31863), -(31864), -(31865), -(31893), -(31898), -(31907), -(31911), -(31916), -(31923), -(31935), -(31939), -(31942), -(31946), -(31948), -(31955), -(31956), -(31961), -(31965), -(31966), -(31971), -(31972), -(31973), -(31975), -(31976), -(31977), -(31978), -(31984), -(31988), -(31994), -(31996), -(31999), -(32000), -(32001), -(32002), -(32004), -(32005), -(32006), -(32009), -(32010), -(32011), -(32012), -(32013), -(32015), -(32017), -(32018), -(32019), -(32020), -(32021), -(32022), -(32024), -(32025), -(32026), -(32039), -(32049), -(32055), -(32056), -(32063), -(32065), -(32071), -(32076), -(32077), -(32080), -(32082), -(32092), -(32093), -(32094), -(32095), -(32103), -(32104), -(32105), -(32110), -(32120), -(32125), -(32126), -(32129), -(32131), -(32132), -(32133), -(32139), -(32154), -(32168), -(32175), -(32176), -(32190), -(32197), -(32202), -(32211), -(32224), -(32231), -(32247), -(32248), -(32261), -(32268), -(32270), -(32300), -(32306), -(32315), -(32317), -(32319), -(32320), -(32321), -(32323), -(32325), -(32328), -(32329), -(32330), -(32337), -(32338), -(32346), -(32361), -(32363), -(32364), -(32369), -(32370), -(32376), -(32378), -(32379), -(32386), -(32388), -(32389), -(32390), -(32391), -(32405), -(32414), -(32415), -(32416), -(32417), -(32418), -(32422), -(32428), -(32430), -(32431), -(32441), -(32445), -(32474), -(32491), -(32546), -(32550), -(32578), -(32583), -(32588), -(32593), -(32594), -(32595), -(32605), -(32606), -(32639), -(32643), -(32645), -(32652), -(32654), -(32666), -(32674), -(32675), -(32677), -(32678), -(32679), -(32682), -(32683), -(32684), -(32689), -(32690), -(32691), -(32693), -(32699), -(32700), -(32707), -(32709), -(32716), -(32721), -(32733), -(32734), -(32735), -(32736), -(32738), -(32739), -(32740), -(32741), -(32742), -(32747), -(32748), -(32749), -(32751), -(32752), -(32759), -(32769), -(32770), -(32771), -(32772), -(32774), -(32778), -(32779), -(32784), -(32797), -(32829), -(32830), -(32831), -(32835), -(32846), -(32858), -(32860), -(32862), -(32863), -(32864), -(32889), -(32897), -(32901), -(32902), -(32903), -(32904), -(32905), -(32906), -(32907), -(32908), -(32909), -(32913), -(32915), -(32916), -(32917), -(32919), -(32921), -(32922), -(32924), -(32926), -(32935), -(32940), -(32950), -(32959), -(32960), -(32962), -(32967), -(32969), -(32971), -(32984), -(32996), -(33031), -(33040), -(33044), -(33045), -(33047), -(33049), -(33051), -(33055), -(33056), -(33068), -(33069), -(33072), -(33073), -(33074), -(33077), -(33078), -(33079), -(33080), -(33081), -(33082), -(33086), -(33096), -(33098), -(33126), -(33129), -(33130), -(33144), -(33173), -(33175), -(33196), -(33197), -(33198), -(33206), -(33227), -(33230), -(33246), -(33247), -(33324), -(33326), -(33331), -(33335), -(33346), -(33360), -(33382), -(33383), -(33385), -(33387), -(33389), -(33392), -(33401), -(33404), -(33417), -(33419), -(33462), -(33463), -(33480), -(33482), -(33483), -(33487), -(33493), -(33502), -(33526), -(33527), -(33528), -(33529), -(33534), -(33535), -(33542), -(33552), -(33553), -(33554), -(33619), -(33620), -(33625), -(33626), -(33628), -(33631), -(33632), -(33640), -(33641), -(33643), -(33659), -(33661), -(33665), -(33684), -(33688), -(33689), -(33698), -(33699), -(33700), -(33709), -(33723), -(33728), -(33731), -(33745), -(33750), -(33763), -(33768), -(33781), -(33786), -(33787), -(33789), -(33792), -(33793), -(33794), -(33813), -(33824), -(33825), -(33827), -(33832), -(33833), -(33837), -(33844), -(33849), -(33850), -(33865), -(33871), -(33876), -(33878), -(33899), -(33907), -(33910), -(33911), -(33912), -(33913), -(33914), -(33925), -(33938), -(33947), -(33951), -(33960), -(33964), -(33969), -(33970), -(33975), -(33982), -(33983), -(33985), -(33986), -(33987), -(33988), -(33989), -(34014), -(34020), -(34025), -(34036), -(34071), -(34073), -(34083), -(34087), -(34088), -(34089), -(34092), -(34093), -(34095), -(34097), -(34099), -(34107), -(34108), -(34110), -(34112), -(34113), -(34120), -(34130), -(34132), -(34135), -(34138), -(34139), -(34143), -(34149), -(34150), -(34163), -(34171), -(34172), -(34176), -(34177), -(34213), -(34214), -(34215), -(34216), -(34217), -(34218), -(34219), -(34232), -(34243), -(34259), -(34298), -(34344), -(34345), -(34346), -(34347), -(34348), -(34351), -(34352), -(34353), -(34354), -(34357), -(34361), -(34363), -(34366), -(34370), -(34379), -(34389), -(34390), -(34391), -(34394), -(34400), -(34411), -(34412), -(34413), -(34414), -(34415), -(34416), -(34417), -(34418), -(34419), -(34423), -(34425), -(34428), -(34432), -(34437), -(34438), -(34439), -(34445), -(34446), -(34447), -(34451), -(34463), -(34490), -(34510), -(34520), -(34578), -(34580), -(34587), -(34613), -(34614), -(34615), -(34616), -(34618), -(34620), -(34625), -(34626), -(34629), -(34637), -(34639), -(34640), -(34641), -(34643), -(34644), -(34645), -(34650), -(34653), -(34654), -(34655), -(34661), -(34665), -(34672), -(34694), -(34695), -(34696), -(34697), -(34709), -(34714), -(34715), -(34719), -(34722), -(34745), -(34752), -(34784), -(34786), -(34787), -(34788), -(34789), -(34793), -(34794), -(34797), -(34798), -(34799), -(34800), -(34802), -(34809), -(34811), -(34812), -(34820), -(34824), -(34828), -(34829), -(34841), -(34852), -(34856), -(34875), -(34879), -(34881), -(34883), -(34886), -(34889), -(34891), -(34893), -(34906), -(34907), -(34913), -(34914), -(34916), -(34917), -(34920), -(34922), -(34924), -(34925), -(34930), -(34931), -(34940), -(34941), -(34942), -(34945), -(34969), -(34974), -(34975), -(34976), -(34984), -(34996), -(35004), -(35010), -(35011), -(35012), -(35013), -(35033), -(35034), -(35039), -(35047), -(35049), -(35054), -(35055), -(35056), -(35062), -(35065), -(35066), -(35067), -(35069), -(35071), -(35072), -(35088), -(35089), -(35092), -(35096), -(35101), -(35105), -(35106), -(35107), -(35112), -(35115), -(35117), -(35120), -(35144), -(35147), -(35161), -(35178), -(35179), -(35180), -(35182), -(35183), -(35185), -(35189), -(35195), -(35201), -(35207), -(35229), -(35231), -(35234), -(35238), -(35243), -(35244), -(35263), -(35267), -(35273), -(35280), -(35290), -(35291), -(35292), -(35293), -(35294), -(35295), -(35313), -(35314), -(35316), -(35317), -(35318), -(35321), -(35323), -(35325), -(35326), -(35328), -(35329), -(35331), -(35332), -(35333), -(35334), -(35335), -(35339), -(35346), -(35353), -(35371), -(35376), -(35377), -(35382), -(35387), -(35389), -(35392), -(35395), -(35401), -(35410), -(35412), -(35424), -(35460), -(35466), -(35472), -(35473), -(35493), -(35499), -(35501), -(35506), -(35507), -(35510), -(35511), -(35514), -(35518), -(35519), -(35556), -(35570), -(35621), -(35686), -(35718), -(35727), -(35728), -(35735), -(35741), -(35742), -(35748), -(35759), -(35760), -(35771), -(35772), -(35780), -(35783), -(35839), -(35846), -(35851), -(35853), -(35857), -(35871), -(35873), -(35877), -(35913), -(35914), -(35916), -(35918), -(35919), -(35920), -(35927), -(35928), -(35932), -(35944), -(35945), -(35946), -(35949), -(35954), -(35955), -(35963), -(35964), -(35965), -(35966), -(35967), -(35968), -(35969), -(35970), -(35971), -(35972), -(35973), -(35974), -(35975), -(35976), -(35977), -(35978), -(35979), -(35980), -(35981), -(35982), -(35983), -(35984), -(35985), -(35986), -(35987), -(35988), -(35989), -(35990), -(35997), -(35998), -(35999), -(36002), -(36020), -(36021), -(36023), -(36025), -(36033), -(36052), -(36054), -(36073), -(36088), -(36093), -(36094), -(36095), -(36099), -(36100), -(36102), -(36115), -(36123), -(36138), -(36140), -(36141), -(36145), -(36152), -(36153), -(36170), -(36173), -(36176), -(36181), -(36207), -(36208), -(36224), -(36227), -(36228), -(36237), -(36238), -(36246), -(36247), -(36250), -(36276), -(36277), -(36279), -(36288), -(36295), -(36296), -(36299), -(36310), -(36312), -(36314), -(36328), -(36332), -(36333), -(36339), -(36340), -(36341), -(36342), -(36343), -(36344), -(36345), -(36348), -(36380), -(36398), -(36399), -(36401), -(36402), -(36404), -(36414), -(36415), -(36416), -(36417), -(36433), -(36434), -(36435), -(36436), -(36438), -(36439), -(36441), -(36447), -(36448), -(36457), -(36458), -(36461), -(36464), -(36469), -(36470), -(36475), -(36478), -(36482), -(36483), -(36488), -(36500), -(36507), -(36508), -(36509), -(36516), -(36517), -(36518), -(36527), -(36534), -(36536), -(36538), -(36539), -(36540), -(36541), -(36554), -(36558), -(36570), -(36571), -(36578), -(36586), -(36590), -(36594), -(36601), -(36604), -(36606), -(36608), -(36609), -(36612), -(36622), -(36623), -(36624), -(36625), -(36627), -(36628), -(36632), -(36638), -(36641), -(36642), -(36645), -(36646), -(36647), -(36650), -(36655), -(36656), -(36659), -(36664), -(36671), -(36677), -(36678), -(36679), -(36710), -(36711), -(36712), -(36713), -(36714), -(36732), -(36739), -(36778), -(36779), -(36780), -(36781), -(36787), -(36789), -(36791), -(36796), -(36801), -(36805), -(36806), -(36807), -(36810), -(36812), -(36814), -(36822), -(36825), -(36831), -(36832), -(36833), -(36836), -(36838), -(36839), -(36840), -(36841), -(36842), -(36843), -(36844), -(36863), -(36864), -(36866), -(36872), -(36876), -(36877), -(36886), -(36891), -(36894), -(36905), -(36906), -(36909), -(36913), -(36914), -(36916), -(36917), -(36919), -(36920), -(36921), -(36924), -(36927), -(36929), -(36947), -(36956), -(36957), -(36965), -(36966), -(36971), -(36972), -(36974), -(36979), -(36980), -(36983), -(36984), -(36986), -(36987), -(36988), -(36990), -(36991), -(37027), -(37028), -(37030), -(37031), -(37054), -(37057), -(37067), -(37073), -(37074), -(37082), -(37089), -(37104), -(37110), -(37111), -(37112), -(37113), -(37121), -(37122), -(37123), -(37126), -(37132), -(37133), -(37136), -(37138), -(37154), -(37156), -(37162), -(37176), -(37208), -(37216), -(37221), -(37249), -(37250), -(37251), -(37252), -(37254), -(37255), -(37257), -(37259), -(37260), -(37271), -(37272), -(37273), -(37274), -(37275), -(37276), -(37277), -(37320), -(37321), -(37322), -(37323), -(37328), -(37329), -(37330), -(37331), -(37332), -(37334), -(37335), -(37359), -(37361), -(37369), -(37372), -(37387), -(37389), -(37412), -(37417), -(37421), -(37450), -(37455), -(37456), -(37460), -(37462), -(37463), -(37470), -(37479), -(37486), -(37500), -(37506), -(37511), -(37527), -(37532), -(37537), -(37540), -(37548), -(37551), -(37552), -(37554), -(37563), -(37566), -(37572), -(37577), -(37578), -(37579), -(37580), -(37581), -(37589), -(37591), -(37592), -(37596), -(37597), -(37599), -(37602), -(37621), -(37628), -(37629), -(37630), -(37632), -(37634), -(37646), -(37647), -(37654), -(37661), -(37662), -(37664), -(37667), -(37668), -(37675), -(37681), -(37685), -(37695), -(37700), -(37711), -(37717), -(37718), -(37719), -(37727), -(37749), -(37770), -(37777), -(37778), -(37798), -(37800), -(37801), -(37802), -(37803), -(37804), -(37805), -(37806), -(37807), -(37808), -(37809), -(37810), -(37811), -(37813), -(37823), -(37834), -(37838), -(37839), -(37840), -(37841), -(37847), -(37850), -(37851), -(37856), -(37862), -(37865), -(37867), -(37871), -(37892), -(37894), -(37906), -(37908), -(37910), -(37921), -(37922), -(37930), -(37933), -(37937), -(37940), -(37945), -(37946), -(37950), -(37956), -(37958), -(37962), -(37965), -(37967), -(37968), -(37972), -(37973), -(37974), -(37975), -(37978), -(37979), -(37986), -(37988), -(37992), -(37998), -(38002), -(38007), -(38009), -(38010), -(38023), -(38024), -(38025), -(38027), -(38029), -(38030), -(38032), -(38034), -(38035), -(38047), -(38048), -(38051), -(38052), -(38053), -(38056), -(38058), -(38059), -(38063), -(38065), -(38066), -(38067), -(38074), -(38075), -(38076), -(38078), -(38083), -(38084), -(38085), -(38093), -(38094), -(38095), -(38107), -(38109), -(38113), -(38120), -(38122), -(38125), -(38127), -(38129), -(38133), -(38134), -(38135), -(38136), -(38145), -(38146), -(38147), -(38148), -(38149), -(38153), -(38154), -(38155), -(38167), -(38177), -(38178), -(38182), -(38183), -(38187), -(38193), -(38203), -(38204), -(38205), -(38208), -(38209), -(38210), -(38213), -(38223), -(38226), -(38233), -(38234), -(38238), -(38239), -(38240), -(38243), -(38245), -(38246), -(38252), -(38253), -(38254), -(38259), -(38260), -(38262), -(38263), -(38264), -(38265), -(38267), -(38274), -(38275), -(38276), -(38277), -(38279), -(38280), -(38285), -(38295), -(38310), -(38313), -(38324), -(38328), -(38329), -(38330), -(38333), -(38338), -(38340), -(38342), -(38344), -(38363), -(38366), -(38370), -(38372), -(38374), -(38377), -(38378), -(38383), -(38386), -(38387), -(38391), -(38400), -(38401), -(38441), -(38446), -(38461), -(38465), -(38470), -(38474), -(38495), -(38496), -(38505), -(38509), -(38510), -(38520), -(38523), -(38526), -(38534), -(38535), -(38538), -(38543), -(38554), -(38556), -(38557), -(38558), -(38559), -(38560), -(38561), -(38562), -(38563), -(38564), -(38565), -(38566), -(38567), -(38568), -(38569), -(38570), -(38572), -(38580), -(38582), -(38584), -(38585), -(38586), -(38588), -(38591), -(38595), -(38598), -(38606), -(38616), -(38617), -(38621), -(38625), -(38626), -(38628), -(38630), -(38631), -(38634), -(38636), -(38641), -(38643), -(38645), -(38657), -(38658), -(38661), -(38663), -(38669), -(38692), -(38697), -(38699), -(38704), -(38708), -(38721), -(38723), -(38731), -(38739), -(38742), -(38753), -(38760), -(38762), -(38764), -(38765), -(38767), -(38768), -(38770), -(38772), -(38775), -(38777), -(38791), -(38797), -(38798), -(38801), -(38804), -(38806), -(38807), -(38808), -(38815), -(38816), -(38817), -(38821), -(38822), -(38823), -(38824), -(38825), -(38826), -(38827), -(38846), -(38848), -(38849), -(38851), -(38852), -(38858), -(38859), -(38861), -(38863), -(38864), -(38875), -(38879), -(38880), -(38881), -(38882), -(38883), -(38884), -(38887), -(38894), -(38895), -(38896), -(38897), -(38899), -(38904), -(38907), -(38909), -(38913), -(38914), -(38915), -(38918), -(38919), -(38921), -(38923), -(38926), -(38930), -(38935), -(38940), -(38941), -(38942), -(38943), -(38945), -(38946), -(38950), -(38952), -(38959), -(38967), -(38971), -(38985), -(38986), -(38987), -(38988), -(38989), -(38990), -(38992), -(38995), -(39000), -(39002), -(39006), -(39009), -(39015), -(39016), -(39017), -(39019), -(39020), -(39021), -(39022), -(39023), -(39025), -(39026), -(39029), -(39032), -(39039), -(39044), -(39046), -(39047), -(39053), -(39054), -(39058), -(39060), -(39061), -(39062), -(39064), -(39065), -(39066), -(39068), -(39069), -(39070), -(39076), -(39077), -(39078), -(39079), -(39083), -(39087), -(39097), -(39098), -(39099), -(39101), -(39116), -(39119), -(39120), -(39121), -(39122), -(39123), -(39125), -(39129), -(39135), -(39136), -(39145), -(39153), -(39157), -(39159), -(39160), -(39164), -(39165), -(39171), -(39172), -(39174), -(39176), -(39182), -(39192), -(39196), -(39197), -(39198), -(39202), -(39204), -(39207), -(39210), -(39212), -(39214), -(39215), -(39226), -(39229), -(39230), -(39252), -(39258), -(39262), -(39267), -(39268), -(39270), -(39271), -(39285), -(39293), -(39297), -(39299), -(39309), -(39322), -(39328), -(39329), -(39332), -(39337), -(39339), -(39349), -(39367), -(39371), -(39378), -(39386), -(39396), -(39412), -(39413), -(39415), -(39419), -(39435), -(39436), -(39445), -(39449), -(39456), -(39457), -(39460), -(39474), -(39475), -(39476), -(39477), -(39512), -(39513), -(39528), -(39529), -(39544), -(39560), -(39566), -(39574), -(39582), -(39587), -(39590), -(39592), -(39595), -(39600), -(39609), -(39621), -(39622), -(39661), -(39665), -(39668), -(39669), -(39670), -(39674), -(39675), -(39676), -(39697), -(39703), -(39794), -(39796), -(39810), -(39812), -(39826), -(39830), -(39835), -(39837), -(39838), -(39857), -(39865), -(39883), -(39886), -(39901), -(39904), -(39908), -(39920), -(39928), -(39945), -(39948), -(39955), -(39956), -(39967), -(39972), -(39979), -(39980), -(39995), -(39996), -(40011), -(40019), -(40032), -(40041), -(40055), -(40057), -(40063), -(40066), -(40071), -(40074), -(40081), -(40084), -(40086), -(40097), -(40099), -(40102), -(40109), -(40119), -(40123), -(40124), -(40146), -(40157), -(40165), -(40166), -(40167), -(40173), -(40185), -(40191), -(40193), -(40197), -(40198), -(40199), -(40220), -(40225), -(40227), -(40228), -(40239), -(40248), -(40251), -(40254), -(40259), -(40279), -(40290), -(40293), -(40303), -(40310), -(40311), -(40312), -(40313), -(40317), -(40321), -(40322), -(40325), -(40327), -(40334), -(40337), -(40339), -(40344), -(40346), -(40347), -(40348), -(40351), -(40356), -(40357), -(40358), -(40363), -(40366), -(40367), -(40368), -(40384), -(40385), -(40392), -(40400), -(40406), -(40411), -(40412), -(40413), -(40414), -(40415), -(40416), -(40420), -(40423), -(40427), -(40429), -(40430), -(40431), -(40434), -(40449), -(40450), -(40471), -(40472), -(40481), -(40486), -(40489), -(40491), -(40493), -(40497), -(40504), -(40505), -(40507), -(40508), -(40509), -(40525), -(40536), -(40542), -(40554), -(40560), -(40563), -(40564), -(40565), -(40569), -(40571), -(40581), -(40585), -(40595), -(40597), -(40602), -(40604), -(40605), -(40608), -(40616), -(40620), -(40633), -(40635), -(40639), -(40641), -(40643), -(40645), -(40646), -(40651), -(40652), -(40671), -(40672), -(40685), -(40726), -(40728), -(40736), -(40739), -(40740), -(40742), -(40751), -(40758), -(40770), -(40772), -(40777), -(40778), -(40787), -(40796), -(40801), -(40810), -(40814), -(40822), -(40827), -(40835), -(40837), -(40838), -(40842), -(40843), -(40844), -(40846), -(40856), -(40859), -(40860), -(40861), -(40864), -(40872), -(40873), -(40876), -(40877), -(40881), -(40886), -(40888), -(40890), -(40892), -(40893), -(40894), -(40895), -(40901), -(40903), -(40906), -(40909), -(40917), -(40926), -(40928), -(40930), -(40935), -(40945), -(40951), -(40954), -(40958), -(40964), -(40965), -(40968), -(40969), -(40970), -(40972), -(40976), -(40991), -(41001), -(41003), -(41028), -(41029), -(41032), -(41035), -(41044), -(41047), -(41050), -(41052), -(41054), -(41055), -(41060), -(41063), -(41065), -(41069), -(41070), -(41072), -(41075), -(41080), -(41082), -(41083), -(41084), -(41092), -(41093), -(41103), -(41109), -(41115), -(41116), -(41121), -(41137), -(41139), -(41152), -(41169), -(41170), -(41171), -(41177), -(41178), -(41179), -(41180), -(41182), -(41183), -(41184), -(41186), -(41187), -(41188), -(41189), -(41190), -(41192), -(41197), -(41198), -(41213), -(41214), -(41225), -(41226), -(41227), -(41228), -(41229), -(41230), -(41231), -(41238), -(41241), -(41247), -(41250), -(41255), -(41256), -(41259), -(41264), -(41265), -(41270), -(41272), -(41278), -(41279), -(41280), -(41281), -(41283), -(41291), -(41299), -(41302), -(41332), -(41334), -(41335), -(41336), -(41338), -(41345), -(41346), -(41351), -(41352), -(41353), -(41355), -(41360), -(41363), -(41368), -(41370), -(41372), -(41373), -(41374), -(41375), -(41377), -(41378), -(41383), -(41384), -(41388), -(41389), -(41390), -(41392), -(41394), -(41395), -(41396), -(41407), -(41410), -(41411), -(41419), -(41421), -(41426), -(41439), -(41440), -(41442), -(41448), -(41450), -(41451), -(41456), -(41461), -(41467), -(41468), -(41470), -(41471), -(41472), -(41473), -(41483), -(41484), -(41485), -(41486), -(41487), -(41489), -(41490), -(41491), -(41492), -(41519), -(41526), -(41528), -(41533), -(41540), -(41543), -(41544), -(41546), -(41547), -(41548), -(41549), -(41558), -(41559), -(41563), -(41564), -(41565), -(41567), -(41568), -(41571), -(41578), -(41579), -(41580), -(41581), -(41586), -(41588), -(41592), -(41596), -(41597), -(41598), -(41601), -(41621), -(41622), -(41625), -(41626), -(41633), -(41637), -(41911), -(41914), -(41916), -(41917), -(41926), -(41931), -(41932), -(41933), -(41936), -(41937), -(41939), -(41940), -(41957), -(41958), -(41959), -(41960), -(41961), -(41964), -(41965), -(41978), -(41980), -(41984), -(41985), -(41990), -(42002), -(42003), -(42013), -(42018), -(42020), -(42021), -(42024), -(42025), -(42053), -(42058), -(42129), -(42131), -(42132), -(42133), -(42139), -(42142), -(42144), -(42149), -(42150), -(42152), -(42161), -(42165), -(42169), -(42185), -(42203), -(42246), -(42299), -(42313), -(42315), -(42319), -(42320), -(42322), -(42324), -(42325), -(42326), -(42328), -(42329), -(42330), -(42331), -(42332), -(42333), -(42337), -(42349), -(42360), -(42363), -(42368), -(42369), -(42370), -(42371), -(42372), -(42380), -(42382), -(42383), -(42384), -(42385), -(42389), -(42395), -(42396), -(42397), -(42399), -(42400), -(42401), -(42402), -(42411), -(42414), -(42426), -(42434), -(42435), -(42441), -(42443), -(42447), -(42455), -(42463), -(42476), -(42483), -(42485), -(42486), -(42488), -(42489), -(42502), -(42512), -(42514), -(42516), -(42518), -(42535), -(42537), -(42540), -(42560), -(42561), -(42574), -(42579), -(42580), -(42583), -(42587), -(42611), -(42628), -(42632), -(42633), -(42634), -(42635), -(42653), -(42658), -(42670), -(42671), -(42672), -(42696), -(42702), -(42710), -(42711), -(42717), -(42719), -(42721), -(42724), -(42725), -(42730), -(42733), -(42739), -(42740), -(42741), -(42746), -(42747), -(42756), -(42762), -(42767), -(42772), -(42780), -(42781), -(42782), -(42783), -(42785), -(42789), -(42790), -(42791), -(42793), -(42799), -(42802), -(42803), -(42804), -(42811), -(42826), -(42832), -(42833), -(42834), -(42841), -(42842), -(42843), -(42846), -(42853), -(42858), -(42859), -(42867), -(42869), -(42870), -(42872), -(42873), -(42878), -(42879), -(42880), -(42889), -(42890), -(42891), -(42894), -(42895), -(42896), -(42897), -(42902), -(42903), -(42904), -(42907), -(42908), -(42913), -(42914), -(42953), -(42964), -(42972), -(42978), -(42995), -(42999), -(43003), -(43004), -(43006), -(43036), -(43037), -(43043), -(43044), -(43058), -(43061), -(43063), -(43064), -(43065), -(43067), -(43075), -(43077), -(43083), -(43084), -(43086), -(43087), -(43090), -(43093), -(43094), -(43097), -(43100), -(43103), -(43104), -(43107), -(43108), -(43122), -(43123), -(43125), -(43128), -(43130), -(43131), -(43132), -(43133), -(43137), -(43138), -(43140), -(43150), -(43151), -(43153), -(43156), -(43157), -(43159), -(43178), -(43187), -(43191), -(43192), -(43193), -(43194), -(43195), -(43196), -(43197), -(43198), -(43199), -(43202), -(43205), -(43206), -(43225), -(43228), -(43235), -(43243), -(43245), -(43246), -(43256), -(43259), -(43260), -(43261), -(43262), -(43267), -(43268), -(43270), -(43273), -(43286), -(43287), -(43288), -(43292), -(43297), -(43298), -(43299), -(43300), -(43301), -(43303), -(43305), -(43309), -(43315), -(43325), -(43330), -(43334), -(43337), -(43340), -(43341), -(43345), -(43346), -(43347), -(43348), -(43352), -(43353), -(43354), -(43356), -(43357), -(43358), -(43359), -(43361), -(43362), -(43364), -(43365), -(43368), -(43370), -(43379), -(43380), -(43381), -(43384), -(43393), -(43398), -(43399), -(43409), -(43410), -(43411), -(43413), -(43415), -(43416), -(43417), -(43419), -(43427), -(43428), -(43433), -(43435), -(43439), -(43441), -(43445), -(43451), -(43456), -(43461), -(43469), -(43470), -(43471), -(43472), -(43473), -(43474), -(43475), -(43477), -(43483), -(43484), -(43488), -(43489), -(43492), -(43495), -(43496), -(43497), -(43501), -(43505), -(43507), -(43511), -(43512), -(43515), -(43516), -(43517), -(43518), -(43519), -(43520), -(43522), -(43523), -(43524), -(43525), -(43526), -(43528), -(43529), -(43532), -(43535), -(43543), -(43545), -(43553), -(43556), -(43560), -(43564), -(43565), -(43567), -(43569), -(43571), -(43572), -(43574), -(43575), -(43577), -(43578), -(43579), -(43581), -(43584), -(43585), -(43586), -(43591), -(43592), -(43593), -(43612), -(43613), -(43619), -(43621), -(43622), -(43644), -(43646), -(43648), -(43649), -(43650), -(43651), -(43660), -(43661), -(43663), -(43665), -(43666), -(43667), -(43671), -(43673), -(43680), -(43682), -(43683), -(43684), -(43690), -(43693), -(43695), -(43701), -(43709), -(43714), -(43715), -(43720), -(43726), -(43727), -(43728), -(43729), -(43732), -(43746), -(43767), -(43769), -(43785), -(43786), -(43789), -(43794), -(43795), -(43799), -(43804), -(43807), -(43809), -(43821), -(43834), -(43869), -(43895), -(43903), -(43906), -(43923), -(43928), -(43931), -(43932), -(43933), -(43937), -(43941), -(43948), -(43951), -(43952), -(43969), -(43971), -(43974), -(43976), -(43984), -(43988), -(43993), -(43996), -(43997), -(44000), -(44005), -(44008), -(44015), -(44016), -(44030), -(44031), -(44038), -(44053), -(44078), -(44079), -(44081), -(44082), -(44089), -(44093), -(44095), -(44120), -(44121), -(44126), -(44127), -(44137), -(44138), -(44139), -(44141), -(44142), -(44144), -(44148), -(44149), -(44152), -(44156), -(44159), -(44164), -(44165), -(44168), -(44169), -(44170), -(44171), -(44173), -(44174), -(44176), -(44181), -(44185), -(44188), -(44189), -(44202), -(44211), -(44212), -(44216), -(44219), -(44220), -(44221), -(44222), -(44223), -(44237), -(44241), -(44242), -(44247), -(44248), -(44256), -(44258), -(44262), -(44267), -(44268), -(44271), -(44274), -(44280), -(44285), -(44286), -(44289), -(44294), -(44304), -(44308), -(44310), -(44318), -(44319), -(44323), -(44325), -(44327), -(44328), -(44332), -(44339), -(44351), -(44357), -(44358), -(44361), -(44364), -(44368), -(44370), -(44382), -(44407), -(44408), -(44415), -(44424), -(44425), -(44429), -(44430), -(44454), -(44455), -(44457), -(44464), -(44473), -(44477), -(44478), -(44479), -(44481), -(44482), -(44503), -(44504), -(44512), -(44518), -(44519), -(44525), -(44530), -(44532), -(44533), -(44534), -(44536), -(44541), -(44542), -(44547), -(44553), -(44563), -(44564), -(44572), -(44577), -(44583), -(44586), -(44600), -(44602), -(44606), -(44614), -(44617), -(44618), -(44619), -(44620), -(44622), -(44639), -(44640), -(44641), -(44642), -(44654), -(44657), -(44658), -(44685), -(44732), -(44753), -(44755), -(44765), -(44780), -(44781), -(44787), -(44788), -(44789), -(44790), -(44791), -(44796), -(44808), -(44811), -(44812), -(44813), -(44817), -(44818), -(44823), -(44843), -(44848), -(44868), -(44871), -(44872), -(44876), -(44881), -(44934), -(44937), -(44945), -(44956), -(44957), -(44961), -(44966), -(44985), -(44997), -(45012), -(45017), -(45023), -(45026), -(45029), -(45031), -(45036), -(45055), -(45064), -(45071), -(45075), -(45088), -(45089), -(45090), -(45096), -(45101), -(45102), -(45105), -(45108), -(45110), -(45113), -(45123), -(45124), -(45129), -(45130), -(45133), -(45134), -(45141), -(45145), -(45185), -(45189), -(45192), -(45195), -(45197), -(45199), -(45200), -(45204), -(45205), -(45206), -(45209), -(45214), -(45215), -(45221), -(45228), -(45235), -(45251), -(45256), -(45269), -(45271), -(45274), -(45276), -(45280), -(45284), -(45286), -(45287), -(45288), -(45289), -(45290), -(45291), -(45292), -(45293), -(45294), -(45295), -(45296), -(45297), -(45298), -(45299), -(45300), -(45301), -(45302), -(45314), -(45321), -(45324), -(45327), -(45328), -(45334), -(45337), -(45344), -(45350), -(45352), -(45353), -(45356), -(45362), -(45409), -(45417), -(45419), -(45420), -(45421), -(45425), -(45428), -(45429), -(45430), -(45442), -(45444), -(45447), -(45456), -(45458), -(45462), -(45463), -(45468), -(45469), -(45472), -(45476), -(45477), -(45485), -(45487), -(45491), -(45493), -(45497), -(45504), -(45505), -(45507), -(45509), -(45511), -(45516), -(45524), -(45534), -(45537), -(45543), -(45544), -(45573), -(45576), -(45577), -(45578), -(45580), -(45587), -(45588), -(45589), -(45590), -(45600), -(45603), -(45604), -(45611), -(45625), -(45627), -(45628), -(45629), -(45632), -(45639), -(45645), -(45646), -(45647), -(45648), -(45649), -(45650), -(45659), -(45660), -(45661), -(45664), -(45693), -(45696), -(45716), -(45717), -(45719), -(45724), -(45725), -(45730), -(45739), -(45742), -(45744), -(45748), -(45773), -(45777), -(45778), -(45798), -(45799), -(45800), -(45803), -(45804), -(45815), -(45820), -(45833), -(45837), -(45854), -(45866), -(45873), -(45874), -(45875), -(45889), -(45897), -(45898), -(45899), -(45900), -(45902), -(45906), -(45913), -(45919), -(45924), -(45926), -(45931), -(45940), -(45943), -(45946), -(45947), -(45964), -(45967), -(45975), -(45980), -(45981), -(45983), -(45989), -(45992), -(46010), -(46012), -(46014), -(46015), -(46016), -(46023), -(46027), -(46028), -(46029), -(46031), -(46032), -(46033), -(46035), -(46042), -(46043), -(46044), -(46045), -(46047), -(46049), -(46057), -(46062), -(46065), -(46067), -(46070), -(46074), -(46080), -(46081), -(46083), -(46084), -(46092), -(46093), -(46098), -(46099), -(46101), -(46104), -(46119), -(46145), -(46152), -(46153), -(46155), -(46161), -(46164), -(46166), -(46167), -(46180), -(46181), -(46182), -(46183), -(46187), -(46188), -(46189), -(46190), -(46191), -(46192), -(46194), -(46198), -(46200), -(46202), -(46206), -(46221), -(46231), -(46232), -(46239), -(46260), -(46266), -(46276), -(46279), -(46280), -(46283), -(46285), -(46288), -(46291), -(46292), -(46305), -(46315), -(46323), -(46331), -(46333), -(46341), -(46357), -(46361), -(46362), -(46364), -(46365), -(46366), -(46368), -(46380), -(46381), -(46394), -(46406), -(46411), -(46420), -(46421), -(46422), -(46429), -(46430), -(46432), -(46433), -(46434), -(46440), -(46443), -(46444), -(46447), -(46448), -(46449), -(46459), -(46460), -(46466), -(46468), -(46469), -(46479), -(46480), -(46481), -(46483), -(46485), -(46486), -(46487), -(46543), -(46550), -(46556), -(46557), -(46558), -(46559), -(46560), -(46561), -(46562), -(46563), -(46566), -(46567), -(46568), -(46572), -(46579), -(46580), -(46582), -(46587), -(46590), -(46591), -(46595), -(46598), -(46602), -(46607), -(46611), -(46612), -(46613), -(46614), -(46615), -(46616), -(46617), -(46618), -(46620), -(46621), -(46624), -(46629), -(46630), -(46641), -(46642), -(46651), -(46654), -(46661), -(46664), -(46665), -(46667), -(46671), -(46672), -(46673), -(46674), -(46677), -(46681), -(46686), -(46691), -(46693), -(46696), -(46702), -(46704), -(46709), -(46711), -(46716), -(46717), -(46718), -(46719), -(46720), -(46721), -(46722), -(46723), -(46724), -(46725), -(46726), -(46727), -(46728), -(46729), -(46730), -(46731), -(46734), -(46745), -(46762), -(46764), -(46770), -(46772), -(46773), -(46787), -(46791), -(46801), -(46813), -(46816), -(46824), -(46825), -(46826), -(46841), -(46845), -(46846), -(46856), -(46857), -(46877), -(46879), -(46880), -(46887), -(46906), -(46956), -(46960), -(46962), -(46978), -(46982), -(46983), -(46987), -(46988), -(46990), -(47001), -(47003), -(47009), -(47011), -(47012), -(47014), -(47020), -(47021), -(47028), -(47029), -(47033), -(47034), -(47042), -(47043), -(47057), -(47059), -(47062), -(47063), -(47064), -(47066), -(47068), -(47069), -(47070), -(47071), -(47072), -(47074), -(47076), -(47077), -(47079), -(47081), -(47084), -(47093), -(47096), -(47098), -(47107), -(47117), -(47122), -(47139), -(47143), -(47144), -(47145), -(47146), -(47148), -(47149), -(47151), -(47152), -(47153), -(47155), -(47156), -(47157), -(47158), -(47160), -(47161), -(47162), -(47163), -(47164), -(47165), -(47166), -(47168), -(47171), -(47173), -(47176), -(47206), -(47208), -(47219), -(47244), -(47248), -(47249), -(47257), -(47272), -(47277), -(47282), -(47293), -(47299), -(47305), -(47307), -(47308), -(47316), -(47321), -(47322), -(47323), -(47326), -(47333), -(47334), -(47337), -(47338), -(47339), -(47340), -(47345), -(47380), -(47382), -(47390), -(47392), -(47394), -(47403), -(47405), -(47410), -(47413), -(47414), -(47422), -(47424), -(47431), -(47432), -(47442), -(47447), -(47449), -(47450), -(47451), -(47453), -(47465), -(47467), -(47468), -(47470), -(47471), -(47472), -(47474), -(47475), -(47476), -(47480), -(47481), -(47482), -(47485), -(47486), -(47487), -(47488), -(47489), -(47497), -(47498), -(47504), -(47516), -(47517), -(47519), -(47520), -(47528), -(47530), -(47534), -(47540), -(47541), -(47550), -(47575), -(47601), -(47604), -(47610), -(47611), -(47614), -(47629), -(47632), -(47633), -(47635), -(47637), -(47664), -(47665), -(47673), -(47674), -(47676), -(47679), -(47689), -(47695), -(47697), -(47698), -(47700), -(47702), -(47703), -(47718), -(47721), -(47722), -(47723), -(47724), -(47729), -(47739), -(47740), -(47741), -(47744), -(47749), -(47751), -(47753), -(47757), -(47758), -(47761), -(47767), -(47768), -(47777), -(47778), -(47780), -(47781), -(47782), -(47783), -(47785), -(47788), -(47808), -(47809), -(47810), -(47811), -(47812), -(47813), -(47814), -(47815), -(47824), -(47825), -(47826), -(47827), -(47835), -(47836), -(47837), -(47838), -(47841), -(47843), -(47848), -(47850), -(47851), -(47852), -(47853), -(47855), -(47857), -(47859), -(47860), -(47863), -(47864), -(47865), -(47867), -(47902), -(47914), -(47917), -(47920), -(47926), -(47928), -(47930), -(47938), -(47948), -(47960), -(47961), -(47962), -(47964), -(47968), -(47976), -(47984), -(47991), -(47992), -(47993), -(47994), -(47995), -(47996), -(48011), -(48013), -(48039), -(48045), -(48046), -(48047), -(48048), -(48053), -(48060), -(48062), -(48063), -(48065), -(48066), -(48067), -(48068), -(48070), -(48071), -(48072), -(48073), -(48084), -(48085), -(48098), -(48099), -(48100), -(48101), -(48102), -(48103), -(48104), -(48105), -(48119), -(48120), -(48122), -(48123), -(48124), -(48125), -(48126), -(48127), -(48130), -(48132), -(48133), -(48134), -(48135), -(48137), -(48140), -(48147), -(48155), -(48156), -(48157), -(48158), -(48159), -(48160), -(48161), -(48163), -(48164), -(48165), -(48169), -(48181), -(48184), -(48187), -(48192), -(48208), -(48210), -(48232), -(48245), -(48249), -(48250), -(48261), -(48262), -(48264), -(48267), -(48268), -(48282), -(48283), -(48285), -(48286), -(48287), -(48288), -(48290), -(48291), -(48292), -(48296), -(48298), -(48299), -(48300), -(48301), -(48307), -(48309), -(48310), -(48316), -(48330), -(48334), -(48360), -(48365), -(48374), -(48376), -(48377), -(48378), -(48400), -(48417), -(48423), -(48424), -(48440), -(48441), -(48442), -(48443), -(48450), -(48451), -(48459), -(48461), -(48462), -(48463), -(48464), -(48465), -(48468), -(48469), -(48479), -(48480), -(48489), -(48490), -(48491), -(48504), -(48532), -(48533), -(48540), -(48541), -(48542), -(48543), -(48548), -(48549), -(48563), -(48564), -(48565), -(48566), -(48567), -(48568), -(48569), -(48570), -(48571), -(48572), -(48573), -(48574), -(48575), -(48576), -(48577), -(48578), -(48579), -(48583), -(48585), -(48598), -(48599), -(48601), -(48603), -(48606), -(48617), -(48622), -(48628), -(48637), -(48638), -(48639), -(48640), -(48648), -(48652), -(48656), -(48657), -(48658), -(48659), -(48660), -(48661), -(48662), -(48663), -(48664), -(48665), -(48666), -(48667), -(48668), -(48669), -(48671), -(48672), -(48673), -(48674), -(48675), -(48676), -(48678), -(48679), -(48680), -(48689), -(48690), -(48691), -(48693), -(48696), -(48697), -(48698), -(48699), -(48700), -(48712), -(48714), -(48737), -(48738), -(48746), -(48747), -(48749), -(48750), -(48752), -(48753), -(48754), -(48755), -(48756), -(48759), -(48760), -(48765), -(48770), -(48772), -(48774), -(48775), -(48781), -(48782), -(48784), -(48785), -(48788), -(48800), -(48801), -(48802), -(48805), -(48806), -(48812), -(48813), -(48815), -(48820), -(48821), -(48822), -(48823), -(48824), -(48825), -(48826), -(48827), -(48828), -(48829), -(48830), -(48831), -(48832), -(48845), -(48850), -(48851), -(48852), -(48854), -(48862), -(48871), -(48872), -(48873), -(48876), -(48877), -(48878), -(48880), -(48881), -(48883), -(48895), -(48917), -(48920), -(48931), -(48932), -(48935), -(48936), -(48953), -(48960), -(48974), -(48981), -(48984), -(48995), -(48996), -(48998), -(48999), -(49000), -(49001), -(49005), -(49009), -(49010), -(49011), -(49012), -(49020), -(49021), -(49026), -(49028), -(49029), -(49037), -(49044), -(49045), -(49047), -(49048), -(49049), -(49050), -(49051), -(49052), -(49053), -(49054), -(49078), -(49084), -(49089), -(49090), -(49091), -(49092), -(49093), -(49099), -(49106), -(49110), -(49111), -(49113), -(49119), -(49124), -(49125), -(49127), -(49138), -(49143), -(49158), -(49161), -(49165), -(49177), -(49184), -(49204), -(49206), -(49213), -(49215), -(49230), -(49231), -(49232), -(49233), -(49235), -(49236), -(49237), -(49238), -(49239), -(49240), -(49242), -(49243), -(49256), -(49257), -(49266), -(49267), -(49268), -(49269), -(49270), -(49271), -(49272), -(49273), -(49275), -(49276), -(49278), -(49279), -(49282), -(49283), -(49284), -(49288), -(49294), -(49296), -(49298), -(49305), -(49309), -(49312), -(49317), -(49323), -(49324), -(49348), -(49349), -(49353), -(49354), -(49362), -(49363), -(49364), -(49372), -(49376), -(49381), -(49383), -(49387), -(49404), -(49406), -(49418), -(49427), -(49429), -(49433), -(49439), -(49446), -(49453), -(49454), -(49459), -(49463), -(49466), -(49481), -(49482), -(49485), -(49500), -(49501), -(49511), -(49512), -(49527), -(49537), -(49544), -(49546), -(49547), -(49549), -(49560), -(49576), -(49584), -(49587), -(49592), -(49613), -(49616), -(49617), -(49624), -(49637), -(49639), -(49641), -(49644), -(49675), -(49678), -(49680), -(49681), -(49686), -(49690), -(49696), -(49704), -(49705), -(49706), -(49708), -(49710), -(49711), -(49712), -(49715), -(49718), -(49719), -(49720), -(49723), -(49729), -(49734), -(49742), -(49747), -(49749), -(49753), -(49755), -(49758), -(49759), -(49771), -(49776), -(49797), -(49799), -(49800), -(49802), -(49803), -(49804), -(49805), -(49806), -(49830), -(49836), -(49840), -(49841), -(49843), -(49846), -(49848), -(49859), -(49861), -(49863), -(49865), -(49891), -(49892), -(49893), -(49894), -(49895), -(49896), -(49897), -(49903), -(49904), -(49906), -(49909), -(49913), -(49914), -(49915), -(49916), -(49917), -(49918), -(49919), -(49920), -(49921), -(49922), -(49923), -(49924), -(49926), -(49927), -(49928), -(49929), -(49930), -(49935), -(49942), -(49945), -(49956), -(49961), -(49965), -(49966), -(49967), -(49968), -(49969), -(49970), -(49971), -(49972), -(49973), -(49974), -(49975), -(49978), -(49980), -(49981), -(49985), -(49986), -(49987), -(49989), -(49991), -(49993), -(49994), -(49995), -(49996), -(49997), -(49998), -(49999), -(50004), -(50006), -(50015), -(50021), -(50027), -(50028), -(50035), -(50038), -(50046), -(50047), -(50050), -(50052), -(50064), -(50066), -(50073), -(50075), -(50084), -(50086), -(50089), -(50090), -(50091), -(50092), -(50094), -(50100), -(50101), -(50102), -(50104), -(50135), -(50144), -(50145), -(50146), -(50156), -(50165), -(50169), -(50183), -(50184), -(50185), -(50188), -(50196), -(50198), -(50205), -(50206), -(50207), -(50217), -(50231), -(50232), -(50234), -(50245), -(50251), -(50252), -(50255), -(50256), -(50257), -(50259), -(50265), -(50271), -(50273), -(50276), -(50282), -(50287), -(50288), -(50289), -(50290), -(50291), -(50293), -(50295), -(50299), -(50301), -(50303), -(50305), -(50306), -(50307), -(50319), -(50323), -(50328), -(50335), -(50341), -(50343), -(50344), -(50347), -(50349), -(50356), -(50361), -(50370), -(50375), -(50377), -(50378), -(50379), -(50380), -(50400), -(50401), -(50402), -(50403), -(50405), -(50406), -(50410), -(50411), -(50412), -(50424), -(50431), -(50432), -(50434), -(50435), -(50436), -(50437), -(50439), -(50445), -(50454), -(50455), -(50456), -(50459), -(50462), -(50463), -(50464), -(50477), -(50478), -(50479), -(50484), -(50498), -(50499), -(50500), -(50504), -(50508), -(50509), -(50510), -(50511), -(50512), -(50517), -(50518), -(50519), -(50521), -(50523), -(50533), -(50534), -(50536), -(50537), -(50538), -(50541), -(50545), -(50550), -(50559), -(50566), -(50572), -(50573), -(50578), -(50581), -(50582), -(50588), -(50597), -(50629), -(50631), -(50633), -(50634), -(50635), -(50638), -(50655), -(50658), -(50659), -(50660), -(50661), -(50662), -(50663), -(50666), -(50668), -(50673), -(50675), -(50679), -(50688), -(50691), -(50693), -(50701), -(50704), -(50705), -(50706), -(50721), -(50725), -(50729), -(50731), -(50732), -(50733), -(50737), -(50739), -(50740), -(50744), -(50761), -(50770), -(50773), -(50782), -(50783), -(50796), -(50797), -(50799), -(50804), -(50818), -(50820), -(50821), -(50830), -(50832), -(50834), -(50842), -(50843), -(50844), -(50845), -(50846), -(50853), -(50854), -(50859), -(50861), -(50874), -(50876), -(50894), -(50895), -(50900), -(50905), -(50907), -(50914), -(50918), -(50919), -(50923), -(50924), -(50926), -(50927), -(50978), -(50979), -(50992), -(50997), -(51011), -(51015), -(51016), -(51018), -(51020), -(51026), -(51035), -(51037), -(51046), -(51054), -(51055), -(51057), -(51059), -(51062), -(51064), -(51067), -(51069), -(51072), -(51077), -(51079), -(51081), -(51083), -(51085), -(51087), -(51089), -(51091), -(51093), -(51095), -(51097), -(51100), -(51102), -(51105), -(51107), -(51111), -(51120), -(51121), -(51131), -(51134), -(51135), -(51137), -(51154), -(51156), -(51157), -(51165), -(51187), -(51196), -(51197), -(51198), -(51199), -(51200), -(51203), -(51216), -(51220), -(51221), -(51226), -(51227), -(51228), -(51229), -(51232), -(51233), -(51235), -(51236), -(51240), -(51243), -(51258), -(51259), -(51270), -(51272), -(51275), -(51279), -(51285), -(51287), -(51290), -(51292), -(51298), -(51305), -(51308), -(51310), -(51315), -(51316), -(51325), -(51326), -(51327), -(51328), -(51330), -(51334), -(51339), -(51340), -(51354), -(51356), -(51363), -(51365), -(51372), -(51382), -(51399), -(51409), -(51410), -(51411), -(51413), -(51416), -(51417), -(51418), -(51419), -(51423), -(51424), -(51425), -(51426), -(51427), -(51428), -(51429), -(51430), -(51431), -(51432), -(51440), -(51442), -(51446), -(51447), -(51454), -(51460), -(51467), -(51484), -(51489), -(51491), -(51492), -(51495), -(51496), -(51500), -(51502), -(51503), -(51504), -(51505), -(51506), -(51509), -(51514), -(51515), -(51573), -(51580), -(51584), -(51585), -(51586), -(51587), -(51588), -(51591), -(51592), -(51593), -(51596), -(51598), -(51601), -(51608), -(51609), -(51610), -(51613), -(51614), -(51618), -(51656), -(51657), -(51658), -(51659), -(51662), -(51675), -(51676), -(51677), -(51680), -(51693), -(51695), -(51699), -(51714), -(51718), -(51722), -(51724), -(51726), -(51728), -(51732), -(51734), -(51735), -(51736), -(51740), -(51751), -(51756), -(51757), -(51772), -(51775), -(51776), -(51778), -(51779), -(51786), -(51787), -(51797), -(51798), -(51799), -(51803), -(51804), -(51808), -(51809), -(51811), -(51818), -(51827), -(51830), -(51842), -(51844), -(51853), -(51854), -(51855), -(51856), -(51857), -(51863), -(51864), -(51872), -(51875), -(51876), -(51877), -(51878), -(51879), -(51886), -(51888), -(51889), -(51893), -(51894), -(51895), -(51897), -(51898), -(51899), -(51901), -(51909), -(51912), -(51917), -(51918), -(51919), -(51920), -(51926), -(51934), -(51935), -(51936), -(51937), -(51940), -(51945), -(51949), -(51951), -(51961), -(51962), -(51963), -(51968), -(51973), -(51976), -(51979), -(51981), -(51989), -(51990), -(51997), -(51998), -(51999), -(52000), -(52004), -(52005), -(52007), -(52008), -(52014), -(52025), -(52026), -(52030), -(52032), -(52042), -(52043), -(52045), -(52053), -(52069), -(52078), -(52082), -(52083), -(52086), -(52088), -(52090), -(52108), -(52125), -(52139), -(52149), -(52157), -(52160), -(52163), -(52167), -(52169), -(52171), -(52187), -(52194), -(52196), -(52198), -(52199), -(52206), -(52207), -(52209), -(52210), -(52212), -(52217), -(52219), -(52221), -(52223), -(52224), -(52228), -(52229), -(52230), -(52251), -(52252), -(52253), -(52256), -(52261), -(52263), -(52265), -(52267), -(52270), -(52280), -(52282), -(52292), -(52307), -(52312), -(52318), -(52327), -(52328), -(52334), -(52345), -(52346), -(52352), -(52353), -(52355), -(52356), -(52359), -(52360), -(52361), -(52364), -(52372), -(52373), -(52374), -(52375), -(52383), -(52389), -(52391), -(52401), -(52402), -(52415), -(52425), -(52428), -(52430), -(52431), -(52433), -(52444), -(52445), -(52447), -(52460), -(52463), -(52465), -(52466), -(52468), -(52469), -(52471), -(52472), -(52473), -(52474), -(52475), -(52476), -(52486), -(52487), -(52496), -(52498), -(52499), -(52501), -(52502), -(52504), -(52506), -(52511), -(52515), -(52519), -(52521), -(52522), -(52527), -(52532), -(52534), -(52536), -(52537), -(52538), -(52540), -(52542), -(52544), -(52545), -(52546), -(52547), -(52548), -(52549), -(52554), -(52566), -(52577), -(52581), -(52583), -(52586), -(52587), -(52591), -(52594), -(52595), -(52596), -(52600), -(52601), -(52604), -(52608), -(52609), -(52610), -(52613), -(52620), -(52631), -(52633), -(52643), -(52644), -(52655), -(52657), -(52658), -(52660), -(52672), -(52675), -(52680), -(52684), -(52695), -(52696), -(52699), -(52700), -(52702), -(52705), -(52708), -(52709), -(52711), -(52713), -(52715), -(52718), -(52719), -(52721), -(52722), -(52737), -(52740), -(52741), -(52743), -(52751), -(52752), -(52754), -(52755), -(52758), -(52761), -(52762), -(52764), -(52771), -(52772), -(52773), -(52778), -(52781), -(52782), -(52784), -(52789), -(52794), -(52806), -(52807), -(52813), -(52814), -(52818), -(52825), -(52835), -(52839), -(52851), -(52856), -(52859), -(52862), -(52863), -(52864), -(52871), -(52872), -(52873), -(52883), -(52885), -(52889), -(52890), -(52904), -(52905), -(52909), -(52921), -(52926), -(52931), -(52932), -(52939), -(52943), -(52986), -(52987), -(52988), -(52992), -(52994), -(52996), -(53001), -(53002), -(53003), -(53005), -(53006), -(53007), -(53019), -(53023), -(53027), -(53031), -(53033), -(53043), -(53044), -(53045), -(53051), -(53058), -(53059), -(53060), -(53062), -(53068), -(53069), -(53070), -(53072), -(53073), -(53085), -(53086), -(53087), -(53088), -(53089), -(53094), -(53098), -(53099), -(53100), -(53101), -(53102), -(53108), -(53109), -(53111), -(53116), -(53141), -(53145), -(53148), -(53150), -(53153), -(53158), -(53174), -(53191), -(53193), -(53194), -(53195), -(53208), -(53209), -(53214), -(53254), -(53271), -(53288), -(53289), -(53301), -(53307), -(53308), -(53310), -(53311), -(53313), -(53314), -(53317), -(53318), -(53322), -(53326), -(53327), -(53329), -(53330), -(53332), -(53333), -(53335), -(53338), -(53339), -(53340), -(53346), -(53351), -(53352), -(53353), -(53357), -(53359), -(53364), -(53366), -(53372), -(53388), -(53394), -(53395), -(53396), -(53402), -(53404), -(53407), -(53408), -(53418), -(53422), -(53424), -(53425), -(53431), -(53435), -(53437), -(53438), -(53442), -(53449), -(53460), -(53477), -(53480), -(53492), -(53493), -(53498), -(53499), -(53508), -(53509), -(53526), -(53528), -(53529), -(53532), -(53533), -(53534), -(53536), -(53537), -(53538), -(53540), -(53542), -(53543), -(53544), -(53545), -(53546), -(53547), -(53548), -(53549), -(53550), -(53558), -(53559), -(53560), -(53561), -(53562), -(53564), -(53565), -(53566), -(53567), -(53568), -(53571), -(53572), -(53573), -(53574), -(53575), -(53578), -(53579), -(53580), -(53581), -(53582), -(53584), -(53586), -(53587), -(53588), -(53589), -(53595), -(53600), -(53601), -(53617), -(53618), -(53625), -(53629), -(53631), -(53633), -(53638), -(53639), -(53652), -(53653), -(53654), -(53659), -(53669), -(53697), -(53704), -(53719), -(53726), -(53733), -(53739), -(53742), -(53769), -(53772), -(53786), -(53788), -(53799), -(53807), -(53809), -(53810), -(53815), -(53821), -(53824), -(54016), -(54028), -(54029), -(54035), -(54039), -(54042), -(54049), -(54050), -(54051), -(54052), -(54053), -(54060), -(54063), -(54068), -(54070), -(54071), -(54074), -(54075), -(54076), -(54077), -(54078), -(54079), -(54080), -(54092), -(54094), -(54095), -(54096), -(54113), -(54121), -(54126), -(54129), -(54132), -(54135), -(54158), -(54169), -(54172), -(54175), -(54183), -(54185), -(54188), -(54190), -(54191), -(54195), -(54196), -(54198), -(54203), -(54216), -(54226), -(54235), -(54237), -(54238), -(54249), -(54260), -(54261), -(54273), -(54283), -(54284), -(54290), -(54299), -(54303), -(54309), -(54311), -(54315), -(54316), -(54319), -(54321), -(54324), -(54331), -(54334), -(54335), -(54337), -(54338), -(54339), -(54340), -(54345), -(54350), -(54361), -(54376), -(54378), -(54380), -(54387), -(54393), -(54394), -(54395), -(54396), -(54399), -(54416), -(54417), -(54429), -(54431), -(54433), -(54451), -(54453), -(54458), -(54459), -(54460), -(54468), -(54470), -(54479), -(54485), -(54487), -(54491), -(54495), -(54498), -(54499), -(54502), -(54504), -(54507), -(54511), -(54514), -(54518), -(54521), -(54525), -(54526), -(54527), -(54531), -(54532), -(54540), -(54549), -(54565), -(54573), -(54576), -(54577), -(54578), -(54587), -(54588), -(54593), -(54594), -(54602), -(54604), -(54609), -(54610), -(54611), -(54612), -(54613), -(54615), -(54616), -(54617), -(54618), -(54619), -(54620), -(54622), -(54624), -(54630), -(54631), -(54632), -(54634), -(54640), -(54644), -(54646), -(54648), -(54651), -(54660), -(54662), -(54663), -(54667), -(54668), -(54673), -(54675), -(54677), -(54679), -(54680), -(54688), -(54689), -(54694), -(54702), -(54703), -(54704), -(54706), -(54708), -(54709), -(54716), -(54719), -(54723), -(54755), -(54757), -(54761), -(54770), -(54772), -(54781), -(54785), -(54788), -(54790), -(54791), -(54794), -(54799), -(54801), -(54804), -(54805), -(54820), -(54822), -(54823), -(54843), -(54846), -(54880), -(54881), -(54882), -(54883), -(54884), -(54885), -(54886), -(54887), -(54900), -(54906), -(54908), -(54919), -(54920), -(54932), -(54933), -(54951), -(54956), -(54957), -(54958), -(54965), -(54970), -(54971), -(54973), -(54974), -(54975), -(54976), -(54977), -(54982), -(54983), -(54986), -(54987), -(54992), -(54997), -(55006), -(55007), -(55008), -(55009), -(55021), -(55029), -(55039), -(55041), -(55046), -(55050), -(55051), -(55054), -(55065), -(55066), -(55069), -(55070), -(55071), -(55074), -(55075), -(55078), -(55079), -(55090), -(55093), -(55095), -(55102), -(55104), -(55144), -(55160), -(55168), -(55196), -(55209), -(55210), -(55216), -(55217), -(55218), -(55219), -(55220), -(55224), -(55225), -(55226), -(55240), -(55241), -(55253), -(55255), -(55258), -(55259), -(55260), -(55261), -(55262), -(55263), -(55264), -(55265), -(55268), -(55269), -(55270), -(55271), -(55274), -(55276), -(55277), -(55281), -(55284), -(55313), -(55314), -(55317), -(55318), -(55319), -(55320), -(55321), -(55322), -(55324), -(55331), -(55334), -(55346), -(55348), -(55359), -(55360), -(55363), -(55364), -(55411), -(55412), -(55416), -(55424), -(55425), -(55430), -(55469), -(55470), -(55482), -(55483), -(55484), -(55485), -(55487), -(55488), -(55489), -(55490), -(55491), -(55492), -(55495), -(55496), -(55497), -(55498), -(55499), -(55504), -(55505), -(55506), -(55507), -(55508), -(55509), -(55511), -(55520), -(55521), -(55530), -(55536), -(55549), -(55550), -(55555), -(55556), -(55557), -(55567), -(55568), -(55569), -(55579), -(55581), -(55582), -(55597), -(55598), -(55599), -(55602), -(55604), -(55605), -(55613), -(55622), -(55624), -(55625), -(55643), -(55645), -(55646), -(55648), -(55652), -(55659), -(55700), -(55703), -(55704), -(55716), -(55719), -(55728), -(55736), -(55748), -(55749), -(55750), -(55751), -(55752), -(55753), -(55754), -(55756), -(55770), -(55771), -(55772), -(55778), -(55779), -(55780), -(55781), -(55790), -(55797), -(55802), -(55804), -(55809), -(55813), -(55815), -(55818), -(55823), -(55824), -(55838), -(55840), -(55841), -(55864), -(55874), -(55877), -(55880), -(55890), -(55894), -(55929), -(55931), -(55932), -(55933), -(55935), -(55936), -(55937), -(55939), -(55951), -(55958), -(55959), -(55960), -(55962), -(55963), -(55968), -(55973), -(55978), -(55981), -(55982), -(55983), -(55984), -(56033), -(56036), -(56038), -(56046), -(56061), -(56071), -(56072), -(56090), -(56091), -(56092), -(56098), -(56104), -(56106), -(56107), -(56112), -(56113), -(56115), -(56122), -(56123), -(56125), -(56127), -(56130), -(56131), -(56132), -(56138), -(56139), -(56141), -(56143), -(56144), -(56147), -(56149), -(56160), -(56161), -(56185), -(56190), -(56191), -(56198), -(56200), -(56211), -(56222), -(56223), -(56230), -(56236), -(56239), -(56252), -(56254), -(56260), -(56277), -(56287), -(56305), -(56320), -(56326), -(56329), -(56331), -(56332), -(56346), -(56351), -(56352), -(56361), -(56362), -(56379), -(56404), -(56405), -(56411), -(56425), -(56426), -(56430), -(56433), -(56434), -(56440), -(56442), -(56444), -(56447), -(56448), -(56485), -(56491), -(56506), -(56513), -(56515), -(56517), -(56520), -(56521), -(56525), -(56536), -(56537), -(56539), -(56545), -(56557), -(56559), -(56562), -(56564), -(56565), -(56581), -(56582), -(56584), -(56586), -(56603), -(56605), -(56606), -(56607), -(56609), -(56624), -(56626), -(56627), -(56628), -(56629), -(56630), -(56631), -(56640), -(56641), -(56645), -(56659), -(56662), -(56664), -(56666), -(56668), -(56670), -(56671), -(56672), -(56678), -(56685), -(56687), -(56698), -(56699), -(56701), -(56707), -(56715), -(56718), -(56719), -(56720), -(56721), -(56727), -(56728), -(56729), -(56730), -(56731), -(56734), -(56753), -(56754), -(56755), -(56760), -(56761), -(56770), -(56771), -(56772), -(56773), -(56774), -(56775), -(56776), -(56777), -(56780), -(56781), -(56785), -(56790), -(56791), -(56795), -(56796), -(56797), -(56815), -(56854), -(56860), -(56861), -(56862), -(56891), -(56893), -(56896), -(56898), -(56902), -(56903), -(56905), -(56906), -(56907), -(56909), -(56917), -(56918), -(56919), -(56920), -(56921), -(56922), -(56923), -(56925), -(56933), -(56937), -(56938), -(56939), -(56940), -(56966), -(56969), -(57049), -(57050), -(57052), -(57053), -(57058), -(57062), -(57063), -(57089), -(57090), -(57094), -(57095), -(57108), -(57118), -(57143), -(57292), -(57305), -(57323), -(57337), -(57346), -(57347), -(57369), -(57374), -(57376), -(57380), -(57384), -(57386), -(57388), -(57389), -(57390), -(57391), -(57392), -(57393), -(57395), -(57397), -(57402), -(57407), -(57411), -(57413), -(57420), -(57454), -(57456), -(57461), -(57464), -(57465), -(57466), -(57473), -(57480), -(57486), -(57487), -(57488), -(57490), -(57506), -(57507), -(57528), -(57530), -(57536), -(57537), -(57547), -(57548), -(57553), -(57554), -(57556), -(57573), -(57580), -(57582), -(57587), -(57589), -(57590), -(57593), -(57594), -(57596), -(57599), -(57601), -(57602), -(57603), -(57615), -(57616), -(57617), -(57620), -(57628), -(57635), -(57640), -(57641), -(57644), -(57645), -(57647), -(57648), -(57651), -(57657), -(57661), -(57665), -(57670), -(57671), -(57677), -(57679), -(57723), -(57724), -(57725), -(57745), -(57755), -(57759), -(57765), -(57766), -(57767), -(57770), -(57774), -(57775), -(57777), -(57778), -(57779), -(57780), -(57781), -(57783), -(57785), -(57787), -(57789), -(57790), -(57795), -(57799), -(57802), -(57807), -(57808), -(57823), -(57825), -(57833), -(57834), -(57838), -(57841), -(57842), -(57845), -(57846), -(57860), -(57863), -(57864), -(57871), -(57874), -(57888), -(57896), -(57897), -(57906), -(57908), -(57914), -(57921), -(57922), -(57941), -(57949), -(57951), -(57964), -(57965), -(57969), -(57970), -(57974), -(57975), -(57981), -(57984), -(57992), -(57993), -(57994), -(58012), -(58021), -(58025), -(58044), -(58054), -(58061), -(58062), -(58071), -(58106), -(58117), -(58118), -(58119), -(58151), -(58154), -(58179), -(58180), -(58181), -(58183), -(58184), -(58187), -(58194), -(58203), -(58204), -(58205), -(58207), -(58208), -(58209), -(58210), -(58211), -(58212), -(58213), -(58214), -(58215), -(58216), -(58217), -(58218), -(58219), -(58220), -(58221), -(58222), -(58223), -(58224), -(58230), -(58270), -(58282), -(58283), -(58349), -(58351), -(58352), -(58371), -(58373), -(58412), -(58418), -(58419), -(58420), -(58421), -(58438), -(58448), -(58449), -(58450), -(58451), -(58452), -(58453), -(58456), -(58457), -(58459), -(58460), -(58461), -(58462), -(58464), -(58466), -(58471), -(58475), -(58494), -(58504), -(58505), -(58508), -(58509), -(58510), -(58511), -(58513), -(58514), -(58516), -(58517), -(58518), -(58519), -(58520), -(58526), -(58529), -(58531), -(58534), -(58535), -(58537), -(58544), -(58548), -(58561), -(58563), -(58564), -(58566), -(58567), -(58597), -(58604), -(58605), -(58607), -(58608), -(58609), -(58610), -(58611), -(58612), -(58617), -(58619), -(58621), -(58622), -(58624), -(58628), -(58632), -(58633), -(58642), -(58644), -(58660), -(58663), -(58664), -(58665), -(58666), -(58667), -(58678), -(58681), -(58683), -(58684), -(58691), -(58700), -(58701), -(58702), -(58743), -(58747), -(58758), -(58769), -(58770), -(58772), -(58781), -(58782), -(58786), -(58787), -(58788), -(58797), -(58798), -(58799), -(58810), -(58811), -(58814), -(58815), -(58816), -(58817), -(58822), -(58823), -(58827), -(58829), -(58830), -(58839), -(58840), -(58843), -(58844), -(58845), -(58847), -(58849), -(58850), -(58855), -(58859), -(58861), -(58867), -(58879), -(58890), -(58896), -(58898), -(58902), -(58905), -(58912), -(58913), -(58915), -(58919), -(58921), -(58922), -(58935), -(58940), -(58941), -(58953), -(58955), -(58959), -(58961), -(58966), -(58967), -(58969), -(58971), -(58972), -(58973), -(58976), -(58978), -(58980), -(58981), -(58987), -(58988), -(58989), -(58991), -(58996), -(59001), -(59006), -(59007), -(59011), -(59013), -(59016), -(59017), -(59019), -(59020), -(59021), -(59023), -(59024), -(59025), -(59034), -(59035), -(59039), -(59040), -(59044), -(59047), -(59050), -(59051), -(59060), -(59064), -(59065), -(59069), -(59079), -(59080), -(59081), -(59082), -(59083), -(59085), -(59100), -(59102), -(59104), -(59105), -(59106), -(59109), -(59110), -(59111), -(59114), -(59119), -(59121), -(59124), -(59130), -(59131), -(59132), -(59133), -(59134), -(59138), -(59142), -(59144), -(59146), -(59147), -(59148), -(59150), -(59151), -(59153), -(59155), -(59160), -(59161), -(59163), -(59164), -(59165), -(59166), -(59167), -(59168), -(59169), -(59170), -(59171), -(59172), -(59178), -(59179), -(59180), -(59182), -(59185), -(59186), -(59187), -(59191), -(59192), -(59199), -(59209), -(59210), -(59211), -(59215), -(59220), -(59223), -(59225), -(59226), -(59228), -(59233), -(59235), -(59237), -(59239), -(59241), -(59242), -(59243), -(59244), -(59246), -(59247), -(59248), -(59249), -(59251), -(59252), -(59254), -(59256), -(59257), -(59259), -(59260), -(59261), -(59262), -(59263), -(59264), -(59265), -(59268), -(59269), -(59270), -(59271), -(59273), -(59280), -(59288), -(59290), -(59300), -(59304), -(59318), -(59319), -(59324), -(59325), -(59329), -(59330), -(59331), -(59342), -(59343), -(59344), -(59346), -(59347), -(59348), -(59350), -(59351), -(59352), -(59355), -(59357), -(59359), -(59361), -(59362), -(59364), -(59367), -(59371), -(59373), -(59374), -(59376), -(59381), -(59389), -(59391), -(59392), -(59395), -(59397), -(59398), -(59399), -(59400), -(59401), -(59402), -(59408), -(59409), -(59412), -(59413), -(59423), -(59432), -(59434), -(59439), -(59444), -(59448), -(59455), -(59460), -(59467), -(59468), -(59471), -(59482), -(59485), -(59513), -(59515), -(59517), -(59519), -(59520), -(59525), -(59530), -(59542), -(59543), -(59544), -(59545), -(59547), -(59548), -(59557), -(59558), -(59563), -(59575), -(59577), -(59590), -(59593), -(59594), -(59599), -(59603), -(59604), -(59605), -(59606), -(59607), -(59608), -(59610), -(59611), -(59616), -(59617), -(59633), -(59634), -(59637), -(59638), -(59651), -(59653), -(59656), -(59661), -(59663), -(59679), -(59682), -(59683), -(59684), -(59685), -(59691), -(59695), -(59696), -(59700), -(59703), -(59710), -(59712), -(59713), -(59715), -(59716), -(59717), -(59718), -(59723), -(59727), -(59735), -(59736), -(59742), -(59743), -(59746), -(59750), -(59760), -(59762), -(59763), -(59765), -(59766), -(59767), -(59769), -(59779), -(59795), -(59805), -(59812), -(59813), -(59814), -(59815), -(59817), -(59823), -(59826), -(59827), -(59832), -(59839), -(59840), -(59841), -(59844), -(59846), -(59851), -(59852), -(59855), -(59856), -(59863), -(59864), -(59877), -(59879), -(59881), -(59882), -(59883), -(59884), -(59885), -(59886), -(59894), -(59901), -(59921), -(59963), -(59965), -(59972), -(59974), -(59978), -(59982), -(59984), -(59985), -(59986), -(59987), -(59988), -(59989), -(59991), -(59992), -(59993), -(59994), -(59997), -(59999), -(60003), -(60004), -(60005), -(60006), -(60008), -(60009), -(60011), -(60012), -(60013), -(60015), -(60016), -(60017), -(60018), -(60032), -(60035), -(60039), -(60041), -(60043), -(60051), -(60052), -(60053), -(60067), -(60073), -(60076), -(60078), -(60079), -(60080), -(60085), -(60089), -(60100), -(60103), -(60106), -(60107), -(60111), -(60112), -(60115), -(60117), -(60122), -(60123), -(60127), -(60129), -(60181), -(60183), -(60186), -(60194), -(60195), -(60197), -(60203), -(60204), -(60210), -(60211), -(60212), -(60229), -(60233), -(60234), -(60235), -(60236), -(60239), -(60241), -(60300), -(60307), -(60309), -(60339), -(60351), -(60352), -(60428), -(60431), -(60432), -(60433), -(60440), -(60443), -(60446), -(60447), -(60450), -(60452), -(60453), -(60472), -(60474), -(60483), -(60488), -(60500), -(60504), -(60505), -(60506), -(60518), -(60526), -(60530), -(60540), -(60541), -(60542), -(60578), -(60580), -(60585), -(60588), -(60590), -(60626), -(60642), -(60644), -(60646), -(60654), -(60672), -(60678), -(60682), -(60683), -(60699), -(60708), -(60742), -(60753), -(60781), -(60782), -(60784), -(60785), -(60786), -(60790), -(60802), -(60803), -(60805), -(60809), -(60814), -(60817), -(60842), -(60844), -(60850), -(60856), -(60857), -(60859), -(60868), -(60869), -(60870), -(60871), -(60872), -(60873), -(60876), -(60880), -(60882), -(60890), -(60896), -(60897), -(60898), -(60899), -(60900), -(60901), -(60905), -(60906), -(60917), -(60918), -(60924), -(60926), -(60927), -(60930), -(60932), -(60935), -(60940), -(60941), -(60944), -(60945), -(60946), -(60947), -(60949), -(60950), -(60951), -(60952), -(60954), -(60959), -(60961), -(60962), -(60963), -(60965), -(60968), -(60972), -(60973), -(60979), -(60980), -(60981), -(60982), -(60983), -(60988), -(60991), -(60995), -(61001), -(61005), -(61006), -(61016), -(61018), -(61024), -(61025), -(61029), -(61034), -(61036), -(61039), -(61041), -(61042), -(61046), -(61048), -(61051), -(61064), -(61070), -(61077), -(61080), -(61083), -(61087), -(61091), -(61094), -(61100), -(61101), -(61103), -(61109), -(61110), -(61111), -(61115), -(61123), -(61124), -(61127), -(61129), -(61133), -(61140), -(61143), -(61159), -(61160), -(61162), -(61164), -(61166), -(61168), -(61171), -(61172), -(61173), -(61176), -(61178), -(61182), -(61186), -(61187), -(61191), -(61193), -(61194), -(61195), -(61196), -(61197), -(61198), -(61209), -(61211), -(61213), -(61215), -(61218), -(61223), -(61226), -(61242), -(61243), -(61244), -(61253), -(61259), -(61260), -(61263), -(61269), -(61272), -(61281), -(61282), -(61286), -(61287), -(61291), -(61295), -(61296), -(61299), -(61300), -(61301), -(61302), -(61305), -(61314), -(61319), -(61320), -(61326), -(61327), -(61343), -(61344), -(61347), -(61352), -(61358), -(61372), -(61373), -(61374), -(61375), -(61380), -(61381), -(61382), -(61385), -(61395), -(61398), -(61399), -(61409), -(61411), -(61415), -(61419), -(61420), -(61421), -(61423), -(61424), -(61443), -(61445), -(61448), -(61454), -(61457), -(61461), -(61466), -(61474), -(61479), -(61480), -(61486), -(61490), -(61491), -(61493), -(61507), -(61511), -(61512), -(61515), -(61528), -(61545), -(61549), -(61550), -(61552), -(61554), -(61556), -(61558), -(61561), -(61562), -(61563), -(61565), -(61567), -(61569), -(61572), -(61579), -(61584), -(61590), -(61592), -(61593), -(61596), -(61597), -(61599), -(61600), -(61601), -(61604), -(61606), -(61607), -(61613), -(61621), -(61623), -(61624), -(61626), -(61627), -(61628), -(61634), -(61635), -(61662), -(61663), -(61666), -(61667), -(61668), -(61676), -(61685), -(61696), -(61705), -(61712), -(61716), -(61721), -(61728), -(61729), -(61730), -(61733), -(61747), -(61767), -(61780), -(61781), -(61789), -(61791), -(61793), -(61794), -(61795), -(61796), -(61797), -(61798), -(61799), -(61800), -(61801), -(61802), -(61804), -(61805), -(61806), -(61807), -(61808), -(61815), -(61817), -(61819), -(61821), -(61822), -(61823), -(61824), -(61825), -(61832), -(61833), -(61834), -(61835), -(61836), -(61837), -(61838), -(61839), -(61840), -(61841), -(61842), -(61843), -(61844), -(61845), -(61849), -(61857), -(61859), -(61862), -(61866), -(61868), -(61870), -(61873), -(61879), -(61880), -(61881), -(61888), -(61893), -(61895), -(61896), -(61897), -(61903), -(61909), -(61911), -(61912), -(61923), -(61924), -(61925), -(61926), -(61927), -(61928), -(61929), -(61965), -(61967), -(61973), -(61998), -(62014), -(62026), -(62030), -(62036), -(62053), -(62063), -(62078), -(62089), -(62103), -(62105), -(62117), -(62118), -(62119), -(62120), -(62121), -(62122), -(62124), -(62128), -(62129), -(62130), -(62131), -(62138), -(62167), -(62169), -(62195), -(62198), -(62204), -(62225), -(62226), -(62249), -(62250), -(62261), -(62264), -(62265), -(62280), -(62292), -(62298), -(62305), -(62309), -(62310), -(62312), -(62315), -(62316), -(62317), -(62318), -(62322), -(62326), -(62327), -(62328), -(62331), -(62332), -(62333), -(62334), -(62335), -(62342), -(62347), -(62354), -(62356), -(62368), -(62372), -(62373), -(62382), -(62395), -(62401), -(62402), -(62415), -(62417), -(62418), -(62420), -(62441), -(62442), -(62443), -(62444), -(62445), -(62446), -(62455), -(62456), -(62466), -(62479), -(62482), -(62503), -(62507), -(62526), -(62531), -(62536), -(62540), -(62544), -(62554), -(62563), -(62575), -(62581), -(62583), -(62589), -(62601), -(62607), -(62608), -(62611), -(62613), -(62614), -(62626), -(62638), -(62648), -(62649), -(62653), -(62658), -(62672), -(62673), -(62707), -(62708), -(62711), -(62717), -(62722), -(62726), -(62732), -(62767), -(62768), -(62769), -(62793), -(62796), -(62806), -(62832), -(62836), -(62844), -(62845), -(62846), -(62854), -(62855), -(62863), -(62867), -(62874), -(62875), -(62881), -(62900), -(62901), -(62902), -(62903), -(62904), -(62928), -(62935), -(62938), -(62939), -(62960), -(62961), -(62989), -(62997), -(62998), -(63003), -(63010), -(63012), -(63028), -(63034), -(63035), -(63036), -(63047), -(63082), -(63094), -(63103), -(63104), -(63105), -(63111), -(63112), -(63120), -(63124), -(63125), -(63126), -(63127), -(63134), -(63136), -(63138), -(63147), -(63151), -(63169), -(63171), -(63172), -(63174), -(63175), -(63177), -(63178), -(63179), -(63180), -(63183), -(63184), -(63185), -(63216), -(63221), -(63226), -(63228), -(63233), -(63240), -(63242), -(63259), -(63276), -(63278), -(63301), -(63311), -(63313), -(63314), -(63315), -(63316), -(63336), -(63337), -(63338), -(63344), -(63345), -(63356), -(63359), -(63361), -(63362), -(63363), -(63380), -(63382), -(63413), -(63416), -(63418), -(63459), -(63462), -(63463), -(63464), -(63465), -(63466), -(63468), -(63477), -(63479), -(63487), -(63493), -(63494), -(63495), -(63511), -(63518), -(63519), -(63529), -(63535), -(63536), -(63544), -(63549), -(63550), -(63551), -(63553), -(63556), -(63559), -(63562), -(63564), -(63569), -(63571), -(63573), -(63575), -(63599), -(63605), -(63612), -(63615), -(63619), -(63652), -(63653), -(63654), -(63655), -(63661), -(63668), -(63669), -(63670), -(63671), -(63672), -(63673), -(63675), -(63678), -(63685), -(63689), -(63691), -(63699), -(63700), -(63716), -(63728), -(63736), -(63738), -(63754), -(63755), -(63759), -(63760), -(63789), -(63803), -(63804), -(63809), -(63815), -(63823), -(63825), -(63827), -(63845), -(63846), -(63852), -(63861), -(63913), -(63914), -(63915), -(63916), -(63917), -(63918), -(63919), -(63920), -(63921), -(63922), -(63923), -(63931), -(63980), -(63989), -(63993), -(63995), -(63997), -(63998), -(64003), -(64005), -(64006), -(64014), -(64024), -(64025), -(64026), -(64027), -(64028), -(64029), -(64030), -(64031), -(64032), -(64034), -(64036), -(64039), -(64044), -(64058), -(64065), -(64085), -(64090), -(64097), -(64102), -(64104), -(64107), -(64113), -(64114), -(64115), -(64119), -(64123), -(64128), -(64134), -(64136), -(64138), -(64142), -(64151), -(64152), -(64153), -(64156), -(64157), -(64159), -(64160), -(64186), -(64204), -(64211), -(64212), -(64213), -(64215), -(64230), -(64269), -(64324), -(64328), -(64330), -(64331), -(64332), -(64333), -(64334), -(64335), -(64336), -(64337), -(64338), -(64339), -(64342), -(64346), -(64363), -(64365), -(64367), -(64374), -(64375), -(64376), -(64377), -(64380), -(64382), -(64387), -(64388), -(64390), -(64391), -(64395), -(64396), -(64412), -(64413), -(64429), -(64430), -(64442), -(64467), -(64478), -(64496), -(64499), -(64501), -(64507), -(64528), -(64529), -(64535), -(64542), -(64552), -(64580), -(64583), -(64588), -(64590), -(64591), -(64592), -(64595), -(64627), -(64637), -(64638), -(64640), -(64646), -(64647), -(64648), -(64649), -(64654), -(64665), -(64666), -(64667), -(64668), -(64669), -(64674), -(64682), -(64686), -(64692), -(64696), -(64698), -(64699), -(64705), -(64719), -(64740), -(64757), -(64758), -(64759), -(64766), -(64768), -(64771), -(64773), -(64776), -(64780), -(64787), -(64795), -(64798), -(64801), -(64806), -(64807), -(64821), -(64841), -(64870), -(64874), -(64876), -(64888), -(64891), -(64903), -(64909), -(64918), -(64930), -(64953), -(64967), -(64970), -(64971), -(64974), -(64978), -(64991), -(65030), -(65031), -(65033), -(65035), -(65036), -(65038), -(65039), -(65040), -(65042), -(65054), -(65055), -(65056), -(65057), -(65058), -(65059), -(65061), -(65062), -(65071), -(65080), -(65081), -(65104), -(65111), -(65113), -(65122), -(65123), -(65131), -(65133), -(65147), -(65162), -(65201), -(65210), -(65240), -(65266), -(65280), -(65343), -(65351), -(65359), -(65360), -(65374), -(65378), -(65379), -(65386), -(65391), -(65392), -(65403), -(65431), -(65488), -(65490), -(65492), -(65502), -(65503), -(65512), -(65513), -(65516), -(65531), -(65532), -(65541), -(65542), -(65545), -(65546), -(65564), -(65565), -(65575), -(65576), -(65577), -(65634), -(65635), -(65636), -(65647), -(65648), -(65693), -(65694), -(65703), -(65720), -(65722), -(65723), -(65728), -(65729), -(65744), -(65754), -(65775), -(65778), -(65782), -(65790), -(65791), -(65799), -(65801), -(65807), -(65809), -(65810), -(65812), -(65813), -(65814), -(65815), -(65819), -(65820), -(65821), -(65825), -(65826), -(65854), -(65855), -(65856), -(65857), -(65859), -(65862), -(65863), -(65866), -(65867), -(65868), -(65877), -(65878), -(65881), -(65883), -(65918), -(65924), -(65926), -(65927), -(65929), -(65930), -(65931), -(65934), -(65935), -(65936), -(65940), -(65941), -(65954), -(65957), -(65960), -(65962), -(65970), -(65971), -(65972), -(65973), -(65974), -(65978), -(65987), -(65998), -(66003), -(66005), -(66007), -(66008), -(66009), -(66012), -(66017), -(66018), -(66019), -(66020), -(66021), -(66042), -(66043), -(66045), -(66047), -(66053), -(66054), -(66055), -(66056), -(66057), -(66063), -(66065), -(66066), -(66067), -(66068), -(66069), -(66070), -(66072), -(66075), -(66079), -(66081), -(66093), -(66095), -(66097), -(66099), -(66100), -(66104), -(66109), -(66112), -(66113), -(66114), -(66115), -(66116), -(66125), -(66126), -(66134), -(66154), -(66177), -(66188), -(66196), -(66197), -(66198), -(66206), -(66207), -(66209), -(66213), -(66215), -(66216), -(66217), -(66236), -(66237), -(66240), -(66243), -(66244), -(66245), -(66250), -(66259), -(66260), -(66261), -(66262), -(66265), -(66283), -(66285), -(66290), -(66291), -(66292), -(66293), -(66294), -(66295), -(66313), -(66326), -(66331), -(66334), -(66342), -(66359), -(66377), -(66378), -(66407), -(66408), -(66409), -(66410), -(66417), -(66420), -(66423), -(66425), -(66457), -(66460), -(66461), -(66474), -(66477), -(66479), -(66480), -(66481), -(66489), -(66493), -(66516), -(66528), -(66532), -(66533), -(66536), -(66537), -(66538), -(66548), -(66549), -(66588), -(66592), -(66593), -(66594), -(66595), -(66596), -(66613), -(66619), -(66620), -(66629), -(66638), -(66666), -(66668), -(66669), -(66686), -(66687), -(66688), -(66689), -(66716), -(66717), -(66719), -(66733), -(66735), -(66736), -(66742), -(66744), -(66765), -(66770), -(66773), -(66777), -(66784), -(66796), -(66797), -(66809), -(66813), -(66823), -(66824), -(66863), -(66867), -(66869), -(66879), -(66880), -(66887), -(66888), -(66890), -(66891), -(66892), -(66899), -(66903), -(66904), -(66922), -(66940), -(66941), -(66950), -(66951), -(66952), -(66953), -(66954), -(66955), -(66957), -(66958), -(66959), -(66960), -(66961), -(66962), -(66963), -(66964), -(66965), -(66972), -(66973), -(66974), -(66975), -(66976), -(66977), -(66978), -(66979), -(66988), -(66989), -(66990), -(66991), -(66992), -(66994), -(67029), -(67030), -(67031), -(67033), -(67035), -(67049), -(67050), -(67051), -(67073), -(67074), -(67075), -(67088), -(67089), -(67090), -(67097), -(67098), -(67099), -(67114), -(67148), -(67229), -(67235), -(67237), -(67247), -(67252), -(67253), -(67280), -(67289), -(67290), -(67309), -(67310), -(67311), -(67312), -(67313), -(67314), -(67324), -(67325), -(67330), -(67331), -(67333), -(67366), -(67372), -(67373), -(67387), -(67390), -(67477), -(67478), -(67479), -(67480), -(67481), -(67485), -(67518), -(67519), -(67528), -(67529), -(67530), -(67531), -(67532), -(67533), -(67534), -(67540), -(67542), -(67550), -(67554), -(67560), -(67573), -(67574), -(67577), -(67606), -(67607), -(67608), -(67612), -(67613), -(67614), -(67618), -(67619), -(67620), -(67624), -(67625), -(67626), -(67632), -(67633), -(67634), -(67650), -(67651), -(67652), -(67654), -(67655), -(67656), -(67674), -(67675), -(67676), -(67678), -(67679), -(67680), -(67686), -(67703), -(67708), -(67709), -(67710), -(67714), -(67718), -(67719), -(67721), -(67722), -(67724), -(67725), -(67730), -(67745), -(67749), -(67760), -(67767), -(67772), -(67773), -(67774), -(67793), -(67799), -(67810), -(67811), -(67817), -(67818), -(67819), -(67821), -(67823), -(67830), -(67834), -(67835), -(67836), -(67837), -(67838), -(67846), -(67847), -(67861), -(67862), -(67863), -(67878), -(67879), -(67880), -(67881), -(67882), -(67883), -(67884), -(67885), -(67891), -(67892), -(67905), -(67906), -(67907), -(67929), -(67930), -(67931), -(67932), -(67933), -(67934), -(67935), -(67936), -(67937), -(67938), -(67939), -(67940), -(67941), -(67942), -(67943), -(67944), -(67945), -(67946), -(67947), -(67948), -(67949), -(67951), -(67952), -(67953), -(67957), -(67958), -(67959), -(67965), -(67966), -(67967), -(67968), -(67969), -(67970), -(67971), -(67972), -(67973), -(67977), -(67978), -(67979), -(67980), -(67981), -(67982), -(67983), -(67984), -(67985), -(67988), -(67989), -(67990), -(67991), -(67992), -(67993), -(67994), -(67995), -(67996), -(67997), -(67998), -(67999), -(68003), -(68004), -(68005), -(68008), -(68009), -(68010), -(68011), -(68012), -(68013), -(68014), -(68015), -(68016), -(68017), -(68018), -(68019), -(68023), -(68024), -(68025), -(68026), -(68027), -(68028), -(68032), -(68033), -(68034), -(68035), -(68036), -(68037), -(68038), -(68039), -(68040), -(68042), -(68043), -(68044), -(68055), -(68073), -(68077), -(68078), -(68081), -(68088), -(68089), -(68090), -(68091), -(68092), -(68093), -(68094), -(68095), -(68096), -(68100), -(68101), -(68102), -(68106), -(68107), -(68108), -(68109), -(68110), -(68111), -(68112), -(68113), -(68114), -(68115), -(68116), -(68117), -(68118), -(68119), -(68120), -(68123), -(68124), -(68125), -(68130), -(68133), -(68134), -(68135), -(68136), -(68137), -(68138), -(68139), -(68140), -(68141), -(68148), -(68149), -(68150), -(68151), -(68152), -(68153), -(68154), -(68155), -(68156), -(68157), -(68158), -(68159), -(68272), -(68282), -(68284), -(68301), -(68306), -(68307), -(68310), -(68311), -(68313), -(68315), -(68317), -(68318), -(68319), -(68321), -(68328), -(68333), -(68334), -(68340), -(68341), -(68350), -(68357), -(68362), -(68363), -(68364), -(68365), -(68372), -(68391), -(68415), -(68458), -(68472), -(68478), -(68479), -(68498), -(68501), -(68502), -(68503), -(68504), -(68505), -(68550), -(68551), -(68586), -(68587), -(68588), -(68607), -(68621), -(68622), -(68623), -(68624), -(68625), -(68626), -(68627), -(68628), -(68629), -(68727), -(68753), -(68754), -(68755), -(68756), -(68757), -(68758), -(68762), -(68763), -(68764), -(68778), -(68781), -(68782), -(68783), -(68784), -(68788), -(68799), -(68812), -(68834), -(68839), -(68841), -(68843), -(68868), -(68879), -(68884), -(68900), -(68915), -(68927), -(68934), -(68948), -(68966), -(68971), -(68980), -(68982), -(68984), -(68985), -(68991), -(69000), -(69003), -(69021), -(69023), -(69028), -(69034), -(69038), -(69051), -(69058), -(69063), -(69065), -(69066), -(69067), -(69068), -(69088), -(69091), -(69124), -(69128), -(69130), -(69131), -(69133), -(69137), -(69138), -(69153), -(69155), -(69156), -(69158), -(69160), -(69172), -(69180), -(69181), -(69189), -(69190), -(69198), -(69200), -(69209), -(69210), -(69211), -(69212), -(69218), -(69222), -(69232), -(69243), -(69246), -(69274), -(69275), -(69276), -(69285), -(69308), -(69342), -(69352), -(69387), -(69389), -(69391), -(69397), -(69398), -(69403), -(69404), -(69405), -(69406), -(69409), -(69410), -(69416), -(69420), -(69427), -(69438), -(69445), -(69455), -(69483), -(69489), -(69492), -(69496), -(69497), -(69498), -(69499), -(69500), -(69501), -(69503), -(69504), -(69520), -(69528), -(69542), -(69543), -(69544), -(69548), -(69563), -(69564), -(69566), -(69567), -(69569), -(69570), -(69572), -(69573), -(69574), -(69576), -(69577), -(69578), -(69579), -(69581), -(69583), -(69603), -(69617), -(69623), -(69627), -(69633), -(69644), -(69651), -(69668), -(69672), -(69673), -(69675), -(69681), -(69692), -(69693), -(69696), -(69699), -(69710), -(69722), -(69724), -(69726), -(69729), -(69730), -(69731), -(69733), -(69734), -(69771), -(69772), -(69779), -(69828), -(69837), -(69856), -(69861), -(69866), -(69869), -(69871), -(69882), -(69889), -(69891), -(69892), -(69893), -(69896), -(69898), -(69899), -(69902), -(69903), -(69906), -(69910), -(69911), -(69912), -(69916), -(69917), -(69920), -(69923), -(69926), -(69927), -(69933), -(69956), -(69958), -(69961), -(69963), -(69967), -(69968), -(69969), -(69970), -(69972), -(69973), -(69974), -(69975), -(69984), -(69989), -(70002), -(70043), -(70070), -(70074), -(70080), -(70110), -(70119), -(70122), -(70126), -(70141), -(70144), -(70153), -(70161), -(70162), -(70182), -(70183), -(70191), -(70192), -(70196), -(70205), -(70208), -(70211), -(70213), -(70227), -(70269), -(70270), -(70271), -(70273), -(70275), -(70276), -(70277), -(70278), -(70279), -(70280), -(70281), -(70282), -(70285), -(70289), -(70292), -(70296), -(70302), -(70304), -(70308), -(70309), -(70320), -(70322), -(70327), -(70333), -(70337), -(70355), -(70361), -(70381), -(70386), -(70387), -(70388), -(70391), -(70393), -(70396), -(70400), -(70408), -(70409), -(70410), -(70423), -(70428), -(70429), -(70432), -(70435), -(70437), -(70445), -(70449), -(70451), -(70453), -(70495), -(70510), -(70516), -(70525), -(70538), -(70539), -(70540), -(70542), -(70583), -(70594), -(70599), -(70616), -(70639), -(70640), -(70645), -(70646), -(70648), -(70653), -(70656), -(70659), -(70698), -(70746), -(70751), -(70754), -(70772), -(70781), -(70802), -(70809), -(70821), -(70838), -(70856), -(70857), -(70858), -(70859), -(70860), -(70861), -(70864), -(70867), -(70886), -(70890), -(70895), -(70896), -(70897), -(70906), -(70917), -(70923), -(70928), -(70929), -(70942), -(70946), -(70964), -(70965), -(70971), -(70972), -(70973), -(70974), -(70980), -(71003), -(71004), -(71005), -(71006), -(71020), -(71021), -(71023), -(71038), -(71040), -(71041), -(71087), -(71089), -(71090), -(71103), -(71107), -(71108), -(71112), -(71116), -(71117), -(71119), -(71120), -(71121), -(71124), -(71126), -(71127), -(71129), -(71130), -(71131), -(71133), -(71135), -(71136), -(71138), -(71140), -(71141), -(71142), -(71143), -(71144), -(71145), -(71146), -(71148), -(71153), -(71154), -(71155), -(71157), -(71163), -(71164), -(71169), -(71203), -(71204), -(71237), -(71248), -(71253), -(71254), -(71257), -(71264), -(71289), -(71291), -(71296), -(71297), -(71298), -(71316), -(71317), -(71318), -(71319), -(71326), -(71327), -(71328), -(71330), -(71331), -(71335), -(71339), -(71340), -(71350), -(71361), -(71362), -(71363), -(71392), -(71405), -(71410), -(71420), -(71433), -(71434), -(71443), -(71446), -(71450), -(71459), -(71462), -(71466), -(71473), -(71475), -(71476), -(71477), -(71478), -(71479), -(71480), -(71488), -(71489), -(71490), -(71500), -(71501), -(71504), -(71510), -(71512), -(71522), -(71532), -(71533), -(71539), -(71544), -(71546), -(71547), -(71548), -(71549), -(71551), -(71552), -(71553), -(71554), -(71590), -(71591), -(71594), -(71595), -(71607), -(71623), -(71624), -(71625), -(71626), -(71646), -(71647), -(71686), -(71687), -(71688), -(71713), -(71715), -(71726), -(71727), -(71728), -(71729), -(71738), -(71745), -(71748), -(71750), -(71752), -(71757), -(71758), -(71759), -(71760), -(71778), -(71779), -(71780), -(71781), -(71782), -(71783), -(71784), -(71785), -(71786), -(71788), -(71789), -(71801), -(71806), -(71807), -(71815), -(71818), -(71819), -(71820), -(71821), -(71822), -(71823), -(71824), -(71825), -(71834), -(71838), -(71839), -(71841), -(71842), -(71847), -(71864), -(71866), -(71874), -(71879), -(71909), -(71923), -(71924), -(71925), -(71926), -(71927), -(71928), -(71930), -(71931), -(71932), -(71933), -(71934), -(71936), -(71937), -(71938), -(71951), -(71954), -(71955), -(71972), -(71988), -(72004), -(72005), -(72007), -(72008), -(72010), -(72021), -(72022), -(72023), -(72024), -(72057), -(72065), -(72066), -(72098), -(72106), -(72120), -(72121), -(72123), -(72124), -(72133), -(72163), -(72164), -(72166), -(72167), -(72171), -(72194), -(72196), -(72198), -(72208), -(72211), -(72218), -(72219), -(72222), -(72231), -(72258), -(72264), -(72265), -(72266), -(72267), -(72268), -(72269), -(72293), -(72301), -(72302), -(72303), -(72304), -(72313), -(72318), -(72319), -(72321), -(72322), -(72324), -(72326), -(72327), -(72329), -(72330), -(72333), -(72334), -(72335), -(72336), -(72360), -(72366), -(72367), -(72368), -(72369), -(72373), -(72400), -(72409), -(72410), -(72421), -(72422), -(72423), -(72424), -(72426), -(72427), -(72434), -(72437), -(72447), -(72448), -(72449), -(72451), -(72453), -(72457), -(72463), -(72465), -(72484), -(72485), -(72486), -(72487), -(72488), -(72489), -(72490), -(72491), -(72492), -(72501), -(72502), -(72503), -(72504), -(72531), -(72539), -(72540), -(72541), -(72551), -(72552), -(72553), -(72556), -(72558), -(72566), -(72567), -(72568), -(72569), -(72570), -(72571), -(72586), -(72588), -(72590), -(72597), -(72613), -(72617), -(72645), -(72671), -(72672), -(72688), -(72728), -(72756), -(72796), -(72797), -(72798), -(72804), -(72805), -(72806), -(72809), -(72810), -(72811), -(72847), -(72848), -(72865), -(72875), -(72876), -(72879), -(72883), -(72898), -(72901), -(72930), -(72960), -(72961), -(72963), -(72964), -(72965), -(72966), -(72967), -(72985), -(72995), -(73003), -(73040), -(73075), -(73076), -(73079), -(73395), -(73412), -(73488), -(73489), -(73491), -(73492), -(73499), -(73536), -(73574), -(73712), -(73771), -(73772), -(73782), -(73783), -(73784), -(73788), -(73789), -(73790), -(73797), -(73798), -(73799), -(73830), -(73832), -(73833), -(73879), -(73896), -(73906), -(73912), -(73913), -(73914), -(73943), -(73952), -(73985), -(74035), -(74046), -(74062), -(74080), -(74111), -(74162), -(74163), -(74164), -(74166), -(74184), -(74185), -(74222), -(74307), -(74325), -(74326), -(74327), -(74347), -(74367), -(74394), -(74395), -(74403), -(74404), -(74413), -(74414), -(74417), -(74421), -(74422), -(74424), -(74438), -(74445), -(74451), -(74453), -(74454), -(74470), -(74485), -(74502), -(74506), -(74507), -(74524), -(74562), -(74710), -(74749), -(74762), -(74768), -(74772), -(74774), -(74792), -(74797), -(74807), -(74812), -(74904), -(74905), -(74913), -(74978), -(74982), -(75055), -(75058), -(75082), -(75086), -(75088), -(75102), -(75159), -(75160), -(75161), -(75163), -(75168), -(75182), -(75185), -(75186), -(75188), -(75209), -(75213), -(75234), -(75314), -(75327), -(75329), -(75330), -(75331), -(75332), -(75362), -(75366), -(75367), -(75382), -(75383), -(75384), -(75412), -(75419), -(75421), -(75422), -(75423), -(75434), -(75459), -(75493), -(75494), -(75648), -(75731), -(75760), -(75780), -(75888), -(75889), -(75953), -(76096), -(76221), -(79187), -(79397); -CREATE TABLE `temp_cond_vals` -( - `spellId` INT(11), - `elseGroup` INT(11) AUTO_INCREMENT, - `entry` INT(11), - `dead` INT(11), - `errorTextId` INT(11), - `comment` VARCHAR(255), - PRIMARY KEY (`spellId`, `elseGroup`) -) ENGINE=MYISAM; - -CREATE TABLE `temp_item_spell` -( - `itemId` INT(11), - `spellId` INT(11), - PRIMARY KEY (`itemId`, `spellId`) -); - -CREATE TABLE `temp_item` -( - `itemId` INT(11), - PRIMARY KEY (`itemId`) -); - -INSERT INTO `temp_item` SELECT DISTINCT `SourceEntry` FROM `conditions` WHERE `SourceTypeOrReferenceId` = 18; -INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_1` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_1` IN (SELECT * FROM `temp_convert_spells`); -INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_2` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_2` IN (SELECT * FROM `temp_convert_spells`); -INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_3` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_3` IN (SELECT * FROM `temp_convert_spells`); -INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_4` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_4` IN (SELECT * FROM `temp_convert_spells`); -INSERT IGNORE INTO `temp_item_spell` SELECT `entry`, `spellid_5` FROM `item_template` WHERE `entry` IN (SELECT * FROM `temp_item`) AND `spellid_5` IN (SELECT * FROM `temp_convert_spells`); - -INSERT INTO `temp_cond_vals` (`spellId`, `entry`, `dead`, `errorTextId`, `comment`) SELECT DISTINCT (SELECT `spellId` FROM `temp_item_spell` WHERE `itemId` = `SourceEntry`), `ConditionValue2`, (`ConditionValue1` - 1), `ErrorTextId`, `Comment` FROM `conditions` -WHERE `SourceTypeOrReferenceId` = 18; - -#use CONDITION_OBJECT_ENTRY instead of CONDITION_ITEM_TARGET -INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `Comment`) -SELECT DISTINCT 17, 0, `spellId`, 0, `elseGroup` - 1, 31, 1, 3, `entry`, 0, 0, `errorTextId`, `comment` FROM `temp_cond_vals`; -#for CONDITION_ITEM_TARGET with ConditionValue1 = DEAD we're adding !CONDITION_ALIVE as a second requirement -INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `Comment`) -SELECT DISTINCT 17, 0, `spellId`, 0, `elseGroup` - 1, 36, 1, 0, 0, 0, 1, `errorTextId`, `comment` FROM `temp_cond_vals` WHERE `dead`; -#remove entries which could be converted by this sql -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 18 AND `SourceEntry` IN (SELECT `itemId` FROM `temp_item_spell`); -DROP TABLE `temp_convert_spells`; -DROP TABLE `temp_cond_vals`; -DROP TABLE `temp_item_spell`; -DROP TABLE `temp_item`; - -ALTER TABLE conditions DROP PRIMARY KEY; -ALTER TABLE conditions ADD PRIMARY KEY (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`); diff --git a/sql/updates/world/2012_02_16_01_world_conditions.sql b/sql/updates/world/2012_02_16_01_world_conditions.sql deleted file mode 100644 index 4bcf997b8e4..00000000000 --- a/sql/updates/world/2012_02_16_01_world_conditions.sql +++ /dev/null @@ -1,3 +0,0 @@ -UPDATE `conditions` SET ConditionValue3 = 0, ConditionTarget = 1 WHERE ConditionTypeOrReference = 1 AND ConditionValue3 = 1; -UPDATE `conditions` SET ConditionTypeOrReference = 31, ConditionValue2 = ConditionValue1, ConditionValue1 = 3, ConditionTarget = 1 WHERE ConditionTypeOrReference = 19; -UPDATE `conditions` SET ConditionTypeOrReference = 38, ConditionValue2 = 4, ConditionTarget = 1 WHERE ConditionTypeOrReference = 20; diff --git a/sql/updates/world/2012_02_17_00_world_waypoints.sql b/sql/updates/world/2012_02_17_00_world_waypoints.sql deleted file mode 100644 index 1cff86f5d51..00000000000 --- a/sql/updates/world/2012_02_17_00_world_waypoints.sql +++ /dev/null @@ -1,77 +0,0 @@ --- Pathing for Eye of Thrallmar -SET @NPC :=57585; -SET @PATH :=@NPC*10; -UPDATE `creature` SET `position_x`=203.191,`position_y`=2850.286,`position_z`=160.4257,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; -DELETE FROM `creature_addon` WHERE `guid`=@NPC; -INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); -DELETE FROM `waypoint_data` WHERE `id`=@PATH; -INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES -(@PATH,1,197.9876,2842.495,160.4257,0,0,0,100,0), -(@PATH,2,212.5493,2807.971,174.2035,0,0,0,100,0), -(@PATH,3,244.0748,2812.302,156.8424,0,0,0,100,0), -(@PATH,4,262.963,2839.935,173.5923,0,0,0,100,0), -(@PATH,5,249.0294,2865.575,155.9257,0,0,0,100,0), -(@PATH,6,223.3671,2870.441,169.5924,0,0,0,100,0), -(@PATH,7,203.191,2850.286,160.4257,0,0,0,100,0); - --- Pathing for Eye of Thrallmar -SET @NPC :=57586; -SET @PATH :=@NPC*10; -UPDATE `creature` SET `position_x`=210.6249,`position_y`=2809.285,`position_z`=208.7277,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; -DELETE FROM `creature_addon` WHERE `guid`=@NPC; -INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); -DELETE FROM `waypoint_data` WHERE `id`=@PATH; -INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES -(@PATH,1,213.0469,2809.036,207.1722,0,0,0,100,0), -(@PATH,2,223.5349,2797.282,213.4777,0,0,0,100,0), -(@PATH,3,238.895,2805.732,213.4777,0,0,0,100,0), -(@PATH,4,252.788,2818.183,213.4777,0,0,0,100,0), -(@PATH,5,255.2734,2839.056,213.4777,0,0,0,100,0), -(@PATH,6,245.0219,2851.84,213.4777,0,0,0,100,0), -(@PATH,7,229.2117,2860.19,213.4777,0,0,0,100,0), -(@PATH,8,213.6996,2851.376,206.5887,0,0,0,100,0), -(@PATH,9,204.457,2828.248,199.6443,0,0,0,100,0), -(@PATH,10,212.4397,2807.455,199.6443,0,0,0,100,0), -(@PATH,11,241.3802,2813.464,199.6443,0,0,0,100,0), -(@PATH,12,249.7797,2829.964,199.6443,0,0,0,100,0), -(@PATH,13,244.951,2854.129,199.6443,0,0,0,100,0), -(@PATH,14,221.8344,2856.781,199.6443,0,0,0,100,0), -(@PATH,15,210.7503,2837.578,199.6443,0,0,0,100,0), -(@PATH,16,210.6249,2809.285,208.7277,0,0,0,100,0); - --- Pathing for Eye of Thrallmar -SET @NPC :=57587; -SET @PATH :=@NPC*10; -UPDATE `creature` SET `position_x`=236.1859,`position_y`=2813.747,`position_z`=200.9708,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; -DELETE FROM `creature_addon` WHERE `guid`=@NPC; -INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); -DELETE FROM `waypoint_data` WHERE `id`=@PATH; -INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES -(@PATH,1,241.7692,2815.284,200.8042,0,0,0,100,0), -(@PATH,2,255.8273,2833.317,201.443,0,0,0,100,0), -(@PATH,3,247.4309,2853.592,205.1653,0,0,0,100,0), -(@PATH,4,223.9901,2858.107,208.5819,0,0,0,100,0), -(@PATH,5,208.0596,2843.793,192.3596,0,0,0,100,0), -(@PATH,6,213.9734,2816.793,188.4153,0,0,0,100,0), -(@PATH,7,236.1859,2813.747,200.9708,0,0,0,100,0); - --- Pathing for Eye of Thrallmar -SET @NPC :=57588; -SET @PATH :=@NPC*10; -UPDATE `creature` SET `position_x`=245.9259,`position_y`=2829.09,`position_z`=177.804,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; -DELETE FROM `creature_addon` WHERE `guid`=@NPC; -INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); -DELETE FROM `waypoint_data` WHERE `id`=@PATH; -INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES -(@PATH,1,251.6207,2841.322,177.804,0,0,0,100,0), -(@PATH,2,241.4914,2859.113,169.6652,0,0,0,100,0), -(@PATH,3,214.9913,2858.249,176.3595,0,0,0,100,0), -(@PATH,4,210.2245,2836.028,169.7762,0,0,0,100,0), -(@PATH,5,225.7556,2822.145,169.9707,0,0,0,100,0), -(@PATH,6,237.9712,2823.874,170.1096,0,0,0,100,0), -(@PATH,7,245.9259,2829.09,177.804,0,0,0,100,0); - -DELETE FROM `creature` WHERE `guid`=57589; -UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=16598; - - diff --git a/sql/updates/world/2012_02_18_00_world_spell_script_names.sql b/sql/updates/world/2012_02_18_00_world_spell_script_names.sql deleted file mode 100644 index 993fe3a2f38..00000000000 --- a/sql/updates/world/2012_02_18_00_world_spell_script_names.sql +++ /dev/null @@ -1,69 +0,0 @@ -DELETE FROM `spell_script_names` WHERE `spell_id` in (-100,-12162,13567,17251,23019,23448,23453,25860,28089,29200,29858,30458,30507,31225,35745,37674,39090,39093,39096,42784,43723,44875,47170,49357,50243,51582,51961,52759,52845,53808,54171,54577,55004,64385,-1464,-5308,12809,23881,-1454,-50286,8171,52041,52046,52047,52048,52049,52050,52059,52060,52061,52031,52033,52034,52035,52036,58778,58779,58780,60103,-49998,-66188,-47541,52375,59134,-62900,49560,62324,31890); -INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES -(-100,'spell_warr_charge'), -(-12162,'spell_warr_deep_wounds'), -(13567,'spell_gen_dummy_trigger'), -(17251,'spell_gen_spirit_healer_res'), -(23019,'spell_item_crystal_prison_dummy_dnd'), -(23448,'spell_gen_gadgetzan_transporter_backfire'), -(23453,'spell_gen_gnomish_transporter'), -(25860,'spell_item_reindeer_transformation'), -(28089,'spell_thaddius_polarity_shift'), -(29200,'spell_item_purify_helboar_meat'), -(29858,'spell_warl_soulshatter'), -(30458,'spell_item_nigh_invulnerability'), -(30507,'spell_item_poultryizer'), -(31225,'spell_item_shimmering_vessel'), -(35745,'spell_item_socrethars_stone'), -(37674,'spell_gen_chaos_blast'), -(39090,'spell_capacitus_polarity_charge'), -(39093,'spell_capacitus_polarity_charge'), -(39096,'spell_capacitus_polarity_shift'), -(42784,'spell_astromancer_wrath_of_the_astromancer'), -(43723,'spell_item_demon_broiled_surprise'), -(44875,'spell_item_complete_raptor_capture'), -(47170,'spell_item_impale_leviroth'), -(49357,'spell_item_brewfest_mount_transformation'), -(50243,'spell_item_teach_language'), -(51582,'spell_item_rocket_boots'), -(51961,'spell_item_chicken_cover'), -(52759,'spell_sha_ancestral_awakening_proc'), -(52845,'spell_item_brewfest_mount_transformation'), -(53808,'spell_item_pygmy_oil'), -(54577,'spell_item_uded'), -(54171,'spell_pal_divine_storm_dummy'), -(55004,'spell_item_nitro_boots'), -(64385,'spell_item_unusual_compass'), -(-1464,'spell_warr_slam'), -(-5308,'spell_warr_execute'), -(12809,'spell_warr_concussion_blow'), -(23881,'spell_warr_bloodthirst'), -(-1454,'spell_warl_life_tap'), -(-50286,'spell_dru_starfall_dummy'), -(8171,'spell_sha_cleansing_totem_pulse'), -(52041,'spell_sha_healing_stream_totem'), -(52046,'spell_sha_healing_stream_totem'), -(52047,'spell_sha_healing_stream_totem'), -(52048,'spell_sha_healing_stream_totem'), -(52049,'spell_sha_healing_stream_totem'), -(52050,'spell_sha_healing_stream_totem'), -(52059,'spell_sha_healing_stream_totem'), -(52060,'spell_sha_healing_stream_totem'), -(52061,'spell_sha_healing_stream_totem'), -(52031,'spell_sha_mana_spring_totem'), -(52033,'spell_sha_mana_spring_totem'), -(52034,'spell_sha_mana_spring_totem'), -(52035,'spell_sha_mana_spring_totem'), -(52036,'spell_sha_mana_spring_totem'), -(58778,'spell_sha_mana_spring_totem'), -(58779,'spell_sha_mana_spring_totem'), -(58780,'spell_sha_mana_spring_totem'), -(60103,'spell_sha_lava_lash'), -(-49998,'spell_dk_death_strike'), -(-66188,'spell_dk_death_strike'), -(-47541,'spell_dk_death_coil'), -(52375,'spell_dk_death_coil'), -(59134,'spell_dk_death_coil'), -(-62900,'spell_dk_death_coil'), -(49560,'spell_dk_death_grip'), -(62324,'spell_vehicle_throw_passenger'); diff --git a/sql/updates/world/2012_02_18_01_world_spell_dbc.sql b/sql/updates/world/2012_02_18_01_world_spell_dbc.sql deleted file mode 100644 index b343399d7f2..00000000000 --- a/sql/updates/world/2012_02_18_01_world_spell_dbc.sql +++ /dev/null @@ -1,3 +0,0 @@ -DELETE FROM `spell_dbc` WHERE `id`=31980; -INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES -(31980,0,0,328064,1024,4,268894208,0,0,0,0,0,0,0,1,0,0,101,0,0,14,14,0,13,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,15,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,4,0,0,0,0,1,0,0,0,1,"Righteous Defense Trigger Spell"); diff --git a/sql/updates/world/2012_02_18_02_world_gossip.sql b/sql/updates/world/2012_02_18_02_world_gossip.sql deleted file mode 100644 index c72532e3f21..00000000000 --- a/sql/updates/world/2012_02_18_02_world_gossip.sql +++ /dev/null @@ -1,52 +0,0 @@ --- Gossip for Lore Keeper of Norgannon "Uldaman" for quest 2278 "The Platinum Discs" -UPDATE `creature_template` SET `gossip_menu_id`=562 WHERE `entry`=7172; - --- SAI for Lore Keeper of Norgannon -SET @ENTRY := 7172; -UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; -DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES -(@ENTRY,0,0,1,62,0,100,0,576,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Lore Keeper of Norgannon - On gossip option select - close gossip'), -(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,26,2278,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Lore Keeper of Norgannon - On gossip option select - give quest credit'); - -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=562 AND `SourceEntry`=0; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(15,562,0,0,9,2278,0,0,0,'','Show gossip option if player has quest 2278 but not complete'); - -DELETE FROM `gossip_menu` WHERE `entry` BETWEEN 561 AND 576; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES -(561,1080), -(562,1079), -(563,1081), -(564,1082), -(565,1083), -(566,1084), -(567,1085), -(568,1086), -(569,1087), -(570,1088), -(571,1089), -(572,1090), -(573,1091), -(574,1092), -(575,1093), -(576,1094); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 561 AND 576; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(561,0,0,'What is a "subterranean being matrix"?',1,1,563,0,0,0,''), -(562,0,0,'Who are the Earthen?',1,1,561,0,0,0,''), -(563,0,0,'What are the anomalies you speak of?',1,1,564,0,0,0,''), -(564,0,0,'What is a "resilient foundation of construction"?',1,1,565,0,0,0,''), -(565,0,0,'So... the Earthen were made out of stone?',1,1,566,0,0,0,''), -(566,0,0,'Anything else I should know about the Earthen?',1,1,567,0,0,0,''), -(567,0,0,'I think I understand the Creators'' design intent for the Earthen now. What are the Earthen''s anomalies that you spoke of earlier?',1,1,568,0,0,0,''), -(568,0,0,'What high-stress environments would cause the Earthen to destabilize?',1,1,569,0,0,0,''), -(569,0,0,'What happens when the Earthen destabilize?',1,1,570,0,0,0,''), -(570,0,0,'Troggs?! Are the troggs you mention the same as the ones in the world today?',1,1,571,0,0,0,''), -(571,0,0,'You mentioned two results when the Earthen destabilize. What is the second?',1,1,572,0,0,0,''), -(572,0,0,'Dwarves!!! Now you''re telling me that dwarves originally came from the Earthen?!',1,1,573,0,0,0,''), -(573,0,0,'These dwarves are the same ones today, yes? Do dwarves maintain any other links to the Earthen?',1,1,574,0,0,0,''), -(574,0,0,'Who are the Creators?',1,1,575,0,0,0,''), -(575,0,0,'This is a lot to think about.',1,1,576,0,0,0,''), -(576,0,0,'I will access the discs now.',1,1,0,0,0,0,''); \ No newline at end of file diff --git a/sql/updates/world/2012_02_18_03_world_gossip.sql b/sql/updates/world/2012_02_18_03_world_gossip.sql deleted file mode 100644 index 990006f5098..00000000000 --- a/sql/updates/world/2012_02_18_03_world_gossip.sql +++ /dev/null @@ -1,1068 +0,0 @@ --- XXXXXXXXXXXXXXXXXXXX --- X Rogue Trainers X --- XXXXXXXXXXXXXXXXXXXX - -UPDATE `creature_template` SET `gossip_menu_id`=410 WHERE `entry`=1234; -UPDATE `creature_template` SET `gossip_menu_id`=85 WHERE `entry`=2122; -UPDATE `creature_template` SET `gossip_menu_id`=3984 WHERE `entry`=6707; -UPDATE `creature_template` SET `gossip_menu_id`=4512 WHERE `entry`=3328; -UPDATE `creature_template` SET `gossip_menu_id`=4575 WHERE `entry`=4215; -UPDATE `creature_template` SET `gossip_menu_id`=4577 WHERE `entry`=4214; -UPDATE `creature_template` SET `gossip_menu_id`=4658 WHERE `entry`=1411; - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 85; -SET @TEXTYES := 581; -SET @TEXTNO := 4796; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 141; -SET @TEXTYES := 638; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 381; -SET @TEXTYES := 878; -SET @TEXTNO := 4799; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I am in need of training, Keryn.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 410; -SET @TEXTYES := 4795; -SET @TEXTNO := 4797; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 411; -SET @TEXTYES := 908; -SET @TEXTNO := 4798; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Good day, Hulfdan, I am looking for training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 436; -SET @TEXTYES := 934; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Hello! I am a Rogue in need of training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 3984; -SET @TEXTYES := 4838; -SET @TEXTNO := 4839; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Yes, I have. Teach me.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4502; -SET @TEXTYES := 4835; -SET @TEXTNO := 4837; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4512; -SET @TEXTYES := 638; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4513; -SET @TEXTYES := 638; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4540; -SET @TEXTYES := 581; -SET @TEXTNO := 4796; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4541; -SET @TEXTYES := 581; -SET @TEXTNO := 4796; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4542; -SET @TEXTYES := 581; -SET @TEXTNO := 4796; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I would like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4561; -SET @TEXTYES := 5695; -SET @TEXTNO := 4833; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I'm lookin' for rogue trainin'.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4562; -SET @TEXTYES := 4834; -SET @TEXTNO := 4833; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I'm lookin' for rogue trainin'.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4575; -SET @TEXTYES := 4795; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4576; -SET @TEXTYES := 4795; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4577; -SET @TEXTYES := 4795; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4658; -SET @TEXTYES := 6165; -SET @TEXTNO := 6164; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4659; -SET @TEXTYES := 4835; -SET @TEXTNO := 4837; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4676; -SET @TEXTYES := 4835; -SET @TEXTNO := 4833; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 4690; -SET @TEXTYES := 4795; -SET @TEXTNO := 4793; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 5061; -SET @TEXTYES := 4835; -SET @TEXTNO := 4837; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Can you train me how to use rogue skills?",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- Gossip Condition for Rogue Trainers -SET @GOSSIP := 6650; -SET @TEXTYES := 9188; -SET @TEXTNO := 9187; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,8,0,0,0,'','Show gossip text if player is a Rogue'), -(14,@GOSSIP,@TEXTNO,0,15,1527,0,0,0,'','Show gossip text if player is not a Rogue'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I require rogue training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''), -(@GOSSIP,4,0,"",1,1,0,0,0,0,''); - --- XXXXXXXXXXXXXXXXXXXXX --- X Hunter Trainers X --- XXXXXXXXXXXXXXXXXXXXX - -UPDATE `creature_template` SET `gossip_menu_id`=4657 WHERE `entry`=1404; -UPDATE `creature_template` SET `gossip_menu_id`=4695 WHERE `entry`=3596; -UPDATE `creature_template` SET `gossip_menu_id`=4009 WHERE `entry`=3601; -UPDATE `creature_template` SET `gossip_menu_id`=6652 WHERE `entry`=16672; -UPDATE `creature_template` SET `gossip_menu_id`=4101 WHERE `entry`=987; - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4008; -SET @TEXTYES := 4863; -SET @TEXTNO := 4993; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I'd like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4009; -SET @TEXTYES := 4316; -SET @TEXTNO := 4993; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I am in need of training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4010; -SET @TEXTYES := 4866; -SET @TEXTNO := 5003; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I have come for training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4011; -SET @TEXTYES := 4867; -SET @TEXTNO := 4998; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I am in need of training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4012; -SET @TEXTYES := 4868; -SET @TEXTNO := 4998; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I am a hunter and wish to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4017; -SET @TEXTYES := 4888; -SET @TEXTNO := 4888; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"Please train me.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4023; -SET @TEXTYES := 4889; -SET @TEXTNO := 4996; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I wish to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4101; -SET @TEXTYES := 5001; -SET @TEXTNO := 5002; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4472; -SET @TEXTYES := 4893; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4473; -SET @TEXTYES := 4893; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4474; -SET @TEXTYES := 4893; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4506; -SET @TEXTYES := 4987; -SET @TEXTNO := 5004; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I wish to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4524; -SET @TEXTYES := 4997; -SET @TEXTNO := 4998; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4549; -SET @TEXTYES := 4999; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4550; -SET @TEXTYES := 4890; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I am here for training.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4551; -SET @TEXTYES := 4999; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4647; -SET @TEXTYES := 4997; -SET @TEXTNO := 4998; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4648; -SET @TEXTYES := 4987; -SET @TEXTNO := 5004; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I wish to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4657; -SET @TEXTYES := 5001; -SET @TEXTNO := 5002; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4675; -SET @TEXTYES := 4999; -SET @TEXTNO := 5000; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4693; -SET @TEXTYES := 6160; -SET @TEXTNO := 4993; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I'd like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 4695; -SET @TEXTYES := 4863; -SET @TEXTNO := 4993; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I'd like to train.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 6652; -SET @TEXTYES := 9190; -SET @TEXTNO := 9189; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 7262; -SET @TEXTYES := 8585; -SET @TEXTNO := 8586; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I seek training in the ways of the Hunter.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Gossip Condition for Hunter Trainers -SET @GOSSIP := 7368; -SET @TEXTYES := 8804; -SET @TEXTNO := 8823; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,@GOSSIP,@TEXTYES,0,15,4,0,0,0,'','Show gossip text if player is a Hunter'), -(14,@GOSSIP,@TEXTNO,0,15,1531,0,0,0,'','Show gossip text if player is not a Hunter'); --- Add Any Missing Gossip Menu item -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTYES; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTYES); -DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=@TEXTNO; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (@GOSSIP,@TEXTNO); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE menu_id=@GOSSIP; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(@GOSSIP,0,3,"I am a hunter in need of training, Acteon.",5,16,0,0,0,0,''), -(@GOSSIP,1,0,"I wish to unlearn my talents.",16,16,4461,0,0,0,''), -(@GOSSIP,2,0,"I wish to know about Dual Talent Specialization.",1,1,10371,0,0,0,''); - --- Add some missing gossip from sniff for Zabra'jin in Zangermarsh -UPDATE `creature_template` SET `gossip_menu_id`=7601 WHERE `entry`=18013; -UPDATE `creature_template` SET `gossip_menu_id`=7602 WHERE `entry`=18014; -UPDATE `creature_template` SET `gossip_menu_id`=7608 WHERE `entry`=18015; -UPDATE `creature_template` SET `gossip_menu_id`=7603 WHERE `entry`=18017; -UPDATE `creature_template` SET `gossip_menu_id`=7609 WHERE `entry`=18018; -UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=18244; -UPDATE `creature_template` SET `gossip_menu_id`=7722 WHERE `entry`=18564; - -DELETE FROM `gossip_menu` WHERE `entry` IN (7601,7602,7603,7608,7609,7722,7946,9821); -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES -(7601,9248),(7602,9249),(7603,9250),(7608,9259), -(7609,9260),(7722,9431),(7946,9752),(9821,13584); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7603,7608,7609) AND `id` IN (0); -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7609,7722,9821) AND `id` IN (1); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(7603,0,1,'I would like to buy from you.',3,128,0,0,0,0,''), -(7608,0,1,'I wish to purchase tradeskill supplies.',3,128,0,0,0,0,''), -(7609,0,1,'I wish to purchase fishing supplies.',3,128,0,0,0,0,''), -(7609,1,3,'Give me some pointers on my fishing technique.',5,16,0,0,0,0,''), -(7722,1,1,'I have marks to redeem!',3,128,0,0,0,0,''), -(9821,1,1,'I''m looking for a lost companion.',14,4194304,0,0,0,0,''); - --- Add some missing gossip from sniff for Thunderlord Stronghold in Blade's Edge Mountains -UPDATE `creature_template` SET `gossip_menu_id`=9856 WHERE `entry`=19471; -UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=19476; -UPDATE `creature_template` SET `gossip_menu_id`=5856 WHERE `entry`=19478; -UPDATE `creature_template` SET `gossip_menu_id`=8283 WHERE `entry`=21311; -UPDATE `creature_template` SET `gossip_menu_id`=8406 WHERE `entry`=21950; -UPDATE `creature_template` SET `gossip_menu_id`=8244 WHERE `entry`=21147; -UPDATE `creature_template` SET `gossip_menu_id`=8525 WHERE `entry`=21984; -UPDATE `creature_template` SET `gossip_menu_id`=8239 WHERE `entry`=21117; - -DELETE FROM `gossip_menu` WHERE `entry` IN (8283,8406,8244,8525,8239); -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES -(8283,10322),(8406,10508),(8244,10259),(8525,10661),(8239,10251); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9856) AND `id` IN (0); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(9856,0,1,'Show me what you have for sale.',3,128,0,0,0,0,''); - diff --git a/sql/updates/world/2012_02_18_04_world_spell_script_names.sql b/sql/updates/world/2012_02_18_04_world_spell_script_names.sql deleted file mode 100644 index 8fa5bc55197..00000000000 --- a/sql/updates/world/2012_02_18_04_world_spell_script_names.sql +++ /dev/null @@ -1,6 +0,0 @@ -DELETE FROM `spell_script_names` WHERE `spell_id` IN (52059,52060,52061); -DELETE FROM `spell_script_names` WHERE `spell_id` IN (58759,58760,58761); -INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES -(58759,'spell_sha_healing_stream_totem'), -(58760,'spell_sha_healing_stream_totem'), -(58761,'spell_sha_healing_stream_totem'); diff --git a/sql/updates/world/2012_02_18_05_world_creatures.sql b/sql/updates/world/2012_02_18_05_world_creatures.sql deleted file mode 100644 index 3fdac99c854..00000000000 --- a/sql/updates/world/2012_02_18_05_world_creatures.sql +++ /dev/null @@ -1,3 +0,0 @@ -UPDATE `creature` SET `MovementType`=1 WHERE `spawndist`!=0 AND `MovementType`=2 AND `guid` IN (49123,49124,49125,49127,49128,49129,49143,49144,49145,49146,49150,49151,49154,49156,49157,49158,49167,49186,49187,49188,49318,49319,49664,49665,49751,49762,51398,51402,51422,51423,123148,127753,137490,137491,202314); -UPDATE `creature` SET `MovementType`=0 WHERE `spawndist`=0 AND `MovementType`=2 AND `guid` IN (49123,49124,49125,49127,49128,49129,49143,49144,49145,49146,49150,49151,49154,49156,49157,49158,49167,49186,49187,49188,49318,49319,49664,49665,49751,49762,51398,51402,51422,51423,123148,127753,137490,137491,202314); -UPDATE `creature_template` SET `MovementType`=0 WHERE `MovementType`=2 AND `entry` NOT IN (21657,30007); diff --git a/sql/updates/world/2012_02_18_06_world_gossip.sql b/sql/updates/world/2012_02_18_06_world_gossip.sql deleted file mode 100644 index e3385ceb5b0..00000000000 --- a/sql/updates/world/2012_02_18_06_world_gossip.sql +++ /dev/null @@ -1,166 +0,0 @@ --- Add some missing gossip to Nagrand From UDB -UPDATE `creature_template` SET `gossip_menu_id`=7675 WHERE `entry`=18261; -UPDATE `creature_template` SET `gossip_menu_id`=7723 WHERE `entry`=18333; -UPDATE `creature_template` SET `gossip_menu_id`=7719 WHERE `entry`=18417; -UPDATE `creature_template` SET `gossip_menu_id`=7724 WHERE `entry`=18581; -UPDATE `creature_template` SET `gossip_menu_id`=7625 WHERE `entry`=18265; -UPDATE `creature_template` SET `gossip_menu_id`=7626 WHERE `entry`=18276; -UPDATE `creature_template` SET `gossip_menu_id`=7631 WHERE `entry`=18335; -UPDATE `creature_template` SET `gossip_menu_id`=7699 WHERE `entry`=18471; -UPDATE `creature_template` SET `gossip_menu_id`=7563 WHERE `entry`=18074; -UPDATE `creature_template` SET `gossip_menu_id`=7592 WHERE `entry`=18200; -UPDATE `creature_template` SET `gossip_menu_id`=7579 WHERE `entry`=18180; -UPDATE `creature_template` SET `gossip_menu_id`=7607 WHERE `entry`=18218; -UPDATE `creature_template` SET `gossip_menu_id`=7704 WHERE `entry`=18482; -UPDATE `creature_template` SET `gossip_menu_id`=8493, `npcflag`=`npcflag`|1 WHERE `entry`=22113; - -DELETE FROM `gossip_menu` WHERE `entry`=7563 AND `text_id`=9181; -DELETE FROM `gossip_menu` WHERE `entry`=7578 AND `text_id`=9220; -DELETE FROM `gossip_menu` WHERE `entry`=7579 AND `text_id` IN (9219,9221,9256,9257); -DELETE FROM `gossip_menu` WHERE `entry`=7592 AND `text_id` IN (9240,9283,9284); -DELETE FROM `gossip_menu` WHERE `entry`=7607 AND `text_id` IN (9258,9286); -DELETE FROM `gossip_menu` WHERE `entry`=7625 AND `text_id`=9287; -DELETE FROM `gossip_menu` WHERE `entry`=7626 AND `text_id`=9288; -DELETE FROM `gossip_menu` WHERE `entry`=7631 AND `text_id`=9312; -DELETE FROM `gossip_menu` WHERE `entry`=7675 AND `text_id` IN (9361,9369); -DELETE FROM `gossip_menu` WHERE `entry`=7676 AND `text_id`=9368; -DELETE FROM `gossip_menu` WHERE `entry`=7677 AND `text_id`=9367; -DELETE FROM `gossip_menu` WHERE `entry`=7678 AND `text_id`=9366; -DELETE FROM `gossip_menu` WHERE `entry`=7679 AND `text_id`=9365; -DELETE FROM `gossip_menu` WHERE `entry`=7680 AND `text_id`=9364; -DELETE FROM `gossip_menu` WHERE `entry`=7681 AND `text_id`=9363; -DELETE FROM `gossip_menu` WHERE `entry`=7682 AND `text_id`=9362; -DELETE FROM `gossip_menu` WHERE `entry`=7699 AND `text_id`=9394; -DELETE FROM `gossip_menu` WHERE `entry`=7704 AND `text_id`=9405; -DELETE FROM `gossip_menu` WHERE `entry`=7705 AND `text_id`=9406; -DELETE FROM `gossip_menu` WHERE `entry`=7714 AND `text_id`=9424; -DELETE FROM `gossip_menu` WHERE `entry`=7715 AND `text_id`=9423; -DELETE FROM `gossip_menu` WHERE `entry`=7716 AND `text_id`=9422; -DELETE FROM `gossip_menu` WHERE `entry`=7717 AND `text_id`=9421; -DELETE FROM `gossip_menu` WHERE `entry`=7718 AND `text_id`=9420; -DELETE FROM `gossip_menu` WHERE `entry`=7719 AND `text_id` IN (9419,9427); -DELETE FROM `gossip_menu` WHERE `entry`=7723 AND `text_id`=9429; -DELETE FROM `gossip_menu` WHERE `entry`=7724 AND `text_id`=9433; -DELETE FROM `gossip_menu` WHERE `entry`=8393 AND `text_id`=10493; -DELETE FROM `gossip_menu` WHERE `entry`=8394 AND `text_id`=10492; -DELETE FROM `gossip_menu` WHERE `entry`=8394 AND `text_id`=10614; -- was incorrect in the db -DELETE FROM `gossip_menu` WHERE `entry`=8395 AND `text_id`=10494; -DELETE FROM `gossip_menu` WHERE `entry`=8395 AND `text_id`=10615; -- was incorrect in the db -DELETE FROM `gossip_menu` WHERE `entry`=8396 AND `text_id`=10495; -DELETE FROM `gossip_menu` WHERE `entry`=8396 AND `text_id`=10616; -- was incorrect in the db -DELETE FROM `gossip_menu` WHERE `entry`=8398 AND `text_id`=10497; -DELETE FROM `gossip_menu` WHERE `entry`=8493 AND `text_id` IN (10606,10655,10854); -DELETE FROM `gossip_menu` WHERE `entry`=8497 AND `text_id`=10616; -DELETE FROM `gossip_menu` WHERE `entry`=8498 AND `text_id`=10615; -DELETE FROM `gossip_menu` WHERE `entry`=8499 AND `text_id`=10614; -DELETE FROM `gossip_menu` WHERE `entry` BETWEEN 21296 AND 21303; -- the old menus assigned to Lantresor which were not sniffed -DELETE FROM `gossip_menu` WHERE `entry` BETWEEN 21304 AND 21309; -- the old menus assigned to Altruis which were not sniffed -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES -(7563,9181), -(7578,9220), -(7579,9219),(7579,9221),(7579,9256),(7579,9257), -(7592,9240),(7592,9283),(7592,9284), -(7625,9287), -(7626,9288), -(7631,9312), -(7699,9394), -(7607,9258),(7607,9286), -(7675,9361),(7675,9369), -(7676,9368), -(7677,9367), -(7678,9366), -(7679,9365), -(7680,9364), -(7681,9363), -(7682,9362), -(7704,9405), -(7705,9406), -(7714,9424), -(7715,9423), -(7716,9422), -(7717,9421), -(7718,9420), -(7719,9419),(7719,9427), -(7723,9429), -(7724,9433), -(8394,10492), -(8393,10493), -(8395,10494), -(8396,10495), -(8398,10497), -(8493,10606),(8493,10655),(8493,10854), -(8497,10616), -(8498,10615), -(8499,10614); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7579,7704,7715,7716,7717,7718,7719,8393,8394,8395,8396,8398,8497,8498,8499) AND `id`=0; -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7719,7724) AND `id`=1; -DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 7675 AND 7682 AND `id`=0; -UPDATE `gossip_menu_option` SET `action_menu_id`=8499 WHERE `menu_id`=8397; -- was incorrect -DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 21296 AND 21303; -- the old options assigned to Lantresor which were not sniffed -DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN 21304 AND 21309; -- the old options assigned to Altruis which was not sniffed -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(7579,0,0,'Hemet Nesingwary, what are you doing here in the Outland?',1,1,7578,0,0,0,''), -(7704,0,0,'Empoor, you''re going to tell me what I want to know, or else!',1,1,0,0,0,0,''), -(7715,0,0,'Forge camps?',1,1,7714,0,0,0,''), -(7716,0,0,'How do you see them now?',1,1,7715,0,0,0,''), -(7717,0,0,'And now?',1,1,7716,0,0,0,''), -(7718,0,0,'Legion?',1,1,7717,0,0,0,''), -(7719,0,0,'I see twisted steel and smell sundered earth.',1,1,7718,0,0,0,''), -(7719,1,0,'Tell me about the demon hunter training grounds at the Ruins of Karabor.',1,1,8394,0,0,0,''), -(7724,1,1,'I have marks to redeem!',3,128,0,0,0,0,''), -(7675,0,0,'I have killed many of your ogres, Lantresor. I have no fear.',1,1,7682,0,0,0,''), -(7682,0,0,'Should I know? You look like an orc to me.',1,1,7681,0,0,0,''), -(7681,0,0,'And the other half?',1,1,7680,0,0,0,''), -(7680,0,0,'I have heard of your kind, but I never thought to see the day when I would meet a half-breed.',1,1,7679,0,0,0,''), -(7679,0,0,'My apologies. I did not mean to offend. I am here on behalf of my people.',1,1,7678,0,0,0,''), -(7678,0,0,'My people ask that you pull back your Boulderfist ogres and cease all attacks on our territories. In return, we will also pull back our forces.',1,1,7677,0,0,0,''), -(7677,0,0,'We will fight you until the end, then, Lantresor. We will not stand idly by as you pillage our towns and kill our people.',1,1,7676,0,0,0,''), -(7676,0,0,'What do I need to do?',1,1,0,0,0,0,''), -(8394,0,0,'I''m listening.',1,1,8393,0,0,0,''), -(8393,0,0,'Go on, please.',1,1,8395,0,0,0,''), -(8395,0,0,'Interesting.',1,1,8396,0,0,0,''), -(8396,0,0,'That''s quite a story.',1,1,8398,0,0,0,''), -(8398,0,0,'There was something else I wanted to ask you, Altruis.',1,1,7719,0,0,0,''), -(8499,0,0,'But you are dragons! How could orcs do this to you?',1,1,8498,0,0,0,''), -(8498,0,0,'Your mate?',1,1,8497,0,0,0,''), -(8497,0,0,'I have battled many beasts, dragon. I will help you.',1,1,0,0,0,0,''); - -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7579 AND `SourceEntry` IN (9221,9256,9257); -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7592 AND `SourceEntry` IN (9283,9284); -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7607 AND `SourceEntry`=9286; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7675 AND `SourceEntry`=9369; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7719 AND `SourceEntry`=9427; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=8493 AND `SourceEntry` IN (10655,10854); -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7675 AND `SourceEntry`=0; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (7704,7719) AND `SourceEntry`=0; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (7719) AND `SourceEntry`=1; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21304; -- condition for Altruis' gossip that wasn't sniffed -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21295; -- condition for Lantresor's gossip that wasn't sniffed -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,7579,9221,0,0,8,208,0,0,0,0,'','Show different gossip if player has rewarded quest 208'), -(14,7579,9256,0,0,8,9851,0,0,0,0,'','Show different gossip if player has rewarded quest 9851'), -(14,7579,9257,0,0,8,9852,0,0,0,0,'','Show different gossip if player has rewarded quest 9852'), -(14,7592,9283,0,0,8,9854,0,0,0,0,'','Show different gossip if player has rewarded quest 9854'), -(14,7592,9284,0,0,8,9856,0,0,0,0,'','Show different gossip if player has rewarded quest 9856'), -(14,7607,9286,0,0,8,9859,0,0,0,0,'','Show different gossip if player has rewarded quest 9859'), -(14,7675,9369,0,0,8,10107,0,0,0,0,'','Show different gossip if player has rewarded quest 10107'), -(14,7675,9369,0,1,8,10108,0,0,0,0,'','Show different gossip if player has rewarded quest 10108'), -(14,7719,9427,0,0,8,9991,0,0,0,0,'','Show different gossip if player has rewarded quest 9991'), -(14,8493,10655,0,0,8,10870,0,0,0,0,'','Show different gossip if player has rewarded quest 10870'), -(14,8493,10854,0,0,8,11012,0,0,0,0,'','Show different gossip if player has rewarded quest 11012'), -(15,7675,0,0,0,9,10107,0,0,0,0,'','Show gossip option if player has quest 10107 but not complete'), -(15,7675,0,0,1,9,10108,0,0,0,0,'','Show gossip option if player has quest 10108 but not complete'), -(15,7704,0,0,0,9,9978,0,0,0,0,'','Show gossip option if player has quest 9978 but not complete'), -(15,7719,0,0,0,8,9991,0,0,1,0,'','Show gossip option if player has not rewarded quest 9991'), -(15,7719,1,0,0,9,10646,0,0,0,0,'','Show gossip option if player has quest 10646 but not complete'); - -UPDATE `smart_scripts` SET `event_param1`=7715 WHERE `entryorguid`=18417 AND `id` IN (0,1); -- correct Altruis' script -UPDATE `smart_scripts` SET `event_param1`=8396 WHERE `entryorguid`=18417 AND `id`=2; - -UPDATE `smart_scripts` SET `event_param1`=8497 WHERE `entryorguid`=21657 AND `id`=0; -- correct Neltharaku's script - -UPDATE `smart_scripts` SET `link`=3, `event_param1`=7676 WHERE `entryorguid`=18261 AND `id` IN (1,2); -- correct Lantresor's script -DELETE FROM `smart_scripts` WHERE `entryorguid`=18261 AND `id`=3; -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES -(18261,0,3,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Lantresor - On gossip select - Close gossip'); diff --git a/sql/updates/world/2012_02_18_07_world_gossip.sql b/sql/updates/world/2012_02_18_07_world_gossip.sql deleted file mode 100644 index 6246f12cefc..00000000000 --- a/sql/updates/world/2012_02_18_07_world_gossip.sql +++ /dev/null @@ -1,44 +0,0 @@ --- Fallen Hero of the Horde http://old.wowhead.com/npc=7572 -DELETE FROM `gossip_menu` WHERE `entry`=840 AND `text_id`=1451; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (840,1451); -DELETE FROM `gossip_menu` WHERE `entry`=880 AND `text_id`=1452; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (880,1452); -DELETE FROM `gossip_menu` WHERE `entry`=881 AND `text_id`=1456; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (881,1456); -DELETE FROM `gossip_menu` WHERE `entry`=882 AND `text_id`=1455; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (882,1455); -DELETE FROM `gossip_menu` WHERE `entry`=883 AND `text_id`=1454; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (883,1454); -DELETE FROM `gossip_menu` WHERE `entry`=884 AND `text_id`=1453; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (884,1453); --- Text Conditions -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=840 AND `SourceEntry` IN (1391); -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,840,1391,0,8,2784,0,0,0,'','Show gossip text if player has quest 2801 or 2784 completed'), -- It's hard to imagine that so much death and despair could be confined to such a small area; yet beyond the swamp is a land plagued by chaos and destruction.$B$BWatch your step, adventurer. The Blasted Lands are the final resting place to far greater beings than you. -(14,840,1391,1,8,2801,0,0,0,'','Show gossip text if player has quest 2801 or 2784 completed'); -- It's hard to imagine that so much death and despair could be confined to such a small area; yet beyond the swamp is a land plagued by chaos and destruction.$B$BWatch your step, adventurer. The Blasted Lands are the final resting place to far greater beings than you. --- Gossip option conditions -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=840; -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(15,840,0,0,9,2784,0,0,0,'','Show gossip option if player has quest 2784 but not complete'), -(15,840,1,0,9,2801,0,0,0,'','Show gossip option if player has quest 2801 but not complete'), -(15,840,2,0,9,2702,0,0,0,'','Show gossip option if player has quest 2702 but not complete'); --- Add Any Missing Gossip Option -DELETE FROM `gossip_menu_option` WHERE `menu_id`=840 AND `id` IN (0,1); -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (880,881,882,883,884) AND `id` IN (0); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(840,0,0,"Please continue, Hero...",1,1,880,0,0,0,''), -(840,1,0,"Please continue, Hero...",1,1,880,0,0,0,''), -(880,0,0,"What could be worse than death?",1,1,884,0,0,0,''), -(881,0,0,"I shall.",1,1,0,0,0,0,''), -(882,0,0,"You can count on me, Hero.",1,1,881,0,0,0,''), -(883,0,0,"What are the stones of binding?",1,1,882,0,0,0,''), -(884,0,0,"Subordinates?",1,1,883,0,0,0,''); --- Fallen Hero of the Horde SAI -UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=7572; -DELETE FROM `smart_scripts` WHERE (`entryorguid`=7572 AND `source_type`=0); -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES -(7572,0,0,1,62,0,100,0,881,0,0,0,26,2784,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - complete quest 2784'), -(7572,0,1,2,61,0,100,0,0,0,0,0,26,2801,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - complete quest 2801'), -(7572,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - Close Gossip'), -(7572,0,3,4,62,0,100,0,840,2,0,0,12,7750,1,180000,0,0,0,8,0,0,0,-10630.3,-2987.05,28.96,4.54,'Fallen Hero of the Horde - On Gossip option select - Spawn Corporal Thund Splithoof'), -(7572,0,4,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fallen Hero of the Horde - On Gossip option select - Close Gossip'); diff --git a/sql/updates/world/2012_02_18_08_world_gossip.sql b/sql/updates/world/2012_02_18_08_world_gossip.sql deleted file mode 100644 index a9fef9bcd76..00000000000 --- a/sql/updates/world/2012_02_18_08_world_gossip.sql +++ /dev/null @@ -1,5 +0,0 @@ --- Fix mistake in Fallen Hero of the Horde gossip update -UPDATE `conditions` SET `ConditionValue1`=2784,`Comment`='Show gossip text if player has quest 2801 or 2784 completed' WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=840 AND `ConditionValue1`=2704; -UPDATE `conditions` SET `Comment`='Show gossip text if player has quest 2801 or 2784 completed' WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=840 AND `ConditionValue1`=2801; -UPDATE `conditions` SET `ConditionValue1`=2784,`Comment`='Show gossip option if player has quest 2784 but not complete' WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=840 AND `ConditionValue1`=2704; -UPDATE `smart_scripts` SET `action_param1`=2784 WHERE `entryorguid`=7572 AND `id`=0; diff --git a/sql/updates/world/2012_02_19_00_world_quest_template.sql b/sql/updates/world/2012_02_19_00_world_quest_template.sql deleted file mode 100644 index 76ab51f803b..00000000000 --- a/sql/updates/world/2012_02_19_00_world_quest_template.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Shadowmourne quest chain fix by nelegalno - --- Limit quests to Warrior, Paladin and Death Knight classes -UPDATE `quest_template` SET `RequiredClasses` = 35 WHERE `Id` IN (24545, 24743, 24547, 24749, 24756, 24757, 24548, 24748); - --- Quest relations -UPDATE `quest_template` SET `NextQuestId` = 24743 WHERE `Id` = 24545; -- The Sacred and the Corrupt -UPDATE `quest_template` SET `NextQuestId` = 24547 WHERE `Id` = 24743; -- Shadow's Edge -UPDATE `quest_template` SET `NextQuestId` = 24749 WHERE `Id` = 24547; -- A Feast of Souls -UPDATE `quest_template` SET `NextQuestId` = 24756 WHERE `Id` = 24749; -- Unholy Infusion -UPDATE `quest_template` SET `NextQuestId` = 24757 WHERE `Id` = 24756; -- Blood Infusion -UPDATE `quest_template` SET `NextQuestId` = 24548 WHERE `Id` = 24757; -- Frost Infusion -UPDATE `quest_template` SET `NextQuestId` = 24549 WHERE `Id` = 24548; -- The Splintered Throne -UPDATE `quest_template` SET `NextQuestId` = 24748 WHERE `Id` = 24549; -- Shadowmourne... to The Lich King's Last Stand diff --git a/sql/updates/world/2012_02_19_01_world_quest_template.sql b/sql/updates/world/2012_02_19_01_world_quest_template.sql deleted file mode 100644 index 2f888f08cdd..00000000000 --- a/sql/updates/world/2012_02_19_01_world_quest_template.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Dire Maul Book Quests - -UPDATE `quest_template` SET `RequiredClasses` = 1 WHERE `Id` = 7499; -- Codex of Defense (18357/7499) -UPDATE `quest_template` SET `RequiredClasses` = 2 WHERE `Id` = 7501; -- The Light and How to Swing It (18359/7501) -UPDATE `quest_template` SET `RequiredClasses` = 4 WHERE `Id` = 7503; -- The Greatest Race of Hunters (18361/7503) -UPDATE `quest_template` SET `RequiredClasses` = 8 WHERE `Id` = 7498; -- Garona: A Study on Stealth and Treachery (18356/7498) -UPDATE `quest_template` SET `RequiredClasses` = 16 WHERE `Id` = 7504; -- Holy Bologna: What the Light Won't Tell You (18362/7504) -UPDATE `quest_template` SET `RequiredClasses` = 64 WHERE `Id` = 7505; -- Frost Shock and You (18363/7505) Closes #4727 -UPDATE `quest_template` SET `RequiredClasses` = 128 WHERE `Id` = 7500; -- The Arcanist's Cookbook (18358/7500) -UPDATE `quest_template` SET `RequiredClasses` = 256 WHERE `Id` = 7502; -- Harnessing Shadows (18360/7502) -UPDATE `quest_template` SET `RequiredClasses` = 1024 WHERE `Id` = 7506; -- The Emerald Dream... (18364/7506) diff --git a/sql/updates/world/2012_02_19_02_world_gameobject.sql b/sql/updates/world/2012_02_19_02_world_gameobject.sql deleted file mode 100644 index 88a1f2e3a4c..00000000000 --- a/sql/updates/world/2012_02_19_02_world_gameobject.sql +++ /dev/null @@ -1,4 +0,0 @@ --- meeting stone for UK -DELETE FROM `gameobject` WHERE `id`=188488; -INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES -(245, 188488, 571, 1, 1, 1237.301, -4948.268, 36.02063, 2.495818, 0, 0, 0.9483232, 0.3173059, 300, 0, 1); diff --git a/sql/updates/world/2012_02_19_03_world_warden_checks.sql b/sql/updates/world/2012_02_19_03_world_warden_checks.sql deleted file mode 100644 index 3698c461358..00000000000 --- a/sql/updates/world/2012_02_19_03_world_warden_checks.sql +++ /dev/null @@ -1,802 +0,0 @@ -DROP TABLE IF EXISTS `warden_checks`; - -CREATE TABLE `warden_checks` ( - `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, - `type` tinyint(3) unsigned DEFAULT NULL, - `data` varchar(48) DEFAULT NULL, - `str` varchar(20) DEFAULT NULL, - `address` int(10) unsigned DEFAULT NULL, - `length` tinyint(3) unsigned DEFAULT NULL, - `result` varchar(24) DEFAULT NULL, - `comment` varchar(50) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -INSERT INTO `warden_checks`(`id`,`type`,`data`,`str`,`address`,`length`,`result`,`comment`) VALUES -(1,178,'07F223143C69271AA2A851FECF6DC883A9D3A7DBA6FE26CC','',710730,23,'',NULL), -(2,191,'C7D18F99DBC446A4B36E78B9130B6FA2E365B3D2D4199DF5','',28940,17,'',NULL), -(3,191,'AA1A8559776F873F26954F15E49E6041EDC2C3766AD87A59','',21826,11,'',NULL), -(4,178,'5F342A4D0EA9DB35F93FAE6E32670D810F017309817AA7C0','',676970,23,'',NULL), -(5,178,'C57BD89DD447131EA2083784AB4DA8BD58CF3E182F1D8AF6','',690106,23,'',NULL), -(6,191,'69AA85EFE8A1A990DA5ECFED4FAFD5B14F1D52EF2548FD15','',12905,36,'',NULL), -(7,191,'083ECAD073DE2D61E3564B4BF767C9D1F8F15AA0495F5A76','',41096,24,'',NULL), -(8,178,'C774D64EF60AD5A141FC56F3D02AE78AC147770FAE25D8FE','',3037164,22,'',NULL), -(9,191,'502C59CAFEA11E9584C13BFE75F85EB79936AEEE31B44165','',12194860,37,'',NULL), -(10,178,'4FBE8978A662428C616AABD71DA5562E4AC21F54BEB8ADBF','',3037164,22,'',NULL), -(11,178,'83D3F7FD7DCA144AD8219A6A4E20F0CFC6E7EA208C4144FF','',3033068,22,'',NULL), -(12,243,'','',4623652,7,'578B7D08578BF1','Pointer to realmlist address'), -(13,178,'00523153EE2298A8D80D7B26B7067CA7B26AC06FF374FE7B','',673210,23,'',NULL), -(14,191,'91BC368FA14A3FE3E13D0B1056F485F846925E613D8E8903','',12194860,37,'',NULL), -(15,243,'','',10010636,12,'8166443FFF1FFFD9565CD95E',NULL), -(16,178,'8FEFDBC58301AB0E0D0F6EBC5FBDA5ED9A7126873A9AB337','',682394,23,'',NULL), -(17,191,'B40FF92D4F092599EA9014C88B474DE4352C3F1635109882','',448492,48,'',NULL), -(18,191,'42B596FF923054531E4918DC39E08F8564FED16D559B494A','',29852,20,'',NULL), -(19,178,'24291D6733A7CEFA3D54C3BCCAE95D56D8365BAB42AEE1CE','',3037164,22,'',NULL), -(20,178,'6C4E321E2D5A153F2BB664EB6EEDF8D67FDE7ECC8076D087','',3990720,23,'',NULL), -(21,178,'FB649706C8F1AFF5990B5F3118DFE54FF6F9609C6991C161','',3045776,31,'',NULL), -(22,191,'D1B451C906B81261B048FD4025217245950C11660815367F','',28920,23,'',NULL), -(23,191,'40079A1083A6B57E3B713992BD395FB6650B631E4C4B8D4E','',29852,20,'',NULL), -(24,178,'3F8FEFE08CB358D6613656AFDB498AB8C599BA18B5574FB6','',682378,23,'',NULL), -(25,191,'EECA71B5536EE1992FD7825A5CCC4B7F9F3B413C0DA498B6','',29884,20,'',NULL), -(26,191,'B8786BFF2421ED1F1FB30F3F0BAF671FC1DAD5B3B33124C8','',28956,17,'',NULL), -(27,191,'BF0C842D635D9D8B3F6FF84EF6DF7C963C485EBAF02D17B0','',28920,23,'',NULL), -(28,191,'9672ED2A27C4972E04DF4471C95492C721024E241995170C','',36924,24,'',NULL), -(29,191,'63532B056020A261251BD24AB026BBC5D4468AF863136044','',17906,11,'',NULL), -(30,178,'7D38C80FEAB10B857A4A7BEF15D27A58FB43FD875E29C73C','',3990720,23,'',NULL), -(31,178,'B158752316672A90BF29846E7AD64BA4FD1699C638BFD3B6','',2299116,33,'',NULL), -(32,178,'4549AE7CA28700562D996CBC78FA7341DC05F644C01474E4','',3000288,31,'',NULL), -(33,178,'EE77806A4F5723FD9C6FC6F43308C8AB448E0A139CB43700','',690106,23,'',NULL), -(34,191,'046D6EA3E99E275F51CAA591BD8C478B6F964A3072018F43','',21660,15,'',NULL), -(35,178,'B1682CE919907AD7D8990F3D8272CFF24A996162565D52B4','',676970,23,'',NULL), -(36,178,'22E057649A8BF1D9672841EF47A4DA175AAC082FFEF059DA','',710730,23,'',NULL), -(37,178,'7BA62D5F5CFEB545D1AE646962F4EB9A91B93EF8FFD5D1B0','',710554,23,'',NULL), -(38,178,'702802D919D9E5C3FD42CA9188936C73E47F87CFA419025A','',3033068,22,'',NULL), -(39,178,'FDA6D997BFB8A991B57755633D1AB3C7E567A74C1EC09937','',3070052,22,'',NULL), -(40,191,'84F6BDD28490937867774E7BF8D5B78F68BF9EB43DE90F10','',477912,60,'',NULL), -(41,191,'5A5B4BA32BD937FF253016AE836DD44B794F8D05982860A6','',447736,48,'',NULL), -(42,178,'A243986665C7FCA1E60A9F209DE9431C3098D082DF1C4528','',682378,23,'',NULL), -(43,178,'7CC89374CE3A9C07DCD685006690B828931D60085EE5FEE8','',710554,23,'',NULL), -(44,191,'01F10590E6DFED79523D26C043D5424174BEF1011F3F4974','',477928,60,'',NULL), -(45,178,'C9728BDC4B77BAA7B3515AFD3628EDB0986DFA20B46917B4','',672746,23,'',NULL), -(46,191,'179B80E5E054521E44BA8F5978D5FC489CC9E514B350A3FF','',28956,17,'',NULL), -(47,243,'','',5417948,5,'7734FF2485','FrameXML Signature Check'), -(48,191,'7769A67D6E2460450873133B0CFF99B67A58CE6C404A17F8','',17282,15,'',NULL), -(49,178,'CF3896074EEBC0F93B539FD44E4D825227D4C1556B8F2279','',3990720,23,'',NULL), -(50,178,'88F2833B5267A71A0CA72509C40819B99283A6E556FD9038','',198,10,'',NULL), -(51,243,'','',8491566,5,'8B4D10890D','Lua DoString'), -(52,178,'F7229DF2D879A9E8D5BCEDCDC7046D75BAEE1C9D4DA41E55','',3638348,23,'',NULL), -(53,191,'AE78585CD862134059B13669FC416B8124752EC6471DDCE6','',28940,17,'',NULL), -(54,191,'B408E9F9B475E4B6A81F9B7F2E060824F618FFDABBFFE805','',13634,11,'',NULL), -(55,178,'A9DA016B83961F95097E08F2DEBE69517C7573FFF06D8C4B','',668874,23,'',NULL), -(56,191,'0E74160C242EF826D09BCE4ED535E9A9D251B1CD20E31891','',24812,14,'',NULL), -(57,178,'A58E4D44D952C1F9DB7B5E423167EE4C28AD02668C5B86AF','',710730,23,'',NULL), -(58,191,'35A9FC42ACBF3A147B0C8CF67BA04EC979C6534B20249B45','',28956,12,'',NULL), -(59,243,'','',5345746,7,'746583F9177760','Lua Protection Patch'), -(60,191,'1430DC4A627EA5FA2CFF9C010CE16022F259F81DB6047879','',13634,11,'',NULL), -(61,191,'85A005398AF851382267C01BB6FB04AEF2093213C20EC200','',360508,13,'',NULL), -(62,191,'96916CD89649027A9A8BBFBD28AE190CD5D590E24BBAD451','',13033,36,'',NULL), -(63,191,'056D57A5C1A46883400E1F69405750B23DE18C3032C3D91C','',27270,13,'',NULL), -(64,191,'87C641E1EDBD96D9F170C7BE0FA13F45611DCDF41AC02526','',41127,24,'',NULL), -(65,191,'1F378DF1E7BD99164DDC7401A98CA5E9551BD50B4A35D5AA','',34176,25,'',NULL), -(66,178,'B5ED443D6CA2F6095BAC8DAFDC8F3413F7B473916357C17E','',209352,75,'',NULL), -(67,191,'A2BC3FF01787A38CB88B3EF45C1CD97DA113157FC395D38C','',30012,16,'',NULL), -(68,191,'190862E5018F1428E5B12BFDAD08283ECD057B34AD722846','',41228,24,'',NULL), -(69,191,'6E0E55BE8690F64442E275559E6C9F8A3FDCAA00937D1C13','',49347,24,'',NULL), -(70,191,'B6FC4C07BB2CBE7C5C854CD99DAFEC0D1AE4101FC51460F9','',477912,60,'',NULL), -(71,178,'3B5955C3B498489869990F08A4CAE566A7D689C23990518B','',156,8,'',NULL), -(72,243,'','',7246064,6,'8950108B450C','Movement State related'), -(73,178,'F24317DAA28AA477996EEBB9538A89569ABF9B185A3EA4E4','',718842,23,'',NULL), -(74,178,'DA25A4134671325719833878E2556455EC4321A2207B6728','',198,10,'',NULL), -(75,191,'DC9490A7BEB43C64585E013B5260BE843D126EB3BCEBAC11','',50040,26,'',NULL), -(76,178,'4BB92BBD5CA8C192C9D0E1EDB6C21FF3F4A61ED1B151365F','',673210,23,'',NULL), -(77,178,'13E8DD1C9F5501A270A59CC4B61311F6D5D18DC3F2AA351A','',3037164,22,'',NULL), -(78,191,'346CFA39FF98198BDE1C23673FBF51A50CFF5ADED784F077','',17522,15,'',NULL), -(79,113,'0590FC57AB448975FA46C314A8AB75AF96DF0FD0A3D9FB23','Afd32uu',0,0,'',NULL), -(80,178,'E37D413DC96A92D3CEAB8A482B8F5397587A0E654C9A0166','',672954,23,'',NULL), -(81,178,'E7D5551799C2C7F0072BC3149A22F37D09EA1EB83F64C655','',3045912,31,'',NULL), -(82,191,'7CC5260578671130CA5B3392BA5CFD0F3DE0BE1085E556B6','',9977,32,'',NULL), -(83,191,'F44A40945F24385D089E040A733553EEFF92EFAAB0636323','',134968,32,'',NULL), -(84,178,'D3122CF30EE55310CF4A710E61B190D2B108227B746B41AD','',679578,23,'',NULL), -(85,191,'7E3CC1BC53477D84F05F623BBC94B9DE8D01A2607CA935DB','',41188,24,'',NULL), -(86,191,'DC06565CC1512B5A91A848E08BC4FBC6DA705F6503667852','',41127,24,'',NULL), -(87,191,'03DC47CDFBB14C5CF0D0010FA5424556F951585588A2180A','',29916,16,'',NULL), -(88,191,'29EC91C4D87891FECDED381CE65A86A259F00DD788833E4D','',174688,37,'',NULL), -(89,191,'31F024003681765368F6EFB667E83CE1D12799723AA99BF9','',685304,44,'',NULL), -(90,191,'6A82AC1D0BFEF5DA7385510CBC57189FACD42E45E0D2A65E','',30012,16,'',NULL), -(91,191,'3901FBD52655E12ADA4EEDED3B365B1DDFAAA925A140097F','',448492,48,'',NULL), -(92,191,'6E9991A25EC347BEA5813EDE0A842D746779C97606565B5A','',17906,11,'',NULL), -(93,191,'0AC9F2B104AC5AA9131FB14E669B98D30D056936625B0245','',27270,13,'',NULL), -(94,178,'A338B3DA78A6683CBEE08A63C5EEFBE1AF33BF54983D583D','',684876,29,'',NULL), -(95,178,'38759C29F2ACF42DA9D16EF35837A470DC7C42C3284B2A3C','',3049492,22,'',NULL), -(96,191,'F35817564FC39F4DB7994021352FEEB86E2FEE86C11B8DBB','',360508,13,'',NULL), -(97,191,'09FAC087283873DAEE0AD074ABF7DDB1B395F5CF6BC2141E','',28956,17,'',NULL), -(98,178,'87FE57916743AF3C97CC3B583B29E89B6E503D31D1747B64','',676970,23,'',NULL), -(99,178,'97D854645011BAD1F6625679511D78D1B7367A51EB0FCC6E','',668874,23,'',NULL), -(100,178,'12369F6F1B875FB5CC5E67445ADEAE2B295D196596679317','',0,9,'',NULL), -(101,191,'5034278808E93A3DFC9BEFFD8E180FEFA24DFC5056ED3BE1','',433168,48,'',NULL), -(102,178,'55EF16220A7EF3F74A9D895821610DFBD2A757FB05C792D5','',209352,75,'',NULL), -(103,191,'67445533AA0BB737D2F74C9258148C6C667794F0E3D07498','',45324,24,'',NULL), -(104,178,'AA8649100B17A9C5BE227F47F867FADE51AD242BAAD39821','',3045632,31,'',NULL), -(105,191,'85545FE9242B2474574EEBABBF452FBD11497073CB1E46A5','',41080,24,'',NULL), -(106,191,'9DACD6981681F53650B681EAE68065D26F4803682058709D','',448456,48,'',NULL), -(107,191,'96B74F1436A05E658E3282164BC3CBDF4DBBB2CF6A5B866F','',9977,32,'',NULL), -(108,191,'033BD6861DF7878DC9470EC2F699772BB2F3D5000490866F','',90202,13,'',NULL), -(109,113,'B797D0AF3164EE83167D5C054A511A5B209A70C6655C408B','IPSect',0,0,'',NULL), -(110,178,'D91A2764435C5091D3F9471AB8B5F397E609330294694488','',710730,23,'',NULL), -(111,191,'94EED02DCDB71789E50917DA401A03F4B91BDBEA050D8BCA','',3766400,37,'',NULL), -(112,178,'2DF33CBB544E2D5238FB591F2547AC507B4D8A652D789F2B','',2303444,33,'',NULL), -(113,243,'','',7860712,5,'742DF6407C',NULL), -(114,178,'81A74F35F0F887144D59F93647C18C70C5FEEF542A7F3782','',709322,22,'',NULL), -(115,178,'2E1F8A68FDDF084A950B786A1EE7E0CE43E62449A56F92A3','',3045632,31,'',NULL), -(116,191,'B1F8988B6664A90E79503FA5D843C3CB97BFDC23EB8C7690','',433168,48,'',NULL), -(117,178,'0277E26DE31814DFD675A59E526669E39080E033BAE88859','',0,9,'',NULL), -(118,243,'','',10714892,8,'BB8D243FD4D0313E','Wall Climb'), -(119,178,'09BBFC19FCADC69D6B5BF655A5BB6350B4A8120C3EB557D2','',3990720,23,'',NULL), -(120,178,'BF4ABDEB726B0060E74701C03180C3CB02170ADCB7DCB61C','',3049872,31,'',NULL), -(121,243,'','',9990741,9,'8B878000000089463C','No Fall Damage Patch'), -(122,178,'D259A46A6D1855C436BFC96FB9376BDCDF5E9FFAE8B4147C','',3045616,31,'',NULL), -(123,178,'F425A62A44097742D72A05669B6BE93AD9CEFE9E40D71E48','',3045976,31,'',NULL), -(124,191,'B134291F515D136B6576FFBC0133C7859755974611170D07','',20512,16,'',NULL), -(125,191,'125BE691985D8DB37068DC14D74EA2DA1260E4A63D3F74BF','',45324,24,'',NULL), -(126,178,'E06E3C5B356B34BA92F6765108556AD53ABB74B986D5810E','',3070052,22,'',NULL), -(127,178,'8CC87DFF61F2EC82DE033865C9879010D94E1614369FE286','',710554,23,'',NULL), -(128,191,'E1F5233450FEFFB6F0E8F2B17683047A485828FEDD3E5B80','',448456,48,'',NULL), -(129,191,'31BA6EA4DF2362676AB71F4CB60B0D40FA51A3AABD25D5CB','',36924,24,'',NULL), -(130,191,'C14630E1D519EB85C254C536FE81DC490977E869BD5CD884','',12985,36,'',NULL), -(131,191,'B337F892EEDD52A5B978C116A19D927134273626EFC4DAA3','',17890,11,'',NULL), -(132,191,'D97560108AA21A487EC9278759F7615BFA304A933776A201','',18680,35,'',NULL), -(133,178,'DA59505BA61459508532CBEAD246DCD2C8E7BF5C6D3CE676','',3037164,22,'',NULL), -(134,191,'5803CA69E5B7F1DF08D95219894D75F52EDB1AD429E562D9','',174688,37,'',NULL), -(135,178,'8A1099E19139D91573286DBB3DED2CC093A99FD178F7FEC8','',3033068,22,'',NULL), -(136,178,'0331B438B085F55C06F7F697160845BE953D9CE789AA62A4','',3000288,31,'',NULL), -(137,191,'E844078A5671FF7DB0621E7F1C7EDDF9C92F5A9FA0477FCB','',41023,24,'',NULL), -(138,178,'AAD7F47B231861913F353341FD26E5AA89AFB586FB6A5366','',672746,23,'',NULL), -(139,178,'136DFB3FE66D2830DF46EE155FCAEADC9624FFE1410088DA','',3041472,31,'',NULL), -(140,191,'C6015A0D5C9109768BA4233639A51F163CC7ED58749E5026','',25724,20,'',NULL), -(141,178,'9C668CE4D328EEA9B6AB7AD5FF54169289B35B230275A43C','',3049872,31,'',NULL), -(142,178,'FC3C95E71F968C46BD5DB5C9EF9B0A5BDCC5619B805046F5','',2299060,33,'',NULL), -(143,178,'FBE3808C0E36BFBC1D1F5A0E508CA89E81E550CD2FDEEC48','',149,5,'',NULL), -(144,178,'35A8252DBC65514E858256C497141153812EE61C724BF5A9','',710730,23,'',NULL), -(145,178,'CC79AA9AE29A52A998181D183D38974221B8BAC0AB534E7D','',0,9,'',NULL), -(146,178,'B89F25A249D295580E649F5ABE0C65EC24401F4889A4FB16','',668874,23,'',NULL), -(147,178,'742A0A9997B9E857C355AA75797466506BAE73D44D26399D','',3037164,22,'',NULL), -(148,178,'E7975701601B2FDF8262098521B7BB4FF5CCC484F8E919E7','',3045776,31,'',NULL), -(149,178,'43E81BE830F169F4EDD23B84ABFA9D15EF12C978FE134346','',60648,56,'',NULL), -(150,178,'66CA9E464A2122E301A72FAEF13A4853D8CB1A45C177E854','',178504,96,'',NULL), -(151,113,'0A3C294B0799FD2C9EC17C1CCBCD174A51B6A2ECC62FEF17','IPSect',0,0,'',NULL), -(152,178,'6E9CE81BFCAF0C250705FCC599981D2D9E4D474A7E857B37','',2299108,33,'',NULL), -(153,178,'8734D6E081D5C993DCE8161CFDFC6197F39A487E4083A3E1','',149,5,'',NULL), -(154,178,'A33355AF7B5FF3CECB3A6059F6621F30AEE695D69421EA2B','',3049492,22,'',NULL), -(155,191,'BF8CEA63013511BDE0B551DAAC492DFBB9608645140B88F7','',29916,16,'',NULL), -(156,178,'8D5D5E99EAB2ED21A104913B05D6BD7A8E63ADA56B66CDED','',3022016,31,'',NULL), -(157,191,'778256BFEF82EA60C4E0F25083655FB2BB75B83FD60A9C06','',18680,35,'',NULL), -(158,178,'43FB8007D7DD7B01FFBEEA3EF9D0242778565544281EC761','',0,9,'',NULL), -(159,191,'94DCF5D21FE2106F5303216C14AD55EEDC1B19FDC91D5F76','',28704,16,'',NULL), -(160,191,'7EBBF90F7D8462D1453479DF9AC5943AF483FE2828C74FDD','',477928,60,'',NULL), -(161,191,'A171148491E099B12CCD1708B784D8C3B09737772C7780C0','',401992,14,'',NULL), -(162,191,'5350ACB75F9FA498FE0D2A371649C9FD9716BDDE2C32F5FB','',13634,11,'',NULL), -(163,191,'85E53280630956C58D4CA7FD8DC5FE73C9A2A03314DFF294','',45223,24,'',NULL), -(164,191,'391BC8A81D4EB6D526BAF0DC3468CAA36C9207B82E194B7A','',130380,14,'',NULL), -(165,191,'0F88FA5CD9B9950F850C18FE76C948FF43CDDE3E75638FF1','',17938,11,'',NULL), -(166,178,'EB63FC60164AFF92726DA658882BF1CE47CF0BF6C80B1B97','',690106,23,'',NULL), -(167,178,'E30B2494142B416BBE95DA3DAE4A82CBDF3A020715F10E8B','',4011280,23,'',NULL), -(168,191,'6CA1C19D0E9191CBC9CA3D5BC3CF1D19764D8F17C6B54AE4','',59620,13,'',NULL), -(169,178,'4730B7A7EC70544A688211A5C754C357A090116092D3EC4D','',682378,23,'',NULL), -(170,243,'','',10000022,6,'894644894E54',NULL), -(171,191,'713A7B79619AEF3C47E44102F86EDCE0D6AFBC5ABE87F861','',13538,11,'',NULL), -(172,191,'575F1C6AF7C71085C7D9CB2291844D9F2DA3B71391C0B941','',36907,24,'',NULL), -(173,178,'296F233E4FAC4CF419D5FBF2701AC4D5AA0866CB4D0DAEC6','',3045976,31,'',NULL), -(174,178,'933C1A228C99E35DF309838B25B7D5EA3A8E961E81D81D32','',673194,23,'',NULL), -(175,191,'9EC125252C3738478CA942DCB59030097194B284A9162B32','',59620,13,'',NULL), -(176,178,'6665F3FB8DC6BE71C152C3674B5783D6E57FE8BF796D190C','',3634252,23,'',NULL), -(177,191,'E120DD63042FEFF9E7FCEC0CA44D2544F03C5D4CDBA1C008','',12985,36,'',NULL), -(178,113,'09BDABA6CB17BE561B4104124A3D0266C858D194A8765198','drvsys_mon',0,0,'',NULL), -(179,178,'3AAE69E7088E4060EA32EF95E9B6D9532460F5B84EE4EC80','',684876,29,'',NULL), -(180,191,'990D4E1C2D63C8E447F034642686D57B727064E3EDE13B00','',448500,48,'',NULL), -(181,191,'E88F31BDC5513216CF3701CAF8BE954CCC7EAE0E7AC7D942','',594348,26,'',NULL), -(182,178,'81229C1E56FA72E01B52E8CBB8BB5F55ED48A11B72E7729B','',710554,23,'',NULL), -(183,191,'B4D0CDE7D53493A1549328F711013F07DBD3A9BE88DB2EF9','',685304,44,'',NULL), -(184,178,'D6CA6F94FF248F722F97037C1AE7C8DE0191D5F4D1E3A5B8','',156,8,'',NULL), -(185,178,'9C9DF1E868BB33D43676F21096C4F75759C0807096EEB886','',60648,56,'',NULL), -(186,178,'1C79B3B5A74A4F09A1FAE19BB15CDCF26B5F917861071F1C','',198,10,'',NULL), -(187,178,'AC1AD3E831A4C758858350A8A197A24FE82583F4B0E39A85','',3049888,31,'',NULL), -(188,178,'56E4980485E3129E94F370E7066E80B07141C4A669B9FC0F','',672746,23,'',NULL), -(189,178,'C21574305E0377A3D2B72D1E1546B9D62DCFA8B1A4405F16','',3638348,23,'',NULL), -(190,178,'AA74121AF835978BC1C1BB402A8B7388CB7C075C1227C253','',3049888,31,'',NULL), -(191,178,'D6457A86DFADF9825D6093090AED2A807FE7DA6ECF5922AF','',3065956,22,'',NULL), -(192,191,'1BAB7E6B5ACBEED8F54B667EDF13A385B9E146C0C50D9FB7','',448456,48,'',NULL), -(193,243,'','',7517484,7,'7518683B010000','Follow Unit Check'), -(194,178,'01000FEAC61ED76FE04ED1169C40289D96C71A1564E38FCB','',690106,23,'',NULL), -(195,191,'F095338ED87C658C916CC604A427F4ED95309C4A07B7898C','',34176,25,'',NULL), -(196,191,'800E120187DF74A231722FB887B3944AD16A703FB8CB9D39','',28920,23,'',NULL), -(197,191,'2CFCE981C322A54724E1418B6A6D1896B95D584630EEEA43','',38300,21,'',NULL), -(198,243,'','',5081862,8,'6840AAB600C60200',NULL), -(199,178,'481751066D6C97AD5EE90173E8ED107BB1C9FD873B0CE55A','',3037164,22,'',NULL), -(200,178,'7FC57D49535798CDA7E4DC5DCEA2E085AAB9A68BF7F9469D','',149,5,'',NULL), -(201,191,'33357C112DE0195F013FAAC4D57AB1BE77417934CE03A2B9','',3766400,37,'',NULL), -(202,191,'BF8AC678DC3CD354BADBFE46C9173D34CC84D13302190EBB','',21826,11,'',NULL), -(203,178,'4E2F9721D52A7552AE2728B9695F1523DD62DC0569237C3F','',2299108,33,'',NULL), -(204,191,'9F015E7D8A11F30AA1954D9FEA7142D0247E3C09FF2BFF72','',12194860,37,'',NULL), -(205,178,'1EB5AD39B94DB5CDC3294DF49FA589DFBE2C674D07E4B211','',710730,23,'',NULL), -(206,178,'E9D67F07E035A64B89C9E91614DC1930FEF61DC3A5C1BBA6','',690106,23,'',NULL), -(207,191,'36411C2FF2C3AC51B7F6A6B8DF61DBD4E5895C27438847BE','',59620,13,'',NULL), -(208,178,'A77F30CBB8057E0DB37782367C8462FA98D4DB21DE936ECD','',3049492,22,'',NULL), -(209,243,'','',7452688,10,'8B81CC07000025000000','WoWEmuHacker Injection'), -(210,178,'A8C806E1FB7CA3625E6BB6F5E4D9E2BF0EBDBE70BA7226F7','',3049872,31,'',NULL), -(211,191,'B3DD04807DEA2679045F4F197BDDAED5C7CCEEFE19622B43','',360508,13,'',NULL), -(212,178,'B075C8B4D8C5D83FE703677319491DC816EA5103901B44A8','',682394,23,'',NULL), -(213,191,'53DB506C0341B50BEA3897E2E3C0DD74C2CA2D8F5F34A2E4','',59620,13,'',NULL), -(214,191,'E112F38956124FE0F48BF569F5E81B40E293DC6E16B544D6','',17282,15,'',NULL), -(215,191,'0363EF2B1AAE09E6C2B1FA555E706F4EE094BE678DA27598','',3766400,37,'',NULL), -(216,191,'EA256F01B6340C99E27611B39C5ED28CF2FA202436F0972F','',49564,24,'',NULL), -(217,178,'A86C95C4E58495A10F5F1C9B5B62D3365132E8DC62863E8B','',198,12,'',NULL), -(218,191,'56DD8D99991F83AFA2E169315B395BD388B248340E9C64D3','',30044,16,'',NULL), -(219,191,'684B23E010C3D6B88CC12BD9F0B6B0CE00D692C71BFB84A8','',28940,17,'',NULL), -(220,178,'83AEEFCDF4C2E80B18DDF93D99120A89F916C19206D257AB','',668874,23,'',NULL), -(221,178,'D68651921F5CD387C7E860FB7C3B143409735748E3B2FB7F','',682394,23,'',NULL), -(222,113,'A4D501A9DB9D84BD8695A8BF61FC853BF434D2D4B352C7A0','HideEx',0,0,'',NULL), -(223,191,'5E77F12C032D4FEF559F9B837B85BDB9D95ADB10C9F56649','',448504,48,'',NULL), -(224,178,'F08406AEDFA8F19B6FB7C9ADDE0BFEE82CB0D2E275593150','',2303444,33,'',NULL), -(225,178,'AC0EC72522ADA5B2BFFAFAC92D6D0A0225E1D5C727CDFFA7','',672602,23,'',NULL), -(226,178,'4D1A7D1C88AB04438510E3255184E51EAE2036BB09DB553A','',700714,23,'',NULL), -(227,178,'68BBC36F75DC763B573DACAB1D6D8F70E667638AA894BEE9','',717898,23,'',NULL), -(228,178,'2AC3C23FBDE2C1EC46C9ECFF71BD7F603F17C9DFC1328D1C','',3638348,23,'',NULL), -(229,191,'C365E9FE00580EBB14EE863A5CE3C8139B1A59A610520AE7','',3766400,37,'',NULL), -(230,178,'DB2A0451B9753100085C9D149B61CE47A195D77C8B709143','',178504,96,'',NULL), -(231,178,'0871F69205FA62C74C2DDE200A3911FC3E41A4FB8BAB9817','',682378,23,'',NULL), -(232,191,'0017307F2FF889462B0FA06018D99EB1F847F189B6CC9B99','',21826,11,'',NULL), -(233,178,'0FEFCD6B0BF8C2816A9259AB5FD7B89231AEB8D92DE53D26','',3045356,22,'',NULL), -(234,178,'87EAD79656133B3183C2E452886D8F00C5EC6C9D741673A2','',3037164,22,'',NULL), -(235,178,'C2B6C5E19FA98D121B2CDE51789BD2883A324015E7D131E0','',710554,23,'',NULL), -(236,178,'B6F3A7D557A3E3BC4833C3D9B6B0B0609255591CC8AB3B65','',3022016,31,'',NULL), -(237,243,'','',5283280,12,'558BECB8084E0000E8731DF0','AddChatMessage'), -(238,191,'AEA87B23CD9463E9693B6C053C1D9030F8E229DA308DBF29','',90202,13,'',NULL), -(239,178,'8C16C7E8EEAD49AE67E4E91E229FFBCE2F6590A48348914E','',3049888,31,'',NULL), -(240,178,'7B2DCA97CD348E45490C288EADE9303CE270CF57F28EB1E4','',690106,23,'',NULL), -(241,191,'BC10B10BE398F2397FA6962C4E59C8CF11FDD7158EC222A5','',29916,16,'',NULL), -(242,178,'8E53EC1B8ABE90C9A5C087671DE0A3007BEA4488EE5415D0','',3037164,22,'',NULL), -(243,191,'65B5CE07A794164101F7E379D21A7A544EF1EC2A3A39A2D8','',27270,13,'',NULL), -(244,191,'C6C8597824F249180A53196699421ADF7857A5C4E4F80D6F','',13033,36,'',NULL), -(245,178,'FE677759E719178BC5CB49DA252D9B635F76030FC4C9876C','',673194,23,'',NULL), -(246,243,'','',5265823,5,'72118B5518','Language Patch'), -(247,178,'BA2D161EF412084B0229A08E64D5A445C4E9F9F2645535E5','',706314,23,'',NULL), -(248,191,'0174B647A535F206711D3EEEF08D3F421BCABD7016A2F103','',17282,15,'',NULL), -(249,178,'5F5F754FD6E7BAC9650B715387646CF992813730A2BA37DA','',2303444,33,'',NULL), -(250,178,'D2CC7F98209E9A9BBA483BD1E9A916E40EB971EE2129AFF8','',3990720,23,'',NULL), -(251,178,'E8C741CC79005898FFD0026821F61A2E4E67C695C6E1CE1C','',198,10,'',NULL), -(252,191,'23B364A9012EF40A39EC4D04A91F9B60FC7EF7D85E3F240A','',18680,35,'',NULL), -(253,191,'C9363F808D37F13FC09EBB7F700AD09EEB27DA046E41FD52','',36907,24,'',NULL), -(254,191,'2D92FC5B8603E18F50D9CAA0922F5C7BB89E42A4656ED2D5','',3766400,37,'',NULL), -(255,178,'EDEDBC5B1A3D92D2A91192118898FDBF840C967C82968D70','',3045912,31,'',NULL), -(256,113,'BFEF06E80472106B57B15D711F94A25243F6ABA7FE354C95','ndis_x86',0,0,'',NULL), -(257,178,'FB20B0EB9ACF571FE37C6B69CBE86F7906F96B996D7E5EFA','',2303444,33,'',NULL), -(258,191,'917AC1C48C1FF354FD594A3705C70A2C356FE981275E7FB5','',22792,25,'',NULL), -(259,178,'48CD29D8B39DC07B0FD071FD8C643E07A8FC2C9AFC2A3083','',3045356,22,'',NULL), -(260,243,'','',11154396,8,'D893FEC0488C11C1','Jump Momentum'), -(261,191,'FB13A8360C8E23B83ED7309625A7EFBAEE7DCF737068C5A6','',174688,37,'',NULL), -(262,191,'3C8D85F85ED5DD0354561F84EACA575123DE05EE941C28D2','',56063,25,'',NULL), -(263,191,'FBC20EEA52B5882209BC016EC14818376CA7BAF28780BCED','',22792,25,'',NULL), -(264,191,'210D85A84F7BE48F3EB427E0CBCCD9C146320ABAAB5E28D8','',41096,24,'',NULL), -(265,178,'953107F9F718795B6DF9E5E5BEE0EA949800CAD0EB71F891','',3037164,22,'',NULL), -(266,113,'FBBA36D0FC5434D12EE1509E148FF908D51F18719CCBEABC','IPSect',0,0,'',NULL), -(267,178,'82CB32BA2A05B228F2F8D0313C185EB6FDC50A94340F40C8','',209352,75,'',NULL), -(268,191,'079172B91B1768A2650A87BAB06AF700BB4C9A0B5E5B983B','',17522,15,'',NULL), -(269,191,'881751DF112F817E799953E00E94543DA4610968437DB7C6','',12194860,37,'',NULL), -(270,191,'9A47B274EAAC888FA2007B4EC0623580365458E3621CC416','',28956,17,'',NULL), -(271,191,'77344CE014111FAAA66DEF35B670B2E76AE878B054F85285','',61874,42,'',NULL), -(272,191,'0A74CBD8DFF245DA5E8691C1174F037D7ABE823E265226AB','',685656,44,'',NULL), -(273,178,'0E13ADDD413B679E2984060D929440064FAC308FC2B90742','',3049872,31,'',NULL), -(274,178,'D0D8CE5001596C6F4A766FE94726FE7E337F42469CB96CA1','',3065956,22,'',NULL), -(275,191,'313C58F8401B47F716B220B88411CAD0E85966D95B301591','',13033,36,'',NULL), -(276,178,'ACBDC68A4D748C48ED1180DD3DA52632EA6FC275BFC35D5B','',0,9,'',NULL), -(277,191,'BACA83A742B9E09CD07787BC6B50389707EA94C41886BAD0','',448504,48,'',NULL), -(278,178,'549B42D266E7F17B7F30B72E301A9CB3C5E3865DE9B7E90B','',60648,56,'',NULL), -(279,178,'86DB854557D75BEEE7DA820FCA15669B08C760E8B165B06F','',3037164,22,'',NULL), -(280,178,'02D5FBD9E30D43ACED0EFD00CF16DAA69EDD262C292136AB','',178504,96,'',NULL), -(281,191,'B9D920131EFC38767012340CF0FFBFE154DBA28E6EF3B859','',61874,42,'',NULL), -(282,191,'96E6CAE70AF690F5D552E0948C29CA9AA527DEBF9731B16B','',20512,16,'',NULL), -(283,191,'375B22B4990997348A8AEDD53319897BE196398B4F1DBAC3','',30012,16,'',NULL), -(284,178,'932F4622AE9F1B3990900F1F88375FA1DD7C238F7C6133C6','',684876,29,'',NULL), -(285,178,'43583C7BCCD9DF14C64CC84710BEE44DD30E199F579890AE','',3049872,31,'',NULL), -(286,191,'97CF98F0BCABA04BC2BAD40FBD4EBFB3C1FD8A7139D5C9B9','',433168,48,'',NULL), -(287,178,'97A0E0F8F8ACE7F1E6492DAFADE8F45B366446E79C1B0419','',3049452,22,'',NULL), -(288,243,'','',5284488,9,'7507C7451400000000','Language Patch'), -(289,191,'C3546D16052E0DC1838E7A6E18936B88CC8A40C2AEC0BE3B','',21826,11,'',NULL), -(290,178,'4179D6BD8C2F11AD5D5C103A7877504074009AB53AE4D8A6','',3045356,22,'',NULL), -(291,191,'2C360CEAB996C8D6E5DE3FFAC30E412DED48E7814D1CE110','',20512,16,'',NULL), -(292,191,'6F1486BE58078BD453F1B249947BB99CB8E17E9A355CE024','',41228,24,'',NULL), -(293,178,'924F4631DC3167BCFAB02F92DDB49A871DA0C55122EF9EB8','',0,9,'',NULL), -(294,178,'411029C5B28D942ED3C7BC1F4299162D874838A661410894','',700714,23,'',NULL), -(295,191,'B9093BAED730E86AF004119B3B7258938C56902915C2E8BA','',501956,48,'',NULL), -(296,178,'63BD2D7FF6C5442795361031E5768C396A37AE38AF98DB11','',668874,23,'',NULL), -(297,191,'754A2FE56037B971E128FFAA669032C511BDA3A62524CE03','',28956,12,'',NULL), -(298,178,'9AEFDCDB62EBC2DABD6CEBF8C411C1145274FCA7CED890CB','',3037164,22,'',NULL), -(299,178,'3AC57BAC3B782AE5ADBB899CCC060D4E8F66E5217F7DF654','',676970,23,'',NULL), -(300,191,'2F0D9702A58D6D5A8599529A0A816AA101AFE581D98416B2','',56063,25,'',NULL), -(301,178,'77804219E627B4D38C9F95194301A895180B598AEFA9963F','',3022016,31,'',NULL), -(302,178,'0D1B99EDC8E458705A88E72F7FDEEE9233DB21290A0098E6','',149,5,'',NULL), -(303,191,'BB795B4069F985BF44C7418DE264C3B0E9BA6D61A116FF81','',90202,13,'',NULL), -(304,191,'5A6EEBA1E6B9EE71BD4A5F63014E9928302C36FC806DC796','',3766400,37,'',NULL), -(305,191,'BA5777AF7FFF3895935669878D662B585912A759A2DFCE68','',24812,14,'',NULL), -(306,178,'5E690DB1AD8910886334158C6D4452FA2CE896634BCDDF40','',580768,52,'',NULL), -(307,191,'42A8F651F55F697E783ADA1959A2833276F970F1EE0410C7','',41280,16,'',NULL), -(308,243,'','',5296496,12,'558BEC81ECE80D00006A0AE8','SendChatMessage'), -(309,191,'445A6894B8C1838462D7D0D29FBE6BF815B5E6C344971349','',31924,23,'',NULL), -(310,178,'C010786A38F396503B7411FBADA0C1A68795F54A7AAE228E','',679578,23,'',NULL), -(311,113,'E3185EE4428291F9D2E4080C2EB1B19ADB005AD26EF0A993','IPSect',0,0,'',NULL), -(312,243,'','',7739760,11,'01BE80000000E805B6FFFF','Jump related?'), -(313,191,'1995FA3235ADA4B25232DC6403E7463A8D1864528BF9FDD4','',12905,36,'',NULL), -(314,243,'','',5124558,5,'8BF08D4608','GetCharacterInfo'), -(315,191,'30A26827798B7F1646003A9E846E8A9A8FF10A9DF926825A','',49564,24,'',NULL), -(316,178,'A567BBE4CA9D8E976083024E8D68903CF15CEA88C47C9961','',2299060,33,'',NULL), -(317,191,'BEA7165D7DD8E24E31B1C3D791A47A28731E1BACD1189A17','',24812,14,'',NULL), -(318,191,'0971A7CEB84D392670C7B8CBB61776762C25259D8E772CA5','',13538,11,'',NULL), -(319,178,'13200A59A28561A413FADAADFFFE4521A209CB691EA199A5','',690106,23,'',NULL), -(320,243,'','',5090917,8,'E886EE1D0083C40C',NULL), -(321,191,'56CABE081991356465BDE1DA3B8DED099DF9B6E746D1B531','',25724,20,'',NULL), -(322,191,'F98469C704F8B8ABC1A251EF8FC1E4CB5CEF1E007BAB5EA5','',57602,42,'',NULL), -(323,178,'6A64BF5AC652747B47E0B8E6593B7EEAC1EF38E0A84F4F5D','',3049452,22,'',NULL), -(324,191,'978BCD17BC9C81B05A2F0A50EC2CC206EC5F6AB1FE40D38D','',28956,12,'',NULL), -(325,178,'A28EDC898CEB14FB52591754DEF981C7168DD2421D0742FA','',3037164,22,'',NULL), -(326,191,'35E88DF07F0D48A0B7ABD53F4865DB762E6935529DC826DF','',360508,13,'',NULL), -(327,178,'BF1FB7E4C3CDD5D5A93AA1B24FC822AA5537DBB59F696818','',3037164,22,'',NULL), -(328,178,'343F1AFF6DA7A967D2DB958C608A6E2A19F83E862F8E3954','',149,5,'',NULL), -(329,243,'','',10694516,8,'2F549A416F12033B','Wall Climb'), -(330,178,'0B008034F97BD411A9F900D87578258AA1B79873850BC12B','',3049888,31,'',NULL), -(331,178,'C5A35B72E6BC604BAC9AA218908B3747D6850769CEA79C0F','',2299092,33,'',NULL), -(332,191,'FDDB2AA7F8884C8E3A7ED646B3E9E4AF5A8C0704130C39A7','',29852,20,'',NULL), -(333,178,'F57343CEA7133DE6469B1CFD1A749845D553B8D806B2BAA4','',3037164,22,'',NULL), -(334,178,'565A63583AC736E3CAFB95EE5AF9A64D3A7D3C3A8B234121','',3045912,31,'',NULL), -(335,191,'E26CF0E2ED92F608A80733CE703D7EA2C3DB83FE46182519','',3766400,37,'',NULL), -(336,191,'2F44EE3A34EFF98303B3724005EF3A8AC89CB25F9CA1B8BC','',12985,36,'',NULL), -(337,191,'C32F7CDB33BEF7B3093262F89263884DBB44E57D74D646B7','',12985,36,'',NULL), -(338,113,'2357AD2012CEBA72283F93460AC5FF55E4E5719A5AB9F5B9','drvsys_mon',0,0,'',NULL), -(339,178,'1C1595A1A64016D8725619CBC2FC7ABD41835320958A97FD','',676970,23,'',NULL), -(340,191,'DB5765A8B8D5F636D619E44669E9D3EF968BD8011C5D6999','',36907,24,'',NULL), -(341,191,'70B78734AC394D83D45427E0B7C88351E9BB108ED59C7E71','',37136,40,'',NULL), -(342,191,'85F2A5072D2D7557155CBF5157CAA460B19470DEE8AF96BB','',22792,25,'',NULL), -(343,243,'','',4609669,5,'8986100F00','Login Password Pointer'), -(344,191,'6C33FD80565B2860A76C87BB772E794E2FF444D813079A2F','',685656,44,'',NULL), -(345,178,'F09BEAD15FDEBD09240316D9E2E736028B54972B13F14E5E','',673194,23,'',NULL), -(346,191,'302E114D921D40EE54585BD9D63B9BDDFF7A2BD4D678DA97','',30044,16,'',NULL), -(347,178,'24807D7810C58A4B9A070A21B8AE50A0385DD4B4C6BD8B6F','',3049872,31,'',NULL), -(348,178,'B6BDECA858773B6F995AC6496923F5D0CBFDB1F76DB29C58','',198,12,'',NULL), -(349,243,'','',5296823,7,'75166824020000','Language patch (speak all)'), -(350,191,'C125EB3FD1B222ACE1B518959D96C5AC83EEAF109E9C6D20','',12194860,37,'',NULL), -(351,178,'8AFF28C3E6367B10340FB963B093AB52E61B267C541D5659','',2299108,33,'',NULL), -(352,191,'734D3EDDA69D9DD307032245FA0806456E2F02E90C2291E2','',36907,24,'',NULL), -(353,191,'9CB5A848D90B7FA4F58801ABD8A68EF8FDF8C602063C2CD6','',13033,36,'',NULL), -(354,178,'C8BCF785F8B7118D0270016E620E2C3DF6802E034471E5E4','',3033068,22,'',NULL), -(355,178,'8FB282098C8BB4EC10C8398E44C630677C6E2785227E31D3','',0,9,'',NULL), -(356,191,'2381BB2B613C58C364E962738335EBC2F3EFF81009DE49E4','',37180,24,'',NULL), -(357,191,'AA2A24A7C90D149C7817640B0D2D46C8A4B4D52146837605','',501956,48,'',NULL), -(358,191,'6815D749CCA8C1738A5F3236A737F0B70AE037E82D46033A','',448500,48,'',NULL), -(359,178,'F9F131F27BCC37FEF638FB8EDDAC29400652020C290D4F75','',676970,23,'',NULL), -(360,191,'319CBACC4CD2E1F54F8C8FC41EF44A3A9C492A652B00C622','',18700,32,'',NULL), -(361,178,'A4A7DB31BF51180F1ACFEA6C0E59AC84B43D022CB4BB817D','',2299116,33,'',NULL), -(362,191,'0DF639ED45B0C578DD616DD191014727A3C22C346E9FF73C','',50040,26,'',NULL), -(363,191,'72944B7FED63C1D2FC9D2CF6A07B5788731BE2B02215CEE4','',447736,48,'',NULL), -(364,191,'9148E18CF9213B25197C247F08CCA4C0DC60FEA73E3A247C','',13250,15,'',NULL), -(365,191,'ADA39A6A805BDF59271BBCE21734E8F28182164563CA15AA','',29916,16,'',NULL), -(366,191,'D5C852D85FA4393D027615506B7DEE07A1074AA4633019D8','',41023,24,'',NULL), -(367,191,'D06EE8DDC2115E5895E96D26A2A2F11FC566297D1D21BD26','',56063,25,'',NULL), -(368,191,'3AFE3B981D50B26FCAAC9DBE5A4BCB24F5BC3E9348AAA04B','',25724,20,'',NULL), -(369,191,'058E826BD75C26BACE712DF9D67B0A751896515802E9DDAE','',501956,48,'',NULL), -(370,178,'6E4C9CA0F7140E32D9284AF2E0EEB76419696771D4DDE887','',3634252,23,'',NULL), -(371,178,'29E43B1309ACB344AC777636BE838F0BFE6A04570B7FB09C','',700714,23,'',NULL), -(372,191,'5B7AC53977D57C5756A2F61582DD386EC93F5FE180FAB5DC','',27270,13,'',NULL), -(373,191,'22BF8D63A306178F368016E4657CCFCA5B2B21EBC90B8DB2','',50040,26,'',NULL), -(374,178,'1E8729EE000CD5BD8BABC49C368E0FF5AC08BC2B30921BC4','',709322,22,'',NULL), -(375,178,'8A1304B9AB2579F392F92D8A592308728EF76B26AE258A41','',4011280,23,'',NULL), -(376,178,'8A90AA547378BD5930D24FC415AEC08EF52E29B22073335F','',710730,23,'',NULL), -(377,113,'4BBF42A918109CC23F231B8E657076A213601AD681C032D1','HideEx',0,0,'',NULL), -(378,191,'06D9E92AE3953D13A0AC5FA31EC24B16C6A2260E2D32BF8E','',41096,24,'',NULL), -(379,178,'D4D3A9950FA07FAEDAD0658F9128007ADE282C043210A201','',683146,23,'',NULL), -(380,191,'94530FBCCC455105E8BB67E5B19BE0A4534A6F39A1201B52','',13291422,37,'',NULL), -(381,243,'','',4198410,6,'CCCCCCCCCCCC',NULL), -(382,178,'2313AF1E20F446936533F9440B220BEA966D9EB3A0502DCF','',178504,96,'',NULL), -(383,191,'F982BFDF01EB3BC6FFB70E897BFE21376232B2EEEFB25E58','',20512,16,'',NULL), -(384,178,'26308A71C6F483CC7795A01A2F2CF7E7EE97787C12CACC52','',2299108,33,'',NULL), -(385,113,'368334F9A3A549DFD3ABC9793E4EB83E837AA43F010354D1','ndis_x86',0,0,'',NULL), -(386,113,'5DA702DF95570780875ADB4C64259E887CE0A867D9B67711','Afd32uu',0,0,'',NULL), -(387,191,'B51E8DA25AAE556552404F5172642D0808A89E2AFE870B23','',694376,44,'',NULL), -(388,191,'4748EAC0350B1B56D8549157AAAAF4FF35438078A7E37AB5','',34176,25,'',NULL), -(389,191,'FBE20B03C75572D992273F192CE72CE78A65E6764BF8E6F6','',36907,24,'',NULL), -(390,191,'D8C1B9DEF3CA9CA59C5B827F055729B636FD55BA6242F9F0','',694376,44,'',NULL), -(391,191,'448475EBCA685E5A4ECC5F810740C9181825B49613CDDDA8','',477928,60,'',NULL), -(392,191,'2AF2DEE0CA5F307895E5773A083AEB862EA3D5210E037F06','',41080,24,'',NULL), -(393,178,'1708C050FF0C98DE59FE8F070273D80F9C1A612D336AB9FC','',3049452,22,'',NULL), -(394,178,'ED6BB184C9DD307229A023C1905E6EE73981D3E088D69FE6','',676970,23,'',NULL), -(395,191,'EB63A86D51668323A18AE2F8CE2BDD1ADAE57375B5F76C6B','',45223,24,'',NULL), -(396,178,'5837373EE8D4CCB5687045C04A4297450ACDE774FE973917','',673194,23,'',NULL), -(397,191,'65CCA5E079D38DCF32053D8DEE6C5ECF88E6AD8E1CF5379B','',31924,23,'',NULL), -(398,178,'FB895125A69DE5DB112B4731F6216668EB09C4F57943D85A','',706314,23,'',NULL), -(399,191,'A388E8CE523DB7C3C501AC5DB2C8AAE58FD1831E75665C48','',401992,14,'',NULL), -(400,178,'77C74B5E4CBCA9150FB64261E497AC4E7642A316C89B291A','',3045356,22,'',NULL), -(401,178,'8A2C4F7F3367A4648744D8964BB9A6833182ECABFE015B00','',3022016,31,'',NULL), -(402,243,'','',4609675,5,'5E5DC20800','Loggin Result'), -(403,191,'E8A24A78E6A716734CC666B48263B424804A42155C0BDB51','',18700,32,'',NULL), -(404,191,'3C881D2F0634D9223A36DF5266A7CF36B503DCF424441FA5','',28928,17,'',NULL), -(405,191,'7B3D92577810CAB5DA0134FDDA91CE6F36003C5373526774','',41023,24,'',NULL), -(406,178,'7F794E0811DA99DABA76CD9925B3E78045425E32880F05D3','',672746,23,'',NULL), -(407,178,'08235E08E4F83DDEA588D9FE32BD084FB26BDA6DEBB1E416','',668874,23,'',NULL), -(408,191,'5EF7C22867612F48FE5B41E219A1CA389AE8D32D8F0FC46B','',21660,15,'',NULL), -(409,178,'C7C78789911D6B30FA6E67198EF03B73CEE37576AEBFF5EA','',3045356,22,'',NULL), -(410,178,'62BF4E6440FE3F28138094B46FB469CDEB35008DEB652B8B','',3045776,31,'',NULL), -(411,191,'E24027620A1723C203E8084AD6269A852CD50D6F79D50530','',36544,55,'',NULL), -(412,113,'49CA50FCF2699AE5F4A867156A5D8053C4239B36DACE170C','HideEx',0,0,'',NULL), -(413,191,'073F4A76F248FE7C38F799437D475B9A2E9E81FA08B0C6BB','',17666,11,'',NULL), -(414,178,'6ECA7966F2845B9B61C6D9356E4FE4C913FE917808C8AFFE','',684876,29,'',NULL), -(415,178,'30BA488B3964465B142E75F6D1E1BA42DC9F489C3AC70BDA','',2299092,33,'',NULL), -(416,178,'55492051D368975D444428D6218A7D731555ABF7C3391E7D','',3049888,31,'',NULL), -(417,191,'94E0CEC4F7BDE7844C4D4ACF62E5C96ECF1D11FC2169CF8E','',433168,48,'',NULL), -(418,191,'5003A599A1162170A30F1906C0AD5B16DC7041E72D28A4B4','',28956,17,'',NULL), -(419,178,'686F700B2223502053CAFDF9977D8774E905E76B8C960E7C','',3049492,22,'',NULL), -(420,191,'F5A776E794B34ABBF93CA93E9230B7224CA088AB741DCB57','',13291422,37,'',NULL), -(421,191,'4A67D56DDA6B0E7D9117CFDB17EC6572E68B9300609FFE3C','',28956,17,'',NULL), -(422,178,'1B695DF78AA0708221E0EC2F5A69AB7078ED8143B2EAD174','',668874,23,'',NULL), -(423,191,'7C8CD40E29AE999923CD8EAFC233E619C73885A0258A6E3D','',21826,11,'',NULL), -(424,191,'73407824E9064DF5F1161A204A272A9CD69026EB4DF1004A','',29916,16,'',NULL), -(425,191,'B21609972E46C9BC8C6A77A18161A77D0C1D4001DC892DF1','',41080,24,'',NULL), -(426,191,'BB66A6AC45D02568067987834ECD8BF0A2BD0DAD06D12753','',17762,11,'',NULL), -(427,191,'2550EB7C358B7FB86FAF0EACDDC3111118769F448D93BF7A','',49347,24,'',NULL), -(428,178,'B6E4EF9350CA859576DB74D02C115D5A19C79AA58B0F6681','',684876,29,'',NULL), -(429,191,'451D2C8FF751743B52109FF5D95ED633DDBD8BCDB80EB7A9','',17906,11,'',NULL), -(430,191,'4A0161A4E5D50F11F58E1B23B281ABDA106625E3DC5A179C','',685304,44,'',NULL), -(431,178,'E4F21910D4B5D3E7B5461ED384889F6D0969645AE83F7601','',3037164,22,'',NULL), -(432,113,'B9756E3E1093B54511AC5A7B85711E53CEBEA373EF4866EE','Afde32uu',0,0,'',NULL), -(433,178,'A5AD6C8506004101E42165CD95051A7B5F13FBADD027461B','',710730,23,'',NULL), -(434,178,'B8AE30A02C59219D144EE95228C6CC9F99916F6FE423C940','',700714,23,'',NULL), -(435,178,'DAFD84BA8F977F5CFEEC9310C0EEF8F949F8EB6B827EBE71','',3990720,23,'',NULL), -(436,191,'B42986974893A82D73CC497B3252E9B844A11A99ACF46BEA','',41188,24,'',NULL), -(437,243,'','',11287980,8,'04000000903C9F00','Parental Controls related'), -(438,191,'0DC0953AE42E913121092DF17BC2BEE8BE133D1C53C8BFFD','',17762,11,'',NULL), -(439,178,'72C81E9BA425C54DE57BF4B7745D9C8D6B44D56E8FE933BA','',3049888,31,'',NULL), -(440,191,'100426CD22E80090502AA7A087B094B49ACFF4E7A09773ED','',30044,16,'',NULL), -(441,178,'46C797D1E60CC458E6C9D874650B996D10FC52641C2E7AA7','',676970,23,'',NULL), -(442,178,'DEA2C8A5775AA8CA86B8241BD418979D10DF4587E8E95C87','',250,11,'',NULL), -(443,113,'8807783067F9FF2697A61DEE925760682EB894C6F0A798AE','Afd32uu',0,0,'',NULL), -(444,178,'F63823A1F60619FDE6B4D6F3915EFB03EC03DEBEC82AFB9E','',673210,23,'',NULL), -(445,191,'E4DFD66163F2A65ECDD2EE9CA8062D707CC51882336F6483','',130380,14,'',NULL), -(446,178,'88182C96807A6025E628C90CE436C9EC54EC5FEC858A12B2','',690106,23,'',NULL), -(447,178,'EC322863C90B861E66A0008554BB8702EA92E1406F6F1711','',3070052,22,'',NULL), -(448,178,'9C851C7C05E54E5514E7BE038ABC5C669A3F5747EC573333','',3022016,31,'',NULL), -(449,178,'46D70E5C13F6D16BDD01A7481D9AFA51B73202070CA5D712','',673210,23,'',NULL), -(450,178,'CBEBB5F6F4EFB1324D17AB6CB48C573B639A37EAFD6299B4','',683146,23,'',NULL), -(451,191,'684575AAC0D8BC30D5325D56D3D522380E85ABFF380FA80F','',17938,11,'',NULL), -(452,178,'952BC8983C2CAEB6239BB2774F176A7F87A9F2DC10261205','',3045356,22,'',NULL), -(453,191,'4EAE0459E341062DB99658136D494BD79511B883F00BCE6A','',57602,42,'',NULL), -(454,178,'67E6E0A4006561DC5A67026886D1FF37AD14C5AA1AEA3CAD','',149,5,'',NULL), -(455,191,'222FE6B0A70CE2CEE633597E018706B3F78C338D96F6D9DC','',38300,21,'',NULL), -(456,113,'79747D68A5D6CD203671EF43029F17591E42BBCDB60B8B93','IPSect',0,0,'',NULL), -(457,178,'77ECC7613D44E56210F7CCDD6046226B41C8F087E901C94D','',682394,23,'',NULL), -(458,191,'77A59932BC8D497D992A213256ABD52C4D5F4FFB8A06002E','',49564,24,'',NULL), -(459,113,'2D14DD3BC859535580D8D9DC3BE7D59865A4E3FD112598A5','drvsys_mon',0,0,'',NULL), -(460,178,'9B487CD5032D00424A24FF3185AC4C17246729ECCE431951','',3049872,31,'',NULL), -(461,191,'978D8D1F3E1EF11CEBC4B65B13F1C5CE6E9E220E71B255B9','',13033,36,'',NULL), -(462,191,'1F5AD2397EB3CA814C5D156C6777C040F5D73085F3751C35','',433168,48,'',NULL), -(463,178,'912807952F9397C8F2B718C9164424D720E4EFC681DA3099','',3045356,22,'',NULL), -(464,191,'095F1A232F56B3DDA3338B5DE2CA310E5CF0EC0B6F72E87F','',17890,11,'',NULL), -(465,178,'2A5E27A3EE36254F61795E168A98C055772F88CEA5CCD6F1','',3033068,22,'',NULL), -(466,178,'4319BA4F2139568E87BAAC5F7C95121DD98D710B1C901E2B','',718842,23,'',NULL), -(467,191,'74E55BA8CDEFB5BD54BF1C0B0D326721D756440BA33C3ECE','',27270,13,'',NULL), -(468,191,'ED9FED6EE63B6C5E35C9E4615AC444603F6BF1FBC669D8B5','',13033,36,'',NULL), -(469,191,'DF967A96C67C8D6CB1955D1CA06556F37EEFC88D26F1D684','',90202,13,'',NULL), -(470,191,'2BDB1F4509561B2F846AAE7A5354008215C1EF4BDD0EA1D1','',49347,24,'',NULL), -(471,178,'0F3B3F0934C1B1E32DC9F83F67308BF9CFCCEB0EFE10B2FA','',672602,23,'',NULL), -(472,178,'E89980FFE6987D22DF5379283F53DA8DC3B5CD4862BA22C4','',335122,23,'',NULL), -(473,191,'156B3F2929664A16C3DA2D47CE3050B3A1BC32F9C30E4776','',27270,13,'',NULL), -(474,191,'65B03F581DEAA68B6A07C679C6B620A2623FD83EB4C4978B','',28940,17,'',NULL), -(475,178,'044C63CB9F480E28E02D68426C1F3D69BD146B39A7F081B5','',0,9,'',NULL), -(476,178,'B3BC7201BF77B362B943C8C13F9E70A751906F304F9AE133','',673210,23,'',NULL), -(477,191,'4783BF04A6BD423D63CD955407780BE0E15A70BC2643F853','',28928,17,'',NULL), -(478,178,'A71B471FFB4C58A2C99FC6818DD0269C4AE4C5686D5FDA87','',690106,23,'',NULL), -(479,191,'3EA0347F1F7D9BC9CAE387816DFBE4F492F53533400315B4','',17762,11,'',NULL), -(480,178,'AA5ADEE929B0B2FB655080B35D19607695F611672E6AD364','',3045616,31,'',NULL), -(481,191,'2DAAB5C524CA576967A7B0B713C1C34DA8EBF3990A86730C','',28704,16,'',NULL), -(482,191,'D0042CAE82A7121F7783A1382F542074B34ABFDF50A1B13A','',22792,25,'',NULL), -(483,191,'4D30286AD524AB2EB05C1A361A81036F787B1C0ACA36DD74','',30012,16,'',NULL), -(484,191,'03F9E0F9328E7C7025C0D5C59585700F19E29E8C8F9BF5B4','',49564,24,'',NULL), -(485,191,'430C4F44FD7CDF1A51F7A8FA5852ECCDA6CFA92C2A6ACB3A','',28920,23,'',NULL), -(486,178,'A2886E2080C54F25867AEDACDADD8F5175545F44512A3B58','',672746,23,'',NULL), -(487,178,'8438939BFCD0C550664ADE2DD75DD15FA23DC435EB5FC011','',3638348,23,'',NULL), -(488,191,'66480AAA84C5C00B64EEABE96DD21EB3773228B144E25D0E','',20512,16,'',NULL), -(489,191,'76C1B0FAC29E4E41FC6DAC31A0592CB0087BCE0D052904FE','',61874,42,'',NULL), -(490,191,'DA219765DA22ABBDBE5486CF7DB01C283FBF9986732C9A91','',37180,24,'',NULL), -(491,178,'F58BFE40291DD85F45C47E0E255594382DE0180AAE1F1FC9','',149,5,'',NULL), -(492,178,'8D8A305C43A3DD47DE550F256BD5F4B1753EDCC079AF279E','',3070052,22,'',NULL), -(493,191,'69CA60928A9A85D79ED39596C018DF899BD14C6219EFE088','',41080,24,'',NULL), -(494,191,'8D9AA947B904C003D06ACDF4EA0C84104612B274696999C4','',17890,11,'',NULL), -(495,178,'289CBF469FC750449980BFC2CA6AD7E42A69E14595D140A3','',209352,75,'',NULL), -(496,178,'49961CDE71B612E5432EAB389E7AD193476E05BB2778B751','',700714,23,'',NULL), -(497,178,'43818F9575A04BF426F4BE167052859015CC63622F7D4F3A','',672746,23,'',NULL), -(498,191,'7828B55FDE24719EC377E29FAE55BA6324020D00CD42A99D','',360508,13,'',NULL), -(499,178,'5432916108AFDFA313B6D88C886D87B5722E43EEBCAFC627','',0,8,'',NULL), -(500,191,'106F24060B7A4FC87A7971A4B0EFC1021F7181A09598C336','',17906,11,'',NULL), -(501,191,'13AA99805639421566A2652F0A7104939EA52EF0F77CFB03','',24812,14,'',NULL), -(502,178,'D0938B578EC70162A30A25571CD5DC7E765780F6191EAE1B','',710730,23,'',NULL), -(503,178,'70FA2C3749960F1B0D881FDB186DB9992D6EFD30C6674104','',580768,52,'',NULL), -(504,191,'BCA2CC6F5740DEF5D01D314146879036A5B6965C01424B0C','',45223,24,'',NULL), -(505,178,'47DD279576A64BCB3A4AF23D55895600C73BB5C214B70AEF','',3049452,22,'',NULL), -(506,178,'09C9B53C215456866BF764553A7B7E4F1F20F33A8D2CB613','',3638348,23,'',NULL), -(507,178,'3EC2D3876D82F424718D3B8E0B87562244C3F5A11A29F0E8','',682394,23,'',NULL), -(508,191,'7B4E9BBDC89694CCAE5BA6996D4240EB2E0C9C7F03CC5D40','',59620,13,'',NULL), -(509,178,'E2333772B05ABC620076EB66CFBB4AFE2313CCB6D719399F','',3065956,22,'',NULL), -(510,178,'2EB4C04C0946264F5BC8EFBAA832CA97381A8A6523BAB093','',178504,96,'',NULL), -(511,178,'0E3DE8374276C08D5DD241ABA2AC0AC1D2319F5CD22AAB52','',2303444,33,'',NULL), -(512,178,'FDB8DF478DADD2E36619D63D04D106EDB86EBF8FB9EC8CB4','',3000288,31,'',NULL), -(513,191,'BA76761FA5F569497047C3484FBC6FDDD8AFA71B96FE93C8','',24812,14,'',NULL), -(514,191,'2496E15413F7008A01FA53AC109C01E45B80BF2C3BC2F205','',56063,25,'',NULL), -(515,191,'CACB6383E8613E41489D93D7FE7235BE61214F9AE0825F44','',13291422,37,'',NULL), -(516,178,'931C403D2562AEE58EEB2586D73D51323A3A739860290AA6','',690106,23,'',NULL), -(517,191,'1A95AFB270B9C0D170E7280816891492C21E87D92E9EA6E5','',433168,48,'',NULL), -(518,191,'7483929857AE7A16C2D9EB0857EB1D5E9477479C2EEF0B5C','',37180,24,'',NULL), -(519,113,'379E1F6905F203E1026DB54A58AF588EF5726D9F50FCF369','Afde32uu',0,0,'',NULL), -(520,113,'08394625CCD77F36897EF283FAA0C019EE9F36775182584F','Afd32uu',0,0,'',NULL), -(521,191,'D9ADFC0283E75A86A3E1672BF50F5D1AD8E8466AE7086437','',27270,13,'',NULL), -(522,178,'D37F6219417C0E5196D3A4473D57ED767E6D9B49BB2B9555','',0,9,'',NULL), -(523,191,'93AAFBD4B8B50D6AE72F3BA7002D76791942D0EC0E61253A','',41127,24,'',NULL), -(524,191,'F9B132A5E1FFF379EC7175C12A58683C85272CC96E03E161','',41023,24,'',NULL), -(525,178,'1867D3CEC9379D1E6B8A1B9B667BDB1B6084B02ED9A60864','',3037164,22,'',NULL), -(526,178,'86548378A25632100F7E6E872ECF4D591B7542D977B623AE','',3049452,22,'',NULL), -(527,191,'9E00F6F9AF1D63FA2628E60B7BF2B1D63EFDD42D69929A73','',41080,24,'',NULL), -(528,178,'7DDD4CF1352822A1F9D19775498EE865FABB26C69F8FDEFE','',209352,75,'',NULL), -(529,191,'3D793384AD147BDDE98743EBE1E943263EFD6CAD542E2757','',17522,15,'',NULL), -(530,191,'9014AFDE93FDAC6C20971BEE76898FBB300A744CCBC24DA1','',28956,12,'',NULL), -(531,178,'D1212D7155D2C3114DA596070139C0B3610597CA0CE1CB17','',149,5,'',NULL), -(532,178,'BE18517661568A9D7F3CC9548592867F3A987A705866F60F','',3049888,31,'',NULL), -(533,191,'5D833D8DF05A7AF50DF945F5AF6880D325AC52B3ABC815AF','',41188,24,'',NULL), -(534,178,'1AA3B0D9AD368562F181E4E5D498652B3859210C126824D8','',672602,23,'',NULL), -(535,191,'331E027A700CAFDBEAC9E80B68B8304D0895D52947447448','',501956,48,'',NULL), -(536,191,'8E704337CE9F823A8A93947130ED1EE14A99F2EDB5458B94','',12194860,37,'',NULL), -(537,178,'BB1C818F79DB2F1FF71B7CB181021EB4F425311D09DAAE81','',0,9,'',NULL), -(538,178,'F1AD484D3F189A08EBF420C235D16ECAF1B485092FB063D6','',3045776,31,'',NULL), -(539,191,'1CF7028BE4D68B7AC6BB8061BECBFF402860541D04C90C0C','',17906,11,'',NULL), -(540,191,'2550D8249054E57086D4F4CF80396C686A71673C070711DA','',17890,11,'',NULL), -(541,191,'E864BD00AEB4F3D18CFFA7AADEAC7926A9A1E3EA7588F17A','',29884,20,'',NULL), -(542,191,'9E70338B4C8C845F8514925463DB624FC4423F9C467F5E62','',685304,44,'',NULL), -(543,178,'FC5EF49EDEE7A5268395298071BBA270822547A7416AEFB1','',3634252,23,'',NULL), -(544,191,'8282F57B7C3CD9B449B6363D5C9E792C2044EA2C3F381F9F','',17282,15,'',NULL), -(545,191,'B793EEE20E44B2942C6522F79343C58738A1A8489A381FB0','',24812,14,'',NULL), -(546,191,'6178EE9E575927A3505835AC88DA31BE15F0622DA55B31EB','',28956,12,'',NULL), -(547,178,'7BFD2D88793D6AB1A2351A3E8873B1E20CF44BF6563A0930','',3049888,31,'',NULL), -(548,191,'4102F13984A4E146C134D3F607AE7CA1B3263A22B52308C6','',447736,48,'',NULL), -(549,178,'EA1C4CA2A64548757BC2ED1C5BB6D2B5094AAD5B5C331F7D','',683146,23,'',NULL), -(550,178,'BEB42A9DB2B656B2DFF3DD7D1B8D87033F1D99A019CD4BB5','',3045632,31,'',NULL), -(551,191,'4E209437251EBB0CF31CF8A7CCF2C873A4D759B9563D573E','',34176,25,'',NULL), -(552,191,'85EB9C8A36B32287F096CF73F7FAE8B57405321342E9B779','',17666,11,'',NULL), -(553,191,'2EDE42629DD4A72669FFC9BBFBE15F357BF241853DBF7B2E','',27270,13,'',NULL), -(554,191,'FF47A1D9514F4DD81BDA23FC9018F03D894F9096E26EF809','',18680,35,'',NULL), -(555,191,'65185BBCA1D9995EA4B796E908B9F78923FDAE2D0C2500BC','',594348,26,'',NULL), -(556,191,'BD55E51B55A8FAB82CBF45012D761B1BEEE9BC0DAD8A83CD','',28920,17,'',NULL), -(557,178,'AACC3E694ACD478B1F99714734B5A43BD7D7A2A3565ED9B2','',3049492,22,'',NULL), -(558,191,'F3C07663325C5358F58A547725FBDF8DEF591021CD94513D','',685304,44,'',NULL), -(559,191,'503B5AB938616DE7672103919957B421FA8B6C98F72375F6','',20512,16,'',NULL), -(560,191,'3B6EFA3FF9443BEF4CBD2E7CAE08DA1753C79E5EDFA8510F','',37136,40,'',NULL), -(561,191,'3E5D1B5BBAD191442388FBD5236F5406CB2CA68EDF986328','',17666,11,'',NULL), -(562,178,'D8AB51DCC7840369846821B2A6B229CBA2E42C0CA566792D','',0,9,'',NULL), -(563,178,'F8004FA24C4925FAA3ED4993B0D457C5E4C5371915BB93D0','',3037164,22,'',NULL), -(564,178,'EAF4A696D564F6BC800BF0F6D732E4E92B50133DE02EE8C4','',0,9,'',NULL), -(565,191,'30BDC2BC3E4A2055426FA0EC67DBDEB7705C58047EFFA4D6','',61874,42,'',NULL), -(566,191,'3C8BCED97B2F9E5A52587E725004E136DED2B53AB2DB9D4F','',20512,16,'',NULL), -(567,178,'0B586F15A8CFD6B7A96632FF2B48D0F71E9D06BFAC174002','',3049888,31,'',NULL), -(568,191,'B2B3043BF9CDF3DB535D52ABC45BE586E6B8097B58D82C45','',17890,11,'',NULL), -(569,191,'9ED22064CDACF86DAC8C365C325EE428A87B628D137E038E','',28920,17,'',NULL), -(570,178,'2254B046D6D8D1A47E5F9275474B5EEE7A96CD99E8D952E9','',682378,23,'',NULL), -(571,113,'0A268B6DB28320A1956B54C36C61C625B02A48A4768A0823','Afd32uu',0,0,'',NULL), -(572,191,'41B3450DB8D10C506A561C7B95354A7792286D837C08B437','',12194860,37,'',NULL), -(573,191,'5CEDF5982800D9C6D16F9D357AEA17BBBAABADC8F3A12EC6','',45223,24,'',NULL), -(574,178,'3399D1DE6156FDE8614333B6C4AB0F5B2354381AAB7AF818','',3049872,31,'',NULL), -(575,178,'31DA5322A7B1F1715CA35F0976C201122A76D46A719F0C28','',335122,23,'',NULL), -(576,178,'36172791F3ACC5EFD406A7AD6F5D218279B94D458BDD60C3','',700714,23,'',NULL), -(577,178,'C64DDA3E5D94BD0DEFEDDB867DD304177B554C5771CF4DEF','',682378,23,'',NULL), -(578,178,'701D57AFE1315795AFE1340C35E923FE69C36EFC670C0BA5','',0,9,'',NULL), -(579,191,'D55BBE3C196C2FE07829CC54717C0A2A27C13A38ED4CF582','',30012,16,'',NULL), -(580,178,'DAD3C22D23FAB30C9AA6796E19EAB23CB7DCCD639854C14F','',3045976,31,'',NULL), -(581,178,'B3EC9710B55079104420F126BA7257F8FD7DC39D46880E5B','',2299060,33,'',NULL), -(582,191,'7762CCDD012D51167BF42F775CC307238C35EA5DA55B999E','',41096,24,'',NULL), -(583,191,'CEB7B2C893B8410CA8716C77DB679AB860F7F0E86BCF2D8E','',12194860,37,'',NULL), -(584,113,'C584FF543FABE32DBA3206AB324CAFAD92497C4926BBF8B2','HideEx',0,0,'',NULL), -(585,178,'122B96C9AD3D43FA5EE82ADFA464904F304EB7FD4CB5622D','',2299108,33,'',NULL), -(586,178,'3EFBC5B273BFF42D9F704C74DC2381B8A0D50D61C2F1512E','',717898,23,'',NULL), -(587,178,'8C5824E4A6D16714A2BFB5FC9D0CBF4706B8A2170DA87D7B','',0,9,'',NULL), -(588,191,'402282B90E06579656CF454305C0B5A925C95FBF6A7CF265','',477928,60,'',NULL), -(589,191,'71B36C6D650EF0D049328643E5B12E73DF95B58B2F30D0DC','',17938,11,'',NULL), -(590,178,'7C49C303394E1493D897E802528CA8E558B6A7BFE8320F08','',3037164,22,'',NULL), -(591,178,'2C190F9E920AF2EF67DA4D06905C2A6A0A2BC63D0192BAC5','',3045632,31,'',NULL), -(592,191,'E59168C40E1A0C9F8896EA9E2D684988D81A522FFCDC51D5','',3766400,37,'',NULL), -(593,191,'3C825803D3ABF20A11495E54718A2D83A0B35FD7D741B5E1','',12905,36,'',NULL), -(594,191,'DCF32E3E1C5DF813DFB137A2D9B21D95B0AF66CC2AD0F245','',41023,24,'',NULL), -(595,178,'7B66BDB4A0A713A7B315888708B88F90CCF7313832CCE35E','',3045356,22,'',NULL), -(596,178,'FFAF20DD14D7018A4156F000D1455DF36966513EB76F93E7','',2299116,33,'',NULL), -(597,178,'0C59AA1F05D2D9D3C0C5ECF6A38D9FF57187A7A461DEE908','',717898,23,'',NULL), -(598,191,'913AA6D16EBE73143FA4B4EF89C786668C6E7DD0B936DD18','',90202,13,'',NULL), -(599,191,'A9F5CA81A547D8F8051928A287DD280F7FE835B2858CEED5','',20512,16,'',NULL), -(600,178,'16B4D8897AEED4732A47239CDC99603D2F505D0AD602847F','',673210,23,'',NULL), -(601,191,'23F29E10D55E8701A1A699A1C05CED4553676E9FBA5B51F5','',13634,11,'',NULL), -(602,178,'9A65A024256C0D7D677C9F24A9C16A48BEA9B03CCA016098','',3000288,31,'',NULL), -(603,191,'AA0004288ED58DE4324FA521F849807DB1EF33634C7FE8C3','',61874,42,'',NULL), -(604,191,'E400A401BD0376A0475F1216731F5EE0DDF42C9A4FA805D2','',59620,13,'',NULL), -(605,178,'FD434987A57E848192562B61CA0D67BDCEA2392514CDD0AF','',3000288,31,'',NULL), -(606,191,'88C140A6580061C775D9141887FABD3F20E574DC4C0C4BBB','',9977,32,'',NULL), -(607,178,'3623B441A5D414AFD6650C8B8623ECF3C3A9129E1F5A81C1','',672954,23,'',NULL), -(608,178,'393A06D430D287FEC1C02F9945C34BA2A7954241C6357909','',335122,23,'',NULL), -(609,191,'0955A3267A3E576B9BD823BB210E8200F37CCB0421BF208C','',685656,44,'',NULL), -(610,191,'1A00ED18B456ADC1A1F39A5DEF572250FB0CCAC8BECA9DD8','',477928,60,'',NULL), -(611,178,'370B9B6E3AA987595F986C5716BF9FFCF0369438D5DC5D11','',156,8,'',NULL), -(612,191,'E8E85DFE24D8D20852A37D702CDF029C3B1FA30B99CAA4BE','',447736,48,'',NULL), -(613,178,'FA24C5FEEAF4538DD4913F10C99F3F64380B7354EB318386','',3041472,31,'',NULL), -(614,191,'C6AD92AC13B340575AB5D0769A1A7EED47BC42A5968E67D6','',37136,40,'',NULL), -(615,191,'990EFFE367D44A29E82F62C57B6041A66F66C1D100B05639','',28956,12,'',NULL), -(616,191,'631E42C3B6ED8A22F5AFA903176A7EB011754F5ABF2081EF','',3766400,37,'',NULL), -(617,191,'D8AB4091C51177D7BBA7384EE12E0384A7EDB73E38D15920','',13291422,37,'',NULL), -(618,178,'54AAA1926869D259C427870A620AE0C24AFC9B472F424633','',3049888,31,'',NULL), -(619,191,'CC0E40919988E53DA0B447F0984A30D51CC42E9DB54A8F1F','',49564,24,'',NULL), -(620,191,'396E7EC540DC2C74CD6709753CC627517E3A2DB8A1EF3633','',29916,16,'',NULL), -(621,191,'84A5A077180DFB9841E8DF4A4EC49EADE886D905768EE032','',57602,42,'',NULL), -(622,178,'072300C283F8DF72B3ED5F3CD8B7DF47574AECF7B21FBB59','',668874,23,'',NULL), -(623,191,'D4FC9A6022B7CFA81904503E43B813631D4735D80BC61868','',9977,32,'',NULL), -(624,178,'47B5A19B87234257CB6C1485AB2C0CB25513260F60094BEE','',3037164,22,'',NULL), -(625,191,'B8B6F4BA5FD45F0ABDCB060F72987987B6EF62B80C9E378F','',12194860,37,'',NULL), -(626,178,'261F2915266F20B7289A1560176F24198930C61540BEFA01','',3638348,23,'',NULL), -(627,191,'019A378006B0677C0B2F42C6CA882EC571D504E7D8F5B05B','',17282,15,'',NULL), -(628,178,'4E82DD9F04571D6DAB2FFCFCD638699D1D4C84917F720F32','',717898,23,'',NULL), -(629,178,'EAA75F6AE049552C55AFFDABB7268682428B1A9BF028C4D4','',673194,23,'',NULL), -(630,178,'F1431C669453FE0BD95430ECD8328EA0D3CD37BA658F094E','',198,12,'',NULL), -(631,178,'8AD8C581E8BAF7A2140211C4298A93E229493F272F4EFF4A','',3045912,31,'',NULL), -(632,191,'C154E3B6CE0B979BA98FEDAA1829DCCF2A7172642DEF9EFC','',37180,24,'',NULL), -(633,191,'295A29C81B1B9CC9B6758440BED913ED4D8B5E05A90D7CE7','',41023,24,'',NULL), -(634,178,'3ED9105E3D1F31AD1D4376C54B07D18348C56E7453D161B2','',690106,23,'',NULL), -(635,178,'74C75B8F0147ADA8610F6C9BB80C4BDA543C1D95943ADCEB','',0,8,'',NULL), -(636,191,'7BE7A7D3F4AD8B30A0A144D5D4AC5E569BB9A0D18AB590FC','',37180,24,'',NULL), -(637,191,'0B5C54A4850924038D95A3F1C44F300921CEA1E13644842E','',57602,42,'',NULL), -(638,191,'876743AA30D61C83444427F4F18203B2FF443C337E5DD190','',22792,25,'',NULL), -(639,191,'C83A14C21D1E66345574E3E0E3613E924F702883A30A1809','',31924,23,'',NULL), -(640,191,'2545F02B4FC2F5425960A2E5C0299936C99FF2EC68A5ECDB','',501956,48,'',NULL), -(641,191,'85EF9C6353712A8D0E2E27B1702B510A95B1305473F86345','',41023,24,'',NULL), -(642,191,'35282392AA86692A153FC159D6E13C74F9DF01661E4867D6','',13538,11,'',NULL), -(643,191,'0D6CC3008615CD5BFB96A90620805B78D5BFBC6100B1AF0D','',13538,15,'',NULL), -(644,191,'D573179188521C485CFD24A9EE9CDA77C540A31EE68E3E78','',41228,24,'',NULL), -(645,191,'8FA80694C3766FC1B041103EB35EBA3B7C77081A5DA8FFD8','',28940,17,'',NULL), -(646,113,'CD6B8F9D23612C807F7653D29F1F1C54BC8F917C5C5BD8F1','Afd32uu',0,0,'',NULL), -(647,178,'FCB5CF830DB536208D4C58E5838D1C8798F0738247EF0867','',672602,23,'',NULL), -(648,178,'4451680A3F41926C1545701887F93A0A49CC29C3E114AADB','',4011280,23,'',NULL), -(649,191,'6BE2C4F29ADF49AE5BF0485A27A854087E775FA28047168C','',27270,13,'',NULL), -(650,191,'016FF5D8685E37969B1B7C310756DCD93D4AB34256837031','',38300,21,'',NULL), -(651,191,'6726DA4A8F112CC25DD78500CA9BF792DB688F7D8D1FBC4B','',57602,42,'',NULL), -(652,191,'9F8B3A3C70027496420A619969CF1EB7AF447D245DA766A0','',29884,20,'',NULL), -(653,178,'E74FFC8ADF5FE8A0FE0F10BCABCFCEDB3B2B9C2307340D7C','',3041472,31,'',NULL), -(654,178,'B31302D6A47971059B2643B57D2D50EBEBEAA89BE483F1F4','',3037164,22,'',NULL), -(655,191,'2F761DEA3CD3394A0091D745FD2976B52F3B16BB0A48BC80','',29884,20,'',NULL), -(656,178,'8E44EC966A93870696359D3E2474D12C071A381B9403B1B9','',673210,23,'',NULL), -(657,191,'2424AFA7FEC48FF09E5E3BDAF93FAA74743A7551B6FB1495','',56063,25,'',NULL), -(658,178,'ACCF5804D419F30643F87A650C4DC6E0E10266922692AECE','',682378,23,'',NULL), -(659,191,'6EC19D6D1244E3FE787AE448EC905C509DBA3C01FBE34F24','',41280,16,'',NULL), -(660,178,'5B2D2EE40383C33D381998995210918AC6B1AD67C5880F6D','',710554,23,'',NULL), -(661,178,'83FFE0F8F224D5E56C38D731EFE8AD5AD1285B1AD4FA019B','',683146,23,'',NULL), -(662,191,'9D67A809FD8FDA1E1504F0C038E21E1D5FC4C6D11F426228','',28940,17,'',NULL), -(663,191,'2965EC092EC0A4B3D4A3C781F0A0A542824C77B7300BF50C','',45324,24,'',NULL), -(664,191,'FE31901F5558E6555DA6BC5B1BC3415E82CB97DECBB486BB','',41096,24,'',NULL), -(665,191,'B35406A77D6501A50F41981C7C137AD5272EB612F4A74109','',29884,20,'',NULL), -(666,178,'7275397E511B45264BCFA30E3A3F8101894AA3923D91BE6E','',3037164,22,'',NULL), -(667,178,'CA7D8D0E1F20385DCF6FC209799750CE9D0160B0C67196E7','',700714,23,'',NULL), -(668,191,'F5CCDA244D826B3180E7C49193B3B0B5DBF651EC67DCB47A','',594348,26,'',NULL), -(669,191,'7977F1E72B30179072EE1784396AB0406D06162051CA1EDB','',37136,40,'',NULL), -(670,178,'603F8A015D8436CCBCD68B26FF6006E7A81BA9A8D9524B1F','',3045356,22,'',NULL), -(671,178,'9631E9EBC78E0333010E522045852C7BEA44655080D418F3','',3049888,31,'',NULL), -(672,191,'43BE7C00605D9FECAEFAE38D8FFEAED78B8382563A245F10','',9977,32,'',NULL), -(673,191,'E493F1BAED1DBE7A0D429BF1A5D665636D29069060310BF0','',13291422,37,'',NULL), -(674,191,'6C53203FA95EBE4DBB0A7F3E85994058DECA069A5244C29E','',130380,14,'',NULL), -(675,178,'5A07E5A0525DBD5005CBDE16F7393EC8B795ADB2327C2F96','',3045356,22,'',NULL), -(676,178,'D7665366F333BD580C5F8E2FF8971294F69E99EC7E3623F3','',717898,23,'',NULL), -(677,191,'FB87EB8F178C69D9F7576AC7FF75D0479467057A2B6C956D','',9977,32,'',NULL), -(678,178,'292911AC98E7ED34DF021B562D5DEBE8DAA15570B552978B','',3000288,31,'',NULL), -(679,178,'6618F45C49D47C4105070C085FD5C384254A62E4AB614DB9','',3634252,23,'',NULL), -(680,191,'316E531545999AFC533814888434999501FEA8ABFBAF8655','',134968,32,'',NULL), -(681,191,'9945ED64886F68664A4BDF50731F4B4DC680273AB2E0DBCB','',20512,16,'',NULL), -(682,191,'1D4D6EC7B6B26553FC914D28BF9B62FD81D0B865DE606D97','',29884,20,'',NULL), -(683,178,'63B2D2ACF6E912CDC68282B080A2D610BE6AFE8EBB95FD31','',3070052,22,'',NULL), -(684,191,'B0955BAC042D5441496103E7C45E38609A9AE3799D534BD9','',18680,35,'',NULL), -(685,178,'6488E44D4E965581650F73F6E68DD8F863795162D99104F8','',682378,23,'',NULL), -(686,191,'CC0D3F7D8FCF928A55F92F6414F4AEF7AD75DED5819BF870','',13538,15,'',NULL), -(687,191,'CD3835965AF27EC338F828666CD06089B847B04A2DD56AE0','',17938,11,'',NULL), -(688,178,'D04E9CF6A03D4767AFF1E4EE0EFBC333AEBA5B0552F15957','',0,9,'',NULL), -(689,178,'120904F033D78A13DB0971F095C809852B7EB876D1A8AA01','',3045632,31,'',NULL), -(690,191,'7DDD19DCF77E27DF0A31BC21C7F716FF85076AF065F102DC','',36924,24,'',NULL), -(691,178,'5486E2CDD98AC3F25C223FD515CE7EF3FB09AC12ED338C86','',198,10,'',NULL), -(692,178,'F8D6423F01E5369D16F6F70180083B936F0DDE3737B23308','',2299092,33,'',NULL), -(693,191,'EC10CC349A8E654240B27B03EE1232B9CCED28F7104CCB71','',49347,24,'',NULL), -(694,178,'29E064ACC509206873A1D548F4816DB60D29D6EE9FF63A56','',682378,23,'',NULL), -(695,178,'E1A8A2A81920A7BA9F419A6D19CAC3DD9E292EF39F963234','',676970,23,'',NULL), -(696,191,'32393EB09F7C829F58612E5E47018F7203C43218C3506C79','',20512,16,'',NULL), -(697,178,'AFC4D19CACEDE8E9A2FDE3CC3D29CF8556AF4980872DFE1A','',3033068,22,'',NULL), -(698,178,'09A2B97FD351B1D339030233AC51C741E0ECDC21AA7A152B','',3049452,22,'',NULL), -(699,191,'2B2AF2171B8A9FC0D44EFE0ECDCB9DE1A55ACC8D83661E16','',41023,24,'',NULL), -(700,178,'D111B236DC42EB338870E72FF6EE3141714D0437864B02AE','',3045356,22,'',NULL), -(701,178,'E6DC6898929D1DA9F5768A9BFCBE848F8C1F31E8B6910FB8','',335122,23,'',NULL), -(702,113,'85A32F8B5F8430A086D27E62EB17D878E49CE815F6AC91CA','IPSect',0,0,'',NULL), -(703,191,'B6CB7B905A6BDD64BC032BE71927C1FE31153D14D6CF87E1','',447736,48,'',NULL), -(704,178,'40EE7F4EEE1D707ECB770CDBBB54730CB863CC8E268D4208','',3634252,23,'',NULL), -(705,178,'D74E308262D8C52ACE81B66F1D90C160AC86B2E0508176C1','',0,8,'',NULL), -(706,178,'E15287D29EE155299619F8E93E66B55B564FD921FA41CF50','',3049452,22,'',NULL), -(707,191,'58DFAEE44A52F0D5A58B0C94F0E5E63C1C7F76206D7FA7CA','',22792,25,'',NULL), -(708,191,'83705EAE8AAD9709494E52EB05AC0481C998C15730E61099','',30012,16,'',NULL), -(709,178,'0271F4D624304A48CB7CDFA016E3A735DCA3170FAD557468','',3070052,22,'',NULL), -(710,178,'217DFFE3C12F984992E1E0AE7B5864061572BA301B21D869','',178504,96,'',NULL), -(711,178,'C5C7AC33D1E4CF33E661033006BFEDE08523B643CCF51261','',3045356,22,'',NULL), -(712,243,'','',4618113,10,'FF1554F79D003B470C89','WS2_32.Send'), -(713,191,'D45144FC835266270E67CFB1F2900FD227B63204698A3EA7','',50040,26,'',NULL), -(714,191,'B5BB832AEEC591196864E08A392592C5789D76D3DDDD4DBF','',27270,13,'',NULL), -(715,191,'93582814E00150E2DD750ACAD7BD1719C4EBCD4C06F482AB','',28940,17,'',NULL), -(716,191,'FD6B6AC7FA5F2E7828CB1B429A9442383BD93E762A5D7D00','',31924,23,'',NULL), -(717,191,'51DF4EDECBBE42CC7C5D6723318F98E43E14A45F41CBD124','',41080,24,'',NULL), -(718,191,'F2B2260FDD23E5F268FAAE4D1A48E74C452F2AC5D114765D','',57602,42,'',NULL), -(719,191,'69FBDB69EC2E113EF691E47EDD46E40F03D1EBE226A1F7CE','',29884,20,'',NULL), -(720,178,'E3E431D8F8FB38F0F2586D0F50D809BCCEB13651C5EF2619','',682394,23,'',NULL), -(721,178,'2294015927F07D884FE2923FA17B3A8BCABC0A378930CF84','',679578,23,'',NULL), -(722,191,'0A022AB25C52F94404A01F96687B2D6E6BE774237254BD05','',20512,16,'',NULL), -(723,191,'65EEE243504EDC3319C3528B1A1E8061A3E75F4C25B61F95','',41228,24,'',NULL), -(724,178,'877C654036A29FC108FE8D69D416361732D7A0270E51189D','',3022016,31,'',NULL), -(725,178,'1A223564DF9E7BADD3CF858FB8250FE59F892232AC3B412D','',4011280,23,'',NULL), -(726,191,'4FEDF58FB4DE45289C97ACCF16EB2DEA6FBC85C74A52D3C9','',37180,24,'',NULL), -(727,191,'D4BE47EA1D68B92E2AD8307D139877705BE2B6A98B6A916E','',13033,36,'',NULL), -(728,191,'9658AC7EF426A52C327BBC1ED71C6FA6DC5940E35DCC18C7','',18680,35,'',NULL), -(729,113,'1B17998CD8E0CDA4D84B0A0F9DB05E536DACE0348A883D24','ndis_x86',0,0,'',NULL), -(730,178,'BB9B86ED12359A465B02387A1D727F11F78D35C8B7FCC2FC','',2299092,33,'',NULL), -(731,191,'842BC1A8C53902D26018B1C5E05ADCD70D973A968E298331','',50040,26,'',NULL), -(732,178,'3E894F9682573CC0AD54C7E9873C9026AC050929392D0B93','',3049452,22,'',NULL), -(733,191,'4A31E3D24FD6D576D84EF1BFB813D0F066870DEB38C32E47','',21826,11,'',NULL), -(734,191,'EEA122B4C066EC0B196F67511E633EBACB37C4EA6AE4BFF7','',41096,24,'',NULL), -(735,191,'66211671BEF80FB973B1C9595A70B462AD79EC83530DFE89','',12905,36,'',NULL), -(736,178,'3760BBD6FE99A0BBEE0AB61A8BD52A6ABCAC48FF3CB265B8','',3070052,22,'',NULL), -(737,191,'70F425426612D0D8495386C2375F7A4183548C0D4E7DFA46','',594348,26,'',NULL), -(738,178,'BB310E9DDE9259027123500E65F9FA1E8D9D0F5FE8381CD2','',3638348,23,'',NULL), -(739,191,'6FFB5E4982D306680E0C59087DA961CD4F6B068E323C3BB4','',401992,14,'',NULL), -(740,191,'6DDCA79B7460A1F3671532A28FDCEB331DE6CA550E3178D0','',3766400,37,'',NULL), -(741,191,'A8F7B2FB37CF3BEF43D6CE5C0BF85E85077E681490BA1C4C','',37136,40,'',NULL), -(742,191,'052F425E7528B3A7155C45EEE530F915DBB154E5C8876E25','',50040,26,'',NULL), -(743,178,'D6DE200B631AF71BFBC76202D82649942FD6ED9BC4A9EF75','',198,12,'',NULL), -(744,178,'61077261C66B2CF9B199F115A3A656EA6A00068F151E3656','',706314,23,'',NULL), -(745,191,'513FC0F0673A9DF86FA1FA05371040C14634CE08311ED619','',401992,14,'',NULL), -(746,191,'5E0970A6EB246A79DDF427CB76D0D921F971E13921DD5D2C','',134968,32,'',NULL), -(747,178,'53CAC3EF654610AC7E043C6AAD62709EF0B5400DBDE755EB','',149,5,'',NULL), -(748,178,'566637D06BAEA9190B7CE510C697F72CD20FE3D958A95A25','',3049888,31,'',NULL), -(749,113,'3C9B0CC7FE020EEBD43E6B1D88EDDF0EC46AC35974765068','drvsys_mon',0,0,'',NULL), -(750,191,'BDFEE5DCDD37FC5B2A1B3E42FBE5F7997CFED35E86062EB6','',28920,23,'',NULL), -(751,191,'7794AE60131E4D07860DB48047206784B885B30457EAB83E','',12194860,37,'',NULL), -(752,178,'653A308BB00D914AE1ECD773BA4B0BA7724874BC62647D10','',3037164,22,'',NULL), -(753,178,'06B696C35F905E75B451A02E121BDA0330CD44E0D9B872BF','',60648,56,'',NULL), -(754,191,'35E8CD9E8CBD879B1E53278926C634AA8B72B8D9A20009F9','',17522,15,'',NULL), -(755,191,'9B13F2E744904ADAAA062F9113A576D11C2C450D1CD6A4AB','',13033,36,'',NULL), -(756,191,'60851B4A6F7338632A84795FBBB20320E49AD2CC2034BA80','',28940,17,'',NULL), -(757,191,'3BC0BE02AE0B6975974D3B13B811EC6BDACBF9EE122BE633','',90202,13,'',NULL), -(758,191,'E47F7DD8D5B5C29B70AFFD4F25AA286167D411937F9BD247','',36907,24,'',NULL), -(759,178,'35D1CDEE86A410DF087DE6D5F5AC6289C4888B9753293E73','',3037164,22,'',NULL), -(760,191,'2ED2EEB29EE0D48477779E5CA875F1F5F15CCE74CA85BDAA','',28956,17,'',NULL), -(761,191,'A373FDB6A789CC46072A4CC51A429C817C40862DC6C0190F','',30012,16,'',NULL), -(762,178,'3D02551F548DFB58832626FE90A7AAA12824D93A54A0DC14','',709322,22,'',NULL), -(763,191,'09D04CF8ABC51D06D874784442987E5F2631041550607255','',36544,55,'',NULL), -(764,191,'F3CD473F8C85977895CA5BA9DC22185BCCBBF6B977205193','',448492,48,'',NULL), -(765,191,'30E2F23DB1038D16D2DEEAB1D0F1790D961E468368DC5108','',30012,16,'',NULL), -(766,191,'540D465F760320A63981289D30CD40CCC770EE126523C71D','',477912,60,'',NULL), -(767,191,'C461E1BE054FE29A1FD58B33D33890BC4A1279DE4F572B47','',37180,24,'',NULL), -(768,191,'1AC3D903CFCA11321E76A257BDA0608E5060030BE745CCF3','',130380,14,'',NULL), -(769,178,'96281A2887E61232007D7015E4A35DA118794841A8EC84BC','',3037164,22,'',NULL), -(770,178,'8A1AC926B46A9E3D60D3BD87A59FF77D7B80A1510BC327A7','',710730,23,'',NULL), -(771,191,'3620B6BDF3993B87FD35E906FE8376A04FF34684E2023D8E','',41280,16,'',NULL), -(772,191,'025C373F05EC6E809EF5A86A903570FDA14D219286BCED5E','',448492,48,'',NULL), -(773,178,'5C0E4EE98C4E34CBE44F6BD595C13DD675555164A8D491DA','',710554,23,'',NULL), -(774,191,'BECE667BF9443EF6515E8E154F74FC2C5817455C8636DB72','',501956,48,'',NULL), -(775,191,'94F1DA3E0D955761826D6BC932E26F44D321B4838C7567D8','',13538,15,'',NULL), -(776,191,'EA3A3AD71FD14B038C98F256E80C1EFA1F45562A3DF92E7D','',22792,25,'',NULL), -(777,191,'AD5A8CBF55EC436DA968EE0B9744C93F65D9E0D6E3C1B136','',174688,37,'',NULL), -(778,191,'9B6B3B311BA9007C06CF0D146BB979B11CF295C58768DD4F','',31924,23,'',NULL), -(779,217,'','RPE.DLL',0,0,'','rEdoX Packet Editor - injected dll'), -(780,243,'','',5345728,2,'558B','Lua Protection Remover'), -(781,243,'','',7726137,2,'7414','Walk on Water Patch'), -(782,243,'','',8016620,2,'7417','Collision M2 Special'), -(783,243,'','',8016079,6,'0F8462010000','Collision M2 Regular'), -(784,243,'','',8054762,2,'7506','Collision WMD'), -(785,243,'','',9995315,2,'7544','Multi-Jump Patch'), -(786,217,'','WPESPY.DLL',0,0,'','WPE PRO - injected dll'); diff --git a/sql/updates/world/2012_02_19_04_world_misc_db_updates.sql b/sql/updates/world/2012_02_19_04_world_misc_db_updates.sql deleted file mode 100644 index 32fada1e895..00000000000 --- a/sql/updates/world/2012_02_19_04_world_misc_db_updates.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Horde Orphan should not have weapons -UPDATE `creature_template` SET `equipment_id`=0 WHERE `entry`=14499; --- Tog'thar Gossip -UPDATE `creature_template` SET `gossip_menu_id`=264 WHERE `entry`=2238; -DELETE FROM `gossip_menu` WHERE `entry`=264 AND `text_id`=761; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (264,761); --- Cosmetic Silkwing should have InhabitType 4 -UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=21840; --- Leoroxx -UPDATE `creature_template` SET `gossip_menu_id`=8511 WHERE `entry`=22004; -DELETE FROM `gossip_menu` WHERE `entry`=8511 AND `text_id`=10645; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8511,10645); --- Spiritcaller Dohgar -UPDATE `creature_template` SET `gossip_menu_id`=8513 WHERE `entry`=22312; -DELETE FROM `gossip_menu` WHERE `entry`=8513 AND `text_id`=10647; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8513,10647); --- Ogrin -UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=22468; --- Wanted Poster "Blade's Edge Mountains" -DELETE FROM `gossip_menu` WHERE `entry`=8242 AND `text_id`=10257; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8242,10257); diff --git a/sql/updates/world/2012_02_19_05_world_say_text.sql b/sql/updates/world/2012_02_19_05_world_say_text.sql deleted file mode 100644 index b70385660a1..00000000000 --- a/sql/updates/world/2012_02_19_05_world_say_text.sql +++ /dev/null @@ -1,7 +0,0 @@ --- NPC talk text from sniff -DELETE FROM `creature_text` WHERE `entry`=7604; -INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES -(7604,0,0, 'What? How dare you say that to me?!?',12,0,100,6,0,0, 'Sergeant Bly'), -(7604,1,0, 'After all we''ve been through? Well, I didn''t like you anyway!!',12,0,100,5,0,0, 'Sergeant Bly'); --- Remove old text -DELETE FROM `script_texts` WHERE `entry` IN (-1209002,-1209003); diff --git a/sql/updates/world/2012_02_19_06_world_say_text.sql b/sql/updates/world/2012_02_19_06_world_say_text.sql deleted file mode 100644 index f69c4cb86a9..00000000000 --- a/sql/updates/world/2012_02_19_06_world_say_text.sql +++ /dev/null @@ -1,20 +0,0 @@ --- SAI for Erich Lohan -SET @ENTRY=3627; -UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; -DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES -(@ENTRY,0,0,0,1,0,100,0,10000,15000,10000,15000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Erich Lohan - OOC - Say random text'); --- Talk text from sniff -DELETE FROM `creature_text` WHERE `entry`=3627; -INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES -(3627,0,0, 'Magical studies stressing your brain? Relax at the Blue Recluse!',12,7,100,0,0,0, 'Erich Lohan'), -(3627,0,1, 'Best drinks in Stormwind!',12,7,100,0,0,0, 'Erich Lohan'), -(3627,0,2, 'Come for the beer, stay for the atmosphere!',12,7,100,0,0,0, 'Erich Lohan'), -(3627,0,3, 'The only place in Stormwind where magic and spirits mix, come to the Blue Recluse!',12,7,100,0,0,0, 'Erich Lohan'), -(3627,0,4, 'Free drinks at the Blue Recluse!',12,7,100,0,0,0, 'Erich Lohan'), -(3627,0,5, 'Feeling blue? Come on down to the Blue Recluse for a good time!',12,7,100,0,0,0, 'Erich Lohan'), -(3627,0,6, 'Head on over to the Blue Recluse. Where everybody knows your name!',12,7,100,0,0,0, 'Erich Lohan'); --- Remove old waypoint text -UPDATE `waypoint_data` SET `action`=0 WHERE `id`=904450; -DELETE FROM `waypoint_scripts` WHERE `id` BETWEEN 432 AND 446; -DELETE FROM `db_script_string` WHERE `entry` BETWEEN 2000005185 AND 2000005199; diff --git a/sql/updates/world/2012_02_20_00_world_sai.sql b/sql/updates/world/2012_02_20_00_world_sai.sql deleted file mode 100644 index 44f8ab68d70..00000000000 --- a/sql/updates/world/2012_02_20_00_world_sai.sql +++ /dev/null @@ -1,4 +0,0 @@ -UPDATE `smart_scripts` SET `event_param3`=2*60*60*1000, `event_param4`=2*60*60*1000 WHERE `entryorguid`=18481 AND `source_type`=0 AND `id`=0; -UPDATE `smart_scripts` SET `event_flags`=`event_flags`|1 WHERE `entryorguid` IN (-85175,-85176) AND `source_type`=0 AND `id`=5 AND `link`=6; -UPDATE `smart_scripts` SET `event_flags`=`event_flags`|1 WHERE `entryorguid`=30146 AND `source_type`=0 AND `id`=0; -UPDATE `smart_scripts` SET `event_flags`=`event_flags`|0x20 WHERE `entryorguid` IN (-85175,-85176) AND `source_type`=0 AND `id`=2 AND `link`=3; diff --git a/sql/updates/world/2012_02_20_01_world_misc_db.sql b/sql/updates/world/2012_02_20_01_world_misc_db.sql deleted file mode 100644 index f3943ded29a..00000000000 --- a/sql/updates/world/2012_02_20_01_world_misc_db.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Fix error in Scourge Deathspeaker SAI -UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=27615 AND `id`=14; --- Fix up Keeper Remulos SAI -UPDATE `smart_scripts` SET `id`=3 WHERE `entryorguid`=11832 AND `id`=4; --- Spiritcaller Dohgar -UPDATE `creature_template` SET `gossip_menu_id`=8513 WHERE `entry`=22312; -DELETE FROM `gossip_menu` WHERE `entry`=8513 AND `text_id`=10647; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8513,10647); diff --git a/sql/updates/world/2012_02_20_02_world_conditons.sql b/sql/updates/world/2012_02_20_02_world_conditons.sql deleted file mode 100644 index 832d8dbdae5..00000000000 --- a/sql/updates/world/2012_02_20_02_world_conditons.sql +++ /dev/null @@ -1,275 +0,0 @@ -# Update a typo in original data entry -UPDATE `npc_spellclick_spells` SET `quest_end`=11999 WHERE `npc_entry`=26477 AND `spell_id`=61832 AND `quest_start`=11999; -# Delete redundant data with invalid condition type -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18; - -# Static Data -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`, -`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`Comment`) VALUES -(18,24752,44363,0,8,0,11460,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,24752,44363,0,9,0,11460,0,0,0,'Required quest active for spellclick'), -(18,25596,45875,0,8,0,11690,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,25596,45875,0,9,0,11690,0,0,0,'Required quest active for spellclick'), -(18,25841,46166,0,8,0,11795,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,25841,46166,0,9,0,11795,0,0,0,'Required quest active for spellclick'), -(18,26200,39996,0,8,0,11960,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26200,39996,0,9,0,11960,0,0,0,'Required quest active for spellclick'), -(18,26200,61286,0,8,0,11960,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26200,61286,0,9,0,11960,0,0,0,'Required quest active for spellclick'), -(18,26421,47575,0,8,0,12092,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26421,47575,0,8,0,12096,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26421,47575,0,9,0,12092,0,0,0,'Required quest active for spellclick'), -(18,26421,47575,0,9,0,12096,0,0,0,'Required quest active for spellclick'), -(18,26477,47096,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26477,47096,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26477,47096,0,9,0,11999,0,0,0,'Required quest active for spellclick'), -(18,26477,47096,0,9,0,12000,0,0,0,'Required quest active for spellclick'), -(18,26477,61286,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26477,61286,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26477,61286,0,9,0,11999,0,0,0,'Required quest active for spellclick'), -(18,26477,61286,0,9,0,12000,0,0,0,'Required quest active for spellclick'), -(18,26477,61832,0,8,0,11999,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26477,61832,0,8,0,12000,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,26477,61832,0,9,0,11999,0,0,0,'Required quest active for spellclick'), -(18,26477,61832,0,9,0,12000,0,0,0,'Required quest active for spellclick'), -(18,27061,47920,0,8,0,12050,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,27061,47920,0,9,0,12050,0,0,0,'Required quest active for spellclick'), -(18,27354,60944,18,8,0,12244,0,0,0,'Required quest rewarded for spellclick'), -(18,27354,60944,18,9,0,12244,0,0,0,'Required quest active for spellclick'), -(18,28161,39996,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28161,39996,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28161,39996,0,9,0,12532,0,0,0,'Required quest active for spellclick'), -(18,28161,39996,0,9,0,12702,0,0,0,'Required quest active for spellclick'), -(18,28161,51037,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28161,51037,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28161,51037,0,9,0,12532,0,0,0,'Required quest active for spellclick'), -(18,28161,51037,0,9,0,12702,0,0,0,'Required quest active for spellclick'), -(18,28161,51961,0,8,0,12532,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28161,51961,0,8,0,12702,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28161,51961,0,9,0,12532,0,0,0,'Required quest active for spellclick'), -(18,28161,51961,0,9,0,12702,0,0,0,'Required quest active for spellclick'), -(18,28162,39996,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28162,39996,0,9,0,12519,0,0,0,'Required quest active for spellclick'), -(18,28162,50737,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28162,50737,0,9,0,12519,0,0,0,'Required quest active for spellclick'), -(18,28162,51026,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28162,51026,0,9,0,12519,0,0,0,'Required quest active for spellclick'), -(18,28162,61286,0,8,0,12519,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28162,61286,0,9,0,12519,0,0,0,'Required quest active for spellclick'), -(18,28202,50926,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28202,50926,0,9,0,12527,0,0,0,'Required quest active for spellclick'), -(18,28202,50927,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28202,50927,0,9,0,12527,0,0,0,'Required quest active for spellclick'), -(18,28203,50918,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28203,50918,0,9,0,12527,0,0,0,'Required quest active for spellclick'), -(18,28203,50919,0,8,0,12527,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28203,50919,0,9,0,12527,0,0,0,'Required quest active for spellclick'), -(18,28222,52082,0,8,0,12546,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28222,52082,0,9,0,12546,0,0,0,'Required quest active for spellclick'), -(18,28379,51658,0,8,0,12607,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28379,51658,0,9,0,12607,0,0,0,'Required quest active for spellclick'), -(18,28389,51592,0,8,0,12605,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28389,51592,0,9,0,12605,0,0,0,'Required quest active for spellclick'), -(18,28389,51593,0,8,0,12605,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28389,51593,0,9,0,12605,0,0,0,'Required quest active for spellclick'), -(18,28782,52280,0,8,0,12687,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,28782,52280,0,9,0,12687,0,0,0,'Required quest active for spellclick'), -(18,29488,54568,15,8,0,12670,0,0,0,'Required quest rewarded for spellclick'), -(18,29488,54568,15,9,0,12670,0,0,0,'Required quest active for spellclick'), -(18,29563,56795,0,8,0,1,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,29598,54768,0,8,0,12856,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,29708,55028,0,8,0,12856,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,29708,55028,0,9,0,12856,0,0,0,'Required quest active for spellclick'), -(18,29856,55363,0,8,0,12629,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,29856,55363,0,8,0,12643,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,29856,55363,0,9,0,12629,0,0,0,'Required quest active for spellclick'), -(18,29856,55363,0,9,0,12643,0,0,0,'Required quest active for spellclick'), -(18,29857,55457,0,8,0,12910,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,29857,55457,0,9,0,12910,0,0,0,'Required quest active for spellclick'), -(18,30066,43977,0,8,0,12953,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,30337,43671,0,8,0,13069,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,30337,43671,0,9,0,13069,0,0,0,'Required quest active for spellclick'), -(18,30500,56679,0,8,0,13045,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,30500,56679,0,9,0,13045,0,0,0,'Required quest active for spellclick'), -(18,30560,57347,0,1,0,57348,0,0,1,'Forbidden aura for spellclick'), -(18,31736,59592,0,8,0,13280,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,31736,59592,0,9,0,13280,0,0,0,'Required quest active for spellclick'), -(18,31785,59656,0,8,0,13283,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,31785,59656,0,9,0,13283,0,0,0,'Required quest active for spellclick'), -(18,31883,60123,0,1,0,48085,0,0,1,'Forbidden aura for spellclick'), -(18,31893,60123,0,1,0,48084,0,0,1,'Forbidden aura for spellclick'), -(18,31894,60123,0,1,0,28276,0,0,1,'Forbidden aura for spellclick'), -(18,31895,60123,0,1,0,27874,0,0,1,'Forbidden aura for spellclick'), -(18,31896,60123,0,1,0,27873,0,0,1,'Forbidden aura for spellclick'), -(18,31897,60123,0,1,0,7001,0,0,1,'Forbidden aura for spellclick'), -(18,32788,57539,17,8,0,13075,0,0,0,'Required quest rewarded for spellclick'), -(18,32788,57539,17,9,0,13075,0,0,0,'Required quest active for spellclick'), -(18,32790,57654,16,8,0,13073,0,0,0,'Required quest rewarded for spellclick'), -(18,32790,57654,16,9,0,13073,0,0,0,'Required quest active for spellclick'), -(18,33498,63126,0,8,0,13654,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,33498,63126,0,9,0,13654,0,0,0,'Required quest active for spellclick'), -(18,33790,62781,0,8,0,13690,0,0,0,'Required quest rewarded for spellclick'), -(18,33790,62781,0,8,0,13705,0,0,0,'Required quest rewarded for spellclick'), -(18,33791,62786,0,8,0,13696,0,0,0,'Required quest rewarded for spellclick'), -(18,33791,62786,0,8,0,13711,0,0,0,'Required quest rewarded for spellclick'), -(18,33792,62785,0,8,0,13694,0,0,0,'Required quest rewarded for spellclick'), -(18,33792,62785,0,8,0,13709,0,0,0,'Required quest rewarded for spellclick'), -(18,33793,62780,0,8,0,13688,0,0,0,'Required quest rewarded for spellclick'), -(18,33793,62780,0,8,0,13704,0,0,0,'Required quest rewarded for spellclick'), -(18,33794,62782,0,8,0,13689,0,0,0,'Required quest rewarded for spellclick'), -(18,33794,62782,0,8,0,13706,0,0,0,'Required quest rewarded for spellclick'), -(18,33795,62779,0,8,0,13685,0,0,0,'Required quest rewarded for spellclick'), -(18,33795,62779,0,8,0,13703,0,0,0,'Required quest rewarded for spellclick'), -(18,33796,62784,0,8,0,13693,0,0,0,'Required quest rewarded for spellclick'), -(18,33796,62784,0,8,0,13708,0,0,0,'Required quest rewarded for spellclick'), -(18,33798,62787,0,8,0,13695,0,0,0,'Required quest rewarded for spellclick'), -(18,33798,62787,0,8,0,13710,0,0,0,'Required quest rewarded for spellclick'), -(18,33799,62783,0,8,0,13691,0,0,0,'Required quest rewarded for spellclick'), -(18,33799,62783,0,8,0,13707,0,0,0,'Required quest rewarded for spellclick'), -(18,33800,62774,0,8,0,13593,0,0,0,'Required quest rewarded for spellclick'), -(18,33800,62774,0,8,0,13684,0,0,0,'Required quest rewarded for spellclick'), -(18,33842,63791,0,8,0,13668,0,0,0,'Required quest rewarded for spellclick'), -(18,33842,63791,0,8,0,13687,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,33843,63792,0,8,0,13667,0,0,0,'Required quest rewarded for spellclick'), -(18,33843,63792,0,8,0,13686,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,33870,63663,0,8,0,1,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13847,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13851,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13852,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13854,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13855,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13856,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13857,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13858,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13859,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13860,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13861,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13862,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13863,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,8,0,13864,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,34125,63215,0,9,0,13847,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13851,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13852,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13854,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13855,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13856,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13857,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13858,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13859,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13860,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13861,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13862,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13863,0,0,0,'Required quest active for spellclick'), -(18,34125,63215,0,9,0,13864,0,0,0,'Required quest active for spellclick'), -(18,38248,71462,0,1,0,71443,0,0,1,'Forbidden aura for spellclick'), -(18,40176,74904,0,8,0,25444,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,40176,74904,0,9,0,25444,0,0,0,'Required quest active for spellclick'), -(18,40176,74905,0,8,0,25444,0,0,1,'Forbidden rewarded quest for spellclick'), -(18,40176,74905,0,9,0,25444,0,0,0,'Required quest active for spellclick'); - -# Below is a procedure to dynamically convert custom content to conditions table. -# However this procedure only works for MySQL server versions >= 5.6 due to -# a bug / missing feature in older MySQL versions. -/* - -DROP PROCEDURE IF EXISTS ConvertSpellClickConditions; -DELIMITER // -CREATE PROCEDURE ConvertSpellClickConditions() -BEGIN - DECLARE counter INT DEFAULT 0; - DECLARE recordCount INT DEFAULT 0; - DECLARE counterPlusOne INT DEFAULT 0; - DECLARE npcEntry INT DEFAULT 0; - DECLARE spellId INT DEFAULT 0; - DECLARE aura INT DEFAULT 0; - DECLARE quest INT DEFAULT 0; - DECLARE quest2 INT DEFAULT 0; - DECLARE questStartCanActive INT DEFAULT 0; - DECLARE maxElseGroupId INT DEFAULT 14; # Change this for custom content - SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `aura_required` !=0; - WHILE counter < recordCount DO - SELECT `npc_entry`, `spell_id`, `aura_required` - INTO npcEntry, spellId, aura - FROM `npc_spellclick_spells` WHERE `aura_required` !=0 - LIMIT counter,1; - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,1,0,aura,0,0,'Required aura for spellclick'); - SET counter = counter+1; - END WHILE; - - SET counter = 0; - SET recordCount = 0; - SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `aura_forbidden` !=0; - WHILE counter < recordCount DO - SELECT `npc_entry`, `spell_id`, `aura_forbidden` - INTO npcEntry, spellId, aura - FROM `npc_spellclick_spells` WHERE `aura_forbidden` !=0 - LIMIT counter,1; - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,1,0,aura,0,1,'Forbidden aura for spellclick'); - SET counter = counter+1; - END WHILE; - - SET counter = 0; - SET recordCount = 0; - SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `quest_start` !=0; - WHILE counter < recordCount DO - SELECT `npc_entry`, `spell_id`, `quest_start`, `quest_start_active`, `quest_end` - INTO npcEntry, spellId, quest, questStartCanActive, quest2 - FROM `npc_spellclick_spells` WHERE `quest_start` !=0 - LIMIT counter,1; - IF questStartCanActive = 1 AND quest2 = 0 THEN - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`, `ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,maxElseGroupId+1,9,0,quest,0,0,'Required quest active for spellclick'); - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`, `ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,maxElseGroupId+1,8,0,quest,0,0,'Required quest rewarded for spellclick'); - SET maxElseGroupId = maxElseGroupId+1; - # ELSE IF quest2 != 0 is handled in next loop (forbidden rewarded quest) - ELSEIF questStartCanActive = 1 && quest2 = quest THEN - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,9,0,quest,0,0,'Required quest active for spellclick'); - # ^Adds the required active quest condition. Prohibit quest reward is done in next loop - ELSEIF questStartCanActive = 0 THEN - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,8,0,quest,0,0,'Required quest rewarded for spellclick'); - END IF; - - SET counter = counter+1; - END WHILE; - - SET counter = 0; - SET recordCount = 0; - SELECT COUNT(*) INTO recordCount FROM `npc_spellclick_spells` WHERE `quest_end` !=0; - WHILE counter < recordCount DO - SELECT `npc_entry`, `spell_id`, `quest_end` - INTO npcEntry, spellId, quest - FROM `npc_spellclick_spells` WHERE `quest_end` !=0 - LIMIT counter,1; - INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`, - `ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`NegativeCondition`,`Comment`) - VALUES (18,npcEntry,spellId,8,0,quest,0,1,'Forbidden rewarded quest for spellclick'); - SET counter = counter+1; - END WHILE; - -END// - -DELIMITER ; - -CALL ConvertSpellClickConditions(); -DROP PROCEDURE ConvertSpellClickConditions; - -*/ - -ALTER TABLE `npc_spellclick_spells` - DROP COLUMN `quest_start`, - DROP COLUMN `quest_start_active`, - DROP COLUMN `quest_end`, - DROP COLUMN `aura_required`, - DROP COLUMN `aura_forbidden` -; diff --git a/sql/updates/world/2012_02_21_00_world_creature_loot_template.sql b/sql/updates/world/2012_02_21_00_world_creature_loot_template.sql deleted file mode 100644 index 1d05c031868..00000000000 --- a/sql/updates/world/2012_02_21_00_world_creature_loot_template.sql +++ /dev/null @@ -1,78 +0,0 @@ --- Loot for Hellfire 5-man dungeons Trash (heroic and normal) -- --- ------------------------------------------------------------- - --- Hellfire Citadel: Ramparts -SET @Lootid := 17259; --- set all lootids to same entry (normal and heroic) -UPDATE `creature_template` SET `lootid`=@Lootid WHERE `entry` IN -(17259,17264,17269,17270,17271,17280,17281,17309,17455,17478,17517,18048,18049,18050,18051,18052,18053,18054,18055,18057,18058,18059); --- populate trashloot table -DELETE FROM `creature_loot_template` WHERE `entry` IN -(17259,17264,17269,17270,17271,17280,17281,17309,17455,17478,17517,18048,18049,18050,18051,18052,18053,18054,18055,18057,18058,18059); -DELETE FROM `creature_loot_template` WHERE `entry`=@Lootid; -INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES --- rough indication based on wowhead data of ALL mobs in the dungeon -(@Lootid,14047,40,1,0,1,4), -- Runecloth -(@Lootid,21877,20,1,0,1,4), -- Netherweave Cloth -(@Lootid, 8952,10,1,0,1,4), -- Roasted Quail -(@Lootid, 8766, 5,1,0,1,3), -- Morning Glory Dew --- references for worldgreys -(@Lootid,1,5,1,0,-24000,1), -- Outland Grey Item Reference1 -(@Lootid,2,5,1,0,-24002,1), -- Outland Grey Item Reference2 -(@Lootid,3,5,1,0,-24003,1), -- Outland Grey Item Reference3 -(@Lootid,4,5,1,0,-24011,1), -- Outland Grey Item Reference4 -(@Lootid,5,5,1,0,-24022,1), -- Outland Grey Item Reference5 -(@Lootid,6,5,1,0,-24023,1), -- Outland Grey Item Reference6 --- specifics -(@Lootid,5759,0.25,1,0,1,1), -- Thorium Lockbox -(@Lootid,5760,0.30,1,0,1,1), -- Eternium Lockbox --- Scrolls -(@Lootid,7,5,1,0,-24724,1); -- Scroll of IV - --- ----------------------------------------- --- -- Hellfire Citadel: The Blood Furnace -- --- ----------------------------------------- -SET @Lootid := 17370; -UPDATE `creature_template` SET `lootid`=@Lootid WHERE `entry` IN (17256,17370,17371,17395,17397,17398,17399,17414,17429,17477,17491,17624,17626,17653,18894,19016,18608,18619,18617,18615,18612,18614,18618,18603,18606,18610,18611,18609,18620,21645,21646); - -DELETE FROM `creature_loot_template` WHERE `entry` IN (17370,17371,17395,17397,17398,17414,17429,17491,17624,17626,18894); -INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES -(@Lootid,23894,-100,1,0,1,1), -- Fel Orc Blood (quest) --- most common items -(@Lootid,14047,40,1,0,1,4), -- Runecloth -(@Lootid,21877,20,1,0,1,4), -- Netherweave Cloth -(@Lootid, 8952,10,1,0,1,4), -- Roasted Quail -(@Lootid, 8766, 5,1,0,1,3), -- Morning Glory Dew --- references for worldgreys -(@Lootid,1,5,1,0,-24000,1), -- Outland Grey Item Reference1 -(@Lootid,2,5,1,0,-24002,1), -- Outland Grey Item Reference2 -(@Lootid,3,5,1,0,-24003,1), -- Outland Grey Item Reference3 -(@Lootid,4,5,1,0,-24011,1), -- Outland Grey Item Reference4 -(@Lootid,5,5,1,0,-24022,1), -- Outland Grey Item Reference5 -(@Lootid,6,5,1,0,-24023,1), -- Outland Grey Item Reference6 --- specifics -(@Lootid,5759,0.25,1,0,1,1), -- Thorium Lockbox -(@Lootid,5760,0.30,1,0,1,1), -- Eternium Lockbox --- Scrolls -(@Lootid,7,5,1,0,-24724,1); -- Scroll of IV - --- ------------------------------------------- --- -- Hellfire Citadel: The Shattered Halls -- --- ------------------------------------------- -SET @Lootid := 16507; -UPDATE `creature_template` SET `lootid`=@Lootid WHERE `entry` IN (17669,16507,17622,17462,17427,17420,17083,16699,16704,17695,17670,16700,16593,16594,17464,17694,17465,17461,17671,20593,20582,20576,20590,20589,20594,20567,20587,20579,20581,20595,20586,20583,20578,20574,20588,20584,20577,20580); - -DELETE FROM `creature_loot_template` WHERE `entry` IN (16507,16593,16594,16699,16700,16704,17083,17420,17427,17461,17462,17464,17465,17669,17670,17671,17694,17695,17669,16594,17694,17427,17695,17461,16593,17465,17671,17464,17420,17670,16700,16699,16507,16704,17462); -INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES -(@Lootid,21877,40,1,0,2,3), -- Netherweave Cloth -(@Lootid,27854,20,1,0,1,1), -- Smoked Talbuk Venison -(@Lootid,27860,20,1,0,1,1), -- Purified Draenic Water -(@Lootid,31952,2.5,1,0,1,1), -- Khorium Lockbox --- references -(@Lootid,1,5,1,1,-24002,1), -- Outland Grey Item Reference1 -(@Lootid,2,2,1,1,-24009,1), -- Outland Green Reference1 -(@Lootid,3,5,1,1,-24011,1), -- Outland Grey Item Reference2 -(@Lootid,4,1,1,1,-24012,1), -- Outland Blue Reference1 -(@Lootid,5,5,1,1,-24093,1), -- Outland Plans & patterns --- Scrolls -(@Lootid,6,5,1,0,-24724,1); -- Scroll of IV diff --git a/sql/updates/world/2012_02_21_01_world_conditions.sql b/sql/updates/world/2012_02_21_01_world_conditions.sql deleted file mode 100644 index 54685868186..00000000000 --- a/sql/updates/world/2012_02_21_01_world_conditions.sql +++ /dev/null @@ -1,3592 +0,0 @@ -CREATE TABLE `temp_convert_spells` -( - `id` INT(11), - `effMask` INT(11), - `onlyPlayers` TINYINT(3), - PRIMARY KEY (`id`) -); - -INSERT INTO `temp_convert_spells` VALUES -(46174,1,0), -(78002,1,1), -(78001,1,1), -(78000,1,1), -(77999,1,1), -(77984,1,1), -(76379,1,0), -(76098,1,0), -(76092,1,0), -(75920,1,1), -(75767,1,1), -(75765,1,1), -(75396,1,0), -(75389,1,1), -(75364,1,0), -(75319,1,0), -(75313,1,0), -(75244,1,0), -(75197,1,0), -(75195,1,0), -(75181,1,0), -(75107,1,0), -(75100,1,0), -(75078,1,0), -(75053,1,0), -(75018,1,0), -(74977,1,0), -(74903,1,0), -(74801,1,1), -(74758,1,0), -(74735,1,0), -(74549,1,0), -(74548,1,0), -(74486,1,0), -(74455,1,0), -(74444,1,0), -(74313,1,0), -(74285,1,0), -(74219,1,0), -(74182,1,0), -(74148,1,0), -(74098,1,0), -(74090,1,1), -(74086,1,1), -(74074,1,0), -(74033,1,0), -(73980,1,0), -(73955,1,0), -(73953,1,0), -(73886,1,0), -(73846,1,1), -(73845,1,1), -(73844,1,1), -(73843,1,1), -(73837,1,0), -(73836,1,0), -(73835,1,0), -(73787,1,0), -(73786,1,0), -(73785,1,0), -(73725,1,0), -(73659,1,0), -(73650,1,1), -(73582,1,0), -(73556,1,0), -(73555,1,0), -(73548,1,0), -(73331,1,1), -(73288,1,0), -(73165,1,0), -(73164,1,1), -(73159,1,1), -(73129,1,0), -(73128,1,0), -(73082,1,0), -(73071,1,0), -(73035,1,0), -(72959,1,1), -(72934,1,1), -(72928,1,1), -(72900,1,1), -(72830,1,1), -(72748,1,0), -(72747,1,0), -(72746,1,0), -(72745,1,0), -(72728,1,0), -(72706,1,1), -(72618,1,0), -(72595,1,1), -(72527,1,0), -(72479,1,1), -(72431,1,1), -(72429,1,1), -(72401,1,0), -(72347,1,0), -(72346,1,1), -(72280,1,0), -(72279,1,0), -(72278,1,0), -(72262,1,0), -(72260,1,0), -(72257,1,1), -(72209,1,0), -(72202,1,0), -(72099,1,0), -(72033,1,0), -(72032,1,0), -(72031,1,0), -(71952,1,0), -(71949,1,1), -(71948,1,0), -(71946,1,0), -(71848,1,0), -(71811,1,0), -(71809,1,0), -(71753,1,1), -(71693,1,0), -(71620,1,0), -(71617,1,0), -(71599,1,0), -(71538,1,1), -(71536,1,1), -(71520,1,0), -(71440,1,0), -(71415,1,0), -(71412,1,0), -(71365,1,0), -(71352,1,1), -(71322,1,0), -(71310,1,0), -(71308,1,0), -(71306,1,0), -(71281,1,0), -(71272,1,0), -(71189,1,0), -(71082,1,0), -(71081,1,0), -(71080,1,0), -(71079,1,0), -(71078,1,0), -(71075,1,0), -(71070,1,0), -(71032,1,0), -(71024,1,0), -(70995,1,0), -(70983,1,0), -(70966,1,1), -(70939,1,0), -(70936,1,0), -(70933,1,0), -(70931,1,0), -(70921,1,0), -(70881,1,0), -(70861,1,0), -(70860,1,0), -(70859,1,0), -(70858,1,0), -(70857,1,0), -(70856,1,0), -(70792,1,0), -(70790,1,0), -(70784,1,0), -(70781,1,0), -(70743,1,0), -(70713,1,1), -(70643,1,0), -(70639,1,0), -(70638,1,1), -(70636,1,1), -(70635,1,0), -(70623,1,1), -(70614,1,0), -(70611,1,0), -(70602,1,0), -(70595,1,0), -(70588,1,0), -(70586,1,0), -(70572,1,0), -(70569,1,0), -(70527,1,1), -(70525,1,0), -(70488,1,0), -(70485,1,0), -(70471,1,0), -(70466,1,0), -(70464,1,0), -(70444,1,0), -(70443,1,1), -(70403,1,0), -(70397,1,0), -(70383,1,0), -(70374,1,0), -(70366,1,0), -(70360,1,0), -(70338,1,0), -(70331,1,1), -(70299,1,0), -(70293,1,0), -(70290,1,0), -(70267,1,0), -(70266,1,0), -(70265,1,0), -(70246,1,0), -(70225,1,0), -(70224,1,0), -(70143,1,0), -(70130,1,0), -(70104,1,0), -(70100,1,0), -(70098,1,0), -(70079,1,0), -(70078,1,0), -(70053,1,0), -(70041,1,0), -(70040,1,0), -(70021,1,0), -(69960,1,0), -(69959,1,0), -(69922,1,0), -(69907,1,0), -(69886,1,0), -(69857,1,0), -(69843,1,0), -(69801,1,0), -(69798,1,0), -(69796,1,0), -(69784,1,0), -(69782,1,0), -(69768,1,0), -(69753,1,0), -(69705,1,0), -(69682,1,0), -(69614,1,0), -(69610,1,0), -(69601,1,0), -(69600,1,0), -(69593,1,0), -(69553,1,0), -(69538,1,0), -(69508,1,0), -(69431,1,0), -(69372,1,0), -(69347,1,0), -(69298,1,1), -(69171,1,0), -(69125,1,0), -(69101,1,0), -(69098,1,0), -(69097,1,0), -(69048,1,1), -(69039,1,0), -(69016,1,0), -(68957,1,0), -(68922,1,0), -(68919,1,0), -(68901,1,0), -(68881,1,0), -(68880,1,0), -(68861,1,0), -(68847,1,0), -(68842,1,0), -(68798,1,0), -(68663,1,0), -(68644,1,0), -(68617,1,0), -(68616,1,0), -(68614,1,0), -(68515,1,1), -(68471,1,1), -(68470,1,1), -(68401,1,0), -(68400,1,0), -(68360,1,0), -(68359,1,0), -(68358,1,0), -(68206,1,1), -(68198,1,1), -(68197,1,1), -(68193,1,1), -(68186,1,1), -(67888,1,0), -(67864,1,0), -(67857,1,0), -(67856,1,0), -(67855,1,0), -(67804,1,0), -(67757,1,0), -(67756,1,0), -(67755,1,0), -(67748,1,0), -(67732,1,0), -(67715,1,0), -(67705,1,0), -(67551,1,1), -(67547,1,0), -(67482,1,0), -(67400,1,0), -(67397,1,0), -(67369,1,0), -(67335,1,0), -(67328,1,0), -(67163,1,0), -(67162,1,0), -(67161,1,0), -(67160,1,0), -(67159,1,0), -(67158,1,0), -(66986,1,1), -(66810,1,1), -(66798,1,0), -(66785,1,0), -(66774,1,0), -(66718,1,1), -(66665,1,0), -(66637,1,0), -(66636,1,0), -(66630,1,0), -(66551,1,0), -(66550,1,0), -(66513,1,0), -(66512,1,0), -(66508,1,0), -(66401,1,0), -(66391,1,0), -(66390,1,0), -(66387,1,0), -(66386,1,0), -(66385,1,0), -(66384,1,0), -(66383,1,0), -(66382,1,0), -(66379,1,0), -(66357,1,0), -(66356,1,0), -(66355,1,0), -(66354,1,0), -(66353,1,0), -(66352,1,0), -(66350,1,0), -(66349,1,0), -(66348,1,0), -(66345,1,0), -(66339,1,0), -(66332,1,0), -(66314,1,1), -(66312,1,1), -(66287,1,0), -(66256,1,0), -(66193,1,0), -(66181,1,0), -(66153,1,0), -(66152,1,0), -(66141,1,0), -(66140,1,0), -(66135,1,1), -(66133,1,0), -(66132,1,0), -(65872,1,0), -(65861,1,0), -(65719,1,0), -(65718,1,0), -(65699,1,0), -(65685,1,0), -(65652,1,0), -(65614,1,0), -(65613,1,0), -(65611,1,0), -(65594,1,1), -(65589,1,0), -(65588,1,0), -(65587,1,0), -(65509,1,0), -(65357,1,0), -(65354,1,0), -(65350,1,0), -(65349,1,0), -(65346,1,1), -(65312,1,1), -(65311,1,1), -(65265,1,0), -(65258,1,0), -(65238,1,0), -(65224,1,0), -(65206,1,0), -(65200,1,0), -(65192,1,0), -(65184,1,1), -(65140,1,0), -(65109,1,0), -(65061,1,0), -(65042,1,0), -(65040,1,1), -(65034,1,0), -(65016,1,0), -(65015,1,0), -(64996,1,0), -(64995,1,0), -(64898,1,0), -(64887,1,0), -(64886,1,0), -(64880,1,0), -(64828,1,0), -(64799,1,0), -(64767,1,0), -(64623,1,0), -(64620,1,0), -(64619,1,0), -(64618,1,0), -(64597,1,0), -(64543,1,0), -(64539,1,0), -(64503,1,0), -(64499,1,0), -(64480,1,0), -(64475,1,0), -(64474,1,0), -(64466,1,0), -(64465,1,0), -(64463,1,0), -(64449,1,0), -(64444,1,0), -(64425,1,0), -(64414,1,0), -(64402,1,0), -(64397,1,0), -(64320,1,0), -(64229,1,0), -(64225,1,0), -(64224,1,0), -(64201,1,0), -(64185,1,0), -(64184,1,0), -(64183,1,0), -(64173,1,0), -(64172,1,0), -(64098,1,0), -(64069,1,0), -(64063,1,0), -(64061,1,0), -(64059,1,1), -(64032,1,0), -(64031,1,0), -(64030,1,0), -(64029,1,0), -(64028,1,0), -(64027,1,0), -(64026,1,0), -(64025,1,0), -(64024,1,0), -(64014,1,0), -(63984,1,0), -(63979,1,0), -(63947,1,0), -(63886,1,0), -(63882,1,0), -(63820,1,0), -(63813,1,0), -(63812,1,0), -(63764,1,0), -(63763,1,0), -(63762,1,0), -(63761,1,0), -(63749,1,0), -(63747,1,1), -(63745,1,1), -(63744,1,0), -(63702,1,0), -(63676,1,0), -(63659,1,0), -(63658,1,0), -(63657,1,0), -(63629,1,0), -(63628,1,0), -(63576,1,0), -(63524,1,0), -(63499,1,0), -(63446,1,0), -(63445,1,0), -(63444,1,0), -(63443,1,0), -(63442,1,0), -(63441,1,0), -(63440,1,0), -(63439,1,0), -(63438,1,0), -(63352,1,0), -(63348,1,0), -(63322,1,1), -(63274,1,0), -(63255,1,0), -(63238,1,0), -(63109,1,0), -(63037,1,0), -(63013,1,0), -(63001,1,0), -(62990,1,0), -(62978,1,0), -(62976,1,0), -(62943,1,0), -(62911,1,0), -(62909,1,0), -(62906,1,0), -(62888,1,0), -(62883,1,0), -(62882,1,0), -(62834,1,0), -(62809,1,0), -(62797,1,1), -(62778,1,0), -(62731,1,0), -(62727,1,0), -(62711,1,0), -(62708,1,0), -(62706,1,0), -(62701,1,0), -(62669,1,0), -(62646,1,0), -(62603,1,0), -(62584,1,0), -(62577,1,0), -(62567,1,0), -(62533,1,0), -(62525,1,0), -(62524,1,0), -(62521,1,0), -(62509,1,0), -(62505,1,0), -(62496,1,0), -(62488,1,0), -(62485,1,0), -(62484,1,0), -(62483,1,0), -(62480,1,0), -(62464,1,0), -(62378,1,0), -(124,1,0), -(2222,1,0), -(3730,1,0), -(4020,1,0), -(4338,1,0), -(5249,1,0), -(5251,1,0), -(5432,1,0), -(5555,1,0), -(6636,1,0), -(6672,1,0), -(6755,1,0), -(6955,1,0), -(6967,1,0), -(7022,1,0), -(7035,1,0), -(7036,1,0), -(7277,1,0), -(7393,1,0), -(7670,1,0), -(7769,1,0), -(8283,1,0), -(8593,1,0), -(8596,1,0), -(9002,1,0), -(9003,1,0), -(9004,1,0), -(9012,1,0), -(9082,1,0), -(9095,1,0), -(9455,1,0), -(9457,1,0), -(9712,1,0), -(9976,1,0), -(10113,1,0), -(10137,1,0), -(10252,1,0), -(10258,1,0), -(10259,1,0), -(10260,1,0), -(10345,1,0), -(10604,1,0), -(10727,1,0), -(10747,1,0), -(11195,1,0), -(11402,1,0), -(11440,1,0), -(11513,1,0), -(11637,1,0), -(11757,1,0), -(11893,1,0), -(12134,1,0), -(12158,1,0), -(12159,1,0), -(12347,1,0), -(12512,1,0), -(12564,1,0), -(12613,1,0), -(12623,1,0), -(12699,1,0), -(12709,1,0), -(12774,1,0), -(12938,1,0), -(13461,1,0), -(13727,1,0), -(13821,1,0), -(13951,1,0), -(13982,1,0), -(14250,1,0), -(14292,1,0), -(14806,1,0), -(14813,1,0), -(14928,1,0), -(15252,1,0), -(15281,1,0), -(15591,1,0), -(15658,1,0), -(15746,1,0), -(15958,1,0), -(16007,1,0), -(16032,1,0), -(16037,1,0), -(16053,1,0), -(16068,1,0), -(16069,1,0), -(16070,1,0), -(16074,1,0), -(16378,1,0), -(16381,1,0), -(16404,1,0), -(16556,1,0), -(16558,1,0), -(16637,1,0), -(16786,1,0), -(16807,1,0), -(17048,1,0), -(17166,1,0), -(17190,1,0), -(17202,1,0), -(17272,1,0), -(17278,1,0), -(17279,1,0), -(17471,1,0), -(17536,1,0), -(17616,1,0), -(17618,1,0), -(17652,1,0), -(17671,1,0), -(17675,1,0), -(17676,1,0), -(17677,1,0), -(17678,1,0), -(17698,1,0), -(17748,1,0), -(18110,1,0), -(18655,1,0), -(18666,1,0), -(18811,1,0), -(18969,1,0), -(19032,1,0), -(19096,1,0), -(19571,1,0), -(19593,1,0), -(19721,1,0), -(19749,1,0), -(19770,1,0), -(19773,1,0), -(19952,1,0), -(20358,1,0), -(20465,1,0), -(20619,1,0), -(21052,1,0), -(21075,1,0), -(21076,1,0), -(21391,1,0), -(21556,1,0), -(21566,1,0), -(21885,1,0), -(21950,1,0), -(22096,1,0), -(22203,1,0), -(22205,1,0), -(22393,1,0), -(22458,1,0), -(22860,1,0), -(22906,1,0), -(22966,1,0), -(23014,1,0), -(23016,1,0), -(23018,1,0), -(23019,1,0), -(23168,1,0), -(23328,1,0), -(23360,1,0), -(23389,1,0), -(23394,1,0), -(23415,1,0), -(23642,1,0), -(23951,1,0), -(23974,1,0), -(24062,1,0), -(24083,1,0), -(24172,1,0), -(24207,1,0), -(24217,1,0), -(24311,1,0), -(24322,1,0), -(24323,1,0), -(24391,1,0), -(24734,1,0), -(24744,1,0), -(24756,1,0), -(24758,1,0), -(24760,1,0), -(24763,1,0), -(24765,1,0), -(24768,1,0), -(24770,1,0), -(24772,1,0), -(24784,1,0), -(24786,1,0), -(24788,1,0), -(24789,1,0), -(24790,1,0), -(24804,1,0), -(24933,1,0), -(25030,1,0), -(25031,1,0), -(25032,1,0), -(25099,1,0), -(25145,1,0), -(25149,1,0), -(25150,1,0), -(25158,1,0), -(25201,1,0), -(25715,1,0), -(25727,1,0), -(25745,1,0), -(25822,1,0), -(25823,1,0), -(25896,1,0), -(26235,1,0), -(26344,1,0), -(26345,1,0), -(26346,1,0), -(26347,1,0), -(26348,1,0), -(26349,1,0), -(26351,1,0), -(26352,1,0), -(26353,1,0), -(26354,1,0), -(26355,1,0), -(26356,1,0), -(26462,1,0), -(26522,1,1), -(26608,1,0), -(26687,1,1), -(26879,1,0), -(27583,1,0), -(27651,1,0), -(27663,1,0), -(27745,1,0), -(27885,1,0), -(27886,1,0), -(27892,1,0), -(27893,1,0), -(27894,1,0), -(27928,1,0), -(27929,1,0), -(27935,1,0), -(27936,1,0), -(28018,1,0), -(28032,1,0), -(28056,1,0), -(28078,1,0), -(28087,1,0), -(28096,1,0), -(28111,1,0), -(28159,1,0), -(28278,1,0), -(28281,1,0), -(28309,1,0), -(28326,1,0), -(28338,1,0), -(28339,1,0), -(28365,1,0), -(28366,1,0), -(28367,1,0), -(28374,1,0), -(28392,1,0), -(28404,1,0), -(28441,1,0), -(28605,1,0), -(28697,1,0), -(28731,1,0), -(28732,1,0), -(28861,1,0), -(29070,1,0), -(29072,1,0), -(29120,1,0), -(29121,1,0), -(29122,1,0), -(29172,1,0), -(29173,1,0), -(29176,1,0), -(29328,1,1), -(29339,1,0), -(29340,1,0), -(29428,1,0), -(29437,1,0), -(29456,1,0), -(29457,1,0), -(29458,1,0), -(29459,1,0), -(29461,1,0), -(29531,1,0), -(29534,1,0), -(29612,1,0), -(29705,1,0), -(29726,1,0), -(29727,1,0), -(29769,1,0), -(29770,1,0), -(29846,1,1), -(29962,1,0), -(29966,1,0), -(29967,1,0), -(29969,1,0), -(29970,1,0), -(29972,1,0), -(29989,1,0), -(30012,1,0), -(30065,1,0), -(30107,1,0), -(30166,1,0), -(30207,1,0), -(30221,1,0), -(30232,1,0), -(30273,1,0), -(30410,1,0), -(30417,1,0), -(30418,1,0), -(30425,1,0), -(30427,1,0), -(30460,1,0), -(30462,1,0), -(30469,1,0), -(30477,1,0), -(30541,1,0), -(30544,1,0), -(30571,1,1), -(30572,1,0), -(30625,1,0), -(30631,1,1), -(30656,1,0), -(30662,1,0), -(30676,1,0), -(30690,1,0), -(30735,1,0), -(30738,1,0), -(30745,1,0), -(30751,1,0), -(30762,1,0), -(30763,1,0), -(30764,1,0), -(30765,1,0), -(30766,1,0), -(30834,1,0), -(30835,1,0), -(30875,1,0), -(30876,1,0), -(30951,1,0), -(30952,1,0), -(30964,1,0), -(30968,1,0), -(30970,1,0), -(30974,1,0), -(30985,1,0), -(30988,1,0), -(31115,1,0), -(31225,1,0), -(31315,1,0), -(31324,1,0), -(31326,1,0), -(31329,1,0), -(31336,1,0), -(31346,1,0), -(31411,1,0), -(31412,1,0), -(31413,1,0), -(31414,1,0), -(31474,1,0), -(31515,1,0), -(31532,1,0), -(31537,1,0), -(31550,1,0), -(31611,1,0), -(31628,1,0), -(31630,1,0), -(31631,1,0), -(31702,1,0), -(31727,1,0), -(31736,1,0), -(31749,1,0), -(31781,1,0), -(31793,1,0), -(31799,1,0), -(31806,1,0), -(31889,1,0), -(31902,1,0), -(31936,1,0), -(31979,1,0), -(31993,1,0), -(32040,1,0), -(32042,1,0), -(32045,1,0), -(32051,1,0), -(32052,1,0), -(32087,1,0), -(32111,1,0), -(32127,1,0), -(32146,1,0), -(32163,1,0), -(32164,1,0), -(32227,1,0), -(32228,1,0), -(32251,1,0), -(32260,1,0), -(32286,1,0), -(32301,1,0), -(32303,1,0), -(32312,1,0), -(32373,1,0), -(32396,1,0), -(32560,1,0), -(32573,1,0), -(32589,1,0), -(32622,1,0), -(32623,1,0), -(32638,1,0), -(32668,1,0), -(32708,1,1), -(32760,1,0), -(32838,1,0), -(32890,1,0), -(32928,1,0), -(32929,1,0), -(32930,1,0), -(32953,1,0), -(32958,1,0), -(32974,1,0), -(32976,1,0), -(32979,1,0), -(33067,1,0), -(33270,1,1), -(33329,1,0), -(33332,1,0), -(33336,1,0), -(33337,1,0), -(33423,1,0), -(33424,1,0), -(33425,1,0), -(33531,1,0), -(33532,1,0), -(33618,1,0), -(33644,1,0), -(33655,1,0), -(33669,1,0), -(33710,1,0), -(33716,1,1), -(33742,1,0), -(33744,1,0), -(33796,1,0), -(33805,1,0), -(33806,1,0), -(33809,1,0), -(33822,1,0), -(33831,1,0), -(33838,1,0), -(33861,1,0), -(33862,1,0), -(33918,1,0), -(33924,1,0), -(33937,1,0), -(33981,1,0), -(34011,1,0), -(34013,1,0), -(34016,1,0), -(34019,1,0), -(34023,1,0), -(34024,1,0), -(34062,1,0), -(34063,1,0), -(34076,1,0), -(34119,1,0), -(34154,1,0), -(34156,1,0), -(34209,1,0), -(34211,1,0), -(34212,1,0), -(34221,1,0), -(34239,1,0), -(34254,1,0), -(34330,1,0), -(34332,1,0), -(34367,1,0), -(34378,1,0), -(34393,1,0), -(34397,1,0), -(34430,1,0), -(34516,1,0), -(34526,1,0), -(34536,1,0), -(34581,1,0), -(34583,1,0), -(34613,1,0), -(34627,1,0), -(34646,1,0), -(34662,1,0), -(34742,1,0), -(34806,1,0), -(34874,1,0), -(34893,1,0), -(34946,1,0), -(35016,1,0), -(35040,1,0), -(35063,1,0), -(35097,1,0), -(35113,1,0), -(35137,1,0), -(35140,1,0), -(35141,1,0), -(35155,1,0), -(35160,1,0), -(35162,1,0), -(35170,1,0), -(35176,1,0), -(35190,1,0), -(35245,1,0), -(35262,1,0), -(35282,1,0), -(35301,1,0), -(35372,1,0), -(35413,1,0), -(35427,1,0), -(35515,1,0), -(35516,1,0), -(35598,1,0), -(35600,1,0), -(35673,1,0), -(35682,1,0), -(35724,1,0), -(35746,1,0), -(35756,1,0), -(35770,1,0), -(35771,1,0), -(35772,1,0), -(35782,1,0), -(35930,1,0), -(35941,1,1), -(35956,1,1), -(35960,1,0), -(35961,1,0), -(35962,1,0), -(36000,1,0), -(36035,1,0), -(36089,1,0), -(36090,1,0), -(36103,1,0), -(36167,1,0), -(36174,1,0), -(36196,1,0), -(36197,1,0), -(36198,1,0), -(36201,1,0), -(36220,1,0), -(36239,1,0), -(36241,1,0), -(36243,1,0), -(36290,1,0), -(36291,1,0), -(36293,1,0), -(36327,1,0), -(36330,1,0), -(36378,1,0), -(36384,1,0), -(36431,1,0), -(36452,1,0), -(36455,1,1), -(36456,1,0), -(36514,1,0), -(36544,1,0), -(36639,1,0), -(36651,1,0), -(36652,1,0), -(36692,1,0), -(36709,1,0), -(36717,1,1), -(36779,1,0), -(36795,1,0), -(36802,1,0), -(36803,1,0), -(36804,1,0), -(36823,1,0), -(36852,1,0), -(36854,1,0), -(36856,1,0), -(36857,1,0), -(36858,1,0), -(36859,1,0), -(36871,1,0), -(36878,1,0), -(36884,1,0), -(36896,1,0), -(36951,1,0), -(36953,1,0), -(36969,1,0), -(36995,1,0), -(37013,1,0), -(37017,1,0), -(37032,1,0), -(37033,1,0), -(37034,1,0), -(37035,1,0), -(37051,1,0), -(37052,1,0), -(37053,1,0), -(37055,1,0), -(37056,1,0), -(37071,1,0), -(37072,1,0), -(37103,1,0), -(37142,1,0), -(37143,1,0), -(37144,1,0), -(37146,1,0), -(37147,1,0), -(37148,1,0), -(37149,1,0), -(37150,1,0), -(37151,1,0), -(37152,1,0), -(37153,1,0), -(37199,1,0), -(37220,1,0), -(37226,1,0), -(37229,1,0), -(37235,1,0), -(37281,1,0), -(37285,1,0), -(37337,1,0), -(37339,1,0), -(37345,1,0), -(37348,1,0), -(37388,1,0), -(37406,1,0), -(37408,1,1), -(37413,1,0), -(37422,1,0), -(37427,1,0), -(37428,1,0), -(37448,1,1), -(37449,1,1), -(37453,1,0), -(37454,1,0), -(37459,1,0), -(37461,1,0), -(37465,1,0), -(37469,1,0), -(37471,1,0), -(37472,1,0), -(37474,1,0), -(37476,1,0), -(37498,1,0), -(37502,1,0), -(37573,1,0), -(37626,1,0), -(37645,1,0), -(37689,1,0), -(37697,1,0), -(37712,1,0), -(37720,1,0), -(37748,1,0), -(37755,1,0), -(37775,1,0), -(37784,1,0), -(37824,1,0), -(37842,1,0), -(37843,1,0), -(37848,1,0), -(37849,1,1), -(37853,1,0), -(37868,1,0), -(37893,1,0), -(37895,1,0), -(37918,1,0), -(37934,1,0), -(37936,1,0), -(37964,1,0), -(37984,1,0), -(38003,1,0), -(38014,1,0), -(38015,1,0), -(38017,1,0), -(38020,1,0), -(38053,1,0), -(38054,1,0), -(38072,1,0), -(38073,1,0), -(38112,1,0), -(38121,1,0), -(38123,1,0), -(38126,1,0), -(38128,1,0), -(38130,1,0), -(38202,1,0), -(38250,1,0), -(38269,1,0), -(38360,1,0), -(38444,1,0), -(38451,1,0), -(38452,1,0), -(38455,1,0), -(38469,1,0), -(38482,1,0), -(38508,1,0), -(38530,1,0), -(38629,1,0), -(38632,1,0), -(38691,1,0), -(38711,1,0), -(38722,1,0), -(38736,1,0), -(38738,1,0), -(38762,1,0), -(38802,1,0), -(38829,1,1), -(38966,1,0), -(38968,1,0), -(39010,1,0), -(39011,1,0), -(39043,1,0), -(39073,1,0), -(39094,1,0), -(39124,1,0), -(39126,1,0), -(39140,1,0), -(39141,1,0), -(39184,1,0), -(39185,1,0), -(39189,1,0), -(39190,1,0), -(39206,1,0), -(39211,1,0), -(39216,1,0), -(39219,1,0), -(39221,1,0), -(39248,1,0), -(39334,1,0), -(39335,1,0), -(39338,1,0), -(39341,1,0), -(39342,1,0), -(39344,1,0), -(39350,1,0), -(39352,1,0), -(39353,1,0), -(39354,1,0), -(39355,1,0), -(39356,1,0), -(39357,1,0), -(39358,1,0), -(39359,1,0), -(39360,1,0), -(39361,1,0), -(39362,1,0), -(39395,1,0), -(39495,1,0), -(39497,1,1), -(39552,1,0), -(39559,1,0), -(39583,1,0), -(39601,1,0), -(39635,1,0), -(39678,1,0), -(39687,1,0), -(39690,1,0), -(39691,1,0), -(39692,1,0), -(39696,1,0), -(39758,1,0), -(39834,1,1), -(39849,1,0), -(39851,1,1), -(39852,1,1), -(39853,1,1), -(39854,1,1), -(39873,1,0), -(39899,1,0), -(39914,1,0), -(39915,1,0), -(39919,1,0), -(39921,1,0), -(39923,1,1), -(39930,1,0), -(39938,1,0), -(39939,1,0), -(39940,1,0), -(39974,1,0), -(39977,1,0), -(39978,1,0), -(39985,1,0), -(39989,1,0), -(39993,1,0), -(39999,1,0), -(40085,1,0), -(40094,1,0), -(40106,1,0), -(40110,1,0), -(40112,1,1), -(40136,1,0), -(40147,1,0), -(40153,1,0), -(40156,1,0), -(40160,1,0), -(40187,1,0), -(40189,1,0), -(40190,1,0), -(40224,1,0), -(40281,1,0), -(40287,1,0), -(40288,1,0), -(40289,1,0), -(40309,1,0), -(40350,1,0), -(40359,1,0), -(40382,1,0), -(40383,1,0), -(40397,1,0), -(40437,1,0), -(40439,1,0), -(40454,1,0), -(40490,1,0), -(40494,1,0), -(40498,1,0), -(40499,1,0), -(40512,1,0), -(40520,1,0), -(40521,1,0), -(40523,1,0), -(40532,1,0), -(40547,1,0), -(40607,1,0), -(40638,1,0), -(40693,1,0), -(40704,1,0), -(40707,1,0), -(40708,1,0), -(40709,1,0), -(40710,1,0), -(40711,1,0), -(40712,1,0), -(40713,1,0), -(40715,1,0), -(40730,1,1), -(40738,1,0), -(40750,1,0), -(40761,1,0), -(40788,1,0), -(40821,1,0), -(40824,1,0), -(40825,1,0), -(40828,1,0), -(40830,1,0), -(40848,1,1), -(40874,1,0), -(40887,1,0), -(40978,1,0), -(40985,1,1), -(40989,1,0), -(40993,1,1), -(41007,1,1), -(41015,1,1), -(41022,1,1), -(41073,1,0), -(41077,1,0), -(41122,1,0), -(41124,1,0), -(41125,1,0), -(41128,1,0), -(41129,1,0), -(41154,1,0), -(41257,1,0), -(41268,1,0), -(41269,1,0), -(41271,1,0), -(41285,1,1), -(41295,1,0), -(41333,1,0), -(41342,1,0), -(41343,1,0), -(41344,1,0), -(41362,1,0), -(41455,1,0), -(41457,1,0), -(41477,1,0), -(41499,1,0), -(41522,1,0), -(41525,1,0), -(41537,1,0), -(41557,1,0), -(41560,1,0), -(41575,1,0), -(41602,1,0), -(41614,1,0), -(41624,1,1), -(41975,1,0), -(41976,1,0), -(41993,1,0), -(42008,1,0), -(42014,1,0), -(42138,1,1), -(42143,1,0), -(42151,1,0), -(42166,1,0), -(42167,1,0), -(42168,1,0), -(42178,1,0), -(42219,1,0), -(42222,1,0), -(42247,1,0), -(42269,1,0), -(42271,1,0), -(42272,1,0), -(42289,1,0), -(42317,1,0), -(42318,1,0), -(42321,1,0), -(42339,1,0), -(42341,1,0), -(42352,1,0), -(42356,1,0), -(42391,1,0), -(42393,1,0), -(42405,1,0), -(42410,1,0), -(42415,1,0), -(42428,1,0), -(42442,1,0), -(42447,1,0), -(42454,1,0), -(42471,1,0), -(42473,1,0), -(42482,1,0), -(42484,1,0), -(42515,1,0), -(42517,1,0), -(42530,1,0), -(42534,1,0), -(42536,1,0), -(42542,1,0), -(42550,1,0), -(42564,1,0), -(42567,1,0), -(42570,1,0), -(42577,1,0), -(42585,1,0), -(42604,1,0), -(42605,1,0), -(42616,1,0), -(42631,1,0), -(42638,1,1), -(42647,1,0), -(42654,1,0), -(42655,1,0), -(42659,1,0), -(42661,1,0), -(42664,1,0), -(42674,1,1), -(42685,1,0), -(42695,1,0), -(42697,1,0), -(42703,1,0), -(42707,1,0), -(42713,1,0), -(42720,1,0), -(42734,1,0), -(42757,1,1), -(42768,1,0), -(42793,1,0), -(42797,1,0), -(42808,1,0), -(42809,1,0), -(42813,1,0), -(42815,1,0), -(42816,1,0), -(42818,1,0), -(42821,1,0), -(42839,1,0), -(42857,1,0), -(42881,1,0), -(42882,1,0), -(42883,1,0), -(42884,1,0), -(42888,1,0), -(42905,1,0), -(42968,1,0), -(42982,1,0), -(43033,1,0), -(43035,1,0), -(43057,1,0), -(43066,1,0), -(43068,1,0), -(43069,1,0), -(43072,1,0), -(43076,1,0), -(43078,1,0), -(43079,1,0), -(43092,1,0), -(43101,1,0), -(43106,1,0), -(43109,1,0), -(43144,1,0), -(43171,1,0), -(43209,1,0), -(43210,1,0), -(43234,1,0), -(43239,1,0), -(43244,1,0), -(43255,1,0), -(43291,1,0), -(43306,1,0), -(43307,1,0), -(43333,1,0), -(43371,1,0), -(43385,1,0), -(43386,1,0), -(43403,1,0), -(43404,1,0), -(43407,1,0), -(43450,1,0), -(43458,1,0), -(43468,1,0), -(43486,1,0), -(43487,1,0), -(43515,1,0), -(43520,1,0), -(43525,1,0), -(43546,1,0), -(43559,1,0), -(43563,1,0), -(43568,1,0), -(43615,1,0), -(43647,1,0), -(43662,1,0), -(43685,1,0), -(43691,1,0), -(43711,1,0), -(43734,1,0), -(43754,1,0), -(43770,1,0), -(43791,1,0), -(43805,1,0), -(43863,1,0), -(43865,1,0), -(43867,1,0), -(43871,1,0), -(43872,1,0), -(43878,1,0), -(43882,1,0), -(43892,1,0), -(43942,1,0), -(43943,1,0), -(43949,1,0), -(43962,1,0), -(43990,1,0), -(43994,1,0), -(44014,1,0), -(44022,1,0), -(44023,1,0), -(44024,1,0), -(44026,1,0), -(44027,1,0), -(44028,1,0), -(44037,1,0), -(44145,1,0), -(44161,1,0), -(44193,1,0), -(44214,1,0), -(44224,1,1), -(44229,1,0), -(44232,1,1), -(44250,1,0), -(44255,1,0), -(44260,1,0), -(44266,1,0), -(44270,1,0), -(44283,1,0), -(44284,1,0), -(44309,1,0), -(44313,1,0), -(44329,1,0), -(44330,1,0), -(44355,1,0), -(44362,1,0), -(44365,1,0), -(44367,1,0), -(44374,1,0), -(44392,1,0), -(44411,1,0), -(44420,1,0), -(44422,1,0), -(44458,1,0), -(44550,1,0), -(44562,1,0), -(44574,1,0), -(44609,1,0), -(44610,1,0), -(44653,1,0), -(44681,1,0), -(44682,1,1), -(44749,1,0), -(44804,1,0), -(44807,1,0), -(44826,1,0), -(44837,1,0), -(44838,1,0), -(44839,1,0), -(44840,1,0), -(44841,1,0), -(44842,1,0), -(44845,1,0), -(44846,1,0), -(44849,1,1), -(44864,1,0), -(44865,1,0), -(44872,1,0), -(44877,1,0), -(44883,1,0), -(44886,1,0), -(44938,1,0), -(44939,1,0), -(44941,1,0), -(44946,1,0), -(44948,1,0), -(44963,1,0), -(44965,1,0), -(44981,1,0), -(45005,1,0), -(45008,1,0), -(45012,1,0), -(45013,1,0), -(45076,1,0), -(45086,1,0), -(45103,1,0), -(45109,1,0), -(45114,1,0), -(45115,1,0), -(45119,1,0), -(45172,1,0), -(45188,1,0), -(45191,1,0), -(45219,1,0), -(45223,1,0), -(45224,1,0), -(45229,1,0), -(45233,1,0), -(45259,1,0), -(45260,1,1), -(45264,1,0), -(45267,1,0), -(45277,1,0), -(45279,1,0), -(45307,1,0), -(45323,1,0), -(45339,1,0), -(45340,1,0), -(45351,1,0), -(45368,1,0), -(45371,1,0), -(45388,1,0), -(45389,1,0), -(45405,1,0), -(45407,1,0), -(45414,1,0), -(45437,1,0), -(45446,1,0), -(45448,1,0), -(45449,1,0), -(45465,1,0), -(45474,1,0), -(45536,1,0), -(45581,1,0), -(45583,1,0), -(45586,1,0), -(45594,1,0), -(45595,1,0), -(45596,1,0), -(45597,1,0), -(45602,1,0), -(45605,1,0), -(45606,1,0), -(45607,1,0), -(45608,1,0), -(45609,1,0), -(45622,1,0), -(45623,1,0), -(45630,1,0), -(45634,1,0), -(45644,1,1), -(45651,1,0), -(45655,1,0), -(45656,1,0), -(45666,1,0), -(45667,1,0), -(45671,1,1), -(45680,1,1), -(45692,1,0), -(45700,1,0), -(45714,1,0), -(45732,1,0), -(45735,1,0), -(45761,1,0), -(45774,1,0), -(45780,1,0), -(45788,1,0), -(45805,1,0), -(45808,1,0), -(45834,1,0), -(45835,1,0), -(45841,1,0), -(45853,1,0), -(45859,1,0), -(45863,1,0), -(45864,1,0), -(45867,1,0), -(45872,1,0), -(45888,1,0), -(45907,1,0), -(45911,1,0), -(45912,1,0), -(45914,1,0), -(45918,1,1), -(45923,1,0), -(45929,1,0), -(45930,1,0), -(45941,1,0), -(45949,1,0), -(45961,1,0), -(45968,1,0), -(45969,1,0), -(45970,1,0), -(45976,1,0), -(45979,1,0), -(45990,1,0), -(45993,1,0), -(46013,1,0), -(46018,1,1), -(46022,1,0), -(46034,1,0), -(46054,1,0), -(46058,1,0), -(46063,1,0), -(46066,1,0), -(46068,1,0), -(46085,1,0), -(46143,1,0), -(46171,1,0), -(46173,1,0), -(62377,1,0), -(46175,1,0), -(46176,1,0), -(46177,1,0), -(46178,1,0), -(46201,1,0), -(46208,1,0), -(46219,1,0), -(46222,1,0), -(46236,1,0), -(46237,1,0), -(46245,1,0), -(46246,1,0), -(46281,1,0), -(46307,1,1), -(46318,1,0), -(46319,1,0), -(46320,1,1), -(46330,1,0), -(46363,1,0), -(46372,1,1), -(46374,1,0), -(46376,1,0), -(46382,1,0), -(46385,1,0), -(46396,1,1), -(46398,1,0), -(46399,1,0), -(46400,1,0), -(46474,1,0), -(46475,1,0), -(46477,1,0), -(46482,1,0), -(46488,1,0), -(46521,1,0), -(46588,1,1), -(46592,1,0), -(46593,1,0), -(46603,1,0), -(46609,1,0), -(46610,1,0), -(46623,1,0), -(46631,1,0), -(46637,1,0), -(46650,1,0), -(46652,1,0), -(46656,1,0), -(46685,1,0), -(46692,1,0), -(46694,1,0), -(46704,1,0), -(46707,1,0), -(46732,1,1), -(46733,1,0), -(46735,1,0), -(46747,1,0), -(46793,1,0), -(46797,1,0), -(46809,1,0), -(46815,1,0), -(46818,1,0), -(46820,1,0), -(46843,1,0), -(46886,1,0), -(46895,1,0), -(46900,1,0), -(46902,1,0), -(46903,1,0), -(46904,1,0), -(46936,1,0), -(46937,1,0), -(46963,1,0), -(46964,1,0), -(46965,1,1), -(46974,1,0), -(47016,1,0), -(47026,1,0), -(47035,1,0), -(47060,1,0), -(47065,1,0), -(47104,1,0), -(47110,1,0), -(47137,1,0), -(47170,1,0), -(47176,1,0), -(47184,1,0), -(47214,1,0), -(47253,1,0), -(47254,1,0), -(47336,1,0), -(47344,1,0), -(47370,1,1), -(47374,1,0), -(47378,1,0), -(47421,1,0), -(47452,1,0), -(47460,1,0), -(47463,1,0), -(47469,1,0), -(47542,1,0), -(47547,1,0), -(47563,1,0), -(47574,1,0), -(47593,1,0), -(47594,1,0), -(47596,1,0), -(47597,1,0), -(47598,1,0), -(47599,1,0), -(47616,1,0), -(47617,1,0), -(47618,1,0), -(47619,1,0), -(47634,1,0), -(47669,1,0), -(47670,1,0), -(47681,1,0), -(47682,1,0), -(47683,1,0), -(47684,1,0), -(47685,1,0), -(47691,1,1), -(47711,1,0), -(47712,1,0), -(47713,1,0), -(47747,1,0), -(47771,1,0), -(47787,1,0), -(47799,1,0), -(47911,1,0), -(47913,1,0), -(47916,1,0), -(47933,1,0), -(47935,1,0), -(47939,1,0), -(47959,1,0), -(48009,1,0), -(48021,1,0), -(48028,1,1), -(48035,1,0), -(48115,1,0), -(48117,1,0), -(48183,1,0), -(48185,1,0), -(48188,1,0), -(48194,1,1), -(48199,1,0), -(48201,1,0), -(48202,1,0), -(48213,1,0), -(48218,1,0), -(48222,1,0), -(48223,1,0), -(48227,1,0), -(48246,1,1), -(48252,1,0), -(48293,1,0), -(48306,1,0), -(48315,1,0), -(48329,1,0), -(48344,1,0), -(48345,1,0), -(48362,1,0), -(48363,1,0), -(48375,1,0), -(48385,1,0), -(48398,1,0), -(48399,1,0), -(48425,1,0), -(48426,1,0), -(48455,1,0), -(48490,1,0), -(48497,1,0), -(48508,1,0), -(48530,1,0), -(48551,1,0), -(48597,1,0), -(48600,1,0), -(48605,1,0), -(48620,1,0), -(48623,1,0), -(48627,1,0), -(48641,1,0), -(48642,1,0), -(48646,1,0), -(48649,1,0), -(48685,1,0), -(48724,1,0), -(48726,1,0), -(48728,1,0), -(48730,1,0), -(48732,1,0), -(48748,1,0), -(48764,1,0), -(48771,1,0), -(48773,1,0), -(48790,1,0), -(48793,1,0), -(48799,1,0), -(48808,1,0), -(48811,1,0), -(48896,1,0), -(48901,1,0), -(48904,1,0), -(48929,1,0), -(48974,1,0), -(48975,1,0), -(49022,1,0), -(49030,1,0), -(49058,1,0), -(49062,1,0), -(49075,1,0), -(49080,1,0), -(49083,1,0), -(49118,1,0), -(49125,1,0), -(49128,1,0), -(49129,1,0), -(49131,1,0), -(49134,1,0), -(49135,1,0), -(49159,1,0), -(49166,1,0), -(49210,1,0), -(49211,1,0), -(49262,1,0), -(49291,1,0), -(49292,1,0), -(49313,1,0), -(49319,1,0), -(49325,1,0), -(49330,1,0), -(49332,1,0), -(49333,1,0), -(49334,1,0), -(49367,1,0), -(49370,1,0), -(49404,1,0), -(49405,1,0), -(49428,1,0), -(49434,1,0), -(49515,1,0), -(49517,1,0), -(49519,1,0), -(49524,1,0), -(49525,1,0), -(49552,1,0), -(49554,1,0), -(49555,1,0), -(49557,1,0), -(49590,1,0), -(49625,1,0), -(49634,1,0), -(49679,1,0), -(49682,1,0), -(49683,1,0), -(49684,1,0), -(49731,1,0), -(49751,1,0), -(49762,1,0), -(49825,1,0), -(49826,1,0), -(49829,1,0), -(49858,1,0), -(49862,1,0), -(49870,1,0), -(49899,1,0), -(49947,1,0), -(50036,1,0), -(50087,1,0), -(50133,1,0), -(50173,1,0), -(50174,1,0), -(50176,1,0), -(50177,1,0), -(50178,1,0), -(50179,1,0), -(50312,1,0), -(50315,1,1), -(50331,1,0), -(50350,1,0), -(50382,1,0), -(50383,1,0), -(50398,1,1), -(50430,1,0), -(50440,1,0), -(50492,1,0), -(50515,1,0), -(50524,1,0), -(50546,1,0), -(50547,1,0), -(50548,1,0), -(50554,1,0), -(50556,1,0), -(50562,1,0), -(50563,1,0), -(50568,1,0), -(50569,1,0), -(50592,1,0), -(50628,1,0), -(50669,1,0), -(50674,1,0), -(50682,1,1), -(50742,1,0), -(50775,1,0), -(50793,1,0), -(50794,1,0), -(50817,1,0), -(50835,1,0), -(50878,1,0), -(50883,1,1), -(50892,1,0), -(51001,1,0), -(51022,1,0), -(51023,1,0), -(51024,1,0), -(51025,1,0), -(51039,1,0), -(51049,1,0), -(51122,1,0), -(51136,1,0), -(51139,1,0), -(51152,1,0), -(51171,1,0), -(51172,1,0), -(51202,1,0), -(51213,1,0), -(51215,1,0), -(51234,1,0), -(51239,1,0), -(51247,1,0), -(51256,1,0), -(51276,1,0), -(51288,1,0), -(51318,1,0), -(51331,1,0), -(51332,1,0), -(51333,1,0), -(51343,1,0), -(51366,1,0), -(51368,1,0), -(51381,1,0), -(51384,1,0), -(51393,1,0), -(51396,1,0), -(51403,1,0), -(51420,1,0), -(51448,1,1), -(51516,1,0), -(51518,1,0), -(51577,1,0), -(51579,1,0), -(51590,1,0), -(51603,1,0), -(51606,1,0), -(51607,1,0), -(51616,1,0), -(51639,1,0), -(51641,1,0), -(51642,1,0), -(51643,1,0), -(51644,1,0), -(51645,1,0), -(51649,1,0), -(51650,1,0), -(51651,1,0), -(51652,1,0), -(51670,1,0), -(51694,1,0), -(51697,1,0), -(51727,1,0), -(51737,1,0), -(51739,1,0), -(51743,1,0), -(51754,1,0), -(51767,1,0), -(51769,1,0), -(51773,1,0), -(51774,1,0), -(51791,1,0), -(51794,1,0), -(51825,1,0), -(51840,1,0), -(51843,1,0), -(51858,1,0), -(51859,1,0), -(51861,1,0), -(51866,1,0), -(51870,1,0), -(51902,1,0), -(51904,1,0), -(51907,1,0), -(51910,1,0), -(51925,1,0), -(51927,1,0), -(51931,1,0), -(51932,1,0), -(51933,1,0), -(51942,1,0), -(51959,1,0), -(51964,1,0), -(51965,1,0), -(52011,1,0), -(52037,1,0), -(52059,1,0), -(52064,1,0), -(52089,1,0), -(52106,1,0), -(52122,1,0), -(52124,1,0), -(52140,1,0), -(52151,1,0), -(52164,1,0), -(52170,1,0), -(52173,1,0), -(52185,1,0), -(52227,1,0), -(52229,1,0), -(52238,1,0), -(52239,1,0), -(52242,1,0), -(52247,1,0), -(52254,1,0), -(52257,1,0), -(52259,1,0), -(52264,1,0), -(52294,1,0), -(52313,1,0), -(52322,1,0), -(52335,1,0), -(52336,1,0), -(52337,1,1), -(52340,1,0), -(52343,1,0), -(52349,1,0), -(52365,1,1), -(52369,1,0), -(52371,1,0), -(52381,1,0), -(52387,1,0), -(52388,1,0), -(52407,1,0), -(52412,1,0), -(52414,1,0), -(52427,1,0), -(52438,1,0), -(52446,1,0), -(52449,1,0), -(52452,1,0), -(52453,1,0), -(52454,1,0), -(52457,1,0), -(52458,1,0), -(52512,1,0), -(52514,1,0), -(52528,1,0), -(52576,1,0), -(52577,1,0), -(52585,1,0), -(52607,1,0), -(52632,1,0), -(52638,1,0), -(52654,1,0), -(52661,1,0), -(52676,1,0), -(52681,1,0), -(52686,1,0), -(52687,1,0), -(52688,1,0), -(52725,1,0), -(52726,1,0), -(52727,1,0), -(52728,1,0), -(52729,1,0), -(52730,1,0), -(52731,1,0), -(52732,1,0), -(52774,1,0), -(52791,1,0), -(52793,1,0), -(52805,1,0), -(52811,1,0), -(52816,1,0), -(52833,1,0), -(52834,1,0), -(52837,1,0), -(52838,1,0), -(52844,1,0), -(52850,1,0), -(52884,1,0), -(52908,1,0), -(52920,1,0), -(52930,1,0), -(52934,1,0), -(52935,1,0), -(52936,1,0), -(52937,1,0), -(52953,1,0), -(52955,1,0), -(52956,1,0), -(52981,1,0), -(52989,1,0), -(52990,1,0), -(53010,1,0), -(53020,1,0), -(53024,1,0), -(53029,1,0), -(53038,1,0), -(53083,1,0), -(53093,1,0), -(53096,1,0), -(53106,1,0), -(53110,1,0), -(53163,1,0), -(53170,1,0), -(53177,1,0), -(53185,1,0), -(53206,1,0), -(53210,1,0), -(53242,1,1), -(53272,1,0), -(53441,1,0), -(53464,1,0), -(53465,1,0), -(53466,1,0), -(53570,1,0), -(53609,1,0), -(53613,1,0), -(53626,1,0), -(53644,1,0), -(53680,1,0), -(53683,1,0), -(53684,1,0), -(53685,1,0), -(53701,1,0), -(53714,1,1), -(53717,1,0), -(53730,1,0), -(53745,1,0), -(53757,1,1), -(53778,1,0), -(53798,1,0), -(53826,1,0), -(53827,1,0), -(53828,1,0), -(53829,1,0), -(54040,1,0), -(54047,1,0), -(54089,1,0), -(54090,1,0), -(54097,1,0), -(54108,1,0), -(54112,1,0), -(54128,1,0), -(54142,1,0), -(54209,1,0), -(54236,1,0), -(54245,1,0), -(54250,1,0), -(54258,1,0), -(54264,1,0), -(54265,1,0), -(54266,1,0), -(54267,1,0), -(54269,1,0), -(54323,1,0), -(54325,1,0), -(54327,1,0), -(54328,1,0), -(54377,1,0), -(54423,1,0), -(54426,1,0), -(54430,1,0), -(54464,1,0), -(54510,1,0), -(54522,1,0), -(54539,1,0), -(54548,1,0), -(54643,1,0), -(54656,1,0), -(54664,1,0), -(54685,1,0), -(54699,1,1), -(54725,1,1), -(54728,1,0), -(54744,1,1), -(54746,1,1), -(54773,1,0), -(54796,1,0), -(54798,1,0), -(54806,1,0), -(54878,1,0), -(54899,1,0), -(54984,1,0), -(54985,1,0), -(54988,1,0), -(54991,1,0), -(55063,1,0), -(55089,1,0), -(55127,1,0), -(55134,1,0), -(55137,1,0), -(55138,1,0), -(55141,1,0), -(55145,1,0), -(55161,1,0), -(55223,1,0), -(55227,1,0), -(55229,1,0), -(55231,1,0), -(55244,1,0), -(55257,1,0), -(55287,1,0), -(55288,1,0), -(55290,1,0), -(55406,1,0), -(55418,1,0), -(55419,1,0), -(55423,1,1), -(55432,1,0), -(55465,1,0), -(55468,1,0), -(55510,1,0), -(55516,1,0), -(55519,1,0), -(55524,1,0), -(55526,1,0), -(55527,1,0), -(55571,1,0), -(55578,1,0), -(55616,1,1), -(55647,1,0), -(55660,1,0), -(55661,1,0), -(55662,1,0), -(55693,1,0), -(55720,1,0), -(55721,1,0), -(55722,1,0), -(55723,1,0), -(55724,1,0), -(55725,1,0), -(55726,1,0), -(55727,1,0), -(55785,1,0), -(55796,1,0), -(55801,1,0), -(55803,1,0), -(55805,1,0), -(55811,1,0), -(55844,1,0), -(55853,1,0), -(55868,1,0), -(55872,1,0), -(55875,1,0), -(55878,1,1), -(55881,1,1), -(55882,1,0), -(55885,1,1), -(55886,1,0), -(55887,1,1), -(55888,1,0), -(55954,1,0), -(56047,1,0), -(56066,1,0), -(56099,1,0), -(56103,1,0), -(56114,1,0), -(56117,1,0), -(56150,1,0), -(56152,1,0), -(56189,1,0), -(56227,1,0), -(56253,1,0), -(56263,1,0), -(56264,1,0), -(56265,1,0), -(56266,1,0), -(56275,1,0), -(56312,1,0), -(56387,1,0), -(56388,1,0), -(56393,1,0), -(56429,1,0), -(56458,1,0), -(56505,1,0), -(56523,1,0), -(56560,1,0), -(56563,1,0), -(56567,1,0), -(56575,1,0), -(56621,1,0), -(56622,1,0), -(56652,1,0), -(56661,1,0), -(56663,1,0), -(56665,1,0), -(56667,1,0), -(56669,1,0), -(56673,1,0), -(56677,1,0), -(56680,1,0), -(56683,1,0), -(56688,1,0), -(56691,1,0), -(56693,1,0), -(56695,1,0), -(56696,1,0), -(56711,1,0), -(56713,1,0), -(56722,1,0), -(56723,1,0), -(56724,1,0), -(56725,1,0), -(56738,1,0), -(56763,1,0), -(56764,1,0), -(56865,1,0), -(56905,1,0), -(56917,1,0), -(56941,1,1), -(57042,1,0), -(57068,1,0), -(57071,1,0), -(57072,1,0), -(57410,1,0), -(57417,1,0), -(57420,1,0), -(57422,1,0), -(57469,1,0), -(57471,1,0), -(57495,1,0), -(57523,1,0), -(57534,1,0), -(57632,1,0), -(57637,1,0), -(57638,1,0), -(57639,1,0), -(57642,1,0), -(57650,1,0), -(57659,1,0), -(57666,1,0), -(57667,1,0), -(57682,1,0), -(57732,1,0), -(57734,1,0), -(57735,1,0), -(57736,1,0), -(57737,1,0), -(57738,1,0), -(57797,1,0), -(57806,1,0), -(57809,1,0), -(57828,1,0), -(57852,1,0), -(57853,1,0), -(57885,1,0), -(57891,1,0), -(57912,1,0), -(57930,1,0), -(57962,1,0), -(57963,1,0), -(57980,1,0), -(57983,1,0), -(58036,1,0), -(58040,1,0), -(58064,1,0), -(58084,1,0), -(58103,1,0), -(58108,1,0), -(58109,1,0), -(58112,1,0), -(58114,1,0), -(58121,1,0), -(58123,1,0), -(58124,1,0), -(58131,1,0), -(58152,1,0), -(58178,1,0), -(58195,1,1), -(58196,1,1), -(58197,1,1), -(58198,1,1), -(58225,1,0), -(58350,1,0), -(58416,1,0), -(58493,1,1), -(58515,1,0), -(58533,1,0), -(58542,1,0), -(58552,1,0), -(58593,1,0), -(58641,1,0), -(58658,1,0), -(58672,1,0), -(58685,1,0), -(58793,1,0), -(58836,1,0), -(58838,1,0), -(58846,1,1), -(58858,1,0), -(58873,1,0), -(58916,1,0), -(58917,1,0), -(58945,1,0), -(58949,1,0), -(59078,1,0), -(59091,1,0), -(59098,1,0), -(59115,1,0), -(59125,1,0), -(59189,1,0), -(59190,1,0), -(59284,1,0), -(59335,1,0), -(59363,1,0), -(59375,1,0), -(59383,1,0), -(59386,1,0), -(59396,1,0), -(59449,1,0), -(59456,1,0), -(59461,1,1), -(59528,1,0), -(59534,1,0), -(59552,1,0), -(59554,1,0), -(59556,1,1), -(59579,1,0), -(59595,1,0), -(59643,1,0), -(59655,1,0), -(59668,1,0), -(59677,1,0), -(59678,1,0), -(59704,1,0), -(59729,1,0), -(59730,1,0), -(59764,1,0), -(59780,1,0), -(59781,1,0), -(59807,1,0), -(59847,1,0), -(59867,1,0), -(59871,1,0), -(59897,1,0), -(59925,1,0), -(59930,1,0), -(59951,1,0), -(59952,1,0), -(59977,1,0), -(60038,1,0), -(60045,1,0), -(60046,1,0), -(60088,1,0), -(60104,1,0), -(60178,1,1), -(60207,1,0), -(60208,1,0), -(60224,1,0), -(60243,1,0), -(60256,1,0), -(60285,1,0), -(60288,1,0), -(60291,1,1), -(60292,1,1), -(60293,1,1), -(60294,1,1), -(60295,1,1), -(60296,1,1), -(60297,1,1), -(60298,1,0), -(60310,1,0), -(60315,1,0), -(60316,1,0), -(60342,1,0), -(60422,1,0), -(60456,1,0), -(60476,1,1), -(60496,1,0), -(60499,1,1), -(60507,1,1), -(60508,1,1), -(60511,1,0), -(60516,1,0), -(60522,1,1), -(60528,1,0), -(60535,1,0), -(60536,1,0), -(60561,1,0), -(60612,1,0), -(60614,1,0), -(60713,1,0), -(60810,1,0), -(60829,1,0), -(60831,1,0), -(60834,1,0), -(60836,1,0), -(60863,1,0), -(60909,1,0), -(60912,1,1), -(60967,1,0), -(61007,1,0), -(61026,1,0), -(61028,1,0), -(61071,1,0), -(61072,1,0), -(61073,1,0), -(61074,1,0), -(61075,1,0), -(61114,1,0), -(61121,1,0), -(61151,1,0), -(61152,1,0), -(61180,1,0), -(61210,1,0), -(61219,1,0), -(61245,1,0), -(61254,1,0), -(61353,1,0), -(61355,1,0), -(61397,1,0), -(61408,1,0), -(61416,1,0), -(61487,1,0), -(61488,1,0), -(61492,1,0), -(61524,1,0), -(61537,1,0), -(61588,1,0), -(61602,1,0), -(61647,1,0), -(61652,1,0), -(61665,1,0), -(61710,1,0), -(61738,1,0), -(61764,1,0), -(61765,1,0), -(61766,1,0), -(61771,1,0), -(61816,1,1), -(61863,1,1), -(61901,1,0), -(61934,1,0), -(61942,1,0), -(61964,1,0), -(61975,1,0), -(62002,1,0), -(62016,1,0), -(62034,1,0), -(62037,1,1), -(62072,1,0), -(62082,1,0), -(62083,1,0), -(62084,1,0), -(62091,1,0), -(62102,1,0), -(62195,1,0), -(62223,1,0), -(62266,1,0), -(62272,1,0), -(62278,1,0), -(62284,1,0), -(62304,1,0), -(62323,1,0), -(62343,1,0), -(47129,2,0), -(34395,2,0), -(34387,2,0), -(32440,2,0), -(32439,2,0), -(32205,2,0), -(31538,2,0), -(30740,2,0), -(29831,2,0), -(28806,2,0), -(28353,2,0), -(27517,2,0), -(27203,2,0), -(27202,2,0), -(27201,2,0), -(27191,2,0), -(27190,2,0), -(27184,2,0), -(26560,2,0), -(26063,2,0), -(25005,2,0), -(24934,2,0), -(24871,2,0), -(24721,2,0), -(24390,2,0), -(23208,2,0), -(21127,2,0), -(18431,2,0), -(17731,2,0), -(17016,2,0), -(16613,2,0), -(16447,2,0), -(13489,2,0), -(12139,2,0), -(11792,2,0), -(9224,2,0), -(9223,2,0), -(9222,2,0), -(9221,2,0), -(8674,2,0), -(7729,2,0), -(7728,2,0), -(3921,2,0), -(35683,2,0), -(36066,2,0), -(36546,2,0), -(36851,2,0), -(37754,2,0), -(38439,2,0), -(38782,2,0), -(39050,2,0), -(40055,2,0), -(40165,2,0), -(40166,2,0), -(40167,2,0), -(40328,2,0), -(40447,2,0), -(40468,2,0), -(40632,2,0), -(40640,2,0), -(40642,2,0), -(40644,2,0), -(40675,2,0), -(40774,2,0), -(40785,2,0), -(40964,2,0), -(40965,2,0), -(40968,2,0), -(40970,2,0), -(41004,2,0), -(41145,2,0), -(41146,2,0), -(42020,2,0), -(42022,2,0), -(42323,2,0), -(42788,2,0), -(43418,2,0), -(43552,2,0), -(43723,2,0), -(43753,2,0), -(43768,2,0), -(43950,2,0), -(44307,2,0), -(44498,2,0), -(44499,2,0), -(44611,2,0), -(44686,2,0), -(44874,2,0), -(44885,2,0), -(45149,2,0), -(45222,2,0), -(45226,2,0), -(45795,2,0), -(45877,2,0), -(45971,2,0), -(46072,2,0), -(46350,2,0), -(46360,2,1), -(46584,2,0), -(76006,2,0), -(74179,2,0), -(72869,2,0), -(72868,2,0), -(72608,2,0), -(72456,2,0), -(72405,2,0), -(72340,2,1), -(71284,2,1), -(70598,2,1), -(70446,2,1), -(70346,2,0), -(70227,2,0), -(70199,2,0), -(70175,2,0), -(70173,2,0), -(69402,2,0), -(69400,2,0), -(69294,2,0), -(69157,2,0), -(67815,2,0), -(67814,2,0), -(67813,2,0), -(67812,2,0), -(67798,2,0), -(67459,2,0), -(67458,2,0), -(67448,2,0), -(67439,2,0), -(67436,2,0), -(66676,2,0), -(66672,2,0), -(66655,2,0), -(66531,2,0), -(66289,2,0), -(65209,2,0), -(64871,2,0), -(64570,2,0), -(64436,2,0), -(63618,2,0), -(63381,2,0), -(62776,2,0), -(62714,2,0), -(62635,2,0), -(62397,2,0), -(62363,2,0), -(62357,2,0), -(62355,2,0), -(62307,2,0), -(62086,2,0), -(61999,2,1), -(60289,2,0), -(60101,2,0), -(59790,2,0), -(59732,2,0), -(59576,2,0), -(58596,2,0), -(58231,2,0), -(57945,2,0), -(57619,2,0), -(57610,2,0), -(57607,2,0), -(57583,2,0), -(57575,2,0), -(57544,2,0), -(57517,2,0), -(57415,2,0), -(56790,2,0), -(56570,2,0), -(56385,2,0), -(56350,2,0), -(55934,2,0), -(55820,2,0), -(55367,2,0), -(55197,2,0), -(54712,2,0), -(54666,2,0), -(54530,2,0), -(52510,2,0), -(52408,2,0), -(52339,2,0), -(52277,2,0), -(52274,2,0), -(52115,2,0), -(51383,2,0), -(51328,2,0), -(51327,2,0), -(51326,2,0), -(51325,2,0), -(51241,2,0), -(50999,2,0), -(50319,2,0), -(50026,2,0), -(50003,2,0), -(49867,2,0), -(49860,2,0), -(49765,2,0), -(49728,2,0), -(49693,2,0), -(49689,2,0), -(49158,2,0), -(49123,2,0), -(49109,2,0), -(48794,2,0), -(48738,2,0), -(48347,2,0), -(47978,2,0), -(35246,2,0), -(42576,3,0), -(42492,3,0), -(42475,3,0), -(42433,3,0), -(42350,3,0), -(42348,3,0), -(42242,3,1), -(42228,3,0), -(42220,3,0), -(42114,3,0), -(41221,3,0), -(40961,3,0), -(40960,3,0), -(40959,3,0), -(40957,3,0), -(40885,3,0), -(40603,3,0), -(40495,3,0), -(40401,3,0), -(40380,3,0), -(40341,3,0), -(40307,3,0), -(40286,3,0), -(40285,3,0), -(40284,3,0), -(40283,3,0), -(40268,3,0), -(40247,3,0), -(40246,3,0), -(40245,3,0), -(40244,3,0), -(40240,3,0), -(40222,3,0), -(40179,3,0), -(40178,3,0), -(40177,3,0), -(40176,3,0), -(40105,3,0), -(40076,3,0), -(39932,3,0), -(39887,3,0), -(39844,3,0), -(39832,3,1), -(39831,3,0), -(39558,3,0), -(39401,3,0), -(39399,3,0), -(39398,3,0), -(39393,3,0), -(39384,3,0), -(39364,3,0), -(38866,3,0), -(38680,3,0), -(38173,3,0), -(38046,3,0), -(38044,3,0), -(37970,3,0), -(37954,3,0), -(37942,3,0), -(37919,3,0), -(37913,3,0), -(37793,3,1), -(37789,3,0), -(37750,3,1), -(37504,3,0), -(37489,3,0), -(37473,3,1), -(37366,3,0), -(37134,3,0), -(36821,3,0), -(36811,3,0), -(36450,3,0), -(36449,3,1), -(36325,3,0), -(35958,3,0), -(35776,3,0), -(35734,3,0), -(35599,3,0), -(35596,3,0), -(34303,3,0), -(34200,3,0), -(34186,3,0), -(42578,3,0), -(33814,3,0), -(33783,3,0), -(33670,3,0), -(33664,3,0), -(33365,3,0), -(33240,3,0), -(33111,3,0), -(32785,3,0), -(32314,3,0), -(32307,3,0), -(32241,3,0), -(32148,3,0), -(32067,3,0), -(31927,3,0), -(31543,3,0), -(31364,3,0), -(31363,3,0), -(31333,3,0), -(30758,3,0), -(30741,3,0), -(30284,3,0), -(29945,3,0), -(29866,3,0), -(29820,3,1), -(29460,3,0), -(28373,3,0), -(28250,3,0), -(28054,3,0), -(26521,3,0), -(26519,3,0), -(26518,3,0), -(26517,3,0), -(26516,3,0), -(26490,3,0), -(26488,3,0), -(26393,3,1), -(26373,3,0), -(26338,3,0), -(26337,3,0), -(26336,3,0), -(26335,3,0), -(26334,3,0), -(26333,3,0), -(26329,3,0), -(26328,3,0), -(26327,3,0), -(26326,3,0), -(26325,3,0), -(26304,3,0), -(26295,3,0), -(26294,3,0), -(26293,3,0), -(26292,3,0), -(26291,3,0), -(26286,3,0), -(25687,3,0), -(25183,3,0), -(25181,3,0), -(25180,3,0), -(25178,3,0), -(25177,3,0), -(24973,3,0), -(24731,3,0), -(23024,3,0), -(21086,3,0), -(21014,3,0), -(20038,3,0), -(20037,3,0), -(19873,3,0), -(17179,3,0), -(16629,3,0), -(16452,3,0), -(16337,3,0), -(15998,3,0), -(13488,3,0), -(12151,3,0), -(10860,3,0), -(10836,3,0), -(10835,3,0), -(10834,3,0), -(10805,3,0), -(9257,3,0), -(9232,3,0), -(42868,3,0), -(43233,3,0), -(43539,3,0), -(43664,3,0), -(43898,3,0), -(43954,3,0), -(43963,3,0), -(43986,3,0), -(44013,3,0), -(44132,3,0), -(44213,3,0), -(44249,3,0), -(44320,3,0), -(44321,3,0), -(44375,3,0), -(44465,3,0), -(44554,3,0), -(44565,3,0), -(44603,3,0), -(44678,3,0), -(44844,3,0), -(44884,3,0), -(45030,3,0), -(45050,3,1), -(45201,3,0), -(45203,3,0), -(45404,3,0), -(45502,3,0), -(45585,3,0), -(45633,3,0), -(45635,3,0), -(45653,3,0), -(45839,3,0), -(45885,3,1), -(46417,3,0), -(46574,3,0), -(46638,3,1), -(46852,3,0), -(46896,3,0), -(47030,3,1), -(47328,3,0), -(47510,3,0), -(47628,3,0), -(47745,3,0), -(47775,3,1), -(47800,3,0), -(48198,3,0), -(48212,3,0), -(48331,3,0), -(48431,3,0), -(48882,3,0), -(48972,3,0), -(49197,3,0), -(49300,3,0), -(49308,3,0), -(49453,3,0), -(49735,3,0), -(50313,3,1), -(50348,3,0), -(50443,3,0), -(50501,3,0), -(50626,3,0), -(50639,3,0), -(50640,3,0), -(50716,3,0), -(50790,3,0), -(50791,3,0), -(50802,3,0), -(50803,3,0), -(50825,3,0), -(50826,3,0), -(51212,3,0), -(51246,3,0), -(51395,3,0), -(51511,3,0), -(51742,3,0), -(51748,3,0), -(51805,3,0), -(51846,3,0), -(52067,3,1), -(52271,3,0), -(52305,3,0), -(52479,3,0), -(52480,3,0), -(52497,3,0), -(52603,3,0), -(52683,3,0), -(52685,3,0), -(52812,3,0), -(53677,3,0), -(53679,3,0), -(53694,3,0), -(53705,3,0), -(53706,3,0), -(54272,3,0), -(54517,3,0), -(54914,3,0), -(54961,3,0), -(54990,3,0), -(55037,3,0), -(55083,3,0), -(55365,3,0), -(55479,3,0), -(55715,3,0), -(55800,3,0), -(55889,3,1), -(56095,3,0), -(56140,3,0), -(56386,3,0), -(56389,3,0), -(56578,3,0), -(56747,3,0), -(56765,3,0), -(57586,3,0), -(57800,3,0), -(57824,3,0), -(57835,3,0), -(58766,3,0), -(58825,3,0), -(59008,3,0), -(59462,3,0), -(59464,3,0), -(59564,3,0), -(59629,3,0), -(59694,3,0), -(60639,3,0), -(61126,3,0), -(61224,3,0), -(61699,3,0), -(62000,3,0), -(62056,3,0), -(62385,3,0), -(62387,3,0), -(62399,3,0), -(62565,3,0), -(62709,3,0), -(62973,3,0), -(62991,3,0), -(63019,3,0), -(63122,3,1), -(63292,3,0), -(63294,3,0), -(63295,3,0), -(63317,3,0), -(63414,3,0), -(63528,3,0), -(63766,3,0), -(63983,3,0), -(63985,3,0), -(64021,3,0), -(65044,3,0), -(65045,3,0), -(65101,3,0), -(65585,3,0), -(65586,3,0), -(65690,3,0), -(66129,3,0), -(66170,3,0), -(66598,3,0), -(67398,3,0), -(68378,3,0), -(68902,3,0), -(69007,3,0), -(69095,3,0), -(69096,3,0), -(69708,3,0), -(69783,3,0), -(69797,3,0), -(69799,3,0), -(69802,3,0), -(69985,3,0), -(70028,3,0), -(70037,3,0), -(70194,3,0), -(70521,3,0), -(70564,3,0), -(70590,3,0), -(70997,3,0), -(70998,3,0), -(70999,3,0), -(71278,3,1), -(71621,3,0), -(71704,3,0), -(72155,3,1), -(72162,3,1), -(72274,3,1), -(72297,3,1), -(72460,3,1), -(72548,3,1), -(72549,3,1), -(72550,3,1), -(72619,3,1), -(72620,3,1), -(72679,3,0), -(72771,3,0), -(72850,3,0), -(72851,3,0), -(72852,3,0), -(74318,3,0), -(74319,3,0), -(74320,3,0), -(74472,3,0), -(75509,3,0), -(75553,3,1), -(75766,3,1), -(34012,3,0), -(74271,4,0), -(74270,4,0), -(72096,4,1), -(72034,4,1), -(71615,4,0), -(70827,4,0), -(69425,4,0), -(69164,4,0), -(69162,4,0), -(68981,4,0), -(68788,4,1), -(67816,4,0), -(67796,4,0), -(65370,4,0), -(65333,4,0), -(64626,4,0), -(62826,4,0), -(62489,4,0), -(62466,4,0), -(62457,4,0), -(62345,4,0), -(62308,4,0), -(60206,4,0), -(58185,4,0), -(55896,4,0), -(55349,4,0), -(54109,4,0), -(54107,4,0), -(51678,4,0), -(50652,4,0), -(49556,4,0), -(48610,4,0), -(48277,4,0), -(48224,4,0), -(47674,4,0), -(47109,4,0), -(45922,4,0), -(44969,4,0), -(44737,4,0), -(44687,4,0), -(44626,4,0), -(44233,4,0), -(40647,4,0), -(40259,4,0), -(39246,4,0), -(36904,4,0), -(36460,4,0), -(36374,4,0), -(30532,4,0), -(28995,4,0), -(10451,4,0), -(9735,4,0), -(8900,4,0), -(8899,4,0), -(8898,4,0), -(8202,4,0), -(74272,4,0), -(69767,5,0), -(65590,5,0), -(62386,5,0), -(55588,5,0), -(54713,5,0), -(49464,5,0), -(49460,5,0), -(49346,5,0), -(47310,5,1), -(45676,5,0), -(44217,5,0), -(43977,5,0), -(41962,5,0), -(40789,5,0), -(40503,5,0), -(38729,5,0), -(38312,5,0), -(38106,5,0), -(38105,5,0), -(38104,5,0), -(38103,5,0), -(38102,5,0), -(38101,5,0), -(38100,5,0), -(38099,5,0), -(37206,5,0), -(37205,5,0), -(37204,5,0), -(36817,5,0), -(34630,5,0), -(21866,5,0), -(21794,5,0), -(19832,5,0), -(19250,5,0), -(8913,5,0), -(67308,6,0), -(67307,6,0), -(67306,6,0), -(67305,6,0), -(67304,6,0), -(67303,6,0), -(65876,6,0), -(65875,6,0), -(63041,6,0), -(62560,6,0), -(59099,6,1), -(44608,6,0), -(43702,6,0), -(43080,6,0), -(43056,6,0), -(40902,6,0), -(40657,6,0), -(28803,6,1), -(16054,6,0), -(8712,6,0), -(75863,7,1), -(75448,7,1), -(74412,7,1), -(74323,7,0), -(74322,7,0), -(74321,7,0), -(73028,7,0), -(72622,7,1), -(72621,7,1), -(72459,7,1), -(72273,7,0), -(72272,7,0), -(71618,7,0), -(71614,7,0), -(71279,7,1), -(70982,7,0), -(70981,7,0), -(70952,7,0), -(69540,7,0), -(67751,7,0), -(66905,7,0), -(66667,7,0), -(65126,7,0), -(64218,7,0), -(63059,7,0), -(62942,7,0), -(62705,7,0), -(61920,7,0), -(61715,7,0), -(61714,7,0), -(61632,7,0), -(60532,7,0), -(60430,7,0), -(59474,7,0), -(59465,7,0), -(57409,7,0), -(57405,7,0), -(57056,7,1), -(56694,7,0), -(56454,7,0), -(54160,7,0), -(53605,7,0), -(52319,7,0), -(51719,7,0), -(50747,7,0), -(50646,7,0), -(50645,7,0), -(50627,7,0), -(50218,7,0), -(49889,7,0), -(48742,7,0), -(48552,7,0), -(46158,7,0), -(42287,7,0), -(42265,7,1), -(42079,7,0), -(42004,7,1), -(41284,7,0), -(41113,7,0), -(41112,7,0), -(41111,7,0), -(41110,7,0), -(41071,7,0), -(41064,7,1), -(40931,7,0), -(40929,7,0), -(40905,7,0), -(40900,7,0), -(40851,7,0), -(40370,7,0), -(40172,7,0), -(40171,7,0), -(40170,7,0), -(40169,7,0), -(40075,7,1), -(39698,7,0), -(39686,7,0), -(39218,7,0), -(38920,7,0), -(38774,7,0), -(38484,7,0), -(38449,7,0), -(38371,7,0), -(37076,7,0), -(35957,7,1), -(35754,7,0), -(35289,7,0), -(34350,7,0), -(34187,7,0), -(31625,7,0), -(31624,7,0), -(31617,7,0), -(30939,7,1), -(30659,7,0), -(30657,7,0), -(30531,7,0), -(30098,7,0), -(28681,7,1), -(25790,7,0), -(25029,7,0), -(23015,7,0), -(22710,7,0), -(20553,7,0), -(10732,7,0), -(10348,7,0), -(7082,7,0), -(5628,7,0), -(804,7,0), -(802,7,0), -(54069,1,0), -(56251,1,0), -(58630,1,0); - --- remove redundant entries -DELETE FROM `conditions` WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 1 AND `ConditionValue2` = 0 AND `SourceEntry` IN (SELECT `id` FROM `temp_convert_spells` WHERE onlyPlayers); - --- set source group if available in db -UPDATE `conditions` SET `SourceGroup` = `ConditionValue3`, `ConditionValue3` = 0 WHERE `ConditionTypeOrReference` = 18; - --- set source group in case of old default (not set) source group -UPDATE `conditions` SET `SourceGroup` = (SELECT `effMask` FROM `temp_convert_spells` WHERE `id` = `SourceEntry`) WHERE `SourceGroup` = 0 AND `ConditionTypeOrReference` = 18; - -CREATE TABLE `temp_cond_vals` -( - `sourceGroup` INT(11), - `sourceEntry` INT(11), - `conditionValue1` INT(11), - `conditionValue2` INT(11), - `elseGroup` INT(11) AUTO_INCREMENT, - PRIMARY KEY (`sourceGroup`, `sourceEntry`, `elseGroup`) -) ENGINE=MYISAM; - -INSERT INTO `temp_cond_vals` (`sourceGroup`, `sourceEntry`, `conditionValue1`, `conditionValue2`) SELECT `SourceGroup`, `SourceEntry`, `ConditionValue1`, `ConditionValue2` FROM `conditions` WHERE `ConditionTypeOrReference` = 18; - --- set correct else group -UPDATE `conditions` SET `ElseGroup` = (SELECT `elseGroup` FROM `temp_cond_vals` WHERE `sourceGroup` = `conditions`.`SourceGroup` AND `sourceEntry` = `conditions`.`SourceEntry` AND `conditionValue1` = `conditions`.`ConditionValue1` AND `conditionValue2` = `conditions`.`ConditionValue2`)-1 WHERE `ConditionTypeOrReference` = 18; - --- old condition type 3 (caster's minion) -INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`) -SELECT `SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, 33, 0, 1, 3 FROM `conditions` WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 3; - -UPDATE `conditions` SET `ConditionTypeOrReference` = 31 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 3; - --- old condition type 2 (dead creature) -INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `NegativeCondition`) -SELECT `SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, 36, 0, 0, 0, 1 FROM `conditions` WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 2; - -UPDATE `conditions` SET `ConditionTypeOrReference` = 31, `ConditionValue1` = 3 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 2; - --- old condition type 1 (creature) -UPDATE `conditions` SET `ConditionTypeOrReference` = 31, `ConditionValue1` = 3 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 1 AND `ConditionValue2`; - --- old condition type 1 (player) -UPDATE `conditions` SET `ConditionTypeOrReference` = 32, `ConditionValue1` = 0x90 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 1 AND NOT `ConditionValue2`; - --- old condition type 0 (gameobject) -UPDATE `conditions` SET `ConditionTypeOrReference` = 31, `ConditionValue1` = 5 WHERE `ConditionTypeOrReference` = 18 AND `ConditionValue1` = 0; - -DROP TABLE `temp_convert_spells`; -DROP TABLE `temp_cond_vals`; \ No newline at end of file diff --git a/sql/updates/world/2012_02_21_02_world_creature_loot_template.sql b/sql/updates/world/2012_02_21_02_world_creature_loot_template.sql deleted file mode 100644 index 6c6af7ed2a3..00000000000 --- a/sql/updates/world/2012_02_21_02_world_creature_loot_template.sql +++ /dev/null @@ -1,11 +0,0 @@ -UPDATE `creature_template` SET `lootid`=`entry` WHERE `entry` IN (38032,37917,38016,38023,37214,38030,38006,37984); -DELETE FROM `creature_loot_template` WHERE `entry`IN (38032,37917,38016,38023,37214,38030,38006,37984); -INSERT INTO `creature_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `lootmode`, `groupid`, `mincountOrRef`, `maxcount`) VALUES -(38032,1,100,1,0,-45009,1), -- Crown Sprayer -(37917,1,100,1,0,-45009,1), -- Crown Thug -(38016,1,100,1,0,-45009,1), -- Crown Agent -(38023,1,100,1,0,-45009,1), -- Crown Sprinkler -(37214,1,100,1,0,-45009,1), -- Crown Lackey -(38030,1,100,1,0,-45009,1), -- Crown Underling -(38006,1,100,1,0,-45009,1), -- Crown Hoodlum (level 1??) -(37984,1,100,1,0,-45009,1); -- Crown Duster (level 1??) diff --git a/sql/updates/world/2012_02_21_03_world_creature_loot_template.sql b/sql/updates/world/2012_02_21_03_world_creature_loot_template.sql deleted file mode 100644 index d7d043cbda9..00000000000 --- a/sql/updates/world/2012_02_21_03_world_creature_loot_template.sql +++ /dev/null @@ -1,26 +0,0 @@ --- Razormane Hunter Warrior's Boots 32% to 3.2% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=3.2996 WHERE `entry`=3265 AND `item`=2967; --- Razormane Hunter Hunting Cloak 11% to 1.1% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=1.1855 WHERE `entry`=3265 AND `item`=4689; --- Razormane Defender Pioneer Buckler 87% to 0.8% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.8789 WHERE `entry`=3266 AND `item`=7109; --- Razormane Defender Spellbinder Belt 77% to 0.7% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7717 WHERE `entry`=3266 AND `item`=4684; --- Razormane Geomancer Simple Shoes 77% to 0.7% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7791 WHERE `entry`=3269 AND `item`=9743; --- Razormane Geomancer Veteran Bracers 73% to 0.7% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7364 WHERE `entry`=3269 AND `item`=3213; --- Venture Co. Supervisor Burnt Leather Belt 85% to 0.8% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.8511 WHERE `entry`=2979 AND `item`=4666; --- Venture Co. Supervisor Warrior's Gloves 74% to 0.7% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7433 WHERE `entry`=2979 AND `item`=2968; --- Venture Co. Supervisor Pioneer Bracers 55% to 0.5% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.5593 WHERE `entry`=2979 AND `item`=6519; --- Venture Co. Supervisor Journeyman's Gloves 43% to 0.4% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.4348 WHERE `entry`=2979 AND `item`=2960; --- Venture Co. Worker Warrior's Bracers 72% to 0.7% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.7226 WHERE `entry`=2978 AND `item`=3214; --- Venture Co. Worker Fine Scimitar 64% to 0.6% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.6492 WHERE `entry`=2978 AND `item`=4560; --- Venture Co. Worker Warrior's Girdle 24% to 0.2% -UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=0.2458 WHERE `entry`=2978 AND `item`=4659; diff --git a/sql/updates/world/2012_02_21_04_world_creature_loot_template.sql b/sql/updates/world/2012_02_21_04_world_creature_loot_template.sql deleted file mode 100644 index 3deedbf0b0d..00000000000 --- a/sql/updates/world/2012_02_21_04_world_creature_loot_template.sql +++ /dev/null @@ -1,16 +0,0 @@ -SET @ENTRY := 30409; -- Apprentice Osterkilgr -DELETE FROM `creature_loot_template` WHERE entry=@ENTRY; -INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES --- Quest related Items -(@ENTRY,43089,-100,1,0,1,1), -- Vrykul Bones -(@ENTRY,42772,-100,1,0,1,1), -- Dr Terrible's "Building a Better Flesh Giant" -(@ENTRY,42422,-50,1,0,1,1), -- Jotunheim Cage Key --- Other random stuff -(@ENTRY,33470,20,1,0,1,4), -- Frostweave Cloth -(@ENTRY,43851,20,1,0,1,1), -- Fur Clothing Scraps -(@ENTRY,43852,20,1,0,1,1), -- Thick Fur Clothing Scraps --- References for world drops -(@ENTRY,1,10,1,0,-35063,1), -- Northrend Grey Items -(@ENTRY,2,5,1,0,-35066,1), -- Northrend Green Items --- hatebook -(@ENTRY,45912,0.1,1,0,1,1); -- Book Glyph of Mastery (honestly screw that thing) diff --git a/sql/updates/world/2012_02_21_05_world_Gossip_SAI.sql b/sql/updates/world/2012_02_21_05_world_Gossip_SAI.sql deleted file mode 100644 index 1bdccae5c39..00000000000 --- a/sql/updates/world/2012_02_21_05_world_Gossip_SAI.sql +++ /dev/null @@ -1,39 +0,0 @@ --- SAI for Lothos Riftwaker -SET @ENTRY=14387; -UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; -DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES -(@ENTRY,0,0,1,62,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Lothos Riftwaker - On Gossip Option select - close gossip'), -(@ENTRY,0,1,0,61,0,100,0,5750,0,0,0,62,409,0,0,0,0,0,7,0,0,0,1096,-467,-104.6,3.64,'Lothos Riftwaker - On Gossip Option select - teleport player'); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (5750); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(5750,0,0,'Teleport me to the Molten Core, Lothos.',1,1,0,0,0,0,''); -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (5750); -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(15,5750,0,0,0,8,7848,0,0,0,0,'','Show gossip option if player has quest 7848 completed'); - --- SAI for Zamael Lunthistle -SET @ENTRY=8436; -UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; -DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES -(@ENTRY,0,0,1,62,0,100,0,1285,0,0,0,26,3377,0,0,0,0,0,7,0,0,0,0,0,0,0,'Zamael Lunthistle - On Gossip Option select - quest credit'), -(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Zamael Lunthistle - On Gossip Option select - close gossip'); - -DELETE FROM `gossip_menu` WHERE `entry`=1285 AND `text_id`=1920; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1285,1920); -DELETE FROM `gossip_menu` WHERE `entry`=1286 AND `text_id`=1922; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1286,1922); -DELETE FROM `gossip_menu` WHERE `entry`=1287 AND `text_id`=1921; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1287,1921); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1285,1286,1287); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(1285,0,0,'I wish to hear your tale.',1,1,1287,0,0,0,''), -(1286,0,0,'Let me think about it, Zamael.',1,1,1285,0,0,0,''), -(1287,0,0,'Please continue, Zamael.',1,1,1286,0,0,0,''); - -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (1285); -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(15,1285,0,0,0,9,3377,0,0,0,0,'','Show gossip option if player has quest 3377 but not complete'); diff --git a/sql/updates/world/2012_02_21_06_world_Gossip.sql b/sql/updates/world/2012_02_21_06_world_Gossip.sql deleted file mode 100644 index a59d330c6a3..00000000000 --- a/sql/updates/world/2012_02_21_06_world_Gossip.sql +++ /dev/null @@ -1,184 +0,0 @@ --- Gossip Update from Pitcrawler --- Creature Gossip_menu_id Update from sniff -UPDATE `creature_template` SET `gossip_menu_id`=7692 WHERE `entry`=18424; -UPDATE `creature_template` SET `gossip_menu_id`=9033 WHERE `entry`=24838; -UPDATE `creature_template` SET `gossip_menu_id`=9038 WHERE `entry`=24833; -UPDATE `creature_template` SET `gossip_menu_id`=9066 WHERE `entry`=25011; -UPDATE `creature_template` SET `gossip_menu_id`=9067 WHERE `entry`=25015; -UPDATE `creature_template` SET `gossip_menu_id`=9068 WHERE `entry`=25009; -UPDATE `creature_template` SET `gossip_menu_id`=9069 WHERE `entry`=25017; -UPDATE `creature_template` SET `gossip_menu_id`=9070 WHERE `entry`=25018; -UPDATE `creature_template` SET `gossip_menu_id`=9071 WHERE `entry`=25016; -UPDATE `creature_template` SET `gossip_menu_id`=9072 WHERE `entry` IN (25013,25014); -UPDATE `creature_template` SET `gossip_menu_id`=9091 WHERE `entry`=25076; -UPDATE `creature_template` SET `gossip_menu_id`=9107 WHERE `entry`=24929; -UPDATE `creature_template` SET `gossip_menu_id`=9109 WHERE `entry`=24927; -UPDATE `creature_template` SET `gossip_menu_id`=9110 WHERE `entry`=24924; -UPDATE `creature_template` SET `gossip_menu_id`=9116 WHERE `entry`=25105; -UPDATE `creature_template` SET `gossip_menu_id`=9117 WHERE `entry`=25100; -UPDATE `creature_template` SET `gossip_menu_id`=9118 WHERE `entry`=25104; -UPDATE `creature_template` SET `gossip_menu_id`=9120 WHERE `entry`=25107; -UPDATE `creature_template` SET `gossip_menu_id`=9121 WHERE `entry` IN (25101,25102,25103); -UPDATE `creature_template` SET `gossip_menu_id`=9122 WHERE `entry`=25106; -UPDATE `creature_template` SET `gossip_menu_id`=9349 WHERE `entry`=26539; -UPDATE `creature_template` SET `gossip_menu_id`=10120 WHERE `entry` IN (31704,31705,31706,31720,31723,31724); -UPDATE `creature_template` SET `gossip_menu_id`=10259 WHERE `entry`=31716; - --- Gossip Menu insert from sniff -DELETE FROM `gossip_menu` WHERE `entry`=7692 AND `text_id`=9383; -DELETE FROM `gossip_menu` WHERE `entry`=7696 AND `text_id`=9444; -DELETE FROM `gossip_menu` WHERE `entry`=7704 AND `text_id`=9425; -DELETE FROM `gossip_menu` WHERE `entry`=7726 AND `text_id`=9437; -DELETE FROM `gossip_menu` WHERE `entry`=7727 AND `text_id`=9438; -DELETE FROM `gossip_menu` WHERE `entry`=7728 AND `text_id`=9439; -DELETE FROM `gossip_menu` WHERE `entry`=9033 AND `text_id`=12211; -DELETE FROM `gossip_menu` WHERE `entry`=9038 AND `text_id`=12216; -DELETE FROM `gossip_menu` WHERE `entry`=9040 AND `text_id`=12217; -DELETE FROM `gossip_menu` WHERE `entry`=9041 AND `text_id`=12218; -DELETE FROM `gossip_menu` WHERE `entry`=9042 AND `text_id`=12219; -DELETE FROM `gossip_menu` WHERE `entry`=9043 AND `text_id`=12220; -DELETE FROM `gossip_menu` WHERE `entry`=9066 AND `text_id`=12262; -DELETE FROM `gossip_menu` WHERE `entry`=9067 AND `text_id`=12263; -DELETE FROM `gossip_menu` WHERE `entry`=9068 AND `text_id`=12264; -DELETE FROM `gossip_menu` WHERE `entry`=9069 AND `text_id`=12266; -DELETE FROM `gossip_menu` WHERE `entry`=9070 AND `text_id`=12267; -DELETE FROM `gossip_menu` WHERE `entry`=9091 AND `text_id`=12292; -DELETE FROM `gossip_menu` WHERE `entry`=9109 AND `text_id`=12317; -DELETE FROM `gossip_menu` WHERE `entry`=9110 AND `text_id`=12318; -DELETE FROM `gossip_menu` WHERE `entry`=9116 AND `text_id`=12327; -DELETE FROM `gossip_menu` WHERE `entry`=9117 AND `text_id`=12328; -DELETE FROM `gossip_menu` WHERE `entry`=9118 AND `text_id`=12329; -DELETE FROM `gossip_menu` WHERE `entry`=9120 AND `text_id`=12331; -DELETE FROM `gossip_menu` WHERE `entry`=9121 AND `text_id`=12332; -DELETE FROM `gossip_menu` WHERE `entry`=9122 AND `text_id`=12333; -DELETE FROM `gossip_menu` WHERE `entry`=9349 AND `text_id`=12649; -DELETE FROM `gossip_menu` WHERE `entry`=10120 AND `text_id`=14047; -DELETE FROM `gossip_menu` WHERE `entry`=10259 AND `text_id`=14248; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES -(7692,9383), -(7696,9444), -(7704,9425), -(7726,9437), -(7727,9438), -(7728,9439), -(9033,12211), -(9038,12216), -(9040,12217), -(9041,12218), -(9042,12219), -(9043,12220), -(9066,12262), -(9067,12263), -(9068,12264), -(9069,12266), -(9070,12267), -(9091,12292), -(9109,12317), -(9110,12318), -(9116,12327), -(9117,12328), -(9118,12329), -(9120,12331), -(9121,12332), -(9122,12333), -(9349,12649), -(10120,14047), -(10259,14248); - --- Insert npc_text from sniff -DELETE FROM `npc_text` WHERE `ID` IN (9437,9438,9439,12211,12266); -INSERT INTO `npc_text` (`ID`,`text0_0`,`text0_1`,`lang0`,`prob0`,`em0_0`,`em0_1`,`em0_2`,`em0_3`,`em0_4`,`em0_5`,`text1_0`,`text1_1`,`lang1`,`prob1`,`em1_0`,`em1_1`,`em1_2`,`em1_3`,`em1_4`,`em1_5`,`text2_0`,`text2_1`,`lang2`,`prob2`,`em2_0`,`em2_1`,`em2_2`,`em2_3`,`em2_4`,`em2_5`,`text3_0`,`text3_1`,`lang3`,`prob3`,`em3_0`,`em3_1`,`em3_2`,`em3_3`,`em3_4`,`em3_5`,`text4_0`,`text4_1`,`lang4`,`prob4`,`em4_0`,`em4_1`,`em4_2`,`em4_3`,`em4_4`,`em4_5`,`text5_0`,`text5_1`,`lang5`,`prob5`,`em5_0`,`em5_1`,`em5_2`,`em5_3`,`em5_4`,`em5_5`,`text6_0`,`text6_1`,`lang6`,`prob6`,`em6_0`,`em6_1`,`em6_2`,`em6_3`,`em6_4`,`em6_5`,`text7_0`,`text7_1`,`lang7`,`prob7`,`em7_0`,`em7_1`,`em7_2`,`em7_3`,`em7_4`,`em7_5`,`WDBVerified`) VALUES -(9437,'$B$BZangarmarsh... too close to truth.$B$B$B$BIs he still watching!?','',0,1,1000,1,1000,6,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), -(9438,'What''s that? Zangarmarsh? Why would I want to go there?$B$B$B$BYes, Zangarmarsh... we... the druids there are getting close to figuring out why the water level is dropping. It''s destroying everything!$B$B$B$BDestroyed us all! Bright light! BOOM!!','',0,1,0,6,1000,1,1000,5,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), -(9439,'The Firewing blood elves... for some reason they want to stop us.$B$B$B$BThey... they sent one of the Broken as ... as an emissary.... But he had a bomb!$B$BThey died, they all died! They tried to run away! The lucky ones didn''t even know.$B$BI must have been at the edge of the blast. It was horr...IT''S WATCHING US AGAIN!$B$B','',0,1,0,18,1000,18,1000,5,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), -(12211,'Fine day fer sailin'', innit?','',7,1,0,1,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340), -(12266,'','I''m almost jealous of our Mr. Wavesinger. Why, he may well be prettier than me!',7,1,0,1,3,11,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,12340); - --- Creature Gossip_menu_option insert from sniff -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7692,7726,7727) AND `id`=0; -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9038,9040,9041,9042,9043) AND `id` IN (0,1,2); -DELETE FROM `gossip_menu_option` WHERE `menu_id`=9038 AND `id`=3; -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(7692,0,0,'Treelos, I know that the truth is somewhere inside you. Tell me what it is.',1,1,7726,0,0,0,''), -(7726,0,0,'Keep it together man! What about Zangarmarsh?',1,1,7727,0,0,0,''), -(7727,0,0,'I don''t have time for this! Warden, what happened?!',1,1,7728,0,0,0,''), -(9038,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), -(9038,1,0,'Food & Drink',1,1,9041,0,0,0,''), -(9038,2,0,'Goods & Gear',1,1,9042,0,0,0,''), -(9038,3,0,'"Stash?"',1,1,9043,0,0,0,''), -(9040,0,0,'Food & Drink',1,1,9041,0,0,0,''), -(9040,1,0,'Goods & Gear',1,1,9042,0,0,0,''), -(9040,2,0,'"Stash?',1,1,9043,0,0,0,''), -(9041,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), -(9041,1,0,'Goods & Gear',1,1,9042,0,0,0,''), -(9041,2,0,'"Stash?',1,1,9043,0,0,0,''), -(9042,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), -(9042,1,0,'Food & Drink',1,1,9041,0,0,0,''), -(9042,2,0,'"Stash?',1,1,9043,0,0,0,''), -(9043,0,0,'The Lady Mehley',1,1,9040,0,0,0,''), -(9043,1,0,'Food & Drink',1,1,9041,0,0,0,''), -(9043,2,0,'Goods & Gear',1,1,9042,0,0,0,''); - --- Conditions -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7704 AND `SourceEntry`=9425; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7696 AND `SourceEntry`=9444; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (7704,7692); -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(14,7696,9444,0,0,8,10005,0,0,0,0,'','Show different gossip if player has rewarded quest 10005'), -(14,7696,9444,0,1,8,10006,0,0,0,0,'','Show different gossip if player has rewarded quest 10006'), -(14,7704,9425,0,0,8,9978,0,0,0,0,'','Show different gossip if player has rewarded quest 9978'), -(15,7704,0,0,0,9,9978,0,0,0,0,'','Show gossip option if player has quest 9978 but not complete'), -(15,7692,0,0,0,8,10006,0,0,0,0,'','Show gossip option if player has rewarded quest 10006'), -(15,7692,0,0,1,8,10005,0,0,0,0,'','Show gossip option if player has rewarded quest 10005'); - --- Gossip Update from Malcrom -DELETE FROM `gossip_menu` WHERE `entry` IN (1042,1043,1044,1045,1046,1047,1048,1049,1050,1052,1053); -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES -(1042,1635),(1043,1640),(1044,1644),(1045,1643),(1045,1753), -(1046,1648),(1047,1754),(1048,1650),(1049,1755), -(1050,1651),(1050,1756),(1052,1652),(1053,1653); -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1045,1047,1049,1050); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(1045,0,0,'Acquire Higher Level Access Card',1,1,0,0,0,0,''), -(1047,0,0,'Acquire Higher Level Access Card',1,1,0,0,0,0,''), -(1049,0,0,'Acquire Higher Level Access Card',1,1,0,0,0,0,''), -(1050,0,0,'Acquire high level data card.',1,1,0,0,0,0,''); - -DELETE FROM `gossip_menu` WHERE `entry`=1080 AND `text_id`=1693; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1080,1693); -DELETE FROM `gossip_menu` WHERE `entry`=1100 AND `text_id`=1713; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1100,1713); -DELETE FROM `gossip_menu` WHERE `entry`=1143 AND `text_id`=1759; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1143,1759); -DELETE FROM `gossip_menu` WHERE `entry`=1161 AND `text_id`=1793; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1161,1793); -DELETE FROM `gossip_menu` WHERE `entry`=1162 AND `text_id`=1794; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1162,1794); -DELETE FROM `gossip_menu` WHERE `entry`=1201 AND `text_id`=1833; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1201,1833); -DELETE FROM `gossip_menu` WHERE `entry`=1281 AND `text_id`=1916; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1281,1916); -DELETE FROM `gossip_menu` WHERE `entry`=1282 AND `text_id`=1918; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1282,1918); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1282); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(1282,0,0,'Touch the Suntara stone and call forth Lathoric the Black and his guardian, Obsidion.',1,1,0,0,0,0,''); - -DELETE FROM `gossip_menu` WHERE `entry`=1301 AND `text_id`=1933; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1301,1933); -DELETE FROM `gossip_menu` WHERE `entry`=1301 AND `text_id`=1934; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1301,1934); - -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1301); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(1301,0,0,'I wish to browse your wares.',3,128,0,0,0,0,''); - -DELETE FROM `gossip_menu` WHERE `entry`=1302 AND `text_id`=1935; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1302,1935); -DELETE FROM `gossip_menu` WHERE `entry`=1321 AND `text_id`=1955; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1321,1955); -DELETE FROM `gossip_menu` WHERE `entry`=1322 AND `text_id`=1954; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1322,1954); -DELETE FROM `gossip_menu` WHERE `entry`=1362 AND `text_id`=1994; -INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1362,1994); diff --git a/sql/updates/world/2012_02_22_00_world_SAI.sql b/sql/updates/world/2012_02_22_00_world_SAI.sql deleted file mode 100644 index 2e392f3a45f..00000000000 --- a/sql/updates/world/2012_02_22_00_world_SAI.sql +++ /dev/null @@ -1,39 +0,0 @@ --- SAI for Kalaran Windblade -SET @ENTRY=8479; -UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@ENTRY; -DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY AND `source_type`=0); -DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY*100 AND `source_type`=9); -INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES --- AI -(@ENTRY,0,0,1,62,0,100,0,1321,0,0,0,26,3441,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - quest credit'), -(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - close gossip'), -(@ENTRY,0,2,3,62,0,100,0,1323,2,0,0,11,19797,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - cast 19797'), -(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - close gossip'), -(@ENTRY,0,4,0,62,0,100,0,1323,3,0,0,80,@ENTRY*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - On Gossip Option select - run script'), --- Script -(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - script - close gossip'), -(@ENTRY*100,9,1,0,0,0,100,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - remove npc flags'), -(@ENTRY*100,9,2,0,0,0,100,0,1000,1000,1000,1000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - say 0'), -(@ENTRY*100,9,3,0,0,0,100,0,1000,1000,1000,1000,17,69,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - emotestate usestanding'), -(@ENTRY*100,9,4,0,0,0,100,0,60000,60000,60000,60000,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - emotestate none'), -(@ENTRY*100,9,5,0,0,0,100,0,1000,1000,1000,1000,26,3453,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kalaran Windblade - script - give quest credit'), -(@ENTRY*100,9,6,0,0,0,100,0,1000,1000,1000,1000,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kalaran Windblade - script - add npc flags'); --- npc text -DELETE FROM `creature_text` WHERE `entry`=@ENTRY; -INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES -(@ENTRY,0,0,'Please be patient, $N',12,0,100,0,0,0,'Kalaran Windblade'); --- Gossip options -DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1321,1322,1323); -INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES -(1321,0,0,'Let me confer with my colleagues.',1,1,0,0,0,0,''), -(1322,0,0,'Continue please.',1,1,1321,0,0,0,''), -(1323,0,0,'Tell me what drives this vengeance?',1,1,1322,0,0,0,''), -(1323,2,0,'Kalaran, I have misplaced my torch. I require another.',1,1,0,0,0,0,''), -(1323,3,0,'Kalaran, please enchant the torch.',1,1,0,0,0,0,''); --- Gossip option conditions -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (1323); -INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES -(15,1323,0,0,0,9,3441,0,0,0,0,'','Show gossip option if player has quest 3441 but not complete'), -(15,1323,2,0,0,8,3454,0,0,0,0,'','Show gossip option if player has quest 3441 complete'), -(15,1323,2,0,0,2,10515,0,1,0,0,'','Show gossip option if player does not have item 10515'), -(15,1323,3,0,0,9,3453,0,0,0,0,'','Show gossip option if player has quest 3453 but not complete'); diff --git a/sql/updates/world/2012_02_22_01_world_say_text.sql b/sql/updates/world/2012_02_22_01_world_say_text.sql deleted file mode 100644 index 035962e11c3..00000000000 --- a/sql/updates/world/2012_02_22_01_world_say_text.sql +++ /dev/null @@ -1,34 +0,0 @@ --- Invisible Stalker text for Wintergrasp from sniff -DELETE FROM `creature_text` WHERE `entry`=15214; -INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES -(15214,0,0, 'Let the battle begin!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,1,0, 'The Broken Temple siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,2,0, 'The Broken Temple siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,3,0, 'The Broken Temple siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,4,0, 'The Broken Temple siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,5,0, 'The Sunken Ring siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,6,0, 'The Sunken Ring siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,7,0, 'The Sunken Ring siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,8,0, 'The Sunken Ring siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,9,0, 'The Eastspark siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,10,0, 'The Eastspark siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,11,0, 'The Eastspark siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,12,0, 'The Eastspark siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,13,0, 'The Westspark siege workshop has been attacked by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,14,0, 'The Westspark siege workshop has been captured by the Horde!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,15,0, 'The Westspark siege workshop has been attacked by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,16,0, 'The Westspark siege workshop has been captured by the Alliance!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,17,0, 'The north-western keep tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,18,0, 'The north-western keep tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,19,0, 'The south-eastern keep tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,20,0, 'The south-eastern keep tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,21,0, 'The western tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,22,0, 'The western tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,23,0, 'The southern tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,24,0, 'The southern tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,25,0, 'The eastern tower has been damaged!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,26,0, 'The eastern tower has been destroyed!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,27,0, 'The Horde has defended Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,28,0, 'The Horde has captured Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,29,0, 'The Alliance has defended Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'), -(15214,30,0, 'The Alliance has captured Wintergrasp Fortress!',41,0,100,0,0,0, 'Invisible Stalker'); \ No newline at end of file diff --git a/sql/updates/world/2012_02_22_02_world_misc.sql b/sql/updates/world/2012_02_22_02_world_misc.sql deleted file mode 100644 index 33bec2a9b78..00000000000 --- a/sql/updates/world/2012_02_22_02_world_misc.sql +++ /dev/null @@ -1,57 +0,0 @@ --- Mounting Hodir's Helm (12987) - --- cleanup after Discovered --- clean all related to npc Hodir's Helm KC Bunny -DELETE FROM `smart_scripts` WHERE `entryorguid`=30210 AND `source_type`=0; -DELETE FROM `creature` WHERE `id`=30210; -DELETE FROM `creature_text` WHERE `entry`=30210; - -SET @HELM := 192080; -- Hodir's Helm -SET @TEMP := 300230; -- TEMP Northern Ice Spike -SET @BUNNY_TARGET := 30215; -- Ice Spike Target Bunny -SET @GUID_GO := 270; -- set by TDB -SET @GUID_NPC := 40514; -- set by TDB -SET @SPELL_READ_PRONOUNCEMENT := 56278; -SET @QUEST := 12987; -SET @AREA := 4438; -- Dun Niffelem -SET @SPELL_AREA := 56305; -- See Quest Invisibility 1 (Ice Spike Bunny) -SET @QUEST := 13006; -- Polishing the Helm - -UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33554432|256,`InhabitType`=7,`flags_extra`=`flags_extra`|128 WHERE `entry`=@BUNNY_TARGET; - -UPDATE `gameobject_template` SET `flags`=`flags`|32 WHERE `entry`=@HELM; -UPDATE `gameobject` SET `phaseMask`=4 WHERE `id`=@TEMP; - -DELETE FROM `gameobject` WHERE `guid`=@GUID_GO; -INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES -(@GUID_GO,@HELM,571,1,4,7390.143,-2725.382,874.2561,-3.089183,0,0,-0.9996567,0.02620165,600,255,1); - -DELETE FROM `creature` WHERE `guid` BETWEEN @GUID_NPC+0 AND @GUID_NPC+1; -INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES -(@GUID_NPC+0,@BUNNY_TARGET,571,1,4,0,0,7386.51,-2726.489,872.5089,5.88176,300,0,0,4979,0,0,0,0,0), -(@GUID_NPC+1,@BUNNY_TARGET,571,1,4,0,0,7388.424,-2724.909,869.8643,0.5934119,300,0,0,4979,0,0,0,0,0); - -DELETE FROM `creature_template_addon` WHERE `entry`=@BUNNY_TARGET; -INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES -(@BUNNY_TARGET,0,0,65536,1,0, '61333 56304 61334'); -- Gigantic Helm Sparkle / Hodir's Helm Bunny: Invisibility / Extra Large Helm Sparkle - -DELETE FROM `spell_script_names` WHERE `spell_id`=@SPELL_READ_PRONOUNCEMENT; -INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES -(@SPELL_READ_PRONOUNCEMENT, 'spell_q12987_read_pronouncement'); - -DELETE FROM `spell_area` WHERE `spell`=@SPELL_AREA; -INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_start_active`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`) VALUES -(@SPELL_AREA,@AREA,@QUEST,1,@QUEST,0,0,2,1); - --- relation for the daily quest that should be available after finishing Mounting Hodir's Helm - --- removing flag 4 or else player can't interract with Q giver -UPDATE `gameobject_template` SET `flags`=`flags`&~4 WHERE `entry`=@HELM; - -DELETE FROM `gameobject_questrelation` WHERE `id`=@HELM; -INSERT INTO `gameobject_questrelation` (`id`,`quest`) VALUES -(@HELM,@QUEST); - -DELETE FROM `gameobject_involvedrelation` WHERE `id`=@HELM; -INSERT INTO `gameobject_involvedrelation` (`id`,`quest`) VALUES -(@HELM,@QUEST); diff --git a/sql/updates/world/2012_02_22_03_world_conditions.sql b/sql/updates/world/2012_02_22_03_world_conditions.sql deleted file mode 100644 index 9c4d0cdec95..00000000000 --- a/sql/updates/world/2012_02_22_03_world_conditions.sql +++ /dev/null @@ -1,3 +0,0 @@ -UPDATE `conditions` SET `SourceTypeOrReferenceId`=13 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=1; -UPDATE `conditions` SET `ConditionValue2`=1 WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=1323 AND `SourceEntry`=2 AND `ConditionTypeOrReference`=2; -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=17465 AND `SourceEntry`=22554 AND `ConditionTypeOrReference`=7; diff --git a/sql/updates/world/2012_05_19_03_world_version.sql b/sql/updates/world/2012_05_19_03_world_version.sql new file mode 100644 index 00000000000..53c6821be69 --- /dev/null +++ b/sql/updates/world/2012_05_19_03_world_version.sql @@ -0,0 +1 @@ +UPDATE `version` SET `db_version`='TDB 335.11.47' LIMIT 1; diff --git a/sql/updates/world/2012_05_19_04_creature_loot_template.sql b/sql/updates/world/2012_05_19_04_creature_loot_template.sql new file mode 100644 index 00000000000..ae996e01956 --- /dev/null +++ b/sql/updates/world/2012_05_19_04_creature_loot_template.sql @@ -0,0 +1 @@ +DELETE FROM `creature_loot_template` WHERE `entry`=31813 AND `item`=36912; -- Saronite Ore diff --git a/sql/updates/world/2012_05_19_05_gameobject_loot_template.sql b/sql/updates/world/2012_05_19_05_gameobject_loot_template.sql new file mode 100644 index 00000000000..f95cb45efe4 --- /dev/null +++ b/sql/updates/world/2012_05_19_05_gameobject_loot_template.sql @@ -0,0 +1,93 @@ +-- Set Variables +SET @Gunship10N := 28057; -- Data1 for 201872 & 202177 +SET @Gunship10H := 28045; -- Data1 for 201873 & 202178 +SET @Gunship25N := 28072; -- Data1 for 201874 & 202179 +SET @Gunship25H := 28090; -- Data1 for 201875 & 202180 +SET @emblem := 49426; -- Emblem of Frost +SET @SfShard := 50274; -- Shadowfrost Shard +SET @PriSar := 49908; -- Primordial Saronite +-- Dug up the old references i created for UP34: +SET @Ref10J := 34329; +SET @Ref25J := 34251; +SET @RefJ10H := 34263; +SET @RefJ25H := 34275; +-- Gunship_Armory10N_reference +DELETE FROM `reference_loot_template` WHERE `entry` IN (@Ref10J,@Ref25J,@RefJ10H,@RefJ25H); +INSERT INTO `reference_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(@Ref10J,50791,0,1,1,1,1), -- Saronite Gargoyle Cloak +(@Ref10J,50795,0,1,1,1,1), -- Cord of Dark Suffering +(@Ref10J,50794,0,1,1,1,1), -- Neverending Winter +(@Ref10J,50787,0,1,1,1,1), -- Frost Giant's Cleaver +(@Ref10J,50793,0,1,1,1,1), -- Midnight Sun +(@Ref10J,50788,0,1,1,1,1), -- Bone Drake's Enameled Boots +(@Ref10J,50792,0,1,1,1,1), -- Pauldrons of Lost Hope +(@Ref10J,50340,0,1,1,1,1), -- Muradin's Spyglass +(@Ref10J,50797,0,1,1,1,1), -- Ice-Reinforced Vrykul Helm +(@Ref10J,50790,0,1,1,1,1), -- Abomination's Bloody Ring +(@Ref10J,50789,0,1,1,1,1), -- Icecrown Rampart Bracers +(@Ref10J,50796,0,1,1,1,1), -- Bracers of Pale Illumination +-- Gunship_Armory25N_reference +(@Ref25J,50011,0,1,1,1,1), -- Gunship Captain's Mittens +(@Ref25J,50002,0,1,1,1,1), -- Polar Bear Claw Bracers +(@Ref25J,50006,0,1,1,1,1), -- Corp'rethar Ceremonial Crown +(@Ref25J,50010,0,1,1,1,1), -- Waistband of Righteous Fury +(@Ref25J,50003,0,1,1,1,1), -- Boneguard Commander's Pauldrons +(@Ref25J,50000,0,1,1,1,1), -- Scourge Hunter's Vambraces +(@Ref25J,50359,0,1,1,1,1), -- Althor's Abacus +(@Ref25J,50352,0,1,1,1,1), -- Corpse Tongue Coin +(@Ref25J,49999,0,1,1,1,1), -- Skeleton Lord's Circle +(@Ref25J,50009,0,1,1,1,1), -- Boots of Unnatural Growth +(@Ref25J,50008,0,1,1,1,1), -- Ring of Rapid Ascent +(@Ref25J,49998,0,1,1,1,1), -- Shadowvault Slayer's Cloak +(@Ref25J,50005,0,1,1,1,1), -- Amulet of the Silent Eulogy +(@Ref25J,50411,0,1,1,1,1), -- Scourgeborne Waraxe +(@Ref25J,50001,0,1,1,1,1), -- Ikfirus's Sack of Wonder +-- Gunship_Armory10H_reference +(@RefJ10H,51912,0,1,1,1,1), -- Saronite Gargoyle Cloak (heroic) +(@RefJ10H,51908,0,1,1,1,1), -- Cord of Dark Suffering (heroic) +(@RefJ10H,51909,0,1,1,1,1), -- Neverending Winter (heroic) +(@RefJ10H,51916,0,1,1,1,1), -- Frost Giant's Cleaver (heroic) +(@RefJ10H,51910,0,1,1,1,1), -- Midnight Sun (heroic) +(@RefJ10H,51915,0,1,1,1,1), -- Bone Drake's Enameled Boots (heroic) +(@RefJ10H,51911,0,1,1,1,1), -- Pauldrons of Lost Hope (heroic) +(@RefJ10H,50345,0,1,1,1,1), -- Muradin's Spyglass (heroic) +(@RefJ10H,51906,0,1,1,1,1), -- Ice-Reinforced Vrykul Helm (heroic) +(@RefJ10H,51913,0,1,1,1,1), -- Abomination's Bloody Ring (heroic) +(@RefJ10H,51914,0,1,1,1,1), -- Icecrown Rampart Bracers (heroic) +(@RefJ10H,51907,0,1,1,1,1), -- Bracers of Pale Illumination (heroic) +-- Gunship_Armory25H_reference +(@RefJ25H,50663,0,1,1,1,1), -- Gunship Captain's Mittens (heroic) +(@RefJ25H,50659,0,1,1,1,1), -- Polar Bear Claw Bracers (heroic) +(@RefJ25H,50661,0,1,1,1,1), -- Corp'rethar Ceremonial Crown (heroic) +(@RefJ25H,50667,0,1,1,1,1), -- Waistband of Righteous Fury (heroic) +(@RefJ25H,50660,0,1,1,1,1), -- Boneguard Commander's Pauldrons (heroic) +(@RefJ25H,50655,0,1,1,1,1), -- Scourge Hunter's Vambraces (heroic) +(@RefJ25H,50366,0,1,1,1,1), -- Althor's Abacus (heroic) +(@RefJ25H,50349,0,1,1,1,1), -- Corpse Tongue Coin (heroic) +(@RefJ25H,50657,0,1,1,1,1), -- Skeleton Lord's Circle (heroic) +(@RefJ25H,50665,0,1,1,1,1), -- Boots of Unnatural Growth (heroic) +(@RefJ25H,50664,0,1,1,1,1), -- Ring of Rapid Ascent (heroic) +(@RefJ25H,50653,0,1,1,1,1), -- Shadowvault Slayer's Cloak (heroic) +(@RefJ25H,50658,0,1,1,1,1), -- Amulet of the Silent Eulogy (heroic) +(@RefJ25H,50654,0,1,1,1,1), -- Scourgeborne Waraxe (heroic) +(@RefJ25H,50656,0,1,1,1,1); -- Ikfirus's Sack of Wonder (heroic) +-- Bind the refs to the objects +DELETE FROM `gameobject_loot_template` WHERE `entry` IN (@Gunship10N,@Gunship10H,@Gunship25N,@Gunship25H); +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +-- Gunship10N +(@Gunship10N,@emblem,100,1,0,2,2), -- Gunship Armory 2xemblems 10N +(@Gunship10N,1,100,1,0,-@Ref10J,2), -- 2 from reference 10Normal +-- Gunship25N +(@Gunship25N,@emblem,100,1,0,2,2), -- Gunship Armory 2xemblems 25N +(@Gunship25N,1,100,1,0,-@Ref25J,2), -- 3 from reference 25Normal +(@Gunship25N,@SfShard,-35,1,0,1,1), -- Shadowfrost Shard @ 38% chance +(@Gunship25N,@PriSar,38,1,0,1,1), -- Primordial Saronite @ 10% chance +-- Gunship10H +(@Gunship10H,@emblem,100,1,0,2,2), -- Gunship Armory 2xemblems 10H +(@Gunship10H,1,100,1,0,-@RefJ10H,2), -- 2 from reference 10Heroic +(@Gunship10H,@PriSar,38,1,0,1,1), -- Primordial Saronite @ 38% chance +-- Gunship25H +(@Gunship25H,@emblem,100,1,0,2,2), -- Gunship Armory 2xemblems 25H +(@Gunship25H,1,100,1,0,-@RefJ25H,2), -- 3 from reference 25Heroic +(@Gunship25H,@SfShard,-75,1,0,1,1), -- Shadowfrost Shard @ 75% chance +(@Gunship25H,@PriSar,50,1,0,1,1); -- Primordial Saronite @ 50% chance diff --git a/sql/updates/world/2012_05_19_06_gameobject_loot_template.sql b/sql/updates/world/2012_05_19_06_gameobject_loot_template.sql new file mode 100644 index 00000000000..9b2dcbb9363 --- /dev/null +++ b/sql/updates/world/2012_05_19_06_gameobject_loot_template.sql @@ -0,0 +1,13 @@ +DELETE FROM `reference_loot_template` WHERE `entry`=34172; +DELETE FROM `creature_loot_template` WHERE `entry`=38013; +DELETE FROM `gameobject_loot_template` WHERE `entry`=28683; +INSERT INTO `gameobject_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES +(28683,35498,3,1,0,1,1), -- Formula: Enchant Weapon - Deathfrost +(28683,35557,28,1,0,1,2), -- Huge Snowball +(28683,35720,3,1,0,5,6), -- Lord of Frost's Private Label +(28683,35723,12,1,0,1,1), -- Shards of Ahune +(28683,54801,0,1,1,1,1), -- Icebound Cloak +(28683,54802,0,1,1,1,1), -- The Frost Lord's War Cloak +(28683,54803,0,1,1,1,1), -- The Frost Lord's Battle Shroud +(28683,54804,0,1,1,1,1), -- Shroud of Winter's Chill +(28683,54805,0,1,1,1,1); -- Cloak of the Frigid Winds diff --git a/sql/updates/world/2012_05_20_00_world_misc.sql b/sql/updates/world/2012_05_20_00_world_misc.sql new file mode 100644 index 00000000000..5b96f9881d6 --- /dev/null +++ b/sql/updates/world/2012_05_20_00_world_misc.sql @@ -0,0 +1,16 @@ +-- Update mod rep command name +UPDATE `command` SET + `name` = 'modify reputation', + `help` = 'Syntax: .modify reputation #repId (#repvalue | $rankname [#delta])\nSets the selected players reputation with faction #repId to #repvalue or to $reprank.\nIf the reputation rank name is provided, the resulting reputation will be the lowest reputation for that rank plus the delta amount, if specified.\nYou can use \'.pinfo rep\' to list all known reputation ids, or use \'.lookup faction $name\' to locate a specific faction id.' +WHERE `name` = 'modify rep'; + +-- Fix "2012-05-20 06:46:00 ERROR: SourceEntry 52264 in `condition` table, has incorrect SourceGroup 0 (spell effectMask) set , ignoring." +UPDATE `conditions` SET + `SourceGroup` = 1, + `SourceId` = 0 +WHERE + `SourceTypeOrReferenceId` = 13 AND + `SourceEntry` = 52264 AND + `ConditionTypeOrReference` = 29 AND + `ConditionValue1` = 28653 AND + `ConditionValue2` = 5; diff --git a/sql/updates/world/2012_05_20_01_world_spell_bonus_data.sql b/sql/updates/world/2012_05_20_01_world_spell_bonus_data.sql new file mode 100644 index 00000000000..7603f7dd938 --- /dev/null +++ b/sql/updates/world/2012_05_20_01_world_spell_bonus_data.sql @@ -0,0 +1,2 @@ +DELETE FROM `spell_bonus_data` WHERE `entry`=633; +INSERT INTO `spell_bonus_data` (`entry`,`comments`) VALUES (633,'Paladin - Lay on Hands'); diff --git a/sql/updates/world/2012_05_22_00_world_spell_proc_event.sql b/sql/updates/world/2012_05_22_00_world_spell_proc_event.sql new file mode 100644 index 00000000000..ba2ea83f643 --- /dev/null +++ b/sql/updates/world/2012_05_22_00_world_spell_proc_event.sql @@ -0,0 +1 @@ +UPDATE `spell_proc_event` SET `procFlags` = 332116 WHERE `entry` = 63611; diff --git a/sql/updates/world/2012_05_22_01_world_creature_loot_template.sql b/sql/updates/world/2012_05_22_01_world_creature_loot_template.sql new file mode 100644 index 00000000000..bcae5be9ae1 --- /dev/null +++ b/sql/updates/world/2012_05_22_01_world_creature_loot_template.sql @@ -0,0 +1,2 @@ +-- As of patch 3.1.0, the drop rate of Formula: Enchant Boots - Surefooted has been increased to Guaranteed (100%). +UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=100 WHERE `entry`=16472 and `item`=22545; diff --git a/sql/updates/world/2012_05_23_00_world_creature.sql b/sql/updates/world/2012_05_23_00_world_creature.sql new file mode 100644 index 00000000000..8a965b7fdfe --- /dev/null +++ b/sql/updates/world/2012_05_23_00_world_creature.sql @@ -0,0 +1,55 @@ +-- Chicken Spawns from sniff: +SET @Chicken := 28161; +SET @CGUID := 88570; +DELETE FROM `creature` WHERE `id`=@Chicken; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`MovementType`) VALUES +(@CGUID,@Chicken,571,1,1,5199.809,4704.83,-128.2989,1.70125,120,0,0), -- Chicken Escapee +(@CGUID+1,@Chicken,571,1,1,5201.715,4702.484,-127.8371,1.53589,120,0,0), -- Chicken Escapee +(@CGUID+2,@Chicken,571,1,1,5198.132,4702.78,-127.5534,1.797689,120,0,0), -- Chicken Escapee +(@CGUID+3,@Chicken,571,1,1,5198.32,4704.375,-127.9992,1.064651,120,0,0), -- Chicken Escapee +(@CGUID+4,@Chicken,571,1,1,5201.744,4704.674,-128.4752,4.555309,120,0,0), -- Chicken Escapee +(@CGUID+5,@Chicken,571,1,1,5251.442,4508.976,-85.30431,4.304774,120,0,0), -- Chicken Escapee +(@CGUID+6,@Chicken,571,1,1,5251.708,4511.778,-85.32935,1.64061,120,0,0), -- Chicken Escapee +(@CGUID+7,@Chicken,571,1,1,5251.118,4509.744,-85.32935,4.886922,120,0,0), -- Chicken Escapee +(@CGUID+8,@Chicken,571,1,1,5252.795,4509.772,-85.32524,0.7853982,120,0,0), -- Chicken Escapee +(@CGUID+9,@Chicken,571,1,1,5253.682,4511.424,-85.32755,2.356194,120,0,0), -- Chicken Escapee +(@CGUID+10,@Chicken,571,1,1,5254.174,4514.632,-84.96572,0.4096795,120,0,0), -- Chicken Escapee +(@CGUID+11,@Chicken,571,1,1,5252.096,4514.868,-85.32635,4.363323,120,0,0), -- Chicken Escapee +(@CGUID+12,@Chicken,571,1,1,5251.637,4513.41,-85.32935,3.490659,120,0,0), -- Chicken Escapee +(@CGUID+13,@Chicken,571,1,1,5253.287,4513.109,-85.32935,3.036873,120,0,0), -- Chicken Escapee +(@CGUID+14,@Chicken,571,1,1,5253.494,4514.764,-85.31329,3.717551,120,0,0), -- Chicken Escapee +(@CGUID+15,@Chicken,571,1,1,5251.158,4518.321,-85.3019,1.592369,120,0,0), -- Chicken Escapee +(@CGUID+16,@Chicken,571,1,1,5250.385,4516.643,-85.3257,5.044002,120,0,0), -- Chicken Escapee +(@CGUID+17,@Chicken,571,1,1,5251.159,4515.294,-85.32935,4.694936,120,0,0), -- Chicken Escapee +(@CGUID+18,@Chicken,571,1,1,5252.267,4516.414,-85.30904,0.5235988,120,0,0), -- Chicken Escapee +(@CGUID+19,@Chicken,571,1,1,5251.693,4517.859,-85.3243,4.590216,120,0,0), -- Chicken Escapee +(@CGUID+20,@Chicken,571,1,1,5262.68,4528.738,-84.4747,4.718389,120,0,0), -- Chicken Escapee +(@CGUID+21,@Chicken,571,1,1,5256.907,4480.617,-84.26879,4.927223,120,0,0), -- Chicken Escapee +(@CGUID+22,@Chicken,571,1,1,5298.603,4489.708,-93.65161,6.16371,120,0,0), -- Chicken Escapee +(@CGUID+23,@Chicken,571,1,1,5192.673,4513.661,-89.12463,1.299241,120,0,0), -- Chicken Escapee +(@CGUID+24,@Chicken,571,1,1,5228.781,4579.799,-96.98647,0.05766594,120,0,0), -- Chicken Escapee +(@CGUID+25,@Chicken,571,1,1,5230.247,4433.143,-96.82567,5.135688,120,0,0), -- Chicken Escapee +(@CGUID+26,@Chicken,571,1,1,5180.035,4541.38,-97.84879,0.2208638,120,0,0), -- Chicken Escapee +(@CGUID+27,@Chicken,571,1,1,5178.563,4538.964,-97.54511,0.9771074,120,0,0), -- Chicken Escapee +(@CGUID+28,@Chicken,571,1,1,5272.981,4417.033,-96.50356,0.9044432,120,0,0), -- Chicken Escapee +(@CGUID+29,@Chicken,571,1,1,5214.513,4416.202,-96.53072,2.862281,120,0,0), -- Chicken Escapee +(@CGUID+30,@Chicken,571,1,1,5160.117,4474.996,-96.96887,4.499754,120,0,0), -- Chicken Escapee +(@CGUID+31,@Chicken,571,1,1,5263.541,4409.121,-95.87889,1.570796,120,0,0), -- Chicken Escapee +(@CGUID+32,@Chicken,571,1,1,5234.166,4404.604,-95.12725,1.031549,120,0,0), -- Chicken Escapee +(@CGUID+33,@Chicken,571,1,1,5297.803,4493.681,-93.65161,5.525303,120,0,0), -- Chicken Escapee +(@CGUID+34,@Chicken,571,1,1,5260.112,4340.577,-97.61092,1.942801,120,0,0), -- Chicken Escapee +(@CGUID+35,@Chicken,571,1,1,5208.492,4379.111,-95.49483,0.6675518,120,0,0), -- Chicken Escapee +(@CGUID+36,@Chicken,571,1,1,5172.742,4368.674,-96.27965,0.8766832,120,0,0), -- Chicken Escapee +(@CGUID+37,@Chicken,571,1,1,5223.491,4467.19,-96.75621,4.723376,120,0,0), -- Chicken Escapee +(@CGUID+38,@Chicken,571,1,1,5220.966,4469.76,-96.75582,5.183968,120,0,0), -- Chicken Escapee +(@CGUID+39,@Chicken,571,1,1,5221.419,4473.14,-96.75536,4.98181,120,0,0), -- Chicken Escapee +(@CGUID+40,@Chicken,571,1,1,5221.419,4473.14,-96.75536,5.49084,120,0,0), -- Chicken Escapee +(@CGUID+41,@Chicken,571,1,1,5221.828,4470.711,-96.57594,5.315169,120,0,0), -- Chicken Escapee +(@CGUID+42,@Chicken,571,1,1,5151.083,4416.434,-96.38642,2.066685,120,0,0), -- Chicken Escapee +(@CGUID+43,@Chicken,571,1,1,5281.582,4425.185,-96.79945,4.45059,120,0,0), -- Chicken Escapee +(@CGUID+44,@Chicken,571,1,1,5257.173,4424.231,-95.62836,3.996804,120,0,0); -- Chicken Escapee + +-- Aura for Chicken Escapee (thx Discovered) +DELETE FROM `creature_template_addon` WHERE `entry`=28161; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(28161,0,0,0,0,'50734'); -- Chicken Escapee - Frenzyheart Chicken: Invisibility diff --git a/sql/updates/world/2012_05_23_01_world_sai.sql b/sql/updates/world/2012_05_23_01_world_sai.sql new file mode 100644 index 00000000000..af2fd5409d1 --- /dev/null +++ b/sql/updates/world/2012_05_23_01_world_sai.sql @@ -0,0 +1,14 @@ +-- Delete all spawnings of Chicken Escapee via quest_start_scripts +DELETE FROM `quest_start_scripts` WHERE `command`=10 AND `datalong`=28161; + +-- Elder Harkek SAI +SET @ENTRY := 28138; +SET @SPELL_SEE_INVIS_CHICKEN := 50735; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,19,0,100,0,12532,0,0,0,85,@SPELL_SEE_INVIS_CHICKEN,2,0,0,0,0,7,0,0,0,0,0,0,0,"Elder Harkek - On Quest Accept - Invoker Cast Frenzyheart Chicken: See Invisibility"), +(@ENTRY,0,1,0,19,0,100,0,12702,0,0,0,85,@SPELL_SEE_INVIS_CHICKEN,2,0,0,0,0,7,0,0,0,0,0,0,0,"Elder Harkek - On Quest Accept - Invoker Cast Frenzyheart Chicken: See Invisibility"), +(@ENTRY,0,2,0,20,0,100,0,12532,0,0,0,28,@SPELL_SEE_INVIS_CHICKEN,0,0,0,0,0,7,0,0,0,0,0,0,0,"Elder Harkek - On Quest Complete - Remove Aura Frenzyheart Chicken: See Invisibility"), +(@ENTRY,0,3,0,20,0,100,0,12702,0,0,0,28,@SPELL_SEE_INVIS_CHICKEN,0,0,0,0,0,7,0,0,0,0,0,0,0,"Elder Harkek - On Quest Complete - Remove Aura Frenzyheart Chicken: See Invisibility"); diff --git a/sql/updates/world/2012_05_23_02_world_sai.sql b/sql/updates/world/2012_05_23_02_world_sai.sql new file mode 100644 index 00000000000..588f25f1568 --- /dev/null +++ b/sql/updates/world/2012_05_23_02_world_sai.sql @@ -0,0 +1,21 @@ +-- Chicken Escapee SAI +SET @ENTRY := 28161; +SET @SPELL_NET_CHICKEN := 51959; +SET @SPELL_INVIS_CHICKEN := 50734; +SET @SPELL_SCARED_CHICKEN := 51846; +SET @SPELL_CREATE_QUESTITEM := 51037; +UPDATE `creature` SET `MovementType`=0,`spawndist`=0,`spawntimesecs`=5 WHERE `id`=@ENTRY; +UPDATE `creature_template` SET `AIName`='SmartAI',`npcflag`=1 WHERE `entry`=@ENTRY; +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=@ENTRY; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,8,0,100,0,@SPELL_NET_CHICKEN,0,0,0,28,@SPELL_SCARED_CHICKEN,0,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Spellhit - Remove Aura Scared Chicken"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,41,4000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Spellhit - Forced Despawn"), +(@ENTRY,0,2,3,64,0,100,0,0,0,0,0,85,@SPELL_CREATE_QUESTITEM,2,0,0,0,0,7,0,0,0,0,0,0,0,"Chicken Escapee - On Gossip Hello - Invoker Cast Capture Chicken Escapee"), -- Triggered because of cast-time +(@ENTRY,0,3,4,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Chicken Escapee - On Gossip Hello - Close Gossip"), +(@ENTRY,0,4,5,61,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Gossip Hello - Set Npcflag None"), +(@ENTRY,0,5,6,61,0,100,0,0,0,0,0,28,@SPELL_SCARED_CHICKEN,0,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Gossip Hello - Remove Aura Scared Chicken"), +(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,41,500,0,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Gossip Hello - Forced Despawn"), +(@ENTRY,0,7,8,25,0,100,0,0,0,0,0,11,@SPELL_INVIS_CHICKEN,1,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Reset - Cast Frenzyheart Chicken: Invisibility"), -- Just in case +(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,11,@SPELL_SCARED_CHICKEN,0,0,0,0,0,1,0,0,0,0,0,0,0,"Chicken Escapee - On Reset - Cast Scared Chicken"); diff --git a/sql/updates/world/2012_05_23_03_world_gameobject_loot_template.sql b/sql/updates/world/2012_05_23_03_world_gameobject_loot_template.sql new file mode 100644 index 00000000000..22ecebcae31 --- /dev/null +++ b/sql/updates/world/2012_05_23_03_world_gameobject_loot_template.sql @@ -0,0 +1,32 @@ +SET @entry := 35093; +SET @epic := 25009; +SET @gem := @entry+1; +-- Create references +DELETE FROM `reference_loot_template` WHERE `entry` IN(@entry,@epic,@gem); +INSERT INTO `reference_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `lootmode`, `groupid`, `mincountOrRef`, `maxcount`) VALUES +(@entry,27452,0,1,1,1,1), -- Light Scribe Bands +(@entry,27453,0,1,1,1,1), -- Averinn's RIng of Slaying +(@entry,27454,0,1,1,1,1), -- Volcanic Pauldrons +(@entry,27455,0,1,1,1,1), -- Irondrake faceguard +(@entry,27456,0,1,1,1,1), -- Raiments of Nature's Breath +(@entry,27457,0,1,1,1,1), -- Life Bearer's Gauntlets +(@entry,27458,0,1,1,1,1), -- Oceansong Kilt +(@entry,27459,0,1,1,1,1), -- Vambraces of Daring +(@entry,27460,0,1,1,1,1), -- Reavers' Ring +(@entry,27461,0,1,1,1,1), -- Chestguard of the Prowler +-- Epics +(@epic,29238,0,1,1,1,1), -- Lion's Heart Girdle +(@epic,29264,0,1,1,1,1), -- Tree-Mender's Belt +(@epic,29346,0,1,1,1,1), -- Feltooth Eviscerator +(@epic,32077,0,1,1,1,1), -- Wrath Infused Gauntlets +-- Gems +(@gem,30592,0,1,1,1,1), -- Steady Chrysoprase +(@gem,30593,0,1,1,1,1), -- Potent Fire Opal +(@gem,30594,0,1,1,1,1); -- Regal Chrysoprase +-- Assign loot to the chest +SET @GOloot := 21764; -- lootid of Reinforced Fel Iron Chest Heroic +DELETE FROM `gameobject_loot_template` WHERE `entry`=@GOloot; +INSERT INTO `gameobject_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `lootmode`, `groupid`, `mincountOrRef`, `maxcount`) VALUES +(@GOloot,1,100,1,0,-@entry, 2), -- one from gear +(@GOloot,2,30,1,0,-@gem,1), -- one gem (30%) +(@GOloot,3,100,1,0,-@epic,1); -- one from epics diff --git a/sql/updates/world/2012_05_23_04_world_gameobject.sql b/sql/updates/world/2012_05_23_04_world_gameobject.sql new file mode 100644 index 00000000000..afcb1e89317 --- /dev/null +++ b/sql/updates/world/2012_05_23_04_world_gameobject.sql @@ -0,0 +1,3 @@ +DELETE FROM `gameobject` WHERE `id`=188677; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(318,188677,571,1,1,2567.449,-388.7118,3.573463,-2.879789,0,0,0.639778,0.76856,1200,100,1); diff --git a/sql/updates/world/2012_05_23_05_world_creature.sql b/sql/updates/world/2012_05_23_05_world_creature.sql new file mode 100644 index 00000000000..bb162f927bd --- /dev/null +++ b/sql/updates/world/2012_05_23_05_world_creature.sql @@ -0,0 +1,12 @@ +-- Spawn from Sniff +DELETE FROM `creature` WHERE `id`=34526; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(42161,34526,1,1,1,0,0,-1050.052,-286.7274,159.1137,5.951573,120,0,0,1,0,0,0,0,0); +-- Template updates +UPDATE `creature_template` SET `faction_A`=104,`faction_H`=104,`baseattacktime`=2000,`npcflag`=`npcflag`|3,`unit_flags`=`unit_flags`|512 WHERE `entry`=34526; -- Aponi Brightmane +-- Model data +UPDATE `creature_model_info` SET `bounding_radius`=1.003375,`combat_reach`=4.3125,`gender`=1 WHERE `modelid`=29249; -- Aponi Brightmane +-- Addon data +DELETE FROM `creature_template_addon` WHERE `entry`=34526; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(34526,0,1,256,0,NULL); -- Aponi Brightmane diff --git a/sql/updates/world/2012_05_24_00_world_creature_misc.sql b/sql/updates/world/2012_05_24_00_world_creature_misc.sql new file mode 100644 index 00000000000..ae35b3fba5d --- /dev/null +++ b/sql/updates/world/2012_05_24_00_world_creature_misc.sql @@ -0,0 +1,5 @@ +UPDATE `creature_template` SET `faction_A`=1914,`faction_H`=1914,`unit_flags`=33024 WHERE `entry`=26452; + +DELETE FROM `creature_template_addon` WHERE `entry`=26452; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(26452,0,0,0,1,383,''); diff --git a/sql/updates/world/2012_05_24_01_world_gameobject.sql b/sql/updates/world/2012_05_24_01_world_gameobject.sql new file mode 100644 index 00000000000..32bbc15494f --- /dev/null +++ b/sql/updates/world/2012_05_24_01_world_gameobject.sql @@ -0,0 +1,3 @@ +DELETE FROM `gameobject` WHERE `id`=175759 AND `guid`=219; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(219,175759,530,1,1,9636.439,-7231.265,16.73347,-2.82743,0,0,-0.9876881,0.1564362,900,100,1); diff --git a/sql/updates/world/2012_05_25_00_world_sai.sql b/sql/updates/world/2012_05_25_00_world_sai.sql new file mode 100644 index 00000000000..fa5682db02f --- /dev/null +++ b/sql/updates/world/2012_05_25_00_world_sai.sql @@ -0,0 +1,6 @@ +-- Eye of the Lich King SAI +SET @ENTRY := 36913; -- NPC entry +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,6,0,0,1000,1000,66,0,0,0,0,0,0,21,150,0,0,0,0,0,0, 'Eye of the Lich King - OOC - face closest player'); diff --git a/sql/updates/world/2012_05_25_01_world_waypoints.sql b/sql/updates/world/2012_05_25_01_world_waypoints.sql new file mode 100644 index 00000000000..0d2c04bc6bc --- /dev/null +++ b/sql/updates/world/2012_05_25_01_world_waypoints.sql @@ -0,0 +1,149 @@ +-- Bladewing Bloodletter InhabitType fix +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=21033; + +-- Bladewing Bloodletter +SET @NPC := 73849; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=1987.838,`position_y`=6153.995,`position_z`=146.4068,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,1987.838,6153.995,146.4068,0,0,0,100,0), +(@PATH,2,1981.592,6150.557,146.4068,0,0,0,100,0), +(@PATH,3,1966.573,6153.941,146.4068,0,0,0,100,0), +(@PATH,4,1953.747,6155.154,146.4068,0,0,0,100,0), +(@PATH,5,1941.287,6159.015,146.4068,0,0,0,100,0), +(@PATH,6,1937.986,6166.096,146.4068,0,0,0,100,0), +(@PATH,7,1948.558,6175.274,145.1566,0,0,0,100,0), +(@PATH,8,1959.44,6173.246,145.6567,0,0,0,100,0), +(@PATH,9,1971.408,6169.729,145.7679,0,0,0,100,0), +(@PATH,10,1986.747,6168.348,144.8511,0,0,0,100,0), +(@PATH,11,1998.881,6168.547,144.4066,0,0,0,100,0), +(@PATH,12,2008.877,6170.33,143.7955,0,0,0,100,0), +(@PATH,13,2021.965,6166.769,143.657,0,0,0,100,0), +(@PATH,14,2027.152,6158.083,145.4344,0,0,0,100,0), +(@PATH,15,2025.352,6149.427,146.4068,0,0,0,100,0), +(@PATH,16,2011.869,6150.37,146.4068,0,0,0,100,0), +(@PATH,17,1999.44,6155.886,146.4068,0,0,0,100,0); + +-- Bladewing Bloodletter +SET @NPC := 73850; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=2099.588,`position_y`=6126.344,`position_z`=148.8029,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,2099.588,6126.344,148.8029,0,0,0,100,0), +(@PATH,2,2094.131,6133.031,148.303,0,0,0,100,0), +(@PATH,3,2085.703,6143.32,148.303,0,0,0,100,0), +(@PATH,4,2077.25,6154.094,148.5252,0,0,0,100,0), +(@PATH,5,2062.893,6175.25,146.414,0,0,0,100,0), +(@PATH,6,2056.135,6184.647,144.8307,0,0,0,100,0), +(@PATH,7,2050.784,6189.019,141.9417,0,0,0,100,0), +(@PATH,8,2044,6181.015,142.6362,0,0,0,100,0), +(@PATH,9,2044.303,6175.524,143.3028,0,0,0,100,0), +(@PATH,10,2053.432,6161.702,145.8306,0,0,0,100,0), +(@PATH,11,2064.378,6145.299,146.7471,0,0,0,100,0), +(@PATH,12,2064.748,6135.614,147.7195,0,0,0,100,0), +(@PATH,13,2067.337,6117.838,149.0529,0,0,0,100,0), +(@PATH,14,2073.338,6100.975,149.664,0,0,0,100,0), +(@PATH,15,2089.383,6099.217,149.3585,0,0,0,100,0), +(@PATH,16,2099.147,6111.964,149.1641,0,0,0,100,0); + +-- Bladewing Bloodletter +SET @NPC := 73852; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=2180.795,`position_y`=6149.398,`position_z`=145.9554,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,2180.795,6149.398,145.9554,0,0,0,100,0), +(@PATH,2,2185.298,6157.3,146.8721,0,0,0,100,0), +(@PATH,3,2191.635,6164.935,146.6221,0,0,0,100,0), +(@PATH,4,2203.45,6168.873,146.2055,0,0,0,100,0), +(@PATH,5,2217.238,6165.062,145.6221,0,0,0,100,0), +(@PATH,6,2225.425,6159.092,145.1501,0,0,0,100,0), +(@PATH,7,2228.766,6146.569,145.3166,0,0,0,100,0), +(@PATH,8,2225.81,6129.76,143.9,0,0,0,100,0), +(@PATH,9,2203.906,6114.964,145.0111,0,0,0,100,0), +(@PATH,10,2184.713,6115.808,145.7333,0,0,0,100,0), +(@PATH,11,2173.165,6123,146.8721,0,0,0,100,0), +(@PATH,12,2175.542,6139.301,146.8721,0,0,0,100,0); + +-- Bladewing Bloodletter +SET @NPC := 73853; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=2153.506,`position_y`=6119.981,`position_z`=148.0267,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,2153.506,6119.981,148.0267,0,0,0,100,0), +(@PATH,2,2144.238,6124.169,148.0267,0,0,0,100,0), +(@PATH,3,2133.341,6127.807,148.0267,0,0,0,100,0), +(@PATH,4,2120.865,6126.57,148.0267,0,0,0,100,0), +(@PATH,5,2110.276,6122.198,148.0267,0,0,0,100,0), +(@PATH,6,2108.702,6111.856,148.0267,0,0,0,100,0), +(@PATH,7,2113.887,6104.159,148.0267,0,0,0,100,0), +(@PATH,8,2123.298,6095.088,148.0267,0,0,0,100,0), +(@PATH,9,2136.37,6099.125,148.0267,0,0,0,100,0), +(@PATH,10,2146.343,6107.208,148.0267,0,0,0,100,0), +(@PATH,11,2150.752,6118.491,148.0267,0,0,0,100,0), +(@PATH,12,2158.115,6126.979,148.0267,0,0,0,100,0), +(@PATH,13,2168.949,6133.578,148.0267,0,0,0,100,0), +(@PATH,14,2180.009,6134.229,148.0267,0,0,0,100,0), +(@PATH,15,2189.201,6129.583,148.0267,0,0,0,100,0), +(@PATH,16,2192.429,6119.862,148.0267,0,0,0,100,0), +(@PATH,17,2187.044,6112.755,148.0267,0,0,0,100,0), +(@PATH,18,2176.445,6111.443,148.0267,0,0,0,100,0), +(@PATH,19,2166.243,6114.129,148.0267,0,0,0,100,0); + +-- Bladewing Bloodletter +SET @NPC := 73858; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=2128.704,`position_y`=6018.743,`position_z`=141.9579,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,2128.704,6018.743,141.9579,0,0,0,100,0), +(@PATH,2,2118.804,6016.506,141.9433,0,0,0,100,0), +(@PATH,3,2100.692,6019.814,141.9433,0,0,0,100,0), +(@PATH,4,2080.599,6017.728,144.3877,0,0,0,100,0), +(@PATH,5,2070.564,6003.17,144.1802,0,0,0,100,0), +(@PATH,6,2079.148,5988.599,143.5968,0,0,0,100,0), +(@PATH,7,2088.214,5974.081,142.9579,0,0,0,100,0), +(@PATH,8,2102.427,5966.812,142.208,0,0,0,100,0), +(@PATH,9,2117.762,5969.647,141.9579,0,0,0,100,0), +(@PATH,10,2130.632,5977.25,141.9579,0,0,0,100,0), +(@PATH,11,2135.56,5993.264,141.9579,0,0,0,100,0), +(@PATH,12,2148.631,6003.11,141.1247,0,0,0,100,0), +(@PATH,13,2144.206,6017.48,141.9579,0,0,0,100,0); + +-- Bladewing Bloodletter +SET @NPC := 73860; +SET @PATH := @NPC*10; +UPDATE `creature` SET `position_x`=1951.455,`position_y`=5919.516,`position_z`=140.4673,`spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (@NPC,@PATH,1); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUE +(@PATH,1,1951.455,5919.516,140.4673,0,0,0,100,0), +(@PATH,2,1953.539,5912.287,140.4179,0,0,0,100,0), +(@PATH,3,1955.967,5902.248,140.4179,0,0,0,100,0), +(@PATH,4,1947.568,5889.415,140.4179,0,0,0,100,0), +(@PATH,5,1938.332,5877.63,140.4179,0,0,0,100,0), +(@PATH,6,1946.422,5859.488,140.4179,0,0,0,100,0), +(@PATH,7,1958.004,5850.275,140.4179,0,0,0,100,0), +(@PATH,8,1967.889,5861.601,140.4673,0,0,0,100,0), +(@PATH,9,1967.766,5874.843,140.4673,0,0,0,100,0), +(@PATH,10,1962.739,5881.181,140.4673,0,0,0,100,0), +(@PATH,11,1965.367,5889.64,140.4673,0,0,0,100,0), +(@PATH,12,1977.617,5904.389,140.4673,0,0,0,100,0), +(@PATH,13,1979.003,5918.971,140.4673,0,0,0,100,0), +(@PATH,14,1969.612,5933.128,140.4673,0,0,0,100,0), +(@PATH,15,1958.879,5940.208,140.4673,0,0,0,100,0), +(@PATH,16,1952.594,5927.489,140.4673,0,0,0,100,0); diff --git a/sql/updates/world/2012_05_25_02_world_creature_template.sql b/sql/updates/world/2012_05_25_02_world_creature_template.sql new file mode 100644 index 00000000000..fd4c1743f07 --- /dev/null +++ b/sql/updates/world/2012_05_25_02_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Floating Flavor Eye InhabitType fix +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=21659; diff --git a/sql/updates/world/2012_05_25_03_world_template.sql b/sql/updates/world/2012_05_25_03_world_template.sql new file mode 100644 index 00000000000..6ef112f342f --- /dev/null +++ b/sql/updates/world/2012_05_25_03_world_template.sql @@ -0,0 +1,8 @@ +-- Fix unit flags for Blackhand Incarcerator +UPDATE `creature_template` SET `unit_flags`=`unit_flags`|768 WHERE `entry`=10316; +-- Fix unit flags for Pyroguard Emberseer +UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33554688 WHERE `entry`=9816; +-- Remove hack event script +DELETE FROM `event_scripts` WHERE `id`=4884; +-- Remove script to Dragonspire Hall Runes "UBRS" +UPDATE `gameobject_template` SET `ScriptName`= '' WHERE `entry` BETWEEN 175194 AND 175200; diff --git a/sql/updates/world/2012_05_26_00_world_scripts.sql b/sql/updates/world/2012_05_26_00_world_scripts.sql new file mode 100644 index 00000000000..18b0fa2f6b2 --- /dev/null +++ b/sql/updates/world/2012_05_26_00_world_scripts.sql @@ -0,0 +1,20 @@ +-- Correction for Obsidian Nullifier EAI +UPDATE `creature_ai_scripts` SET + `action1_param1` = 23 +WHERE `id` = 1531201; + +-- Correction for Wildspawn Felsworn and Wildspawn Hellcaller SAI +UPDATE `smart_scripts` SET + `event_phase_mask` = 2, + `action_type` = 22, + `action_param1` = 1, + `target_type` = 1 +WHERE + (`entryorguid` = 11457 AND + `source_type` = 0 AND + `id` = 10 AND + `link` = 0) OR + (`entryorguid` = 11455 AND + `source_type` = 0 AND + `id` = 11 AND + `link` = 0); diff --git a/sql/updates/world/2012_05_26_01_world_spell_dbc.sql b/sql/updates/world/2012_05_26_01_world_spell_dbc.sql new file mode 100644 index 00000000000..7efebc37489 --- /dev/null +++ b/sql/updates/world/2012_05_26_01_world_spell_dbc.sql @@ -0,0 +1,4 @@ +-- Fire Shield from 2.0.12 dbc +DELETE FROM `spell_dbc` WHERE `Id`=13377; +INSERT INTO `spell_dbc` (`Id`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `Stances`, `StancesNot`, `Targets`, `CastingTimeIndex`, `AuraInterruptFlags`, `ProcFlags`, `ProcChance`, `ProcCharges`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `StackAmount`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `Effect1`, `Effect2`, `Effect3`, `EffectDieSides1`, `EffectDieSides2`, `EffectDieSides3`, `EffectRealPointsPerLevel1`, `EffectRealPointsPerLevel2`, `EffectRealPointsPerLevel3`, `EffectBasePoints1`, `EffectBasePoints2`, `EffectBasePoints3`, `EffectMechanic1`, `EffectMechanic2`, `EffectMechanic3`, `EffectImplicitTargetA1`, `EffectImplicitTargetA2`, `EffectImplicitTargetA3`, `EffectImplicitTargetB1`, `EffectImplicitTargetB2`, `EffectImplicitTargetB3`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectRadiusIndex3`, `EffectApplyAuraName1`, `EffectApplyAuraName2`, `EffectApplyAuraName3`, `EffectAmplitude1`, `EffectAmplitude2`, `EffectAmplitude3`, `EffectMultipleValue1`, `EffectMultipleValue2`, `EffectMultipleValue3`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectMiscValue3`, `EffectMiscValueB1`, `EffectMiscValueB2`, `EffectMiscValueB3`, `EffectTriggerSpell1`, `EffectTriggerSpell2`, `EffectTriggerSpell3`, `EffectSpellClassMaskA1`, `EffectSpellClassMaskA2`, `EffectSpellClassMaskA3`, `EffectSpellClassMaskB1`, `EffectSpellClassMaskB2`, `EffectSpellClassMaskB3`, `EffectSpellClassMaskC1`, `EffectSpellClassMaskC2`, `EffectSpellClassMaskC3`, `MaxTargetLevel`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `MaxAffectedTargets`, `DmgClass`, `PreventionType`, `DmgMultiplier1`, `DmgMultiplier2`, `DmgMultiplier3`, `AreaGroupId`, `SchoolMask`, `Comment`) VALUES +(13377, 1, 0, 2512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 40, 40, 21, 1, 0, -1, -1, 0, 6, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 3000, 0, 0, '0', '0', '0', 0, 0, 0, 0, 0, 0, 13376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 2, 'Fire Shield'); diff --git a/sql/updates/world/2012_05_26_02_world_creature_template.sql b/sql/updates/world/2012_05_26_02_world_creature_template.sql new file mode 100644 index 00000000000..e51567390b7 --- /dev/null +++ b/sql/updates/world/2012_05_26_02_world_creature_template.sql @@ -0,0 +1,5 @@ +-- Training dummies +UPDATE `creature_template` SET + `flags_extra`=0x40000, /* NO_SKILLGAIN */ + `mechanic_immune_mask`=0x20|0x4000 /* GRIP|BLEED */ /* two of the templates already had bleed immunity, is that correct? */ +WHERE `ScriptName`='npc_training_dummy'; diff --git a/sql/updates/world/2012_05_26_03_world_page_text.sql b/sql/updates/world/2012_05_26_03_world_page_text.sql new file mode 100644 index 00000000000..9dc285cd99d --- /dev/null +++ b/sql/updates/world/2012_05_26_03_world_page_text.sql @@ -0,0 +1,4 @@ +-- First page of A Steamy Romance Novel: Northern Exposure +DELETE FROM `page_text` WHERE `entry`=3562; +INSERT INTO `page_text` (`entry`, `text`, `next_page`) VALUES +(3562, 'The tiny gnome peered over the railing into the secluded Dalaran courtyard.$B$B"The view from the balcony is amazing. You have to come see!"$B$BArmor legplates creaked as Marcus walked over, taking in a deep breath as he absently scratched his scruffy chin.$B$B"The Hero''s Welcome is no slouch. And there''s something in the room that might interest you."$B$BTavi bounded into the room, pausing only a moment before jumping onto the massive bed. She turned to gaze at Marcus with her huge saucer-like eyes, narrowing them playfully and replacing her glowing smile with a diabolical grin.', 3563); diff --git a/sql/updates/world/2012_05_26_04_world_creature_template.sql b/sql/updates/world/2012_05_26_04_world_creature_template.sql new file mode 100644 index 00000000000..911cd45ef8c --- /dev/null +++ b/sql/updates/world/2012_05_26_04_world_creature_template.sql @@ -0,0 +1,4 @@ +-- Training dummies +UPDATE `creature_template` SET + `mechanic_immune_mask` = `mechanic_immune_mask` &~ 0x4000 /* BLEED */ +WHERE `ScriptName`='npc_training_dummy'; diff --git a/sql/updates/world/2012_05_26_05_world_creature_template.sql b/sql/updates/world/2012_05_26_05_world_creature_template.sql new file mode 100644 index 00000000000..59d69b3fbe1 --- /dev/null +++ b/sql/updates/world/2012_05_26_05_world_creature_template.sql @@ -0,0 +1,8 @@ +-- Blade's Edge - Legion - Invis Bunny +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=20736; +-- Death's Door Warp-Gate Explosion Bunny +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=22502; +-- Death's Door North Warp-Gate +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=22471; +-- Death's Door South Warp-Gate +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128 WHERE `entry`=22472; diff --git a/sql/updates/world/2012_05_26_06_world_smart_scripts.sql b/sql/updates/world/2012_05_26_06_world_smart_scripts.sql new file mode 100644 index 00000000000..397a5ad517a --- /dev/null +++ b/sql/updates/world/2012_05_26_06_world_smart_scripts.sql @@ -0,0 +1,143 @@ +-- Blackhand Dreadweaver SAI +SET @ENTRY := 9817; -- NPC entry +SET @SPELL1 := 12739; -- Shadow Bolt +SET @SPELL2 := 7068; -- Veil of Shadow +SET @SPELL3 := 12380; -- Shadow Channeling +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,11,0,100,2,0,0,0,0,58,1,@SPELL1,3600,6300,25,30,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - On Reset - Load caster template Cast Shadow Bolt'), +(@ENTRY,0,1,0,25,0,100,0,0,0,0,0,11,@SPELL3,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - On Reset - Aura Shadow Channeling'), +(@ENTRY,0,2,3,4,0,100,2,0,0,0,0,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - On Aggro - Cast Shadow Bolt'), +(@ENTRY,0,3,0,61,0,100,2,0,0,0,0,39,10,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - On Aggro - Call for help'), +(@ENTRY,0,4,0,0,0,100,2,9400,21400,22000,28800,11,@SPELL2,3,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - Combat - Cast Veil of Shadow'), +(@ENTRY,0,5,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - HP@15% - Flee for help'), +(@ENTRY,0,6,7,1,0,100,2,0,8000,12000,14000,92,0,0,1,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - OOC - interupt channeling'), +(@ENTRY,0,7,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - OOC - set phase 1'), +(@ENTRY,0,8,0,1,1,100,2,0,0,0,0,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - OOC - emote (phase 1)'), +(@ENTRY,0,9,10,1,1,100,2,4000,4000,4000,4000,11,@SPELL3,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - OOC - Aura Shadow Channeling (phase 1)'), +(@ENTRY,0,10,0,61,1,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Dreadweaver - OOC - set phase 0 (phase 1)'); + +-- Blackhand Summoner SAI +SET @ENTRY := 9818; -- NPC entry +SET @SPELL1 := 12466; -- Fireball +SET @SPELL2 := 15532; -- Frost Nova +SET @SPELL3 := 15792; -- Summon Blackhand Veteran +SET @SPELL4 := 15794; -- Summon Blackhand Dreadweaver +SET @SPELL5 := 12380; -- Shadow Channeling +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,11,0,100,2,0,0,0,0,58,1,@SPELL1,3600,6300,25,30,1,0,0,0,0,0,0,0, 'Blackhand Summoner - On Reset - Load caster template Cast Fireball'), +(@ENTRY,0,1,0,25,0,100,0,0,0,0,0,11,@SPELL5,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - On Reset - Aura Shadow Channeling'), +(@ENTRY,0,2,3,4,0,100,2,0,0,0,0,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Blackhand Summoner - On Aggro - Cast Shadow Bolt'), +(@ENTRY,0,3,0,61,0,100,2,0,0,0,0,39,10,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - On Aggro - Call for help'), +(@ENTRY,0,4,0,0,0,100,2,11400,11400,12700,16700,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - Combat - Cast Frost Nova'), +(@ENTRY,0,5,6,0,0,100,3,30000,35000,0,0,11,@SPELL3,1,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - Combat - Cast Summon Blackhand Veteran'), +(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - Combat - say 0'), +(@ENTRY,0,7,8,0,0,100,3,40000,45000,0,0,11,@SPELL4,1,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - Combat - Cast Summon Blackhand Dreadweaver'), +(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - Combat - say 1'), +(@ENTRY,0,9,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - HP@15% - Flee for help'), +(@ENTRY,0,10,0,1,0,100,2,0,8000,12000,14000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - OOC - emote'); +-- NPC talk text insert +DELETE FROM `creature_text` WHERE `entry`=9818; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(9818,0,0,'%s begins to summon in a Blackhand Veteran!',16,0,100,0,0,0,'Blackhand Summoner'), +(9818,1,0,'%s begins to summon in a Blackhand Dreadweaver!',16,0,100,0,0,0,'Blackhand Summoner'); + +-- Blackhand Veteran SAI +SET @ENTRY := 9819; -- NPC entry +SET @SPELL1 := 15749; -- Shield Charge +SET @SPELL2 := 14516; -- Strike +SET @SPELL3 := 11972; -- Shield Bash +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,4,0,100,2,0,0,0,0,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Blackhand Veteran - On Aggro - Cast Shield Charge'), +(@ENTRY,0,1,0,61,0,100,2,0,0,0,0,39,10,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Veteran - On Aggro - Call for help'), +(@ENTRY,0,2,0,0,0,100,2,7800,15800,13800,22900,11,@SPELL2,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Blackhand Veteran - Combat - Cast Veil of Shadow'), +(@ENTRY,0,3,0,0,0,100,2,10000,20000,6000,12000,11,@SPELL3,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Blackhand Veteran - Combat - Cast Veil of Shadow'), +(@ENTRY,0,4,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Veteran - HP@15% - Flee for help'), +(@ENTRY,0,5,0,1,0,100,2,0,8000,12000,14000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Veteran - OOC - emote'); + +-- Rage Talon Dragonspawn SAI +SET @ENTRY := 9096; -- NPC entry +SET @SPELL1 := 15580; -- Strike +SET @SPELL2 := 12021; -- Fixate +SET @SPELL3 := 15572; -- Sunder Armor +SET @SPELL4 := 3391; -- Thrash +SET @SPELL5 := 8269; -- Frenzy +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,2,4000,13200,6600,14400,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rage Talon Dragonspawn - Combat - Cast Strike'), +(@ENTRY,0,1,0,0,0,100,2,7700,17100,20300,34200,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rage Talon Dragonspawn - Combat - Cast Fixate'), +(@ENTRY,0,2,0,0,0,100,2,1400,12300,7100,11700,11,@SPELL3,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rage Talon Dragonspawn - Combat - Cast Sunder Armor'), +(@ENTRY,0,3,0,0,0,100,2,8200,17100,5600,18100,11,@SPELL4,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Rage Talon Dragonspawn - Combat - Cast Thrash'), +(@ENTRY,0,4,5,2,0,100,2,0,30,120000,120000,11,@SPELL5,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Rage Talon Dragonspawn - HP@30% - Cast Frenzy'), +(@ENTRY,0,5,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Summoner - HP@30% - say 0'); +-- NPC talk text insert +DELETE FROM `creature_text` WHERE `entry`=9096; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(9096,0,0,'%s goes into a frenzy!',16,0,100,0,0,0,'Rage Talon Dragonspawn'); + + -- Scarshield Legionnaire SAI +SET @ENTRY := 9097; -- NPC entry +SET @SPELL1 := 15496; -- Cleave +SET @SPELL2 := 11972; -- Shield Bash +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,4,0,100,2,0,0,0,0,39,10,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Scarshield Legionnaire - On Aggro - Call for help'), +(@ENTRY,0,1,0,0,0,100,2,7800,11500,8000,22100,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Scarshield Legionnaire - Combat - Cast Cleave'), +(@ENTRY,0,2,0,0,0,100,2,4000,10000,14000,20000,11,@SPELL2,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Scarshield Legionnaire - Combat - Cast Shield Bash'); + +-- Scarshield Acolyte SAI +SET @ENTRY := 9045; -- NPC entry +SET @SPELL1 := 14032; -- Shadow Word: Pain +SET @SPELL2 := 12039; -- Heal +SET @SPELL3 := 8362; -- Renew +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,4,0,100,2,0,0,0,0,39,10,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Scarshield Acolyte - On Aggro - Call for help'), +(@ENTRY,0,1,0,0,0,100,2,7700,15700,21900,33500,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Scarshield Acolyte - Combat - Cast Shadow Word: Pain'), +(@ENTRY,0,2,0,2,0,100,3,0,75,0,0,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Scarshield Acolyte - HP@75% - Cast Heal'), +(@ENTRY,0,3,0,14,0,100,2,35,8,5000,6000,11,@SPELL3,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Scarshield Acolyte - Friendly hp@35 - Cast Renew on friendly unit'); + +-- Scarshield Spellbinder SAI +SET @ENTRY := 9098; -- NPC entry +SET @SPELL1 := 13748; -- Arcane Bolt +SET @SPELL2 := 15123; -- Resist Fire +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,11,0,100,2,0,0,0,0,58,1,@SPELL1,1100,3000,30,30,1,0,0,0,0,0,0,0, 'Scarshield Spellbinder - On Reset - Load caster template Cast Arcane Bolt'), +(@ENTRY,0,1,0,4,0,100,2,0,0,0,0,39,10,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Scarshield Spellbinder - On Aggro - Call for help'), +(@ENTRY,0,2,0,16,0,100,2,@SPELL2,30,3000,6000,11,@SPELL2,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Blackhand Summoner - Combat - Cast Resist Fire'); + +-- Blackhand Incarcerator SAI +SET @ENTRY := 10316; -- NPC entry +SET @SPELL1 := 15281; -- Encage Emberseer +SET @SPELL2 := 12039; -- Heal +SET @SPELL3 := 8362; -- Renew +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,3,1000,1000,1000,1000,11,@SPELL1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Incarcerator - OOC - Cast Encage Emberseer'), +(@ENTRY,0,1,2,38,0,100,2,0,1,0,0,92,0,@SPELL1,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Incarcerator - On data set - Stop Casting Encage Emberseer'), +(@ENTRY,0,2,4,61,0,100,0,0,0,0,0,19,768,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Incarcerator - On data set - Remove unit flags'), +(@ENTRY,0,3,4,4,0,100,2,0,0,0,0,9,0,0,0,0,0,0,15,175244,100,0,0,0,0,0, 'Blackhand Incarcerator - On aggro - close emberseer in door'), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,9,0,0,0,0,0,0,15,175705,100,0,0,0,0,0, 'Blackhand Incarcerator - On aggro - close doors'), +(@ENTRY,0,5,0,0,0,100,2,7800,15800,13800,22900,11,@SPELL2,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Blackhand Incarcerator - Combat - Cast Strike'), +(@ENTRY,0,6,0,0,0,100,2,10000,20000,6000,12000,11,@SPELL3,0,0,0,0,0,5,0,0,0,0,0,0,0, 'Blackhand Incarcerator - Combat - Cast Encage'), +(@ENTRY,0,7,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Incarcerator - HP@15% - Flee for help'), +(@ENTRY,0,8,0,6,0,100,0,0,0,0,0,41,10000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Blackhand Incarcerator - On death - Despawn after 10 sec'); diff --git a/sql/updates/world/2012_05_27_00_world_gameobject_template.sql b/sql/updates/world/2012_05_27_00_world_gameobject_template.sql new file mode 100644 index 00000000000..5fa3c15a505 --- /dev/null +++ b/sql/updates/world/2012_05_27_00_world_gameobject_template.sql @@ -0,0 +1,7 @@ +-- Gameobject updates based on sniffs +UPDATE `gameobject_template` SET `size` =2.5,`questItem1`=30876,`data0`=57,`data1`=21583 WHERE `entry`=185032; +UPDATE `gameobject` SET `position_x`=-3420.991,`position_y`=1373.175,`position_z`=257.5233,`orientation`=3.141593 WHERE `id`=185032; +-- Gameobject loot template +DELETE FROM `gameobject_loot_template` WHERE `entry`=21583; +INSERT INTO `gameobject_loot_template` VALUES +(21583,30876,100,1,0,1,1); -- Quenched Illidari-Bane Blade diff --git a/sql/updates/world/2012_05_27_01_world_waypoints.sql b/sql/updates/world/2012_05_27_01_world_waypoints.sql new file mode 100644 index 00000000000..3685b58a629 --- /dev/null +++ b/sql/updates/world/2012_05_27_01_world_waypoints.sql @@ -0,0 +1,7 @@ +-- RE FIX Reanimated Frost Wyrm +DELETE FROM `creature` WHERE `guid` IN (116670,116671,116672,116681,116683,116684,116685,116686,116687,116696,116697,116699,116700,116701); +UPDATE `creature` SET `MovementType`=2 WHERE `guid` BETWEEN 40497 AND 40505; +UPDATE `creature_addon` SET `bytes1`=50331648,`bytes2`=1 WHERE `guid` BETWEEN 40497 AND 40505; +-- Fix Wildhammer Scout +UPDATE `creature` SET `MovementType`=0 WHERE guid IN (69122,69123,69124,69125,69126,69127); +UPDATE `creature_addon` SET `path_id`=0 WHERE guid IN (69122,69123,69124,69125,69126,69127); diff --git a/sql/updates/world/2012_05_27_02_world_creature.sql b/sql/updates/world/2012_05_27_02_world_creature.sql new file mode 100644 index 00000000000..8ca3ee75c94 --- /dev/null +++ b/sql/updates/world/2012_05_27_02_world_creature.sql @@ -0,0 +1,4 @@ +-- Add Missing spawn for Queen Angerboda +DELETE FROM `creature` WHERE `id`=24023; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(42162,24023,571,1,1,0,0,2855.372,-3869.662,248.6132,2.181662,150,0,0,9291,3231,0,0,0,0); diff --git a/sql/updates/world/2012_05_27_03_world_creature.sql b/sql/updates/world/2012_05_27_03_world_creature.sql new file mode 100644 index 00000000000..097f40581a7 --- /dev/null +++ b/sql/updates/world/2012_05_27_03_world_creature.sql @@ -0,0 +1,2 @@ +-- Remove Spawns for Compact Harvest Reaper, it should be spawned via script +DELETE FROM `creature` WHERE `id`=2676; diff --git a/sql/updates/world/2012_05_27_04_world_smart_scripts.sql b/sql/updates/world/2012_05_27_04_world_smart_scripts.sql new file mode 100644 index 00000000000..1f7cfa3d19c --- /dev/null +++ b/sql/updates/world/2012_05_27_04_world_smart_scripts.sql @@ -0,0 +1,24 @@ +-- Reconstructed Wyrm SAI +SET @ENTRY := 27693; +SET @SPELL1 := 49386; -- Not in dbc +SET @SPELL2 := 49343; -- Frost Breath Strafe +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,11,0,100,0,0,0,0,0,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Reconstructed Wyrm - On spawn - cast aura'), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,53,0,@ENTRY,0,0,0,0,1,0,0,0,0,0,0,0,'Reconstructed Wyrm - On spawn - Load Path'); +-- waypoints for Reconstructed Wyrm +DELETE FROM `waypoints` WHERE `entry` IN (@ENTRY); +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(@ENTRY,1,4685.845,1130.759,150.1177, 'Reconstructed Wyrm'), +(@ENTRY,2,4686.284,1131.658,150.1177, 'Reconstructed Wyrm'), +(@ENTRY,3,4688.699,1166.089,161.2737, 'Reconstructed Wyrm'), +(@ENTRY,4,4702.308,1212.668,161.2737, 'Reconstructed Wyrm'), +(@ENTRY,5,4733.535,1260.209,169.6348, 'Reconstructed Wyrm'), +(@ENTRY,6,4751.818,1293.699,175.9404, 'Reconstructed Wyrm'), +(@ENTRY,7,4794.479,1345.154,199.5372, 'Reconstructed Wyrm'), +(@ENTRY,8,4812.264,1373.523,219.8613, 'Reconstructed Wyrm'); +-- Fix spawns +UPDATE `creature` SET `position_x`=4685.845,`position_y`=1130.759,`position_z`=150.1177,`spawntimesecs`=120,`spawndist`=0,`MovementType`=0 WHERE `guid`=100211; +DELETE FROM `creature` WHERE `guid` IN (100256,133240,133241); +DELETE FROM `creature_addon` WHERE `guid` IN (100256,133240,133241); diff --git a/sql/updates/world/2012_05_27_05_world_gameobject.sql b/sql/updates/world/2012_05_27_05_world_gameobject.sql new file mode 100644 index 00000000000..66fbfd0afca --- /dev/null +++ b/sql/updates/world/2012_05_27_05_world_gameobject.sql @@ -0,0 +1,13 @@ +-- [QUEST] Attunement to Dalaran +SET @GUID := 320; +-- Adds the gameobject to recognize the zone +DELETE FROM `gameobject` WHERE `id`=300193; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) +VALUES +(@GUID,300193,571,1,1,3343.8,2502.85,-15.1381,5.74342,0,0,0.266617,-0.963802,300,0,1); +-- [SAI] NPC Attunement To Dalaran Kill Credit Bunny 27135 +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=27135; +DELETE FROM `smart_scripts` WHERE `entryorguid`=27135 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) +VALUES +(27135,0,0,0,8,0,100,1,48021,1,0,0,33,27135,0,0,0,0,0,7,0,0,0,0,0,0,0, 'On spellhit - give kill credit - Attunement to Dalaran Kill Credit Bunny'); diff --git a/sql/updates/world/2012_05_27_06_world_creature.sql b/sql/updates/world/2012_05_27_06_world_creature.sql new file mode 100644 index 00000000000..1074465a0be --- /dev/null +++ b/sql/updates/world/2012_05_27_06_world_creature.sql @@ -0,0 +1,113 @@ +-- Tukemuth +DELETE FROM `smart_scripts` WHERE `entryorguid`=32400; +INSERT INTO `smart_scripts` VALUES +(32400,0,0,0,9,0,100,0,0,5,9000,13000,11,50410,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Tukemuth - Cast Tusk Strike'), +(32400,0,1,0,0,0,100,0,9000,17000,15000,22000,11,57066,0,0,0,0,0,0,0,0,0,0,0,0,0, 'Tukemuth - Cast Trample'); +UPDATE `creature_template` SET faction_A=7,faction_H=7,mindmg=2926.0,maxdmg=3542.0,skinloot=70209,spell1=50410,spell2=57066,attackpower=3384,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647 where entry=32400; + +-- Fumblub Gearwind +DELETE FROM `smart_scripts` WHERE `entryorguid`=32358; +INSERT INTO `smart_scripts` VALUES +(32358,0,0,0,0,0,100,0,4000,6000,12000,15000,11,60906,1,0,0,0,0,2,0,0,0,0,0,0,0, 'Fumblub Gearwind - Cast Machine Gun'); +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=2792,maxdmg=3376,spell1=60906,attackpower=3384,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647,type_flags=2048,InhabitType=4 where entry=32358; +UPDATE `creature_addon` SET mount=22719,bytes1=33554432 where guid=151938; + +-- Old Crystalbark +DELETE FROM `smart_scripts` WHERE `entryorguid`=32357; +INSERT INTO `smart_scripts` VALUES +(32357,0,0,0,0,0,100,0,3700,16200,19200,28000,11,50506,0,0,0,0,0,0,0,0,0,0,0,0,0, 'Old Crystalbark - Cast Mark of Detonation'), +(32357,0,1,0,0,0,100,0,1625,8100,9600,14000,11,60903,0,0,0,0,0,0,0,0,0,0,0,0,0, 'Old Crystalbark - Cast Arcane Breath'); +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=3231.0,maxdmg=3309.0,spell1=60903,spell2=50506,attackpower=3214,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647 where entry=32357; + +-- Terror Spinner - Tameable +DELETE FROM `smart_scripts` WHERE `entryorguid`=32475; +INSERT INTO `smart_scripts` VALUES +(32475,0,0,0,0,0,100,0,4000,6000,12000,15000,11,36839,1,0,0,0,0,2,0,0,0,0,0,0,0, 'Terror Spinner - Cast Impairing Poison'), +(32475,0,1,0,0,0,100,0,1625,8100,9600,14000,11,28428,1,0,0,0,0,2,0,0,0,0,0,0,0, 'Terror Spinner - Cast Instant Poison'); +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=3625.0,maxdmg=4301.0,spell1=32475,spell2=28428,attackpower=3963,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=66624,name= 'Terror Spinner' where entry=32475; + +-- Hildana Deathstealer +DELETE FROM `smart_scripts` WHERE `entryorguid`=32495; +INSERT INTO `smart_scripts` VALUES +(32495,0,0,0,0,0,100,1,0,0,0,0,22,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 'Hildana Deathstealer - Enter phase 1'), +(32495,0,1,2,0,1,100,0,3000,6000,4000,6000,11,60991,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Hildana Deathstealer - Cast Lash'), +(32495,0,2,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,0,0,0,0,0,0,0,0, 'Hildana Deathstealer - Enter phase 2'), +(32495,0,3,0,0,2,100,0,3000,5000,9000,11000,11,57547,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Hildana Deathstealer - Cast Touch of the Valkyr'), +(32495,0,4,0,0,2,100,0,12000,13000,13000,15000,22,1,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Hildana Deathstealer - timer back to phase 1'); +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=4715,maxdmg=5474,attackpower=5094,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647 where entry=32495; + +-- Syreian the Bonecarver +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=2926,maxdmg=3542,spell1=38952,spell2=47168,spell3=50092,attackpower=3234,dmg_multiplier=1.0,mechanic_immune_mask=2147483647 where entry=32438; + +-- Icehorn - Tameable +DELETE FROM `smart_scripts` WHERE `entryorguid`=32361; +INSERT INTO `smart_scripts` VALUES +(32361,0,0,0,0,0,100,0,4500,6750,6750,9750,11,57468,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Icehorn - Cast Romp'); +UPDATE `creature_template` SET type_flags= '1',faction_A=14,faction_H=14,mindmg=2792,maxdmg=3376,spell1=57468,attackpower=3084,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=66624,skinloot=70211 where entry=32361; + +-- King Ping +DELETE FROM `smart_scripts` WHERE `entryorguid`=32398; +INSERT INTO `smart_scripts` VALUES +(32398,0,0,0,0,0,100,0,1600,8000,12400,13000,11,61115,0,0,0,0,0,2,0,0,0,0,0,0,0, 'King Ping - Cast Belly Flop'), +(32398,0,1,0,0,0,100,0,800,2600,4200,6800,11,50169,0,0,0,0,0,2,0,0,0,0,0,0,0, 'King Ping - Cast Flipper Thwack'); +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=2792,maxdmg=3376,spell1=61115,spell2=50169,attackpower=3234,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647 WHERE entry=32398; + +-- High Thane Jorfus +DELETE FROM `smart_scripts` WHERE `entryorguid`=32501; +INSERT INTO `smart_scripts` VALUES +(32501,0,0,0,0,0,100,0,1600,3200,6400,12800,11,60950,0,0,0,0,0,2,0,0,0,0,0,0,0, 'High Thane Jorfus - Cast Blood Plague'), +(32501,0,1,0,0,0,100,2,10000,20000,10000,20000,11,60945,0,0,0,0,0,2,0,0,0,0,0,0,0, 'High Thane Jorfus - Cast Blood Strike'), +(32501,0,2,0,0,0,100,0,8000,13000,16000,21000,11,60953,1,0,0,0,0,5,0,0,0,0,0,0,0, 'High Thane Jorfus - Cast Death and Decaye'), +(32501,0,3,0,0,0,100,4,1000,1400,8500,20500,11,60949,0,0,0,0,0,5,0,0,0,0,0,0,0, 'High Thane Jorfus - Cast Death Coil'), +(32501,0,4,0,0,0,100,2,5000,9000,15000,22000,11,60951,0,0,0,0,0,2,0,0,0,0,0,0,0, 'High Thane Jorfus - Cast Frost Strike'); +UPDATE `creature_template` set faction_A=14,faction_H=14,mindmg=4894,maxdmg=5649,spell1=60950,spell2=60945,spell3=60953,spell4=60949,spell5=60951,attackpower=5271,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647 WHERE entry=32501; + +-- Perobas the Bloodthirster +DELETE FROM `smart_scripts` WHERE `entryorguid`=32377; +INSERT INTO `smart_scripts` VALUES +(32377,0,0,0,0,0,100,0,5000,8000,12000,15000,11,50046,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Perobas the Bloodthirster - Cast Gnaw Bone'), +(32377,0,1,0,2,0,100,0,0,50,10000,13000,11,50271,1,0,0,0,0,1,0,0,0,0,0,0,0, 'Perobas the Bloodthirster - Cast Killing Rage'); +UPDATE `creature_template` set faction_A=14,faction_H=14,mindmg=2792,maxdmg=3376,spell1=50046,spell2=52071,attackpower=3084,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=66624,skinloot=70209 where entry=32377; + +-- Aotona - Tameable +UPDATE `creature` SET curhealth=15952 where id=32481; +UPDATE `creature_template` SET exp=2,armor_mod=1.0,minlevel=75,maxlevel=75,faction_A=14,faction_H=14,mindmg=3376,maxdmg=4034,spell1=49865,spell2=51144,attackpower=3705,dmg_multiplier=1.0,mechanic_immune_mask=66624 where entry=32481; + +-- Griegen +DELETE FROM `smart_scripts` WHERE `entryorguid`=32471; +INSERT INTO `smart_scripts` VALUES +(32471,0,0,0,0,0,100,0,5000,8000,9000,12000,11,51334,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Griegen - Cast Smash'); +UPDATE `creature` set curhealth=15952 where id=32471; +UPDATE `creature_template` set exp=2,armor_mod=1.0,minlevel=75,maxlevel=75,faction_A=14,faction_H=14,mindmg=3376,maxdmg=4034,spell1=51334,attackpower=3705,dmg_multiplier=1.0,AIName= 'SmartAI',mechanic_immune_mask=2147483647 where entry=32471; + +-- Seething Hate +UPDATE `creature_template` SET mindmg=2926,maxdmg=3542,attackpower=3234,dmg_multiplier=1.0,mechanic_immune_mask=66624 WHERE entry=32429; + +-- Vigdis the War Maiden +DELETE FROM `creature_template_addon` WHERE entry=32386; +INSERT INTO `creature_template_addon` VALUES +(32386,0,28040,0,0,0,NULL); +UPDATE `creature` SET spawndist=20.0,MovementType=1 WHERE id=32386; +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=2792,maxdmg=3376,attackpower=3084,dmg_multiplier=1.0,mechanic_immune_mask=2147483647,InhabitType=1 where entry=32386; + +-- King Krush - Tameable +UPDATE `creature_template` SET faction_A=14,faction_H=14,mechanic_immune_mask=66624 WHERE entry=32485; + +-- Scarlet Highlord Daion +UPDATE `creature_template` SET faction_A=14,faction_H=14,mindmg=2926,maxdmg=3542,attackpower=3234,dmg_multiplier=1.0,mechanic_immune_mask=66624 WHERE entry=32417; + +-- Crazed Indu'le Survivor +UPDATE `creature_template` SET mindmg=2926,maxdmg=3542,attackpower=3234,dmg_multiplier=1.0,mechanic_immune_mask=66624 WHERE entry=32409; + +-- Grocklar +UPDATE `creature_template` SET mindmg=3137,maxdmg=3777,attackpower=3457,dmg_multiplier=1.0,mechanic_immune_mask=66624 WHERE entry=32422; + +-- Loque'nahak - Tameable +UPDATE `creature_template` SET type_flags= '1',mechanic_immune_mask=66624 WHERE entry=32422; + +-- Zuldrak Sentinel +DELETE FROM `smart_scripts` WHERE `entryorguid`=32447; +INSERT INTO `smart_scripts` VALUES +(32447,0,0,0,0,0,100,0,0,5,9000,13000,11,55196,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Zuldrak Sentinel - Cast Stomp'), +(32447,0,1,0,0,0,100,0,15000,20000,21000,35000,11,54565,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Zuldrak Sentinel - Cast Whammy'); +UPDATE `creature_template` SET mindmg= '3905',maxdmg= '4600',attackpower= '4252',dmg_multiplier= '1.0',mechanic_immune_mask= '66624',spell1= '54565',spell2= '55196',AIName= 'SmartAI' WHERE entry= '32447'; diff --git a/sql/updates/world/2012_05_27_07_world_game_event.sql b/sql/updates/world/2012_05_27_07_world_game_event.sql new file mode 100644 index 00000000000..eff4a9e7652 --- /dev/null +++ b/sql/updates/world/2012_05_27_07_world_game_event.sql @@ -0,0 +1,8 @@ +UPDATE `game_event` SET `start_time` ='2012-06-21 00:01:00' WHERE `eventEntry`=1; -- Midsummer Fire Festival +UPDATE `game_event` SET `start_time` ='2012-09-19 00:01:00' WHERE `eventEntry`=50; -- Pirates' Day +UPDATE `game_event` SET `start_time` ='2012-09-20 00:01:00' WHERE `eventEntry`=24; -- Brewfest +UPDATE `game_event` SET `start_time` ='2012-09-24 00:01:00' WHERE `eventEntry`=11; -- Harvest Festival +UPDATE `game_event` SET `start_time` ='2012-09-18 01:00:00' WHERE `eventEntry`=11; -- Hallow's End +UPDATE `game_event` SET `start_time` ='2012-11-01 01:00:00' WHERE `eventEntry`=51; -- Day of the Dead +UPDATE `game_event` SET `start_time` ='2012-11-18 01:00:00' WHERE `eventEntry`=26; -- Pilgrim's Bounty +UPDATE `game_event` SET `start_time` ='2012-12-15 06:00:00' WHERE `eventEntry`=2; -- Winter Veil diff --git a/sql/updates/world/2012_05_27_07_world_waypoints.sql b/sql/updates/world/2012_05_27_07_world_waypoints.sql new file mode 100644 index 00000000000..bd6aa2d0fc1 --- /dev/null +++ b/sql/updates/world/2012_05_27_07_world_waypoints.sql @@ -0,0 +1,8 @@ +-- Fix pathing for Thiassi the Lightning Bringer +DELETE FROM `creature_addon` WHERE `guid`=106554; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`) VALUES (106554,1065540,1); + +-- bio's screwed up movement for rares. Fix for some +UPDATE `creature` SET `spawndist`=10,`MovementType`=1 WHERE `id` IN (32400,32417,32422,32429); +UPDATE `creature_addon` SET `path_id`=2026020 WHERE `guid`=202602; +UPDATE `waypoint_data` SET `id`=2026020 WHERE `id`=2500060; diff --git a/sql/updates/world/2012_05_28_00_world_creature_ai_scripts.sql b/sql/updates/world/2012_05_28_00_world_creature_ai_scripts.sql new file mode 100644 index 00000000000..aef4e4c6f67 --- /dev/null +++ b/sql/updates/world/2012_05_28_00_world_creature_ai_scripts.sql @@ -0,0 +1,9 @@ +-- Fix recent DB errors +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=27135; -- Attunement To Dalaran Kill Credit +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=32400; -- Tukemuth + +-- Fix recent DB errors (credits to Vincent-Michael) +DELETE FROM `creature_addon` WHERE `guid` = 2593; +DELETE FROM `creature_template_addon` WHERE `entry` = 2676; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(2676,0,0,0,4097,0,NULL); diff --git a/sql/updates/world/2012_05_28_01_world_creature.sql b/sql/updates/world/2012_05_28_01_world_creature.sql new file mode 100644 index 00000000000..d39aa7230b5 --- /dev/null +++ b/sql/updates/world/2012_05_28_01_world_creature.sql @@ -0,0 +1,18 @@ +-- Spawn Deadmire +SET @GUID := 33909; +SET @NPC := @GUID*10; +DELETE FROM `creature` WHERE `id`=4841; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@GUID,4841,1,1,1,0,0,-3949.688,-3471.041,29.15445,4.288023,360,0,0,1902,0,0,0,0,0); -- respawn Deadmire on old guid +-- Set movement info +UPDATE `creature_addon` SET `path_id`=@NPC WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=4841; +-- Add Waypoint Data +DELETE FROM `waypoint_data` WHERE `id`=@NPC; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@NPC,1,-3942.966,-3455.51,28.89743,0,0,0,0,0,0), +(@NPC,2,-3943.117,-3456.498,28.89743,0,0,0,0,0,0), +(@NPC,3,-3948.063,-3467.443,29.64743,0,0,0,0,0,0), +(@NPC,4,-3950.123,-3472.004,29.02243,0,0,0,0,0,0), +(@NPC,5,-3953.303,-3479.054,28.64743,0,0,0,0,0,0), +(@NPC,6,-3953.303,-3479.054,28.64743,0,0,0,0,0,0); diff --git a/sql/updates/world/2012_05_28_02_world_creature.sql b/sql/updates/world/2012_05_28_02_world_creature.sql new file mode 100644 index 00000000000..77da626d89e --- /dev/null +++ b/sql/updates/world/2012_05_28_02_world_creature.sql @@ -0,0 +1,26 @@ +-- Spawn Deadmire +SET @GUID := 202606; +SET @NPC := @GUID*10; +-- Set movement info +UPDATE `creature_addon` SET `path_id`=@NPC WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=32630; +-- Add Waypoint Data +DELETE FROM `waypoint_data` WHERE `id`=@NPC; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@NPC,1,7024.75,-1625.538,957.3694,0,0,0,0,0,0), +(@NPC,2,7025.494,-1624.87,957.3694,0,0,0,0,0,0), +(@NPC,3,7167.578,-1501.694,962.5693,0,0,0,0,0,0), +(@NPC,4,7440.402,-1295.861,997.2911,0,0,0,0,0,0), +(@NPC,5,7210.958,-1046.892,1006.18,0,0,0,0,0,0), +(@NPC,6,6998.465,-1076.847,1024.819,0,0,0,0,0,0), +(@NPC,7,6874.249,-1097.382,927.736,0,0,0,0,0,0), +(@NPC,8,6614.792,-875.7547,812.7645,0,0,0,0,0,0), +(@NPC,9,6563.275,-811.7673,749.8757,0,0,0,0,0,0), +(@NPC,10,6299.502,-797.577,529.1257,0,0,0,0,0,0), +(@NPC,11,6194.549,-1013.144,501.5424,0,0,0,0,0,0), +(@NPC,12,6319.254,-1251.661,468.6258,0,0,0,0,0,0), +(@NPC,13,6309.161,-1537.857,615.0423,0,0,0,0,0,0), +(@NPC,14,6748.211,-1664.307,919.3118,0,0,0,0,0,0), +(@NPC,15,6913.308,-1725.261,954.7917,0,0,0,0,0,0), +(@NPC,16,7167.578,-1501.694,962.5693,0,0,0,0,0,0), +(@NPC,17,7440.402,-1295.861,997.2911,0,0,0,0,0,0); diff --git a/sql/updates/world/2012_05_28_03_waypoint_data.sql b/sql/updates/world/2012_05_28_03_waypoint_data.sql new file mode 100644 index 00000000000..aa0e0ddd5ef --- /dev/null +++ b/sql/updates/world/2012_05_28_03_waypoint_data.sql @@ -0,0 +1,3 @@ +-- correct waypointid to guid*10 +UPDATE `waypoint_data` SET `id`=2026020 WHERE `id`=2026060; +UPDATE `creature_addon` SET `path_id`=2026020 WHERE `guid`=202602; diff --git a/sql/updates/world/2012_05_28_04_world_creature_template.sql b/sql/updates/world/2012_05_28_04_world_creature_template.sql new file mode 100644 index 00000000000..d8c9a15e412 --- /dev/null +++ b/sql/updates/world/2012_05_28_04_world_creature_template.sql @@ -0,0 +1,3 @@ +-- malcroms request +UPDATE `creature_template` SET `MovementType`=0 WHERE `entry`=32630; +UPDATE `creature` SET `MovementType`=2 WHERE `id`=32630; diff --git a/sql/updates/world/2012_05_28_05_world_creature.sql b/sql/updates/world/2012_05_28_05_world_creature.sql new file mode 100644 index 00000000000..c7d4af5b494 --- /dev/null +++ b/sql/updates/world/2012_05_28_05_world_creature.sql @@ -0,0 +1,216 @@ +-- Guid for inserts +SET @NEXT := 134704; -- need 129 +-- Correct Phasing/Quest relation for the Argent Vanguard,Crusader's Pinnacle,Scourgeholme,The Breach,Valley of Echoes and Pit of Fiends (I didn't use Phase IV spell id: 57675 since it sets phase to one,I don't see the point since that's the default phase) +-- The spells are Argent Vanguard Chapter I (id: 57673),Argent Vanguard Chapter II (id: 57569) and Argent Vanguard Chapter III (id: 57674) +DELETE FROM `spell_area` WHERE `spell` IN (57673,57569,57674); +INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_start_active`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`) VALUES +(57673,4501,0,0,13070,0,0,2,1), +(57673,4504,0,0,13070,0,0,2,1), +(57673,4505,0,0,13086,0,0,2,1), +(57673,4506,0,0,13086,0,0,2,1), +(57673,4580,0,0,13086,0,0,2,1), +(57673,4593,0,0,13086,0,0,2,1), +(57569,4501,13070,0,13086,0,0,2,1), +(57569,4504,13070,0,13086,0,0,2,1), +(57674,4501,13086,0,13141,0,0,2,1), +(57674,4504,13086,0,13141,0,0,2,1), +(57674,4505,13086,0,13141,0,0,2,1), +(57674,4506,13086,0,13141,0,0,2,1), +(57674,4593,13086,0,13141,0,0,2,1), +(57674,4580,13086,0,13141,0,0,2,1); +-- Phase for objects in Crusader's Pinnacle (Scourge controlled) +UPDATE `gameobject` SET `phaseMask`=194 WHERE `id` IN (192936,192938,192953,192954,192955,192956,192957,192982,192995,193003,192958,192959,192960,192961,192962,192963,192964,192965,192966,192967,192968,192969,192970,192971,192972,192973,192974,192975,192976,192977,192978,192979,192980,192981,192983,192985,192986,192987,192988,192989,192990,192991,192994,192934,192935,192992,192993,193002,192997,192996,192999,193000,193001,192936,192937); +-- Phase for a few objects in Scourgeholme +UPDATE `gameobject` SET `phaseMask`=195 WHERE `id` IN (192576,192577,192575,192579,192578); +-- Misc Objects in Argent Vanguard to be visible in all phases +UPDATE `gameobject` SET `phaseMask`=195 WHERE `guid` IN (62021,62027,62356,62359,62353,62071,62061); +-- Duplicates of the objects in Argent Vanguard,no need to have 2 of each if they have no special interaction with a particular phase +DELETE FROM `gameobject` WHERE `guid` IN (100101,100484,100097,100433,100098,100432,100104,100485); +-- Phase for the walls and towers for all phases except during "The last line of defense" +UPDATE `gameobject` SET `phaseMask`=131 WHERE `guid` IN (61089,61066,61027,61056,61004,60999,60996,60976); +-- Phase for walls during "The last line of defense",they need a separate object here because they interact directly with the phase +UPDATE `gameobject` SET `phaseMask`=64 WHERE `guid` IN (100441,100440,100438,100439,100437,100436,100435,100434); +-- Phase for objects in The Breach after "The last line of defense" +UPDATE `gameobject` SET `phaseMask`=129 WHERE `id` IN (192797,192798,192799,192800,192801,192802,192803,192804,192805); +-- Phase for objects in The Breach before "The last line of defense" +UPDATE `gameobject` SET `phaseMask`=66 WHERE `id` IN (192161,192162,192166,192806,192807,192808,192809,192810,192811,192812,192813,192814,192815,192816,192817); +-- Phase for NPCs in Argent Vanguard that should be in all phases (except during "The last line of defense) +UPDATE `creature` SET `phaseMask`=131 WHERE `guid` IN (121664,124618,124483,121684,121671,121696,121668,121693,121669,121677,121697,121666,121662,121678,121670,121680,121685,121683,121665,121682,121686,121663,121695,124527,124491,124661,123618,124497,124323,124340,124332,207301,207298,207296,207297,207299,207300,124442); +-- Same as with the objects,delete duplicate creatures that have no direct interaction with a particular phase,a single creature can fulfill that role. +DELETE FROM `creature` WHERE `guid` IN (207239,207264,207260,207251,207245,207256,207242,207254,207243,207246,207257,207241,207237,207247,207244,207248,207252,207250,207240,207249,207253,207238,207255,207263,207261,207265,207258,207262,207259); +-- Phase for NPCs only present until "The last line of defense" +UPDATE `creature` SET `phaseMask`=2 WHERE `guid` IN (207229,207228,207234,207233,207232,207235,207236,207227,207222,207230,207231,207223,202409,207225,207226); +-- Phase for Siegemaster Fezzik (He is the only one present up until and during "the last line of defense") +UPDATE `creature` SET `phaseMask`=66 WHERE `guid`=207224; +-- Phase for NPCs in the Valley of Echoes before "The last line of defense" +UPDATE `creature` SET `phaseMask`=2 WHERE `guid` IN (207290,207289,207288,207294,207293,207295,207284,207282,207286,207285,207287,207291,207283,207281,207292,207280); +-- Phase for Creatures on the Valley of Echoes before "The last line of defense" +UPDATE `creature` SET `phaseMask`=2 WHERE `id` IN (30206,30273); +-- Phase for mobs and NPCs in the Valley of Echoes and The breach after "The last line of defense" +UPDATE `creature` SET `phaseMask`=129 WHERE `guid` IN (124320,124302,124297,124317,124338,124333,124329,124341,124301,124307,124319,124339,124337,124324,124298,124308,124303,124302,124320,124330,124326,124309,124335,124318,124299,124311,124310,124325,124327,124300,124315,124314,124313,124312,124321,124336,124334,124331,124328,121679,121667,121681,121694,121700,121692,203393,121698,121672); +-- Set correct faction for Crusade Architect Silas +UPDATE `creature_template` SET `faction_H`=2070,`faction_A`=2070 WHERE `entry`=30686; +-- Mount for Highlord Tirion Fordring in Argent Vanguard after "the last line of defense" +DELETE FROM `creature_template_addon` WHERE `entry`=30677; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(30677,0,2325,0,0,0,NULL); +-- Phase for Father Gustav in Valley of Echoes after "the last line of defense" +UPDATE `creature` SET `phaseMask`=128 WHERE `id`=30683; +-- Lich King flag,non attackable unless he engages first +UPDATE `creature_template` SET `unit_flags`=256 WHERE `entry`=30443; +-- Set right exp value and level for Underking Talonox +UPDATE `creature_template` SET `exp`=2,`minlevel`=79,`maxlevel`=79 WHERE `entry`=30830; +-- Set the right phase for the already existing creatures (Including Captured crusaders) +UPDATE `creature` SET `phaseMask`=1 WHERE `id` IN (31037,31039,31043,31040); +UPDATE `creature` SET `phaseMask`=2 WHERE `id` IN (30544,30407); +-- Set flag extra to 64 for creatures in Scourgeholme during the first phase,they should not give XP. +UPDATE `creature_template` SET `flags_extra`=64 WHERE `entry` IN (30544,30407); +-- Set right inhabit type for the second phase version of Wrathstrike Gargoyle (They should be able to fly) +UPDATE `creature_template` SET `InhabitType`=7 WHERE `entry`=30482; +-- Set right faction for previously not spawned creatures +UPDATE `creature_template` SET `faction_H`=2068,`faction_A`=2068 WHERE `entry` IN (30541,30203,30543,30202,30482,30830,30831,30829,30443); +-- ---------------- +-- -- Spawnfixes -- +-- ---------------- +-- Add the right mobs for each phase,they have a different id for each phase. Some mobs are only on 2 phases,not all 3 (Reanimated crusader and Gargoyles). They have the exact same points as their already spawned counterparts which belong to the final phase. +-- NOTE: The ones with a currentwaypoint set have it simply because that's the waypoint the of their already spawned counterpart. I use it simply as a guideline for me to create the paths for all these new ones and its changed back to 0 after I set the new paths with creature_addon later in this SQL. +DELETE FROM `creature` WHERE `id` IN (30596,30686,30714,30677,30443,30829,30830,30831,30203,30543,30202,30541,30482,30333,30205); +DELETE FROM `creature` WHERE `guid` BETWEEN @NEXT+83 and @NEXT+89 AND `id`=30544; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`MovementType`) VALUES +-- Add missing creatures (Highlord Tirion Fordring in Argent Vanguard after "the last line of defense",The Ebon Watcher,Crusade Architect Silas and Crusade Engineer Spitzpatrick in Valley of Echoes after "the last line of defense") +(@NEXT,30596,571,1,128,6376.657227,239.053055,396.047028,4.8044,300,0,0,0), +(@NEXT+1,30686,571,1,128,6370.632324,232.238022,396.046051,1.352186,300,0,0,0), +(@NEXT+2,30714,571,1,128,6371.689941,239.699265,396.899902,4.792617,300,0,0,0), +(@NEXT+3,30677,571,1,128,6259.583496,50.420799,388.508667,0.846391,300,0,0,0), +-- Add missing unique creatures in Scorugeholme (The Lich king,Salranax the Flesh Render,High Priest Yath'amon and Underking Talonox -- One for each phase they are in,since they are hostile mobs) +(@NEXT+4,30443,571,1,2,6697.528809,583.609131,428.332916,4.108414,300,0,0,0), +(@NEXT+5,30829,571,1,2,6838.717285,594.347046,426.230652,4.020655,300,0,0,0), +(@NEXT+6,30831,571,1,2,6869.587891,422.763397,470.783386,1.087875,300,0,0,0), +(@NEXT+7,30830,571,1,2,7211.243652,667.650146,488.187103,2.689305,300,0,0,0), +(@NEXT+8,30829,571,1,128,6838.717285,594.347046,426.230652,4.020655,300,0,0,0), +(@NEXT+9,30831,571,1,128,6869.587891,422.763397,470.783386,1.087875,300,0,0,0), +(@NEXT+10,30830,571,1,128,7211.243652,667.650146,488.187103,2.689305,300,0,0,0), +-- Forgotten Depths High Priest +(@NEXT+11,30203,571,1,2,6879.92,493.899,467.957,1.67552,300,0,0,0), +(@NEXT+12,30203,571,1,2,6916.07,467.629,468.799,0.977384,300,0,0,0), +(@NEXT+13,30203,571,1,2,6858.02,453.902,471.767,4.7822,300,0,0,0), +(@NEXT+14,30203,571,1,2,6835.59,414.643,471.77,0.802851,300,0,0,0), +(@NEXT+15,30203,571,1,2,6903.22,430.778,471.764,3.56047,300,0,0,0), +(@NEXT+16,30203,571,1,2,6881.51,391.672,471.771,1.93731,300,0,0,0), +(@NEXT+17,30203,571,1,2,6877.89,665.768,425.523,1.29154,300,0,0,0), +(@NEXT+18,30203,571,1,2,6553.27,579.069,419.185,3.90954,300,0,0,0), +(@NEXT+19,30203,571,1,2,6560.22,584.094,419.185,0.645772,300,0,0,0), +(@NEXT+20,30203,571,1,2,6747.13,456.848,419.284,1.39626,300,0,0,0), +(@NEXT+21,30203,571,1,2,7062.78,521.156,526.362,5.75959,300,0,0,0), +(@NEXT+22,30203,571,1,2,7068.11,477.927,530.313,0.558505,300,0,0,0), +(@NEXT+23,30203,571,1,2,6689.02,570.998,424.525,3.9968,300,0,0,0), +(@NEXT+24,30203,571,1,2,6745.99,449.016,419.284,4.4855,300,0,0,0), +(@NEXT+25,30203,571,1,2,6809.11,843.341,381.335,3.23154,300,0,1217160,2), +(@NEXT+26,30203,571,1,2,6901.58,727.055,420.546,3.24233,300,0,1217170,2), +(@NEXT+27,30203,571,1,2,7002.27,602.799,476.138,5.93303,300,0,1217200,2), +(@NEXT+28,30543,571,1,128,6879.92,493.899,467.957,1.67552,300,0,0,0), +(@NEXT+29,30543,571,1,128,6916.07,467.629,468.799,0.977384,300,0,0,0), +(@NEXT+30,30543,571,1,128,6858.02,453.902,471.767,4.7822,300,0,0,0), +(@NEXT+31,30543,571,1,128,6835.59,414.643,471.77,0.802851,300,0,0,0), +(@NEXT+32,30543,571,1,128,6903.22,430.778,471.764,3.56047,300,0,0,0), +(@NEXT+33,30543,571,1,128,6881.51,391.672,471.771,1.93731,300,0,0,0), +(@NEXT+34,30543,571,1,128,6877.89,665.768,425.523,1.29154,300,0,0,0), +(@NEXT+35,30543,571,1,128,6553.27,579.069,419.185,3.90954,300,0,0,0), +(@NEXT+36,30543,571,1,128,6560.22,584.094,419.185,0.645772,300,0,0,0), +(@NEXT+37,30543,571,1,128,6747.13,456.848,419.284,1.39626,300,0,0,0), +(@NEXT+38,30543,571,1,128,7062.78,521.156,526.362,5.75959,300,0,0,0), +(@NEXT+39,30543,571,1,128,7068.11,477.927,530.313,0.558505,300,0,0,0), +(@NEXT+40,30543,571,1,128,6689.02,570.998,424.525,3.9968,300,0,0,0), +(@NEXT+41,30543,571,1,128,6745.99,449.016,419.284,4.4855,300,0,0,0), +(@NEXT+42,30543,571,1,128,6809.11,843.341,381.335,3.23154,300,0,1217160,2), +(@NEXT+43,30543,571,1,128,6901.58,727.055,420.546,3.24233,300,0,1217170,2), +(@NEXT+44,30543,571,1,128,7002.27,602.799,476.138,5.93303,300,0,1217200,2), +-- Reanimated Crusader +(@NEXT+45,30202,571,1,128,6770.55,386.311,421.153,2.7317,300,5,0,1), +(@NEXT+46,30202,571,1,128,6655.04,328.894,442.276,0.929563,300,5,0,1), +(@NEXT+47,30202,571,1,128,6448.62,618.154,432.265,2.1122,300,5,0,1), +(@NEXT+48,30202,571,1,128,6471.01,562.99,438.4,3.5549,300,5,0,1), +(@NEXT+49,30202,571,1,128,6448.03,608.829,433.982,1.32629,300,5,0,1), +(@NEXT+50,30202,571,1,128,6526.88,512.588,412.274,2.77181,300,5,0,1), +(@NEXT+51,30202,571,1,128,6513.35,523.34,415.136,0.501217,300,5,0,1), +(@NEXT+52,30202,571,1,128,6556.12,636.946,408.191,1.22528,300,5,0,1), +(@NEXT+53,30202,571,1,128,6697.52,476.907,401.588,2.99677,300,5,0,1), +(@NEXT+54,30202,571,1,128,6704.82,441.489,406.499,3.35221,300,5,0,1), +(@NEXT+55,30202,571,1,128,6723.74,417.997,412.953,4.18409,300,5,0,1), +(@NEXT+56,30202,571,1,128,6644.93,422.78,401.853,3.19711,300,5,0,1), +(@NEXT+57,30202,571,1,128,6654.72,492.468,398.206,2.81552,300,5,0,1), +(@NEXT+58,30202,571,1,128,6630.65,458.047,398.995,5.84132,300,5,0,1), +(@NEXT+59,30202,571,1,128,6661.41,584.323,408.676,0.785398,300,5,0,1), +(@NEXT+60,30202,571,1,128,6518.07,616.422,410.051,2.1325,300,5,0,1), +(@NEXT+61,30202,571,1,128,6514.78,664.2,399.383,0.291176,300,5,0,1), +(@NEXT+62,30202,571,1,128,6563.32,539.29,404.559,0.919091,300,5,0,1), +(@NEXT+63,30202,571,1,128,6617.92,519.797,396.795,1.55615,300,5,0,1), +(@NEXT+64,30202,571,1,128,6643.92,633.926,404.904,1.84373,300,5,0,1), +(@NEXT+65,30202,571,1,128,6592.97,620.213,408.135,1.80125,300,5,0,1), +(@NEXT+66,30202,571,1,128,6707.83,535.834,405.493,5.84095,300,5,0,1), +(@NEXT+67,30202,571,1,128,6758.07,512.831,410.903,2.78648,300,5,0,1), +(@NEXT+68,30202,571,1,128,6764.6,535.115,415.201,3.48219,300,5,0,1), +(@NEXT+69,30202,571,1,128,6669.68,527.603,401.525,5.13205,300,5,0,1), +(@NEXT+70,30202,571,1,128,6613,590.876,403.789,2.88047,300,5,0,1), +(@NEXT+71,30202,571,1,128,6545.45,535.57,407.359,1.50529,300,5,0,1), +(@NEXT+72,30202,571,1,128,6623.12,684.658,405.968,4.4761,300,5,0,1), +(@NEXT+73,30202,571,1,128,6584.43,679.969,406.644,2.11574,300,5,0,1), +(@NEXT+74,30202,571,1,128,6576.55,460.06,408.104,0.763302,300,5,0,1), +(@NEXT+75,30202,571,1,128,6606.58,489.339,398.158,5.60417,300,5,0,1), +(@NEXT+76,30202,571,1,128,6563.66,505.381,403.489,0.430917,300,5,0,1), +(@NEXT+77,30202,571,1,128,6579.71,401.572,416.112,6.10437,300,5,0,1), +(@NEXT+78,30202,571,1,128,6632.51,382.456,412.855,5.91518,300,5,0,1), +(@NEXT+79,30202,571,1,128,6721.48,346.299,424.582,5.91108,300,5,0,1), +(@NEXT+80,30202,571,1,128,6657.63,385.761,411.832,2.05191,300,5,0,1), +(@NEXT+81,30202,571,1,128,6709.57,384.33,414.698,3.57468,300,5,0,1), +(@NEXT+82,30202,571,1,128,6722.58,492.852,405.603,5.6035,300,5,0,1), +-- Forgotten Depths Underking +(@NEXT+83,30544,571,1,2,6962.62,734.955,445.296,4.4855,300,0,0,0), +(@NEXT+84,30544,571,1,2,7056.29,572.491,497.073,2.23402,300,0,0,0), +(@NEXT+85,30544,571,1,2,7005.75,714.752,468.614,3.07178,300,0,0,0), +(@NEXT+86,30544,571,1,2,6809.11,843.341,381.335,5.7554,300,0,1217280,0), +(@NEXT+87,30544,571,1,2,6437.59,604.262,439.155,0.369627,300,0,1217310,2), +(@NEXT+89,30544,571,1,2,7002.27,602.799,476.138,5.7192,300,0,1217350,0), +(@NEXT+90,30541,571,1,128,6962.62,734.955,445.296,4.4855,300,0,0,0), +(@NEXT+91,30541,571,1,128,7056.29,572.491,497.073,2.23402,300,0,0,0), +(@NEXT+92,30541,571,1,128,7005.75,714.752,468.614,3.07178,300,0,0,0), +(@NEXT+93,30541,571,1,128,6760.42,515.039,411.837,3.66099,300,0,1217270,2), +(@NEXT+94,30541,571,1,128,6809.11,843.341,381.335,5.7554,300,0,1217280,0), +(@NEXT+95,30541,571,1,128,7002.27,602.799,476.138,5.7192,300,0,1217350,0), +(@NEXT+96,30541,571,1,128,6769.89,628.623,425.97,-1.65443,300,0,1217290,2), +(@NEXT+97,30541,571,1,128,6697.87,429.598,406.569,1.77104,300,0,1217300,2), +(@NEXT+98,30541,571,1,128,6437.59,604.262,439.155,0.369627,300,0,1217310,2), +(@NEXT+99,30541,571,1,128,6622.62,585.661,402.875,5.61246,300,0,1217320,2), +(@NEXT+100,30541,571,1,128,6710.23,685.938,408.296,3.24837,300,0,1217330,2), +(@NEXT+101,30541,571,1,128,6575.6,465.094,407.446,2.69257,300,0,1217360,2), +(@NEXT+102,30541,571,1,128,6641.92,396.595,408.673,2.55359,300,0,1217370,2), +-- Wrathstrike Gargoyle +(@NEXT+103,30482,571,1,128,7059.52,455.611,581.574,3.35148,300,0,1217550,2), +(@NEXT+104,30482,571,1,128,7009.05,544.408,610.468,3.23607,300,0,1217540,2), +(@NEXT+105,30482,571,1,128,6804.5,702.568,436.191,0.0303077,300,0,1217530,2), +(@NEXT+106,30482,571,1,128,6799.31,642.302,459.819,3.88908,300,0,1217520,2), +(@NEXT+107,30482,571,1,128,6753.66,410.408,446.625,3.19529,300,0,1217510,2), +(@NEXT+108,30482,571,1,128,6597.14,566.743,445.037,1.40898,300,0,1217500,2), +(@NEXT+109,30482,571,1,128,6596.2,564.031,445.111,4.27718,300,0,1217490,2), +(@NEXT+110,30482,571,1,128,6559.29,413.281,462.263,6.13325,300,0,1217480,2), +-- Add missing mobs in the Valley of Echoes during the first phase. The DB has no spawn info on these ones so I added them in a logical number and places,feel free to skip this part if its not "correct" enough. (If anyone has actual sniffs for the location of these mobs feel free to share) +-- Forgotten Depths Slayer for first phase (id:30333,not the same one that should appear during "The last line of defense) +(@NEXT+111,30333,571,1,2,6150.518066,147.111313,372.771057,0.197990,300,7,0,1), +(@NEXT+112,30333,571,1,2,6212.446777,130.204849,377.827118,0.657450,300,7,0,1), +(@NEXT+113,30333,571,1,2,6110.951660,83.364746,371.154419,1.230786,300,7,0,1), +(@NEXT+114,30333,571,1,2,6047.241699,178.537430,353.744293,5.322711,300,7,0,1), +(@NEXT+115,30333,571,1,2,6182.750000,199.942261,380.134705,4.996765,300,7,0,1), +(@NEXT+116,30333,571,1,2,6219.042480,236.113785,388.062317,5.134206,300,7,0,1), +(@NEXT+117,30333,571,1,2,6421.106445,188.232880,395.621826,2.247868,300,7,0,1), +(@NEXT+118,30333,571,1,2,6351.036621,91.049683,392.077698,1.969049,300,7,0,1), +(@NEXT+119,30333,571,1,2,6264.502930,147.837006,383.335876,2.346035,300,7,0,1), +-- Forgotten Depths Acolyte +(@NEXT+120,30205,571,1,2,6278.386230,199.642899,385.989258,5.377527,300,0,0,0), +(@NEXT+121,30205,571,1,2,6229.345703,133.398743,379.961639,3.759608,300,0,0,0), +(@NEXT+122,30205,571,1,2,6087.062012,136.313293,367.117310,4.827752,300,0,0,0), +(@NEXT+123,30205,571,1,2,6127.606445,172.50610,370.652832,6.190416,300,0,0,0), +(@NEXT+124,30205,571,1,2,6149.881836,220.209808,379.919403,5.361032,300,0,0,0), +(@NEXT+125,30205,571,1,2,6422.211426,148.303436,395.890137,1.964183,300,0,0,0), +(@NEXT+126,30205,571,1,2,6375.815918,81.636124,394.968140,2.337249,300,0,0,0), +(@NEXT+127,30205,571,1,2,6333.330566,29.062647,389.581329,1.508653,300,0,0,0), +(@NEXT+128,30205,571,1,2,6130.472656,172.082047,370.962646,5.695776,300,0,0,0); diff --git a/sql/updates/world/2012_05_28_06_world_creature_addon.sql b/sql/updates/world/2012_05_28_06_world_creature_addon.sql new file mode 100644 index 00000000000..a2b573da10a --- /dev/null +++ b/sql/updates/world/2012_05_28_06_world_creature_addon.sql @@ -0,0 +1,2 @@ +-- Delete forgotten data from creature_addon +DELETE FROM `creature_addon` WHERE `guid` IN (207262,207257,207254,207251,207246,207243,207241,207237); diff --git a/sql/updates/world/2012_05_28_06_world_waypoint_data.sql b/sql/updates/world/2012_05_28_06_world_waypoint_data.sql new file mode 100644 index 00000000000..1c738cacdc9 --- /dev/null +++ b/sql/updates/world/2012_05_28_06_world_waypoint_data.sql @@ -0,0 +1,524 @@ +-- The following are the paths for the newly added mobs that have the same spawn spot as a mob (different phase and id) that already had a path. The paths are exactly the same as their already spawned counterparts. +-- Pathing for newly added Wrathstrike Gargoyles +-- ----------------------------------------------------------------------------------------------------------- +SET @NEXT := 134704; +-- Wrathstrike Gargoyle 1 +SET @NPC = @NEXT+103; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7060.05,455.727,581.492,0,0,0,100,0), +(@PATH,2,6982.99,465.858,581.492,0,0,0,100,0), +(@PATH,3,6963.94,516.342,581.492,0,0,0,100,0), +(@PATH,4,7012.51,555.944,581.492,0,0,0,100,0), +(@PATH,5,7062.92,517.784,566.464,0,0,0,100,0), +(@PATH,6,7074.5,487.171,566.464,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217550; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 2 +SET @NPC = @NEXT+104; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6975.12,457.238,608.122,0,0,0,100,0), +(@PATH,2,6994.13,442.679,608.122,0,0,0,100,0), +(@PATH,3,7024.58,437.239,608.122,0,0,0,100,0), +(@PATH,4,7055.78,456.622,580.705,0,0,0,100,0), +(@PATH,5,7069.78,488.277,580.705,0,0,0,100,0), +(@PATH,6,7057.18,540.235,608.205,0,0,0,100,0), +(@PATH,7,6978.62,537.405,608.205,0,0,0,100,0), +(@PATH,8,6960.95,489.864,595.233,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217540; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 3 +SET @NPC = @NEXT+105; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6817.71,701.731,436.81,0,0,0,100,0), +(@PATH,2,6839.81,671.33,438.476,0,0,0,100,0), +(@PATH,3,6771.48,625.298,444.032,0,0,0,100,0), +(@PATH,4,6729.31,607.063,451.504,0,0,0,100,0), +(@PATH,5,6689.26,569.483,444.032,0,0,0,100,0), +(@PATH,6,6664.17,580.683,449.976,0,0,0,100,0), +(@PATH,7,6657.52,638.465,440.893,0,0,0,100,0), +(@PATH,8,6664.19,665.048,444.032,0,0,0,100,0), +(@PATH,9,6735.33,692.836,433.938,0,0,0,100,0), +(@PATH,10,6741.25,694.33,433.56,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217530; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 4 +SET @NPC = @NEXT+106; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6808.92,649.929,459.327,0,0,0,100,0), +(@PATH,2,6779.63,606.717,465.077,0,0,0,100,0), +(@PATH,3,6799.14,541.206,474.66,0,0,0,100,0), +(@PATH,4,6863.37,520.467,465.077,0,0,0,100,0), +(@PATH,5,6900.8,554.799,459.216,0,0,0,100,0), +(@PATH,6,6904.96,624.433,471.549,0,0,0,100,0), +(@PATH,7,6860.9,661.477,465.077,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217520; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 5 +SET @NPC = @NEXT+107; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6764.29,413.94,446.625,0,0,0,100,0), +(@PATH,2,6727.13,417.659,446.625,0,0,0,100,0), +(@PATH,3,6709.2,445.43,446.625,0,0,0,100,0), +(@PATH,4,6714.21,476.942,446.625,0,0,0,100,0), +(@PATH,5,6760.44,491.312,446.625,0,0,0,100,0), +(@PATH,6,6786.47,463.163,446.625,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217510; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 6 +SET @NPC = @NEXT+108; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6589.56,608.719,445.037,0,0,0,100,0), +(@PATH,2,6536.49,613.397,445.037,0,0,0,100,0), +(@PATH,3,6515.31,571.263,445.037,0,0,0,100,0), +(@PATH,4,6540.83,538.391,445.037,0,0,0,100,0), +(@PATH,5,6561.1,543.055,445.037,0,0,0,100,0), +(@PATH,6,6595.09,559.099,445.037,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217500; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 7 +SET @NPC = @NEXT+109; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6661.58,545.496,432.795,0,0,0,100,0), +(@PATH,2,6659.48,589.326,447.184,0,0,0,100,0), +(@PATH,3,6628.78,594.459,446.434,0,0,0,100,0), +(@PATH,4,6613.69,584.967,446.434,0,0,0,100,0), +(@PATH,5,6595.45,562.222,444.795,0,0,0,100,0), +(@PATH,6,6595.77,535.16,436.934,0,0,0,100,0), +(@PATH,7,6631,528.616,450.823,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217490; +-- ----------------------------------------------------------------------------------------------------------- +-- Wrathstrike Gargoyle 8 +SET @NPC = @NEXT+110; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6585.6,408.848,446.514,0,0,0,100,0), +(@PATH,2,6607.57,400.701,444.745,0,0,0,100,0), +(@PATH,3,6647.89,401.573,444.745,0,0,0,100,0), +(@PATH,4,6667.63,414.847,433.912,0,0,0,100,0), +(@PATH,5,6648.87,462.506,444.745,0,0,0,100,0), +(@PATH,6,6592.11,478.371,444.745,0,0,0,100,0), +(@PATH,7,6501.26,474.703,444.745,0,0,0,100,0), +(@PATH,8,6484.09,430.145,485.097,0,0,0,100,0), +(@PATH,9,6519.88,419.711,485.097,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30482 AND `currentwaypoint`=1217480; +-- ----------------------------------------------------------------------------------------------------------- +-- Pathing for newly added Forgotten Depths Underkings +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 1 +SET @NPC = @NEXT+96; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6788.09,633.101,426.095,0,0,0,100,0), +(@PATH,2,6789.98,619.743,423.47,0,0,0,100,0), +(@PATH,3,6766.65,606.497,423.42,0,0,0,100,0), +(@PATH,4,6740.19,597.458,425.39,0,0,0,100,0), +(@PATH,5,6725.25,595.632,423.432,0,0,0,100,0), +(@PATH,6,6713.96,602.526,423.595,0,0,0,100,0), +(@PATH,7,6720.27,613.862,423.47,0,0,0,100,0), +(@PATH,8,6736.25,614.921,423.545,0,0,0,100,0), +(@PATH,9,6769.89,628.623,425.97,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217290; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 2 +SET @NPC = @NEXT+97; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6698.5,458.598,404.586,0,0,0,100,0), +(@PATH,2,6695.69,473.044,401.838,0,0,0,100,0), +(@PATH,3,6665,494.007,397.863,0,0,0,100,0), +(@PATH,4,6621.27,520.385,397.423,0,0,0,100,0), +(@PATH,5,6601.79,552.183,399.092,0,0,0,100,0), +(@PATH,6,6579.75,536.627,401.438,0,0,0,100,0), +(@PATH,7,6599.6,508.629,398.578,0,0,0,100,0), +(@PATH,8,6627.41,480.195,397.408,0,0,0,100,0), +(@PATH,9,6643.31,442.918,399.225,0,0,0,100,0), +(@PATH,10,6674.23,416.566,405.944,0,0,0,100,0), +(@PATH,11,6697.87,429.598,406.569,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217300; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 3-A +SET @NPC = @NEXT+98; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6395.82,618.184,452.633,0,0,0,100,0), +(@PATH,2,6358.26,637.18,462.167,0,0,0,100,0), +(@PATH,3,6370.71,666.535,453.289,0,0,0,100,0), +(@PATH,4,6375.45,676.189,445.42,0,0,0,100,0), +(@PATH,5,6407.42,688.589,434.416,0,0,0,100,0), +(@PATH,6,6429.66,650.562,435.434,0,0,0,100,0), +(@PATH,7,6461.86,627.093,426.405,0,0,0,100,0), +(@PATH,8,6482.61,623.854,419.051,0,0,0,100,0), +(@PATH,9,6486.97,594.615,420.488,0,0,0,100,0), +(@PATH,10,6457.97,595.352,432.948,0,0,0,100,0), +(@PATH,11,6437.59,604.262,439.155,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217310; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 3-B +SET @NPC = @Next+87; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6395.82,618.184,452.633,0,0,0,100,0), +(@PATH,2,6358.26,637.18,462.167,0,0,0,100,0), +(@PATH,3,6370.71,666.535,453.289,0,0,0,100,0), +(@PATH,4,6375.45,676.189,445.42,0,0,0,100,0), +(@PATH,5,6407.42,688.589,434.416,0,0,0,100,0), +(@PATH,6,6429.66,650.562,435.434,0,0,0,100,0), +(@PATH,7,6461.86,627.093,426.405,0,0,0,100,0), +(@PATH,8,6482.61,623.854,419.051,0,0,0,100,0), +(@PATH,9,6486.97,594.615,420.488,0,0,0,100,0), +(@PATH,10,6457.97,595.352,432.948,0,0,0,100,0), +(@PATH,11,6437.59,604.262,439.155,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30544 AND `currentwaypoint`=1217310; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 4 +SET @NPC = @NEXT+99; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6618.91,606.085,403.839,0,0,0,100,0), +(@PATH,2,6608.22,599.539,403.875,0,0,0,100,0), +(@PATH,3,6613.37,574.047,401.125,0,0,0,100,0), +(@PATH,4,6638.76,543.87,399.563,0,0,0,100,0), +(@PATH,5,6667.59,521.002,401.025,0,0,0,100,0), +(@PATH,6,6697.97,501.482,400.775,0,0,0,100,0), +(@PATH,7,6711.98,522.746,404.353,0,0,0,100,0), +(@PATH,8,6702.31,534.57,405.75,0,0,0,100,0), +(@PATH,9,6679.62,541.533,402.209,0,0,0,100,0), +(@PATH,10,6660.61,557.771,404.938,0,0,0,100,0), +(@PATH,11,6639.28,577.426,402.927,0,0,0,100,0), +(@PATH,12,6622.62,585.661,402.875,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217320; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 5 +SET @NPC = @NEXT+100; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6746.43,700.445,407.534,0,0,0,100,0), +(@PATH,2,6767.77,702.447,407.514,0,0,0,100,0), +(@PATH,3,6780.88,716.948,410.264,0,0,0,100,0), +(@PATH,4,6761.32,729.055,407.659,0,0,0,100,0), +(@PATH,5,6723.36,725.67,406.194,0,0,0,100,0), +(@PATH,6,6706.1,712.006,411.069,0,0,0,100,0), +(@PATH,7,6687.8,701.721,412.302,0,0,0,100,0), +(@PATH,8,6668.08,685.327,409.231,0,0,0,100,0), +(@PATH,9,6660.25,674.05,407.891,0,0,0,100,0), +(@PATH,10,6667.72,662.234,407.017,0,0,0,100,0), +(@PATH,11,6710.23,685.938,408.296,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217330; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 6 +SET @NPC = @NEXT+101; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6552.96,457.401,412.93,0,0,0,100,0), +(@PATH,2,6551.69,432.508,416.436,0,0,0,100,0), +(@PATH,3,6568.85,415.311,415.444,0,0,0,100,0), +(@PATH,4,6572.9,410.44,415.694,0,0,0,100,0), +(@PATH,5,6577.95,406.559,415.694,0,0,0,100,0), +(@PATH,6,6591.15,393.959,416.312,0,0,0,100,0), +(@PATH,7,6624.85,389.377,412.855,0,0,0,100,0), +(@PATH,8,6642.71,398.137,408.048,0,0,0,100,0), +(@PATH,9,6642.51,414.137,403.978,0,0,0,100,0), +(@PATH,10,6613.73,435.694,403.495,0,0,0,100,0), +(@PATH,11,6598.72,453.969,403.196,0,0,0,100,0), +(@PATH,12,6575.6,465.094,407.446,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217360; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 7 +SET @NPC = @NEXT+102; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6665.69,385.118,411.923,0,0,0,100,0), +(@PATH,2,6688.12,372.121,414.309,0,0,0,100,0), +(@PATH,3,6681.71,337.864,421.782,0,0,0,100,0), +(@PATH,4,6711.15,330.663,422.912,0,0,0,100,0), +(@PATH,5,6729,353.407,426.957,0,0,0,100,0), +(@PATH,6,6759.39,371.963,426.169,0,0,0,100,0), +(@PATH,7,6742.83,378.436,419.544,0,0,0,100,0), +(@PATH,8,6710.78,380.507,415.679,0,0,0,100,0), +(@PATH,9,6685.82,397.148,408.809,0,0,0,100,0), +(@PATH,10,6655.42,406.866,405.478,0,0,0,100,0), +(@PATH,11,6641.92,396.595,408.673,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217370; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths Underking 8 +SET @NPC = @NEXT+93; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6751.58,521.709,409.087,0,0,0,100,0), +(@PATH,2,6775.59,535.639,418.22,0,0,0,100,0), +(@PATH,3,6790.69,546.924,424.095,0,0,0,100,0), +(@PATH,4,6797.82,545.099,424.47,0,0,0,100,0), +(@PATH,5,6787.22,530.424,421.059,0,0,0,100,0), +(@PATH,6,6760.42,515.039,411.837,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217270; +-- ----------------------------------------------------------------------------------------------------------- +-- Pathing for newly added Forgotten Depths High Priests. There are A and B versions because only the ones from the last phase were already spawned in DB and had their pathing. This didn't occur with the Forgotten Depths Underkings because their first phase counterpats were already spawned (at least the ones with paths,the rest weren't). 2 of them don't get the current waypoint removed yet because its used for a guideline for creature_formations later. +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths High Priest 1-A +SET @NPC = @NEXT+25; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6845.23,827.966,390.654,0,0,0,100,0), +(@PATH,2,6869.87,814.437,394.231,0,0,0,100,0), +(@PATH,3,6885.91,795.247,398.76,0,0,0,100,0), +(@PATH,4,6889.42,776.747,410.135,0,0,0,100,0), +(@PATH,5,6887.17,765.483,417.106,0,0,0,100,0), +(@PATH,6,6916.54,751.385,415.552,0,0,0,100,0), +(@PATH,7,6922.71,770.234,412.379,0,0,0,100,0), +(@PATH,8,6936.68,795.657,409.292,0,0,0,100,0), +(@PATH,9,6946.95,821.291,405.551,0,0,0,100,0), +(@PATH,10,6940.67,819.911,406.551,0,0,0,100,0), +(@PATH,11,6918.09,776.126,411.879,0,0,0,100,0), +(@PATH,12,6903.68,745.868,416.802,0,0,0,100,0), +(@PATH,13,6892.57,727.713,418.396,0,0,0,100,0), +(@PATH,14,6855.19,723.309,414.328,0,0,0,100,0), +(@PATH,15,6810.95,714.736,409.567,0,0,0,100,0), +(@PATH,16,6778.23,711.31,408.139,0,0,0,100,0), +(@PATH,17,6749.77,708.742,407.159,0,0,0,100,0), +(@PATH,18,6724.11,709.65,409.563,0,0,0,100,0), +(@PATH,19,6720.02,695.631,407.296,0,0,0,100,0), +(@PATH,20,6730.44,731.649,404.319,0,0,0,100,0), +(@PATH,21,6727.1,774.371,385.328,0,0,0,100,0), +(@PATH,22,6722.82,816.964,376.654,0,0,0,100,0), +(@PATH,23,6733.84,849.984,376.012,0,0,0,100,0), +(@PATH,24,6753.25,867.14,376.46,0,0,0,100,0), +(@PATH,25,6786.71,850.127,379.337,0,0,0,100,0), +(@PATH,26,6817.16,840.912,382.21,0,0,0,100,0); +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths High Priest 1-B +SET @NPC = @NEXT+42; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6845.23,827.966,390.654,0,0,0,100,0), +(@PATH,2,6869.87,814.437,394.231,0,0,0,100,0), +(@PATH,3,6885.91,795.247,398.76,0,0,0,100,0), +(@PATH,4,6889.42,776.747,410.135,0,0,0,100,0), +(@PATH,5,6887.17,765.483,417.106,0,0,0,100,0), +(@PATH,6,6916.54,751.385,415.552,0,0,0,100,0), +(@PATH,7,6922.71,770.234,412.379,0,0,0,100,0), +(@PATH,8,6936.68,795.657,409.292,0,0,0,100,0), +(@PATH,9,6946.95,821.291,405.551,0,0,0,100,0), +(@PATH,10,6940.67,819.911,406.551,0,0,0,100,0), +(@PATH,11,6918.09,776.126,411.879,0,0,0,100,0), +(@PATH,12,6903.68,745.868,416.802,0,0,0,100,0), +(@PATH,13,6892.57,727.713,418.396,0,0,0,100,0), +(@PATH,14,6855.19,723.309,414.328,0,0,0,100,0), +(@PATH,15,6810.95,714.736,409.567,0,0,0,100,0), +(@PATH,16,6778.23,711.31,408.139,0,0,0,100,0), +(@PATH,17,6749.77,708.742,407.159,0,0,0,100,0), +(@PATH,18,6724.11,709.65,409.563,0,0,0,100,0), +(@PATH,19,6720.02,695.631,407.296,0,0,0,100,0), +(@PATH,20,6730.44,731.649,404.319,0,0,0,100,0), +(@PATH,21,6727.1,774.371,385.328,0,0,0,100,0), +(@PATH,22,6722.82,816.964,376.654,0,0,0,100,0), +(@PATH,23,6733.84,849.984,376.012,0,0,0,100,0), +(@PATH,24,6753.25,867.14,376.46,0,0,0,100,0), +(@PATH,25,6786.71,850.127,379.337,0,0,0,100,0), +(@PATH,26,6817.16,840.912,382.21,0,0,0,100,0); +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths High Priest 2-A +SET @NPC = @NEXT+26; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6877.06,727.294,415.646,0,0,0,100,0), +(@PATH,2,6840.86,720.367,413.578,0,0,0,100,0), +(@PATH,3,6804.06,715.519,409.067,0,0,0,100,0), +(@PATH,4,6775.7,711.378,408.139,0,0,0,100,0), +(@PATH,5,6775.7,706.114,408.014,0,0,0,100,0), +(@PATH,6,6806.69,710.446,409.317,0,0,0,100,0), +(@PATH,7,6840.86,715.128,414.078,0,0,0,100,0), +(@PATH,8,6885.64,719.654,417.771,0,0,0,100,0), +(@PATH,9,6901.58,727.055,420.546,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30203 AND `currentwaypoint`=1217170; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths High Priest 2-B +SET @NPC = @NEXT+43; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6877.06,727.294,415.646,0,0,0,100,0), +(@PATH,2,6840.86,720.367,413.578,0,0,0,100,0), +(@PATH,3,6804.06,715.519,409.067,0,0,0,100,0), +(@PATH,4,6775.7,711.378,408.139,0,0,0,100,0), +(@PATH,5,6775.7,706.114,408.014,0,0,0,100,0), +(@PATH,6,6806.69,710.446,409.317,0,0,0,100,0), +(@PATH,7,6840.86,715.128,414.078,0,0,0,100,0), +(@PATH,8,6885.64,719.654,417.771,0,0,0,100,0), +(@PATH,9,6901.58,727.055,420.546,0,0,0,100,0); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30543 AND `currentwaypoint`=1217170; +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths High Priest 3-A +SET @NPC = @NEXT+27; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7028.06,593.528,484.848,0,0,0,100,0), +(@PATH,2,7050.86,587.232,490.487,0,0,0,100,0), +(@PATH,3,7088.02,583.536,496.767,0,0,0,100,0), +(@PATH,4,7135.53,587.626,498.11,0,0,0,100,0), +(@PATH,5,7174.15,581.088,498.373,0,0,0,100,0), +(@PATH,6,7200,579.166,498.248,0,0,0,100,0), +(@PATH,7,7217.31,586.021,496.983,0,0,0,100,0), +(@PATH,8,7203.83,615.728,490.388,0,0,0,100,0), +(@PATH,9,7164.62,625.286,496.707,0,0,0,100,0), +(@PATH,10,7126.29,619.13,497.944,0,0,0,100,0), +(@PATH,11,7094.89,587.951,498.017,0,0,0,100,0), +(@PATH,12,7050.28,590.763,490.362,0,0,0,100,0), +(@PATH,13,7013.81,602.295,479.513,0,0,0,100,0), +(@PATH,14,6987.71,624.076,465.805,0,0,0,100,0), +(@PATH,15,6964.91,625.148,460.924,0,0,0,100,0), +(@PATH,16,6944.73,587.153,467.576,0,0,0,100,0), +(@PATH,17,6927.86,556.953,466.828,0,0,0,100,0), +(@PATH,18,6919.79,527.804,467.056,0,0,0,100,0), +(@PATH,19,6907.68,497.326,466.719,0,0,0,100,0), +(@PATH,20,6914.34,512.11,466.681,0,0,0,100,0), +(@PATH,21,6926.01,537.956,466.578,0,0,0,100,0), +(@PATH,22,6938.29,577.003,466.951,0,0,0,100,0), +(@PATH,23,6952.16,594.699,466.951,0,0,0,100,0), +(@PATH,24,6969.78,616.559,463.68,0,0,0,100,0), +(@PATH,25,6985.14,615.594,467.305,0,0,0,100,0), +(@PATH,26,7002.27,602.799,476.138,0,0,0,100,0); +-- ----------------------------------------------------------------------------------------------------------- +-- Forgotten Depths High Priest 3-B +SET @NPC = @NEXT+44; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES (@NPC,@PATH); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7028.06,593.528,484.848,0,0,0,100,0), +(@PATH,2,7050.86,587.232,490.487,0,0,0,100,0), +(@PATH,3,7088.02,583.536,496.767,0,0,0,100,0), +(@PATH,4,7135.53,587.626,498.11,0,0,0,100,0), +(@PATH,5,7174.15,581.088,498.373,0,0,0,100,0), +(@PATH,6,7200,579.166,498.248,0,0,0,100,0), +(@PATH,7,7217.31,586.021,496.983,0,0,0,100,0), +(@PATH,8,7203.83,615.728,490.388,0,0,0,100,0), +(@PATH,9,7164.62,625.286,496.707,0,0,0,100,0), +(@PATH,10,7126.29,619.13,497.944,0,0,0,100,0), +(@PATH,11,7094.89,587.951,498.017,0,0,0,100,0), +(@PATH,12,7050.28,590.763,490.362,0,0,0,100,0), +(@PATH,13,7013.81,602.295,479.513,0,0,0,100,0), +(@PATH,14,6987.71,624.076,465.805,0,0,0,100,0), +(@PATH,15,6964.91,625.148,460.924,0,0,0,100,0), +(@PATH,16,6944.73,587.153,467.576,0,0,0,100,0), +(@PATH,17,6927.86,556.953,466.828,0,0,0,100,0), +(@PATH,18,6919.79,527.804,467.056,0,0,0,100,0), +(@PATH,19,6907.68,497.326,466.719,0,0,0,100,0), +(@PATH,20,6914.34,512.11,466.681,0,0,0,100,0), +(@PATH,21,6926.01,537.956,466.578,0,0,0,100,0), +(@PATH,22,6938.29,577.003,466.951,0,0,0,100,0), +(@PATH,23,6952.16,594.699,466.951,0,0,0,100,0), +(@PATH,24,6969.78,616.559,463.68,0,0,0,100,0), +(@PATH,25,6985.14,615.594,467.305,0,0,0,100,0), +(@PATH,26,7002.27,602.799,476.138,0,0,0,100,0); +-- -------------------------------------------------------------------------------------------------- +-- Create creature formations based on already existing ones. Also remove the final current waypoints. +-- Creature Formation 1-A +-- -------------------------------------------------------------------------------------------------- +SET @LEADER = @NEXT+27; +SET @NPC = @NEXT+89; +DELETE FROM `creature_formations` WHERE `leaderGUID`=@LEADER; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@LEADER,@LEADER,0,0,2), +(@LEADER,@NPC,3,0,2); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30203 AND `currentwaypoint`=1217200; +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30544 AND `currentwaypoint`=1217350; +-- Creature Formation 1-B +SET @LEADER = @NEXT+44; +SET @NPC = @NEXT+95; +DELETE FROM `creature_formations` WHERE `leaderGUID`=@LEADER; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@LEADER,@LEADER,0,0,2), +(@LEADER,@NPC,3,0,2); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30543 AND `currentwaypoint`=1217200; +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217350; +-- Creature Formation 2-A +SET @LEADER = @NEXT+25; +SET @NPC = @NEXT+86; +DELETE FROM `creature_formations` WHERE `leaderGUID`=@LEADER; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@LEADER,@LEADER,0,0,2), +(@LEADER,@NPC,3,0,2); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30203 AND `currentwaypoint`=1217160; +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30544 AND `currentwaypoint`=1217280; +-- Creature Formation 2-B +SET @LEADER = @NEXT+42; +SET @NPC = @NEXT+94; +DELETE FROM `creature_formations` WHERE `leaderGUID`=@LEADER; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@LEADER,@LEADER,0,0,2), +(@LEADER,@NPC,3,0,2); +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30543 AND `currentwaypoint`=1217160; +UPDATE `creature` SET `currentwaypoint`=0 WHERE `id`=30541 AND `currentwaypoint`=1217280; diff --git a/sql/updates/world/2012_05_28_07_world_quest_template.sql b/sql/updates/world/2012_05_28_07_world_quest_template.sql new file mode 100644 index 00000000000..3cdf1895a9d --- /dev/null +++ b/sql/updates/world/2012_05_28_07_world_quest_template.sql @@ -0,0 +1,20 @@ +-- Correct Quest chaining and requirements up until the quest "Crusader's Pinnacle", when the Argent Base in the pinnacle phases in +UPDATE `quest_template` SET `PrevQuestId`=13036, `NextQuestId`=13044, `ExclusiveGroup`=-13008 WHERE `id`=13008; -- Scourge Tactics +UPDATE `quest_template` SET `PrevQuestId`=13036, `NextQuestId`=13044, `ExclusiveGroup`=-13008 WHERE `id`=13039; -- Defending The Vanguard +UPDATE `quest_template` SET `PrevQuestId`=13036, `NextQuestId`=13044, `ExclusiveGroup`=-13008 WHERE `id`=13040; -- Curing The Incurable +UPDATE `quest_template` SET `PrevQuestId`=0, `NextQuestId`=13045, `ExclusiveGroup`=0, `NextQuestIdChain`=13045 WHERE `id`=13044; -- If There Are Survivors +UPDATE `quest_template` SET `PrevQuestId`=13044, `NextQuestId`=13070, `ExclusiveGroup`=0, `NextQuestIdChain`=13070 WHERE `id`=13045; -- Into The Wild Green Yonder +UPDATE `quest_template` SET `Method`=0, `PrevQuestId`=13045, `NextQuestId`=13086, `ExclusiveGroup`=0, `NextQuestIdChain`=13086 WHERE `id`=13070; -- A Cold Front Approaches +UPDATE `quest_template` SET `PrevQuestId`=13070, `NextQuestId`=0, `ExclusiveGroup`=0, `NextQuestidChain`=0 WHERE `id`=13086; -- The Last Line Of Defense +-- Fix restrictions for DK and all rest classes without DK +UPDATE `quest_template` SET `PrevQuestId`=13086, `RequiredClasses`=32,`NextQuestId`=0, `ExclusiveGroup`=0, `NextQuestIdChain`=0 WHERE `id`=13104; -- Once More Unto The Breach, Hero /Death Knight's Special/ +UPDATE `quest_template` SET `PrevQuestId`=13086, `RequiredClasses`=1502,`NextQuestId`=0, `ExclusiveGroup`=0, `NextQuestIdChain`=0 WHERE `id`=13105; -- Once More Unto The Breach, Hero +UPDATE `quest_template` SET `PrevQuestId`=13104, `NextQuestId`=13139, `ExclusiveGroup`=-13122, `NextQuestIdChain`=0 WHERE `id`=13122; -- The Scourgestone +UPDATE `quest_template` SET `PrevQuestId`=13104, `NextQuestId`=13139, `ExclusiveGroup`=-13122, `NextQuestIdChain`=0 WHERE `id`=13118; -- The Purging of Scourgeholme +UPDATE `quest_template` SET `PrevQuestId`=13104, `NextQuestId`=13139, `ExclusiveGroup`=-13122, `NextQuestIdChain`=0 WHERE `id`=13110; -- The Restless Dead +UPDATE `quest_template` SET `PrevQuestId`=13104, `NextQuestId`=13139, `ExclusiveGroup`=-13122, `NextQuestIdChain`=0 WHERE `id`=13125; -- The Air Stands Still +UPDATE `quest_template` SET `PrevQuestId`=13104, `NextQuestId`=13139, `ExclusiveGroup`=-13122, `NextQuestIdChain`=0 WHERE `id`=13130; -- The Stone That Started a Revolution +UPDATE `quest_template` SET `PrevQuestId`=13104, `NextQuestId`=13139, `ExclusiveGroup`=-13122, `NextQuestIdChain`=0 WHERE `id`=13135; -- It Could Kill Us All +UPDATE `quest_template` SET `PrevQuestId`=0, `NextQuestId`=13141, `ExclusiveGroup`=0, `NextQuestIdChain`=13141 WHERE `id`=13139; -- Into The Cold Heart Of Northrend +UPDATE `quest_template` SET `PrevQuestId`=13139, `NextQuestId`=13157, `ExclusiveGroup`=0, `NextQuestIdChain`=13157 WHERE `id`=13141; -- The Battle For Crusader`s Pinnacle +UPDATE `quest_template` SET `PrevQuestId`=13141, `NextQuestId`=0, `ExclusiveGroup`=0, `NextQuestIdChain`=0 WHERE `id`=13135; -- The Crusader's Pinnacle diff --git a/src/server/authserver/Realms/RealmList.cpp b/src/server/authserver/Realms/RealmList.cpp index 245b9c7cc8c..d988b940809 100755 --- a/src/server/authserver/Realms/RealmList.cpp +++ b/src/server/authserver/Realms/RealmList.cpp @@ -31,7 +31,7 @@ void RealmList::Initialize(uint32 updateInterval) UpdateRealms(true); } -void RealmList::UpdateRealm(uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu, uint32 build) +void RealmList::UpdateRealm(uint32 ID, const std::string& name, const std::string& address, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float popu, uint32 build) { // Create new if not exist or update existed Realm& realm = m_realms[name]; @@ -39,7 +39,7 @@ void RealmList::UpdateRealm(uint32 ID, const std::string& name, const std::strin realm.m_ID = ID; realm.name = name; realm.icon = icon; - realm.color = color; + realm.flag = flag; realm.timezone = timezone; realm.allowedSecurityLevel = allowedSecurityLevel; realm.populationLevel = popu; @@ -70,7 +70,7 @@ void RealmList::UpdateRealms(bool init) { sLog->outDetail("Updating Realm List..."); - PreparedStatement *stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST); PreparedQueryResult result = LoginDatabase.Query(stmt); // Circle through results and add them to the realm map @@ -79,18 +79,18 @@ void RealmList::UpdateRealms(bool init) do { Field* fields = result->Fetch(); - uint32 realmId = fields[0].GetUInt32(); - const std::string& name = fields[1].GetString(); + uint32 realmId = fields[0].GetUInt32(); + const std::string& name = fields[1].GetString(); const std::string& address = fields[2].GetString(); - uint32 port = fields[3].GetUInt32(); - uint8 icon = fields[4].GetUInt8(); - uint8 color = fields[5].GetUInt8(); - uint8 timezone = fields[6].GetUInt8(); + uint16 port = fields[3].GetUInt16(); + uint8 icon = fields[4].GetUInt8(); + RealmFlags flag = RealmFlags(fields[5].GetUInt8()); + uint8 timezone = fields[6].GetUInt8(); uint8 allowedSecurityLevel = fields[7].GetUInt8(); - float pop = fields[8].GetFloat(); - uint32 build = fields[9].GetUInt32(); + float pop = fields[8].GetFloat(); + uint32 build = fields[9].GetUInt32(); - UpdateRealm(realmId, name, address, port, icon, color, timezone, (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), pop, build); + UpdateRealm(realmId, name, address, port, icon, flag, timezone, (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), pop, build); if (init) sLog->outString("Added realm \"%s\".", fields[1].GetCString()); diff --git a/src/server/authserver/Realms/RealmList.h b/src/server/authserver/Realms/RealmList.h index 698026876fb..c8407b0fea1 100755 --- a/src/server/authserver/Realms/RealmList.h +++ b/src/server/authserver/Realms/RealmList.h @@ -23,13 +23,26 @@ #include #include "Common.h" +enum RealmFlags +{ + REALM_FLAG_NONE = 0x00, + REALM_FLAG_INVALID = 0x01, + REALM_FLAG_OFFLINE = 0x02, + REALM_FLAG_SPECIFYBUILD = 0x04, + REALM_FLAG_UNK1 = 0x08, + REALM_FLAG_UNK2 = 0x10, + REALM_FLAG_RECOMMENDED = 0x20, + REALM_FLAG_NEW = 0x40, + REALM_FLAG_FULL = 0x80 +}; + // Storage object for a realm struct Realm { std::string address; std::string name; uint8 icon; - uint8 color; + RealmFlags flag; uint8 timezone; uint32 m_ID; AccountTypes allowedSecurityLevel; @@ -58,7 +71,7 @@ public: private: void UpdateRealms(bool init=false); - void UpdateRealm(uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu, uint32 build); + void UpdateRealm(uint32 ID, const std::string& name, const std::string& address, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float popu, uint32 build); RealmMap m_realms; uint32 m_UpdateInterval; diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp index 2698c3e30e1..2537a93fe43 100755 --- a/src/server/authserver/Server/AuthSocket.cpp +++ b/src/server/authserver/Server/AuthSocket.cpp @@ -849,7 +849,7 @@ bool AuthSocket::_HandleRealmList() pkt << i->second.icon; // realm type pkt << lock; // if 1, then realm locked - pkt << i->second.color; // if 2, then realm is offline + pkt << uint8(i->second.flag); // RealmFlags pkt << i->first; pkt << i->second.address; pkt << i->second.populationLevel; @@ -857,6 +857,15 @@ bool AuthSocket::_HandleRealmList() pkt << i->second.timezone; // realm category pkt << uint8(0x2C); // unk, may be realm number/id? + if (i->second.flag & REALM_FLAG_SPECIFYBUILD) + { + // TODO: Make this customizable + pkt << uint8(3); + pkt << uint8(3); + pkt << uint8(5); + pkt << uint16(12340); + } + ++RealmListSize; } diff --git a/src/server/authserver/Server/AuthSocket.h b/src/server/authserver/Server/AuthSocket.h index 0b04c8d015d..edd2b345183 100755 --- a/src/server/authserver/Server/AuthSocket.h +++ b/src/server/authserver/Server/AuthSocket.h @@ -23,19 +23,6 @@ #include "BigNumber.h" #include "RealmSocket.h" -enum RealmFlags -{ - REALM_FLAG_NONE = 0x00, - REALM_FLAG_INVALID = 0x01, - REALM_FLAG_OFFLINE = 0x02, - REALM_FLAG_SPECIFYBUILD = 0x04, - REALM_FLAG_UNK1 = 0x08, - REALM_FLAG_UNK2 = 0x10, - REALM_FLAG_RECOMMENDED = 0x20, - REALM_FLAG_NEW = 0x40, - REALM_FLAG_FULL = 0x80 -}; - // Handle login commands class AuthSocket: public RealmSocket::Session { diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index 86423d53e18..e9ed4bd752d 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -110,6 +110,14 @@ DebugLogMask = 64 SQLDriverLogFile = "" +# +# SQLDriverQueryLogging +# Description: Log SQL queries to the SQLDriverLogFile and console. +# Default: 0 - (Disabled, Query errors only) +# 1 - (Enabled, Full query logging - may have performance impact) + +SQLDriverQueryLogging = 0 + # # LogTimestamp # Description: Append timestamp to the server log file name. diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/server/collision/Management/VMapManager2.cpp index 81b97f5f352..b9f0f25c2f9 100644 --- a/src/server/collision/Management/VMapManager2.cpp +++ b/src/server/collision/Management/VMapManager2.cpp @@ -30,6 +30,7 @@ #include #include #include "DisableMgr.h" +#include "DBCStores.h" using G3D::Vector3; @@ -233,8 +234,8 @@ namespace VMAP { floor = info.ground_Z; ASSERT(floor < std::numeric_limits::max()); - type = info.hitModel->GetLiquidType(); - if (reqLiquidType && !(type & reqLiquidType)) + type = info.hitModel->GetLiquidType(); // entry from LiquidType.dbc + if (reqLiquidType && !(GetLiquidFlags(type) & reqLiquidType)) return false; if (info.hitInstance->GetLiquidLevel(pos, info, level)) return true; @@ -245,7 +246,7 @@ namespace VMAP return false; } - WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags/* Only used when creating the model */) + WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename) { //! Critical section, thread safe access to iLoadedModelFiles TRINITY_GUARD(ACE_Thread_Mutex, LoadedModelFilesLock); @@ -261,7 +262,6 @@ namespace VMAP return NULL; } sLog->outDebug(LOG_FILTER_MAPS, "VMapManager2: loading file '%s%s'", basepath.c_str(), filename.c_str()); - worldmodel->Flags = flags; model = iLoadedModelFiles.insert(std::pair(filename, ManagedModel())).first; model->second.setModel(worldmodel); } diff --git a/src/server/collision/Management/VMapManager2.h b/src/server/collision/Management/VMapManager2.h index 4b66a2e9fc7..1fba108388a 100755 --- a/src/server/collision/Management/VMapManager2.h +++ b/src/server/collision/Management/VMapManager2.h @@ -103,7 +103,7 @@ namespace VMAP bool getAreaInfo(unsigned int pMapId, float x, float y, float& z, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const; bool GetLiquidLevel(uint32 pMapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type) const; - WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags = 0); + WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename); void releaseModelInstance(const std::string& filename); // what's the use of this? o.O diff --git a/src/server/collision/Maps/MapTree.cpp b/src/server/collision/Maps/MapTree.cpp index f94f9bbf52b..f4a3f1c7b30 100644 --- a/src/server/collision/Maps/MapTree.cpp +++ b/src/server/collision/Maps/MapTree.cpp @@ -309,7 +309,7 @@ namespace VMAP #endif if (!iIsTiled && ModelSpawn::readFromFile(rf, spawn)) { - WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name, spawn.flags); + WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name); sLog->outDebug(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : loading %s", spawn.name.c_str()); if (model) { @@ -380,7 +380,7 @@ namespace VMAP if (result) { // acquire model instance - WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name, spawn.flags); + WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name); if (!model) sLog->outError("StaticMapTree::LoadMapTile() : could not acquire WorldModel pointer [%u, %u]", tileX, tileY); diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp index 68ea3ec80cd..e7693a70de4 100644 --- a/src/server/collision/Maps/TileAssembler.cpp +++ b/src/server/collision/Maps/TileAssembler.cpp @@ -335,7 +335,7 @@ namespace VMAP void TileAssembler::exportGameobjectModels() { - FILE* model_list = fopen((iSrcDir + "/" + GAMEOBJECT_MODELS).c_str(), "rb"); + FILE* model_list = fopen((iSrcDir + "/" + "temp_gameobject_models").c_str(), "rb"); FILE* model_list_copy = fopen((iDestDir + "/" + GAMEOBJECT_MODELS).c_str(), "wb"); if (!model_list || !model_list_copy) return; diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/server/collision/Models/GameObjectModel.cpp index 1abbc59a5b0..84c736c22e8 100644 --- a/src/server/collision/Models/GameObjectModel.cpp +++ b/src/server/collision/Models/GameObjectModel.cpp @@ -33,6 +33,8 @@ using G3D::Vector3; using G3D::Ray; using G3D::AABox; +#ifndef NO_CORE_FUNCS + struct GameobjectModelData { GameobjectModelData(const std::string& name_, const AABox& box) : @@ -47,23 +49,30 @@ ModelList model_list; void LoadGameObjectModelList() { + uint32 oldMSTime = getMSTime(); FILE* model_list_file = fopen((sWorld->GetDataPath() + "vmaps/" + VMAP::GAMEOBJECT_MODELS).c_str(), "rb"); if (!model_list_file) + { + sLog->outError("Unable to open '%s' file.", VMAP::GAMEOBJECT_MODELS); return; + } uint32 name_length, displayId; char buff[500]; - while (!feof(model_list_file)) + while (true) { Vector3 v1, v2; - if (fread(&displayId, sizeof(uint32), 1, model_list_file) != 1 - || fread(&name_length, sizeof(uint32), 1, model_list_file) != 1 + if (fread(&displayId, sizeof(uint32), 1, model_list_file) != 1) + if (feof(model_list_file)) // EOF flag is only set after failed reading attempt + break; + + if (fread(&name_length, sizeof(uint32), 1, model_list_file) != 1 || name_length >= sizeof(buff) || fread(&buff, sizeof(char), name_length, model_list_file) != name_length || fread(&v1, sizeof(Vector3), 1, model_list_file) != 1 || fread(&v2, sizeof(Vector3), 1, model_list_file) != 1) { - printf("\nFile '%s' seems to be corrupted", VMAP::GAMEOBJECT_MODELS); + sLog->outError("File '%s' seems to be corrupted!", VMAP::GAMEOBJECT_MODELS); break; } @@ -72,7 +81,10 @@ void LoadGameObjectModelList() ModelList::value_type( displayId, GameobjectModelData(std::string(buff,name_length),AABox(v1,v2)) ) ); } + fclose(model_list_file); + sLog->outString(">> Loaded %u GameObject models in %u ms", uint32(model_list.size()), GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(); } GameObjectModel::~GameObjectModel() @@ -91,7 +103,7 @@ bool GameObjectModel::initialize(const GameObject& go, const GameObjectDisplayIn // ignore models with no bounds if (mdl_box == G3D::AABox::zero()) { - std::cout << "Model " << it->second.name << " has zero bounds, loading skipped" << std::endl; + sLog->outError("GameObject model %s has zero bounds, loading skipped", it->second.name.c_str()); return false; } @@ -171,3 +183,5 @@ bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool Sto } return hit; } + +#endif diff --git a/src/server/collision/Models/WorldModel.cpp b/src/server/collision/Models/WorldModel.cpp index cda34510058..b818232fb32 100644 --- a/src/server/collision/Models/WorldModel.cpp +++ b/src/server/collision/Models/WorldModel.cpp @@ -392,9 +392,8 @@ namespace VMAP uint32 GroupModel::GetLiquidType() const { - // convert to type mask, matching MAP_LIQUID_TYPE_* defines in Map.h if (iLiquid) - return (1 << iLiquid->GetType()); + return iLiquid->GetType(); return 0; } @@ -421,9 +420,6 @@ namespace VMAP bool WorldModel::IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const { - // M2 models are not taken into account for LoS calculation - if (Flags & MOD_M2) - return false; // small M2 workaround, maybe better make separate class with virtual intersection funcs // in any case, there's no need to use a bound tree if we only have one submodel if (groupModels.size() == 1) diff --git a/src/server/collision/Models/WorldModel.h b/src/server/collision/Models/WorldModel.h index dbaccb58573..ebf828e4935 100755 --- a/src/server/collision/Models/WorldModel.h +++ b/src/server/collision/Models/WorldModel.h @@ -113,7 +113,6 @@ namespace VMAP bool GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, LocationInfo &info) const; bool writeFile(const std::string &filename); bool readFile(const std::string &filename); - uint32 Flags; protected: uint32 RootWMOID; std::vector groupModels; diff --git a/src/server/collision/VMapDefinitions.h b/src/server/collision/VMapDefinitions.h index 72a62807b4c..cc796d96dd5 100644 --- a/src/server/collision/VMapDefinitions.h +++ b/src/server/collision/VMapDefinitions.h @@ -24,9 +24,9 @@ namespace VMAP { - const char VMAP_MAGIC[] = "VMAP_4.0"; - const char RAW_VMAP_MAGIC[] = "VMAP004"; // used in extracted vmap files with raw data - const char GAMEOBJECT_MODELS[] = "temp_gameobject_models"; + const char VMAP_MAGIC[] = "VMAP_4.1"; + const char RAW_VMAP_MAGIC[] = "VMAP041"; // used in extracted vmap files with raw data + const char GAMEOBJECT_MODELS[] = "GameObjectModels.dtree"; // defined in TileAssembler.cpp currently... bool readChunk(FILE* rf, char *dest, const char *compare, uint32 len); diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index b9d385ba675..f4555649210 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -33,21 +33,24 @@ class GameObjectAI explicit GameObjectAI(GameObject* g) : go(g) {} virtual ~GameObjectAI() {} - virtual void UpdateAI(const uint32 /*diff*/) {} + virtual void UpdateAI(uint32 /*diff*/) {} virtual void InitializeAI() { Reset(); } virtual void Reset() {}; - static int Permissible(const GameObject* go); + static int Permissible(GameObject const* go); - virtual bool GossipHello(Player* /*player*/) {return false;} - virtual bool GossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) {return false;} - virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) {return false;} - virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) {return false;} - virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) {return false;} - virtual uint32 GetDialogStatus(Player* /*player*/) {return 100;} + virtual bool GossipHello(Player* /*player*/) { return false; } + virtual bool GossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) { return false; } + virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } + virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) { return false; } + virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } + virtual uint32 GetDialogStatus(Player* /*player*/) { return 100; } virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) {} + virtual uint32 GetData(uint32 /*id*/) { return 0; } + virtual void SetData64(uint32 /*id*/, uint64 /*value*/) {} + virtual uint64 GetData64(uint32 /*id*/) { return 0; } virtual void SetData(uint32 /*id*/, uint32 /*value*/) {} virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) {} virtual void OnStateChanged(uint32 /*state*/, Unit* /*unit*/) { } @@ -58,8 +61,8 @@ class NullGameObjectAI : public GameObjectAI public: explicit NullGameObjectAI(GameObject* g); - void UpdateAI(const uint32 /*diff*/) {} + void UpdateAI(uint32 /*diff*/) {} - static int Permissible(const GameObject* /*go*/) { return PERMIT_BASE_IDLE; } + static int Permissible(GameObject const* /*go*/) { return PERMIT_BASE_IDLE; } }; #endif diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp index b78fec7c142..6e2326ca9d5 100755 --- a/src/server/game/AI/CoreAI/GuardAI.cpp +++ b/src/server/game/AI/CoreAI/GuardAI.cpp @@ -23,7 +23,7 @@ #include "World.h" #include "CreatureAIImpl.h" -int GuardAI::Permissible(const Creature* creature) +int GuardAI::Permissible(Creature const* creature) { if (creature->isGuard()) return PERMIT_BASE_SPECIAL; @@ -31,7 +31,7 @@ int GuardAI::Permissible(const Creature* creature) return PERMIT_BASE_NO; } -GuardAI::GuardAI(Creature* creature) : ScriptedAI(creature), i_victimGuid(0), i_state(STATE_NORMAL), i_tracker(TIME_INTERVAL_LOOK) +GuardAI::GuardAI(Creature* creature) : ScriptedAI(creature) { } @@ -40,108 +40,35 @@ bool GuardAI::CanSeeAlways(WorldObject const* obj) if (!obj->isType(TYPEMASK_UNIT)) return false; - std::list t_list = me->getThreatManager().getThreatList(); - for (std::list::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) - { - if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid())) - if (unit == obj) - return true; - } + std::list threatList = me->getThreatManager().getThreatList(); + for (std::list::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) + if ((*itr)->getUnitGuid() == obj->GetGUID()) + return true; return false; } -void GuardAI::MoveInLineOfSight(Unit* unit) -{ - // Ignore Z for flying creatures - if (!me->canFly() && me->GetDistanceZ(unit) > CREATURE_Z_ATTACK_RANGE) - return; - - if (!me->getVictim() && me->IsValidAttackTarget(unit) && - (unit->IsHostileToPlayers() || me->IsHostileTo(unit)) && - unit->isInAccessiblePlaceFor(me)) - { - float attackRadius = me->GetAttackDistance(unit); - if (me->IsWithinDistInMap(unit, attackRadius)) - { - //Need add code to let guard support player - AttackStart(unit); - //u->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); - } - } -} - void GuardAI::EnterEvadeMode() { if (!me->isAlive()) { - sLog->outStaticDebug("Creature stopped attacking because he is dead [guid=%u]", me->GetGUIDLow()); me->GetMotionMaster()->MoveIdle(); - - i_state = STATE_NORMAL; - - i_victimGuid = 0; me->CombatStop(true); me->DeleteThreatList(); return; } - Unit* victim = ObjectAccessor::GetUnit(*me, i_victimGuid); - - if (!victim) - { - sLog->outStaticDebug("Creature stopped attacking because victim does not exist [guid=%u]", me->GetGUIDLow()); - } - else if (!victim ->isAlive()) - { - sLog->outStaticDebug("Creature stopped attacking because victim is dead [guid=%u]", me->GetGUIDLow()); - } - else if (victim ->HasStealthAura()) - { - sLog->outStaticDebug("Creature stopped attacking because victim is using stealth [guid=%u]", me->GetGUIDLow()); - } - else if (victim ->isInFlight()) - { - sLog->outStaticDebug("Creature stopped attacking because victim is flying away [guid=%u]", me->GetGUIDLow()); - } - else - { - sLog->outStaticDebug("Creature stopped attacking because victim outran him [guid=%u]", me->GetGUIDLow()); - } + sLog->outDebug(LOG_FILTER_UNITS, "Guard entry: %u enters evade mode.", me->GetEntry()); me->RemoveAllAuras(); me->DeleteThreatList(); - i_victimGuid = 0; me->CombatStop(true); - i_state = STATE_NORMAL; // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) me->GetMotionMaster()->MoveTargetedHome(); } -void GuardAI::UpdateAI(const uint32 /*diff*/) -{ - // update i_victimGuid if me->getVictim() !=0 and changed - if (!UpdateVictim()) - return; - - Unit* const victim = me->getVictim(); - if (!victim) - return; - - i_victimGuid = victim->GetGUID(); - - if (me->isAttackReady()) - { - if (me->IsWithinMeleeRange(victim)) - { - me->AttackerStateUpdate(victim); - me->resetAttackTimer(); - } - } -} - void GuardAI::JustDied(Unit* killer) { if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) diff --git a/src/server/game/AI/CoreAI/GuardAI.h b/src/server/game/AI/CoreAI/GuardAI.h index c80c5a6c343..c8dd9d54921 100755 --- a/src/server/game/AI/CoreAI/GuardAI.h +++ b/src/server/game/AI/CoreAI/GuardAI.h @@ -20,34 +20,19 @@ #define TRINITY_GUARDAI_H #include "ScriptedCreature.h" -#include "Timer.h" class Creature; class GuardAI : public ScriptedAI { - enum GuardState - { - STATE_NORMAL = 1, - STATE_LOOK_AT_VICTIM = 2 - }; - public: + explicit GuardAI(Creature* creature); - explicit GuardAI(Creature* c); - - void MoveInLineOfSight(Unit*); - void EnterEvadeMode(); - void JustDied(Unit*); + static int Permissible(Creature const* creature); bool CanSeeAlways(WorldObject const* obj); - void UpdateAI(const uint32); - static int Permissible(const Creature*); - - private: - uint64 i_victimGuid; - GuardState i_state; - TimeTracker i_tracker; + void EnterEvadeMode(); + void JustDied(Unit* killer); }; #endif diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 30ebd06745f..160b406a6ea 100755 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -109,17 +109,25 @@ void PetAI::UpdateAI(const uint32 diff) } else if (owner && me->GetCharmInfo()) //no victim { - Unit* nextTarget = SelectNextTarget(); + // Only aggressive pets do target search every update. + // Defensive pets do target search only in these cases: + // * Owner attacks something - handled by OwnerAttacked() + // * Owner receives damage - handled by OwnerDamagedBy() + // * Pet is in combat and current target dies - handled by KilledUnit() + if (me->HasReactState(REACT_AGGRESSIVE)) + { + Unit* nextTarget = SelectNextTarget(); - if (me->HasReactState(REACT_PASSIVE)) - _stopAttack(); - else if (nextTarget) - AttackStart(nextTarget); + if (nextTarget) + AttackStart(nextTarget); + else + HandleReturnMovement(); + } else HandleReturnMovement(); } else if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) // no charm info and no victim - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle()); + HandleReturnMovement(); if (!me->GetCharmInfo()) return; @@ -145,40 +153,56 @@ void PetAI::UpdateAI(const uint32 diff) if (spellInfo->IsPositive()) { - // non combat spells allowed - // only pet spells have IsNonCombatSpell and not fit this reqs: - // Consume Shadows, Lesser Invisibility, so ignore checks for its if (spellInfo->CanBeUsedInCombat()) { - // allow only spell without spell cost or with spell cost but not duration limit - int32 duration = spellInfo->GetDuration(); - if ((spellInfo->ManaCost || spellInfo->ManaCostPercentage || spellInfo->ManaPerSecond) && duration > 0) + // check spell cooldown + if (me->HasSpellCooldown(spellInfo->Id)) continue; - // allow only spell without cooldown > duration - int32 cooldown = spellInfo->GetRecoveryTime(); - if (cooldown >= 0 && duration >= 0 && cooldown > duration) + // Check if we're in combat or commanded to attack + if (!me->isInCombat() && !me->GetCharmInfo()->IsCommandAttack()) continue; } Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0); - bool spellUsed = false; - for (std::set::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar) - { - Unit* target = ObjectAccessor::GetUnit(*me, *tar); - //only buff targets that are in combat, unless the spell can only be cast while out of combat - if (!target) - continue; + // Some spells can target enemy or friendly (DK Ghoul's Leap) + // Check for enemy first (pet then owner) + Unit* target = me->getAttackerForHelper(); + if (!target && owner) + target = owner->getAttackerForHelper(); - if (spell->CanAutoCast(target)) + if (target) + { + if (CanAttack(target) && spell->CanAutoCast(target)) { - targetSpellStore.push_back(std::make_pair(target, spell)); + targetSpellStore.push_back(std::make_pair(target, spell)); spellUsed = true; - break; } } + + // No enemy, check friendly + if (!spellUsed) + { + for (std::set::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar) + { + Unit* ally = ObjectAccessor::GetUnit(*me, *tar); + + //only buff targets that are in combat, unless the spell can only be cast while out of combat + if (!ally) + continue; + + if (spell->CanAutoCast(ally)) + { + targetSpellStore.push_back(std::make_pair(ally, spell)); + spellUsed = true; + break; + } + } + } + + // No valid targets at all if (!spellUsed) delete spell; } @@ -186,7 +210,7 @@ void PetAI::UpdateAI(const uint32 diff) { Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0); if (spell->CanAutoCast(me->getVictim())) - targetSpellStore.push_back(std::make_pair(me->getVictim(), spell)); + targetSpellStore.push_back(std::make_pair(me->getVictim(), spell)); else delete spell; } @@ -278,6 +302,7 @@ void PetAI::KilledUnit(Unit* victim) // next target selection me->AttackStop(); me->GetCharmInfo()->SetIsCommandAttack(false); + me->SendMeleeAttackStop(); // Stops the pet's 'Attack' button from flashing Unit* nextTarget = SelectNextTarget(); @@ -301,6 +326,47 @@ void PetAI::AttackStart(Unit* target) DoAttack(target, true); } +void PetAI::OwnerDamagedBy(Unit* attacker) +{ + // Called when owner takes damage. Allows defensive pets to know + // that their owner might need help + + if (!attacker) + return; + + // Passive pets don't do anything + if (me->HasReactState(REACT_PASSIVE)) + return; + + // Prevent pet from disengaging from current target + if (me->getVictim() && me->getVictim()->isAlive()) + return; + + // Continue to evaluate and attack if necessary + AttackStart(attacker); +} + +void PetAI::OwnerAttacked(Unit* target) +{ + // Called when owner attacks something. Allows defensive pets to know + // that they need to assist + + // Target might be NULL if called from spell with invalid cast targets + if (!target) + return; + + // Passive pets don't do anything + if (me->HasReactState(REACT_PASSIVE)) + return; + + // Prevent pet from disengaging from current target + if (me->getVictim() && me->getVictim()->isAlive()) + return; + + // Continue to evaluate and attack if necessary + AttackStart(target); +} + Unit* PetAI::SelectNextTarget() { // Provides next target selection after current target death @@ -457,7 +523,7 @@ bool PetAI::CanAttack(Unit* target) // Stay - can attack if target is within range or commanded to if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY)) - return (me->IsWithinMeleeRange(target, MIN_MELEE_REACH) || me->GetCharmInfo()->IsCommandAttack()); + return (me->IsWithinMeleeRange(target, MELEE_RANGE) || me->GetCharmInfo()->IsCommandAttack()); // Follow if (me->GetCharmInfo()->HasCommandState(COMMAND_FOLLOW)) diff --git a/src/server/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h index 730ab12a3ca..ed3e2305556 100755 --- a/src/server/game/AI/CoreAI/PetAI.h +++ b/src/server/game/AI/CoreAI/PetAI.h @@ -40,6 +40,8 @@ class PetAI : public CreatureAI void KilledUnit(Unit* /*victim*/); void AttackStart(Unit* target); void MovementInform(uint32 moveType, uint32 data); + void OwnerDamagedBy(Unit* attacker); + void OwnerAttacked(Unit* target); private: bool _isVisible(Unit*) const; diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp index 0739b62b605..d12d3c098e8 100755 --- a/src/server/game/AI/CoreAI/TotemAI.cpp +++ b/src/server/game/AI/CoreAI/TotemAI.cpp @@ -27,8 +27,7 @@ #include "GridNotifiersImpl.h" #include "CellImpl.h" -int -TotemAI::Permissible(const Creature* creature) +int TotemAI::Permissible(Creature const* creature) { if (creature->isTotem()) return PERMIT_BASE_PROACTIVE; @@ -41,8 +40,7 @@ TotemAI::TotemAI(Creature* c) : CreatureAI(c), i_victimGuid(0) ASSERT(c->isTotem()); } -void -TotemAI::MoveInLineOfSight(Unit*) +void TotemAI::MoveInLineOfSight(Unit* /*who*/) { } @@ -51,10 +49,9 @@ void TotemAI::EnterEvadeMode() me->CombatStop(true); } -void -TotemAI::UpdateAI(const uint32 /*diff*/) +void TotemAI::UpdateAI(uint32 const /*diff*/) { - if (me->ToTotem()->GetTotemType() != TOTEM_ACTIVE) + if (me->ToTotem()->GetTotemType() != TOTEM_ACTIVE) return; if (!me->isAlive() || me->IsNonMeleeSpellCasted(false)) @@ -98,8 +95,7 @@ TotemAI::UpdateAI(const uint32 /*diff*/) i_victimGuid = 0; } -void -TotemAI::AttackStart(Unit*) +void TotemAI::AttackStart(Unit* /*victim*/) { // Sentry totem sends ping on attack if (me->GetEntry() == SENTRY_TOTEM_ENTRY && me->GetOwner()->GetTypeId() == TYPEID_PLAYER) diff --git a/src/server/game/AI/CoreAI/TotemAI.h b/src/server/game/AI/CoreAI/TotemAI.h index 0fa2920888f..f0d705345ef 100755 --- a/src/server/game/AI/CoreAI/TotemAI.h +++ b/src/server/game/AI/CoreAI/TotemAI.h @@ -31,12 +31,12 @@ class TotemAI : public CreatureAI explicit TotemAI(Creature* c); - void MoveInLineOfSight(Unit*); - void AttackStart(Unit*); + void MoveInLineOfSight(Unit* who); + void AttackStart(Unit* victim); void EnterEvadeMode(); - void UpdateAI(const uint32); - static int Permissible(const Creature*); + void UpdateAI(uint32 const diff); + static int Permissible(Creature const* creature); private: uint64 i_victimGuid; diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index b871a25835b..593f0d15e18 100755 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -223,7 +223,7 @@ class UnitAI targetList.reverse(); if (targetType == SELECT_TARGET_RANDOM) - Trinity::RandomResizeList(targetList, maxTargets); + Trinity::Containers::RandomResizeList(targetList, maxTargets); else targetList.resize(maxTargets); } diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index c8818f84e5b..9c236cbd039 100755 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -25,6 +25,7 @@ #include "Log.h" #include "MapReference.h" #include "Player.h" +#include "CreatureTextMgr.h" //Disable CreatureAI when charmed void CreatureAI::OnCharmed(bool /*apply*/) diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index dafd3e4e137..94ac452b9f3 100755 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -19,9 +19,9 @@ #ifndef TRINITY_CREATUREAI_H #define TRINITY_CREATUREAI_H +#include "Creature.h" #include "UnitAI.h" #include "Common.h" -#include "CreatureTextMgr.h" class WorldObject; class Unit; @@ -138,6 +138,12 @@ class CreatureAI : public UnitAI // Called at text emote receive from player virtual void ReceiveEmote(Player* /*player*/, uint32 /*emoteId*/) {} + // Called when owner takes damage + virtual void OwnerDamagedBy(Unit* /*attacker*/) {} + + // Called when owner attacks something + virtual void OwnerAttacked(Unit* /*target*/) {} + /// == Triggered Actions Requested ================== // Called when creature attack expected (if creature can and no have current victim) diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h index f568da80b49..d097adf38ec 100755 --- a/src/server/game/AI/CreatureAIImpl.h +++ b/src/server/game/AI/CreatureAIImpl.h @@ -326,11 +326,15 @@ class EventMap : private std::map uint32 GetPhaseMask() const { return (_phase >> 24) & 0xFF; } + bool Empty() const { return empty(); } + // Sets event phase, must be in range 1 - 8 void SetPhase(uint32 phase) { if (phase && phase < 8) _phase = (1 << (phase + 24)); + else if (!phase) + _phase = 0; } // Creates new event entry in map with given id, time, group if given (1 - 8) and phase if given (1 - 8) @@ -604,6 +608,7 @@ inline void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered) inline void UnitAI::DoCastVictim(uint32 spellId, bool triggered) { + // Why don't we check for casting unit_state and existing target as we do in DoCast(.. ? me->CastSpell(me->getVictim(), spellId, triggered); } diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp index ab616d78a8c..1a0c6652e74 100755 --- a/src/server/game/AI/CreatureAISelector.cpp +++ b/src/server/game/AI/CreatureAISelector.cpp @@ -82,7 +82,7 @@ namespace FactorySelector { const CreatureAICreator* factory = iter->second; const SelectableAI* p = dynamic_cast(factory); - ASSERT(p != NULL); + ASSERT(p); int val = p->Permit(creature); if (val > best_val) { @@ -102,7 +102,7 @@ namespace FactorySelector MovementGenerator* selectMovementGenerator(Creature* creature) { MovementGeneratorRegistry& mv_registry(*MovementGeneratorRepository::instance()); - ASSERT(creature->GetCreatureInfo() != NULL); + ASSERT(creature->GetCreatureTemplate()); const MovementGeneratorCreator* mv_factory = mv_registry.GetRegistryItem(creature->GetDefaultMovementType()); /* if (mv_factory == NULL) @@ -133,6 +133,9 @@ namespace FactorySelector const GameObjectAICreator* ai_factory = NULL; GameObjectAIRegistry& ai_registry(*GameObjectAIRepository::instance()); + if (GameObjectAI* scriptedAI = sScriptMgr->GetGameObjectAI(go)) + return scriptedAI; + ai_factory = ai_registry.GetRegistryItem(go->GetAIName()); //future goAI types go here diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp index bc1903257b7..9745b7185d9 100755 --- a/src/server/game/AI/EventAI/CreatureEventAI.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp @@ -95,7 +95,7 @@ CreatureEventAI::CreatureEventAI(Creature* c) : CreatureAI(c) m_AttackDistance = 0.0f; m_AttackAngle = 0.0f; - m_InvinceabilityHpLevel = 0; + m_InvincibilityHpLevel = 0; //Handle Spawned Events if (!m_bEmptyList) @@ -816,9 +816,9 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 case ACTION_T_SET_INVINCIBILITY_HP_LEVEL: { if (action.invincibility_hp_level.is_percent) - m_InvinceabilityHpLevel = me->CountPctFromMaxHealth(action.invincibility_hp_level.hp_level); + m_InvincibilityHpLevel = me->CountPctFromMaxHealth(action.invincibility_hp_level.hp_level); else - m_InvinceabilityHpLevel = action.invincibility_hp_level.hp_level; + m_InvincibilityHpLevel = action.invincibility_hp_level.hp_level; break; } case ACTION_T_MOUNT_TO_ENTRY_OR_MODEL: @@ -1107,7 +1107,7 @@ void CreatureEventAI::UpdateAI(const uint32 diff) break; case EVENT_T_RANGE: if (me->getVictim()) - if (me->IsInMap(me->getVictim())) + if (me->IsInMap(me->getVictim()) && me->InSamePhase(me->getVictim())) if (me->IsInRange(me->getVictim(), (float)(*i).Event.range.minDist, (float)(*i).Event.range.maxDist)) ProcessEvent(*i); break; @@ -1252,7 +1252,7 @@ void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* source, Unit* t if ((*i).second.SoundId) { - if (GetSoundEntriesStore()->LookupEntry((*i).second.SoundId)) + if (sSoundEntriesStore.LookupEntry((*i).second.SoundId)) source->PlayDirectSound((*i).second.SoundId); else sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i tried to process invalid sound id %u.", textEntry, (*i).second.SoundId); @@ -1350,12 +1350,12 @@ void CreatureEventAI::ReceiveEmote(Player* player, uint32 textEmote) void CreatureEventAI::DamageTaken(Unit* /*done_by*/, uint32& damage) { - if (m_InvinceabilityHpLevel > 0 && me->GetHealth() < m_InvinceabilityHpLevel+damage) + if (m_InvincibilityHpLevel > 0 && me->GetHealth() < m_InvincibilityHpLevel+damage) { - if (me->GetHealth() <= m_InvinceabilityHpLevel) + if (me->GetHealth() <= m_InvincibilityHpLevel) damage = 0; else - damage = me->GetHealth() - m_InvinceabilityHpLevel; + damage = me->GetHealth() - m_InvincibilityHpLevel; } } diff --git a/src/server/game/AI/EventAI/CreatureEventAI.h b/src/server/game/AI/EventAI/CreatureEventAI.h index c4daf2563e0..3d2bcf888c8 100755 --- a/src/server/game/AI/EventAI/CreatureEventAI.h +++ b/src/server/game/AI/EventAI/CreatureEventAI.h @@ -641,6 +641,6 @@ class CreatureEventAI : public CreatureAI bool m_MeleeEnabled; // If we allow melee auto attack float m_AttackDistance; // Distance to attack from float m_AttackAngle; // Angle of attack - uint32 m_InvinceabilityHpLevel; // Minimal health level allowed at damage apply + uint32 m_InvincibilityHpLevel; // Minimal health level allowed at damage apply }; #endif diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp index add7b4db174..517e55af457 100755 --- a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp @@ -38,7 +38,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Texts() // Load EventAI Text sObjectMgr->LoadTrinityStrings("creature_ai_texts", MIN_CREATURE_AI_TEXT_STRING_ID, MAX_CREATURE_AI_TEXT_STRING_ID); - // Gather Additional data from EventAI Texts + // Gather Additional data from EventAI Texts 0 1 2 3 4 QueryResult result = WorldDatabase.Query("SELECT entry, sound, type, language, emote FROM creature_ai_texts"); if (!result) @@ -56,10 +56,10 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Texts() StringTextData temp; int32 i = fields[0].GetInt32(); - temp.SoundId = fields[1].GetInt32(); - temp.Type = fields[2].GetInt32(); - temp.Language = fields[3].GetInt32(); - temp.Emote = fields[4].GetInt32(); + temp.SoundId = fields[1].GetUInt32(); + temp.Type = fields[2].GetUInt8(); + temp.Language = fields[3].GetUInt8(); + temp.Emote = fields[4].GetUInt16(); // range negative if (i > MIN_CREATURE_AI_TEXT_STRING_ID || i <= MAX_CREATURE_AI_TEXT_STRING_ID) @@ -187,7 +187,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() temp.creature_id = fields[1].GetUInt32(); uint32 creature_id = temp.creature_id; - uint32 e_type = fields[2].GetUInt32(); + uint32 e_type = fields[2].GetUInt8(); //Report any errors in event if (e_type >= EVENT_T_END) { @@ -196,13 +196,13 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() } temp.event_type = EventAI_Type(e_type); - temp.event_inverse_phase_mask = fields[3].GetUInt32(); - temp.event_chance = fields[4].GetUInt8(); - temp.event_flags = fields[5].GetUInt8(); - temp.raw.param1 = fields[6].GetUInt32(); - temp.raw.param2 = fields[7].GetUInt32(); - temp.raw.param3 = fields[8].GetUInt32(); - temp.raw.param4 = fields[9].GetUInt32(); + temp.event_inverse_phase_mask = fields[3].GetInt32(); + temp.event_chance = fields[4].GetUInt32(); + temp.event_flags = fields[5].GetUInt32(); + temp.raw.param1 = fields[6].GetInt32(); + temp.raw.param2 = fields[7].GetInt32(); + temp.raw.param3 = fields[8].GetInt32(); + temp.raw.param4 = fields[9].GetInt32(); //Creature does not exist in database if (!sObjectMgr->GetCreatureTemplate(temp.creature_id)) @@ -399,7 +399,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() for (uint32 j = 0; j < MAX_ACTIONS; j++) { - uint16 action_type = fields[10+(j*4)].GetUInt16(); + uint16 action_type = fields[10+(j*4)].GetUInt8(); if (action_type >= ACTION_T_END) { sLog->outErrorDb("CreatureEventAI: Event %u Action %u has incorrect action type (%u), replace by ACTION_T_NONE.", i, j+1, action_type); @@ -410,9 +410,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() CreatureEventAI_Action& action = temp.action[j]; action.type = EventAI_ActionType(action_type); - action.raw.param1 = fields[11+(j*4)].GetUInt32(); - action.raw.param2 = fields[12+(j*4)].GetUInt32(); - action.raw.param3 = fields[13+(j*4)].GetUInt32(); + action.raw.param1 = fields[11+(j*4)].GetInt32(); + action.raw.param2 = fields[12+(j*4)].GetInt32(); + action.raw.param3 = fields[13+(j*4)].GetInt32(); //Report any errors in actions switch (action.type) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 78adc38a67d..55ce2451709 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -30,18 +30,6 @@ void SummonList::DoZoneInCombat(uint32 entry) } } -void SummonList::DoAction(uint32 entry, int32 info) -{ - for (iterator i = begin(); i != end();) - { - Creature* summon = Unit::GetCreature(*me, *i); - ++i; - if (summon && summon->IsAIEnabled - && (!entry || summon->GetEntry() == entry)) - summon->AI()->DoAction(info); - } -} - void SummonList::DespawnEntry(uint32 entry) { for (iterator i = begin(); i != end();) @@ -126,15 +114,7 @@ void ScriptedAI::UpdateAI(uint32 const /*diff*/) if (!UpdateVictim()) return; - if (me->isAttackReady()) - { - //If we are within range melee the target - if (me->IsWithinMeleeRange(me->getVictim())) - { - me->AttackerStateUpdate(me->getVictim()); - me->resetAttackTimer(); - } - } + DoMeleeAttackIfReady(); } void ScriptedAI::DoStartMovement(Unit* victim, float distance, float angle) @@ -171,7 +151,7 @@ void ScriptedAI::DoPlaySoundToSet(WorldObject* source, uint32 soundId) if (!source) return; - if (!GetSoundEntriesStore()->LookupEntry(soundId)) + if (!sSoundEntriesStore.LookupEntry(soundId)) { sLog->outError("TSCR: Invalid soundId %u used in DoPlaySoundToSet (Source: TypeId %u, GUID %u)", soundId, source->GetTypeId(), source->GetGUIDLow()); return; @@ -189,11 +169,11 @@ SpellInfo const* ScriptedAI::SelectSpell(Unit* target, uint32 school, uint32 mec { //No target so we can't cast if (!target) - return false; + return NULL; //Silenced so we can't cast if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED)) - return false; + return NULL; //Using the extended script system we first create a list of viable spells SpellInfo const* apSpell[CREATURE_MAX_SPELLS]; @@ -274,7 +254,7 @@ void ScriptedAI::DoResetThreat() for (std::list::iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && DoGetThreat(unit)) DoModifyThreatPercent(unit, -100); @@ -309,14 +289,13 @@ void ScriptedAI::DoTeleportTo(const float position[4]) void ScriptedAI::DoTeleportPlayer(Unit* unit, float x, float y, float z, float o) { - if (!unit || unit->GetTypeId() != TYPEID_PLAYER) - { - if (unit) - sLog->outError("TSCR: Creature " UI64FMTD " (Entry: %u) Tried to teleport non-player unit (Type: %u GUID: " UI64FMTD ") to x: %f y:%f z: %f o: %f. Aborted.", me->GetGUID(), me->GetEntry(), unit->GetTypeId(), unit->GetGUID(), x, y, z, o); + if (!unit) return; - } - CAST_PLR(unit)->TeleportTo(unit->GetMapId(), x, y, z, o, TELE_TO_NOT_LEAVE_COMBAT); + if (Player* player = unit->ToPlayer()) + player->TeleportTo(unit->GetMapId(), x, y, z, o, TELE_TO_NOT_LEAVE_COMBAT); + else + sLog->outError("TSCR: Creature " UI64FMTD " (Entry: %u) Tried to teleport non-player unit (Type: %u GUID: " UI64FMTD ") to x: %f y:%f z: %f o: %f. Aborted.", me->GetGUID(), me->GetEntry(), unit->GetTypeId(), unit->GetGUID(), x, y, z, o); } void ScriptedAI::DoTeleportAll(float x, float y, float z, float o) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index a01c993cab6..4fac8b3cba5 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -38,7 +38,18 @@ class SummonList : public std::list void Despawn(Creature* summon) { remove(summon->GetGUID()); } void DespawnEntry(uint32 entry); void DespawnAll(); - void DoAction(uint32 entry, int32 info); + + template void DoAction(int32 info, Predicate& predicate, uint16 max = 0) + { + Trinity::Containers::RandomResizeList(*this, predicate, max); + for (iterator i = begin(); i != end(); ) + { + Creature* summon = Unit::GetCreature(*me, *i++); + if (summon && summon->IsAIEnabled) + summon->AI()->DoAction(info); + } + } + void DoZoneInCombat(uint32 entry = 0); void RemoveNotExisting(); bool HasEntry(uint32 entry); @@ -46,6 +57,22 @@ class SummonList : public std::list Creature* me; }; +class EntryCheckPredicate +{ + public: + EntryCheckPredicate(uint32 entry) : _entry(entry) {} + bool operator()(uint64 guid) { return GUID_ENPART(guid) == _entry; } + + private: + uint32 _entry; +}; + +class DummyEntryCheckPredicate +{ + public: + bool operator()(uint64) { return true; } +}; + struct ScriptedAI : public CreatureAI { explicit ScriptedAI(Creature* creature); diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 048cc8b3d68..2243734f642 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -57,7 +57,7 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* who) return false; //experimental (unknown) flag not present - if (!(me->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS)) + if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS)) return false; //not a player @@ -95,7 +95,7 @@ void npc_escortAI::MoveInLineOfSight(Unit* who) if (HasEscortState(STATE_ESCORT_ESCORTING) && AssistPlayerInCombat(who)) return; - if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; if (me->IsHostileTo(who)) @@ -150,7 +150,7 @@ void npc_escortAI::JustRespawned() //add a small delay before going to first waypoint, normal in near all cases m_uiWPWaitTimer = 2500; - if (me->getFaction() != me->GetCreatureInfo()->faction_A) + if (me->getFaction() != me->GetCreatureTemplate()->faction_A) me->RestoreFaction(); Reset(); @@ -307,11 +307,7 @@ void npc_escortAI::MovementInform(uint32 moveType, uint32 pointId) { sLog->outDebug(LOG_FILTER_TSCR, "TSCR: EscortAI has returned to original position before combat"); - if (m_bIsRunning && me->HasUnitMovementFlag(MOVEMENTFLAG_WALKING)) - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - else if (!m_bIsRunning && !me->HasUnitMovementFlag(MOVEMENTFLAG_WALKING)) - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - + me->SetWalk(!m_bIsRunning); RemoveEscortState(STATE_ESCORT_RETURNING); if (!m_uiWPWaitTimer) @@ -387,7 +383,7 @@ void npc_escortAI::FillPointMovementListForCreature() if (movePoints.empty()) return; - ScriptPointVector::const_iterator itrEnd = movePoints.end();; + ScriptPointVector::const_iterator itrEnd = movePoints.end(); for (ScriptPointVector::const_iterator itr = movePoints.begin(); itr != itrEnd; ++itr) { Escort_Waypoint point(itr->uiPointId, itr->fX, itr->fY, itr->fZ, itr->uiWaitTime); @@ -400,14 +396,14 @@ void npc_escortAI::SetRun(bool on) if (on) { if (!m_bIsRunning) - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); else sLog->outDebug(LOG_FILTER_TSCR, "TSCR: EscortAI attempt to set run mode, but is already running."); } else { if (m_bIsRunning) - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); else sLog->outDebug(LOG_FILTER_TSCR, "TSCR: EscortAI attempt to set walk mode, but is already walking."); } @@ -473,9 +469,9 @@ void npc_escortAI::Start(bool isActiveAttacker /* = true*/, bool run /* = false //Set initial speed if (m_bIsRunning) - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); else - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); AddEscortState(STATE_ESCORT_ESCORTING); } diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index d83ad9b756c..13bbbe2c338 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -55,7 +55,7 @@ bool FollowerAI::AssistPlayerInCombat(Unit* who) return false; //experimental (unknown) flag not present - if (!(me->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS)) + if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS)) return false; //not a player @@ -93,7 +93,7 @@ void FollowerAI::MoveInLineOfSight(Unit* who) if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(who)) return; - if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; if (me->IsHostileTo(who)) @@ -150,8 +150,8 @@ void FollowerAI::JustRespawned() if (!IsCombatMovementAllowed()) SetCombatMovement(true); - if (me->getFaction() != me->GetCreatureInfo()->faction_A) - me->setFaction(me->GetCreatureInfo()->faction_A); + if (me->getFaction() != me->GetCreatureTemplate()->faction_A) + me->setFaction(me->GetCreatureTemplate()->faction_A); Reset(); } diff --git a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp deleted file mode 100755 index 25c7f6f44b7..00000000000 --- a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: SimpleAI -SD%Complete: 100 -SDComment: Base Class for SimpleAI creatures -SDCategory: Creatures -EndScriptData */ - -#include "ScriptPCH.h" -#include "ScriptedSimpleAI.h" - -SimpleAI::SimpleAI(Creature* c) : ScriptedAI(c) -{ - //Clear all data - Aggro_TextId[0] = 0; - Aggro_TextId[1] = 0; - Aggro_TextId[2] = 0; - Aggro_Sound[0] = 0; - Aggro_Sound[1] = 0; - Aggro_Sound[2] = 0; - - Death_TextId[0] = 0; - Death_TextId[1] = 0; - Death_TextId[2] = 0; - Death_Sound[0] = 0; - Death_Sound[1] = 0; - Death_Sound[2] = 0; - Death_Spell = 0; - Death_Target_Type = 0; - - Kill_TextId[0] = 0; - Kill_TextId[1] = 0; - Kill_TextId[2] = 0; - Kill_Sound[0] = 0; - Kill_Sound[1] = 0; - Kill_Sound[2] = 0; - Kill_Spell = 0; - Kill_Target_Type = 0; - - memset(Spell, 0, sizeof(Spell)); - - EnterEvadeMode(); -} - -void SimpleAI::Reset() -{ -} - -void SimpleAI::EnterCombat(Unit* who) -{ - //Reset cast timers - if (Spell[0].First_Cast >= 0) - Spell_Timer[0] = Spell[0].First_Cast; - else Spell_Timer[0] = 1000; - if (Spell[1].First_Cast >= 0) - Spell_Timer[1] = Spell[1].First_Cast; - else Spell_Timer[1] = 1000; - if (Spell[2].First_Cast >= 0) - Spell_Timer[2] = Spell[2].First_Cast; - else Spell_Timer[2] = 1000; - if (Spell[3].First_Cast >= 0) - Spell_Timer[3] = Spell[3].First_Cast; - else Spell_Timer[3] = 1000; - if (Spell[4].First_Cast >= 0) - Spell_Timer[4] = Spell[4].First_Cast; - else Spell_Timer[4] = 1000; - if (Spell[5].First_Cast >= 0) - Spell_Timer[5] = Spell[5].First_Cast; - else Spell_Timer[5] = 1000; - if (Spell[6].First_Cast >= 0) - Spell_Timer[6] = Spell[6].First_Cast; - else Spell_Timer[6] = 1000; - if (Spell[7].First_Cast >= 0) - Spell_Timer[7] = Spell[7].First_Cast; - else Spell_Timer[7] = 1000; - if (Spell[8].First_Cast >= 0) - Spell_Timer[8] = Spell[8].First_Cast; - else Spell_Timer[8] = 1000; - if (Spell[9].First_Cast >= 0) - Spell_Timer[9] = Spell[9].First_Cast; - else Spell_Timer[9] = 1000; - - uint8 random_text = urand(0, 2); - - //Random text - if (Aggro_TextId[random_text]) - DoScriptText(Aggro_TextId[random_text], me, who); - - //Random sound - if (Aggro_Sound[random_text]) - DoPlaySoundToSet(me, Aggro_Sound[random_text]); -} - -void SimpleAI::KilledUnit(Unit* victim) -{ - uint8 random_text = urand(0, 2); - - //Random yell - if (Kill_TextId[random_text]) - DoScriptText(Kill_TextId[random_text], me, victim); - - //Random sound - if (Kill_Sound[random_text]) - DoPlaySoundToSet(me, Kill_Sound[random_text]); - - if (!Kill_Spell) - return; - - Unit* target = NULL; - - switch (Kill_Target_Type) - { - case CAST_SELF: - target = me; - break; - case CAST_HOSTILE_TARGET: - target = me->getVictim(); - break; - case CAST_HOSTILE_SECOND_AGGRO: - target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1); - break; - case CAST_HOSTILE_LAST_AGGRO: - target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0); - break; - case CAST_HOSTILE_RANDOM: - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - break; - case CAST_KILLEDUNIT_VICTIM: - target = victim; - break; - } - - //Target is ok, cast a spell on it - if (target) - DoCast(target, Kill_Spell); -} - -void SimpleAI::DamageTaken(Unit* killer, uint32& damage) -{ - //Return if damage taken won't kill us - if (me->GetHealth() > damage) - return; - - uint8 random_text = urand(0, 2); - - //Random yell - if (Death_TextId[random_text]) - DoScriptText(Death_TextId[random_text], me, killer); - - //Random sound - if (Death_Sound[random_text]) - DoPlaySoundToSet(me, Death_Sound[random_text]); - - if (!Death_Spell) - return; - - Unit* target = NULL; - - switch (Death_Target_Type) - { - case CAST_SELF: - target = me; - break; - case CAST_HOSTILE_TARGET: - target = me->getVictim(); - break; - case CAST_HOSTILE_SECOND_AGGRO: - target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1); - break; - case CAST_HOSTILE_LAST_AGGRO: - target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0); - break; - case CAST_HOSTILE_RANDOM: - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - break; - case CAST_JUSTDIED_KILLER: - target = killer; - break; - } - - //Target is ok, cast a spell on it - if (target) - DoCast(target, Death_Spell); -} - -void SimpleAI::UpdateAI(const uint32 diff) -{ - //Return since we have no target - if (!UpdateVictim()) - return; - - //Spells - for (uint32 i = 0; i < MAX_SIMPLEAI_SPELLS; ++i) - { - //Spell not valid - if (!Spell[i].Enabled || !Spell[i].Spell_Id) - continue; - - if (Spell_Timer[i] <= diff) - { - //Check if this is a percentage based - if (Spell[i].First_Cast < 0 && Spell[i].First_Cast > -100 && HealthAbovePct(uint32(-Spell[i].First_Cast))) - continue; - - //Check Current spell - if (!(Spell[i].InterruptPreviousCast && me->IsNonMeleeSpellCasted(false))) - { - Unit* target = NULL; - - switch (Spell[i].Cast_Target_Type) - { - case CAST_SELF: - target = me; - break; - case CAST_HOSTILE_TARGET: - target = me->getVictim(); - break; - case CAST_HOSTILE_SECOND_AGGRO: - target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1); - break; - case CAST_HOSTILE_LAST_AGGRO: - target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0); - break; - case CAST_HOSTILE_RANDOM: - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - break; - } - - //Target is ok, cast a spell on it and then do our random yell - if (target) - { - if (me->IsNonMeleeSpellCasted(false)) - me->InterruptNonMeleeSpells(false); - - DoCast(target, Spell[i].Spell_Id); - - //Yell and sound use the same number so that you can make - //the Creature yell with the correct sound effect attached - uint8 random_text = urand(0, 2); - - //Random yell - if (Spell[i].TextId[random_text]) - DoScriptText(Spell[i].TextId[random_text], me, target); - - //Random sound - if (Spell[i].Text_Sound[random_text]) - DoPlaySoundToSet(me, Spell[i].Text_Sound[random_text]); - } - - } - - //Spell will cast agian when the cooldown is up - if (Spell[i].CooldownRandomAddition) - Spell_Timer[i] = Spell[i].Cooldown + (rand() % Spell[i].CooldownRandomAddition); - else Spell_Timer[i] = Spell[i].Cooldown; - - } else Spell_Timer[i] -= diff; - - } - - DoMeleeAttackIfReady(); -} - diff --git a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h b/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h deleted file mode 100644 index a38bdf85e14..00000000000 --- a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 -* This program is free software licensed under GPL version 2 -* Please see the included DOCS/LICENSE.TXT for more information */ - -#ifndef SC_SIMPLEAI_H -#define SC_SIMPLEAI_H - -enum CastTarget -{ - CAST_SELF = 0, //Self cast - CAST_HOSTILE_TARGET, //Our current target (ie: highest aggro) - CAST_HOSTILE_SECOND_AGGRO, //Second highest aggro (generaly used for cleaves and some special attacks) - CAST_HOSTILE_LAST_AGGRO, //Dead last on aggro (no idea what this could be used for) - CAST_HOSTILE_RANDOM, //Just any random target on our threat list - CAST_FRIENDLY_RANDOM, //NOT YET IMPLEMENTED - - //Special cases - CAST_KILLEDUNIT_VICTIM, //Only works within KilledUnit function - CAST_JUSTDIED_KILLER, //Only works within JustDied function -}; - -#define MAX_SIMPLEAI_SPELLS 10 - -struct SimpleAI : public ScriptedAI -{ - SimpleAI(Creature* c);// : ScriptedAI(c); - - void Reset(); - - void EnterCombat(Unit* /*who*/); - - void KilledUnit(Unit* /*victim*/); - - void DamageTaken(Unit* killer, uint32& damage); - - void UpdateAI(const uint32 diff); - -public: - - int32 Aggro_TextId[3]; - uint32 Aggro_Sound[3]; - - int32 Death_TextId[3]; - uint32 Death_Sound[3]; - uint32 Death_Spell; - uint32 Death_Target_Type; - - int32 Kill_TextId[3]; - uint32 Kill_Sound[3]; - uint32 Kill_Spell; - uint32 Kill_Target_Type; - - struct SimpleAI_Spell - { - uint32 Spell_Id; //Spell ID to cast - int32 First_Cast; //Delay for first cast - uint32 Cooldown; //Cooldown between casts - uint32 CooldownRandomAddition; //Random addition to cooldown (in range from 0 - CooldownRandomAddition) - uint32 Cast_Target_Type; //Target type (note that certain spells may ignore this) - bool InterruptPreviousCast; //Interrupt a previous cast if this spell needs to be cast - bool Enabled; //Spell enabled or disabled (default: false) - - //3 texts to many? - int32 TextId[3]; - uint32 Text_Sound[3]; - }Spell[MAX_SIMPLEAI_SPELLS]; - -protected: - uint32 Spell_Timer[MAX_SIMPLEAI_SPELLS]; -}; - -#endif - diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 7838e6891fe..08f1b18ffad 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -45,7 +45,7 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c) mCanRepeatPath = false; // spawn in run mode - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); mRun = false; me->GetPosition(&mLastOOCPos); @@ -68,12 +68,14 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c) mFollowCredit = 0; mFollowArrivedEntry = 0; mFollowCreditType = 0; - mInvinceabilityHpLevel = 0; + mInvincibilityHpLevel = 0; } void SmartAI::UpdateDespawn(const uint32 diff) { - if (mDespawnState <= 1 || mDespawnState > 3) return; + if (mDespawnState <= 1 || mDespawnState > 3) + return; + if (mDespawnTime < diff) { if (mDespawnState == 2) @@ -524,7 +526,7 @@ bool SmartAI::AssistPlayerInCombat(Unit* who) return false; //experimental (unknown) flag not present - if (!(me->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS)) + if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS)) return false; //not a player @@ -561,7 +563,7 @@ void SmartAI::JustRespawned() mDespawnState = 0; mEscortState = SMART_ESCORT_NONE; me->SetVisible(true); - if (me->getFaction() != me->GetCreatureInfo()->faction_A) + if (me->getFaction() != me->GetCreatureTemplate()->faction_A) me->RestoreFaction(); GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); Reset(); @@ -638,8 +640,8 @@ void SmartAI::SpellHitTarget(Unit* target, const SpellInfo* spellInfo) void SmartAI::DamageTaken(Unit* doneBy, uint32& damage) { GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage); - if ((me->GetHealth() - damage) <= mInvinceabilityHpLevel) - damage -= mInvinceabilityHpLevel; + if ((me->GetHealth() - damage) <= mInvincibilityHpLevel) + damage = me->GetHealth() - mInvincibilityHpLevel; } void SmartAI::HealReceived(Unit* doneBy, uint32& addhealth) @@ -720,26 +722,16 @@ uint64 SmartAI::GetGUID(int32 /*id*/) void SmartAI::SetRun(bool run) { if (run) - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); else - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); mRun = run; } void SmartAI::SetFly(bool fly) { - if (fly) - { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - } - else - { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - } - me->SetFlying(fly); + me->SetDisableGravity(fly); me->SendMovementFlagUpdate(); } @@ -812,12 +804,12 @@ void SmartAI::SetFollow(Unit* target, float dist, float angle, uint32 credit, ui return; SetRun(mRun); mFollowGuid = target->GetGUID(); - mFollowDist = dist ? dist : PET_FOLLOW_DIST; - mFollowAngle = angle ? angle : me->GetFollowAngle(); + mFollowDist = dist >= 0.0f ? dist : PET_FOLLOW_DIST; + mFollowAngle = angle >= 0.0f ? angle : me->GetFollowAngle(); mFollowArrivedTimer = 1000; mFollowCredit = credit; mFollowArrivedEntry = end; - me->GetMotionMaster()->MoveFollow(target, dist, angle); + me->GetMotionMaster()->MoveFollow(target, mFollowDist, mFollowAngle); mFollowCreditType = creditType; } @@ -862,7 +854,7 @@ int SmartGameObjectAI::Permissible(const GameObject* g) return PERMIT_BASE_NO; } -void SmartGameObjectAI::UpdateAI(const uint32 diff) +void SmartGameObjectAI::UpdateAI(uint32 diff) { GetScript()->OnUpdate(diff); } diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index e82b35ec87a..435aa176d4d 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -23,7 +23,6 @@ #include "CreatureAI.h" #include "Unit.h" #include "ConditionMgr.h" -#include "CreatureTextMgr.h" #include "Spell.h" #include "SmartScript.h" @@ -63,6 +62,7 @@ class SmartAI : public CreatureAI void RemoveEscortState(uint32 uiEscortState) { mEscortState &= ~uiEscortState; } void SetAutoAttack(bool on) { mCanAutoAttack = on; } void SetCombatMove(bool on); + bool CanCombatMove() { return mCanCombatMove; } void SetFollow(Unit* target, float dist = 0.0f, float angle = 0.0f, uint32 credit = 0, uint32 end = 0, uint32 creditType = 0); void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); @@ -175,7 +175,7 @@ class SmartAI : public CreatureAI void SetSwim(bool swim = true); - void SetInvinceabilityHpLevel(uint32 level) { mInvinceabilityHpLevel = level; } + void SetInvincibilityHpLevel(uint32 level) { mInvincibilityHpLevel = level; } void sGossipHello(Player* player); void sGossipSelect(Player* player, uint32 sender, uint32 action); @@ -224,8 +224,7 @@ class SmartAI : public CreatureAI bool mCanAutoAttack; bool mCanCombatMove; bool mForcedPaused; - uint32 mInvinceabilityHpLevel; - + uint32 mInvincibilityHpLevel; bool AssistPlayerInCombat(Unit* who); uint32 mDespawnTime; @@ -240,13 +239,13 @@ public: SmartGameObjectAI(GameObject* g) : GameObjectAI(g), go(g) {} ~SmartGameObjectAI() {} - void UpdateAI(const uint32 diff); + void UpdateAI(uint32 diff); void InitializeAI(); void Reset(); SmartScript* GetScript() { return &mScript; } static int Permissible(const GameObject* g); - bool GossipHello(Player* player) ; + bool GossipHello(Player* player); bool GossipSelect(Player* player, uint32 sender, uint32 action); bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/); bool QuestAccept(Player* player, Quest const* quest); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 67d26ea06dd..01a9b777358 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -33,6 +33,47 @@ #include "Group.h" #include "Vehicle.h" #include "ScriptedGossip.h" +#include "CreatureTextMgr.h" + +class TrinityStringTextBuilder +{ + public: + TrinityStringTextBuilder(WorldObject* obj, ChatMsg msgtype, int32 id, uint32 language, uint64 targetGUID) + : _source(obj), _msgType(msgtype), _textId(id), _language(language), _targetGUID(targetGUID) + { + } + + size_t operator()(WorldPacket* data, LocaleConstant locale) const + { + std::string text = sObjectMgr->GetTrinityString(_textId, locale); + char const* localizedName = _source->GetNameForLocaleIdx(locale); + + *data << uint8(_msgType); + *data << uint32(_language); + *data << uint64(_source->GetGUID()); + *data << uint32(1); // 2.1.0 + *data << uint32(strlen(localizedName)+1); + *data << localizedName; + size_t whisperGUIDpos = data->wpos(); + *data << uint64(_targetGUID); // Unit Target + if (_targetGUID && !IS_PLAYER_GUID(_targetGUID)) + { + *data << uint32(1); // target name length + *data << uint8(0); // target name + } + *data << uint32(text.length() + 1); + *data << text; + *data << uint8(0); // ChatTag + + return whisperGUIDpos; + } + + WorldObject* _source; + ChatMsg _msgType; + int32 _textId; + uint32 _language; + uint64 _targetGUID; +}; SmartScript::SmartScript() { @@ -67,8 +108,11 @@ void SmartScript::OnReset() ResetBaseObject(); for (SmartAIEventList::iterator i = mEvents.begin(); i != mEvents.end(); ++i) { - InitTimer((*i)); - (*i).runOnce = false; + if (!((*i).event.event_flags & SMART_EVENT_FLAG_DONT_RESET)) + { + InitTimer((*i)); + (*i).runOnce = false; + } } ProcessEventsFor(SMART_EVENT_RESET); mLastInvoker = 0; @@ -695,7 +739,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->DoFleeToGetAssistance(); if (e.action.flee.withEmote) - sCreatureTextMgr->SendChatString(me, sObjectMgr->GetTrinityStringForDBCLocale(LANG_FLEE), CHAT_MSG_MONSTER_EMOTE); + { + TrinityStringTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, LANG_FLEE, LANG_UNIVERSAL, 0); + sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); + } sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: Creature %u DoFleeToGetAssistance", me->GetGUIDLow()); break; } @@ -999,9 +1046,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; if (e.action.invincHP.percent) - ai->SetInvinceabilityHpLevel(me->CountPctFromMaxHealth(e.action.invincHP.percent)); + ai->SetInvincibilityHpLevel(me->CountPctFromMaxHealth(e.action.invincHP.percent)); else - ai->SetInvinceabilityHpLevel(e.action.invincHP.minHP); + ai->SetInvincibilityHpLevel(e.action.invincHP.minHP); break; } case SMART_ACTION_SET_DATA: @@ -1072,12 +1119,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { - if (!IsUnit(*itr)) - continue; - (*itr)->GetPosition(x, y, z, o); + x += e.target.x; + y += e.target.y; + z += e.target.z; + o += e.target.o; if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) - if (unit && e.action.summonCreature.attackInvoker) + if (e.action.summonCreature.attackInvoker) summon->AI()->AttackStart((*itr)->ToUnit()); } @@ -1107,6 +1155,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u continue; (*itr)->GetPosition(x, y, z, o); + x += e.target.x; + y += e.target.y; + z += e.target.z; + o += e.target.o; GetBaseObject()->SummonGameObject(e.action.summonGO.entry, x, y, z, o, 0, 0, 0, 0, e.action.summonGO.despawnTime); } @@ -1320,19 +1372,20 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u e.GetTargetType() == SMART_TARGET_CREATURE_DISTANCE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_RANGE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_GUID || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_DISTANCE || e.GetTargetType() == SMART_TARGET_CLOSEST_CREATURE || e.GetTargetType() == SMART_TARGET_CLOSEST_GAMEOBJECT || - e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER) + e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER) { ObjectList* targets = GetTargets(e, unit); if (!targets) break; target = targets->front(); + delete targets; } - if(!target) - me->GetMotionMaster()->MovePoint(0, e.target.x, e.target.y, e.target.z); + if (!target) + me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, e.target.x, e.target.y, e.target.z); else - me->GetMotionMaster()->MovePoint(0, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); + me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); break; } case SMART_ACTION_RESPAWN_TARGET: @@ -1481,6 +1534,27 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u case SMART_ACTION_CALL_SCRIPT_RESET: OnReset(); break; + case SMART_ACTION_SET_RANGED_MOVEMENT: + { + if (!IsSmart()) + break; + + float attackDistance = (float)e.action.setRangedMovement.distance; + float attackAngle = e.action.setRangedMovement.angle / 180.0f * M_PI; + + ObjectList* targets = GetTargets(e, unit); + if (targets) + { + for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); ++itr) + if (Creature* target = (*itr)->ToCreature()) + if (IsSmart(target) && target->getVictim()) + if (CAST_AI(SmartAI, target->AI())->CanCombatMove()) + target->GetMotionMaster()->MoveChase(target->getVictim(), attackDistance, attackAngle); + + delete targets; + } + break; + } case SMART_ACTION_CALL_TIMED_ACTIONLIST: { if (e.GetTargetType() == SMART_TARGET_NONE) @@ -1817,19 +1891,26 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!targets) break; + ObjectList* storedTargets = GetTargetList(e.action.sendTargetToTarget.id); + if (!storedTargets) + { + delete targets; + return; + } + for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { if (IsCreature(*itr)) { if (SmartAI* ai = CAST_AI(SmartAI, (*itr)->ToCreature()->AI())) - ai->GetScript()->StoreTargetList(GetTargetList(e.action.sendTargetToTarget.id), e.action.sendTargetToTarget.id); + ai->GetScript()->StoreTargetList(new ObjectList(*storedTargets), e.action.sendTargetToTarget.id); // store a copy of target list else sLog->outErrorDb("SmartScript: Action target for SMART_ACTION_SEND_TARGET_TO_TARGET is not using SmartAI, skipping"); } else if (IsGameObject(*itr)) { if (SmartGameObjectAI* ai = CAST_AI(SmartGameObjectAI, (*itr)->ToGameObject()->AI())) - ai->GetScript()->StoreTargetList(GetTargetList(e.action.sendTargetToTarget.id), e.action.sendTargetToTarget.id); + ai->GetScript()->StoreTargetList(new ObjectList(*storedTargets), e.action.sendTargetToTarget.id); // store a copy of target list else sLog->outErrorDb("SmartScript: Action target for SMART_ACTION_SEND_TARGET_TO_TARGET is not using SmartGameObjectAI, skipping"); } @@ -1865,7 +1946,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } default: - sLog->outErrorDb("SmartScript::ProcessAction: Unhandled Action type %u", e.GetActionType()); + sLog->outErrorDb("SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; } @@ -1909,7 +1990,8 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e) } case SMARTAI_TEMPLATE_CAGED_NPC_PART: { - if (!me) return; + if (!me) + return; //store cage as id1 AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_GAMEOBJECT, e.action.installTtemplate.param1, 10, 0, 0); @@ -1931,7 +2013,8 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e) } case SMARTAI_TEMPLATE_CAGED_GO_PART: { - if (!go) return; + if (!go) + return; //store hostage as id1 AddEvent(SMART_EVENT_GOSSIP_HELLO, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0); //store invoker as id2 @@ -2794,8 +2877,12 @@ void SmartScript::InstallEvents() bool SmartScript::ConditionValid(Unit* u, int32 c, int32 v1, int32 v2, int32 v3) { - if (c == 0) return true; - if (!u || !u->ToPlayer()) return false; + if (c == 0) + return true; + + if (!u || !u->ToPlayer()) + return false; + Condition cond; cond.ConditionType = ConditionTypes(uint32(c)); cond.ConditionValue1 = uint32(v1); @@ -2962,7 +3049,9 @@ void SmartScript::OnMoveInLineOfSight(Unit* who) { ProcessEventsFor(SMART_EVENT_OOC_LOS, who); - if (!me) return; + if (!me) + return; + if (me->getVictim()) return; diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index f7524582ab7..5fb691c87f2 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -23,7 +23,6 @@ #include "CreatureAI.h" #include "Unit.h" #include "ConditionMgr.h" -#include "CreatureTextMgr.h" #include "Spell.h" #include "GridNotifiers.h" @@ -99,7 +98,13 @@ class SmartScript return; if (mTargetStorage->find(id) != mTargetStorage->end()) + { + // check if already stored + if ((*mTargetStorage)[id] == targets) + return; + delete (*mTargetStorage)[id]; + } (*mTargetStorage)[id] = targets; } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index f99e317454c..a7149f37480 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -27,6 +27,7 @@ #include "InstanceScript.h" #include "ScriptedCreature.h" #include "GameEventMgr.h" +#include "CreatureTextMgr.h" #include "SmartScriptMgr.h" @@ -34,6 +35,14 @@ void SmartWaypointMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); + for (UNORDERED_MAP::iterator itr = waypoint_map.begin(); itr != waypoint_map.end(); ++itr) + { + for (WPPath::iterator pathItr = itr->second->begin(); pathItr != itr->second->end(); ++pathItr) + delete pathItr->second; + + delete itr->second; + } + waypoint_map.clear(); PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_SMARTAI_WP); @@ -48,7 +57,6 @@ void SmartWaypointMgr::LoadFromDB() uint32 count = 0; uint32 total = 0; - WPPath* path = NULL; uint32 last_entry = 0; uint32 last_id = 1; @@ -62,27 +70,19 @@ void SmartWaypointMgr::LoadFromDB() y = fields[3].GetFloat(); z = fields[4].GetFloat(); - WayPoint* wp = new WayPoint(id, x, y, z); - if (last_entry != entry) { - path = new WPPath; + waypoint_map[entry] = new WPPath(); last_id = 1; + count++; } if (last_id != id) - { sLog->outErrorDb("SmartWaypointMgr::LoadFromDB: Path entry %u, unexpected point id %u, expected %u.", entry, id, last_id); - } last_id++; - (*path)[id] = wp; + (*waypoint_map[entry])[id] = new WayPoint(id, x, y, z); - if (last_entry != entry) - { - count++; - waypoint_map[entry] = path; - } last_entry = entry; total++; } @@ -92,6 +92,19 @@ void SmartWaypointMgr::LoadFromDB() sLog->outString(); } +SmartWaypointMgr::~SmartWaypointMgr() +{ + for (UNORDERED_MAP::iterator itr = waypoint_map.begin(); itr != waypoint_map.end(); ++itr) + { + for (WPPath::iterator pathItr = itr->second->begin(); pathItr != itr->second->end(); ++pathItr) + delete pathItr->second; + + delete itr->second; + } + + waypoint_map.clear(); +} + void SmartAIMgr::LoadSmartAIFromDB() { uint32 oldMSTime = getMSTime(); @@ -185,7 +198,6 @@ void SmartAIMgr::LoadSmartAIFromDB() temp.event.raw.param4 = fields[11].GetUInt32(); temp.action.type = (SMART_ACTION)fields[12].GetUInt8(); - temp.action.raw.param1 = fields[13].GetUInt32(); temp.action.raw.param2 = fields[14].GetUInt32(); temp.action.raw.param3 = fields[15].GetUInt32(); @@ -312,7 +324,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d, event type %u can not be used for Script type %u", e.entryOrGuid, e.GetEventType(), e.GetScriptType()); return false; } - if (e.action.type >= SMART_ACTION_END) + if (e.action.type <= 0 || e.action.type >= SMART_ACTION_END) { sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d using event(%u) has invalid action type (%u), skipped.", e.entryOrGuid, e.event_id, e.GetActionType()); return false; @@ -322,11 +334,19 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d using event(%u) has invalid phase mask (%u), skipped.", e.entryOrGuid, e.event_id, e.event.event_phase_mask); return false; } + if (e.event.event_flags > SMART_EVENT_FLAGS_ALL) + { + sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d using event(%u) has invalid event flags (%u), skipped.", e.entryOrGuid, e.event_id, e.event.event_flags); + return false; + } if (e.GetScriptType() == SMART_SCRIPT_TYPE_TIMED_ACTIONLIST) { e.event.type = SMART_EVENT_UPDATE_OOC;//force default OOC, can change when calling the script! - if (!IsMinMaxValid(e, e.event.minMaxRepeat.min, e.event.minMaxRepeat.max)) return false; - if (!IsMinMaxValid(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax)) return false; + if (!IsMinMaxValid(e, e.event.minMaxRepeat.min, e.event.minMaxRepeat.max)) + return false; + + if (!IsMinMaxValid(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax)) + return false; } else { @@ -344,8 +364,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_EVENT_DAMAGED: case SMART_EVENT_DAMAGED_TARGET: case SMART_EVENT_RECEIVE_HEAL: - if (!IsMinMaxValid(e, e.event.minMaxRepeat.min, e.event.minMaxRepeat.max)) return false; - if (!IsMinMaxValid(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax)) return false; + if (!IsMinMaxValid(e, e.event.minMaxRepeat.min, e.event.minMaxRepeat.max)) + return false; + + if (!IsMinMaxValid(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax)) + return false; break; case SMART_EVENT_SPELLHIT: case SMART_EVENT_SPELLHIT_TARGET: @@ -363,11 +386,13 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; } } - if (!IsMinMaxValid(e, e.event.spellHit.cooldownMin, e.event.spellHit.cooldownMax)) return false; + if (!IsMinMaxValid(e, e.event.spellHit.cooldownMin, e.event.spellHit.cooldownMax)) + return false; break; case SMART_EVENT_OOC_LOS: case SMART_EVENT_IC_LOS: - if (!IsMinMaxValid(e, e.event.los.cooldownMin, e.event.los.cooldownMax)) return false; + if (!IsMinMaxValid(e, e.event.los.cooldownMin, e.event.los.cooldownMax)) + return false; break; case SMART_EVENT_RESPAWN: if (e.event.respawn.type == SMART_SCRIPT_RESPAWN_CONDITION_MAP && !sMapStore.LookupEntry(e.event.respawn.map)) @@ -382,32 +407,48 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_EVENT_FRIENDLY_HEALTH: - if (!NotNULL(e, e.event.friendlyHealt.radius)) return false; - if (!IsMinMaxValid(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax)) return false; + if (!NotNULL(e, e.event.friendlyHealt.radius)) + return false; + + if (!IsMinMaxValid(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax)) + return false; break; case SMART_EVENT_FRIENDLY_IS_CC: - if (!IsMinMaxValid(e, e.event.friendlyCC.repeatMin, e.event.friendlyCC.repeatMax)) return false; + if (!IsMinMaxValid(e, e.event.friendlyCC.repeatMin, e.event.friendlyCC.repeatMax)) + return false; break; case SMART_EVENT_FRIENDLY_MISSING_BUFF: { - if (!IsSpellValid(e, e.event.missingBuff.spell)) return false; - if (!NotNULL(e, e.event.missingBuff.radius)) return false; - if (!IsMinMaxValid(e, e.event.missingBuff.repeatMin, e.event.missingBuff.repeatMax)) return false; + if (!IsSpellValid(e, e.event.missingBuff.spell)) + return false; + + if (!NotNULL(e, e.event.missingBuff.radius)) + return false; + + if (!IsMinMaxValid(e, e.event.missingBuff.repeatMin, e.event.missingBuff.repeatMax)) + return false; break; } case SMART_EVENT_KILL: - if (!IsMinMaxValid(e, e.event.kill.cooldownMin, e.event.kill.cooldownMax)) return false; - if (e.event.kill.creature && !IsCreatureValid(e, e.event.kill.creature)) return false; + if (!IsMinMaxValid(e, e.event.kill.cooldownMin, e.event.kill.cooldownMax)) + return false; + + if (e.event.kill.creature && !IsCreatureValid(e, e.event.kill.creature)) + return false; break; case SMART_EVENT_TARGET_CASTING: case SMART_EVENT_PASSENGER_BOARDED: case SMART_EVENT_PASSENGER_REMOVED: - if (!IsMinMaxValid(e, e.event.minMax.repeatMin, e.event.minMax.repeatMax)) return false; + if (!IsMinMaxValid(e, e.event.minMax.repeatMin, e.event.minMax.repeatMax)) + return false; break; case SMART_EVENT_SUMMON_DESPAWNED: case SMART_EVENT_SUMMONED_UNIT: - if (e.event.summoned.creature && !IsCreatureValid(e, e.event.summoned.creature)) return false; - if (!IsMinMaxValid(e, e.event.summoned.cooldownMin, e.event.summoned.cooldownMax)) return false; + if (e.event.summoned.creature && !IsCreatureValid(e, e.event.summoned.creature)) + return false; + + if (!IsMinMaxValid(e, e.event.summoned.cooldownMin, e.event.summoned.cooldownMax)) + return false; break; case SMART_EVENT_ACCEPTED_QUEST: case SMART_EVENT_REWARD_QUEST: @@ -416,20 +457,27 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; case SMART_EVENT_RECEIVE_EMOTE: { - if (e.event.emote.emote && !IsTextEmoteValid(e, e.event.emote.emote)) return false; - if (!IsMinMaxValid(e, e.event.emote.cooldownMin, e.event.emote.cooldownMax)) return false; + if (e.event.emote.emote && !IsTextEmoteValid(e, e.event.emote.emote)) + return false; + + if (!IsMinMaxValid(e, e.event.emote.cooldownMin, e.event.emote.cooldownMax)) + return false; break; } case SMART_EVENT_HAS_AURA: case SMART_EVENT_TARGET_BUFFED: { - if (!IsSpellValid(e, e.event.aura.spell)) return false; - if (!IsMinMaxValid(e, e.event.aura.repeatMin, e.event.aura.repeatMax)) return false; + if (!IsSpellValid(e, e.event.aura.spell)) + return false; + + if (!IsMinMaxValid(e, e.event.aura.repeatMin, e.event.aura.repeatMax)) + return false; break; } case SMART_EVENT_TRANSPORT_ADDCREATURE: { - if (e.event.transportAddCreature.creature && !IsCreatureValid(e, e.event.transportAddCreature.creature)) return false; + if (e.event.transportAddCreature.creature && !IsCreatureValid(e, e.event.transportAddCreature.creature)) + return false; break; } case SMART_EVENT_MOVEMENTINFORM: @@ -443,12 +491,14 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } case SMART_EVENT_DATA_SET: { - if (!IsMinMaxValid(e, e.event.dataSet.cooldownMin, e.event.dataSet.cooldownMax)) return false; + if (!IsMinMaxValid(e, e.event.dataSet.cooldownMin, e.event.dataSet.cooldownMax)) + return false; break; } case SMART_EVENT_AREATRIGGER_ONTRIGGER: { - if (e.event.areatrigger.id && !IsAreaTriggerValid(e, e.event.areatrigger.id)) return false; + if (e.event.areatrigger.id && !IsAreaTriggerValid(e, e.event.areatrigger.id)) + return false; break; } case SMART_EVENT_TEXT_OVER: @@ -464,8 +514,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; } case SMART_EVENT_DUMMY_EFFECT: - if (!IsSpellValid(e, e.event.dummy.spell)) return false; - if (e.event.dummy.effIndex > EFFECT_2) return false; + if (!IsSpellValid(e, e.event.dummy.spell)) + return false; + + if (e.event.dummy.effIndex > EFFECT_2) + return false; break; case SMART_EVENT_IS_BEHIND_TARGET: if (!IsMinMaxValid(e, e.event.behindTarget.cooldownMin, e.event.behindTarget.cooldownMax)) @@ -562,11 +615,13 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; case SMART_ACTION_SET_EMOTE_STATE: case SMART_ACTION_PLAY_EMOTE: - if (!IsEmoteValid(e, e.action.emote.emote)) return false; + if (!IsEmoteValid(e, e.action.emote.emote)) + return false; break; case SMART_ACTION_FAIL_QUEST: case SMART_ACTION_ADD_QUEST: - if (!e.action.quest.quest || !IsQuestValid(e, e.action.quest.quest)) return false; + if (!e.action.quest.quest || !IsQuestValid(e, e.action.quest.quest)) + return false; break; case SMART_ACTION_ACTIVATE_TAXI: { @@ -578,17 +633,29 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; } case SMART_ACTION_RANDOM_EMOTE: - if (e.action.randomEmote.emote1 && !IsEmoteValid(e, e.action.randomEmote.emote1)) return false; - if (e.action.randomEmote.emote2 && !IsEmoteValid(e, e.action.randomEmote.emote2)) return false; - if (e.action.randomEmote.emote3 && !IsEmoteValid(e, e.action.randomEmote.emote3)) return false; - if (e.action.randomEmote.emote4 && !IsEmoteValid(e, e.action.randomEmote.emote4)) return false; - if (e.action.randomEmote.emote5 && !IsEmoteValid(e, e.action.randomEmote.emote5)) return false; - if (e.action.randomEmote.emote6 && !IsEmoteValid(e, e.action.randomEmote.emote6)) return false; + if (e.action.randomEmote.emote1 && !IsEmoteValid(e, e.action.randomEmote.emote1)) + return false; + + if (e.action.randomEmote.emote2 && !IsEmoteValid(e, e.action.randomEmote.emote2)) + return false; + + if (e.action.randomEmote.emote3 && !IsEmoteValid(e, e.action.randomEmote.emote3)) + return false; + + if (e.action.randomEmote.emote4 && !IsEmoteValid(e, e.action.randomEmote.emote4)) + return false; + + if (e.action.randomEmote.emote5 && !IsEmoteValid(e, e.action.randomEmote.emote5)) + return false; + + if (e.action.randomEmote.emote6 && !IsEmoteValid(e, e.action.randomEmote.emote6)) + return false; break; case SMART_ACTION_ADD_AURA: case SMART_ACTION_CAST: case SMART_ACTION_INVOKER_CAST: - if (!IsSpellValid(e, e.action.cast.spell)) return false; + if (!IsSpellValid(e, e.action.cast.spell)) + return false; break; case SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS: case SMART_ACTION_CALL_GROUPEVENTHAPPENS: @@ -607,8 +674,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_ACTION_SEND_CASTCREATUREORGO: - if (!IsQuestValid(e, e.action.castCreatureOrGO.quest)) return false; - if (!IsSpellValid(e, e.action.castCreatureOrGO.spell)) return false; + if (!IsQuestValid(e, e.action.castCreatureOrGO.quest)) + return false; + + if (!IsSpellValid(e, e.action.castCreatureOrGO.spell)) + return false; break; @@ -632,11 +702,15 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_ACTION_CALL_CASTEDCREATUREORGO: - if (!IsCreatureValid(e, e.action.castedCreatureOrGO.creature)) return false; - if (!IsSpellValid(e, e.action.castedCreatureOrGO.spell)) return false; + if (!IsCreatureValid(e, e.action.castedCreatureOrGO.creature)) + return false; + + if (!IsSpellValid(e, e.action.castedCreatureOrGO.spell)) + return false; break; case SMART_ACTION_REMOVEAURASFROMSPELL: - if (!IsSpellValid(e, e.action.removeAura.spell)) return false; + if (!IsSpellValid(e, e.action.removeAura.spell)) + return false; break; case SMART_ACTION_RANDOM_PHASE: { @@ -660,11 +734,13 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) sLog->outErrorDb("SmartAIMgr: Entry %d SourceType %u Event %u Action %u attempts to set invalid phase, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); return false; } - if (!IsMinMaxValid(e, e.action.randomPhaseRange.phaseMin, e.action.randomPhaseRange.phaseMax)) return false; + if (!IsMinMaxValid(e, e.action.randomPhaseRange.phaseMin, e.action.randomPhaseRange.phaseMax)) + return false; break; } case SMART_ACTION_SUMMON_CREATURE: - if (!IsCreatureValid(e, e.action.summonCreature.creature)) return false; + if (!IsCreatureValid(e, e.action.summonCreature.creature)) + return false; if (e.action.summonCreature.type < TEMPSUMMON_TIMED_OR_DEAD_DESPAWN || e.action.summonCreature.type > TEMPSUMMON_MANUAL_DESPAWN) { sLog->outErrorDb("SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TempSummonType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.type); @@ -672,10 +748,12 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_ACTION_CALL_KILLEDMONSTER: - if (!IsCreatureValid(e, e.action.killedMonster.creature)) return false; + if (!IsCreatureValid(e, e.action.killedMonster.creature)) + return false; break; case SMART_ACTION_UPDATE_TEMPLATE: - if (e.action.updateTemplate.creature && !IsCreatureValid(e, e.action.updateTemplate.creature)) return false; + if (e.action.updateTemplate.creature && !IsCreatureValid(e, e.action.updateTemplate.creature)) + return false; break; case SMART_ACTION_SET_SHEATH: if (e.action.setSheath.sheath && e.action.setSheath.sheath >= MAX_SHEATH_STATE) @@ -694,12 +772,16 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; } case SMART_ACTION_SUMMON_GO: - if (!IsGameObjectValid(e, e.action.summonGO.entry)) return false; + if (!IsGameObjectValid(e, e.action.summonGO.entry)) + return false; break; case SMART_ACTION_ADD_ITEM: case SMART_ACTION_REMOVE_ITEM: - if (!IsItemValid(e, e.action.item.entry)) return false; - if (!NotNULL(e, e.action.item.count)) return false; + if (!IsItemValid(e, e.action.item.entry)) + return false; + + if (!NotNULL(e, e.action.item.count)) + return false; break; case SMART_ACTION_TELEPORT: if (!sMapStore.LookupEntry(e.action.teleport.mapID)) @@ -716,7 +798,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_ACTION_WP_STOP: - if (e.action.wpStop.quest && !IsQuestValid(e, e.action.wpStop.quest)) return false; + if (e.action.wpStop.quest && !IsQuestValid(e, e.action.wpStop.quest)) + return false; break; case SMART_ACTION_WP_START: { @@ -725,7 +808,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) sLog->outErrorDb("SmartAIMgr: Creature %d Event %u Action %u uses non-existent WaypointPath id %u, skipped.", e.entryOrGuid, e.event_id, e.GetActionType(), e.action.wpStart.pathID); return false; } - if (e.action.wpStart.quest && !IsQuestValid(e, e.action.wpStart.quest)) return false; + if (e.action.wpStart.quest && !IsQuestValid(e, e.action.wpStart.quest)) + return false; if (e.action.wpStart.reactState > REACT_AGGRESSIVE) { sLog->outErrorDb("SmartAIMgr: Creature %d Event %u Action %u uses invalid React State %u, skipped.", e.entryOrGuid, e.event_id, e.GetActionType(), e.action.wpStart.reactState); @@ -735,8 +819,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } case SMART_ACTION_CREATE_TIMED_EVENT: { - if (!IsMinMaxValid(e, e.action.timeEvent.min, e.action.timeEvent.max)) return false; - if (!IsMinMaxValid(e, e.action.timeEvent.repeatMin, e.action.timeEvent.repeatMax)) return false; + if (!IsMinMaxValid(e, e.action.timeEvent.min, e.action.timeEvent.max)) + return false; + + if (!IsMinMaxValid(e, e.action.timeEvent.repeatMin, e.action.timeEvent.repeatMax)) + return false; break; } case SMART_ACTION_FOLLOW: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 7869a2e665f..e6c5eb727d7 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -23,7 +23,6 @@ #include "CreatureAI.h" #include "Unit.h" #include "ConditionMgr.h" -#include "CreatureTextMgr.h" #include "Spell.h" #include "DB2Stores.h" @@ -443,7 +442,7 @@ enum SMART_ACTION SMART_ACTION_CREATE_TIMED_EVENT = 67, // id, InitialMin, InitialMax, RepeatMin(only if it repeats), RepeatMax(only if it repeats), chance SMART_ACTION_PLAYMOVIE = 68, // entry - SMART_ACTION_MOVE_TO_POS = 69, // xyz + SMART_ACTION_MOVE_TO_POS = 69, // PointId, xyz SMART_ACTION_RESPAWN_TARGET = 70, // SMART_ACTION_EQUIP = 71, // entry, slotmask slot1, slot2, slot3 , only slots with mask set will be sent to client, bits are 1, 2, 4, leaving mask 0 is defaulted to mask 7 (send all), slots1-3 are only used if no entry is set SMART_ACTION_CLOSE_GOSSIP = 72, // none @@ -453,7 +452,7 @@ enum SMART_ACTION SMART_ACTION_OVERRIDE_SCRIPT_BASE_OBJECT = 76, // WARNING: CAN CRASH CORE, do not use if you dont know what you are doing SMART_ACTION_RESET_SCRIPT_BASE_OBJECT = 77, // none SMART_ACTION_CALL_SCRIPT_RESET = 78, // none - // Unused = 79, + SMART_ACTION_SET_RANGED_MOVEMENT = 79, // Distance, angle SMART_ACTION_CALL_TIMED_ACTIONLIST = 80, // ID (overwrites already running actionlist), stop after combat?(0/1), timer update type(0-OOC, 1-IC, 2-ALWAYS) SMART_ACTION_SET_NPC_FLAG = 81, // Flags SMART_ACTION_ADD_NPC_FLAG = 82, // Flags @@ -874,6 +873,11 @@ struct SmartAction uint32 goRespawnTime; } RespawnTarget; + struct + { + uint8 pointId; + } MoveToPos; + struct { uint32 gossipMenuId; @@ -890,6 +894,12 @@ struct SmartAction uint32 id; } sendTargetToTarget; + struct + { + float distance; + float angle; + } setRangedMovement; + struct { uint32 param1; @@ -1162,16 +1172,18 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = enum SmartEventFlags { - SMART_EVENT_FLAG_NOT_REPEATABLE = 0x01, //Event can not repeat - SMART_EVENT_FLAG_DIFFICULTY_0 = 0x02, //Event only occurs in instance difficulty 0 - SMART_EVENT_FLAG_DIFFICULTY_1 = 0x04, //Event only occurs in instance difficulty 1 - SMART_EVENT_FLAG_DIFFICULTY_2 = 0x08, //Event only occurs in instance difficulty 2 - SMART_EVENT_FLAG_DIFFICULTY_3 = 0x10, //Event only occurs in instance difficulty 3 - SMART_EVENT_FLAG_RESERVED_5 = 0x20, - SMART_EVENT_FLAG_RESERVED_6 = 0x40, - SMART_EVENT_FLAG_DEBUG_ONLY = 0x80, //Event only occurs in debug build - - SMART_EVENT_FLAG_DIFFICULTY_ALL = (SMART_EVENT_FLAG_DIFFICULTY_0|SMART_EVENT_FLAG_DIFFICULTY_1|SMART_EVENT_FLAG_DIFFICULTY_2|SMART_EVENT_FLAG_DIFFICULTY_3) + SMART_EVENT_FLAG_NOT_REPEATABLE = 0x001, //Event can not repeat + SMART_EVENT_FLAG_DIFFICULTY_0 = 0x002, //Event only occurs in instance difficulty 0 + SMART_EVENT_FLAG_DIFFICULTY_1 = 0x004, //Event only occurs in instance difficulty 1 + SMART_EVENT_FLAG_DIFFICULTY_2 = 0x008, //Event only occurs in instance difficulty 2 + SMART_EVENT_FLAG_DIFFICULTY_3 = 0x010, //Event only occurs in instance difficulty 3 + SMART_EVENT_FLAG_RESERVED_5 = 0x020, + SMART_EVENT_FLAG_RESERVED_6 = 0x040, + SMART_EVENT_FLAG_DEBUG_ONLY = 0x080, //Event only occurs in debug build + SMART_EVENT_FLAG_DONT_RESET = 0x100, //Event will not reset in SmartScript::OnReset() + + SMART_EVENT_FLAG_DIFFICULTY_ALL = (SMART_EVENT_FLAG_DIFFICULTY_0|SMART_EVENT_FLAG_DIFFICULTY_1|SMART_EVENT_FLAG_DIFFICULTY_2|SMART_EVENT_FLAG_DIFFICULTY_3), + SMART_EVENT_FLAGS_ALL = (SMART_EVENT_FLAG_NOT_REPEATABLE|SMART_EVENT_FLAG_DIFFICULTY_ALL|SMART_EVENT_FLAG_RESERVED_5|SMART_EVENT_FLAG_RESERVED_6|SMART_EVENT_FLAG_DEBUG_ONLY|SMART_EVENT_FLAG_DONT_RESET) }; enum SmartCastFlags @@ -1227,9 +1239,9 @@ typedef UNORDERED_MAP ObjectListMap; class SmartWaypointMgr { friend class ACE_Singleton; - SmartWaypointMgr(){}; + SmartWaypointMgr() {} public: - ~SmartWaypointMgr(){}; + ~SmartWaypointMgr(); void LoadFromDB(); diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index a6ae300e25d..8076f800356 100755 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -53,12 +53,21 @@ AccountOpResult CreateAccount(std::string username, std::string password) AccountOpResult DeleteAccount(uint32 accountId) { - QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d'", accountId); + // Check if accounts exists + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_ID); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (!result) - return AOR_NAME_NOT_EXIST; // account doesn't exist + return AOR_NAME_NOT_EXIST; + + // Obtain accounts characters + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID); + + stmt->setUInt32(0, accountId); + + result = CharacterDatabase.Query(stmt); - // existed characters list - result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE account='%d'", accountId); if (result) { do @@ -66,7 +75,7 @@ AccountOpResult DeleteAccount(uint32 accountId) uint32 guidLow = (*result)[0].GetUInt32(); uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER); - // kick if player is online + // Kick if player is online if (Player* p = ObjectAccessor::FindPlayer(guid)) { WorldSession* s = p->GetSession(); @@ -79,18 +88,35 @@ AccountOpResult DeleteAccount(uint32 accountId) } // table realm specific but common for all characters of account for realm - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_TUTORIALS); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_TUTORIALS); stmt->setUInt32(0, accountId); CharacterDatabase.Execute(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ACCOUNT_DATA); stmt->setUInt32(0, accountId); CharacterDatabase.Execute(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BAN); + stmt->setUInt32(0, accountId); + CharacterDatabase.Execute(stmt); + SQLTransaction trans = LoginDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM account WHERE id='%d'", accountId); - trans->PAppend("DELETE FROM account_access WHERE id ='%d'", accountId); - trans->PAppend("DELETE FROM realmcharacters WHERE acctid='%d'", accountId); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT); + stmt->setUInt32(0, accountId); + trans->Append(stmt); + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS); + stmt->setUInt32(0, accountId); + trans->Append(stmt); + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS); + stmt->setUInt32(0, accountId); + trans->Append(stmt); + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_BANNED); + stmt->setUInt32(0, accountId); + trans->Append(stmt); LoginDatabase.CommitTransaction(trans); @@ -99,9 +125,13 @@ AccountOpResult DeleteAccount(uint32 accountId) AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword) { - QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d'", accountId); + // Check if accounts exists + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_ID); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (!result) - return AOR_NAME_NOT_EXIST; // account doesn't exist + return AOR_NAME_NOT_EXIST; if (utf8length(newUsername) > MAX_ACCOUNT_STR) return AOR_NAME_TOO_LONG; @@ -112,7 +142,7 @@ AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::s normalizeString(newUsername); normalizeString(newPassword); - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_USERNAME); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_USERNAME); stmt->setString(0, newUsername); stmt->setString(1, CalculateShaPassHash(newUsername, newPassword)); @@ -148,28 +178,38 @@ AccountOpResult ChangePassword(uint32 accountId, std::string newPassword) uint32 GetId(std::string username) { - LoginDatabase.EscapeString(username); - QueryResult result = LoginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'", username.c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME); + stmt->setString(0, username); + PreparedQueryResult result = LoginDatabase.Query(stmt); + return (result) ? (*result)[0].GetUInt32() : 0; } uint32 GetSecurity(uint32 accountId) { - QueryResult result = LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u'", accountId); - return (result) ? (*result)[0].GetUInt32() : 0; + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + return (result) ? (*result)[0].GetUInt8() : uint32(SEC_PLAYER); } -uint32 GetSecurity(uint64 accountId, int32 realmId) +uint32 GetSecurity(uint32 accountId, int32 realmId) { - QueryResult result = (realmId == -1) - ? LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u' AND RealmID = '%d'", accountId, realmId) - : LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u' AND (RealmID = '%d' OR RealmID = '-1')", accountId, realmId); - return (result) ? (*result)[0].GetUInt32() : 0; + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_GMLEVEL_BY_REALMID); + stmt->setUInt32(0, accountId); + stmt->setInt32(1, realmId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + return (result) ? (*result)[0].GetUInt8() : uint32(SEC_PLAYER); } bool GetName(uint32 accountId, std::string& name) { - QueryResult result = LoginDatabase.PQuery("SELECT username FROM account WHERE id = '%u'", accountId); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_USERNAME_BY_ID); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (result) { name = (*result)[0].GetString(); @@ -189,15 +229,22 @@ bool CheckPassword(uint32 accountId, std::string password) normalizeString(username); normalizeString(password); - QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d' AND sha_pass_hash='%s'", accountId, CalculateShaPassHash(username, password).c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_CHECK_PASSWORD); + stmt->setUInt32(0, accountId); + stmt->setString(1, CalculateShaPassHash(username, password)); + PreparedQueryResult result = LoginDatabase.Query(stmt); + return (result) ? true : false; } uint32 GetCharactersCount(uint32 accountId) { // check character count - QueryResult result = CharacterDatabase.PQuery("SELECT COUNT(guid) FROM characters WHERE account = '%d'", accountId); - return (result) ? (*result)[0].GetUInt32() : 0; + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_SUM_CHARS); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + return (result) ? (*result)[0].GetUInt64() : 0; } bool normalizeString(std::string& utf8String) diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 1b1ecfa994a..c69f3c0a6f3 100755 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -36,25 +36,25 @@ enum AccountOpResult namespace AccountMgr { - AccountOpResult CreateAccount(std::string username, std::string password); - AccountOpResult DeleteAccount(uint32 accountId); - AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword); - AccountOpResult ChangePassword(uint32 accountId, std::string newPassword); - bool CheckPassword(uint32 accountId, std::string password); - - uint32 GetId(std::string username); - uint32 GetSecurity(uint32 accountId); - uint32 GetSecurity(uint64 accountId, int32 realmId); - bool GetName(uint32 accountId, std::string& name); - uint32 GetCharactersCount(uint32 accountId); - std::string CalculateShaPassHash(std::string& name, std::string& password); - - bool normalizeString(std::string& utf8String); - bool IsPlayerAccount(uint32 gmlevel); - bool IsModeratorAccount(uint32 gmlevel); - bool IsGMAccount(uint32 gmlevel); - bool IsAdminAccount(uint32 gmlevel); - bool IsConsoleAccount(uint32 gmlevel); + AccountOpResult CreateAccount(std::string username, std::string password); + AccountOpResult DeleteAccount(uint32 accountId); + AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword); + AccountOpResult ChangePassword(uint32 accountId, std::string newPassword); + bool CheckPassword(uint32 accountId, std::string password); + + uint32 GetId(std::string username); + uint32 GetSecurity(uint32 accountId); + uint32 GetSecurity(uint32 accountId, int32 realmId); + bool GetName(uint32 accountId, std::string& name); + uint32 GetCharactersCount(uint32 accountId); + std::string CalculateShaPassHash(std::string& name, std::string& password); + + bool normalizeString(std::string& utf8String); + bool IsPlayerAccount(uint32 gmlevel); + bool IsModeratorAccount(uint32 gmlevel); + bool IsGMAccount(uint32 gmlevel); + bool IsAdminAccount(uint32 gmlevel); + bool IsConsoleAccount(uint32 gmlevel); }; #endif diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index aa6c39f351d..21a2a75b470 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -445,8 +445,15 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin void AchievementMgr::DeleteFromDB(uint32 lowguid) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM character_achievement WHERE guid = %u", lowguid); - trans->PAppend("DELETE FROM character_achievement_progress WHERE guid = %u", lowguid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT); + stmt->setUInt32(0, lowguid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS); + stmt->setUInt32(0, lowguid); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } @@ -574,7 +581,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ // title achievement rewards are retroactive if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) - if (uint32 titleId = reward->titleId[GetPlayer()->GetTeam() == ALLIANCE ? 0 : 1]) + if (uint32 titleId = reward->titleId[Player::TeamForRace(GetPlayer()->getRace()) == ALLIANCE ? 0 : 1]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) if (!GetPlayer()->HasTitle(titleEntry)) GetPlayer()->SetTitle(titleEntry); @@ -1340,7 +1347,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1) { uint32 points = 0; - for (CompletedAchievementMap::iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) + for (CompletedAchievementMap::iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) if (AchievementEntry const* pAchievement = sAchievementStore.LookupEntry(itr->first)) points += pAchievement->points; SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET); @@ -1889,7 +1896,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) return; SendAchievementEarned(achievement); - CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; + CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; ca.date = time(NULL); ca.changed = true; @@ -1920,7 +1927,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) // mail if (reward->sender) { - Item* item = reward->itemId ? Item::CreateItem(reward->itemId, 1, GetPlayer ()) : NULL; + Item* item = reward->itemId ? Item::CreateItem(reward->itemId, 1, GetPlayer()) : NULL; int loc_idx = GetPlayer()->GetSession()->GetSessionDbLocaleIndex(); @@ -2274,7 +2281,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() continue; } - uint32 dataType = fields[1].GetUInt32(); + uint32 dataType = fields[1].GetUInt8(); const char* scriptName = fields[4].GetCString(); uint32 scriptId = 0; if (strcmp(scriptName, "")) // not empty @@ -2407,7 +2414,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() { Field* fields = result->Fetch(); - uint32 achievementId = fields[0].GetUInt32(); + uint16 achievementId = fields[0].GetUInt16(); const AchievementEntry* achievement = sAchievementStore.LookupEntry(achievementId); if (!achievement) { diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 5b42ebe45b7..a156583a006 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -482,7 +482,9 @@ void AuctionHouseObject::Update() if (AuctionsMap.empty()) return; - QueryResult result = CharacterDatabase.PQuery("SELECT id FROM auctionhouse WHERE time <= %u ORDER BY TIME ASC", (uint32)curTime+60); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTION_BY_TIME); + stmt->setUInt32(0, (uint32)curTime+60); + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) return; @@ -793,7 +795,7 @@ void AuctionHouseMgr::DeleteExpiredAuctionsAtStartup() AuctionEntry* auction = new AuctionEntry(); - // Can't use LoadFromDB() because it assumes the auction map is loaded + // Can't use LoadFromDB() because it assumes the auction map is loaded if (!auction->LoadFromFieldList(fields)) { // For some reason the record in the DB is broken (possibly corrupt diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 02707261d13..89151b6395c 100755 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -145,7 +145,7 @@ bool ArenaTeam::AddMember(uint64 playerGuid) uint32 matchMakerRating; if (result) - matchMakerRating = (*result)[0].GetUInt32(); + matchMakerRating = (*result)[0].GetUInt16(); else matchMakerRating = sWorld->getIntConfig(CONFIG_ARENA_START_MATCHMAKER_RATING); @@ -154,18 +154,18 @@ bool ArenaTeam::AddMember(uint64 playerGuid) Player::RemovePetitionsAndSigns(playerGuid, GetType()); // Feed data to the struct - ArenaTeamMember newmember; - newmember.Name = playerName; - newmember.Guid = playerGuid; - newmember.Class = playerClass; - newmember.SeasonGames = 0; - newmember.WeekGames = 0; - newmember.SeasonWins = 0; - newmember.WeekWins = 0; - newmember.PersonalRating = personalRating; - newmember.MatchMakerRating = matchMakerRating; - - Members.push_back(newmember); + ArenaTeamMember newMember; + newMember.Name = playerName; + newMember.Guid = playerGuid; + newMember.Class = playerClass; + newMember.SeasonGames = 0; + newMember.WeekGames = 0; + newMember.SeasonWins = 0; + newMember.WeekWins = 0; + newMember.PersonalRating = personalRating; + newMember.MatchMakerRating = matchMakerRating; + + Members.push_back(newMember); // Save player's arena team membership to db stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ARENA_TEAM_MEMBER); @@ -267,7 +267,7 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result) if (Empty() || !captainPresentInTeam) { // Arena team is empty or captain is not in team, delete from db - sLog->outErrorDb("ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", TeamId); + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", TeamId); return false; } @@ -295,8 +295,10 @@ void ArenaTeam::SetCaptain(uint64 guid) if (newCaptain) { newCaptain->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 0); + char const* oldCaptainName = oldCaptain ? oldCaptain->GetName() : ""; + uint32 oldCaptainLowGuid = oldCaptain ? oldCaptain->GetGUIDLow() : 0; sLog->outArena("Player: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team [Id: %u] [Type: %u].", - oldCaptain->GetName(), oldCaptain->GetGUIDLow(), newCaptain->GetName(), newCaptain->GetGUIDLow(), GetId(), GetType()); + oldCaptainName, oldCaptainLowGuid, newCaptain->GetName(), newCaptain->GetGUIDLow(), GetId(), GetType()); } } @@ -304,11 +306,13 @@ void ArenaTeam::DelMember(uint64 guid, bool cleanDb) { // Remove member from team for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) + { if (itr->Guid == guid) { Members.erase(itr); break; } + } // Inform player and remove arena team info from player data if (Player* player = ObjectAccessor::FindPlayer(guid)) @@ -719,7 +723,7 @@ int32 ArenaTeam::LostAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int3 void ArenaTeam::MemberLost(Player* player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange) { // Called for each participant of a match after losing - for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) + for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) { if (itr->Guid == player->GetGUID()) { @@ -745,7 +749,7 @@ void ArenaTeam::MemberLost(Player* player, uint32 againstMatchmakerRating, int32 void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange) { // Called for offline player after ending rated arena match! - for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) + for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) { if (itr->Guid == guid) { @@ -767,7 +771,7 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating, i void ArenaTeam::MemberWon(Player* player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange) { // called for each participant after winning a match - for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) + for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) { if (itr->Guid == player->GetGUID()) { @@ -802,7 +806,7 @@ void ArenaTeam::UpdateArenaPointsHelper(std::map& playerPoints) // To get points, a player has to participate in at least 30% of the matches uint32 requiredGames = (uint32)ceil(Stats.WeekGames * 0.3f); - for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) + for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) { // The player participated in enough games, update his points uint32 pointsToAdd = 0; @@ -838,7 +842,7 @@ void ArenaTeam::SaveToDB() stmt->setUInt32(6, GetId()); trans->Append(stmt); - for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) + for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ARENA_TEAM_MEMBER); stmt->setUInt16(0, itr->PersonalRating); @@ -867,7 +871,7 @@ void ArenaTeam::FinishWeek() Stats.WeekWins = 0; // Reset member stats - for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) + for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr) { itr->WeekGames = 0; itr->WeekWins = 0; diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index 7afa488a879..47282be3a8e 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -92,12 +92,12 @@ void ArenaTeamMgr::LoadArenaTeams() uint32 oldMSTime = getMSTime(); // Clean out the trash before loading anything - CharacterDatabase.Execute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)"); + CharacterDatabase.Execute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)"); // One-time query - // 0 1 2 3 4 5 6 7 8 - QueryResult result = CharacterDatabase.Query("SELECT arena_team.arenaTeamId, name, captainGuid, type, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor, " - // 9 10 11 12 13 14 - "rating, weekGames, weekWins, seasonGames, seasonWins, rank FROM arena_team ORDER BY arena_team.arenaTeamId ASC"); + // 0 1 2 3 4 5 6 7 8 + QueryResult result = CharacterDatabase.Query("SELECT arenaTeamId, name, captainGuid, type, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor, " + // 9 10 11 12 13 14 + "rating, weekGames, weekWins, seasonGames, seasonWins, rank FROM arena_team ORDER BY arenaTeamId ASC"); if (!result) { @@ -153,6 +153,8 @@ void ArenaTeamMgr::DistributeArenaPoints() SQLTransaction trans = CharacterDatabase.BeginTransaction(); + PreparedStatement* stmt; + // Cycle that gives points to all players /* for (std::map::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) @@ -161,7 +163,12 @@ void ArenaTeamMgr::DistributeArenaPoints() if (Player* player = HashMapHolder::Find(playerItr->first)) player->ModifyConquestPoints(playerItr->second, &trans); else // Update database - trans->PAppend("UPDATE characters SET arenaPoints=arenaPoints+%u WHERE guid=%u", playerItr->second, playerItr->first); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ARENA_POINTS); + stmt->setUInt32(0, playerItr->second); + stmt->setUInt32(1, playerItr->first); + trans->Append(stmt); + } } */ diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 191d2eaaeb6..54c84f2e6d4 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -21,7 +21,6 @@ #include "ArenaTeamMgr.h" #include "World.h" #include "WorldPacket.h" - #include "ArenaTeam.h" #include "Battleground.h" #include "BattlegroundMgr.h" @@ -66,7 +65,7 @@ namespace Trinity private: void do_helper(WorldPacket& data, char const* text) { - uint64 target_guid = _source ? _source ->GetGUID() : 0; + uint64 target_guid = _source ? _source->GetGUID() : 0; data << uint8 (_msgtype); data << uint32(LANG_UNIVERSAL); @@ -145,6 +144,7 @@ Battleground::Battleground() m_Winner = 2; m_StartTime = 0; m_ResetStatTimer = 0; + m_ValidStartPositionTimer = 0; m_Events = 0; m_IsRated = false; m_BuffChange = false; @@ -178,6 +178,8 @@ Battleground::Battleground() m_ArenaTeamIds[BG_TEAM_ALLIANCE] = 0; m_ArenaTeamIds[BG_TEAM_HORDE] = 0; + m_StartMaxDist = 0.0f; + m_ArenaTeamRatingChanges[BG_TEAM_ALLIANCE] = 0; m_ArenaTeamRatingChanges[BG_TEAM_HORDE] = 0; @@ -259,9 +261,7 @@ void Battleground::Update(uint32 diff) { case STATUS_WAIT_JOIN: if (GetPlayersSize()) - { _ProcessJoin(diff); - } break; case STATUS_IN_PROGRESS: _ProcessOfflineQueue(); @@ -294,6 +294,7 @@ void Battleground::Update(uint32 diff) // Update start time and reset stats timer m_StartTime += diff; m_ResetStatTimer += diff; + m_ValidStartPositionTimer += diff; PostUpdateImpl(diff); } @@ -425,7 +426,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) // ********************************************************* ModifyStartDelayTime(diff); - if (m_ResetStatTimer <= 5000) + if (m_ResetStatTimer > 5000) { m_ResetStatTimer = 0; for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) @@ -456,19 +457,19 @@ inline void Battleground::_ProcessJoin(uint32 diff) // First start warning - 2 or 1 minute SendMessageToAll(StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL); } - // After 1 minute or 30 seconds, warning is signalled + // After 1 minute or 30 seconds, warning is signaled else if (GetStartDelayTime() <= StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2)) { m_Events |= BG_STARTING_EVENT_2; SendMessageToAll(StartMessageIds[BG_STARTING_EVENT_SECOND], CHAT_MSG_BG_SYSTEM_NEUTRAL); } - // After 30 or 15 seconds, warning is signalled + // After 30 or 15 seconds, warning is signaled else if (GetStartDelayTime() <= StartDelayTimes[BG_STARTING_EVENT_THIRD] && !(m_Events & BG_STARTING_EVENT_3)) { m_Events |= BG_STARTING_EVENT_3; SendMessageToAll(StartMessageIds[BG_STARTING_EVENT_THIRD], CHAT_MSG_BG_SYSTEM_NEUTRAL); } - // Delay expired (atfer 2 or 1 minute) + // Delay expired (after 2 or 1 minute) else if (GetStartDelayTime() <= 0 && !(m_Events & BG_STARTING_EVENT_4)) { m_Events |= BG_STARTING_EVENT_4; @@ -529,6 +530,33 @@ inline void Battleground::_ProcessJoin(uint32 diff) sWorld->SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName(), GetMinLevel(), GetMaxLevel()); } } + + // Find if the player left our start zone; if so, teleport it back + if (m_ValidStartPositionTimer > 1000) + { + m_ValidStartPositionTimer = 0; + float maxDist = GetStartMaxDist(); + if (maxDist > 0.0f) + { + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + { + if (Player *plr = ObjectAccessor::FindPlayer(itr->first)) + { + float x, y, z, o; + uint32 team = plr->GetBGTeam(); + GetTeamStartLoc(team, x, y, z, o); + + float dist = plr->GetDistance(x, y, z); + + if (dist >= maxDist) + { + sLog->outError("BATTLEGROUND: Sending %s back to start location (map: %u) (possible exploit)", plr->GetName(), GetMapId()); + plr->TeleportTo(GetMapId(), x, y, z, o); + } + } + } + } + } } inline void Battleground::_ProcessLeave(uint32 diff) @@ -743,7 +771,7 @@ void Battleground::EndBattleground(uint32 winner) winner_matchmaker_rating = GetArenaMatchmakerRating(winner); winner_matchmaker_change = winner_arena_team->WonAgainst(winner_matchmaker_rating, loser_matchmaker_rating, winner_change); loser_matchmaker_change = loser_arena_team->LostAgainst(loser_matchmaker_rating, winner_matchmaker_rating, loser_change); - sLog->outArena("--- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", winner_team_rating, winner_change, winner_matchmaker_rating, + sLog->outArena("match Type: %u --- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", m_ArenaType, winner_team_rating, winner_change, winner_matchmaker_rating, winner_matchmaker_change, loser_team_rating, loser_change, loser_matchmaker_rating, loser_matchmaker_change); SetArenaMatchmakerRating(winner, winner_matchmaker_rating + winner_matchmaker_change); SetArenaMatchmakerRating(GetOtherTeam(winner), loser_matchmaker_rating + loser_matchmaker_change); @@ -753,7 +781,7 @@ void Battleground::EndBattleground(uint32 winner) if (sWorld->getBoolConfig(CONFIG_ARENA_LOG_EXTENDED_INFO)) for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) - sLog->outArena("Statistics for %s (GUID: " UI64FMTD ", Team: %d, IP: %s): %u damage, %u healing, %u killing blows", player->GetName(), itr->first, player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3), player->GetSession()->GetRemoteAddress().c_str(), itr->second->DamageDone, itr->second->HealingDone, itr->second->KillingBlows); + sLog->outArena("Statistics match Type: %u for %s (GUID: " UI64FMTD ", Team: %d, IP: %s): %u damage, %u healing, %u killing blows", m_ArenaType, player->GetName(), itr->first, player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3), player->GetSession()->GetRemoteAddress().c_str(), itr->second->DamageDone, itr->second->HealingDone, itr->second->KillingBlows); } // Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes else @@ -822,9 +850,12 @@ void Battleground::EndBattleground(uint32 winner) if (team == winner) { // update achievement BEFORE personal rating update - ArenaTeamMember* member = winner_arena_team->GetMember(player->GetGUID()); - if (member) - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, 1); + if (ArenaTeamMember* member = winner_arena_team->GetMember(player->GetGUID())) + { + uint32 rating = player->GetArenaPersonalRating(winner_arena_team->GetSlot()); + player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, + rating ? rating : 1); + } winner_arena_team->MemberWon(player, loser_matchmaker_rating, winner_matchmaker_change); } @@ -1465,9 +1496,8 @@ void Battleground::DoorClose(uint32 type) // If doors are open, close it if (obj->getLootState() == GO_ACTIVATED && obj->GetGoState() != GO_STATE_READY) { - // Change state to allow door to be closed obj->SetLootState(GO_READY); - obj->UseDoorOrButton(RESPAWN_ONE_DAY); + obj->SetGoState(GO_STATE_READY); } } else @@ -1479,9 +1509,8 @@ void Battleground::DoorOpen(uint32 type) { if (GameObject* obj = GetBgMap()->GetGameObject(BgObjects[type])) { - // Change state to be sure they will be opened - obj->SetLootState(GO_READY); - obj->UseDoorOrButton(RESPAWN_ONE_DAY); + obj->SetLootState(GO_ACTIVATED); + obj->SetGoState(GO_STATE_ACTIVE); } else sLog->outError("Battleground::DoorOpen: door gameobject (type: %u, GUID: %u) not found for BG (map: %u, instance id: %u)!", diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 32f6ebc92de..01dfbb23033 100755 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -443,6 +443,8 @@ class Battleground Z = m_TeamStartLocZ[idx]; O = m_TeamStartLocO[idx]; } + void SetStartMaxDist(float startMaxDist) { m_StartMaxDist = startMaxDist; } + float GetStartMaxDist() const { return m_StartMaxDist; } // Packet Transfer // method that should fill worldpacket with actual world states (not yet implemented for all battlegrounds!) @@ -617,6 +619,7 @@ class Battleground uint32 m_ClientInstanceID; // the instance-id which is sent to the client and without any other internal use uint32 m_StartTime; uint32 m_ResetStatTimer; + uint32 m_ValidStartPositionTimer; int32 m_EndTime; // it is set to 120000 when bg is ending and it decreases itself uint32 m_LastResurrectTime; BattlegroundBracketId m_BracketId; @@ -698,6 +701,7 @@ class Battleground float m_TeamStartLocY[BG_TEAMS_COUNT]; float m_TeamStartLocZ[BG_TEAMS_COUNT]; float m_TeamStartLocO[BG_TEAMS_COUNT]; + float m_StartMaxDist; uint32 ScriptId; }; #endif diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index eac876a71d5..167933b9c0c 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -660,6 +660,7 @@ uint32 BattlegroundMgr::CreateBattleground(CreateBattlegroundData& data) bg->SetName(data.BattlegroundName); bg->SetTeamStartLoc(ALLIANCE, data.Team1StartLocX, data.Team1StartLocY, data.Team1StartLocZ, data.Team1StartLocO); bg->SetTeamStartLoc(HORDE, data.Team2StartLocX, data.Team2StartLocY, data.Team2StartLocZ, data.Team2StartLocO); + bg->SetStartMaxDist(data.StartMaxDist); bg->SetLevelRange(data.LevelMin, data.LevelMax); bg->SetScriptId(data.scriptId); @@ -677,8 +678,8 @@ void BattlegroundMgr::CreateInitialBattlegrounds() uint8 selectionWeight; BattlemasterListEntry const* bl; - // 0 1 2 3 4 5 6 7 8 9 10 - QueryResult result = WorldDatabase.Query("SELECT id, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, AllianceStartLoc, AllianceStartO, HordeStartLoc, HordeStartO, Weight, ScriptName FROM battleground_template"); + // 0 1 2 3 4 5 6 7 8 9 10 11 + QueryResult result = WorldDatabase.Query("SELECT id, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, AllianceStartLoc, AllianceStartO, HordeStartLoc, HordeStartO, StartMaxDist, Weight, ScriptName FROM battleground_template"); if (!result) { @@ -708,21 +709,24 @@ void BattlegroundMgr::CreateInitialBattlegrounds() CreateBattlegroundData data; data.bgTypeId = BattlegroundTypeId(bgTypeID_); data.IsArena = (bl->type == TYPE_ARENA); - data.MinPlayersPerTeam = fields[1].GetUInt32(); - data.MaxPlayersPerTeam = fields[2].GetUInt32(); - data.LevelMin = fields[3].GetUInt32(); - data.LevelMax = fields[4].GetUInt32(); - //check values from DB - if (data.MaxPlayersPerTeam == 0 || data.MinPlayersPerTeam == 0 || data.MinPlayersPerTeam > data.MaxPlayersPerTeam) + data.MinPlayersPerTeam = fields[1].GetUInt16(); + data.MaxPlayersPerTeam = fields[2].GetUInt16(); + data.LevelMin = fields[3].GetUInt8(); + data.LevelMax = fields[4].GetUInt8(); + + // check values from DB + if (data.MaxPlayersPerTeam == 0 || data.MinPlayersPerTeam > data.MaxPlayersPerTeam) { - data.MinPlayersPerTeam = 0; // by default now expected strong full bg requirement - data.MaxPlayersPerTeam = 40; + sLog->outErrorDb("Table `battleground_template` for id %u has bad values for MinPlayersPerTeam (%u) and MaxPlayersPerTeam(%u)", + data.bgTypeId, data.MinPlayersPerTeam, data.MaxPlayersPerTeam); + continue; } + if (data.LevelMin == 0 || data.LevelMax == 0 || data.LevelMin > data.LevelMax) { - //TO-DO: FIX ME - data.LevelMin = 0;//bl->minlvl; - data.LevelMax = 80;//bl->maxlvl; + sLog->outErrorDb("Table `battleground_template` for id %u has bad values for LevelMin (%u) and LevelMax(%u)", + data.bgTypeId, data.LevelMin, data.LevelMax); + continue; } startId = fields[5].GetUInt32(); @@ -767,9 +771,10 @@ void BattlegroundMgr::CreateInitialBattlegrounds() continue; } - selectionWeight = fields[9].GetUInt8(); - data.scriptId = sObjectMgr->GetScriptId(fields[10].GetCString()); + data.StartMaxDist = fields[9].GetFloat(); + //data.BattlegroundName = bl->name[sWorld->GetDefaultDbcLocale()]; + data.scriptId = sObjectMgr->GetScriptId(fields[10].GetCString()); data.MapID = bl->mapid[0]; if (!CreateBattleground(data)) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index b40f7bcbe91..dd502409178 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -50,6 +50,7 @@ struct CreateBattlegroundData float Team2StartLocY; float Team2StartLocZ; float Team2StartLocO; + float StartMaxDist; uint32 scriptId; }; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index a5b00ed9db1..6f4264c0faf 100755 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -129,7 +129,7 @@ bool BattlegroundQueue::SelectionPool::AddGroup(GroupQueueInfo* ginfo, uint32 de // add group or player (grp == NULL) to bg queue with the given leader and bg specifications GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, BattlegroundTypeId BgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid) { - BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); + BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); // create new ginfo GroupQueueInfo* ginfo = new GroupQueueInfo; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 71f0ce29aec..d28f5ddfe6a 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -290,7 +290,7 @@ int32 BattlegroundAB::_GetNodeNameId(uint8 node) case BG_AB_NODE_LUMBER_MILL:return LANG_BG_AB_NODE_LUMBER_MILL; case BG_AB_NODE_GOLD_MINE: return LANG_BG_AB_NODE_GOLD_MINE; default: - ASSERT(0); + ASSERT(false); } return 0; } @@ -549,7 +549,7 @@ void BattlegroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* /*targ bool BattlegroundAB::SetupBattleground() { - for (int i = 0 ; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { if (!AddObject(BG_AB_OBJECT_BANNER_NEUTRAL + 8*i, BG_AB_OBJECTID_NODE_BANNER_0 + i, BG_AB_NodePositions[i][0], BG_AB_NodePositions[i][1], BG_AB_NodePositions[i][2], BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2), RESPAWN_ONE_DAY) || !AddObject(BG_AB_OBJECT_BANNER_CONT_A + 8*i, BG_AB_OBJECTID_BANNER_CONT_A, BG_AB_NodePositions[i][0], BG_AB_NodePositions[i][1], BG_AB_NodePositions[i][2], BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2), RESPAWN_ONE_DAY) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index 50020a580b1..2cac5df73a9 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -184,7 +184,8 @@ enum BG_AB_Objectives #define AB_EVENT_START_BATTLE 9158 // Achievement: Let's Get This Done // x, y, z, o -const float BG_AB_NodePositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { +const float BG_AB_NodePositions[BG_AB_DYNAMIC_NODES_COUNT][4] = +{ {1166.785f, 1200.132f, -56.70859f, 0.9075713f}, // stables {977.0156f, 1046.616f, -44.80923f, -2.600541f}, // blacksmith {806.1821f, 874.2723f, -55.99371f, -2.303835f}, // farm @@ -193,7 +194,8 @@ const float BG_AB_NodePositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { }; // x, y, z, o, rot0, rot1, rot2, rot3 -const float BG_AB_DoorPositions[2][8] = { +const float BG_AB_DoorPositions[2][8] = +{ {1284.597f, 1281.167f, -15.97792f, 0.7068594f, 0.012957f, -0.060288f, 0.344959f, 0.93659f}, {708.0903f, 708.4479f, -17.8342f, -2.391099f, 0.050291f, 0.015127f, 0.929217f, -0.365784f} }; @@ -206,7 +208,8 @@ const uint32 BG_AB_TickPoints[6] = {0, 10, 10, 10, 10, 30}; const uint32 BG_AB_GraveyardIds[BG_AB_ALL_NODES_COUNT] = {895, 894, 893, 897, 896, 898, 899}; // x, y, z, o -const float BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { +const float BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT][4] = +{ {1185.71f, 1185.24f, -56.36f, 2.56f}, // stables {990.75f, 1008.18f, -42.60f, 2.43f}, // blacksmith {817.66f, 843.34f, -56.54f, 3.01f}, // farm @@ -215,7 +218,8 @@ const float BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { }; // x, y, z, o -const float BG_AB_SpiritGuidePos[BG_AB_ALL_NODES_COUNT][4] = { +const float BG_AB_SpiritGuidePos[BG_AB_ALL_NODES_COUNT][4] = +{ {1200.03f, 1171.09f, -56.47f, 5.15f}, // stables {1017.43f, 960.61f, -42.95f, 4.88f}, // blacksmith {833.00f, 793.00f, -57.25f, 5.27f}, // farm diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 801b522feab..d2cbab2be54 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -1032,17 +1032,18 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object) std::vector ghost_list = m_ReviveQueue[BgCreatures[node]]; if (!ghost_list.empty()) { - Player* player; - WorldSafeLocsEntry const* ClosestGrave = NULL; + Player* waitingPlayer; // player waiting at graveyard for resurrection + WorldSafeLocsEntry const* closestGrave = NULL; for (std::vector::iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr) { - player = ObjectAccessor::FindPlayer(*ghost_list.begin()); - if (!player) + waitingPlayer = ObjectAccessor::FindPlayer(*ghost_list.begin()); + if (!waitingPlayer) continue; - if (!ClosestGrave) - ClosestGrave = GetClosestGraveYard(player); + + if (!closestGrave) + closestGrave = GetClosestGraveYard(waitingPlayer); else - player->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, player->GetOrientation()); + waitingPlayer->TeleportTo(GetMapId(), closestGrave->x, closestGrave->y, closestGrave->z, player->GetOrientation()); } m_ReviveQueue[BgCreatures[node]].clear(); } @@ -1207,7 +1208,7 @@ bool BattlegroundAV::SetupBattleground() } //spawn node-objects - for (uint8 i = BG_AV_NODES_FIRSTAID_STATION ; i < BG_AV_NODES_MAX; ++i) + for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) { if (i <= BG_AV_NODES_FROSTWOLF_HUT) { @@ -1292,7 +1293,7 @@ bool BattlegroundAV::SetupBattleground() return false; } } - for (uint16 i= 0 ; i <= (BG_AV_OBJECT_MINE_SUPPLY_S_MAX-BG_AV_OBJECT_MINE_SUPPLY_S_MIN); i++) + for (uint16 i= 0; i <= (BG_AV_OBJECT_MINE_SUPPLY_S_MAX-BG_AV_OBJECT_MINE_SUPPLY_S_MIN); i++) { if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_S_MIN+i, BG_AV_OBJECTID_MINE_S, BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][0], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][1], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][2], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3]/2), RESPAWN_ONE_DAY)) { @@ -1323,30 +1324,39 @@ bool BattlegroundAV::SetupBattleground() // Initial Nodes for (i = 0; i < BG_AV_OBJECT_MAX; i++) SpawnBGObject(i, RESPAWN_ONE_DAY); - for (i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE ; i++){ + + for (i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE; i++) + { SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+3*i, RESPAWN_IMMEDIATELY); SpawnBGObject(i, RESPAWN_IMMEDIATELY); } - for (i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER ; i++) + + for (i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); - for (i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER ; i++){ + + for (i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER; i++) + { SpawnBGObject(i, RESPAWN_IMMEDIATELY); if (i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT) SpawnBGObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+3*GetNodeThroughObject(i), RESPAWN_IMMEDIATELY); } + for (i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; i+=2) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura } + for (i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; i+=2) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura } + //snowfall and the doors for (i = BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; i <= BG_AV_OBJECT_DOOR_A; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY); //creatures @@ -1471,7 +1481,7 @@ void BattlegroundAV::ResetBGSubclass() { for (uint8 j=0; j<9; j++) m_Team_QuestStatus[i][j]=0; - m_Team_Scores[i]=BG_AV_SCORE_INITIAL_POINTS; + m_Team_Scores[i]=BG_AV_SCORE_INITIAL_POINTS; m_IsInformedNearVictory[i]=false; m_CaptainAlive[i] = true; m_CaptainBuffTimer[i] = 120000 + urand(0, 4)* 60; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes TODO get the right times @@ -1492,7 +1502,6 @@ void BattlegroundAV::ResetBGSubclass() for (uint16 i = 0; i < AV_CPLACE_MAX+AV_STATICCPLACE_MAX; i++) if (BgCreatures[i]) DelCreature(i); - } bool BattlegroundAV::IsBothMinesControlledByTeam(uint32 team) const @@ -1552,4 +1561,4 @@ bool BattlegroundAV::IsAllTowersControlledAndCaptainAlive(uint32 team) const } return false; -} \ No newline at end of file +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index 82e231c63fa..f073b69a779 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -356,7 +356,9 @@ enum BG_AV_OBJECTS AV_OPLACE_MAX = 149 }; -const float BG_AV_ObjectPos[AV_OPLACE_MAX][4] = { + +const float BG_AV_ObjectPos[AV_OPLACE_MAX][4] = +{ {638.592f, -32.422f, 46.0608f, -1.62316f }, //firstaid station {669.007f, -294.078f, 30.2909f, 2.77507f }, //stormpike {77.8013f, -404.7f, 46.7549f, -0.872665f }, //stone grave @@ -527,7 +529,8 @@ const float BG_AV_ObjectPos[AV_OPLACE_MAX][4] = { {-951.394f, -193.695f, 67.634f, 0.802851f} }; -const float BG_AV_DoorPositons[2][4] = { +const float BG_AV_DoorPositons[2][4] = +{ {780.487f, -493.024f, 99.9553f, 3.0976f}, //alliance {-1375.193f, -538.981f, 55.2824f, 0.72178f} //horde }; @@ -623,7 +626,8 @@ enum BG_AV_CreaturePlace }; //x, y, z, o -const float BG_AV_CreaturePos[AV_CPLACE_MAX][4] = { +const float BG_AV_CreaturePos[AV_CPLACE_MAX][4] = +{ //spiritguides {643.000000f, 44.000000f, 69.740196f, -0.001854f}, {676.000000f, -374.000000f, 30.000000f, -0.001854f}, @@ -1039,7 +1043,8 @@ enum BG_AV_CreatureIds //entry, team, minlevel, maxlevel //TODO this array should be removed, the only needed things are the entrys (for spawning(?) and handlekillunit) -const uint32 BG_AV_CreatureInfo[AV_NPC_INFO_MAX][4] = { +const uint32 BG_AV_CreatureInfo[AV_NPC_INFO_MAX][4] = +{ { 12050, 1216, 58, 58 }, //Stormpike Defender { 13326, 1216, 59, 59 }, //Seasoned Defender { 13331, 1216, 60, 60 }, //Veteran Defender @@ -1099,7 +1104,9 @@ const uint32 BG_AV_CreatureInfo[AV_NPC_INFO_MAX][4] = { }; //x, y, z, o, static_creature_info-id -const float BG_AV_StaticCreaturePos[AV_STATICCPLACE_MAX][5] = { //static creatures +const float BG_AV_StaticCreaturePos[AV_STATICCPLACE_MAX][5] = +{ + //static creatures {-1235.31f, -340.777f, 60.5088f, 3.31613f, 0 }, //2225 - Zora Guthrek {-1244.02f, -323.795f, 61.0485f, 5.21853f, 1 }, //3343 - Grelkor {-1235.16f, -332.302f, 60.2985f, 2.96706f, 2 }, //3625 - Rarck @@ -1226,7 +1233,8 @@ const float BG_AV_StaticCreaturePos[AV_STATICCPLACE_MAX][5] = { //static creatur }; -const uint32 BG_AV_StaticCreatureInfo[51][4] = { +const uint32 BG_AV_StaticCreatureInfo[51][4] = +{ { 2225, 1215, 55, 55 }, //Zora Guthrek { 3343, 1215, 55, 55 }, //Grelkor { 3625, 1215, 55, 55 }, //Rarck @@ -1293,16 +1301,17 @@ enum BG_AV_Graveyards AV_GRAVE_MAIN_HORDE = 610 }; -const uint32 BG_AV_GraveyardIds[9]= { - AV_GRAVE_STORM_AID, - AV_GRAVE_STORM_GRAVE, - AV_GRAVE_STONE_GRAVE, - AV_GRAVE_SNOWFALL, - AV_GRAVE_ICE_GRAVE, - AV_GRAVE_FROSTWOLF, - AV_GRAVE_FROST_HUT, - AV_GRAVE_MAIN_ALLIANCE, - AV_GRAVE_MAIN_HORDE +const uint32 BG_AV_GraveyardIds[9]= +{ + AV_GRAVE_STORM_AID, + AV_GRAVE_STORM_GRAVE, + AV_GRAVE_STONE_GRAVE, + AV_GRAVE_SNOWFALL, + AV_GRAVE_ICE_GRAVE, + AV_GRAVE_FROSTWOLF, + AV_GRAVE_FROST_HUT, + AV_GRAVE_MAIN_ALLIANCE, + AV_GRAVE_MAIN_HORDE }; enum BG_AV_BUFF @@ -1434,13 +1443,15 @@ enum BG_AV_WorldStates }; //alliance_control neutral_control horde_control -const uint32 BG_AV_MineWorldStates[2][3] = { +const uint32 BG_AV_MineWorldStates[2][3] = +{ {1358, 1360, 1359}, {1355, 1357, 1356} }; //alliance_control alliance_assault h_control h_assault -const uint32 BG_AV_NodeWorldStates[16][4] = { +const uint32 BG_AV_NodeWorldStates[16][4] = +{ //Stormpike first aid station {1325, 1326, 1327, 1328}, //Stormpike Graveyard diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp index d24058cdd8a..ccc6a2305b4 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp @@ -27,6 +27,7 @@ BattlegroundDS::BattlegroundDS() { BgObjects.resize(BG_DS_OBJECT_MAX); + BgCreatures.resize(BG_DS_NPC_MAX); StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_1M; StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S; @@ -49,6 +50,34 @@ void BattlegroundDS::PostUpdateImpl(uint32 diff) if (GetStatus() != STATUS_IN_PROGRESS) return; + if (getPipeKnockBackCount() < BG_DS_PIPE_KNOCKBACK_TOTAL_COUNT) + { + if (getPipeKnockBackTimer() < diff) + { + for (uint32 i = BG_DS_NPC_PIPE_KNOCKBACK_1; i <= BG_DS_NPC_PIPE_KNOCKBACK_2; ++i) + if (Creature* waterSpout = GetBgMap()->GetCreature(BgCreatures[i])) + waterSpout->CastSpell(waterSpout, BG_DS_SPELL_FLUSH, true); + + setPipeKnockBackCount(getPipeKnockBackCount() + 1); + setPipeKnockBackTimer(BG_DS_PIPE_KNOCKBACK_DELAY); + } + else + setPipeKnockBackTimer(getPipeKnockBackTimer() - diff); + } + + if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_ON) // Repeat knockback while the waterfall still active + { + if (getWaterFallKnockbackTimer() < diff) + { + if (Creature* waterSpout = GetBgMap()->GetCreature(BgCreatures[BG_DS_NPC_WATERFALL_KNOCKBACK])) + waterSpout->CastSpell(waterSpout, BG_DS_SPELL_WATER_SPOUT, true); + + setWaterFallKnockbackTimer(BG_DS_WATERFALL_KNOCKBACK_TIMER); + } + else + setWaterFallKnockbackTimer(getWaterFallKnockbackTimer() - diff); + } + if (getWaterFallTimer() < diff) { if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_OFF) // Add the water @@ -57,13 +86,14 @@ void BattlegroundDS::PostUpdateImpl(uint32 diff) setWaterFallTimer(BG_DS_WATERFALL_WARNING_DURATION); setWaterFallStatus(BG_DS_WATERFALL_STATUS_WARNING); } - else if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_WARNING) // Active collision + else if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_WARNING) // Active collision and start knockback timer { if (GameObject* gob = GetBgMap()->GetGameObject(BgObjects[BG_DS_OBJECT_WATER_1])) gob->SetGoState(GO_STATE_READY); setWaterFallTimer(BG_DS_WATERFALL_DURATION); setWaterFallStatus(BG_DS_WATERFALL_STATUS_ON); + setWaterFallKnockbackTimer(BG_DS_WATERFALL_KNOCKBACK_TIMER); } else //if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_ON) // Remove collision and water { @@ -97,12 +127,21 @@ void BattlegroundDS::StartingEventOpenDoors() setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX)); setWaterFallStatus(BG_DS_WATERFALL_STATUS_OFF); + setPipeKnockBackTimer(BG_DS_PIPE_KNOCKBACK_FIRST_DELAY); + setPipeKnockBackCount(0); + SpawnBGObject(BG_DS_OBJECT_WATER_2, RESPAWN_IMMEDIATELY); DoorOpen(BG_DS_OBJECT_WATER_2); // Turn off collision if (GameObject* gob = GetBgMap()->GetGameObject(BgObjects[BG_DS_OBJECT_WATER_1])) gob->SetGoState(GO_STATE_ACTIVE); + + // Remove effects of Demonic Circle Summon + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + if (Player* player = ObjectAccessor::FindPlayer(itr->first)) + if (player->HasAura(48018)) + player->RemoveAurasDueToSpell(48018); } void BattlegroundDS::AddPlayer(Player* player) @@ -151,6 +190,14 @@ void BattlegroundDS::HandleAreaTrigger(Player* Source, uint32 Trigger) { case 5347: case 5348: + // Remove effects of Demonic Circle Summon + if (Source->HasAura(48018)) + Source->RemoveAurasDueToSpell(48018); + + // Someone has get back into the pipes and the knockback has already been performed, + // so we reset the knockback count for kicking the player again into the arena. + if (getPipeKnockBackCount() >= BG_DS_PIPE_KNOCKBACK_TOTAL_COUNT) + setPipeKnockBackCount(0); break; default: sLog->outError("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger); @@ -187,7 +234,11 @@ bool BattlegroundDS::SetupBattleground() || !AddObject(BG_DS_OBJECT_WATER_2, BG_DS_OBJECT_TYPE_WATER_2, 1291.56f, 790.837f, 7.1f, 3.14238f, 0, 0, 0.694215f, -0.719768f, 120) // buffs || !AddObject(BG_DS_OBJECT_BUFF_1, BG_DS_OBJECT_TYPE_BUFF_1, 1291.7f, 813.424f, 7.11472f, 4.64562f, 0, 0, 0.730314f, -0.683111f, 120) - || !AddObject(BG_DS_OBJECT_BUFF_2, BG_DS_OBJECT_TYPE_BUFF_2, 1291.7f, 768.911f, 7.11472f, 1.55194f, 0, 0, 0.700409f, 0.713742f, 120)) + || !AddObject(BG_DS_OBJECT_BUFF_2, BG_DS_OBJECT_TYPE_BUFF_2, 1291.7f, 768.911f, 7.11472f, 1.55194f, 0, 0, 0.700409f, 0.713742f, 120) + // knockback creatures + || !AddCreature(BG_DS_NPC_TYPE_WATER_SPOUT, BG_DS_NPC_WATERFALL_KNOCKBACK, 0, 1292.587f, 790.2205f, 7.19796f, 3.054326f, RESPAWN_IMMEDIATELY) + || !AddCreature(BG_DS_NPC_TYPE_WATER_SPOUT, BG_DS_NPC_PIPE_KNOCKBACK_1, 0, 1369.977f, 817.2882f, 16.08718f, 3.106686f, RESPAWN_IMMEDIATELY) + || !AddCreature(BG_DS_NPC_TYPE_WATER_SPOUT, BG_DS_NPC_PIPE_KNOCKBACK_2, 0, 1212.833f, 765.3871f, 16.09484f, 0.0f, RESPAWN_IMMEDIATELY)) { sLog->outErrorDb("BatteGroundDS: Failed to spawn some object!"); return false; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h index 7efc6e1caa7..aaf08ba1313 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h @@ -42,12 +42,37 @@ enum BattlegroundDSObjects BG_DS_OBJECT_TYPE_BUFF_2 = 184664 }; +enum BattlegroundDSCreatureTypes +{ + BG_DS_NPC_WATERFALL_KNOCKBACK = 0, + BG_DS_NPC_PIPE_KNOCKBACK_1 = 1, + BG_DS_NPC_PIPE_KNOCKBACK_2 = 2, + BG_DS_NPC_MAX = 3 +}; + +enum BattlegroundDSCreatures +{ + BG_DS_NPC_TYPE_WATER_SPOUT = 28567, +}; + +enum BattlegroundDSSpells +{ + BG_DS_SPELL_FLUSH = 57405, // Visual and target selector for the starting knockback from the pipe + BG_DS_SPELL_FLUSH_KNOCKBACK = 61698, // Knockback effect for previous spell (triggered, not need to be casted) + BG_DS_SPELL_WATER_SPOUT = 58873, // Knockback effect of the central waterfall +}; + enum BattlegroundDSData { // These values are NOT blizzlike... need the correct data! BG_DS_WATERFALL_TIMER_MIN = 30000, BG_DS_WATERFALL_TIMER_MAX = 60000, - BG_DS_WATERFALL_WARNING_DURATION = 7000, - BG_DS_WATERFALL_DURATION = 10000, + BG_DS_WATERFALL_WARNING_DURATION = 5000, + BG_DS_WATERFALL_DURATION = 30000, + BG_DS_WATERFALL_KNOCKBACK_TIMER = 1500, + + BG_DS_PIPE_KNOCKBACK_FIRST_DELAY = 5000, + BG_DS_PIPE_KNOCKBACK_DELAY = 3000, + BG_DS_PIPE_KNOCKBACK_TOTAL_COUNT = 2, BG_DS_WATERFALL_STATUS_WARNING = 1, // Water starting to fall, but no LoS Blocking nor movement blocking BG_DS_WATERFALL_STATUS_ON = 2, // LoS and Movement blocking active @@ -83,12 +108,21 @@ class BattlegroundDS : public Battleground private: uint32 _waterfallTimer; uint8 _waterfallStatus; + uint32 _waterfallKnockbackTimer; + uint32 _pipeKnockBackTimer; + uint8 _pipeKnockBackCount; virtual void PostUpdateImpl(uint32 diff); protected: uint32 getWaterFallStatus() { return _waterfallStatus; }; - void setWaterFallStatus(uint32 status) { _waterfallStatus = status; }; - void setWaterFallTimer(uint32 timer) { _waterfallTimer = timer; }; + void setWaterFallStatus(uint8 status) { _waterfallStatus = status; }; uint32 getWaterFallTimer() { return _waterfallTimer; }; + void setWaterFallTimer(uint32 timer) { _waterfallTimer = timer; }; + uint32 getWaterFallKnockbackTimer() { return _waterfallKnockbackTimer; }; + void setWaterFallKnockbackTimer(uint32 timer) { _waterfallKnockbackTimer = timer; }; + uint8 getPipeKnockBackCount() { return _pipeKnockBackCount; }; + void setPipeKnockBackCount(uint8 count) { _pipeKnockBackCount = count; }; + uint32 getPipeKnockBackTimer() { return _pipeKnockBackTimer; }; + void setPipeKnockBackTimer(uint32 timer) { _pipeKnockBackTimer = timer; }; }; #endif diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 344dc79fe79..8269a04a383 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -29,7 +29,8 @@ #include "Util.h" // these variables aren't used outside of this file, so declare them only here -uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] = { +uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] = +{ 260, // normal honor 160 // holiday }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index 026fbccc320..534a40484ce 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -258,7 +258,8 @@ struct BattlegroundEYPointIconsStruct }; // x, y, z, o -const float BG_EY_TriggerPositions[EY_POINTS_MAX][4] = { +const float BG_EY_TriggerPositions[EY_POINTS_MAX][4] = +{ {2044.28f, 1729.68f, 1189.96f, 0.017453f}, // FEL_REAVER center {2048.83f, 1393.65f, 1194.49f, 0.20944f}, // BLOOD_ELF center {2286.56f, 1402.36f, 1197.11f, 3.72381f}, // DRAENEI_RUINS center @@ -326,7 +327,7 @@ const BattlegroundEYCapturingPointStruct m_CapturingPointTypes[EY_POINTS_MAX] = class BattlegroundEYScore : public BattlegroundScore { public: - BattlegroundEYScore () : FlagCaptures(0) {}; + BattlegroundEYScore() : FlagCaptures(0) {}; virtual ~BattlegroundEYScore() {}; uint32 FlagCaptures; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index c72fcfdb3a7..47ea9915ac7 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -47,7 +47,7 @@ BattlegroundIC::BattlegroundIC() resourceTimer = IC_RESOURCE_TIME; for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; i++) - nodePoint[i] = nodePointInitial[i]; + nodePoint[i] = nodePointInitial[i]; siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIME; @@ -359,7 +359,7 @@ void BattlegroundIC::FillInitialWorldStates(WorldPacket& data) data << uint32(uws) << uint32(1); } - for (uint8 i = 0 ; i < MAX_NODE_TYPES ; i++) + for (uint8 i = 0; i < MAX_NODE_TYPES; i++) data << uint32(nodePoint[i].worldStates[nodePoint[i].nodeState]) << uint32(1); } @@ -837,6 +837,7 @@ void BattlegroundIC::DestroyGate(Player* player, GameObject* go) { case GO_HORDE_GATE_1: lang_entry = LANG_BG_IC_NORTH_GATE_DESTROYED; + break; case GO_HORDE_GATE_2: case GO_ALLIANCE_GATE_1: lang_entry = LANG_BG_IC_WEST_GATE_DESTROYED; @@ -926,11 +927,11 @@ Transport* BattlegroundIC::CreateTransport(uint32 goEntry, uint32 period) float x = t->m_WayPoints[0].x; float y = t->m_WayPoints[0].y; - float z = t->m_WayPoints[0].z; + float z = t->m_WayPoints[0].z; float o = 1; // creates the Gameobject - if (!t->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT), goEntry, mapid, x, y, z, o, 100, 0)) + if (!t->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT), goEntry, mapid, x, y, z, o, 255, 0)) { delete t; return NULL; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp index 98bb704661e..6869a899305 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp @@ -32,7 +32,7 @@ BattlegroundRV::BattlegroundRV() StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S; StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_15S; StartDelayTimes[BG_STARTING_EVENT_FOURTH] = BG_START_DELAY_NONE; - //we must set messageIds + // we must set messageIds StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_ARENA_ONE_MINUTE; StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_ARENA_THIRTY_SECONDS; StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_ARENA_FIFTEEN_SECONDS; @@ -46,40 +46,32 @@ BattlegroundRV::~BattlegroundRV() void BattlegroundRV::PostUpdateImpl(uint32 diff) { + if (GetStatus() != STATUS_IN_PROGRESS) + return; + if (getTimer() < diff) { switch (getState()) { case BG_RV_STATE_OPEN_FENCES: - setTimer(BG_RV_PILAR_TO_FIRE_TIMER); + // Open fire (only at game start) + for (uint8 i = BG_RV_OBJECT_FIRE_1; i <= BG_RV_OBJECT_FIREDOOR_2; ++i) + DoorOpen(i); + setTimer(BG_RV_CLOSE_FIRE_TIMER); setState(BG_RV_STATE_CLOSE_FIRE); break; case BG_RV_STATE_CLOSE_FIRE: for (uint8 i = BG_RV_OBJECT_FIRE_1; i <= BG_RV_OBJECT_FIREDOOR_2; ++i) DoorClose(i); - setTimer(BG_RV_FIRE_TO_PILAR_TIMER); - setState(BG_RV_STATE_OPEN_PILARS); + // Fire got closed after five seconds, leaves twenty seconds before toggling pillars + setTimer(BG_RV_FIRE_TO_PILLAR_TIMER); + setState(BG_RV_STATE_SWITCH_PILLARS); break; - case BG_RV_STATE_OPEN_PILARS: + case BG_RV_STATE_SWITCH_PILLARS: for (uint8 i = BG_RV_OBJECT_PILAR_1; i <= BG_RV_OBJECT_PULLEY_2; ++i) DoorOpen(i); - TogglePillarCollision(false); - setTimer(BG_RV_PILAR_TO_FIRE_TIMER); - setState(BG_RV_STATE_OPEN_FIRE); - break; - case BG_RV_STATE_OPEN_FIRE: - // FIXME: after 3.2.0 it's only decorative and should be opened only one time at battle start - for (uint8 i = BG_RV_OBJECT_FIRE_1; i <= BG_RV_OBJECT_FIREDOOR_2; ++i) - DoorOpen(i); - setTimer(BG_RV_FIRE_TO_PILAR_TIMER); - setState(BG_RV_STATE_CLOSE_PILARS); - break; - case BG_RV_STATE_CLOSE_PILARS: - for (uint8 i = BG_RV_OBJECT_PILAR_1; i <= BG_RV_OBJECT_PULLEY_2; ++i) - DoorOpen(i); - TogglePillarCollision(true); - setTimer(BG_RV_PILAR_TO_FIRE_TIMER); - setState(BG_RV_STATE_CLOSE_FIRE); + TogglePillarCollision(); + setTimer(BG_RV_PILLAR_SWITCH_TIMER); break; } } @@ -103,7 +95,9 @@ void BattlegroundRV::StartingEventOpenDoors() setState(BG_RV_STATE_OPEN_FENCES); setTimer(BG_RV_FIRST_TIMER); - TogglePillarCollision(true); + // Should be false at first, TogglePillarCollision will do it. + SetPillarCollision(true); + TogglePillarCollision(); } void BattlegroundRV::AddPlayer(Player* player) @@ -227,8 +221,10 @@ bool BattlegroundRV::SetupBattleground() } -void BattlegroundRV::TogglePillarCollision(bool apply) +void BattlegroundRV::TogglePillarCollision() { + bool apply = GetPillarCollision(); + for (uint8 i = BG_RV_OBJECT_PILAR_1; i <= BG_RV_OBJECT_PILAR_COLLISION_4; ++i) { if (GameObject* gob = GetBgMap()->GetGameObject(BgObjects[i])) @@ -249,4 +245,6 @@ void BattlegroundRV::TogglePillarCollision(bool apply) gob->SendUpdateToPlayer(player); } } + + SetPillarCollision(!apply); } \ No newline at end of file diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h index 1dfd4825c8f..8c5746931e3 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h @@ -79,12 +79,12 @@ enum BattlegroundRVObjects enum BattlegroundRVData { BG_RV_STATE_OPEN_FENCES, - BG_RV_STATE_OPEN_PILARS, - BG_RV_STATE_CLOSE_PILARS, - BG_RV_STATE_OPEN_FIRE, + BG_RV_STATE_SWITCH_PILLARS, BG_RV_STATE_CLOSE_FIRE, - BG_RV_FIRE_TO_PILAR_TIMER = 20000, - BG_RV_PILAR_TO_FIRE_TIMER = 5000, + + BG_RV_PILLAR_SWITCH_TIMER = 25000, + BG_RV_FIRE_TO_PILLAR_TIMER = 20000, + BG_RV_CLOSE_FIRE_TIMER = 5000, BG_RV_FIRST_TIMER = 20133, BG_RV_WORLD_STATE_A = 0xe10, BG_RV_WORLD_STATE_H = 0xe11, @@ -120,6 +120,7 @@ class BattlegroundRV : public Battleground private: uint32 Timer; uint32 State; + bool PillarCollision; virtual void PostUpdateImpl(uint32 diff); @@ -129,6 +130,8 @@ class BattlegroundRV : public Battleground uint32 getState() { return State; }; void setState(uint32 state) { State = state; }; - void TogglePillarCollision(bool apply); + void TogglePillarCollision(); + bool GetPillarCollision() { return PillarCollision; } + void SetPillarCollision(bool apply) { PillarCollision = apply; } }; #endif diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index b7792e10ae3..39c6e00946a 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -37,6 +37,11 @@ BattlegroundSA::BattlegroundSA() SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = false; + + //! This is here to prevent an uninitialised variable warning + //! The warning only occurs when SetUpBattleGround fails though. + //! In the future this function should be called BEFORE sending initial worldstates. + memset(&GraveyardStatus, 0, sizeof(GraveyardStatus)); } BattlegroundSA::~BattlegroundSA() @@ -529,16 +534,16 @@ void BattlegroundSA::EventPlayerDamagedGO(Player* /*player*/, GameObject* go, ui if (eventType == go->GetGOInfo()->building.damagedEvent) { - uint32 i = GetGateIDFromDestroyEventID(eventType); + uint32 i = getGateIdFromDamagedOrDestroyEventId(eventType); GateStatus[i] = BG_SA_GATE_DAMAGED; - uint32 uws = GetWorldStateFromGateID(i); + uint32 uws = getWorldStateFromGateId(i); if (uws) UpdateWorldState(uws, GateStatus[i]); } if (eventType == go->GetGOInfo()->building.destroyedEvent) { - if (go->GetGOInfo()->building.destroyedEvent == 19837) + if (go->GetGOInfo()->building.destroyedEvent == BG_SA_EVENT_ANCIENT_GATE_DESTROYED) SendWarningToAll(LANG_BG_SA_CHAMBER_BREACHED); else SendWarningToAll(LANG_BG_SA_WAS_DESTROYED, go->GetGOInfo()->name.c_str()); @@ -598,7 +603,7 @@ void BattlegroundSA::DemolisherStartState(bool start) void BattlegroundSA::DestroyGate(Player* player, GameObject* go) { - uint32 i = GetGateIDFromDestroyEventID(go->GetGOInfo()->building.destroyedEvent); + uint32 i = getGateIdFromDamagedOrDestroyEventId(go->GetGOInfo()->building.destroyedEvent); if (!GateStatus[i]) return; @@ -607,7 +612,7 @@ void BattlegroundSA::DestroyGate(Player* player, GameObject* go) if (g->GetGOValue()->Building.Health == 0) { GateStatus[i] = BG_SA_GATE_DESTROYED; - uint32 uws = GetWorldStateFromGateID(i); + uint32 uws = getWorldStateFromGateId(i); if (uws) UpdateWorldState(uws, GateStatus[i]); bool rewardHonor = true; @@ -715,8 +720,13 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) DelCreature(BG_SA_MAXNPC + i); GraveyardStatus[i] = Source->GetTeamId(); - WorldSafeLocsEntry const* sg = NULL; - sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + if (!sg) + { + sLog->outError("BattlegroundSA::CaptureGraveyard: non-existant GY entry: %u", BG_SA_GYEntries[i]); + return; + } + AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], (GraveyardStatus[i] == TEAM_ALLIANCE? ALLIANCE : HORDE)); uint32 npc = 0; uint32 flag = 0; @@ -776,7 +786,7 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) SendWarningToAll(LANG_BG_SA_H_GY_SOUTH); break; default: - ASSERT(0); + ASSERT(false); break; }; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index 76a772ff978..c18806490f2 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -30,8 +30,8 @@ class BattlegroundSAScore : public BattlegroundScore uint8 gates_destroyed; }; -#define BG_SA_FLAG_AMOUNT 3 -#define BG_SA_DEMOLISHER_AMOUNT 4 +#define BG_SA_FLAG_AMOUNT 3 +#define BG_SA_DEMOLISHER_AMOUNT 4 enum BG_SA_Status { @@ -45,45 +45,66 @@ enum BG_SA_Status enum BG_SA_GateState { - BG_SA_GATE_OK = 1, - BG_SA_GATE_DAMAGED = 2, - BG_SA_GATE_DESTROYED = 3 + BG_SA_GATE_OK = 1, + BG_SA_GATE_DAMAGED = 2, + BG_SA_GATE_DESTROYED = 3 +}; + +enum BG_SA_EventIdGate +{ + BG_SA_EVENT_BLUE_GATE_DAMAGED = 19040, + BG_SA_EVENT_BLUE_GATE_DESTROYED = 19045, + + BG_SA_EVENT_GREEN_GATE_DAMAGED = 19041, + BG_SA_EVENT_GREEN_GATE_DESTROYED = 19046, + + BG_SA_EVENT_RED_GATE_DAMAGED = 19042, + BG_SA_EVENT_RED_GATE_DESTROYED = 19047, + + BG_SA_EVENT_PURPLE_GATE_DAMAGED = 19043, + BG_SA_EVENT_PURPLE_GATE_DESTROYED = 19048, + + BG_SA_EVENT_YELLOW_GATE_DAMAGED = 19044, + BG_SA_EVENT_YELLOW_GATE_DESTROYED = 19049, + + BG_SA_EVENT_ANCIENT_GATE_DAMAGED = 19836, + BG_SA_EVENT_ANCIENT_GATE_DESTROYED = 19837 }; enum BG_SA_Timers { - BG_SA_BOAT_START = 60*IN_MILLISECONDS, - BG_SA_WARMUPLENGTH = 120*IN_MILLISECONDS, - BG_SA_ROUNDLENGTH = 600*IN_MILLISECONDS + BG_SA_BOAT_START = 60 * IN_MILLISECONDS, + BG_SA_WARMUPLENGTH = 120 * IN_MILLISECONDS, + BG_SA_ROUNDLENGTH = 600 * IN_MILLISECONDS }; enum BG_SA_WorldStates { - BG_SA_TIMER_MINS = 3559, - BG_SA_TIMER_SEC_TENS = 3560, - BG_SA_TIMER_SEC_DECS = 3561, - BG_SA_ALLY_ATTACKS = 4352, - BG_SA_HORDE_ATTACKS = 4353, - BG_SA_PURPLE_GATEWS = 3614, - BG_SA_RED_GATEWS = 3617, - BG_SA_BLUE_GATEWS = 3620, - BG_SA_GREEN_GATEWS = 3623, - BG_SA_YELLOW_GATEWS = 3638, - BG_SA_ANCIENT_GATEWS = 3849, - BG_SA_LEFT_GY_ALLIANCE = 3635, - BG_SA_RIGHT_GY_ALLIANCE = 3636, - BG_SA_CENTER_GY_ALLIANCE = 3637, - BG_SA_RIGHT_ATT_TOKEN_ALL = 3627, - BG_SA_LEFT_ATT_TOKEN_ALL = 3626, - BG_SA_LEFT_ATT_TOKEN_HRD = 3629, - BG_SA_RIGHT_ATT_TOKEN_HRD = 3628, - BG_SA_HORDE_DEFENCE_TOKEN = 3631, - BG_SA_ALLIANCE_DEFENCE_TOKEN = 3630, - BG_SA_RIGHT_GY_HORDE = 3632, - BG_SA_LEFT_GY_HORDE = 3633, - BG_SA_CENTER_GY_HORDE = 3634, - BG_SA_BONUS_TIMER = 0xdf3, - BG_SA_ENABLE_TIMER = 3564, + BG_SA_TIMER_MINS = 3559, + BG_SA_TIMER_SEC_TENS = 3560, + BG_SA_TIMER_SEC_DECS = 3561, + BG_SA_ALLY_ATTACKS = 4352, + BG_SA_HORDE_ATTACKS = 4353, + BG_SA_PURPLE_GATEWS = 3614, + BG_SA_RED_GATEWS = 3617, + BG_SA_BLUE_GATEWS = 3620, + BG_SA_GREEN_GATEWS = 3623, + BG_SA_YELLOW_GATEWS = 3638, + BG_SA_ANCIENT_GATEWS = 3849, + BG_SA_LEFT_GY_ALLIANCE = 3635, + BG_SA_RIGHT_GY_ALLIANCE = 3636, + BG_SA_CENTER_GY_ALLIANCE = 3637, + BG_SA_RIGHT_ATT_TOKEN_ALL = 3627, + BG_SA_LEFT_ATT_TOKEN_ALL = 3626, + BG_SA_LEFT_ATT_TOKEN_HRD = 3629, + BG_SA_RIGHT_ATT_TOKEN_HRD = 3628, + BG_SA_HORDE_DEFENCE_TOKEN = 3631, + BG_SA_ALLIANCE_DEFENCE_TOKEN = 3630, + BG_SA_RIGHT_GY_HORDE = 3632, + BG_SA_LEFT_GY_HORDE = 3633, + BG_SA_CENTER_GY_HORDE = 3634, + BG_SA_BONUS_TIMER = 0xdf3, + BG_SA_ENABLE_TIMER = 3564, }; enum npc @@ -122,14 +143,14 @@ enum BG_SA_NPCs enum BG_SA_Boat { - BG_SA_BOAT_ONE_A =193182, - BG_SA_BOAT_TWO_H =193183, - BG_SA_BOAT_ONE_H =193184, - BG_SA_BOAT_TWO_A =193185, + BG_SA_BOAT_ONE_A = 193182, + BG_SA_BOAT_TWO_H = 193183, + BG_SA_BOAT_ONE_H = 193184, + BG_SA_BOAT_TWO_A = 193185, }; -const uint32 BG_SA_NpcEntries[BG_SA_MAXNPC] = - { +uint32 const BG_SA_NpcEntries[BG_SA_MAXNPC] = +{ NPC_ANTI_PERSONNAL_CANNON, NPC_ANTI_PERSONNAL_CANNON, NPC_ANTI_PERSONNAL_CANNON, @@ -140,25 +161,25 @@ const uint32 BG_SA_NpcEntries[BG_SA_MAXNPC] = NPC_ANTI_PERSONNAL_CANNON, NPC_ANTI_PERSONNAL_CANNON, NPC_ANTI_PERSONNAL_CANNON, - //4 beach demolishers + // 4 beach demolishers NPC_DEMOLISHER_SA, NPC_DEMOLISHER_SA, NPC_DEMOLISHER_SA, NPC_DEMOLISHER_SA, - //Triggers + // Triggers 23472, 23472, 23472, 23472, 23472, - //Used Demolisher Salesman + // Used Demolisher Salesman NPC_RIGGER_SPARKLIGHT, NPC_GORGRIL_RIGSPARK - }; +}; -const float BG_SA_NpcSpawnlocs[BG_SA_MAXNPC + BG_SA_DEMOLISHER_AMOUNT][4] = +float const BG_SA_NpcSpawnlocs[BG_SA_MAXNPC + BG_SA_DEMOLISHER_AMOUNT][4] = { - //Cannons + // Cannons { 1436.429f, 110.05f, 41.407f, 5.4f }, { 1404.9023f, 84.758f, 41.183f, 5.46f }, { 1068.693f, -86.951f, 93.81f, 0.02f }, @@ -169,21 +190,21 @@ const float BG_SA_NpcSpawnlocs[BG_SA_MAXNPC + BG_SA_DEMOLISHER_AMOUNT][4] = { 1249.634f, -224.189f, 66.72f, 0.635f }, { 1236.213f, 92.287f, 64.965f, 5.751f }, { 1215.11f, 57.772f, 64.739f, 5.78f }, - //Demolishers + // Demolishers { 1611.597656f, -117.270073f, 8.719355f, 2.513274f}, { 1575.562500f, -158.421875f, 5.024450f, 2.129302f}, { 1618.047729f, 61.424641f, 7.248210f, 3.979351f}, { 1575.103149f, 98.873344f, 2.830360f, 3.752458f}, - //trigger + // Triggers { 1453.49f, -250.453f, 30.896f, 4.2883f}, { 1377.05f, 97.036f, 30.8605f, 2.46539f}, { 1186.05f, 58.8048f, 56.5491f, 2.75992f}, { 1042.83f, -72.839f, 84.8145f, 3.58615f}, { 1233.62f, -250.49f, 55.4036f, 3.7016f}, - //Npcs + // Npcs { 1348.644165f, -298.786469f, 31.080130f, 1.710423f}, { 1358.191040f, 195.527786f, 31.018187f, 4.171337f}, - //Demolishers2 + // Demolishers 2 { 1371.055786f, -317.071136f, 35.007359f, 1.947460f}, { 1424.034912f, -260.195190f, 31.084425f, 2.820013f}, { 1353.139893f, 223.745438f, 35.265411f, 4.343684f}, @@ -221,7 +242,7 @@ enum BG_SA_Objects BG_SA_MAXOBJ = BG_SA_BOMB+68 }; -const float BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ][4] = +float const BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ][4] = { { 1411.57f, 108.163f, 28.692f, 5.441f }, { 1055.452f, -108.1f, 82.134f, 0.034f }, @@ -230,30 +251,30 @@ const float BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ][4] = { 1214.681f, 81.21f, 53.413f, 5.745f }, { 878.555f, -108.2f, 117.845f, 0.0f }, { 836.5f, -108.8f, 120.219f, 0.0f }, - //Ships + // Ships { 2679.696777f, -826.891235f, 3.712860f, 5.78367f}, //rot2 1 rot3 0.0002f { 2574.003662f, 981.261475f, 2.603424f, 0.807696f}, - //Sigils + // Sigils { 1414.054f, 106.72f, 41.442f, 5.441f }, { 1060.63f, -107.8f, 94.7f, 0.034f }, { 1433.383f, -216.4f, 43.642f, 0.9736f }, { 1230.75f, -210.724f, 67.611f, 0.5023f }, { 1217.8f, 79.532f, 66.58f, 5.745f }, - //Flagpoles + // Flagpoles { 1215.114258f, -65.711861f, 70.084267f, -3.124123f}, {1338.863892f, -153.336533f, 30.895121f, -2.530723f}, {1309.124268f, 9.410645f, 30.893402f, -1.623156f}, - //Flags + // Flags { 1215.108032f, -65.715767f, 70.084267f, -3.124123f}, { 1338.859253f, -153.327316f, 30.895077f, -2.530723f}, { 1309.192017f, 9.416233f, 30.893402f, 1.518436f}, - //Portal + // Portal {1468.380005f, -225.798996f, 30.896200f, 0.0f}, //blue {1394.270020f, 72.551399f, 31.054300f, 0.0f}, //green {1065.260010f, -89.79501f, 81.073402f, 0.0f}, //yellow {1216.069946f, 47.904301f, 54.278198f, 0.0f}, //purple {1255.569946f, -233.548996f, 56.43699f, 0.0f}, //red - //Bombs + // Bombs {1333.45f, 211.354f, 31.0538f, 5.03666f}, {1334.29f, 209.582f, 31.0532f, 1.28088f}, {1332.72f, 210.049f, 31.0532f, 1.28088f}, @@ -337,7 +358,7 @@ const float BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ][4] = * to get horde ones. */ -const uint32 BG_SA_ObjEntries[BG_SA_MAXOBJ + BG_SA_FLAG_AMOUNT] = +uint32 const BG_SA_ObjEntries[BG_SA_MAXOBJ + BG_SA_FLAG_AMOUNT] = { 190722, 190727, @@ -367,7 +388,7 @@ const uint32 BG_SA_ObjEntries[BG_SA_MAXOBJ + BG_SA_FLAG_AMOUNT] = 190753 }; -const uint32 BG_SA_Factions[2] = +uint32 const BG_SA_Factions[2] = { 1732, 1735, @@ -392,13 +413,13 @@ const uint32 BG_SA_GYEntries[BG_SA_MAX_GY] = 1348, }; -const float BG_SA_GYOrientation[BG_SA_MAX_GY] = +float const BG_SA_GYOrientation[BG_SA_MAX_GY] = { 6.202f, - 1.926f, //right capturable GY - 3.917f, //left capturable GY - 3.104f, //center, capturable - 6.148f, //defender last GY + 1.926f, // right capturable GY + 3.917f, // left capturable GY + 3.104f, // center, capturable + 6.148f, // defender last GY }; struct BG_SA_RoundScore @@ -443,34 +464,60 @@ class BattlegroundSA : public Battleground /// Called when a player use a gamobject (relic) virtual void EventPlayerUsedGO(Player* Source, GameObject* object); /// Return gate id, relative to bg data, according to gameobject id - uint32 GetGateIDFromDestroyEventID(uint32 id) + uint32 getGateIdFromDamagedOrDestroyEventId(uint32 id) { - uint32 i = 0; switch (id) { - case 19046: i = BG_SA_GREEN_GATE; break; //Green gate destroyed - case 19045: i = BG_SA_BLUE_GATE; break; //blue gate - case 19047: i = BG_SA_RED_GATE; break; //red gate - case 19048: i = BG_SA_PURPLE_GATE; break; //purple gate - case 19049: i = BG_SA_YELLOW_GATE; break; //yellow gate - case 19837: i = BG_SA_ANCIENT_GATE; break; //ancient gate + // Green gate + case BG_SA_EVENT_GREEN_GATE_DAMAGED: + case BG_SA_EVENT_GREEN_GATE_DESTROYED: + return BG_SA_GREEN_GATE; + // Blue gate + case BG_SA_EVENT_BLUE_GATE_DAMAGED: + case BG_SA_EVENT_BLUE_GATE_DESTROYED: + return BG_SA_BLUE_GATE; + // Red gate + case BG_SA_EVENT_RED_GATE_DAMAGED: + case BG_SA_EVENT_RED_GATE_DESTROYED: + return BG_SA_RED_GATE; + // Purple gate + case BG_SA_EVENT_PURPLE_GATE_DAMAGED: + case BG_SA_EVENT_PURPLE_GATE_DESTROYED: + return BG_SA_PURPLE_GATE; + // Yellow gate + case BG_SA_EVENT_YELLOW_GATE_DAMAGED: + case BG_SA_EVENT_YELLOW_GATE_DESTROYED: + return BG_SA_YELLOW_GATE; + // Ancient gate + case BG_SA_EVENT_ANCIENT_GATE_DAMAGED: + case BG_SA_EVENT_ANCIENT_GATE_DESTROYED: + return BG_SA_ANCIENT_GATE; + default: + break; } - return i; + return 0; } /// Return worldstate id, according to door id - uint32 GetWorldStateFromGateID(uint32 id) + uint32 getWorldStateFromGateId(uint32 id) { - uint32 uws = 0; switch (id) { - case BG_SA_GREEN_GATE: uws = BG_SA_GREEN_GATEWS; break; - case BG_SA_YELLOW_GATE: uws = BG_SA_YELLOW_GATEWS; break; - case BG_SA_BLUE_GATE: uws = BG_SA_BLUE_GATEWS; break; - case BG_SA_RED_GATE: uws = BG_SA_RED_GATEWS; break; - case BG_SA_PURPLE_GATE: uws = BG_SA_PURPLE_GATEWS; break; - case BG_SA_ANCIENT_GATE: uws = BG_SA_ANCIENT_GATEWS; break; + case BG_SA_GREEN_GATE: + return BG_SA_GREEN_GATEWS; + case BG_SA_YELLOW_GATE: + return BG_SA_YELLOW_GATEWS; + case BG_SA_BLUE_GATE: + return BG_SA_BLUE_GATEWS; + case BG_SA_RED_GATE: + return BG_SA_RED_GATEWS; + case BG_SA_PURPLE_GATE: + return BG_SA_PURPLE_GATEWS; + case BG_SA_ANCIENT_GATE: + return BG_SA_ANCIENT_GATEWS; + default: + break; } - return uws; + return 0; } /// Called on battleground ending diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 9650cf11a8c..d100dc645a2 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -37,7 +37,8 @@ enum BG_WSG_Rewards BG_WSG_REWARD_NUM }; -uint32 BG_WSG_Honor[BG_HONOR_MODE_NUM][BG_WSG_REWARD_NUM] = { +uint32 BG_WSG_Honor[BG_HONOR_MODE_NUM][BG_WSG_REWARD_NUM] = +{ {20, 40, 40}, // normal honor {60, 40, 80} // holiday }; @@ -51,6 +52,7 @@ BattlegroundWS::BattlegroundWS() StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE; StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE; StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN; + _flagDebuffState = 0; } BattlegroundWS::~BattlegroundWS() @@ -177,20 +179,20 @@ void BattlegroundWS::StartingEventCloseDoors() void BattlegroundWS::StartingEventOpenDoors() { - for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_4; ++i) + for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_6; ++i) DoorOpen(i); - for (uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_2; ++i) + for (uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i) DoorOpen(i); + for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) + SpawnBGObject(i, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_WS_OBJECT_DOOR_A_5, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_A_6, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_3, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY); - for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) - SpawnBGObject(i, RESPAWN_IMMEDIATELY); - - // players joining later are not egible + // players joining later are not eligibles StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE); } @@ -436,8 +438,8 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target ChatMsg type = CHAT_MSG_BG_SYSTEM_NEUTRAL; //alliance flag picked up from base - if (Source->GetTeam() == HORDE && this->GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE - && this->BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID()) + if (Source->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE + && BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID()) { message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; @@ -455,8 +457,8 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target } //horde flag picked up from base - if (Source->GetTeam() == ALLIANCE && this->GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE - && this->BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID()) + if (Source->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE + && BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID()) { message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; @@ -474,7 +476,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target } //Alliance flag on ground(not in base) (returned or picked up again from ground!) - if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10)) + if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY) { if (Source->GetTeam() == ALLIANCE) { @@ -508,7 +510,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target } //Horde flag on ground(not in base) (returned or picked up again) - if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10)) + if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY) { if (Source->GetTeam() == HORDE) { diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 1f680f6e9b0..8b81a48c33b 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -107,7 +107,6 @@ set(game_STAT_SRCS include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/mersennetwister ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/zlib ${CMAKE_SOURCE_DIR}/src/server/collision diff --git a/src/server/game/Calendar/Calendar.cpp b/src/server/game/Calendar/Calendar.cpp index 2c4ad943dd6..139e63614cc 100755 --- a/src/server/game/Calendar/Calendar.cpp +++ b/src/server/game/Calendar/Calendar.cpp @@ -15,3 +15,85 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ + +#include "Player.h" +#include "Calendar.h" + +std::string CalendarInvite::GetDebugString() const +{ + std::ostringstream data; + + data << "CalendarInvite::" + << " inviteId: " << _inviteId + << " EventId: " << _eventId + << " Status: " << uint32(_status) + << " Invitee: " << _invitee + << " Sender: " << _senderGUID + << " Rank: " << uint32(_rank) + << " Text: " << _text; + + return data.str(); +} + +void CalendarInvite::Init() +{ + _eventId = 0; + _invitee = 0; + _senderGUID = 0; + _statusTime = 0; + _status = CALENDAR_STATUS_INVITED; // default (0)? + _rank = CALENDAR_RANK_PLAYER; + _text = ""; +} + +std::string CalendarEvent::GetDebugString() const +{ + std::ostringstream data; + + data << "CalendarEvent::" + << " EventId: " << _eventId + << " Title: " << _title + << " Description" << _description + << " Type: " << uint32(_type) + << " Max Invites: " << _maxInvites + << " Creator: " << _creatorGUID + << " Flags: " << _flags + << " Guild: " << _guildId + << " Time: " << _eventTime + << " Time2: " << _timezoneTime + << " Repeatable: " << uint32(_repeatable) + << " DungeonId: " << _dungeonId; + + return data.str(); +} + +void CalendarEvent::Init() +{ + _creatorGUID = 0; + _guildId = 0; + _type = CALENDAR_TYPE_OTHER; + _dungeonId = -1; + _maxInvites = 0; + _eventTime = 0; + _flags = 0; + _repeatable = false; + _timezoneTime = 0; + _title = ""; + _description = ""; + +} + +std::string CalendarAction::GetDebugString() const +{ + std::ostringstream data; + + data << "CalendarAction::" + << " Action: " << GetAction() + << " Guid: " << GetPlayer()->GetGUID() + << " Invite Id: " << GetInviteId() + << " Extra data: " << GetExtraData() + << " Event: " << Event.GetDebugString() + << " Invite: " << Invite.GetDebugString(); + + return data.str(); +} diff --git a/src/server/game/Calendar/Calendar.h b/src/server/game/Calendar/Calendar.h index dfc88e477f9..a2d2dc2ffb7 100755 --- a/src/server/game/Calendar/Calendar.h +++ b/src/server/game/Calendar/Calendar.h @@ -19,8 +19,171 @@ #ifndef TRINITY_CALENDAR_H #define TRINITY_CALENDAR_H -class Calendar +#include "Errors.h" +#include "SharedDefines.h" +#include + +class CalendarInvite { + public: + CalendarInvite() : _inviteId(0) { Init(); } + explicit CalendarInvite(uint64 inviteId) : _inviteId(inviteId) { Init(); } + + ~CalendarInvite() { } + + void SetInviteId(uint64 inviteId) { _inviteId = inviteId; } + uint64 GetInviteId() const { return _inviteId; } + + void SetEventId(uint64 eventId) { _eventId = eventId; } + uint64 GetEventId() const { return _eventId; } + + void SetSenderGUID(uint64 guid) { _senderGUID = guid; } + uint64 GetSenderGUID() const { return _senderGUID; } + + void SetInvitee(uint64 guid) { _invitee = guid; } + uint64 GetInvitee() const { return _invitee; } + + void SetStatusTime(uint32 statusTime) { _statusTime = statusTime; } + uint32 GetStatusTime() const { return _statusTime; } + + void SetText(std::string text) { _text = text; } + std::string GetText() const { return _text; } + + void SetStatus(CalendarInviteStatus status) { _status = status; } + CalendarInviteStatus GetStatus() const { return _status; } + + void SetRank(CalendarModerationRank rank) { _rank = rank; } + CalendarModerationRank GetRank() const { return _rank; } + + std::string GetDebugString() const; + + private: + void Init(); + uint64 _inviteId; + uint64 _eventId; + uint64 _invitee; + uint64 _senderGUID; + uint32 _statusTime; + CalendarInviteStatus _status; + CalendarModerationRank _rank; + std::string _text; }; + +typedef std::set CalendarInviteIdList; + +class CalendarEvent +{ + public: + CalendarEvent() : _eventId(0) { Init(); } + explicit CalendarEvent(uint64 eventId) : _eventId(eventId) { Init(); } + + ~CalendarEvent() { } + + void SetEventId(uint64 eventId) { _eventId = eventId; } + uint64 GetEventId() const { return _eventId; } + + void SetCreatorGUID(uint64 guid) { _creatorGUID = guid; } + uint64 GetCreatorGUID() const { return _creatorGUID; } + + void SetGuildId(uint32 guildId) { _guildId = guildId; } + uint32 GetGuildId() const { return _guildId; } + + void SetTitle(std::string title) { _title = title; } + std::string GetTitle() const { return _title; } + + void SetDescription(std::string description) { _description = description; } + std::string GetDescription() const { return _description; } + + void SetType(CalendarEventType type) { _type = type; } + CalendarEventType GetType() const { return _type; } + + void SetMaxInvites(uint32 limit) { _maxInvites = limit; } + uint32 GetMaxInvites() const { return _maxInvites; } + + void SetDungeonId(int32 dungeonId) { _dungeonId = dungeonId; } + int32 GetDungeonId() const { return _dungeonId; } + + void SetTime(uint32 eventTime) { _eventTime = eventTime; } + uint32 GetTime() const { return _eventTime; } + + void SetFlags(uint32 flags) { _flags = flags; } + uint32 GetFlags() const { return _flags; } + + void SetRepeatable(bool repeatable) { _repeatable = repeatable; } + bool GetRepeatable() const { return _repeatable; } + + void SetTimeZoneTime(uint32 timezoneTime) { _timezoneTime = timezoneTime; } + uint32 GetTimeZoneTime() const { return _timezoneTime; } + + void AddInvite(uint64 inviteId) + { + if (inviteId) + _invites.insert(inviteId); + } + + void RemoveInvite(uint64 inviteId) { _invites.erase(inviteId); } + bool HasInvite(uint64 inviteId) const { return _invites.find(inviteId) != _invites.end(); } + CalendarInviteIdList const& GetInviteIdList() const { return _invites; } + void SetInviteIdList(CalendarInviteIdList const& list) { _invites = list; } + void ClearInviteIdList() { _invites.clear(); } + + std::string GetDebugString() const; + + private: + void Init(); + + uint64 _eventId; + uint64 _creatorGUID; + uint32 _guildId; + CalendarEventType _type; + int32 _dungeonId; + uint32 _maxInvites; + uint32 _eventTime; + uint32 _flags; + bool _repeatable; + uint32 _timezoneTime; + std::string _title; + std::string _description; + CalendarInviteIdList _invites; +}; + +typedef std::set CalendarEventIdList; +typedef std::map CalendarPlayerInviteIdMap; +typedef std::map CalendarPlayerEventIdMap; +typedef std::map CalendarInviteMap; +typedef std::map CalendarEventMap; + +class Player; + +struct CalendarAction +{ + CalendarAction(): _action(CALENDAR_ACTION_NONE), _player(NULL), _inviteId(0), _data(0) + { + } + + void SetAction(CalendarActionData data) { _action = data; } + CalendarActionData GetAction() const { return _action; } + + void SetPlayer(Player* player) { ASSERT(player); _player = player; } + Player* GetPlayer() const { return _player; } + + void SetInviteId(uint64 id) { _inviteId = id; } + uint64 GetInviteId() const { return _inviteId; } + + void SetExtraData(uint32 data) { _data = data; } + uint32 GetExtraData() const { return _data; } + + CalendarEvent Event; + CalendarInvite Invite; + + std::string GetDebugString() const; + + private: + CalendarActionData _action; + Player* _player; + uint64 _inviteId; + uint32 _data; +}; + #endif diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp new file mode 100644 index 00000000000..62bc0ab3205 --- /dev/null +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -0,0 +1,593 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +/* + +DROP TABLE IF EXISTS `calendar_events`; +CREATE TABLE IF NOT EXISTS `calendar_events` ( + `id` int(11) unsigned NOT NULL DEFAULT '0', + `creator` int(11) unsigned NOT NULL DEFAULT '0', + `title` varchar(255) NOT NULL DEFAULT '', + `description` varchar(255) NOT NULL DEFAULT '', + `type` tinyint(1) unsigned NOT NULL DEFAULT '4', + `dungeon` tinyint(3) NOT NULL DEFAULT '-1', + `eventtime` int(10) unsigned NOT NULL DEFAULT '0', + `flags` int(10) unsigned NOT NULL DEFAULT '0', + `repeatable` tinyint(1) unsigned NOT NULL DEFAULT '0', + `time2` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +); + +DROP TABLE IF EXISTS `calendar_invites`; +CREATE TABLE IF NOT EXISTS `calendar_invites` ( + `id` int(11) unsigned NOT NULL DEFAULT '0', + `event` int(11) unsigned NOT NULL DEFAULT '0', + `invitee` int(11) unsigned NOT NULL DEFAULT '0', + `sender` int(11) unsigned NOT NULL DEFAULT '0', + `status` tinyint(1) unsigned NOT NULL DEFAULT '0', + `statustime` int(10) unsigned NOT NULL DEFAULT '0', + `rank` tinyint(1) unsigned NOT NULL DEFAULT '0', + `text` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +); +*/ + +#include "CalendarMgr.h" +#include "QueryResult.h" +#include "DatabaseEnv.h" +#include "Log.h" +#include "Player.h" +#include "ObjectAccessor.h" + +CalendarMgr::CalendarMgr() : + _eventNum(0), _inviteNum(0) +{ +} + +CalendarMgr::~CalendarMgr() +{ +} + +uint32 CalendarMgr::GetPlayerNumPending(uint64 guid) +{ + if (!guid) + return 0; + + CalendarPlayerInviteIdMap::const_iterator itr = _playerInvites.find(guid); + if (itr == _playerInvites.end()) + return 0; + + uint32 pendingNum = 0; + for (CalendarInviteIdList::const_iterator it = itr->second.begin(); it != itr->second.end(); ++it) + if (CalendarInvite* invite = GetInvite(*it)) + if (invite->GetRank() != CALENDAR_RANK_OWNER + && invite->GetStatus() != CALENDAR_STATUS_CONFIRMED + && invite->GetStatus() != CALENDAR_STATUS_8 + && invite->GetStatus() != CALENDAR_STATUS_9) // FIXME Check the proper value + ++pendingNum; + + return pendingNum; +} + +CalendarInviteIdList const& CalendarMgr::GetPlayerInvites(uint64 guid) +{ + return _playerInvites[guid]; +} + +CalendarEventIdList const& CalendarMgr::GetPlayerEvents(uint64 guid) +{ + return _playerEvents[guid]; +} + +CalendarInvite* CalendarMgr::GetInvite(uint64 inviteId) +{ + CalendarInviteMap::iterator itr = _invites.find(inviteId); + if (itr != _invites.end()) + return &(itr->second); + + sLog->outError("CalendarMgr::GetInvite: [" UI64FMTD "] not found!", inviteId); + return NULL; +} + +CalendarEvent* CalendarMgr::GetEvent(uint64 eventId) +{ + CalendarEventMap::iterator itr = _events.find(eventId); + if (itr != _events.end()) + return &(itr->second); + + sLog->outError("CalendarMgr::GetEvent: [" UI64FMTD "] not found!", eventId); + return NULL; +} + +uint64 CalendarMgr::GetFreeEventId() +{ + return ++_eventNum; +} +uint64 CalendarMgr::GetFreeInviteId() +{ + return ++_inviteNum; +} + +void CalendarMgr::LoadFromDB() +{ + /* + uint32 count = 0; + // 0 1 2 3 4 5 6 7 8 9 + if (QueryResult result = CharacterDatabase.Query("SELECT id, creator, title, description, type, dungeon, eventtime, flags, repeatable, time2 FROM calendar_events")) + do + { + Field * fields = result->Fetch(); + + uint64 eventId = fields[0].GetUInt64(); + CalendarEvent& calendarEvent = _events[eventId]; + + calendarEvent.SetEventId(eventId); + calendarEvent.SetCreatorGUID(fields[1].GetUInt64()); + calendarEvent.SetTitle(fields[2].GetString()); + calendarEvent.SetDescription(fields[3].GetString()); + calendarEvent.SetType(fields[4].GetUInt8()); + calendarEvent.SetDungeonId(fields[5].GetInt32()); + calendarEvent.SetTime(fields[6].GetUInt32()); + calendarEvent.SetFlags(fields[7].GetUInt32()); + calendarEvent.SetRepeatable(fields[8].GetBool()); + calendarEvent.SetTimeZoneTime(fields[9].GetUInt32()); + ++count; + } + while (result->NextRow()); + + sLog->outString(">> Loaded %u calendar events", count); + count = 0; + + // 0 1 2 3 4 5 6 7 + if (QueryResult result = CharacterDatabase.Query("SELECT id, event, invitee, sender, status, statustime, rank, text FROM calendar_invites")) + do + { + Field * fields = result->Fetch(); + + uint64 inviteId = fields[0].GetUInt64(); + uint64 eventId = fields[1].GetUInt64(); + + CalendarInvite& invite = _invites[inviteId]; + + invite.SetEventId(eventId); + invite.SetInvitee(fields[2].GetUInt64()); + invite.SetSenderGUID(fields[3].GetUInt64()); + invite.SetStatus(fields[4].GetUInt8()); + invite.SetStatusTime(fields[5].GetUInt32()); + invite.SetRank(fields[6].GetUInt8()); + invite.SetText(fields[7].GetString()); + + CalendarEvent& calendarEvent = _events[eventId]; + calendarEvent.AddInvite(inviteId); + } + while (result->NextRow()); + + sLog->outString(">> Loaded %u calendar Invites", count); + */ +} + +CalendarEvent* CalendarMgr::CheckPermisions(uint64 eventId, Player* player, uint64 inviteId, CalendarModerationRank minRank) +{ + if (!player) + return NULL; // CALENDAR_ERROR_INTERNAL + + CalendarEvent* calendarEvent = GetEvent(eventId); + if (!calendarEvent) + { + player->GetSession()->SendCalendarCommandResult(CALENDAR_ERROR_EVENT_INVALID); + return NULL; + } + + CalendarInvite* invite = GetInvite(inviteId); + if (!invite) + { + player->GetSession()->SendCalendarCommandResult(CALENDAR_ERROR_NO_INVITE); + return NULL; + } + + if (!calendarEvent->HasInvite(inviteId)) + { + player->GetSession()->SendCalendarCommandResult(CALENDAR_ERROR_NOT_INVITED); + return NULL; + } + + if (invite->GetEventId() != calendarEvent->GetEventId() || invite->GetInvitee() != player->GetGUID()) + { + player->GetSession()->SendCalendarCommandResult(CALENDAR_ERROR_INTERNAL); + return NULL; + } + + if (invite->GetRank() < minRank) + { + player->GetSession()->SendCalendarCommandResult(CALENDAR_ERROR_PERMISSIONS); + return NULL; + } + + return calendarEvent; +} + +void CalendarMgr::AddAction(CalendarAction const& action) +{ + switch (action.GetAction()) + { + case CALENDAR_ACTION_ADD_EVENT: + { + if (AddEvent(action.Event) && AddInvite(action.Invite)) + { + SendCalendarEventInviteAlert(action.Event, action.Invite); + SendCalendarEvent(action.Event, CALENDAR_SENDTYPE_ADD); + } + break; + } + case CALENDAR_ACTION_MODIFY_EVENT: + { + uint64 eventId = action.Event.GetEventId(); + CalendarEvent* calendarEvent = CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_MODERATOR); + if (!calendarEvent) + return; + + calendarEvent->SetEventId(action.Event.GetEventId()); + calendarEvent->SetType(action.Event.GetType()); + calendarEvent->SetFlags(action.Event.GetFlags()); + calendarEvent->SetTime(action.Event.GetTime()); + calendarEvent->SetTimeZoneTime(action.Event.GetTimeZoneTime()); + calendarEvent->SetRepeatable(action.Event.GetRepeatable()); + calendarEvent->SetDungeonId(action.Event.GetDungeonId()); + calendarEvent->SetTitle(action.Event.GetTitle()); + calendarEvent->SetDescription(action.Event.GetDescription()); + calendarEvent->SetMaxInvites(action.Event.GetMaxInvites()); + + CalendarInviteIdList const& invites = calendarEvent->GetInviteIdList(); + for (CalendarInviteIdList::const_iterator itr = invites.begin(); itr != invites.end(); ++itr) + if (CalendarInvite* invite = GetInvite(*itr)) + SendCalendarEventUpdateAlert(invite->GetInvitee(), *calendarEvent, CALENDAR_SENDTYPE_ADD); + + break; + } + case CALENDAR_ACTION_COPY_EVENT: + { + CalendarEvent* calendarEvent = CheckPermisions(action.Event.GetEventId(), action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_OWNER); + + if (!calendarEvent) + return; + + uint64 eventId = GetFreeEventId(); + CalendarEvent newEvent(eventId); + newEvent.SetType(calendarEvent->GetType()); + newEvent.SetFlags(calendarEvent->GetFlags()); + newEvent.SetTime(action.Event.GetTime()); + newEvent.SetTimeZoneTime(calendarEvent->GetTimeZoneTime()); + newEvent.SetRepeatable(calendarEvent->GetRepeatable()); + newEvent.SetDungeonId(calendarEvent->GetDungeonId()); + newEvent.SetTitle(calendarEvent->GetTitle()); + newEvent.SetDescription(calendarEvent->GetDescription()); + newEvent.SetMaxInvites(calendarEvent->GetMaxInvites()); + newEvent.SetCreatorGUID(calendarEvent->GetCreatorGUID()); + newEvent.SetGuildId(calendarEvent->GetGuildId()); + + CalendarInviteIdList const invites = calendarEvent->GetInviteIdList(); + for (CalendarInviteIdList::const_iterator itr = invites.begin(); itr != invites.end(); ++itr) + { + if (CalendarInvite* invite = GetInvite(*itr)) + { + uint64 inviteId = GetFreeInviteId(); + CalendarInvite newInvite(inviteId); + newInvite.SetEventId(eventId); + newInvite.SetSenderGUID(action.GetPlayer()->GetGUID()); + newInvite.SetInvitee(invite->GetInvitee()); + newInvite.SetStatus(invite->GetStatus()); + newInvite.SetStatusTime(invite->GetStatusTime()); + newInvite.SetText(invite->GetText()); + newInvite.SetRank(invite->GetRank()); + if (AddInvite(newInvite)) + { + SendCalendarEventInviteAlert(newEvent, newInvite); + newEvent.AddInvite(inviteId); + } + } + } + + if (AddEvent(newEvent)) + SendCalendarEvent(newEvent, CALENDAR_SENDTYPE_COPY); + + break; + } + case CALENDAR_ACTION_REMOVE_EVENT: + { + uint64 eventId = action.Event.GetEventId(); + //uint32 flags = action.Event.GetFlags(); + // FIXME - Use of Flags here! + + CalendarEvent* calendarEvent = CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_OWNER); + if (!calendarEvent) + return; + + RemoveEvent(eventId); + break; + } + case CALENDAR_ACTION_ADD_EVENT_INVITE: + { + uint64 eventId = action.Invite.GetEventId(); + CalendarEvent* calendarEvent = CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_MODERATOR); + if (!calendarEvent) + return; + + if (AddInvite(action.Invite)) + { + calendarEvent->AddInvite(action.Invite.GetInviteId()); + SendCalendarEventInvite(action.Invite, (!(calendarEvent->GetFlags() & CALENDAR_FLAG_INVITES_LOCKED) && + !action.Invite.GetStatusTime())); + SendCalendarEventInviteAlert(*calendarEvent, action.Invite); + } + + break; + } + case CALENDAR_ACTION_SIGNUP_TO_EVENT: + { + uint64 eventId = action.Event.GetEventId(); + CalendarEvent* calendarEvent = GetEvent(eventId); + CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_MODERATOR); + + if (!calendarEvent || !(calendarEvent->GetFlags() & CALENDAR_FLAG_GUILD_ONLY) + || !calendarEvent->GetGuildId() || calendarEvent->GetGuildId() != action.GetExtraData()) + return; + + CalendarInviteStatus status = action.Invite.GetStatus(); + + if (status == CALENDAR_STATUS_INVITED) + status = CALENDAR_STATUS_CONFIRMED; + else if (status == CALENDAR_STATUS_ACCEPTED) + status = CALENDAR_STATUS_8; + + CalendarInvite newInvite(GetFreeInviteId()); + newInvite.SetStatus(status); + newInvite.SetStatusTime(uint32(time(NULL))); + newInvite.SetEventId(eventId); + newInvite.SetInvitee(action.GetPlayer()->GetGUID()); + newInvite.SetSenderGUID(action.GetPlayer()->GetGUID()); + + if (AddInvite(newInvite)) + SendCalendarEventInvite(newInvite, false); + + break; + } + case CALENDAR_ACTION_MODIFY_EVENT_INVITE: + { + uint64 eventId = action.Invite.GetEventId(); + uint64 inviteId = action.Invite.GetInviteId(); + + CalendarEvent* calendarEvent = NULL; + if (action.GetInviteId() != action.Invite.GetInviteId()) + calendarEvent = CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_MODERATOR); + else + calendarEvent = GetEvent(eventId); + + CalendarInvite* invite = GetInvite(inviteId); + + if (!calendarEvent || !invite || !calendarEvent->HasInvite(inviteId)) + return; + + invite->SetStatus(action.Invite.GetStatus()); + SendCalendarEventStatus(invite->GetSenderGUID(), *calendarEvent, *invite); + break; + } + case CALENDAR_ACTION_MODIFY_MODERATOR_EVENT_INVITE: + { + uint64 eventId = action.Invite.GetEventId(); + uint64 inviteId = action.Invite.GetInviteId(); + + CalendarEvent* calendarEvent = NULL; + if (action.GetInviteId() != action.Invite.GetInviteId()) + calendarEvent = CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_OWNER); + else + calendarEvent = GetEvent(eventId); + + CalendarInvite* invite = GetInvite(inviteId); + + if (!calendarEvent || !invite || !calendarEvent->HasInvite(inviteId)) + return; + + invite->SetStatus(action.Invite.GetStatus()); + SendCalendarEventModeratorStatusAlert(*invite); + break; + } + case CALENDAR_ACTION_REMOVE_EVENT_INVITE: + { + uint64 eventId = action.Invite.GetEventId(); + uint64 inviteId = action.Invite.GetInviteId(); + CalendarEvent* calendarEvent = CheckPermisions(eventId, action.GetPlayer(), action.GetInviteId(), CALENDAR_RANK_MODERATOR); + if (!calendarEvent) + return; + + // already checked in CheckPermisions + CalendarInvite* invite = GetInvite(inviteId); + if (!invite) + return; + + if (calendarEvent->GetCreatorGUID() == invite->GetInvitee()) + { + action.GetPlayer()->GetSession()->SendCalendarCommandResult(CALENDAR_ERROR_DELETE_CREATOR_FAILED); + return; + } + + if (uint64 invitee = RemoveInvite(inviteId)) + { + SendCalendarEventInviteRemoveAlert(invitee, *calendarEvent, CALENDAR_STATUS_9); + SendCalendarEventInviteRemove(action.GetPlayer()->GetGUID(), action.Invite, calendarEvent->GetFlags()); + } + break; + } + default: + break; + } + +} + +bool CalendarMgr::AddEvent(CalendarEvent const& newEvent) +{ + uint64 eventId = newEvent.GetEventId(); + if (_events.find(eventId) != _events.end()) + { + sLog->outError("CalendarMgr::AddEvent: Event [" UI64FMTD "] exists", eventId); + return false; + } + + _events[eventId] = newEvent; + return true; +} + +bool CalendarMgr::RemoveEvent(uint64 eventId) +{ + CalendarEventMap::iterator itr = _events.find(eventId); + if (itr == _events.end()) + { + sLog->outError("CalendarMgr::RemoveEvent: Event [" UI64FMTD "] does not exist", eventId); + return false; + } + + bool val = true; + + CalendarInviteIdList const& invites = itr->second.GetInviteIdList(); + for (CalendarInviteIdList::const_iterator itrInvites = invites.begin(); itrInvites != invites.end(); ++itrInvites) + { + CalendarInvite* invite = GetInvite(*itrInvites); + if (!invite || !RemovePlayerEvent(invite->GetInvitee(), eventId)) + val = false; + + if (uint64 invitee = RemoveInvite(*itrInvites)) + SendCalendarEventRemovedAlert(invitee, itr->second); + } + + _events.erase(itr); + + return val; +} + +bool CalendarMgr::AddPlayerEvent(uint64 guid, uint64 eventId) +{ + _playerEvents[guid].insert(eventId); + return true; +} + +bool CalendarMgr::RemovePlayerEvent(uint64 guid, uint64 eventId) +{ + _playerEvents[guid].erase(eventId); + return true; +} + +bool CalendarMgr::AddInvite(CalendarInvite const& newInvite) +{ + uint64 inviteId = newInvite.GetInviteId(); + if (!inviteId) + { + sLog->outError("CalendarMgr::AddInvite: Cant add Invite 0"); + return false; + } + + if (_invites.find(inviteId) != _invites.end()) + { + sLog->outError("CalendarMgr::AddInvite: Invite [" UI64FMTD "] exists", inviteId); + return false; + } + + _invites[inviteId] = newInvite; + uint64 guid = newInvite.GetInvitee(); + bool inviteAdded = AddPlayerInvite(guid, inviteId); + bool eventAdded = AddPlayerEvent(guid, newInvite.GetEventId()); + return eventAdded && inviteAdded; +} + +uint64 CalendarMgr::RemoveInvite(uint64 inviteId) +{ + CalendarInviteMap::iterator itr = _invites.find(inviteId); + if (itr == _invites.end()) + { + sLog->outError("CalendarMgr::RemoveInvite: Invite [" UI64FMTD "] does not exist", inviteId); + return 0; + } + + uint64 invitee = itr->second.GetInvitee(); + _invites.erase(itr); + + return RemovePlayerInvite(invitee, inviteId) ? invitee : 0; +} + +bool CalendarMgr::AddPlayerInvite(uint64 guid, uint64 inviteId) +{ + _playerInvites[guid].insert(inviteId); + return true; +} + +bool CalendarMgr::RemovePlayerInvite(uint64 guid, uint64 inviteId) +{ + _playerInvites[guid].erase(inviteId); + return true; +} + +void CalendarMgr::SendCalendarEvent(CalendarEvent const& calendarEvent, CalendarSendEventType type) +{ + if (Player* player = ObjectAccessor::FindPlayer(calendarEvent.GetCreatorGUID())) + player->GetSession()->SendCalendarEvent(calendarEvent, type); +} + +void CalendarMgr::SendCalendarEventInvite(CalendarInvite const& invite, bool pending) +{ + if (Player* player = ObjectAccessor::FindPlayer(invite.GetSenderGUID())) + player->GetSession()->SendCalendarEventInvite(invite, pending); +} + +void CalendarMgr::SendCalendarEventInviteAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite) +{ + if (Player* player = ObjectAccessor::FindPlayer(invite.GetInvitee())) + player->GetSession()->SendCalendarEventInviteAlert(calendarEvent, invite); +} + +void CalendarMgr::SendCalendarEventUpdateAlert(uint64 guid, CalendarEvent const& calendarEvent, CalendarSendEventType type) +{ + if (Player* player = ObjectAccessor::FindPlayer(guid)) + player->GetSession()->SendCalendarEventUpdateAlert(calendarEvent, type); +} + +void CalendarMgr::SendCalendarEventStatus(uint64 guid, CalendarEvent const& calendarEvent, CalendarInvite const& invite) +{ + if (Player* player = ObjectAccessor::FindPlayer(guid)) + player->GetSession()->SendCalendarEventStatus(calendarEvent, invite); +} + +void CalendarMgr::SendCalendarEventRemovedAlert(uint64 guid, CalendarEvent const& calendarEvent) +{ + if (Player* player = ObjectAccessor::FindPlayer(guid)) + player->GetSession()->SendCalendarEventRemovedAlert(calendarEvent); +} + +void CalendarMgr::SendCalendarEventInviteRemoveAlert(uint64 guid, CalendarEvent const& calendarEvent, CalendarInviteStatus status) +{ + if (Player* player = ObjectAccessor::FindPlayer(guid)) + player->GetSession()->SendCalendarEventInviteRemoveAlert(calendarEvent, status); +} + +void CalendarMgr::SendCalendarEventInviteRemove(uint64 guid, CalendarInvite const& invite, uint32 flags) +{ + if (Player* player = ObjectAccessor::FindPlayer(guid)) + player->GetSession()->SendCalendarEventInviteRemove(invite, flags); +} + +void CalendarMgr::SendCalendarEventModeratorStatusAlert(CalendarInvite const& invite) +{ + if (Player* player = ObjectAccessor::FindPlayer(invite.GetInvitee())) + player->GetSession()->SendCalendarEventModeratorStatusAlert(invite); +} diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h new file mode 100644 index 00000000000..a8749778cb3 --- /dev/null +++ b/src/server/game/Calendar/CalendarMgr.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef TRINITY_CALENDARMGR_H +#define TRINITY_CALENDARMGR_H + +#include +#include "Calendar.h" + +class CalendarMgr +{ + friend class ACE_Singleton; + + CalendarMgr(); + ~CalendarMgr(); + + public: + void LoadFromDB(); + + CalendarInvite* GetInvite(uint64 inviteId); + CalendarEvent* GetEvent(uint64 eventId); + + CalendarInviteIdList const& GetPlayerInvites(uint64 guid); + CalendarEventIdList const& GetPlayerEvents(uint64 guid); + + uint32 GetPlayerNumPending(uint64 guid); + uint64 GetFreeEventId(); + uint64 GetFreeInviteId(); + + void AddAction(CalendarAction const& action); + + void SendCalendarEvent(CalendarEvent const& calendarEvent, CalendarSendEventType type); + void SendCalendarEventInvite(CalendarInvite const& invite, bool pending); + void SendCalendarEventInviteAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite); + void SendCalendarEventInviteRemove(uint64 guid, CalendarInvite const& invite, uint32 flags); + void SendCalendarEventInviteRemoveAlert(uint64 guid, CalendarEvent const& calendarEvent, CalendarInviteStatus status); + void SendCalendarEventUpdateAlert(uint64 guid, CalendarEvent const& calendarEvent, CalendarSendEventType type); + void SendCalendarEventStatus(uint64 guid, CalendarEvent const& calendarEvent, CalendarInvite const& invite); + void SendCalendarEventRemovedAlert(uint64 guid, CalendarEvent const& calendarEvent); + void SendCalendarEventModeratorStatusAlert(CalendarInvite const& invite); + + private: + CalendarEvent* CheckPermisions(uint64 eventId, Player* player, uint64 inviteId, CalendarModerationRank minRank); + + bool AddEvent(CalendarEvent const& calendarEvent); + bool RemoveEvent(uint64 eventId); + bool AddPlayerEvent(uint64 guid, uint64 eventId); + bool RemovePlayerEvent(uint64 guid, uint64 eventId); + + bool AddInvite(CalendarInvite const& invite); + uint64 RemoveInvite(uint64 inviteId); + bool AddPlayerInvite(uint64 guid, uint64 inviteId); + bool RemovePlayerInvite(uint64 guid, uint64 inviteId); + + CalendarEventMap _events; + CalendarInviteMap _invites; + CalendarPlayerInviteIdMap _playerInvites; + CalendarPlayerEventIdMap _playerEvents; + + uint64 _eventNum; + uint64 _inviteNum; +}; + +#define sCalendarMgr ACE_Singleton::instance() + +#endif diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index b6e9dd30d28..0e89601e987 100755 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -49,7 +49,6 @@ Channel::Channel(const std::string& name, uint32 channel_id, uint32 Team) } else // it's custom channel { - channel_id = 0; m_flags |= CHANNEL_FLAG_CUSTOM; // If storing custom channels in the db is enabled either load or save the channel @@ -671,7 +670,7 @@ void Channel::Invite(uint64 p, const char *newname) } Player* newp = sObjectAccessor->FindPlayerByName(newname); - if (!newp) + if (!newp || !newp->isGMVisible()) { WorldPacket data; MakePlayerNotFound(&data, newname); diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 035fbaf5b78..cc64a8e22dd 100755 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -140,10 +140,10 @@ ChatCommand* ChatHandler::getCommandTable() static ChatCommand groupCommandTable[] = { - { "leader", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupLeaderCommand>, "", NULL }, - { "disband", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupDisbandCommand>, "", NULL }, - { "remove", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupRemoveCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "leader", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupLeaderCommand>, "", NULL }, + { "disband", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupDisbandCommand>, "", NULL }, + { "remove", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupRemoveCommand>, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand guildCommandTable[] = @@ -281,7 +281,7 @@ ChatCommand* ChatHandler::getCommandTable() { "corpses", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleServerCorpsesCommand>, "", NULL }, { "exit", SEC_CONSOLE, true, OldHandler<&ChatHandler::HandleServerExitCommand>, "", NULL }, { "idlerestart", SEC_ADMINISTRATOR, true, NULL, "", serverIdleRestartCommandTable }, - { "idleshutdown", SEC_ADMINISTRATOR, true, NULL, "", serverShutdownCommandTable }, + { "idleshutdown", SEC_ADMINISTRATOR, true, NULL, "", serverIdleShutdownCommandTable }, { "info", SEC_PLAYER, true, OldHandler<&ChatHandler::HandleServerInfoCommand>, "", NULL }, { "motd", SEC_PLAYER, true, OldHandler<&ChatHandler::HandleServerMotdCommand>, "", NULL }, { "plimit", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleServerPLimitCommand>, "", NULL }, @@ -336,6 +336,7 @@ ChatCommand* ChatHandler::getCommandTable() { "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable }, { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable }, { "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable }, + { "group", SEC_ADMINISTRATOR, false, NULL, "", groupCommandTable }, { "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable }, { "reset", SEC_ADMINISTRATOR, true, NULL, "", resetCommandTable }, { "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable }, @@ -358,7 +359,6 @@ ChatCommand* ChatHandler::getCommandTable() { "summon", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleSummonCommand>, "", NULL }, { "groupsummon", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGroupSummonCommand>, "", NULL }, { "commands", SEC_PLAYER, true, OldHandler<&ChatHandler::HandleCommandsCommand>, "", NULL }, - { "demorph", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleDeMorphCommand>, "", NULL }, { "die", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleDieCommand>, "", NULL }, { "revive", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleReviveCommand>, "", NULL }, { "dismount", SEC_PLAYER, false, OldHandler<&ChatHandler::HandleDismountCommand>, "", NULL }, @@ -381,7 +381,6 @@ ChatCommand* ChatHandler::getCommandTable() { "linkgrave", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleLinkGraveCommand>, "", NULL }, { "neargrave", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleNearGraveCommand>, "", NULL }, { "explorecheat", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleExploreCheatCommand>, "", NULL }, - { "hover", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleHoverCommand>, "", NULL }, { "levelup", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleLevelUpCommand>, "", NULL }, { "showarea", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleShowAreaCommand>, "", NULL }, { "hidearea", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleHideAreaCommand>, "", NULL }, @@ -400,7 +399,7 @@ ChatCommand* ChatHandler::getCommandTable() { "movegens", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleMovegensCommand>, "", NULL }, { "cometome", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleComeToMeCommand>, "", NULL }, { "damage", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleDamageCommand>, "", NULL }, - { "combatstop", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleCombatStopCommand>, "", NULL }, + { "combatstop", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleCombatStopCommand>, "", NULL }, { "flusharenapoints", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleFlushArenaPointsCommand>, "", NULL }, { "repairitems", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleRepairitemsCommand>, "", NULL }, { "waterwalk", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleWaterwalkCommand>, "", NULL }, @@ -443,7 +442,10 @@ ChatCommand* ChatHandler::getCommandTable() added += appendCommandTable(commandTableCache + added, *it); } - QueryResult result = WorldDatabase.Query("SELECT name, security, help FROM command"); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_COMMANDS); + + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (result) { do @@ -451,7 +453,7 @@ ChatCommand* ChatHandler::getCommandTable() Field* fields = result->Fetch(); std::string name = fields[0].GetString(); - SetDataForCommandInTable(commandTableCache, name.c_str(), fields[1].GetUInt16(), fields[2].GetString(), name); + SetDataForCommandInTable(commandTableCache, name.c_str(), fields[1].GetUInt8(), fields[2].GetString(), name); } while (result->NextRow()); } @@ -1331,7 +1333,7 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text) // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r char* cId = extractKeyFromLink(text, "Htele"); if (!cId) - return false; + return NULL; // id case (explicit or from shift link) if (cId[0] >= '0' || cId[0] >= '9') @@ -1503,7 +1505,7 @@ char* ChatHandler::extractQuotedArg(char* args) { char* space = strtok(args, "\""); if (!space) - return false; + return NULL; return strtok(NULL, "\""); } } diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 2311f4b8e5e..e88914a2daf 100755 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -286,7 +286,6 @@ class ChatHandler bool HandleActivateObjectCommand(const char* args); bool HandleSpawnTransportCommand(const char* args); bool HandleExploreCheatCommand(const char* args); - bool HandleHoverCommand(const char* args); bool HandleWaterwalkCommand(const char* args); bool HandleLevelUpCommand(const char* args); bool HandleShowAreaCommand(const char* args); @@ -350,8 +349,8 @@ class ChatHandler bool HandleSaveAllCommand(const char* args); // Utility methods for commands - bool LookupPlayerSearchCommand(QueryResult result, int32 limit); - bool HandleBanListHelper(QueryResult result); + bool LookupPlayerSearchCommand(PreparedQueryResult result, int32 limit); + bool HandleBanListHelper(PreparedQueryResult result); bool HandleBanHelper(BanMode mode, char const* args); bool HandleBanInfoHelper(uint32 accountid, char const* accountname); bool HandleUnBanHelper(BanMode mode, char const* args); diff --git a/src/server/game/Chat/Commands/Level0.cpp b/src/server/game/Chat/Commands/Level0.cpp index 6d33a5761f4..b2ac090c313 100755 --- a/src/server/game/Chat/Commands/Level0.cpp +++ b/src/server/game/Chat/Commands/Level0.cpp @@ -17,10 +17,8 @@ */ #include "Common.h" -#include "DatabaseEnv.h" #include "World.h" #include "Player.h" -#include "Opcodes.h" #include "Chat.h" #include "ObjectAccessor.h" #include "Language.h" @@ -54,31 +52,31 @@ bool ChatHandler::HandleCommandsCommand(const char* /*args*/) bool ChatHandler::HandleStartCommand(const char* /*args*/) { - Player* chr = m_session->GetPlayer(); + Player* player = m_session->GetPlayer(); - if (chr->isInFlight()) + if (player->isInFlight()) { SendSysMessage(LANG_YOU_IN_FLIGHT); SetSentErrorMessage(true); return false; } - if (chr->isInCombat()) + if (player->isInCombat()) { SendSysMessage(LANG_YOU_IN_COMBAT); SetSentErrorMessage(true); return false; } - if ((chr->isDead()) || (chr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))) + if (player->isDead() || player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) { - // if player is dead and stuck, send ghost to graveyard - chr->RepopAtGraveyard(); - return true; + // if player is dead and stuck, send ghost to graveyard + player->RepopAtGraveyard(); + return true; } // cast spell Stuck - chr->CastSpell(chr, 7355, false); + player->CastSpell(player, 7355, false); return true; } @@ -107,23 +105,25 @@ bool ChatHandler::HandleServerInfoCommand(const char* /*args*/) bool ChatHandler::HandleDismountCommand(const char* /*args*/) { + Player* player = m_session->GetPlayer(); + //If player is not mounted, so go out :) - if (!m_session->GetPlayer()->IsMounted()) + if (!player->IsMounted()) { SendSysMessage(LANG_CHAR_NON_MOUNTED); SetSentErrorMessage(true); return false; } - if (m_session->GetPlayer()->isInFlight()) + if (player->isInFlight()) { SendSysMessage(LANG_YOU_IN_FLIGHT); SetSentErrorMessage(true); return false; } - m_session->GetPlayer()->Dismount(); - m_session->GetPlayer()->RemoveAurasByType(SPELL_AURA_MOUNTED); + player->Dismount(); + player->RemoveAurasByType(SPELL_AURA_MOUNTED); return true; } @@ -144,7 +144,7 @@ bool ChatHandler::HandleSaveCommand(const char* /*args*/) // save if the player has last been saved over 20 seconds ago uint32 save_interval = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); - if (save_interval == 0 || (save_interval > 20*IN_MILLISECONDS && player->GetSaveTimer() <= save_interval - 20*IN_MILLISECONDS)) + if (save_interval == 0 || (save_interval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= save_interval - 20 * IN_MILLISECONDS)) player->SaveToDB(); return true; diff --git a/src/server/game/Chat/Commands/Level1.cpp b/src/server/game/Chat/Commands/Level1.cpp index 2a57dce77a4..abbc59d0114 100755 --- a/src/server/game/Chat/Commands/Level1.cpp +++ b/src/server/game/Chat/Commands/Level1.cpp @@ -42,7 +42,6 @@ bool ChatHandler::HandleNameAnnounceCommand(const char* args) { - WorldPacket data; if (!*args) return false; @@ -56,7 +55,6 @@ bool ChatHandler::HandleNameAnnounceCommand(const char* args) bool ChatHandler::HandleGMNameAnnounceCommand(const char* args) { - WorldPacket data; if (!*args) return false; @@ -422,13 +420,10 @@ bool ChatHandler::HandleTaxiCheatCommand(const char* args) std::string argstr = (char*)args; Player* chr = getSelectedPlayer(); - if (!chr) - { - chr=m_session->GetPlayer(); - } - // check online security - else if (HasLowerSecurity(chr, 0)) + if (!chr) + chr = m_session->GetPlayer(); + else if (HasLowerSecurity(chr, 0)) // check online security return false; if (argstr == "on") @@ -474,12 +469,12 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) wstrToLower (wnamepart); // Search in AreaTable.dbc - for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows (); ++areaflag) + for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows(); ++areaflag) { - AreaTableEntry const* areaEntry = sAreaStore.LookupEntry (areaflag); + AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(areaflag); if (areaEntry) { - int loc = GetSessionDbcLocale (); + int loc = GetSessionDbcLocale(); std::string name = areaEntry->area_name; if (name.empty()) continue; @@ -489,11 +484,11 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) loc = 0; for (; loc < TOTAL_LOCALES; ++loc) { - if (loc == GetSessionDbcLocale ()) + if (loc == GetSessionDbcLocale()) continue; name = areaEntry->area_name; - if (name.empty ()) + if (name.empty()) continue; if (Utf8FitTo (name, wnamepart)) @@ -516,7 +511,7 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) else ss << areaEntry->ID << " - " << name << ' ' << localeNames[loc]; - SendSysMessage (ss.str ().c_str()); + SendSysMessage(ss.str().c_str()); if (!found) found = true; @@ -525,7 +520,7 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) } if (!found) - SendSysMessage (LANG_COMMAND_NOAREAFOUND); + SendSysMessage(LANG_COMMAND_NOAREAFOUND); return true; } @@ -698,7 +693,7 @@ bool ChatHandler::HandleGroupSummonCommand(const char* args) } Map* gmMap = m_session->GetPlayer()->GetMap(); - bool to_instance = gmMap->Instanceable(); + bool to_instance = gmMap->Instanceable(); // we are in instance, and can summon only player in our group with us as lead if (to_instance && ( diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp index b0c0bbf6890..4359c5ff20c 100755 --- a/src/server/game/Chat/Commands/Level2.cpp +++ b/src/server/game/Chat/Commands/Level2.cpp @@ -42,6 +42,7 @@ #include "Transport.h" #include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand #include "CreatureGroups.h" +#include "ace/INET_Addr.h" //mute player for some times bool ChatHandler::HandleMuteCommand(const char* args) @@ -175,7 +176,6 @@ bool ChatHandler::HandleItemMoveCommand(const char* args) { if (!*args) return false; - uint8 srcslot, dstslot; char* pParam1 = strtok((char*)args, " "); if (!pParam1) @@ -185,8 +185,8 @@ bool ChatHandler::HandleItemMoveCommand(const char* args) if (!pParam2) return false; - srcslot = (uint8)atoi(pParam1); - dstslot = (uint8)atoi(pParam2); + uint8 srcslot = (uint8)atoi(pParam1); + uint8 dstslot = (uint8)atoi(pParam2); if (srcslot == dstslot) return true; @@ -205,22 +205,6 @@ bool ChatHandler::HandleItemMoveCommand(const char* args) return true; } -//demorph player or unit -bool ChatHandler::HandleDeMorphCommand(const char* /*args*/) -{ - Unit* target = getSelectedUnit(); - if (!target) - target = m_session->GetPlayer(); - - // check online security - else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0)) - return false; - - target->DeMorph(); - - return true; -} - //kick player bool ChatHandler::HandleKickPlayerCommand(const char *args) { @@ -266,19 +250,18 @@ bool ChatHandler::HandlePInfoCommand(const char* args) else if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; - uint32 accId = 0; - uint32 money = 0; + uint32 accId = 0; + uint32 money = 0; uint32 total_player_time = 0; - uint8 level = 0; - uint32 latency = 0; + uint8 level = 0; + uint32 latency = 0; uint8 race; uint8 Class; - int64 muteTime = 0; - int64 banTime = -1; + int64 muteTime = 0; + int64 banTime = -1; uint32 mapId; uint32 areaId; - uint32 phase = 0; - + uint32 phase = 0; // get additional information from Player object if (target) @@ -287,17 +270,17 @@ bool ChatHandler::HandlePInfoCommand(const char* args) if (HasLowerSecurity(target, 0)) return false; - accId = target->GetSession()->GetAccountId(); - money = target->GetMoney(); + accId = target->GetSession()->GetAccountId(); + money = target->GetMoney(); total_player_time = target->GetTotalPlayedTime(); - level = target->getLevel(); - latency = target->GetSession()->GetLatency(); - race = target->getRace(); - Class = target->getClass(); - muteTime = target->GetSession()->m_muteTime; - mapId = target->GetMapId(); - areaId = target->GetAreaId(); - phase = target->GetPhaseMask(); + level = target->getLevel(); + latency = target->GetSession()->GetLatency(); + race = target->getRace(); + Class = target->getClass(); + muteTime = target->GetSession()->m_muteTime; + mapId = target->GetMapId(); + areaId = target->GetAreaId(); + phase = target->GetPhaseMask(); } // get additional information from DB else @@ -306,41 +289,42 @@ bool ChatHandler::HandlePInfoCommand(const char* args) if (HasLowerSecurity(NULL, target_guid)) return false; - // 0 1 2 3 4 5 6 7 - QueryResult result = CharacterDatabase.PQuery("SELECT totaltime, level, money, account, race, class, map, zone FROM characters " - "WHERE guid = '%u'", GUID_LOPART(target_guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO); + stmt->setUInt32(0, GUID_LOPART(target_guid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return false; - Field* fields = result->Fetch(); + Field* fields = result->Fetch(); total_player_time = fields[0].GetUInt32(); - level = fields[1].GetUInt32(); - money = fields[2].GetUInt32(); - accId = fields[3].GetUInt32(); - race = fields[4].GetUInt8(); - Class = fields[5].GetUInt8(); - mapId = fields[6].GetUInt16(); - areaId = fields[7].GetUInt16(); + level = fields[1].GetUInt8(); + money = fields[2].GetUInt32(); + accId = fields[3].GetUInt32(); + race = fields[4].GetUInt8(); + Class = fields[5].GetUInt8(); + mapId = fields[6].GetUInt16(); + areaId = fields[7].GetUInt16(); } - std::string username = GetTrinityString(LANG_ERROR); - std::string email = GetTrinityString(LANG_ERROR); - std::string last_ip = GetTrinityString(LANG_ERROR); - uint32 security = 0; + std::string username = GetTrinityString(LANG_ERROR); + std::string email = GetTrinityString(LANG_ERROR); + std::string last_ip = GetTrinityString(LANG_ERROR); + uint32 security = 0; std::string last_login = GetTrinityString(LANG_ERROR); - QueryResult result = LoginDatabase.PQuery("SELECT a.username, aa.gmlevel, a.email, a.last_ip, a.last_login, a.mutetime " - "FROM account a " - "LEFT JOIN account_access aa " - "ON (a.id = aa.id AND (aa.RealmID = -1 OR aa.RealmID = %u)) " - "WHERE a.id = '%u'", realmID, accId); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO); + stmt->setInt32(0, int32(realmID)); + stmt->setUInt32(1, accId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (result) { Field* fields = result->Fetch(); - username = fields[0].GetString(); - security = fields[1].GetUInt32(); - email = fields[2].GetString(); - muteTime = fields[5].GetUInt64(); + username = fields[0].GetString(); + security = fields[1].GetUInt8(); + email = fields[2].GetString(); + muteTime = fields[5].GetUInt64(); if (email.empty()) email = "-"; @@ -349,6 +333,25 @@ bool ChatHandler::HandlePInfoCommand(const char* args) { last_ip = fields[3].GetString(); last_login = fields[4].GetString(); + + uint32 ip = inet_addr(last_ip.c_str()); +#if TRINITY_ENDIAN == BIGENDIAN + EndianConvertReverse(ip); +#endif + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_IP2NATION_COUNTRY); + + stmt->setUInt32(0, ip); + + PreparedQueryResult result2 = WorldDatabase.Query(stmt); + + if (result2) + { + Field* fields2 = result2->Fetch(); + last_ip.append(" ("); + last_ip.append(fields2[0].GetString()); + last_ip.append(")"); + } } else { @@ -363,21 +366,23 @@ bool ChatHandler::HandlePInfoCommand(const char* args) std::string bannedby = "unknown"; std::string banreason = ""; - if (QueryResult result2 = LoginDatabase.PQuery("SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned " - "WHERE id = '%u' AND active ORDER BY bandate ASC LIMIT 1", accId)) + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS); + stmt->setUInt32(0, accId); + PreparedQueryResult result2 = LoginDatabase.Query(stmt); + if (!result2) { - Field* fields = result2->Fetch(); - banTime = fields[1].GetBool() ? 0 : fields[0].GetUInt64(); - bannedby = fields[2].GetString(); - banreason = fields[3].GetString(); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS); + stmt->setUInt32(0, GUID_LOPART(target_guid)); + result2 = CharacterDatabase.Query(stmt); } - else if (QueryResult result3 = CharacterDatabase.PQuery("SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned " - "WHERE guid = '%u' AND active ORDER BY bandate ASC LIMIT 1", GUID_LOPART(target_guid))) + + if (result2) { - Field* fields = result3->Fetch(); - banTime = fields[1].GetBool() ? 0 : fields[0].GetUInt64(); - bannedby = fields[2].GetString(); - banreason = fields[3].GetString(); + Field* fields = result2->Fetch(); + banTime = int64(fields[1].GetBool() ? 0 : fields[0].GetUInt32()); + bannedby = fields[2].GetString(); + banreason = fields[3].GetString(); } if (muteTime > 0) @@ -694,9 +699,22 @@ bool ChatHandler::HandleLookupEventCommand(const char* args) bool ChatHandler::HandleCombatStopCommand(const char* args) { - Player* target; - if (!extractPlayerTarget((char*)args, &target)) - return false; + Player* target = NULL; + + if (args && strlen(args) > 0) + { + target = sObjectAccessor->FindPlayerByName(args); + if (!target) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + } + + if (!target) + if (!extractPlayerTarget((char*)args, &target)) + return false; // check online security if (HasLowerSecurity(target, 0)) @@ -730,9 +748,9 @@ bool ChatHandler::HandleLookupPlayerIpCommand(const char* args) limit = limit_str ? atoi (limit_str) : -1; } - LoginDatabase.EscapeString(ip); - - QueryResult result = LoginDatabase.PQuery("SELECT id, username FROM account WHERE last_ip = '%s'", ip.c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_IP); + stmt->setString(0, ip); + PreparedQueryResult result = LoginDatabase.Query(stmt); return LookupPlayerSearchCommand(result, limit); } @@ -749,16 +767,15 @@ bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args) if (!AccountMgr::normalizeString (account)) return false; - LoginDatabase.EscapeString (account); - - QueryResult result = LoginDatabase.PQuery ("SELECT id, username FROM account WHERE username = '%s'", account.c_str ()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME); + stmt->setString(0, account); + PreparedQueryResult result = LoginDatabase.Query(stmt); return LookupPlayerSearchCommand (result, limit); } bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args) { - if (!*args) return false; @@ -766,14 +783,14 @@ bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args) char* limit_str = strtok (NULL, " "); int32 limit = limit_str ? atoi (limit_str) : -1; - LoginDatabase.EscapeString (email); - - QueryResult result = LoginDatabase.PQuery ("SELECT id, username FROM account WHERE email = '%s'", email.c_str ()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL); + stmt->setString(0, email); + PreparedQueryResult result = LoginDatabase.Query(stmt); - return LookupPlayerSearchCommand (result, limit); + return LookupPlayerSearchCommand(result, limit); } -bool ChatHandler::LookupPlayerSearchCommand(QueryResult result, int32 limit) +bool ChatHandler::LookupPlayerSearchCommand(PreparedQueryResult result, int32 limit) { if (!result) { @@ -797,8 +814,11 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult result, int32 limit) uint32 acc_id = fields[0].GetUInt32(); std::string acc_name = fields[1].GetString(); - QueryResult chars = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account = '%u'", acc_id); - if (chars) + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC); + stmt->setUInt32(0, acc_id); + PreparedQueryResult result2 = CharacterDatabase.Query(stmt); + + if (result2) { PSendSysMessage(LANG_LOOKUP_PLAYER_ACCOUNT, acc_name.c_str(), acc_id); @@ -807,14 +827,14 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult result, int32 limit) do { - Field* charfields = chars->Fetch(); + Field* charfields = result2->Fetch(); guid = charfields[0].GetUInt64(); name = charfields[1].GetString(); PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER, name.c_str(), guid); ++i; - } while (chars->NextRow() && (limit == -1 || i < limit)); + } while (result2->NextRow() && (limit == -1 || i < limit)); } } while (result->NextRow()); diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 1cb07fca4a8..2ae7e73b828 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -87,11 +87,10 @@ bool ChatHandler::HandleSetSkillCommand(const char *args) return false; char *level_p = strtok (NULL, " "); - if (!level_p) return false; - char *max_p = strtok (NULL, " "); + char *max_p = strtok (NULL, " "); int32 skill = atoi(skill_p); if (skill <= 0) @@ -101,7 +100,7 @@ bool ChatHandler::HandleSetSkillCommand(const char *args) return false; } - int32 level = atol (level_p); + int32 level = atol(level_p); Player* target = getSelectedPlayer(); if (!target) @@ -128,7 +127,7 @@ bool ChatHandler::HandleSetSkillCommand(const char *args) return false; } - int32 max = max_p ? atol (max_p) : target->GetPureMaxSkillValue(skill); + int32 max = max_p ? atol (max_p) : target->GetPureMaxSkillValue(skill); if (level <= 0 || level > max || max <= 0) return false; @@ -226,7 +225,11 @@ bool ChatHandler::HandleAddItemCommand(const char *args) { std::string itemName = citemName+1; WorldDatabase.EscapeString(itemName); - QueryResult result = WorldDatabase.PQuery("SELECT entry FROM item_template WHERE name = '%s'", itemName.c_str()); + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME); + stmt->setString(0, itemName); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) { PSendSysMessage(LANG_COMMAND_COULDNOTFIND, citemName+1); @@ -414,22 +417,22 @@ bool ChatHandler::HandleListItemCommand(const char *args) return false; uint32 count = uint32(_count); - QueryResult result; + PreparedQueryResult result; // inventory case uint32 inv_count = 0; - result = CharacterDatabase.PQuery("SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = '%u'", item_id); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM); + stmt->setUInt32(0, item_id); + result = CharacterDatabase.Query(stmt); + if (result) - inv_count = (*result)[0].GetUInt32(); + inv_count = (*result)[0].GetUInt64(); - result=CharacterDatabase.PQuery( - // 0 1 2 3 4 5 - "SELECT ci.item, cb.slot AS bag, ci.slot, ci.guid, c.account, c.name FROM characters c " - "INNER JOIN character_inventory ci ON ci.guid = c.guid " - "INNER JOIN item_instance ii ON ii.guid = ci.item " - "LEFT JOIN character_inventory cb ON cb.item = ci.bag " - "WHERE ii.itemEntry = '%u' LIMIT %u ", - item_id, count); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY); + stmt->setUInt32(0, item_id); + stmt->setUInt32(1, count); + result = CharacterDatabase.Query(stmt); if (result) { @@ -438,7 +441,7 @@ bool ChatHandler::HandleListItemCommand(const char *args) Field* fields = result->Fetch(); uint32 item_guid = fields[0].GetUInt32(); uint32 item_bag = fields[1].GetUInt32(); - uint32 item_slot = fields[2].GetUInt32(); + uint8 item_slot = fields[2].GetUInt8(); uint32 owner_guid = fields[3].GetUInt32(); uint32 owner_acc = fields[4].GetUInt32(); std::string owner_name = fields[5].GetString(); @@ -467,24 +470,23 @@ bool ChatHandler::HandleListItemCommand(const char *args) // mail case uint32 mail_count = 0; - result = CharacterDatabase.PQuery("SELECT COUNT(itemEntry) FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid WHERE itemEntry = '%u'", item_id); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_COUNT_ITEM); + stmt->setUInt32(0, item_id); + result = CharacterDatabase.Query(stmt); + if (result) - mail_count = (*result)[0].GetUInt32(); + mail_count = (*result)[0].GetUInt64(); if (count > 0) { - result = CharacterDatabase.PQuery( - // 0 1 2 3 4 5 6 - "SELECT mi.item_guid, m.sender, m.receiver, cs.account, cs.name, cr.account, cr.name FROM mail m " - "INNER JOIN mail_items mi ON mi.mail_id = m.id " - "INNER JOIN item_instance ii ON ii.guid = mi.item_guid " - "INNER JOIN characters cs ON cs.guid = m.sender " - "INNER JOIN characters cr ON cr.guid = m.receiver " - "WHERE ii.itemEntry = '%u' LIMIT %u", - item_id, count); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_ITEMS_BY_ENTRY); + stmt->setUInt32(0, item_id); + stmt->setUInt32(1, count); + result = CharacterDatabase.Query(stmt); } else - result = QueryResult(NULL); + result = PreparedQueryResult(NULL); if (result) { @@ -515,21 +517,23 @@ bool ChatHandler::HandleListItemCommand(const char *args) // auction case uint32 auc_count = 0; - result=CharacterDatabase.PQuery("SELECT COUNT(itemEntry) FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE itemEntry = '%u'", item_id); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM); + stmt->setUInt32(0, item_id); + result = CharacterDatabase.Query(stmt); + if (result) - auc_count = (*result)[0].GetUInt32(); + auc_count = (*result)[0].GetUInt64(); if (count > 0) { - result = CharacterDatabase.PQuery( - // 0 1 2 3 - "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah " - "INNER JOIN characters c ON c.guid = ah.itemowner " - "INNER JOIN item_instance ii ON ii.guid = ah.itemguid " - "WHERE ii.itemEntry = '%u' LIMIT %u", item_id, count); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY); + stmt->setUInt32(0, item_id); + stmt->setUInt32(1, count); + result = CharacterDatabase.Query(stmt); } else - result = QueryResult(NULL); + result = PreparedQueryResult(NULL); if (result) { @@ -550,17 +554,18 @@ bool ChatHandler::HandleListItemCommand(const char *args) // guild bank case uint32 guild_count = 0; - result = CharacterDatabase.PQuery("SELECT COUNT(itemEntry) FROM guild_bank_item gbi INNER JOIN item_instance ii ON ii.guid = gbi.item_guid WHERE itemEntry = '%u'", item_id); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_COUNT_ITEM); + stmt->setUInt32(0, item_id); + result = CharacterDatabase.Query(stmt); + if (result) - guild_count = (*result)[0].GetUInt32(); + guild_count = (*result)[0].GetUInt64(); - result = CharacterDatabase.PQuery( - // 0 1 2 - "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi " - "INNER JOIN guild g ON g.guildid = gi.guildid " - "INNER JOIN item_instance ii ON ii.guid = gi.item_guid " - "WHERE ii.itemEntry = '%u' LIMIT %u ", - item_id, count); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY); + stmt->setUInt32(0, item_id); + stmt->setUInt32(1, count); + result = CharacterDatabase.Query(stmt); if (result) { @@ -631,9 +636,9 @@ bool ChatHandler::HandleListObjectCommand(const char *args) QueryResult result; uint32 obj_count = 0; - result=WorldDatabase.PQuery("SELECT COUNT(guid) FROM gameobject WHERE id='%u'", go_id); + result = WorldDatabase.PQuery("SELECT COUNT(guid) FROM gameobject WHERE id='%u'", go_id); if (result) - obj_count = (*result)[0].GetUInt32(); + obj_count = (*result)[0].GetUInt64(); if (m_session) { @@ -703,9 +708,9 @@ bool ChatHandler::HandleListCreatureCommand(const char *args) QueryResult result; uint32 cr_count = 0; - result=WorldDatabase.PQuery("SELECT COUNT(guid) FROM creature WHERE id='%u'", cr_id); + result = WorldDatabase.PQuery("SELECT COUNT(guid) FROM creature WHERE id='%u'", cr_id); if (result) - cr_count = (*result)[0].GetUInt32(); + cr_count = (*result)[0].GetUInt64(); if (m_session) { @@ -1234,7 +1239,7 @@ bool ChatHandler::HandleLookupCreatureCommand(const char *args) uint8 localeIndex = GetSessionDbLocaleIndex(); if (CreatureLocale const* cl = sObjectMgr->GetCreatureLocale(id)) { - if (cl->Name.size() > localeIndex && !cl->Name[localeIndex].empty ()) + if (cl->Name.size() > localeIndex && !cl->Name[localeIndex].empty()) { std::string name = cl->Name[localeIndex]; @@ -1247,9 +1252,9 @@ bool ChatHandler::HandleLookupCreatureCommand(const char *args) } if (m_session) - PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ()); + PSendSysMessage(LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str()); else - PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ()); + PSendSysMessage(LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str()); if (!found) found = true; @@ -1260,7 +1265,7 @@ bool ChatHandler::HandleLookupCreatureCommand(const char *args) } std::string name = itr->second.Name; - if (name.empty ()) + if (name.empty()) continue; if (Utf8FitTo(name, wnamepart)) @@ -1272,9 +1277,9 @@ bool ChatHandler::HandleLookupCreatureCommand(const char *args) } if (m_session) - PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ()); + PSendSysMessage(LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str()); else - PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ()); + PSendSysMessage(LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str()); if (!found) found = true; @@ -1282,7 +1287,7 @@ bool ChatHandler::HandleLookupCreatureCommand(const char *args) } if (!found) - SendSysMessage (LANG_COMMAND_NOCREATUREFOUND); + SendSysMessage(LANG_COMMAND_NOCREATUREFOUND); return true; } @@ -1370,7 +1375,7 @@ bool ChatHandler::HandleLookupFactionCommand(const char *args) return false; // Can be NULL at console call - Player* target = getSelectedPlayer (); + Player* target = getSelectedPlayer(); std::string namepart = args; std::wstring wnamepart; @@ -1522,10 +1527,10 @@ bool ChatHandler::HandleLookupTaxiNodeCommand(const char * args) // send taxinode in "id - [name] (Map:m X:x Y:y Z:z)" format if (m_session) - PSendSysMessage (LANG_TAXINODE_ENTRY_LIST_CHAT, id, id, name.c_str(), localeNames[loc], + PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CHAT, id, id, name.c_str(), localeNames[loc], nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); else - PSendSysMessage (LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), localeNames[loc], + PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), localeNames[loc], nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); if (!found) @@ -1674,16 +1679,16 @@ bool ChatHandler::HandleGuildCreateCommand(const char *args) if (target->GetGuildId()) { - SendSysMessage (LANG_PLAYER_IN_GUILD); + SendSysMessage(LANG_PLAYER_IN_GUILD); return true; } Guild* guild = new Guild; - if (!guild->Create (target, guildname)) + if (!guild->Create(target, guildname)) { delete guild; - SendSysMessage (LANG_GUILD_NOT_CREATED); - SetSentErrorMessage (true); + SendSysMessage(LANG_GUILD_NOT_CREATED); + SetSentErrorMessage(true); return false; } @@ -1710,7 +1715,7 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args) return false; std::string glName = guildStr; - Guild* targetGuild = sGuildMgr->GetGuildByName (glName); + Guild* targetGuild = sGuildMgr->GetGuildByName(glName); if (!targetGuild) return false; @@ -1726,11 +1731,10 @@ bool ChatHandler::HandleGuildUninviteCommand(const char *args) return false; uint32 glId = target ? target->GetGuildId() : Player::GetGuildIdFromGuid(target_guid); - if (!glId) return false; - Guild* targetGuild = sGuildMgr->GetGuildById (glId); + Guild* targetGuild = sGuildMgr->GetGuildById(glId); if (!targetGuild) return false; @@ -1775,11 +1779,11 @@ bool ChatHandler::HandleGuildDeleteCommand(const char *args) std::string gld = guildStr; - Guild* targetGuild = sGuildMgr->GetGuildByName (gld); + Guild* targetGuild = sGuildMgr->GetGuildByName(gld); if (!targetGuild) return false; - targetGuild->Disband (); + targetGuild->Disband(); return true; } @@ -1885,7 +1889,7 @@ bool ChatHandler::HandleDamageCommand(const char * args) { m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); if (target != m_session->GetPlayer()) - m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_NORMALSWING2, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0); + m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0); return true; } @@ -1915,7 +1919,7 @@ bool ChatHandler::HandleDamageCommand(const char * args) m_session->GetPlayer()->DealDamageMods(target, damage, &absorb); m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false); - m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_NORMALSWING2, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); + m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); return true; } @@ -2020,7 +2024,7 @@ bool ChatHandler::HandleLinkGraveCommand(const char *args) else return false; - WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id); + WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id); if (!graveyard) { @@ -2143,40 +2147,17 @@ bool ChatHandler::HandleExploreCheatCommand(const char *args) ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING, GetNameLink().c_str()); } - for (uint8 i=0; iGetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0xFFFFFFFF); - } else - { m_session->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0); - } } return true; } -bool ChatHandler::HandleHoverCommand(const char *args) -{ - char* px = strtok((char*)args, " "); - uint32 flag; - if (!px) - flag = 1; - else - flag = atoi(px); - - m_session->GetPlayer()->SetHover(flag); - - if (flag) - SendSysMessage(LANG_HOVER_ENABLED); - else - SendSysMessage(LANG_HOVER_DISABLED); - - return true; -} - void ChatHandler::HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel) { if (player) @@ -2434,7 +2415,9 @@ bool ChatHandler::HandleListAurasCommand (const char * /*args*/) for (uint16 i = 0; i < TOTAL_AURAS; ++i) { Unit::AuraEffectList const& uAuraList = unit->GetAuraEffectsByType(AuraType(i)); - if (uAuraList.empty()) continue; + if (uAuraList.empty()) + continue; + PSendSysMessage(LANG_COMMAND_TARGET_LISTAURATYPE, uAuraList.size(), i); for (Unit::AuraEffectList::const_iterator itr = uAuraList.begin(); itr != uAuraList.end(); ++itr) { @@ -2737,7 +2720,7 @@ bool ChatHandler::HandleServerShutDownCommand(const char *args) if (exitcode < 0 || exitcode > 125) return false; - sWorld->ShutdownServ (time, 0, exitcode); + sWorld->ShutdownServ(time, 0, exitcode); } else sWorld->ShutdownServ(time, 0, SHUTDOWN_EXIT_CODE); @@ -2772,7 +2755,7 @@ bool ChatHandler::HandleServerRestartCommand(const char *args) if (exitcode < 0 || exitcode > 125) return false; - sWorld->ShutdownServ (time, SHUTDOWN_MASK_RESTART, exitcode); + sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, exitcode); } else sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE); @@ -2807,7 +2790,7 @@ bool ChatHandler::HandleServerIdleRestartCommand(const char *args) if (exitcode < 0 || exitcode > 125) return false; - sWorld->ShutdownServ (time, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, exitcode); + sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, exitcode); } else sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, RESTART_EXIT_CODE); @@ -2842,7 +2825,7 @@ bool ChatHandler::HandleServerIdleShutDownCommand(const char *args) if (exitcode < 0 || exitcode > 125) return false; - sWorld->ShutdownServ (time, SHUTDOWN_MASK_IDLE, exitcode); + sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, exitcode); } else sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE); @@ -3221,7 +3204,7 @@ bool ChatHandler::HandleBanListCharacterCommand(const char *args) std::string filter(cFilter); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_BY_NAME_FILTER); - stmt->setString(0, filter.c_str()); + stmt->setString(0, filter); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) { @@ -3298,25 +3281,27 @@ bool ChatHandler::HandleBanListCharacterCommand(const char *args) bool ChatHandler::HandleBanListAccountCommand(const char *args) { - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_OLD_BANS); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS); LoginDatabase.Execute(stmt); char* cFilter = strtok((char*)args, " "); std::string filter = cFilter ? cFilter : ""; - LoginDatabase.EscapeString(filter); - QueryResult result; + PreparedQueryResult result; if (filter.empty()) { - result = LoginDatabase.Query("SELECT account.id, username FROM account, account_banned" - " WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id"); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_ALL); + + result = LoginDatabase.Query(stmt); } else { - result = LoginDatabase.PQuery("SELECT account.id, username FROM account, account_banned" - " WHERE account.id = account_banned.id AND active = 1 AND username "_LIKE_" "_CONCAT3_("'%%'", "'%s'", "'%%'")" GROUP BY account.id", - filter.c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME); + + stmt->setString(0, filter); + + result = LoginDatabase.Query(stmt); } if (!result) @@ -3328,7 +3313,7 @@ bool ChatHandler::HandleBanListAccountCommand(const char *args) return HandleBanListHelper(result); } -bool ChatHandler::HandleBanListHelper(QueryResult result) +bool ChatHandler::HandleBanListHelper(PreparedQueryResult result) { PSendSysMessage(LANG_BANLIST_MATCHINGACCOUNT); @@ -3358,7 +3343,7 @@ bool ChatHandler::HandleBanListHelper(QueryResult result) { SendSysMessage("-------------------------------------------------------------------------------"); Field* fields = result->Fetch(); - uint32 account_id = fields[0].GetUInt32 (); + uint32 account_id = fields[0].GetUInt32(); std::string account_name; @@ -3404,26 +3389,28 @@ bool ChatHandler::HandleBanListHelper(QueryResult result) bool ChatHandler::HandleBanListIPCommand(const char *args) { - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_OLD_IP_BANS); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS); LoginDatabase.Execute(stmt); char* cFilter = strtok((char*)args, " "); std::string filter = cFilter ? cFilter : ""; LoginDatabase.EscapeString(filter); - QueryResult result; + PreparedQueryResult result; if (filter.empty()) { - result = LoginDatabase.Query ("SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned" - " WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP())" - " ORDER BY unbandate"); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_BANNED_ALL); + + result = LoginDatabase.Query(stmt); } else { - result = LoginDatabase.PQuery("SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned" - " WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) AND ip "_LIKE_" "_CONCAT3_("'%%'", "'%s'", "'%%'") - " ORDER BY unbandate", filter.c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_BANNED_BY_IP); + + stmt->setString(0, filter); + + result = LoginDatabase.Query(stmt); } if (!result) @@ -4455,7 +4442,7 @@ bool ChatHandler::HandleChannelSetOwnership(const char *args) if (!*args) return false; char *channel = strtok((char*)args, " "); - char *argstr = strtok(NULL, ""); + char *argstr = strtok(NULL, ""); if (!channel || !argstr) return false; @@ -4492,10 +4479,6 @@ bool ChatHandler::HandleChannelSetOwnership(const char *args) return true; } -/*------------------------------------------ - *-------------TRINITY---------------------- - *-------------------------------------*/ - bool ChatHandler::HandlePlayAllCommand(const char *args) { if (!*args) @@ -4589,53 +4572,58 @@ bool ChatHandler::HandleUnFreezeCommand(const char *args) { std::string name; Player* player; - char *TargetName = strtok((char*)args, " "); //get entered name - if (!TargetName) //if no name entered use target - { - player = getSelectedPlayer(); - if (player) //prevent crash with creature as target - name = player->GetName(); - } + char* targetName = strtok((char*)args, " "); // Get entered name - else // if name entered + if (targetName) { - name = TargetName; + name = targetName; normalizePlayerName(name); player = sObjectAccessor->FindPlayerByName(name.c_str()); } + else // If no name was entered - use target + { + player = getSelectedPlayer(); + if (player) + name = player->GetName(); + } - //effect if (player) { PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); - //Reset player faction + allow combat + allow duels + // Reset player faction + allow combat + allow duels player->setFactionForRace(player->getRace()); player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - //allow movement and spells + // Remove Freeze spell (allowing movement and spells) player->RemoveAurasDueToSpell(9454); - //save player + // Save player player->SaveToDB(); } - - if (!player) + else { - if (TargetName) + if (targetName) { - //check for offline players - QueryResult result = CharacterDatabase.PQuery("SELECT characters.guid FROM characters WHERE characters.name = '%s'", name.c_str()); + // Check for offline players + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_GUID_BY_NAME); + stmt->setString(0, name); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) { SendSysMessage(LANG_COMMAND_FREEZE_WRONG); return true; } - //if player found: delete his freeze aura - Field* fields=result->Fetch(); - uint64 pguid = fields[0].GetUInt64(); - CharacterDatabase.PQuery("DELETE FROM character_aura WHERE character_aura.spell = 9454 AND character_aura.guid = '%u'", pguid); + // If player found: delete his freeze aura + Field* fields = result->Fetch(); + uint32 lowGuid = fields[0].GetUInt32(); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN); + stmt->setUInt32(0, lowGuid); + CharacterDatabase.Execute(stmt); + PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); return true; } @@ -4651,8 +4639,11 @@ bool ChatHandler::HandleUnFreezeCommand(const char *args) bool ChatHandler::HandleListFreezeCommand(const char * /*args*/) { - //Get names from DB - QueryResult result = CharacterDatabase.Query("SELECT characters.name FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454"); + // Get names from DB + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AURA_FROZEN); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) { SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS); @@ -4750,9 +4741,11 @@ bool ChatHandler::HandleBindSightCommand(const char * /*args*/) bool ChatHandler::HandleUnbindSightCommand(const char * /*args*/) { - if (m_session->GetPlayer()->isPossessing()) + Player* player = m_session->GetPlayer(); + + if (player->isPossessing()) return false; - m_session->GetPlayer()->StopCastingBindSight(); + player->StopCastingBindSight(); return true; } diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index d82e43ba83b..9737d4584ea 100755 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -75,7 +75,7 @@ bool ThreatCalcHelper::isValidProcess(Unit* hatedUnit, Unit* hatingUnit, SpellIn return false; // not in same map or phase - if (!hatedUnit->IsInMap(hatingUnit)) + if (!hatedUnit->IsInMap(hatingUnit) || !hatedUnit->InSamePhase(hatingUnit)) return false; // spell not causing threat @@ -182,6 +182,7 @@ void HostileReference::updateOnlineStatus() && (getTarget()->GetTypeId() != TYPEID_PLAYER || !getTarget()->ToPlayer()->isGameMaster()) && !getTarget()->HasUnitState(UNIT_STATE_IN_FLIGHT) && getTarget()->IsInMap(getSourceUnit()) + && getTarget()->InSamePhase(getSourceUnit()) ) { Creature* creature = getSourceUnit()->ToCreature(); @@ -534,6 +535,7 @@ void ThreatManager::processThreatEvent(ThreatRefStatusChangeEvent* threatRefStat setCurrentVictim(NULL); setDirty(true); } + iOwner->SendRemoveFromThreatListOpcode(hostilRef); iThreatContainer.remove(hostilRef); iThreatOfflineContainer.addReference(hostilRef); } diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index ce1f6de2ab0..e5badcd24ce 100755 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -242,7 +242,7 @@ class ThreatManager // methods to access the lists from the outside to do some dirty manipulation (scriping and such) // I hope they are used as little as possible. std::list& getThreatList() { return iThreatContainer.getThreatList(); } - std::list& getOfflieThreatList() { return iThreatOfflineContainer.getThreatList(); } + std::list& getOfflineThreatList() { return iThreatOfflineContainer.getThreatList(); } ThreatContainer& getOnlineContainer() { return iThreatContainer; } ThreatContainer& getOfflineContainer() { return iThreatOfflineContainer; } private: diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 7d21f94f372..4176d9f605b 100755 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -114,7 +114,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) case CONDITION_QUESTREWARDED: { if (Player* player = object->ToPlayer()) - condMeets = (player->GetQuestRewardStatus(ConditionValue1) == !ConditionValue2); + condMeets = player->GetQuestRewardStatus(ConditionValue1); break; } case CONDITION_QUESTTAKEN: @@ -122,7 +122,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) if (Player* player = object->ToPlayer()) { QuestStatus status = player->GetQuestStatus(ConditionValue1); - condMeets = ((status == QUEST_STATUS_INCOMPLETE) == !ConditionValue2); + condMeets = (status == QUEST_STATUS_INCOMPLETE); } break; } @@ -131,7 +131,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) if (Player* player = object->ToPlayer()) { QuestStatus status = player->GetQuestStatus(ConditionValue1); - condMeets = ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(ConditionValue1)) == !ConditionValue2); + condMeets = (status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(ConditionValue1)); } break; } @@ -140,7 +140,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) if (Player* player = object->ToPlayer()) { QuestStatus status = player->GetQuestStatus(ConditionValue1); - condMeets = ((status == QUEST_STATUS_NONE) == !ConditionValue2); + condMeets = (status == QUEST_STATUS_NONE); } break; } @@ -190,7 +190,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) } case CONDITION_OBJECT_ENTRY: { - if (object->GetTypeId() == ConditionValue1) + if (uint32(object->GetTypeId()) == ConditionValue1) condMeets = (!ConditionValue2) || (object->GetEntry() == ConditionValue2); break; } @@ -274,6 +274,12 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) condMeets = object->GetPhaseMask() & ConditionValue1; break; } + case CONDITION_TITLE: + { + if (Player* player = object->ToPlayer()) + condMeets = player->HasTitle(ConditionValue1); + break; + } default: condMeets = false; break; @@ -422,6 +428,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() case CONDITION_PHASEMASK: mask |= GRID_MAP_TYPE_MASK_ALL; break; + case CONDITION_TITLE: + mask |= GRID_MAP_TYPE_MASK_PLAYER; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -515,7 +524,9 @@ bool ConditionMgr::IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo, sLog->outDebug(LOG_FILTER_CONDITIONSYS, "ConditionMgr::IsPlayerMeetToConditionList condType: %u val1: %u", (*i)->ConditionType, (*i)->ConditionValue1); if ((*i)->isLoaded()) { + //! Find ElseGroup in ElseGroupStore std::map::const_iterator itr = ElseGroupStore.find((*i)->ElseGroup); + //! If not found, add an entry in the store and set to true (placeholder) if (itr == ElseGroupStore.end()) ElseGroupStore[(*i)->ElseGroup] = true; else if (!(*itr).second) @@ -717,8 +728,8 @@ void ConditionMgr::LoadConditions(bool isReload) Condition* cond = new Condition(); int32 iSourceTypeOrReferenceId = fields[0].GetInt32(); cond->SourceGroup = fields[1].GetUInt32(); - cond->SourceEntry = fields[2].GetInt32(); - cond->SourceId = fields[3].GetUInt32(); + cond->SourceEntry = fields[2].GetUInt32(); + cond->SourceId = fields[3].GetInt32(); cond->ElseGroup = fields[4].GetUInt32(); int32 iConditionTypeOrReference = fields[5].GetInt32(); cond->ConditionTarget = fields[6].GetUInt8(); @@ -854,18 +865,6 @@ void ConditionMgr::LoadConditions(bool isReload) break; case CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT: { - //if no list for npc create one - if (SpellClickEventConditionStore.find(cond->SourceGroup) == SpellClickEventConditionStore.end()) - { - ConditionTypeContainer cmap; - SpellClickEventConditionStore[cond->SourceGroup] = cmap; - } - //if no list for spellclick spell create one - if (SpellClickEventConditionStore[cond->SourceGroup].find(cond->SourceEntry) == SpellClickEventConditionStore[cond->SourceGroup].end()) - { - ConditionList clist; - SpellClickEventConditionStore[cond->SourceGroup][cond->SourceEntry] = clist; - } SpellClickEventConditionStore[cond->SourceGroup][cond->SourceEntry].push_back(cond); valid = true; ++count; @@ -877,18 +876,6 @@ void ConditionMgr::LoadConditions(bool isReload) break; case CONDITION_SOURCE_TYPE_VEHICLE_SPELL: { - //if no list for vehicle create one - if (VehicleSpellConditionStore.find(cond->SourceGroup) == VehicleSpellConditionStore.end()) - { - ConditionTypeContainer cmap; - VehicleSpellConditionStore[cond->SourceGroup] = cmap; - } - //if no list for vehicle's spell create one - if (VehicleSpellConditionStore[cond->SourceGroup].find(cond->SourceEntry) == VehicleSpellConditionStore[cond->SourceGroup].end()) - { - ConditionList clist; - VehicleSpellConditionStore[cond->SourceGroup][cond->SourceEntry] = clist; - } VehicleSpellConditionStore[cond->SourceGroup][cond->SourceEntry].push_back(cond); valid = true; ++count; @@ -896,18 +883,8 @@ void ConditionMgr::LoadConditions(bool isReload) } case CONDITION_SOURCE_TYPE_SMART_EVENT: { - // If the entry does not exist, create a new list + //! TODO: PAIR_32 ? std::pair key = std::make_pair(cond->SourceEntry, cond->SourceId); - if (SmartEventConditionStore.find(key) == SmartEventConditionStore.end()) - { - ConditionTypeContainer cmap; - SmartEventConditionStore[key] = cmap; - } - if (SmartEventConditionStore[key].find(cond->SourceGroup) == SmartEventConditionStore[key].end()) - { - ConditionList clist; - SmartEventConditionStore[key][cond->SourceGroup] = clist; - } SmartEventConditionStore[key][cond->SourceGroup].push_back(cond); valid = true; ++count; @@ -1326,7 +1303,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) default: break; } - + switch (spellInfo->Effects[i].TargetB.GetSelectionCategory()) { case TARGET_SELECT_CATEGORY_NEARBY: @@ -1577,7 +1554,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) } case CONDITION_ACHIEVEMENT: { - AchievementEntry const* achievement = GetAchievementStore()->LookupEntry(cond->ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1); if (!achievement) { sLog->outErrorDb("Achivement condition has non existing achivement id (%u), skipped", cond->ConditionValue1); @@ -1858,9 +1835,16 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("Phasemask condition has useless data in value3 (%u)!", cond->ConditionValue3); break; } - case CONDITION_UNUSED_18: - sLog->outErrorDb("Found ConditionTypeOrReference = CONDITION_UNUSED_18 in `conditions` table - ignoring"); - return false; + case CONDITION_TITLE: + { + CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(cond->ConditionValue1); + if (!titleEntry) + { + sLog->outErrorDb("Title condition has non existing title in value1 (%u), skipped", cond->ConditionValue1); + return false; + } + break; + } case CONDITION_UNUSED_19: sLog->outErrorDb("Found ConditionTypeOrReference = CONDITION_UNUSED_19 in `conditions` table - ignoring"); return false; @@ -1929,6 +1913,19 @@ void ConditionMgr::Clean() SmartEventConditionStore.clear(); + for (CreatureSpellConditionContainer::iterator itr = SpellClickEventConditionStore.begin(); itr != SpellClickEventConditionStore.end(); ++itr) + { + for (ConditionTypeContainer::iterator it = itr->second.begin(); it != itr->second.end(); ++it) + { + for (ConditionList::const_iterator i = it->second.begin(); i != it->second.end(); ++i) + delete *i; + it->second.clear(); + } + itr->second.clear(); + } + + SpellClickEventConditionStore.clear(); + // this is a BIG hack, feel free to fix it if you can figure out the ConditionMgr ;) for (std::list::const_iterator itr = AllocatedMemoryStore.begin(); itr != AllocatedMemoryStore.end(); ++itr) delete *itr; diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 5a5e2dd1c2e..130a23a0cb0 100755 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -48,7 +48,7 @@ enum ConditionTypes CONDITION_CLASS = 15, // class 0 0 true if player's class is equal to class CONDITION_RACE = 16, // race 0 0 true if player's race is equal to race CONDITION_ACHIEVEMENT = 17, // achievement_id 0 0 true if achievement is complete - CONDITION_UNUSED_18 = 18, // + CONDITION_TITLE = 18, // title id 0 0 true if player has title CONDITION_UNUSED_19 = 19, // CONDITION_UNUSED_20 = 20, // CONDITION_UNUSED_21 = 21, // @@ -72,6 +72,33 @@ enum ConditionTypes CONDITION_MAX = 39 // MAX }; +/*! Documentation on implementing a new ConditionSourceType: + Step 1: Check for the lowest free ID. Look for CONDITION_SOURCE_TYPE_UNUSED_XX in the enum. + Then define the new source type. + + Step 2: Determine and map the parameters for the new condition type. + + Step 3: Add a case block to ConditionMgr::isSourceTypeValid with the new condition type + and validate the parameters. + + Step 4: If your condition can be grouped (determined in step 2), add a rule for it in + ConditionMgr::CanHaveSourceGroupSet, following the example of the existing types. + + Step 5: Define the maximum available condition targets in ConditionMgr::GetMaxAvailableConditionTargets. + + The following steps only apply if your condition can be grouped: + + Step 6: Determine how you are going to store your conditions. You need to add a new storage container + for it in ConditionMgr class, along with a function like: + ConditionList GetConditionsForXXXYourNewSourceTypeXXX(parameters...) + + The above function should be placed in upper level (practical) code that actually + checks the conditions. + + Step 7: Implement loading for your source type in ConditionMgr::LoadConditions. + + Step 8: Implement memory cleaning for your source type in ConditionMgr::Clean. +*/ enum ConditionSourceType { CONDITION_SOURCE_TYPE_NONE = 0, diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 8055641f3a4..dcd189a05cb 100755 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -343,7 +343,7 @@ enum AreaFlags AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?) AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag) AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled) - AREA_FLAG_NEED_FLY = 0x00001000, // Unknown + AREA_FLAG_NEED_FLY = 0x00001000, // Respawn alive at the graveyard without corpse AREA_FLAG_UNUSED1 = 0x00002000, // Unused in 3.3.5a AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag) AREA_FLAG_OUTDOOR_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area) @@ -358,7 +358,7 @@ enum AreaFlags AREA_FLAG_WINTERGRASP = 0x01000000, // Wintergrasp and it's subzones AREA_FLAG_INSIDE = 0x02000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors AREA_FLAG_OUTSIDE = 0x04000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors - AREA_FLAG_WINTERGRASP_2 = 0x08000000, // Same as AREA_FLAG_WINTERGRASP except for The Sunken Ring and Western Bridge. + AREA_FLAG_WINTERGRASP_2 = 0x08000000, // Can Hearth And Resurrect From Area AREA_FLAG_NO_FLY_ZONE = 0x20000000, // Marks zones where you cannot fly AREA_FLAG_UNK9 = 0x40000000, }; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 6dbd1d847db..e8087753efd 100755 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -129,7 +129,7 @@ DBCStorage sItemRandomSuffixStore(ItemRandomSuffixfmt); DBCStorage sItemSetStore(ItemSetEntryfmt); DBCStorage sLFGDungeonStore(LFGDungeonEntryfmt); -//DBCStorage sLiquidTypeStore(LiquidTypeEntryfmt); +DBCStorage sLiquidTypeStore(LiquidTypefmt); DBCStorage sLockStore(LockEntryfmt); DBCStorage sMailTemplateStore(MailTemplateEntryfmt); @@ -411,6 +411,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sItemDisenchantLootStore, dbcPath, "ItemDisenchantLoot.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sLFGDungeonStore, dbcPath, "LFGDungeons.dbc");//14545 + LoadDBC(availableDbcLocales, bad_dbc_files, sLiquidTypeStore, dbcPath, "LiquidType.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sLockStore, dbcPath, "Lock.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sPhaseStores, dbcPath, "Phase.dbc");//14545 @@ -567,7 +568,9 @@ void LoadDBCStores(const std::string& dataPath) for (unsigned int i = 0; i < sTalentStore.GetNumRows(); ++i) { TalentEntry const* talentInfo = sTalentStore.LookupEntry(i); - if (!talentInfo) continue; + if (!talentInfo) + continue; + for (int j = 0; j < MAX_TALENT_RANK; j++) if (talentInfo->RankID[j]) sTalentSpellPosMap[talentInfo->RankID[j]] = TalentSpellPos(i, j); @@ -632,7 +635,7 @@ void LoadDBCStores(const std::string& dataPath) // include existed nodes that have at least single not spell base (scripted) path { std::set spellPaths; - for (uint32 i = 1; i < sSpellStore.GetNumRows (); ++i) + for (uint32 i = 1; i < sSpellStore.GetNumRows(); ++i) if (SpellEffectEntry const* sInfo = sSpellEffectStore.LookupEntry (i)) if (sInfo->Effect == SPELL_EFFECT_SEND_TAXI) spellPaths.insert(sInfo->EffectMiscValue); @@ -1156,10 +1159,10 @@ uint32 ScalingStatValuesEntry::GetDPSAndDamageMultiplier(uint32 subClass, bool i } // script support functions - DBCStorage const* GetSoundEntriesStore() { return &sSoundEntriesStore; } - DBCStorage const* GetSpellRangeStore() { return &sSpellRangeStore; } - DBCStorage const* GetFactionStore() { return &sFactionStore; } - DBCStorage const* GetCreatureDisplayStore() { return &sCreatureDisplayInfoStore; } - DBCStorage const* GetEmotesStore() { return &sEmotesStore; } - DBCStorage const* GetEmotesTextStore() { return &sEmotesTextStore; } - DBCStorage const* GetAchievementStore() { return &sAchievementStore; } +DBCStorage const* GetSoundEntriesStore() { return &sSoundEntriesStore; } +DBCStorage const* GetSpellRangeStore() { return &sSpellRangeStore; } +DBCStorage const* GetFactionStore() { return &sFactionStore; } +DBCStorage const* GetCreatureDisplayStore() { return &sCreatureDisplayInfoStore; } +DBCStorage const* GetEmotesStore() { return &sEmotesStore; } +DBCStorage const* GetEmotesTextStore() { return &sEmotesTextStore; } +DBCStorage const* GetAchievementStore() { return &sAchievementStore; } diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index f77f6195aea..d04dc4ff131 100755 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -138,6 +138,7 @@ extern DBCStorage sItemRandomPropertiesStore; extern DBCStorage sItemRandomSuffixStore; extern DBCStorage sItemSetStore; extern DBCStorage sLFGDungeonStore; +extern DBCStorage sLiquidTypeStore; extern DBCStorage sLockStore; extern DBCStorage sMailTemplateStore; extern DBCStorage sMapStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index cc25a8f5495..f0b462e827c 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -543,9 +543,7 @@ struct AreaTableEntry //uint32 unk8; // 8, //uint32 unk9; // 9, int32 area_level; // 10 - char* area_name; // 11 uint32 team; // 12 - //uint32 unk13; // 13, //uint32 unk14; // 14, All zeros (4.2.2) //uint32 unk15; // 15, //uint32 unk16; // 16, Only Naxxramas has value (21) @@ -1288,27 +1286,29 @@ struct LFGDungeonEntry uint32 Entry() const { return ID + (type << 24); } }; -/* + struct LiquidTypeEntry { - uint32 ID; // 0 - char* name; // 1 - uint32 flags; // 2 Water: 1|2|4|8, Magma: 8|16|32|64, Slime: 2|64|256, WMO Ocean: 1|2|4|8|512 - uint32 type; // 3 0: Water, 1: Ocean, 2: Magma, 3: Slime - uint32 soundid; // 4 Reference to SoundEntries.dbc - uint32 spellID; // 5 Reference to Spell.dbc - float unk0[4]; // 6-9 - uint32 unk1; // 10 Light? - float particleScale // 11 0: Slime, 1: Water/Ocean, 4: Magma - uint32 particleMovement; // 12 - uint32 unk2 // 13 - uint32 LiquidMaterialID // 14 Reference to LiquidMaterial.dbc - char* texture[6]; // 15-20 - uint32 unk3[2] // 21-22 - float unk4[18]; // 23-40 - uint32 unk5[4] // 41-44 + uint32 Id; + //char* Name; + //uint32 Flags; + uint32 Type; + //uint32 SoundId; + uint32 SpellId; + //float MaxDarkenDepth; + //float FogDarkenIntensity; + //float AmbDarkenIntensity; + //float DirDarkenIntensity; + //uint32 LightID; + //float ParticleScale; + //uint32 ParticleMovement; + //uint32 ParticleTexSlots; + //uint32 LiquidMaterialID; + //char* Texture[6]; + //uint32 Color[2]; + //float Unk1[18]; + //uint32 Unk2[4]; }; -*/ #define MAX_LOCK_CASE 8 @@ -1368,6 +1368,7 @@ struct MapEntry bool IsBattleground() const { return map_type == MAP_BATTLEGROUND; } bool IsBattleArena() const { return map_type == MAP_ARENA; } bool IsBattlegroundOrArena() const { return map_type == MAP_BATTLEGROUND || map_type == MAP_ARENA; } + bool IsWorldMap() const { return map_type == MAP_COMMON; } bool GetEntrancePos(int32 &mapid, float &x, float &y) const { @@ -2212,7 +2213,7 @@ struct WorldMapAreaEntry float x2; // 7 int32 virtual_map_id; // 8 -1 (map_id have correct map) other: virtual map where zone show (map_id - where zone in fact internally) // int32 dungeonMap_id; // 9 pointer to DungeonMap.dbc (owerride x1, x2, y1, y2 coordinates) - // uint32 someMapID; // 10 + // uint32 parentMapID; // 10 }; #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index c0923b45400..df5e1ce5035 100755 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -88,7 +88,7 @@ const char ItemRandomPropertiesfmt[]="nxiiixxs"; const char ItemRandomSuffixfmt[]="nsxiiiiiiiiii"; const char ItemSetEntryfmt[]="dsiiiiiiiiiixxxxxxxiiiiiiiiiiiiiiiiii"; const char LFGDungeonEntryfmt[]="nxiiiiiiixixxixixx"; -//const char LiquidTypeEntryfmt[]="nsiiiiffffifiiisssssiiffffffffffffffffffiiii"; +const char LiquidTypefmt[]="nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; const char PhaseEntryfmt[]="nsi"; const char MailTemplateEntryfmt[]="nxs"; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index e6039880b63..47c298d7467 100755 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -38,7 +38,8 @@ m_NumWaitTimeAvg(0), m_NumWaitTimeTank(0), m_NumWaitTimeHealer(0), m_NumWaitTime m_update = sWorld->getBoolConfig(CONFIG_DUNGEON_FINDER_ENABLE); if (m_update) { - new LFGScripts(); + new LFGPlayerScript(); + new LFGGroupScript(); // Initialize dungeon cache for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i) @@ -1022,7 +1023,7 @@ bool LFGMgr::CheckCompatibility(LfgGuidList check, LfgProposal*& pProposal) // Select a random dungeon from the compatible list // TODO - Select the dungeon based on group item Level, not just random // Create a new proposal - pProposal = new LfgProposal(SelectRandomContainerElement(compatibleDungeons)); + pProposal = new LfgProposal(Trinity::Containers::SelectRandomContainerElement(compatibleDungeons)); pProposal->cancelTime = time_t(time(NULL)) + LFG_TIME_PROPOSAL; pProposal->state = LFG_PROPOSAL_INITIATING; pProposal->queues = check; @@ -1166,7 +1167,7 @@ void LFGMgr::UpdateRoleCheck(uint64 gguid, uint64 guid /* = 0 */, uint8 roles /* } m_QueueInfoMap[gguid] = pqInfo; - if(GetState(gguid) != LFG_STATE_NONE) + if (GetState(gguid) != LFG_STATE_NONE) { LfgGuidList& currentQueue = m_currentQueue[team]; currentQueue.push_front(gguid); diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 2966e799c58..6175addfae2 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -27,9 +27,45 @@ #include "LFGScripts.h" #include "LFGMgr.h" -LFGScripts::LFGScripts(): GroupScript("LFGScripts"), PlayerScript("LFGScripts") {} +LFGPlayerScript::LFGPlayerScript() : PlayerScript("LFGPlayerScript") +{ +} + +void LFGPlayerScript::OnLevelChanged(Player* player, uint8 /*oldLevel*/) +{ + sLFGMgr->InitializeLockedDungeons(player); +} -void LFGScripts::OnAddMember(Group* group, uint64 guid) +void LFGPlayerScript::OnLogout(Player* player) +{ + sLFGMgr->Leave(player); + LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE); + player->GetSession()->SendLfgUpdateParty(updateData); + player->GetSession()->SendLfgUpdatePlayer(updateData); + player->GetSession()->SendLfgUpdateSearch(false); + uint64 guid = player->GetGUID(); + // TODO - Do not remove, add timer before deleting + sLFGMgr->RemovePlayerData(guid); +} + +void LFGPlayerScript::OnLogin(Player* player) +{ + sLFGMgr->InitializeLockedDungeons(player); + // TODO - Restore LfgPlayerData and send proper status to player if it was in a group +} + +void LFGPlayerScript::OnBindToInstance(Player* player, Difficulty difficulty, uint32 mapId, bool /*permanent*/) +{ + MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); + if (mapEntry->IsDungeon() && difficulty > DUNGEON_DIFFICULTY_NORMAL) + sLFGMgr->InitializeLockedDungeons(player); +} + +LFGGroupScript::LFGGroupScript() : GroupScript("LFGGroupScript") +{ +} + +void LFGGroupScript::OnAddMember(Group* group, uint64 guid) { uint64 gguid = group->GetGUID(); if (!gguid) @@ -55,7 +91,7 @@ void LFGScripts::OnAddMember(Group* group, uint64 guid) sLFGMgr->Leave(player); } -void LFGScripts::OnRemoveMember(Group* group, uint64 guid, RemoveMethod method, uint64 kicker, const char* reason) +void LFGGroupScript::OnRemoveMember(Group* group, uint64 guid, RemoveMethod method, uint64 kicker, char const* reason) { uint64 gguid = group->GetGUID(); if (!gguid || method == GROUP_REMOVEMETHOD_DEFAULT) @@ -102,7 +138,7 @@ void LFGScripts::OnRemoveMember(Group* group, uint64 guid, RemoveMethod method, sLFGMgr->OfferContinue(group); } -void LFGScripts::OnDisband(Group* group) +void LFGGroupScript::OnDisband(Group* group) { uint64 gguid = group->GetGUID(); sLog->outDebug(LOG_FILTER_LFG, "LFGScripts::OnDisband [" UI64FMTD "]", gguid); @@ -110,7 +146,7 @@ void LFGScripts::OnDisband(Group* group) sLFGMgr->RemoveGroupData(gguid); } -void LFGScripts::OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid) +void LFGGroupScript::OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid) { uint64 gguid = group->GetGUID(); if (!gguid) @@ -131,7 +167,7 @@ void LFGScripts::OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLe } } -void LFGScripts::OnInviteMember(Group* group, uint64 guid) +void LFGGroupScript::OnInviteMember(Group* group, uint64 guid) { uint64 gguid = group->GetGUID(); if (!gguid) @@ -140,33 +176,3 @@ void LFGScripts::OnInviteMember(Group* group, uint64 guid) sLog->outDebug(LOG_FILTER_LFG, "LFGScripts::OnInviteMember [" UI64FMTD "]: invite [" UI64FMTD "] leader [" UI64FMTD "]", gguid, guid, group->GetLeaderGUID()); sLFGMgr->Leave(NULL, group); } - -void LFGScripts::OnLevelChanged(Player* player, uint8 /*oldLevel*/) -{ - sLFGMgr->InitializeLockedDungeons(player); -} - -void LFGScripts::OnLogout(Player* player) -{ - sLFGMgr->Leave(player); - LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE); - player->GetSession()->SendLfgUpdateParty(updateData); - player->GetSession()->SendLfgUpdatePlayer(updateData); - player->GetSession()->SendLfgUpdateSearch(false); - uint64 guid = player->GetGUID(); - // TODO - Do not remove, add timer before deleting - sLFGMgr->RemovePlayerData(guid); -} - -void LFGScripts::OnLogin(Player* player) -{ - sLFGMgr->InitializeLockedDungeons(player); - // TODO - Restore LfgPlayerData and send proper status to player if it was in a group -} - -void LFGScripts::OnBindToInstance(Player* player, Difficulty difficulty, uint32 mapId, bool /*permanent*/) -{ - MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); - if (mapEntry->IsDungeon() && difficulty > DUNGEON_DIFFICULTY_NORMAL) - sLFGMgr->InitializeLockedDungeons(player); -} diff --git a/src/server/game/DungeonFinding/LFGScripts.h b/src/server/game/DungeonFinding/LFGScripts.h index f17f7b16af1..4b332c7d731 100644 --- a/src/server/game/DungeonFinding/LFGScripts.h +++ b/src/server/game/DungeonFinding/LFGScripts.h @@ -26,17 +26,10 @@ class Player; class Group; -class LFGScripts: public GroupScript, public PlayerScript +class LFGPlayerScript : public PlayerScript { public: - LFGScripts(); - - // Group Hooks - void OnAddMember(Group* group, uint64 guid); - void OnRemoveMember(Group* group, uint64 guid, RemoveMethod method, uint64 kicker, const char* reason); - void OnDisband(Group* group); - void OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid); - void OnInviteMember(Group* group, uint64 guid); + LFGPlayerScript(); // Player Hooks void OnLevelChanged(Player* player, uint8 oldLevel); @@ -44,3 +37,16 @@ class LFGScripts: public GroupScript, public PlayerScript void OnLogin(Player* player); void OnBindToInstance(Player* player, Difficulty difficulty, uint32 mapId, bool permanent); }; + +class LFGGroupScript : public GroupScript +{ + public: + LFGGroupScript(); + + // Group Hooks + void OnAddMember(Group* group, uint64 guid); + void OnRemoveMember(Group* group, uint64 guid, RemoveMethod method, uint64 kicker, char const* reason); + void OnDisband(Group* group); + void OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid); + void OnInviteMember(Group* group, uint64 guid); +}; diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 858a218774c..714be7d7c9e 100755 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -32,7 +32,7 @@ Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES) m_objectType |= TYPEMASK_CORPSE; m_objectTypeId = TYPEID_CORPSE; - m_updateFlag = (UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION); + m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_POSITION); m_valuesCount = CORPSE_END; @@ -89,7 +89,7 @@ bool Corpse::Create(uint32 guidlow, Player* owner) WorldObject::_Create(guidlow, HIGHGUID_CORPSE, owner->GetPhaseMask()); - SetFloatValue(OBJECT_FIELD_SCALE_X, 1); + SetObjectScale(1); SetUInt64Value(CORPSE_FIELD_OWNER, owner->GetGUID()); _gridCoord = Trinity::ComputeGridCoord(GetPositionX(), GetPositionY()); diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h index 1aaf56eaf27..afac900df32 100755 --- a/src/server/game/Entities/Corpse/Corpse.h +++ b/src/server/game/Entities/Corpse/Corpse.h @@ -91,4 +91,3 @@ class Corpse : public WorldObject, public GridObject GridCoord _gridCoord; // gride for corpse position for fast search }; #endif - diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index fc403ef1ff7..ca075703277 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -135,7 +135,7 @@ CreatureBaseStats const* CreatureBaseStats::GetBaseStats(uint8 level, uint8 unit bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { - m_owner.ForcedDespawn(); + m_owner.DespawnOrUnsummon(); // since we are here, we are not TempSummon as object type cannot change during runtime return true; } @@ -199,7 +199,7 @@ void Creature::RemoveFromWorld() if (m_zoneScript) m_zoneScript->OnCreatureRemove(this); if (m_formation) - FormationMgr::RemoveCreatureFromGroup(m_formation, this); + sFormationMgr->RemoveCreatureFromGroup(m_formation, this); Unit::RemoveFromWorld(); sObjectAccessor->RemoveObject(this); } @@ -224,9 +224,9 @@ void Creature::SearchFormation() if (!lowguid) return; - CreatureGroupInfoType::iterator frmdata = CreatureGroupMap.find(lowguid); - if (frmdata != CreatureGroupMap.end()) - FormationMgr::AddCreatureToGroup(frmdata->second->leaderGUID, this); + CreatureGroupInfoType::iterator frmdata = sFormationMgr->CreatureGroupMap.find(lowguid); + if (frmdata != sFormationMgr->CreatureGroupMap.end()) + sFormationMgr->AddCreatureToGroup(frmdata->second->leaderGUID, this); } void Creature::RemoveCorpse(bool setSpawnTime) @@ -303,7 +303,7 @@ bool Creature::InitEntry(uint32 Entry, uint32 /*team*/, const CreatureData* data return false; } - uint32 displayID = sObjectMgr->ChooseDisplayId(0, GetCreatureInfo(), data); + uint32 displayID = sObjectMgr->ChooseDisplayId(0, GetCreatureTemplate(), data); CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelRandomGender(&displayID); if (!minfo) // Cancel load if no model defined { @@ -333,8 +333,9 @@ bool Creature::InitEntry(uint32 Entry, uint32 /*team*/, const CreatureData* data SetSpeed(MOVE_SWIM, 1.0f); // using 1.0 rate SetSpeed(MOVE_FLIGHT, 1.0f); // using 1.0 rate - SetFloatValue(OBJECT_FIELD_SCALE_X, cinfo->scale); - SetLevitate(canFly()); + SetObjectScale(cinfo->scale); + + SetFloatValue(UNIT_FIELD_HOVERHEIGHT, cinfo->HoverHeight); // checked at loading m_defaultMovementType = MovementGeneratorType(cinfo->MovementType); @@ -342,7 +343,7 @@ bool Creature::InitEntry(uint32 Entry, uint32 /*team*/, const CreatureData* data m_defaultMovementType = IDLE_MOTION_TYPE; for (uint8 i=0; i < CREATURE_MAX_SPELLS; ++i) - m_spells[i] = GetCreatureInfo()->spells[i]; + m_spells[i] = GetCreatureTemplate()->spells[i]; return true; } @@ -352,14 +353,15 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData* data) if (!InitEntry(Entry, team, data)) return false; - CreatureTemplate const* cInfo = GetCreatureInfo(); + CreatureTemplate const* cInfo = GetCreatureTemplate(); m_regenHealth = cInfo->RegenHealth; - // creatures always have melee weapon ready if any - SetSheath(SHEATH_STATE_MELEE); + // creatures always have melee weapon ready if any unless specified otherwise + if (!GetCreatureAddon()) + SetSheath(SHEATH_STATE_MELEE); - SelectLevel(GetCreatureInfo()); + SelectLevel(GetCreatureTemplate()); if (team == HORDE) setFaction(cInfo->faction_H); else @@ -418,10 +420,25 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData* data) ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); } - // TODO: In fact monster move flags should be set - not movement flags. - if (cInfo->InhabitType & INHABIT_AIR) - AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING); + //! Suspect it works this way: + //! If creature can walk and fly (usually with pathing) + //! Set MOVEMENTFLAG_CAN_FLY. Otherwise if it can only fly + //! Set MOVEMENTFLAG_DISABLE_GRAVITY + //! The only time I saw Movement Flags: DisableGravity, CanFly, Flying (50332672) on the same unit + //! it was a vehicle + if (cInfo->InhabitType & INHABIT_AIR && cInfo->InhabitType & INHABIT_GROUND) + SetCanFly(true); + else if (cInfo->InhabitType & INHABIT_AIR) + SetDisableGravity(true); + /*! Implemented in LoadCreatureAddon. Suspect there's a rule for UNIT_BYTE_1_FLAG_HOVER + in relation to DisableGravity also. + + else if (GetByteValue(UNIT_FIELD_BYTES_1, 3) & UNIT_BYTE_1_FLAG_HOVER) + SetHover(true); + */ + + // TODO: Shouldn't we check whether or not the creature is in water first? if (cInfo->InhabitType & INHABIT_WATER) AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING); @@ -451,9 +468,9 @@ void Creature::Update(uint32 diff) switch (m_deathState) { - case JUST_ALIVED: - // Must not be called, see Creature::setDeathState JUST_ALIVED -> ALIVE promoting. - sLog->outError("Creature (GUID: %u Entry: %u) in wrong state: JUST_ALIVED (4)", GetGUIDLow(), GetEntry()); + case JUST_RESPAWNED: + // Must not be called, see Creature::setDeathState JUST_RESPAWNED -> ALIVE promoting. + sLog->outError("Creature (GUID: %u Entry: %u) in wrong state: JUST_RESPAWNED (4)", GetGUIDLow(), GetEntry()); break; case JUST_DIED: // Must not be called, see Creature::setDeathState JUST_DIED -> CORPSE promoting. @@ -742,19 +759,21 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry, return false; } + //! Relocate before CreateFromProto, to initialize coords and allow + //! returning correct zone id for selecting OutdoorPvP/Battlefield script Relocate(x, y, z, ang); + //oX = x; oY = y; dX = x; dY = y; m_moveTime = 0; m_startMove = 0; + if (!CreateFromProto(guidlow, Entry, vehId, team, data)) + return false; + if (!IsPositionValid()) { sLog->outError("Creature::Create(): given coordinates for creature (guidlow %d, entry %d) are not valid (X: %f, Y: %f, Z: %f, O: %f)", guidlow, Entry, x, y, z, ang); return false; } - //oX = x; oY = y; dX = x; dY = y; m_moveTime = 0; m_startMove = 0; - if (!CreateFromProto(guidlow, Entry, vehId, team, data)) - return false; - - switch (GetCreatureInfo()->rank) + switch (GetCreatureTemplate()->rank) { case CREATURE_ELITE_RARE: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RARE); @@ -774,6 +793,16 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry, } LoadCreaturesAddon(); + + //! Need to be called after LoadCreaturesAddon - MOVEMENTFLAG_HOVER is set there + if (HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) + { + z += GetFloatValue(UNIT_FIELD_HOVERHEIGHT); + + //! Relocate again with updated Z coord + Relocate(x, y, z, ang); + } + uint32 displayID = GetNativeDisplayId(); CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelRandomGender(&displayID); if (minfo && !isTotem()) // Cancel load if no model defined or if totem @@ -783,18 +812,7 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry, SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender); } - if (GetCreatureInfo()->InhabitType & INHABIT_AIR) - { - if (GetDefaultMovementType() == IDLE_MOTION_TYPE) - AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); - else - SetFlying(true); - } - - if (GetCreatureInfo()->InhabitType & INHABIT_WATER) - AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING); - - LastUsedScriptID = GetCreatureInfo()->ScriptID; + LastUsedScriptID = GetCreatureTemplate()->ScriptID; // TODO: Replace with spell, handle from DB if (isSpiritHealer() || isSpiritGuide()) @@ -816,22 +834,22 @@ bool Creature::isCanTrainingOf(Player* player, bool msg) const TrainerSpellData const* trainer_spells = GetTrainerSpells(); - if ((!trainer_spells || trainer_spells->spellList.empty()) && GetCreatureInfo()->trainer_type != TRAINER_TYPE_PETS) + if ((!trainer_spells || trainer_spells->spellList.empty()) && GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS) { sLog->outErrorDb("Creature %u (Entry: %u) have UNIT_NPC_FLAG_TRAINER but have empty trainer spell list.", GetGUIDLow(), GetEntry()); return false; } - switch (GetCreatureInfo()->trainer_type) + switch (GetCreatureTemplate()->trainer_type) { case TRAINER_TYPE_CLASS: - if (player->getClass() != GetCreatureInfo()->trainer_class) + if (player->getClass() != GetCreatureTemplate()->trainer_class) { if (msg) { player->PlayerTalkClass->ClearMenus(); - switch (GetCreatureInfo()->trainer_class) + switch (GetCreatureTemplate()->trainer_class) { case CLASS_DRUID: player->PlayerTalkClass->SendGossipMenu(4913, GetGUID()); break; case CLASS_HUNTER: player->PlayerTalkClass->SendGossipMenu(10090, GetGUID()); break; @@ -856,12 +874,12 @@ bool Creature::isCanTrainingOf(Player* player, bool msg) const } break; case TRAINER_TYPE_MOUNTS: - if (GetCreatureInfo()->trainer_race && player->getRace() != GetCreatureInfo()->trainer_race) + if (GetCreatureTemplate()->trainer_race && player->getRace() != GetCreatureTemplate()->trainer_race) { if (msg) { player->PlayerTalkClass->ClearMenus(); - switch (GetCreatureInfo()->trainer_class) + switch (GetCreatureTemplate()->trainer_class) { case RACE_DWARF: player->PlayerTalkClass->SendGossipMenu(5865, GetGUID()); break; case RACE_GNOME: player->PlayerTalkClass->SendGossipMenu(4881, GetGUID()); break; @@ -879,7 +897,7 @@ bool Creature::isCanTrainingOf(Player* player, bool msg) const } break; case TRAINER_TYPE_TRADESKILLS: - if (GetCreatureInfo()->trainer_spell && !player->HasSpell(GetCreatureInfo()->trainer_spell)) + if (GetCreatureTemplate()->trainer_spell && !player->HasSpell(GetCreatureTemplate()->trainer_spell)) { if (msg) { @@ -930,8 +948,8 @@ bool Creature::isCanInteractWithBattleMaster(Player* player, bool msg) const bool Creature::isCanTrainingAndResetTalentsOf(Player* player) const { return player->getLevel() >= 10 - && GetCreatureInfo()->trainer_type == TRAINER_TYPE_CLASS - && player->getClass() == GetCreatureInfo()->trainer_class; + && GetCreatureTemplate()->trainer_type == TRAINER_TYPE_CLASS + && player->getClass() == GetCreatureTemplate()->trainer_class; } void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 /*MovementFlags*/, uint8 /*type*/) @@ -1040,7 +1058,7 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) uint32 dynamicflags = GetUInt32Value(UNIT_DYNAMIC_FLAGS); // check if it's a custom model and if not, use 0 for displayId - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); if (cinfo) { if (displayId == cinfo->Modelid1 || displayId == cinfo->Modelid2 || @@ -1065,11 +1083,11 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) data.equipmentId = GetEquipmentId(); data.posX = GetPositionX(); data.posY = GetPositionY(); - data.posZ = GetPositionZ(); + data.posZ = GetPositionZMinusOffset(); data.orientation = GetOrientation(); data.spawntimesecs = m_respawnDelay; // prevent add data integrity problems - data.spawndist = GetDefaultMovementType() == IDLE_MOTION_TYPE ? 0 : m_respawnradius; + data.spawndist = GetDefaultMovementType() == IDLE_MOTION_TYPE ? 0.0f : m_respawnradius; data.currentwaypoint = 0; data.curhealth = GetHealth(); data.curmana = GetPower(POWER_MANA); @@ -1084,32 +1102,34 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) // update in DB SQLTransaction trans = WorldDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM creature WHERE guid = '%u'", m_DBTableGuid); - - std::ostringstream ss; - ss << "INSERT INTO creature VALUES (" - << m_DBTableGuid << ',' - << GetEntry() << ',' - << mapid << ',' - << uint32(spawnMask) << ',' // cast to prevent save as symbol - << uint16(GetPhaseMask()) << ',' // prevent out of range error - << displayId << ',' - << GetEquipmentId() << ',' - << GetPositionX() << ',' - << GetPositionY() << ',' - << GetPositionZ() << ',' - << GetOrientation() << ',' - << m_respawnDelay << ',' //respawn time - << (float) m_respawnradius << ',' //spawn distance (float) - << (uint32) (0) << ',' //currentwaypoint - << GetHealth() << ',' //curhealth - << GetPower(POWER_MANA) << ',' //curmana - << GetDefaultMovementType() << ',' //default movement generator type - << npcflag << ',' - << unit_flags << ',' - << dynamicflags << ')'; - - trans->Append(ss.str().c_str()); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE); + stmt->setUInt32(0, m_DBTableGuid); + trans->Append(stmt); + + uint8 index = 0; + + stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_CREATURE); + stmt->setUInt32(index++, m_DBTableGuid); + stmt->setUInt32(index++, GetEntry()); + stmt->setUInt16(index++, uint16(mapid)); + stmt->setUInt8(index++, spawnMask); + stmt->setUInt16(index++, uint16(GetPhaseMask())); + stmt->setUInt32(index++, displayId); + stmt->setInt32(index++, int32(GetEquipmentId())); + stmt->setFloat(index++, GetPositionX()); + stmt->setFloat(index++, GetPositionY()); + stmt->setFloat(index++, GetPositionZ()); + stmt->setFloat(index++, GetOrientation()); + stmt->setUInt32(index++, m_respawnDelay); + stmt->setFloat(index++, m_respawnradius); + stmt->setUInt32(index++, 0); + stmt->setUInt32(index++, GetHealth()); + stmt->setUInt32(index++, GetPower(POWER_MANA)); + stmt->setUInt8(index++, uint8(GetDefaultMovementType())); + stmt->setUInt32(index++, npcflag); + stmt->setUInt32(index++, unit_flags); + stmt->setUInt32(index++, dynamicflags); + trans->Append(stmt); WorldDatabase.CommitTransaction(trans); } @@ -1287,7 +1307,7 @@ bool Creature::LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap) if (m_respawnTime) // respawn on Update { m_deathState = DEAD; - if (canFly()) + if (CanFly()) { float tz = map->GetHeight(GetPhaseMask(), data->posX, data->posY, data->posZ, false); if (data->posZ - tz > 0.1f) @@ -1302,7 +1322,7 @@ bool Creature::LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap) curhealth = data->curhealth; if (curhealth) { - curhealth = uint32(curhealth*_GetHealthMod(GetCreatureInfo()->rank)); + curhealth = uint32(curhealth*_GetHealthMod(GetCreatureTemplate()->rank)); if (curhealth < 1) curhealth = 1; } @@ -1382,10 +1402,23 @@ void Creature::DeleteFromDB() sObjectMgr->DeleteCreatureData(m_DBTableGuid); SQLTransaction trans = WorldDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM creature WHERE guid = '%u'", m_DBTableGuid); - trans->PAppend("DELETE FROM creature_addon WHERE guid = '%u'", m_DBTableGuid); - trans->PAppend("DELETE FROM game_event_creature WHERE guid = '%u'", m_DBTableGuid); - trans->PAppend("DELETE FROM game_event_model_equip WHERE guid = '%u'", m_DBTableGuid); + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE); + stmt->setUInt32(0, m_DBTableGuid); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); + stmt->setUInt32(0, m_DBTableGuid); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_GAME_EVENT_CREATURE); + stmt->setUInt32(0, m_DBTableGuid); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_GAME_EVENT_MODEL_EQUIP); + stmt->setUInt32(0, m_DBTableGuid); + trans->Append(stmt); + WorldDatabase.CommitTransaction(trans); } @@ -1420,7 +1453,7 @@ bool Creature::canStartAttack(Unit const* who, bool force) const if (who->GetTypeId() == TYPEID_UNIT && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) return false; - if (!canFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE + m_CombatDistance)) + if (!CanFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE + m_CombatDistance)) //|| who->IsControlledByPlayer() && who->IsFlying())) // we cannot check flying for other creatures, too much map/vmap calculation // TODO: should switch to range attack @@ -1502,8 +1535,8 @@ void Creature::setDeathState(DeathState s) setActive(false); - if (!isPet() && GetCreatureInfo()->SkinLootId) - if (LootTemplates_Skinning.HaveLootFor(GetCreatureInfo()->SkinLootId)) + if (!isPet() && GetCreatureTemplate()->SkinLootId) + if (LootTemplates_Skinning.HaveLootFor(GetCreatureTemplate()->SkinLootId)) if (hasLootRecipient()) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); @@ -1517,23 +1550,25 @@ void Creature::setDeathState(DeathState s) if (m_formation && m_formation->getLeader() == this) m_formation->FormationReset(true); - if ((canFly() || IsFlying())) + if ((CanFly() || IsFlying())) i_motionMaster.MoveFall(); Unit::setDeathState(CORPSE); } - else if (s == JUST_ALIVED) + else if (s == JUST_RESPAWNED) { //if (isPet()) // setActive(true); SetFullHealth(); SetLootRecipient(NULL); ResetPlayerDamageReq(); - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); SetWalk(true); - if (GetCreatureInfo()->InhabitType & INHABIT_AIR) - AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING); - if (GetCreatureInfo()->InhabitType & INHABIT_WATER) + if (cinfo->InhabitType & INHABIT_AIR && cinfo->InhabitType & INHABIT_GROUND) + SetCanFly(true); + else if (cinfo->InhabitType & INHABIT_AIR) + SetDisableGravity(true); + if (cinfo->InhabitType & INHABIT_WATER) AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); ClearUnitState(uint32(UNIT_STATE_ALL_STATE)); @@ -1573,10 +1608,10 @@ void Creature::Respawn(bool force) if (m_originalEntry != GetEntry()) UpdateEntry(m_originalEntry); - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); SelectLevel(cinfo); - setDeathState(JUST_ALIVED); + setDeathState(JUST_RESPAWNED); uint32 displayID = GetNativeDisplayId(); CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelRandomGender(&displayID); @@ -1633,12 +1668,12 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) if (!spellInfo) return false; - // Spells that don't have effectMechanics. - if (!spellInfo->HasAnyEffectMechanic() && GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1))) + // Creature is immune to main mechanic of the spell + if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1))) return true; - // This check must be done instead of 'if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))' for not break - // the check of mechanic immunity on DB (tested) because GetCreatureInfo()->MechanicImmuneMask and m_spellImmune[IMMUNITY_MECHANIC] don't have same data. + // This check must be done instead of 'if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))' for not break + // the check of mechanic immunity on DB (tested) because GetCreatureTemplate()->MechanicImmuneMask and m_spellImmune[IMMUNITY_MECHANIC] don't have same data. bool immunedToAllEffects = true; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (!IsImmunedToSpellEffect(spellInfo, i)) @@ -1654,18 +1689,18 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) bool Creature::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const { - if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Effects[index].Mechanic - 1))) + if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Effects[index].Mechanic - 1))) return true; - if (GetCreatureInfo()->type == CREATURE_TYPE_MECHANICAL && spellInfo->Effects[index].Effect == SPELL_EFFECT_HEAL) + if (GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL && spellInfo->Effects[index].Effect == SPELL_EFFECT_HEAL) return true; return Unit::IsImmunedToSpellEffect(spellInfo, index); } -SpellInfo const* Creature::reachWithSpellAttack(Unit* pVictim) +SpellInfo const* Creature::reachWithSpellAttack(Unit* victim) { - if (!pVictim) + if (!victim) return NULL; for (uint32 i=0; i < CREATURE_MAX_SPELLS; ++i) @@ -1686,7 +1721,7 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* pVictim) (spellInfo->Effects[j].Effect == SPELL_EFFECT_INSTAKILL) || (spellInfo->Effects[j].Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE) || (spellInfo->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH) -) + ) { bcontinue = false; break; @@ -1700,7 +1735,7 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* pVictim) continue; float range = spellInfo->GetMaxRange(false); float minrange = spellInfo->GetMinRange(false); - float dist = GetDistance(pVictim); + float dist = GetDistance(victim); if (dist > range || dist < minrange) continue; if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED)) @@ -1712,9 +1747,9 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* pVictim) return NULL; } -SpellInfo const* Creature::reachWithSpellCure(Unit* pVictim) +SpellInfo const* Creature::reachWithSpellCure(Unit* victim) { - if (!pVictim) + if (!victim) return NULL; for (uint32 i=0; i < CREATURE_MAX_SPELLS; ++i) @@ -1737,15 +1772,16 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* pVictim) break; } } - if (bcontinue) continue; + if (bcontinue) + continue; if (spellInfo->ManaCost > (uint32)GetPower(POWER_MANA)) continue; float range = spellInfo->GetMaxRange(true); float minrange = spellInfo->GetMinRange(true); - float dist = GetDistance(pVictim); - //if (!isInFront(pVictim, range) && spellInfo->AttributesEx) + float dist = GetDistance(victim); + //if (!isInFront(victim, range) && spellInfo->AttributesEx) // continue; if (dist > range || dist < minrange) continue; @@ -1982,30 +2018,30 @@ void Creature::SaveRespawnTime() } // this should not be called by petAI or -bool Creature::canCreatureAttack(Unit const* pVictim, bool /*force*/) const +bool Creature::canCreatureAttack(Unit const* victim, bool /*force*/) const { - if (!pVictim->IsInMap(this)) + if (!victim->IsInMap(this)) return false; - if (!IsValidAttackTarget(pVictim)) + if (!IsValidAttackTarget(victim)) return false; - if (!pVictim->isInAccessiblePlaceFor(this)) + if (!victim->isInAccessiblePlaceFor(this)) return false; - if (IsAIEnabled && !AI()->CanAIAttack(pVictim)) + if (IsAIEnabled && !AI()->CanAIAttack(victim)) return false; if (sMapStore.LookupEntry(GetMapId())->IsDungeon()) return true; //Use AttackDistance in distance check if threat radius is lower. This prevents creature bounce in and out of combat every update tick. - float dist = std::max(GetAttackDistance(pVictim), sWorld->getFloatConfig(CONFIG_THREAT_RADIUS)) + m_CombatDistance; + float dist = std::max(GetAttackDistance(victim), sWorld->getFloatConfig(CONFIG_THREAT_RADIUS)) + m_CombatDistance; if (Unit* unit = GetCharmerOrOwner()) - return pVictim->IsWithinDist(unit, dist); + return victim->IsWithinDist(unit, dist); else - return pVictim->IsInDist(&m_homePosition, dist); + return victim->IsInDist(&m_homePosition, dist); } CreatureAddon const* Creature::GetCreatureAddon() const @@ -2017,7 +2053,7 @@ CreatureAddon const* Creature::GetCreatureAddon() const } // dependent from difficulty mode entry - return sObjectMgr->GetCreatureTemplateAddon(GetCreatureInfo()->Entry); + return sObjectMgr->GetCreatureTemplateAddon(GetCreatureTemplate()->Entry); } //creature_addon table @@ -2042,6 +2078,12 @@ bool Creature::LoadCreaturesAddon(bool reload) SetByteValue(UNIT_FIELD_BYTES_1, 1, 0); SetByteValue(UNIT_FIELD_BYTES_1, 2, uint8((cainfo->bytes1 >> 16) & 0xFF)); SetByteValue(UNIT_FIELD_BYTES_1, 3, uint8((cainfo->bytes1 >> 24) & 0xFF)); + + //! Suspected correlation between UNIT_FIELD_BYTES_1, offset 3, value 0x2: + //! If no inhabittype_fly (if no MovementFlag_DisableGravity flag found in sniffs) + //! Set MovementFlag_Hover. Otherwise do nothing. + if (GetByteValue(UNIT_FIELD_BYTES_1, 3) & UNIT_BYTE1_FLAG_HOVER && !IsLevitating()) + AddUnitMovementFlag(MOVEMENTFLAG_HOVER); } if (cainfo->bytes2 != 0) @@ -2090,6 +2132,7 @@ bool Creature::LoadCreaturesAddon(bool reload) sLog->outDebug(LOG_FILTER_UNITS, "Spell: %u added to creature (GUID: %u Entry: %u)", *itr, GetGUIDLow(), GetEntry()); } } + return true; } @@ -2238,7 +2281,7 @@ void Creature::AllLootRemovedFromCorpse() return; float decayRate; - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); decayRate = sWorld->getRate(RATE_CORPSE_DECAY_LOOTED); uint32 diff = uint32((m_corpseRemoveTime - now) * decayRate); @@ -2410,24 +2453,50 @@ bool Creature::IsDungeonBoss() const return cinfo && (cinfo->flags_extra & CREATURE_FLAG_EXTRA_DUNGEON_BOSS); } -void Creature::SetWalk(bool enable) +bool Creature::SetWalk(bool enable) { - if (enable) - AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - else - RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + if (!Unit::SetWalk(enable)) + return false; + WorldPacket data(enable ? SMSG_MOVE_SPLINE_SET_WALK_MODE : SMSG_MOVE_SPLINE_SET_RUN_MODE, 9); data.append(GetPackGUID()); - SendMessageToSet(&data, true); + SendMessageToSet(&data, false); + return true; } -void Creature::SetLevitate(bool enable) +bool Creature::SetDisableGravity(bool disable, bool packetOnly/*=false*/) { + //! It's possible only a packet is sent but moveflags are not updated + //! Need more research on this + if (!packetOnly && !Unit::SetDisableGravity(disable)) + return false; + + if (!movespline->Initialized()) + return true; + + WorldPacket data(disable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE, 9); + data.append(GetPackGUID()); + SendMessageToSet(&data, false); + return true; +} + +bool Creature::SetHover(bool enable) +{ + if (!Unit::SetHover(enable)) + return false; + + //! Unconfirmed for players: if (enable) - AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER); else - RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - WorldPacket data(enable ? SMSG_MOVE_SPLINE_DISABLE_GRAVITY : SMSG_MOVE_SPLINE_ENABLE_GRAVITY, 9); + RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER); + + if (!movespline->Initialized()) + return true; + + //! Not always a packet is sent + WorldPacket data(enable ? SMSG_SPLINE_MOVE_SET_HOVER : SMSG_SPLINE_MOVE_UNSET_HOVER, 9); data.append(GetPackGUID()); - SendMessageToSet(&data, true); + SendMessageToSet(&data, false); + return true; } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 847f2aa6fd1..906dc827d3f 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -136,6 +136,7 @@ struct CreatureTemplate std::string AIName; uint32 MovementType; uint32 InhabitType; + float HoverHeight; float ModHealth; float ModMana; float ModArmor; @@ -267,7 +268,6 @@ struct CreatureData // `creature_addon` table struct CreatureAddon { - uint32 guidOrEntry; uint32 path_id; uint32 mount; uint32 bytes1; @@ -339,7 +339,9 @@ struct VendorItemData VendorItem* GetItem(uint32 slot) const { - if (slot >= m_items.size()) return NULL; + if (slot >= m_items.size()) + return NULL; + return m_items[slot]; } bool Empty() const { return m_items.empty(); } @@ -374,7 +376,7 @@ struct TrainerSpell { TrainerSpell() : spell(0), spellCost(0), reqSkill(0), reqSkillValue(0), reqLevel(0) { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS ; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) learnedSpell[i] = 0; } @@ -459,17 +461,17 @@ class Creature : public Unit, public GridObject, public MapCreature void Update(uint32 time); // overwrited Unit::Update void GetRespawnPosition(float &x, float &y, float &z, float* ori = NULL, float* dist =NULL) const; - uint32 GetEquipmentId() const { return GetCreatureInfo()->equipmentId; } + uint32 GetEquipmentId() const { return GetCreatureTemplate()->equipmentId; } void SetCorpseDelay(uint32 delay) { m_corpseDelay = delay; } uint32 GetCorpseDelay() const { return m_corpseDelay; } - bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; } - bool isCivilian() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } - bool isTrigger() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER; } - bool isGuard() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_GUARD; } - bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; } - bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; } - //bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; } + bool isRacialLeader() const { return GetCreatureTemplate()->RacialLeader; } + bool isCivilian() const { return GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } + bool isTrigger() const { return GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER; } + bool isGuard() const { return GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_GUARD; } + bool canWalk() const { return GetCreatureTemplate()->InhabitType & INHABIT_GROUND; } + bool canSwim() const { return GetCreatureTemplate()->InhabitType & INHABIT_WATER; } + bool CanFly() const { return GetCreatureTemplate()->InhabitType & INHABIT_AIR; } void SetReactState(ReactStates st) { m_reactState = st; } ReactStates GetReactState() { return m_reactState; } @@ -488,7 +490,7 @@ class Creature : public Unit, public GridObject, public MapCreature bool isCanTrainingOf(Player* player, bool msg) const; bool isCanInteractWithBattleMaster(Player* player, bool msg) const; bool isCanTrainingAndResetTalentsOf(Player* player) const; - bool canCreatureAttack(Unit const* pVictim, bool force = true) const; + bool canCreatureAttack(Unit const* victim, bool force = true) const; bool IsImmunedToSpell(SpellInfo const* spellInfo); // redefine Unit::IsImmunedToSpell bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; @@ -498,7 +500,7 @@ class Creature : public Unit, public GridObject, public MapCreature if (isPet()) return false; - uint32 rank = GetCreatureInfo()->rank; + uint32 rank = GetCreatureTemplate()->rank; return rank != CREATURE_ELITE_NORMAL && rank != CREATURE_ELITE_RARE; } @@ -507,7 +509,7 @@ class Creature : public Unit, public GridObject, public MapCreature if (isPet()) return false; - return GetCreatureInfo()->rank == CREATURE_ELITE_WORLDBOSS; + return GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_BOSS; } bool IsDungeonBoss() const; @@ -522,8 +524,9 @@ class Creature : public Unit, public GridObject, public MapCreature void AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 MovementFlags, uint8 type); CreatureAI* AI() const { return (CreatureAI*)i_AI; } - void SetWalk(bool enable); - void SetLevitate(bool enable); + bool SetWalk(bool enable); + bool SetDisableGravity(bool disable, bool packetOnly = false); + bool SetHover(bool enable); uint32 GetShieldBlockValue() const //dunno mob block value { @@ -560,7 +563,7 @@ class Creature : public Unit, public GridObject, public MapCreature TrainerSpellData const* GetTrainerSpells() const; - CreatureTemplate const* GetCreatureInfo() const { return m_creatureInfo; } + CreatureTemplate const* GetCreatureTemplate() const { return m_creatureInfo; } CreatureData const* GetCreatureData() const { return m_creatureData; } CreatureAddon const* GetCreatureAddon() const; @@ -604,8 +607,8 @@ class Creature : public Unit, public GridObject, public MapCreature void RemoveLootMode(uint16 lootMode) { m_LootMode &= ~lootMode; } void ResetLootMode() { m_LootMode = LOOT_MODE_DEFAULT; } - SpellInfo const* reachWithSpellAttack(Unit* pVictim); - SpellInfo const* reachWithSpellCure(Unit* pVictim); + SpellInfo const* reachWithSpellAttack(Unit* victim); + SpellInfo const* reachWithSpellCure(Unit* victim); uint32 m_spells[CREATURE_MAX_SPELLS]; CreatureSpellCooldowns m_CreatureSpellCooldowns; @@ -634,7 +637,6 @@ class Creature : public Unit, public GridObject, public MapCreature void RemoveCorpse(bool setSpawnTime = true); - void ForcedDespawn(uint32 timeMSToDespawn = 0); void DespawnOrUnsummon(uint32 msTimeToDespawn = 0); time_t const& GetRespawnTime() const { return m_respawnTime; } @@ -762,6 +764,8 @@ class Creature : public Unit, public GridObject, public MapCreature bool IsInvisibleDueToDespawn() const; bool CanAlwaysSee(WorldObject const* obj) const; private: + void ForcedDespawn(uint32 timeMSToDespawn = 0); + //WaypointMovementGenerator vars uint32 m_waypointID; uint32 m_path_id; diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index f440fd497fc..54953ef5420 100755 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -24,12 +24,13 @@ #define MAX_DESYNC 5.0f -CreatureGroupInfoType CreatureGroupMap; - -namespace FormationMgr +FormationMgr::~FormationMgr() { + for (CreatureGroupInfoType::iterator itr = CreatureGroupMap.begin(); itr != CreatureGroupMap.end(); ++itr) + delete itr->second; +} -void AddCreatureToGroup(uint32 groupId, Creature* member) +void FormationMgr::AddCreatureToGroup(uint32 groupId, Creature* member) { Map* map = member->FindMap(); if (!map) @@ -53,7 +54,7 @@ void AddCreatureToGroup(uint32 groupId, Creature* member) } } -void RemoveCreatureFromGroup(CreatureGroup* group, Creature* member) +void FormationMgr::RemoveCreatureFromGroup(CreatureGroup* group, Creature* member) { sLog->outDebug(LOG_FILTER_UNITS, "Deleting member pointer to GUID: %u from group %u", group->GetId(), member->GetDBTableGUIDLow()); group->RemoveMember(member); @@ -70,7 +71,7 @@ void RemoveCreatureFromGroup(CreatureGroup* group, Creature* member) } } -void LoadCreatureFormations() +void FormationMgr::LoadCreatureFormations() { uint32 oldMSTime = getMSTime(); @@ -97,10 +98,10 @@ void LoadCreatureFormations() fields = result->Fetch(); //Load group member data - group_member = new FormationInfo; + group_member = new FormationInfo(); group_member->leaderGUID = fields[0].GetUInt32(); uint32 memberGUID = fields[1].GetUInt32(); - group_member->groupAI = fields[4].GetUInt8(); + group_member->groupAI = fields[4].GetUInt32(); //If creature is group leader we may skip loading of dist/angle if (group_member->leaderGUID != memberGUID) { @@ -133,14 +134,12 @@ void LoadCreatureFormations() CreatureGroupMap[memberGUID] = group_member; ++count; } - while (result->NextRow()) ; + while (result->NextRow()); sLog->outString(">> Loaded %u creatures in formations in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); } -} // Namespace - void CreatureGroup::AddMember(Creature* member) { sLog->outDebug(LOG_FILTER_UNITS, "CreatureGroup::AddMember: Adding unit GUID: %u.", member->GetGUIDLow()); @@ -152,7 +151,7 @@ void CreatureGroup::AddMember(Creature* member) m_leader = member; } - m_members[member] = CreatureGroupMap.find(member->GetDBTableGUIDLow())->second; + m_members[member] = sFormationMgr->CreatureGroupMap.find(member->GetDBTableGUIDLow())->second; member->SetFormation(this); } @@ -167,7 +166,7 @@ void CreatureGroup::RemoveMember(Creature* member) void CreatureGroup::MemberAttackStart(Creature* member, Unit* target) { - uint8 groupAI = CreatureGroupMap[member->GetDBTableGUIDLow()]->groupAI; + uint8 groupAI = sFormationMgr->CreatureGroupMap[member->GetDBTableGUIDLow()]->groupAI; if (!groupAI) return; @@ -240,7 +239,7 @@ void CreatureGroup::LeaderMoveTo(float x, float y, float z) if (member->IsWithinDist(m_leader, dist + MAX_DESYNC)) member->SetUnitMovementFlags(m_leader->GetUnitMovementFlags()); else - member->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + member->SetWalk(false); member->GetMotionMaster()->MovePoint(0, dx, dy, dz); member->SetHomePosition(dx, dy, dz, pathangle); diff --git a/src/server/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h index 80e552f7e93..e5b8771ee40 100755 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -34,16 +34,19 @@ struct FormationInfo uint8 groupAI; }; -namespace FormationMgr -{ - void AddCreatureToGroup(uint32 group_id, Creature* creature); - void RemoveCreatureFromGroup(CreatureGroup* group, Creature* creature); - void LoadCreatureFormations(); -}; - typedef UNORDERED_MAP CreatureGroupInfoType; -extern CreatureGroupInfoType CreatureGroupMap; +class FormationMgr +{ + friend class ACE_Singleton; + public: + FormationMgr() { } + ~FormationMgr(); + void AddCreatureToGroup(uint32 group_id, Creature* creature); + void RemoveCreatureFromGroup(CreatureGroup* group, Creature* creature); + void LoadCreatureFormations(); + CreatureGroupInfoType CreatureGroupMap; +}; class CreatureGroup { @@ -73,4 +76,6 @@ class CreatureGroup void MemberAttackStart(Creature* member, Unit* target); }; +#define sFormationMgr ACE_Singleton::instance() + #endif diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 99150434c44..21c5aa38a19 100755 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -47,10 +47,7 @@ void GossipMenu::AddMenuItem(int32 menuItemId, uint8 icon, std::string const& me for (GossipMenuItemContainer::const_iterator itr = _menuItems.begin(); itr != _menuItems.end(); ++itr) { if (int32(itr->first) > menuItemId) - { - menuItemId = menuItemId; break; - } menuItemId = itr->first + 1; } diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index fa1e134b1ac..829eb73bf80 100755 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -107,4 +107,3 @@ private: TempSummon& m_owner; }; #endif - diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 754caa5c774..8dcafa3b2ae 100755 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -33,7 +33,7 @@ DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject), m_objectType |= TYPEMASK_DYNAMICOBJECT; m_objectTypeId = TYPEID_DYNAMICOBJECT; - m_updateFlag = (UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION); + m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_POSITION); m_valuesCount = DYNAMICOBJECT_END; } @@ -92,7 +92,7 @@ bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spe WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetPhaseMask()); SetEntry(spellId); - SetFloatValue(OBJECT_FIELD_SCALE_X, 1); + SetObjectScale(1); SetUInt64Value(DYNAMICOBJECT_CASTER, caster->GetGUID()); // The lower word of DYNAMICOBJECT_BYTES must be 0x0001. This value means that the visual radius will be overriden @@ -116,7 +116,7 @@ bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spe void DynamicObject::Update(uint32 p_time) { - // caster has to be always avalible and in the same map + // caster has to be always available and in the same map ASSERT(_caster); ASSERT(_caster->GetMap() == GetMap()); @@ -127,7 +127,7 @@ void DynamicObject::Update(uint32 p_time) if (!_aura->IsRemoved()) _aura->UpdateOwner(p_time, this); - // m_aura may be set to null in Aura::UpdateOwner call + // _aura may be set to null in Aura::UpdateOwner call if (_aura && (_aura->IsRemoved() || _aura->IsExpired())) expired = true; } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index c04dd0b1941..7591359230a 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -38,7 +38,7 @@ GameObject::GameObject() : WorldObject(false), m_model(NULL), m_goValue(new Game m_objectType |= TYPEMASK_GAMEOBJECT; m_objectTypeId = TYPEID_GAMEOBJECT; - m_updateFlag = (UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION | UPDATEFLAG_ROTATION); + m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_POSITION | UPDATEFLAG_ROTATION); m_valuesCount = GAMEOBJECT_END; m_respawnTime = 0; @@ -55,6 +55,8 @@ GameObject::GameObject() : WorldObject(false), m_model(NULL), m_goValue(new Game m_DBTableGuid = 0; m_rotation = 0; + m_lootRecipient = 0; + m_lootRecipientGroup = 0; m_groupLootTimer = 0; lootingGroupLowGUID = 0; @@ -132,10 +134,11 @@ void GameObject::AddToWorld() sObjectAccessor->AddObject(this); bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); - bool toggledState = (GetGOData() ? GetGOData()->go_state == GO_STATE_ACTIVE : false); + // The state can be changed after GameObject::Create but before GameObject::AddToWorld + bool toggledState = GetGOData() ? GetGOData()->go_state == GO_STATE_READY : false; if (m_model) GetMap()->Insert(*m_model); - if ((startOpen && !toggledState) || (!startOpen && toggledState)) + if (startOpen ^ toggledState) EnableCollision(false); WorldObject::AddToWorld(); @@ -203,7 +206,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa UpdateRotationFields(rotation2, rotation3); // GAMEOBJECT_FACING, GAMEOBJECT_ROTATION, GAMEOBJECT_PARENTROTATION+2/3 - SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size); + SetObjectScale(goinfo->size); SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction); SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags); @@ -219,10 +222,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa // GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3 SetGoType(GameobjectTypes(goinfo->type)); SetGoState(go_state); - - SetGoArtKit(0); // unknown what this is - SetByteValue(GAMEOBJECT_BYTES_1, 2, artKit); - + SetGoArtKit(artKit); switch (goinfo->type) { @@ -252,7 +252,6 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa m_invisibility.AddFlag(INVISIBILITY_TRAP); m_invisibility.AddValue(INVISIBILITY_TRAP, 300); } - break; default: SetGoAnimProgress(animprogress); @@ -685,29 +684,34 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) data.spawnMask = spawnMask; data.artKit = GetGoArtKit(); - // update in DB - std::ostringstream ss; - ss << "INSERT INTO gameobject VALUES (" - << m_DBTableGuid << ',' - << GetEntry() << ',' - << mapid << ',' - << uint32(spawnMask) << ',' // cast to prevent save as symbol - << uint16(GetPhaseMask()) << ',' // prevent out of range error - << GetPositionX() << ',' - << GetPositionY() << ',' - << GetPositionZ() << ',' - << GetOrientation() << ',' - << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ',' - << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ',' - << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ',' - << GetFloatValue(GAMEOBJECT_PARENTROTATION+3) << ',' - << m_respawnDelayTime << ',' - << uint32(GetGoAnimProgress()) << ',' - << uint32(GetGoState()) << ')'; - + // Update in DB SQLTransaction trans = WorldDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM gameobject WHERE guid = '%u'", m_DBTableGuid); - trans->Append(ss.str().c_str()); + + uint8 index = 0; + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_GAMEOBJECT); + stmt->setUInt32(0, m_DBTableGuid); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_GAMEOBJECT); + stmt->setUInt32(index++, m_DBTableGuid); + stmt->setUInt32(index++, GetEntry()); + stmt->setUInt16(index++, uint16(mapid)); + stmt->setUInt8(index++, spawnMask); + stmt->setUInt16(index++, uint16(GetPhaseMask())); + stmt->setFloat(index++, GetPositionX()); + stmt->setFloat(index++, GetPositionY()); + stmt->setFloat(index++, GetPositionZ()); + stmt->setFloat(index++, GetOrientation()); + stmt->setFloat(index++, GetFloatValue(GAMEOBJECT_PARENTROTATION)); + stmt->setFloat(index++, GetFloatValue(GAMEOBJECT_PARENTROTATION+1)); + stmt->setFloat(index++, GetFloatValue(GAMEOBJECT_PARENTROTATION+2)); + stmt->setFloat(index++, GetFloatValue(GAMEOBJECT_PARENTROTATION+3)); + stmt->setInt32(index++, int32(m_respawnDelayTime)); + stmt->setUInt8(index++, GetGoAnimProgress()); + stmt->setUInt8(index++, uint8(GetGoState())); + trans->Append(stmt); + WorldDatabase.CommitTransaction(trans); } @@ -834,7 +838,9 @@ bool GameObject::IsTransport() const { // If something is marked as a transport, don't transmit an out of range packet for it. GameObjectTemplate const* gInfo = GetGOInfo(); - if (!gInfo) return false; + if (!gInfo) + return false; + return gInfo->type == GAMEOBJECT_TYPE_TRANSPORT || gInfo->type == GAMEOBJECT_TYPE_MO_TRANSPORT; } @@ -843,7 +849,9 @@ bool GameObject::IsDynTransport() const { // If something is marked as a transport, don't transmit an out of range packet for it. GameObjectTemplate const* gInfo = GetGOInfo(); - if (!gInfo) return false; + if (!gInfo) + return false; + return gInfo->type == GAMEOBJECT_TYPE_MO_TRANSPORT || (gInfo->type == GAMEOBJECT_TYPE_TRANSPORT && !gInfo->transport.pause); } @@ -1422,7 +1430,7 @@ void GameObject::Use(Unit* user) if (info->summoningRitual.casterTargetSpell && info->summoningRitual.casterTargetSpell != 1) // No idea why this field is a bool in some cases for (uint32 i = 0; i < info->summoningRitual.casterTargetSpellTargets; i++) // m_unique_users can contain only player GUIDs - if (Player* target = ObjectAccessor::GetPlayer(*this, SelectRandomContainerElement(m_unique_users))) + if (Player* target = ObjectAccessor::GetPlayer(*this, Trinity::Containers::SelectRandomContainerElement(m_unique_users))) spellCaster->CastSpell(target, info->summoningRitual.casterTargetSpell, true); // finish owners spell @@ -1666,7 +1674,7 @@ void GameObject::CastSpell(Unit* target, uint32 spellId) else { trigger->setFaction(14); - // Set owner guid for target if no owner avalible - needed by trigger auras + // Set owner guid for target if no owner available - needed by trigger auras // - trigger gets despawned and there's no caster avalible (see AuraEffect::TriggerSpell()) trigger->CastSpell(target ? target : trigger, spellInfo, true, 0, 0, target ? target->GetGUID() : 0); } @@ -1815,6 +1823,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* m_goValue->Building.Health = m_goValue->Building.MaxHealth; SetGoAnimProgress(255); } + EnableCollision(true); break; case GO_DESTRUCTIBLE_DAMAGED: { @@ -1871,6 +1880,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* m_goValue->Building.Health = 0; SetGoAnimProgress(0); } + EnableCollision(false); break; } case GO_DESTRUCTIBLE_REBUILDING: @@ -1890,6 +1900,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* m_goValue->Building.Health = m_goValue->Building.MaxHealth; SetGoAnimProgress(255); } + EnableCollision(true); break; } } @@ -1899,12 +1910,14 @@ void GameObject::SetLootState(LootState state, Unit* unit) { m_lootState = state; AI()->OnStateChanged(state, unit); + sScriptMgr->OnGameObjectLootStateChanged(this, state, unit); if (m_model) { // startOpen determines whether we are going to add or remove the LoS on activation bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); - if (GetGOData() && GetGOData()->go_state == GO_NOT_READY) + // Use the current go state + if (GetGoState() == GO_STATE_ACTIVE) startOpen = !startOpen; if (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED) @@ -1917,6 +1930,7 @@ void GameObject::SetLootState(LootState state, Unit* unit) void GameObject::SetGoState(GOState state) { SetByteValue(GAMEOBJECT_BYTES_1, 0, state); + sScriptMgr->OnGameObjectStateChanged(this, state); if (m_model) { if (!IsInWorld()) @@ -1925,7 +1939,7 @@ void GameObject::SetGoState(GOState state) // startOpen determines whether we are going to add or remove the LoS on activation bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); - if (GetGOData() && GetGOData()->go_state == GO_NOT_READY) + if (GetGOData() && GetGOData()->go_state == GO_STATE_READY) startOpen = !startOpen; if (state == GO_STATE_ACTIVE || state == GO_STATE_ACTIVE_ALTERNATIVE) @@ -1970,3 +1984,57 @@ void GameObject::UpdateModel() if (m_model) GetMap()->Insert(*m_model); } + +Player* GameObject::GetLootRecipient() const +{ + if (!m_lootRecipient) + return NULL; + return ObjectAccessor::FindPlayer(m_lootRecipient); +} + +Group* GameObject::GetLootRecipientGroup() const +{ + if (!m_lootRecipientGroup) + return NULL; + return sGroupMgr->GetGroupByGUID(m_lootRecipientGroup); +} + +void GameObject::SetLootRecipient(Unit* unit) +{ + // set the player whose group should receive the right + // to loot the creature after it dies + // should be set to NULL after the loot disappears + + if (!unit) + { + m_lootRecipient = 0; + m_lootRecipientGroup = 0; + return; + } + + if (unit->GetTypeId() != TYPEID_PLAYER && !unit->IsVehicle()) + return; + + Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!player) // normal creature, no player involved + return; + + m_lootRecipient = player->GetGUID(); + if (Group* group = player->GetGroup()) + m_lootRecipientGroup = group->GetLowGUID(); +} + +bool GameObject::IsLootAllowedFor(Player const* player) const +{ + if (!m_lootRecipient && !m_lootRecipientGroup) + return true; + + if (player->GetGUID() == m_lootRecipient) + return true; + + Group const* playerGroup = player->GetGroup(); + if (!playerGroup || playerGroup != GetLootRecipientGroup()) // if we dont have a group we arent the recipient + return false; // if go doesnt have group bound it means it was solo killed by someone else + + return true; +} diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 2e40d45541c..80aaf1c933f 100755 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -403,7 +403,6 @@ struct GameObjectTemplate } raw; }; - std::string AIName; uint32 ScriptId; @@ -732,7 +731,9 @@ class GameObject : public WorldObject, public GridObject bool IsInSkillupList(uint32 PlayerGuidLow) const { for (std::list::const_iterator i = m_SkillupList.begin(); i != m_SkillupList.end(); ++i) - if (*i == PlayerGuidLow) return true; + if (*i == PlayerGuidLow) + return true; + return false; } void ClearSkillupList() { m_SkillupList.clear(); } @@ -747,6 +748,11 @@ class GameObject : public WorldObject, public GridObject Loot loot; + Player* GetLootRecipient() const; + Group* GetLootRecipientGroup() const; + void SetLootRecipient(Unit* unit); + bool IsLootAllowedFor(Player const* player) const; + bool HasLootRecipient() const { return m_lootRecipient || m_lootRecipientGroup; } uint32 m_groupLootTimer; // (msecs)timer used for group loot uint32 lootingGroupLowGUID; // used to find group which is looting @@ -823,6 +829,8 @@ class GameObject : public WorldObject, public GridObject uint64 m_rotation; + uint64 m_lootRecipient; + uint32 m_lootRecipientGroup; uint16 m_LootMode; // bitmask, default LOOT_MODE_DEFAULT, determines what loot will be lootable private: void RemoveFromOwner(); diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp index 4eede93bd37..c4d4adeb6f2 100755 --- a/src/server/game/Entities/Item/Container/Bag.cpp +++ b/src/server/game/Entities/Item/Container/Bag.cpp @@ -78,7 +78,7 @@ bool Bag::Create(uint32 guidlow, uint32 itemid, Player const* owner) Object::_Create(guidlow, 0, HIGHGUID_CONTAINER); SetEntry(itemid); - SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); + SetObjectScale(1.0f); SetUInt64Value(ITEM_FIELD_OWNER, owner ? owner->GetGUID() : 0); SetUInt64Value(ITEM_FIELD_CONTAINED, owner ? owner->GetGUID() : 0); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index b5e39fe19af..d973c3ba4f8 100755 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -56,8 +56,7 @@ void AddItemsSetItem(Player* player, Item* item) if (!eff) { - eff = new ItemSetEffect; - memset(eff, 0, sizeof(ItemSetEffect)); + eff = new ItemSetEffect(); eff->setid = setid; size_t x = 0; @@ -259,7 +258,7 @@ bool Item::Create(uint32 guidlow, uint32 itemid, Player const* owner) Object::_Create(guidlow, 0, HIGHGUID_ITEM); SetEntry(itemid); - SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); + SetObjectScale(1.0f); SetUInt64Value(ITEM_FIELD_OWNER, owner ? owner->GetGUID() : 0); SetUInt64Value(ITEM_FIELD_CONTAINED, owner ? owner->GetGUID() : 0); @@ -344,8 +343,8 @@ void Item::SaveToDB(SQLTransaction& trans) } stmt->setString(++index, ssEnchants.str()); - stmt->setInt32 (++index, GetItemRandomPropertyId()); - stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_DURABILITY)); + stmt->setInt16 (++index, GetItemRandomPropertyId()); + stmt->setUInt16(++index, GetUInt32Value(ITEM_FIELD_DURABILITY)); stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME)); stmt->setString(++index, m_text); stmt->setUInt32(++index, guid); @@ -401,7 +400,7 @@ bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entr // Set entry, MUST be before proto check SetEntry(entry); - SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); + SetObjectScale(1.0f); ItemTemplate const* proto = GetTemplate(); if (!proto) @@ -487,7 +486,7 @@ void Item::DeleteFromDB(SQLTransaction& trans) /*static*/ void Item::DeleteFromInventoryDB(SQLTransaction& trans, uint32 itemGuid) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVENTORY_ITEM); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM); stmt->setUInt32(0, itemGuid); trans->Append(stmt); } @@ -766,7 +765,7 @@ bool Item::CanBeTraded(bool mail, bool trade) const if (Player* owner = GetOwner()) { - if (owner->CanUnequipItem(GetPos(), false) != EQUIP_ERR_OK) + if (owner->CanUnequipItem(GetPos(), false) != EQUIP_ERR_OK) return false; if (owner->GetLootGUID() == GetGUID()) return false; @@ -780,30 +779,28 @@ bool Item::CanBeTraded(bool mail, bool trade) const bool Item::HasEnchantRequiredSkill(const Player* player) const { - - // Check all enchants for required skill - for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) - if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) - if (enchantEntry->requiredSkill && player->GetSkillValue(enchantEntry->requiredSkill) < enchantEntry->requiredSkillValue) - return false; + // Check all enchants for required skill + for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) + if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) + if (enchantEntry->requiredSkill && player->GetSkillValue(enchantEntry->requiredSkill) < enchantEntry->requiredSkillValue) + return false; return true; } uint32 Item::GetEnchantRequiredLevel() const { + uint32 level = 0; - uint32 level = 0; - - // Check all enchants for required level - for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) - if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) - if (enchantEntry->requiredLevel > level) - level = enchantEntry->requiredLevel; + // Check all enchants for required level + for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) + if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) + if (enchantEntry->requiredLevel > level) + level = enchantEntry->requiredLevel; - return level; + return level; } bool Item::IsBoundByEnchant() const @@ -861,7 +858,7 @@ bool Item::IsFitToSpellRequirements(SpellInfo const* spellInfo) const // Special case - accept weapon type for main and offhand requirements if (proto->InventoryType == INVTYPE_WEAPON && (spellInfo->EquippedItemInventoryTypeMask & (1 << INVTYPE_WEAPONMAINHAND) || - spellInfo->EquippedItemInventoryTypeMask & (1 << INVTYPE_WEAPONOFFHAND))) + spellInfo->EquippedItemInventoryTypeMask & (1 << INVTYPE_WEAPONOFFHAND))) return true; else if ((spellInfo->EquippedItemInventoryTypeMask & (1 << proto->InventoryType)) == 0) return false; // inventory type not present in mask @@ -1001,12 +998,13 @@ bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) cons // time. void Item::SendTimeUpdate(Player* owner) { - if (!GetUInt32Value(ITEM_FIELD_DURATION)) + uint32 duration = GetUInt32Value(ITEM_FIELD_DURATION); + if (!duration) return; WorldPacket data(SMSG_ITEM_TIME_UPDATE, (8+4)); - data << (uint64)GetGUID(); - data << (uint32)GetUInt32Value(ITEM_FIELD_DURATION); + data << uint64(GetGUID()); + data << uint32(duration); owner->GetSession()->SendPacket(&data); } @@ -1084,16 +1082,30 @@ void Item::BuildUpdate(UpdateDataMapType& data_map) void Item::SaveRefundDataToDB() { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM item_refund_instance WHERE item_guid = '%u'", GetGUIDLow()); - trans->PAppend("INSERT INTO item_refund_instance (`item_guid`, `player_guid`, `paidMoney`, `paidExtendedCost`)" - " VALUES('%u', '%u', '%u', '%u')", GetGUIDLow(), GetRefundRecipient(), GetPaidMoney(), GetPaidExtendedCost()); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE); + stmt->setUInt32(0, GetGUIDLow()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_REFUND_INSTANCE); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, GetRefundRecipient()); + stmt->setUInt32(2, GetPaidMoney()); + stmt->setUInt16(3, uint16(GetPaidExtendedCost())); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } void Item::DeleteRefundDataFromDB(SQLTransaction* trans) { if (trans && !trans->null()) - (*trans)->PAppend("DELETE FROM item_refund_instance WHERE item_guid = '%u'", GetGUIDLow()); + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE); + stmt->setUInt32(0, GetGUIDLow()); + (*trans)->Append(stmt); + + } } void Item::SetNotRefundable(Player* owner, bool changestate /*=true*/, SQLTransaction* trans /*=NULL*/) diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 4887afc2b8a..54570e9b708 100755 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -213,7 +213,7 @@ class Item : public Object static Item* CreateItem(uint32 item, uint32 count, Player const* player = NULL); Item* CloneItem(uint32 count, Player const* player = NULL) const; - Item (); + Item(); virtual bool Create(uint32 guidlow, uint32 itemid, Player const* owner); diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index b8eaf043b1f..f3d7d7fd56c 100755 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -49,6 +49,7 @@ void LoadRandomEnchantmentsTable() RandomItemEnch.clear(); // for reload case + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT entry, ench, chance FROM item_enchantment_template"); if (result) @@ -101,18 +102,20 @@ uint32 GetItemEnchantMod(int32 entry) { fCount += ench_iter->chance; - if (fCount > dRoll) return ench_iter->ench; + if (fCount > dRoll) + return ench_iter->ench; } //we could get here only if sum of all enchantment chances is lower than 100% - dRoll = (irand(0, (int)floor(fCount * 100) + 1)) / 100; + dRoll = (irand(0, (int)floor(fCount * 100) + 1)) / 100; fCount = 0; for (EnchStoreList::const_iterator ench_iter = tab->second.begin(); ench_iter != tab->second.end(); ++ench_iter) { fCount += ench_iter->chance; - if (fCount > dRoll) return ench_iter->ench; + if (fCount > dRoll) + return ench_iter->ench; } return 0; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index f1d0dd5a506..d21ae63be45 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -197,7 +197,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c if (target == this) // building packet for yourself flags |= UPDATEFLAG_SELF; - if (flags & UPDATEFLAG_HAS_POSITION) + if (flags & UPDATEFLAG_STATIONARY_POSITION) { // UPDATETYPE_CREATE_OBJECT2 dynamic objects, corpses... if (isType(TYPEMASK_DYNAMICOBJECT) || isType(TYPEMASK_CORPSE) || isType(TYPEMASK_PLAYER)) @@ -281,19 +281,21 @@ void Object::BuildOutOfRangeUpdateBlock(UpdateData* data) const data->AddOutOfRangeGUID(GetGUID()); } -void Object::DestroyForPlayer(Player* target, bool anim) const +void Object::DestroyForPlayer(Player* target, bool onDeath) const { ASSERT(target); WorldPacket data(SMSG_DESTROY_OBJECT, 8 + 1); data << uint64(GetGUID()); - data << uint8(anim ? 1 : 0); // WotLK (bool), may be despawn animation + //! If the following bool is true, the client will call "void CGUnit_C::OnDeath()" for this object. + //! OnDeath() does for eg trigger death animation and interrupts certain spells/missiles/auras/sounds... + data << uint8(onDeath ? 1 : 0); target->GetSession()->SendPacket(&data); } -void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const +void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const { - *data << (uint16)flags; // update flags + *data << uint16(flags); // update flags // 0x20 if (flags & UPDATEFLAG_LIVING) @@ -320,13 +322,37 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const WorldObject* worldObj = ((WorldObject*)this); if (flags & UPDATEFLAG_POSITION) { - *data << uint8(0); // unk PGUID! - *data << worldObj->GetPositionX(); - *data << worldObj->GetPositionY(); - *data << worldObj->GetPositionZ(); + Transport* transport = worldObj->GetTransport(); + if (transport) + data->append(transport->GetPackGUID()); + else + *data << uint8(0); + *data << worldObj->GetPositionX(); *data << worldObj->GetPositionY(); *data << worldObj->GetPositionZ(); + *data << worldObj->GetOrientation(); + if (isType(TYPEMASK_UNIT)) + *data << ((Unit*)this)->GetPositionZMinusOffset(); + else + *data << worldObj->GetPositionZ(); + + if (transport) + { + *data << worldObj->GetTransOffsetX(); + *data << worldObj->GetTransOffsetY(); + *data << worldObj->GetTransOffsetZ(); + } + else + { + *data << worldObj->GetPositionX(); + *data << worldObj->GetPositionY(); + if (isType(TYPEMASK_UNIT)) + *data << ((Unit*)this)->GetPositionZMinusOffset(); + else + *data << worldObj->GetPositionZ(); + } + *data << worldObj->GetOrientation(); if (GetTypeId() == TYPEID_CORPSE) @@ -337,31 +363,23 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const else { // 0x40 - if (flags & UPDATEFLAG_HAS_POSITION) + if (flags & UPDATEFLAG_STATIONARY_POSITION) { - // 0x02 - if (flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT) - { - *data << (float)0; - *data << (float)0; - *data << (float)0; - *data << worldObj->GetOrientation(); - } + *data << worldObj->GetPositionX(); + *data << worldObj->GetPositionY(); + if (isType(TYPEMASK_UNIT)) + *data << ((Unit*)this)->GetPositionZMinusOffset(); else - { - *data << worldObj->GetPositionX(); - *data << worldObj->GetPositionY(); *data << worldObj->GetPositionZ(); - *data << worldObj->GetOrientation(); - } + *data << worldObj->GetOrientation(); } } } // 0x4 - if (flags & UPDATEFLAG_HAS_TARGET) // packed guid (current target guid) + if (flags & UPDATEFLAG_HAS_TARGET) { - if (Unit *victim = this->ToUnit()->getVictim()) + if (Unit* victim = this->ToUnit()->getVictim()) data->append(victim->GetPackGUID()); else *data << uint8(0); @@ -369,13 +387,14 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const // 0x2 if (flags & UPDATEFLAG_TRANSPORT) - *data << uint32(getMSTime()); // ms time + *data << uint32(getMSTime()); // Unknown - getMSTime is wrong. // 0x80 - if (flags & UPDATEFLAG_VEHICLE) // unused for now + if (flags & UPDATEFLAG_VEHICLE) { - *data << uint32(((Unit*)this)->GetVehicleKit()->GetVehicleInfo()->m_ID); // vehicle id - *data << float(((Creature*)this)->GetOrientation()); // facing adjustment + // TODO: Allow players to aquire this updateflag. + *data << uint32(((Unit*)this)->GetVehicleKit()->GetVehicleInfo()->m_ID); + *data << float(((Creature*)this)->GetOrientation()); } // 0x800 - AnimKits @@ -427,6 +446,10 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* } updateMask->SetBit(GAMEOBJECT_DYNAMIC); updateMask->SetBit(GAMEOBJECT_BYTES_1); + + if (ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_CHEST && ToGameObject()->GetGOInfo()->chest.groupLootRules && + ToGameObject()->HasLootRecipient()) + updateMask->SetBit(GAMEOBJECT_FLAGS); } else if (isType(TYPEMASK_UNIT)) { @@ -500,7 +523,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* { if (GetTypeId() == TYPEID_UNIT) { - CreatureTemplate const* cinfo = ToCreature()->GetCreatureInfo(); + CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); // this also applies for transform auras if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(ToUnit()->getTransForm())) @@ -540,7 +563,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* { uint32 dynamicFlags = m_uint32Values[index]; - if (const Creature* creature = ToCreature()) + if (Creature const* creature = ToCreature()) { if (creature->hasLootRecipient()) { @@ -564,6 +587,11 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE; } + // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras + if (Unit const* unit = ToUnit()) + if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT) + if (!unit->HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, target->GetGUID())) + dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT; *data << dynamicFlags; } // FG: pretend that OTHER players in own group are friendly ("blue") @@ -650,6 +678,15 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* *data << uint16(-1); } } + else if (index == GAMEOBJECT_FLAGS) + { + uint32 flags = m_uint32Values[index]; + if (ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_CHEST) + if (ToGameObject()->GetGOInfo()->chest.groupLootRules && !ToGameObject()->IsLootAllowedFor(target)) + flags |= GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE; + + *data << flags; + } else *data << m_uint32Values[index]; // other cases } @@ -1114,7 +1151,7 @@ void MovementInfo::OutDebug() sLog->outString("pitch: %f", pitch); sLog->outString("fallTime: %u", fallTime); - if (flags & MOVEMENTFLAG_JUMPING) + if (flags & MOVEMENTFLAG_FALLING) sLog->outString("j_zspeed: %f j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", j_zspeed, j_sinAngle, j_cosAngle, j_xyspeed); if (flags & MOVEMENTFLAG_SPLINE_ELEVATION) @@ -1385,7 +1422,9 @@ void Position::GetPositionOffsetTo(const Position & endPos, Position & retOffset float Position::GetAngle(const Position* obj) const { - if (!obj) return 0; + if (!obj) + return 0; + return GetAngle(obj->GetPositionX(), obj->GetPositionY()); } @@ -1436,7 +1475,7 @@ bool Position::HasInArc(float arc, const Position* obj) const if (angle > M_PI) angle -= 2.0f*M_PI; - float lborder = -1 * (arc/2.0f); // in range -pi..0 + float lborder = -1 * (arc/2.0f); // in range -pi..0 float rborder = (arc/2.0f); // in range 0..pi return ((angle >= lborder) && (angle <= rborder)); } @@ -1507,7 +1546,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const { // non fly unit don't must be in air // non swim unit must be at ground (mostly speedup, because it don't must be in water and water level check less fast - if (!ToCreature()->canFly()) + if (!ToCreature()->CanFly()) { bool canSwim = ToCreature()->canSwim(); float ground_z = z; @@ -1533,7 +1572,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const case TYPEID_PLAYER: { // for server controlled moves playr work same as creature (but it can always swim) - if (!ToPlayer()->canFly()) + if (!ToPlayer()->CanFly()) { float ground_z = z; float max_z = GetBaseMap()->GetWaterOrGroundLevel(x, y, z, &ground_z, !ToUnit()->HasAuraType(SPELL_AURA_WATER_WALK)); @@ -1556,7 +1595,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const default: { float ground_z = GetBaseMap()->GetHeight(GetPhaseMask(), x, y, z, true); - if(ground_z > INVALID_HEIGHT) + if (ground_z > INVALID_HEIGHT) z = ground_z; break; } @@ -2618,8 +2657,42 @@ void WorldObject::GetNearPoint(WorldObject const* /*searcher*/, float &x, float void WorldObject::MovePosition(Position &pos, float dist, float angle) { angle += m_orientation; - pos.m_positionX += dist * cos(angle); - pos.m_positionY += dist * sin(angle); + float destx, desty, destz, ground, floor; + destx = pos.m_positionX + dist * cos(angle); + desty = pos.m_positionY + dist * sin(angle); + + // Prevent invalid coordinates here, position is unchanged + if (!Trinity::IsValidMapCoord(destx, desty)) + { + sLog->outCrash("WorldObject::MovePosition invalid coordinates X: %f and Y: %f were passed!", destx, desty); + return; + } + + ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); + floor = GetMap()->GetHeight(GetPhaseMask(), destx, desty, pos.m_positionZ, true); + destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + + float step = dist/10.0f; + + for (uint8 j = 0; j < 10; ++j) + { + // do not allow too big z changes + if (fabs(pos.m_positionZ - destz) > 6) + { + destx -= step * cos(angle); + desty -= step * sin(angle); + ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); + floor = GetMap()->GetHeight(GetPhaseMask(), destx, desty, pos.m_positionZ, true); + destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + } + // we have correct destz now + else + { + pos.Relocate(destx, desty, destz); + break; + } + } + Trinity::NormalizeMapCoord(pos.m_positionX); Trinity::NormalizeMapCoord(pos.m_positionY); UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); @@ -2633,6 +2706,14 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float pos.m_positionZ += 2.0f; destx = pos.m_positionX + dist * cos(angle); desty = pos.m_positionY + dist * sin(angle); + + // Prevent invalid coordinates here, position is unchanged + if (!Trinity::IsValidMapCoord(destx, desty)) + { + sLog->outCrash("WorldObject::MovePositionToFirstCollision invalid coordinates X: %f and Y: %f were passed!", destx, desty); + return; + } + ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); floor = GetMap()->GetHeight(GetPhaseMask(), destx, desty, pos.m_positionZ, true); destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 54f64f8da38..0d18a47885f 100755 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -122,7 +122,7 @@ typedef UNORDERED_MAP UpdateDataMapType; class Object { public: - virtual ~Object (); + virtual ~Object(); bool IsInWorld() const { return m_inWorld; } @@ -137,6 +137,8 @@ class Object uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); } void SetEntry(uint32 entry) { SetUInt32Value(OBJECT_FIELD_ENTRY, entry); } + void SetObjectScale(float scale) { SetFloatValue(OBJECT_FIELD_SCALE_X, scale); } + TypeID GetTypeId() const { return m_objectTypeId; } bool isType(uint16 mask) const { return (mask & m_objectType); } @@ -146,7 +148,7 @@ class Object void BuildValuesUpdateBlockForPlayer(UpdateData* data, Player* target) const; void BuildOutOfRangeUpdateBlock(UpdateData* data) const; - virtual void DestroyForPlayer(Player* target, bool anim = false) const; + virtual void DestroyForPlayer(Player* target, bool onDeath = false) const; int32 GetInt32Value(uint16 index) const { @@ -226,7 +228,9 @@ class Object bool HasFlag(uint16 index, uint32 flag) const { - if (index >= m_valuesCount && !PrintIndexError(index, false)) return false; + if (index >= m_valuesCount && !PrintIndexError(index, false)) + return false; + return (m_uint32Values[index] & flag) != 0; } @@ -298,21 +302,21 @@ class Object // FG: some hacky helpers void ForceValuesUpdateAtIndex(uint32); - Player* ToPlayer(){ if (GetTypeId() == TYPEID_PLAYER) return reinterpret_cast(this); else return NULL; } - const Player* ToPlayer() const { if (GetTypeId() == TYPEID_PLAYER) return (const Player*)((Player*)this); else return NULL; } - Creature* ToCreature(){ if (GetTypeId() == TYPEID_UNIT) return reinterpret_cast(this); else return NULL; } - const Creature* ToCreature() const {if (GetTypeId() == TYPEID_UNIT) return (const Creature*)((Creature*)this); else return NULL; } + Player* ToPlayer() { if (GetTypeId() == TYPEID_PLAYER) return reinterpret_cast(this); else return NULL; } + Player const* ToPlayer() const { if (GetTypeId() == TYPEID_PLAYER) return (Player const*)((Player*)this); else return NULL; } + Creature* ToCreature() { if (GetTypeId() == TYPEID_UNIT) return reinterpret_cast(this); else return NULL; } + Creature const* ToCreature() const { if (GetTypeId() == TYPEID_UNIT) return (Creature const*)((Creature*)this); else return NULL; } - Unit* ToUnit(){ if (GetTypeId() == TYPEID_UNIT || GetTypeId() == TYPEID_PLAYER) return reinterpret_cast(this); else return NULL; } - const Unit* ToUnit() const {if (GetTypeId() == TYPEID_UNIT || GetTypeId() == TYPEID_PLAYER) return (const Unit*)((Unit*)this); else return NULL; } - GameObject* ToGameObject(){ if (GetTypeId() == TYPEID_GAMEOBJECT) return reinterpret_cast(this); else return NULL; } - const GameObject* ToGameObject() const {if (GetTypeId() == TYPEID_GAMEOBJECT) return (const GameObject*)((GameObject*)this); else return NULL; } + Unit* ToUnit() { if (GetTypeId() == TYPEID_UNIT || GetTypeId() == TYPEID_PLAYER) return reinterpret_cast(this); else return NULL; } + Unit const* ToUnit() const { if (GetTypeId() == TYPEID_UNIT || GetTypeId() == TYPEID_PLAYER) return (const Unit*)((Unit*)this); else return NULL; } + GameObject* ToGameObject() { if (GetTypeId() == TYPEID_GAMEOBJECT) return reinterpret_cast(this); else return NULL; } + GameObject const* ToGameObject() const { if (GetTypeId() == TYPEID_GAMEOBJECT) return (const GameObject*)((GameObject*)this); else return NULL; } - Corpse* ToCorpse(){ if (GetTypeId() == TYPEID_CORPSE) return reinterpret_cast(this); else return NULL; } - const Corpse* ToCorpse() const {if (GetTypeId() == TYPEID_CORPSE) return (const Corpse*)((Corpse*)this); else return NULL; } + Corpse* ToCorpse() { if (GetTypeId() == TYPEID_CORPSE) return reinterpret_cast(this); else return NULL; } + Corpse const* ToCorpse() const { if (GetTypeId() == TYPEID_CORPSE) return (const Corpse*)((Corpse*)this); else return NULL; } protected: - Object (); + Object(); void _InitValues(); void _Create (uint32 guidlow, uint32 entry, HighGuid guidhigh); @@ -506,6 +510,8 @@ struct MovementInfo void AddExtraMovementFlag(uint16 flag) { flags2 |= flag; } bool HasExtraMovementFlag(uint16 flag) const { return flags2 & flag; } + void SetFallTime(uint32 time) { fallTime = time; } + void OutDebug(); }; @@ -681,7 +687,7 @@ class WorldObject : public Object, public WorldLocation bool IsInMap(const WorldObject* obj) const { if (obj) - return IsInWorld() && obj->IsInWorld() && (GetMap() == obj->GetMap()) && InSamePhase(obj); + return IsInWorld() && obj->IsInWorld() && (GetMap() == obj->GetMap()); return false; } bool IsWithinDist3d(float x, float y, float z, float dist) const @@ -699,7 +705,7 @@ class WorldObject : public Object, public WorldLocation } bool IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D = true) const { - return obj && IsInMap(obj) && _IsWithinDist(obj, dist2compare, is3D); + return obj && IsInMap(obj) && InSamePhase(obj) && _IsWithinDist(obj, dist2compare, is3D); } bool IsWithinLOS(float x, float y, float z) const; bool IsWithinLOSInMap(const WorldObject* obj) const; @@ -776,7 +782,8 @@ class WorldObject : public Object, public WorldLocation GetClosePoint(x, y, z, GetObjectSize()); ang = GetOrientation(); } - Position pos = {x, y, z, ang}; + Position pos; + pos.Relocate(x, y, z, ang); return SummonCreature(id, pos, spwtype, despwtime, 0); } GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime); @@ -873,20 +880,6 @@ class WorldObject : public Object, public WorldLocation namespace Trinity { - template - void RandomResizeList(std::list &_list, uint32 _size) - { - size_t list_size = _list.size(); - - while (list_size > _size) - { - typename std::list::iterator itr = _list.begin(); - std::advance(itr, urand(0, list_size - 1)); - _list.erase(itr); - --list_size; - } - } - // Binary predicate to sort WorldObjects based on the distance to a reference WorldObject class ObjectDistanceOrderPred { diff --git a/src/server/game/Entities/Object/ObjectPosSelector.cpp b/src/server/game/Entities/Object/ObjectPosSelector.cpp index ec654954b80..f5c36f5a3c9 100755 --- a/src/server/game/Entities/Object/ObjectPosSelector.cpp +++ b/src/server/game/Entities/Object/ObjectPosSelector.cpp @@ -75,9 +75,9 @@ void ObjectPosSelector::InitializeAngle() bool ObjectPosSelector::FirstAngle(float& angle) { - if (m_UsedPosLists[USED_POS_PLUS].empty() && !m_UsedPosLists[USED_POS_MINUS].empty() ) + if (m_UsedPosLists[USED_POS_PLUS].empty() && !m_UsedPosLists[USED_POS_MINUS].empty()) return NextAngleFor(*m_UsedPosLists[USED_POS_MINUS].begin(), 1.0f, USED_POS_PLUS, angle); - else if (m_UsedPosLists[USED_POS_MINUS].empty() && !m_UsedPosLists[USED_POS_PLUS].empty() ) + else if (m_UsedPosLists[USED_POS_MINUS].empty() && !m_UsedPosLists[USED_POS_PLUS].empty()) return NextAngleFor(*m_UsedPosLists[USED_POS_PLUS].begin(), -1.0f, USED_POS_MINUS, angle); return false; @@ -100,7 +100,7 @@ bool ObjectPosSelector::NextAngle(float& angle) bool ObjectPosSelector::NextUsedAngle(float& angle) { while (m_nextUsedPos[USED_POS_PLUS]!=m_UsedPosLists[USED_POS_PLUS].end() || - m_nextUsedPos[USED_POS_MINUS]!=m_UsedPosLists[USED_POS_MINUS].end() ) + m_nextUsedPos[USED_POS_MINUS]!=m_UsedPosLists[USED_POS_MINUS].end()) { // calculate next possible angle if (!NextPosibleAngle(angle)) @@ -114,7 +114,7 @@ bool ObjectPosSelector::NextPosibleAngle(float& angle) { // ++ direction less updated if (m_nextUsedPos[USED_POS_PLUS]!=m_UsedPosLists[USED_POS_PLUS].end() && - (m_nextUsedPos[USED_POS_MINUS]==m_UsedPosLists[USED_POS_MINUS].end() || m_nextUsedPos[USED_POS_PLUS]->first <= m_nextUsedPos[USED_POS_MINUS]->first) ) + (m_nextUsedPos[USED_POS_MINUS]==m_UsedPosLists[USED_POS_MINUS].end() || m_nextUsedPos[USED_POS_PLUS]->first <= m_nextUsedPos[USED_POS_MINUS]->first)) { bool ok; if (m_smallStepOk[USED_POS_PLUS]) @@ -133,7 +133,7 @@ bool ObjectPosSelector::NextPosibleAngle(float& angle) if (m_smallStepOk[USED_POS_MINUS]) ok = NextSmallStepAngle(-1.0f, USED_POS_MINUS, angle); else - ok = NextAngleFor(*m_nextUsedPos[USED_POS_MINUS], -1.0f, USED_POS_MINUS, angle); + ok = NextAngleFor(*m_nextUsedPos[USED_POS_MINUS], -1.0f, USED_POS_MINUS, angle); if (!ok) ++m_nextUsedPos[USED_POS_MINUS]; diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index d1bdad13a19..11d54ac488e 100755 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -32,21 +32,21 @@ enum OBJECT_UPDATE_TYPE enum OBJECT_UPDATE_FLAGS { - UPDATEFLAG_NONE = 0x0000, - UPDATEFLAG_SELF = 0x0001, - UPDATEFLAG_TRANSPORT = 0x0002, - UPDATEFLAG_HAS_TARGET = 0x0004, - UPDATEFLAG_UNK1 = 0x0008, - UPDATEFLAG_UNK2 = 0x0010, - UPDATEFLAG_LIVING = 0x0020, - UPDATEFLAG_HAS_POSITION = 0x0040, - UPDATEFLAG_VEHICLE = 0x0080, - UPDATEFLAG_POSITION = 0x0100, - UPDATEFLAG_ROTATION = 0x0200, - UPDATEFLAG_UNK3 = 0x0400, - UPDATEFLAG_ANIMKITS = 0x0800, - UPDATEFLAG_UNK5 = 0x1000, - UPDATEFLAG_UNK6 = 0x2000 + UPDATEFLAG_NONE = 0x0000, + UPDATEFLAG_SELF = 0x0001, + UPDATEFLAG_TRANSPORT = 0x0002, + UPDATEFLAG_HAS_TARGET = 0x0004, + UPDATEFLAG_UNKNOWN = 0x0008, + UPDATEFLAG_LOWGUID = 0x0010, + UPDATEFLAG_LIVING = 0x0020, + UPDATEFLAG_STATIONARY_POSITION = 0x0040, + UPDATEFLAG_VEHICLE = 0x0080, + UPDATEFLAG_POSITION = 0x0100, + UPDATEFLAG_ROTATION = 0x0200, + UPDATEFLAG_UNK3 = 0x0400, + UPDATEFLAG_ANIMKITS = 0x0800, + UPDATEFLAG_UNK5 = 0x1000, + UPDATEFLAG_UNK6 = 0x2000 }; class UpdateData diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 088957ab0b3..414792c8d5c 100755 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -97,30 +97,42 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c uint32 ownerid = owner->GetGUIDLow(); - QueryResult result; + PreparedStatement* stmt; + PreparedQueryResult result; if (petnumber) - // known petnumber entry 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 - result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType " - "FROM character_pet WHERE owner = '%u' AND id = '%u'", - ownerid, petnumber); + { + // Known petnumber entry + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_BY_ENTRY); + stmt->setUInt32(0, ownerid); + stmt->setUInt32(1, petnumber); + } else if (current) - // current pet (slot 0) 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 - result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType " - "FROM character_pet WHERE owner = '%u' AND slot = '%u'", - ownerid, PET_SAVE_AS_CURRENT); + { + // Current pet (slot 0) + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT); + stmt->setUInt32(0, ownerid); + stmt->setUInt8(1, uint8(PET_SAVE_AS_CURRENT)); + } else if (petentry) + { // known petentry entry (unique for summoned pet, but non unique for hunter pet (only from current or not stabled pets) - // 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 - result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType " - "FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '%u' OR slot > '%u') ", - ownerid, petentry, PET_SAVE_AS_CURRENT, PET_SAVE_LAST_STABLE_SLOT); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2); + stmt->setUInt32(0, ownerid); + stmt->setUInt32(1, petentry); + stmt->setUInt8(2, uint8(PET_SAVE_AS_CURRENT)); + stmt->setUInt8(3, uint8(PET_SAVE_LAST_STABLE_SLOT)); + } else - // any current or other non-stabled pet (for hunter "call pet") - // 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 - result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType " - "FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot > '%u') ", - ownerid, PET_SAVE_AS_CURRENT, PET_SAVE_LAST_STABLE_SLOT); + { + // Any current or other non-stabled pet (for hunter "call pet") + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_BY_SLOT); + stmt->setUInt32(0, ownerid); + stmt->setUInt8(1, uint8(PET_SAVE_AS_CURRENT)); + stmt->setUInt8(2, uint8(PET_SAVE_LAST_STABLE_SLOT)); + } + + result = CharacterDatabase.Query(stmt); if (!result) { @@ -180,7 +192,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c setFaction(owner->getFaction()); SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id); - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); if (cinfo->type == CREATURE_TYPE_CRITTER) { map->AddToMap(this->ToCreature()); @@ -252,10 +264,20 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c if (fields[7].GetUInt8()) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("UPDATE character_pet SET slot = '%u' WHERE owner = '%u' AND slot = '%u' AND id <> '%u'", - PET_SAVE_NOT_IN_SLOT, ownerid, PET_SAVE_AS_CURRENT, m_charmInfo->GetPetNumber()); - trans->PAppend("UPDATE character_pet SET slot = '%u' WHERE owner = '%u' AND id = '%u'", - PET_SAVE_AS_CURRENT, ownerid, m_charmInfo->GetPetNumber()); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID); + stmt->setUInt8(0, uint8(PET_SAVE_NOT_IN_SLOT)); + stmt->setUInt32(1, ownerid); + stmt->setUInt8(2, uint8(PET_SAVE_AS_CURRENT)); + stmt->setUInt32(3, m_charmInfo->GetPetNumber()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID); + stmt->setUInt8(0, uint8(PET_SAVE_AS_CURRENT)); + stmt->setUInt32(1, ownerid); + stmt->setUInt32(2, m_charmInfo->GetPetNumber()); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } @@ -308,7 +330,10 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c if (getPetType() == HUNTER_PET) { - result = CharacterDatabase.PQuery("SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = '%u' AND id = '%u'", owner->GetGUIDLow(), GetCharmInfo()->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_DECLINED_NAME); + stmt->setUInt32(0, owner->GetGUIDLow()); + stmt->setUInt32(1, GetCharmInfo()->GetPetNumber()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -383,17 +408,31 @@ void Pet::SavePetToDB(PetSaveMode mode) CharacterDatabase.EscapeString(name); trans = CharacterDatabase.BeginTransaction(); // remove current data - trans->PAppend("DELETE FROM character_pet WHERE owner = '%u' AND id = '%u'", ownerLowGUID, m_charmInfo->GetPetNumber()); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_ID); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + trans->Append(stmt); // prevent duplicate using slot (except PET_SAVE_NOT_IN_SLOT) if (mode <= PET_SAVE_LAST_STABLE_SLOT) - trans->PAppend("UPDATE character_pet SET slot = '%u' WHERE owner = '%u' AND slot = '%u'", - PET_SAVE_NOT_IN_SLOT, ownerLowGUID, uint32(mode)); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT); + stmt->setUInt8(0, uint8(PET_SAVE_NOT_IN_SLOT)); + stmt->setUInt32(1, ownerLowGUID); + stmt->setUInt8(2, uint8(mode)); + trans->Append(stmt); + } // prevent existence another hunter pet in PET_SAVE_AS_CURRENT and PET_SAVE_NOT_IN_SLOT if (getPetType() == HUNTER_PET && (mode == PET_SAVE_AS_CURRENT || mode > PET_SAVE_LAST_STABLE_SLOT)) - trans->PAppend("DELETE FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot > '%u')", - ownerLowGUID, PET_SAVE_AS_CURRENT, PET_SAVE_LAST_STABLE_SLOT); + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_SLOT); + stmt->setUInt32(0, ownerLowGUID); + stmt->setUInt8(1, uint8(PET_SAVE_AS_CURRENT)); + stmt->setUInt8(2, uint8(PET_SAVE_LAST_STABLE_SLOT)); + trans->Append(stmt); + } + // save pet std::ostringstream ss; ss << "INSERT INTO character_pet (id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType) " @@ -414,7 +453,7 @@ void Pet::SavePetToDB(PetSaveMode mode) for (uint32 i = ACTION_BAR_INDEX_START; i < ACTION_BAR_INDEX_END; ++i) { ss << uint32(m_charmInfo->GetActionBarEntry(i)->GetType()) << ' ' - << uint32(m_charmInfo->GetActionBarEntry(i)->GetAction()) << ' '; + << uint32(m_charmInfo->GetActionBarEntry(i)->GetAction()) << ' '; }; ss << "', " @@ -436,11 +475,27 @@ void Pet::SavePetToDB(PetSaveMode mode) void Pet::DeleteFromDB(uint32 guidlow) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM character_pet WHERE id = '%u'", guidlow); - trans->PAppend("DELETE FROM character_pet_declinedname WHERE id = '%u'", guidlow); - trans->PAppend("DELETE FROM pet_aura WHERE guid = '%u'", guidlow); - trans->PAppend("DELETE FROM pet_spell WHERE guid = '%u'", guidlow); - trans->PAppend("DELETE FROM pet_spell_cooldown WHERE guid = '%u'", guidlow); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_ID); + stmt->setUInt32(0, guidlow); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME); + stmt->setUInt32(0, guidlow); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURAS); + stmt->setUInt32(0, guidlow); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_SPELLS); + stmt->setUInt32(0, guidlow); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_SPELL_COOLDOWNS); + stmt->setUInt32(0, guidlow); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } @@ -528,7 +583,13 @@ void Pet::Update(uint32 diff) Regenerate(POWER_FOCUS); m_regenTimer += PET_FOCUS_REGEN_INTERVAL - diff; if (!m_regenTimer) ++m_regenTimer; + + // Reset if large diff (lag) causes focus to get 'stuck' + if (m_regenTimer > PET_FOCUS_REGEN_INTERVAL) + m_regenTimer = PET_FOCUS_REGEN_INTERVAL; + break; + // in creature::update //case POWER_ENERGY: // Regenerate(POWER_ENERGY); @@ -650,7 +711,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature) { ASSERT(creature); - if (!CreateBaseAtTamed(creature->GetCreatureInfo(), creature->GetMap(), creature->GetPhaseMask())) + if (!CreateBaseAtTamed(creature->GetCreatureTemplate(), creature->GetMap(), creature->GetPhaseMask())) return false; Relocate(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation()); @@ -662,7 +723,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature) return false; } - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); if (!cinfo) { sLog->outError("CreateBaseAtCreature() failed, creatureInfo is missing!"); @@ -719,7 +780,7 @@ bool Pet::CreateBaseAtTamed(CreatureTemplate const* cinfo, Map* map, uint32 phas // TODO: Move stat mods code to pet passive auras bool Guardian::InitStatsForLevel(uint8 petlevel) { - CreatureTemplate const* cinfo = GetCreatureInfo(); + CreatureTemplate const* cinfo = GetCreatureTemplate(); ASSERT(cinfo); SetLevel(petlevel); @@ -765,7 +826,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) else scale = cFamily->minScale + float(getLevel() - cFamily->minScaleLevel) / cFamily->maxScaleLevel * (cFamily->maxScale - cFamily->minScale); - SetFloatValue(OBJECT_FIELD_SCALE_X, scale); + SetObjectScale(scale); } // Resistance @@ -835,14 +896,14 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) { case 510: // mage Water Elemental { - SetBonusDamage(int32(m_owner->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_FROST) * 0.33f)); + SetBonusDamage(int32(m_owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FROST) * 0.33f)); break; } case 1964: //force of nature { if (!pInfo) SetCreateHealth(30 + 30*petlevel); - float bonusDmg = m_owner->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_NATURE) * 0.15f; + float bonusDmg = m_owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.15f; SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel * 2.5f - (petlevel / 2) + bonusDmg)); SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel * 2.5f + (petlevel / 2) + bonusDmg)); break; @@ -862,7 +923,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetCreateHealth(40*petlevel); SetCreateMana(28 + 10*petlevel); } - SetBonusDamage(m_owner->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_FIRE) * 0.5f); + SetBonusDamage(int32(m_owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE) * 0.5f)); SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel * 4 - petlevel)); SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel * 4 + petlevel)); break; @@ -874,7 +935,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetCreateMana(28 + 10*petlevel); SetCreateHealth(28 + 30*petlevel); } - int32 bonus_dmg = (int32(m_owner->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_SHADOW)* 0.3f)); + int32 bonus_dmg = (int32(m_owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW)* 0.3f)); SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float((petlevel * 4 - petlevel) + bonus_dmg)); SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float((petlevel * 4 + petlevel) + bonus_dmg)); @@ -915,7 +976,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) } case 31216: // Mirror Image { - SetBonusDamage(int32(m_owner->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_FROST) * 0.33f)); + SetBonusDamage(int32(m_owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FROST) * 0.33f)); SetDisplayId(m_owner->GetDisplayId()); if (!pInfo) { @@ -936,6 +997,13 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel + (petlevel / 4))); break; } + case 28017: // Bloodworms + { + SetCreateHealth(4 * petlevel); + SetBonusDamage(int32(m_owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.006f)); + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - 30 - (petlevel / 4))); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel - 30 + (petlevel / 4))); + } } break; } @@ -953,7 +1021,7 @@ bool Pet::HaveInDiet(ItemTemplate const* item) const if (!item->FoodType) return false; - CreatureTemplate const* cInfo = GetCreatureInfo(); + CreatureTemplate const* cInfo = GetCreatureTemplate(); if (!cInfo) return false; @@ -987,7 +1055,9 @@ void Pet::_LoadSpellCooldowns() m_CreatureSpellCooldowns.clear(); m_CreatureCategoryCooldowns.clear(); - QueryResult result = CharacterDatabase.PQuery("SELECT spell, time FROM pet_spell_cooldown WHERE guid = '%u'", m_charmInfo->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL_COOLDOWN); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -1030,7 +1100,9 @@ void Pet::_LoadSpellCooldowns() void Pet::_SaveSpellCooldowns(SQLTransaction& trans) { - trans->PAppend("DELETE FROM pet_spell_cooldown WHERE guid = '%u'", m_charmInfo->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_SPELL_COOLDOWNS); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + trans->Append(stmt); time_t curTime = time(NULL); @@ -1041,7 +1113,12 @@ void Pet::_SaveSpellCooldowns(SQLTransaction& trans) m_CreatureSpellCooldowns.erase(itr++); else { - trans->PAppend("INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES ('%u', '%u', '%u')", m_charmInfo->GetPetNumber(), itr->first, uint32(itr->second)); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET_SPELL_COOLDOWN); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + stmt->setUInt32(1, itr->first); + stmt->setUInt32(2, uint32(itr->second)); + trans->Append(stmt); + ++itr; } } @@ -1049,7 +1126,9 @@ void Pet::_SaveSpellCooldowns(SQLTransaction& trans) void Pet::_LoadSpells() { - QueryResult result = CharacterDatabase.PQuery("SELECT spell, active FROM pet_spell WHERE guid = '%u'", m_charmInfo->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -1073,18 +1152,37 @@ void Pet::_SaveSpells(SQLTransaction& trans) if (itr->second.type == PETSPELL_FAMILY) continue; + PreparedStatement* stmt; + switch (itr->second.state) { case PETSPELL_REMOVED: - trans->PAppend("DELETE FROM pet_spell WHERE guid = '%u' and spell = '%u'", m_charmInfo->GetPetNumber(), itr->first); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_SPELL_BY_SPELL); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + stmt->setUInt32(1, itr->first); + trans->Append(stmt); + m_spells.erase(itr); continue; case PETSPELL_CHANGED: - trans->PAppend("DELETE FROM pet_spell WHERE guid = '%u' and spell = '%u'", m_charmInfo->GetPetNumber(), itr->first); - trans->PAppend("INSERT INTO pet_spell (guid, spell, active) VALUES ('%u', '%u', '%u')", m_charmInfo->GetPetNumber(), itr->first, itr->second.active); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_SPELL_BY_SPELL); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + stmt->setUInt32(1, itr->first); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET_SPELL); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + stmt->setUInt32(1, itr->first); + stmt->setUInt8(2, itr->second.active); + trans->Append(stmt); + break; case PETSPELL_NEW: - trans->PAppend("INSERT INTO pet_spell (guid, spell, active) VALUES ('%u', '%u', '%u')", m_charmInfo->GetPetNumber(), itr->first, itr->second.active); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET_SPELL); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + stmt->setUInt32(1, itr->first); + stmt->setUInt8(2, itr->second.active); + trans->Append(stmt); break; case PETSPELL_UNCHANGED: continue; @@ -1097,7 +1195,9 @@ void Pet::_LoadAuras(uint32 timediff) { sLog->outDebug(LOG_FILTER_PETS, "Loading auras for pet %u", GetGUIDLow()); - QueryResult result = CharacterDatabase.PQuery("SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM pet_aura WHERE guid = '%u'", m_charmInfo->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_AURA); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -1167,9 +1267,11 @@ void Pet::_LoadAuras(uint32 timediff) void Pet::_SaveAuras(SQLTransaction& trans) { - trans->PAppend("DELETE FROM pet_aura WHERE guid = '%u'", m_charmInfo->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURAS); + stmt->setUInt32(0, m_charmInfo->GetPetNumber()); + trans->Append(stmt); - for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end() ; ++itr) + for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr) { // check if the aura has to be saved if (!itr->second->CanBeSaved() || IsPetAura(itr->second)) @@ -1201,11 +1303,26 @@ void Pet::_SaveAuras(SQLTransaction& trans) // don't save guid of caster in case we are caster of the spell - guid for pet is generated every pet load, so it won't match saved guid anyways uint64 casterGUID = (itr->second->GetCasterGUID() == GetGUID()) ? 0 : itr->second->GetCasterGUID(); - trans->PAppend("INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) " - "VALUES ('%u', '" UI64FMTD "', '%u', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')", - m_charmInfo->GetPetNumber(), casterGUID, itr->second->GetId(), effMask, recalculateMask, - itr->second->GetStackAmount(), damage[0], damage[1], damage[2], baseDamage[0], baseDamage[1], baseDamage[2], - itr->second->GetMaxDuration(), itr->second->GetDuration(), itr->second->GetCharges()); + uint8 index = 0; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET_AURA); + stmt->setUInt32(index++, m_charmInfo->GetPetNumber()); + stmt->setUInt64(index++, casterGUID); + stmt->setUInt32(index++, itr->second->GetId()); + stmt->setUInt8(index++, effMask); + stmt->setUInt8(index++, recalculateMask); + stmt->setUInt8(index++, itr->second->GetStackAmount()); + stmt->setInt32(index++, damage[0]); + stmt->setInt32(index++, damage[1]); + stmt->setInt32(index++, damage[2]); + stmt->setInt32(index++, baseDamage[0]); + stmt->setInt32(index++, baseDamage[1]); + stmt->setInt32(index++, baseDamage[2]); + stmt->setInt32(index++, itr->second->GetMaxDuration()); + stmt->setInt32(index++, itr->second->GetDuration()); + stmt->setUInt8(index++, itr->second->GetCharges()); + + trans->Append(stmt); } } @@ -1292,7 +1409,8 @@ bool Pet::addSpell(uint32 spellId, ActiveStates active /*= ACT_DECIDE*/, PetSpel { for (PetSpellMap::const_iterator itr2 = m_spells.begin(); itr2 != m_spells.end(); ++itr2) { - if (itr2->second.state == PETSPELL_REMOVED) continue; + if (itr2->second.state == PETSPELL_REMOVED) + continue; SpellInfo const* oldRankSpellInfo = sSpellMgr->GetSpellInfo(itr2->first); @@ -1361,7 +1479,7 @@ void Pet::InitLevelupSpellsForLevel() { uint8 level = getLevel(); - if (PetLevelupSpellSet const* levelupSpells = GetCreatureInfo()->family ? sSpellMgr->GetPetLevelupSpellList(GetCreatureInfo()->family) : NULL) + if (PetLevelupSpellSet const* levelupSpells = GetCreatureTemplate()->family ? sSpellMgr->GetPetLevelupSpellList(GetCreatureTemplate()->family) : NULL) { // PetLevelupSpellSet ordered by levels, process in reversed order for (PetLevelupSpellSet::const_reverse_iterator itr = levelupSpells->rbegin(); itr != levelupSpells->rend(); ++itr) @@ -1375,7 +1493,7 @@ void Pet::InitLevelupSpellsForLevel() } } - int32 petSpellsId = GetCreatureInfo()->PetSpellDataId ? -(int32)GetCreatureInfo()->PetSpellDataId : GetEntry(); + int32 petSpellsId = GetCreatureTemplate()->PetSpellDataId ? -(int32)GetCreatureTemplate()->PetSpellDataId : GetEntry(); // default spells (can be not learned if pet level (as owner level decrease result for example) less first possible in normal game) if (PetDefaultSpellsEntry const* defSpells = sSpellMgr->GetPetDefaultSpellsEntry(petSpellsId)) @@ -1499,7 +1617,7 @@ bool Pet::resetTalents() if (owner->ToPlayer()->HasAtLoginFlag(AT_LOGIN_RESET_PET_TALENTS)) owner->ToPlayer()->RemoveAtLoginFlag(AT_LOGIN_RESET_PET_TALENTS, true); - CreatureTemplate const* ci = GetCreatureInfo(); + CreatureTemplate const* ci = GetCreatureTemplate(); if (!ci) return false; // Check pet talent type @@ -1579,18 +1697,19 @@ void Pet::resetTalentsForAllPetsOf(Player* owner, Pet* online_pet /*= NULL*/) // now need only reset for offline pets (all pets except online case) uint32 except_petnumber = online_pet ? online_pet->GetCharmInfo()->GetPetNumber() : 0; - QueryResult resultPets = CharacterDatabase.PQuery( - "SELECT id FROM character_pet WHERE owner = '%u' AND id <> '%u'", - owner->GetGUIDLow(), except_petnumber); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET); + stmt->setUInt32(0, owner->GetGUIDLow()); + stmt->setUInt32(1, except_petnumber); + PreparedQueryResult resultPets = CharacterDatabase.Query(stmt); // no offline pets if (!resultPets) return; - QueryResult result = CharacterDatabase.PQuery( - "SELECT DISTINCT pet_spell.spell FROM pet_spell, character_pet " - "WHERE character_pet.owner = '%u' AND character_pet.id = pet_spell.guid AND character_pet.id <> %u", - owner->GetGUIDLow(), except_petnumber); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL_LIST); + stmt->setUInt32(0, owner->GetGUIDLow()); + stmt->setUInt32(1, except_petnumber); + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) return; @@ -1727,9 +1846,9 @@ bool Pet::IsPermanentPetFor(Player* owner) switch (owner->getClass()) { case CLASS_WARLOCK: - return GetCreatureInfo()->type == CREATURE_TYPE_DEMON; + return GetCreatureTemplate()->type == CREATURE_TYPE_DEMON; case CLASS_DEATH_KNIGHT: - return GetCreatureInfo()->type == CREATURE_TYPE_UNDEAD; + return GetCreatureTemplate()->type == CREATURE_TYPE_UNDEAD; case CLASS_MAGE: return GetCreatureInfo()->type == CREATURE_TYPE_ELEMENTAL; default: @@ -1770,7 +1889,7 @@ bool Pet::HasSpell(uint32 spell) const // Get all passive spells in our skill line void Pet::LearnPetPassives() { - CreatureTemplate const* cInfo = GetCreatureInfo(); + CreatureTemplate const* cInfo = GetCreatureTemplate(); if (!cInfo) return; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2c9747312af..d62e0ccfd53 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -145,7 +145,6 @@ static uint32 copseReclaimDelay[MAX_DEATH_COUNT] = { 30, 60, 120 }; PlayerTaxi::PlayerTaxi() { - // Taxi nodes memset(m_taximask, 0, sizeof(m_taximask)); } @@ -541,7 +540,7 @@ inline void KillRewarder::_RewardKillCredit(Player* player) // 4.4. Give kill credit (player must not be in group, or he must be alive or without corpse). if (!_group || player->isAlive() || !player->GetCorpse()) if (_victim->GetTypeId() == TYPEID_UNIT) - player->KilledMonster(_victim->ToCreature()->GetCreatureInfo(), _victim->GetGUID()); + player->KilledMonster(_victim->ToCreature()->GetCreatureTemplate(), _victim->GetGUID()); } void KillRewarder::_RewardPlayer(Player* player, bool isDungeon) @@ -844,6 +843,10 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep isDebugAreaTriggers = false; + m_WeeklyQuestChanged = false; + + m_SeasonalQuestChanged = false; + SetPendingBind(0, 0); } @@ -862,7 +865,7 @@ Player::~Player() delete _talentMgr; //all mailed items should be deleted, also all mail should be deallocated - for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) + for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) delete *itr; for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter) @@ -909,7 +912,8 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class); if (!info) { - sLog->outError("Player (Name %s) has incorrect race/class pair. Can't be loaded.", m_name.c_str()); + sLog->outError("Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid race/class pair (%u/%u) - refusing to do so.", + GetSession()->GetAccountId(), m_name.c_str(), createInfo->Race, createInfo->Class); return false; } @@ -921,7 +925,8 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class); if (!cEntry) { - sLog->outError("Class %u not found in DBC (Wrong DBC files?)", createInfo->Class); + sLog->outError("Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid character class (%u) - refusing to do so (wrong DBC-files?)", + GetSession()->GetAccountId(), m_name.c_str(), createInfo->Class); return false; } @@ -936,7 +941,8 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) if (!IsValidGender(createInfo->Gender)) { - sLog->outError("Player has invalid gender (%hu), can't be loaded.", createInfo->Gender); + sLog->outError("Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%hu) - refusing to do so", + GetSession()->GetAccountId(), m_name.c_str(), createInfo->Gender); return false; } @@ -1101,10 +1107,10 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) if (oEntry->ItemId[j] <= 0) continue; - uint32 item_id = oEntry->ItemId[j]; + uint32 itemId = oEntry->ItemId[j]; // just skip, reported in ObjectMgr::LoadItemTemplates - ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(item_id); + ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId); if (!iProto) continue; @@ -1126,7 +1132,7 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) if (iProto->GetMaxStackSize() < count) count = iProto->GetMaxStackSize(); } - StoreNewItemInBestSlots(item_id, count); + StoreNewItemInBestSlots(itemId, count); } } @@ -1390,14 +1396,14 @@ void Player::HandleDrowning(uint32 time_diff) SendMirrorTimer(FATIGUE_TIMER, DarkWaterTime, m_MirrorTimer[FATIGUE_TIMER], 10); } - if (m_MirrorTimerFlags & (UNDERWATER_INLAVA|UNDERWATER_INSLIME)) + if (m_MirrorTimerFlags & (UNDERWATER_INLAVA /*| UNDERWATER_INSLIME*/) && !(_lastLiquid && _lastLiquid->SpellId)) { // Breath timer not activated - activate it if (m_MirrorTimer[FIRE_TIMER] == DISABLED_MIRROR_TIMER) m_MirrorTimer[FIRE_TIMER] = getMaxTimer(FIRE_TIMER); else { - m_MirrorTimer[FIRE_TIMER]-=time_diff; + m_MirrorTimer[FIRE_TIMER] -= time_diff; if (m_MirrorTimer[FIRE_TIMER] < 0) { m_MirrorTimer[FIRE_TIMER]+= 1*IN_MILLISECONDS; @@ -1408,8 +1414,8 @@ void Player::HandleDrowning(uint32 time_diff) EnvironmentalDamage(DAMAGE_LAVA, damage); // need to skip Slime damage in Undercity, // maybe someone can find better way to handle environmental damage - else if (m_zoneUpdateId != 1497) - EnvironmentalDamage(DAMAGE_SLIME, damage); + //else if (m_zoneUpdateId != 1497) + // EnvironmentalDamage(DAMAGE_SLIME, damage); } } } @@ -1562,14 +1568,14 @@ void Player::Update(uint32 p_time) if (HasUnitState(UNIT_STATE_MELEE_ATTACKING) && !HasUnitState(UNIT_STATE_CASTING)) { - if (Unit* pVictim = getVictim()) + if (Unit* victim = getVictim()) { // default combat reach 10 // TODO add weapon, skill check if (isAttackReady(BASE_ATTACK)) { - if (!IsWithinMeleeRange(pVictim)) + if (!IsWithinMeleeRange(victim)) { setAttackTimer(BASE_ATTACK, 100); if (m_swingErrorMsg != 1) // send single time (client auto repeat) @@ -1579,7 +1585,7 @@ void Player::Update(uint32 p_time) } } //120 degrees of radiant range - else if (!HasInArc(2*M_PI/3, pVictim)) + else if (!HasInArc(2*M_PI/3, victim)) { setAttackTimer(BASE_ATTACK, 100); if (m_swingErrorMsg != 2) // send single time (client auto repeat) @@ -1598,16 +1604,16 @@ void Player::Update(uint32 p_time) setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY); // do attack - AttackerStateUpdate(pVictim, BASE_ATTACK); + AttackerStateUpdate(victim, BASE_ATTACK); resetAttackTimer(BASE_ATTACK); } } if (haveOffhandWeapon() && isAttackReady(OFF_ATTACK)) { - if (!IsWithinMeleeRange(pVictim)) + if (!IsWithinMeleeRange(victim)) setAttackTimer(OFF_ATTACK, 100); - else if (!HasInArc(2*M_PI/3, pVictim)) + else if (!HasInArc(2*M_PI/3, victim)) setAttackTimer(OFF_ATTACK, 100); else { @@ -1616,13 +1622,13 @@ void Player::Update(uint32 p_time) setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY); // do attack - AttackerStateUpdate(pVictim, OFF_ATTACK); + AttackerStateUpdate(victim, OFF_ATTACK); resetAttackTimer(OFF_ATTACK); } } - /*Unit* owner = pVictim->GetOwner(); - Unit* u = owner ? owner : pVictim; + /*Unit* owner = victim->GetOwner(); + Unit* u = owner ? owner : victim; if (u->IsPvP() && (!duel || duel->opponent != u)) { UpdatePvP(true); @@ -2208,7 +2214,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (duel && GetMapId() != mapid && GetMap()->GetGameObject(GetUInt64Value(PLAYER_DUEL_ARBITER))) DuelComplete(DUEL_FLED); - if ((GetMapId() == mapid && !m_transport) || (GetTransport() && GetMapId() == 628)) + if (GetMapId() == mapid) { //lets reset far teleport flag if it wasn't reset during chained teleports SetSemaphoreTeleportFar(false); @@ -2774,11 +2780,11 @@ Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask) return NULL; // Deathstate checks - if (!isAlive() && !(creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_GHOST)) + if (!isAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_GHOST)) return NULL; // alive or spirit healer - if (!creature->isAlive() && !(creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_DEAD_INTERACT)) + if (!creature->isAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_DEAD_INTERACT)) return NULL; // appropriate npc type @@ -3019,7 +3025,7 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate) if (xp < 1) return; - if (!isAlive()) + if (!isAlive() && !GetBattlegroundId()) return; if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) @@ -3231,7 +3237,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // reset size before reapply auras - SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); + SetObjectScale(1.0f); // save base values (bonuses already included in stored stats for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) @@ -3501,7 +3507,7 @@ void Player::AddNewMailDeliverTime(time_t deliver_time) else // not ready and no have ready mails { if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time) - m_nextMailDelivereTime = deliver_time; + m_nextMailDelivereTime = deliver_time; } } @@ -3773,9 +3779,12 @@ bool Player::addSpell(uint32 spellId, bool active, bool learning, bool dependent { for (PlayerSpellMap::iterator itr2 = m_spells.begin(); itr2 != m_spells.end(); ++itr2) { - if (itr2->second->state == PLAYERSPELL_REMOVED) continue; + if (itr2->second->state == PLAYERSPELL_REMOVED) + continue; + SpellInfo const* i_spellInfo = sSpellMgr->GetSpellInfo(itr2->first); - if (!i_spellInfo) continue; + if (!i_spellInfo) + continue; if (spellInfo->IsDifferentRankOf(i_spellInfo)) { @@ -3873,7 +3882,7 @@ bool Player::addSpell(uint32 spellId, bool active, bool learning, bool dependent uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue; if (skill_max_value < new_skill_max_value) - skill_max_value = new_skill_max_value; + skill_max_value = new_skill_max_value; SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value); } @@ -4160,11 +4169,11 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank) // most likely will never be used, haven't heard of cases where players unlearn a mount if (Has310Flyer(false) && _spell_idx->second->skillId == SKILL_MOUNTS) { - SpellInfo const* pSpellInfo = sSpellMgr->GetSpellInfo(spell_id); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (pSpellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && - pSpellInfo->Effects[i].CalcValue() == 310) - Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag + if (spellInfo) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && + spellInfo->Effects[i].CalcValue() == 310) + Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag } } } @@ -4253,7 +4262,7 @@ bool Player::Has310Flyer(bool checkAllSpells, uint32 excludeSpellId) else { SetHas310Flyer(false); - SpellInfo const* pSpellInfo; + SpellInfo const* spellInfo; for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) { if (itr->first == excludeSpellId) @@ -4265,10 +4274,10 @@ bool Player::Has310Flyer(bool checkAllSpells, uint32 excludeSpellId) if (_spell_idx->second->skillId != SKILL_MOUNTS) break; // We can break because mount spells belong only to one skillline (at least 310 flyers do) - pSpellInfo = sSpellMgr->GetSpellInfo(itr->first); + spellInfo = sSpellMgr->GetSpellInfo(itr->first); for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (pSpellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && - pSpellInfo->Effects[i].CalcValue() == 310) + if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && + spellInfo->Effects[i].CalcValue() == 310) { SetHas310Flyer(true); return true; @@ -4394,7 +4403,9 @@ void Player::_LoadSpellCooldowns(PreparedQueryResult result) void Player::_SaveSpellCooldowns(SQLTransaction& trans) { - trans->PAppend("DELETE FROM character_spell_cooldown WHERE guid = '%u'", GetGUIDLow()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN); + stmt->setUInt32(0, GetGUIDLow()); + trans->Append(stmt); time_t curTime = time(NULL); time_t infTime = curTime + infinityCooldownDelayCheck; @@ -4560,7 +4571,7 @@ bool Player::ResetTalents(bool no_cost) /* when prev line will dropped use next line if (Pet* pet = GetPet()) { - if (pet->getPetType() == HUNTER_PET && !pet->GetCreatureInfo()->isTameable(CanTameExoticPets())) + if (pet->getPetType() == HUNTER_PET && !pet->GetCreatureTemplate()->isTameable(CanTameExoticPets())) RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true); } */ @@ -4716,9 +4727,9 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c Unit::BuildCreateUpdateBlockForPlayer(data, target); } -void Player::DestroyForPlayer(Player* target, bool anim) const +void Player::DestroyForPlayer(Player* target, bool onDeath) const { - Unit::DestroyForPlayer(target, anim); + Unit::DestroyForPlayer(target, onDeath); for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i) { @@ -4773,7 +4784,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell return TRAINER_SPELL_RED; bool hasSpell = true; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS ; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (!trainer_spell->learnedSpell[i]) continue; @@ -4796,7 +4807,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell if (getLevel() < trainer_spell->reqLevel) return TRAINER_SPELL_RED; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS ; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (!trainer_spell->learnedSpell[i]) continue; @@ -4823,7 +4834,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell // check primary prof. limit // first rank of primary profession spell when there are no proffesions avalible is disabled - for (uint8 i = 0; i < MAX_SPELL_EFFECTS ; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (!trainer_spell->learnedSpell[i]) continue; @@ -4875,7 +4886,10 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC LeaveAllArenaTeams(playerguid); // the player was uninvited already on logout so just remove from group - QueryResult resultGroup = CharacterDatabase.PQuery("SELECT guid FROM group_member WHERE memberGuid=%u", guid); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER); + stmt->setUInt32(0, guid); + PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt); + if (resultGroup) if (Group* group = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32())) RemoveFromGroup(group, playerguid); @@ -4889,32 +4903,41 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC case CHAR_DELETE_REMOVE: { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - // Return back all mails with COD and Item 0 1 2 3 4 5 6 7 - QueryResult resultMail = CharacterDatabase.PQuery("SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver='%u' AND has_items<>0 AND cod<>0", guid); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL); + stmt->setUInt32(0, guid); + PreparedQueryResult resultMail = CharacterDatabase.Query(stmt); + if (resultMail) { do { - Field* fields = resultMail->Fetch(); + Field* mailFields = resultMail->Fetch(); - uint32 mail_id = fields[0].GetUInt32(); - uint16 mailType = fields[1].GetUInt16(); - uint16 mailTemplateId= fields[2].GetUInt16(); - uint32 sender = fields[3].GetUInt32(); - std::string subject = fields[4].GetString(); - std::string body = fields[5].GetString(); - uint32 money = fields[6].GetUInt32(); - bool has_items = fields[7].GetBool(); + uint32 mail_id = mailFields[0].GetUInt32(); + uint8 mailType = mailFields[1].GetUInt8(); + uint16 mailTemplateId= mailFields[2].GetUInt16(); + uint32 sender = mailFields[3].GetUInt32(); + std::string subject = mailFields[4].GetString(); + std::string body = mailFields[5].GetString(); + uint32 money = mailFields[6].GetUInt32(); + bool has_items = mailFields[7].GetBool(); // We can return mail now // So firstly delete the old one - trans->PAppend("DELETE FROM mail WHERE id = '%u'", mail_id); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); + stmt->setUInt32(0, mail_id); + trans->Append(stmt); // Mail is not from player if (mailType != MAIL_NORMAL) { if (has_items) - trans->PAppend("DELETE FROM mail_items WHERE mail_id = '%u'", mail_id); + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); + stmt->setUInt32(0, mail_id); + trans->Append(stmt); + } continue; } @@ -4932,9 +4955,9 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC { do { - Field* fields2 = resultItems->Fetch(); - uint32 item_guidlow = fields2[11].GetUInt32(); - uint32 item_template = fields2[12].GetUInt32(); + Field* itemFields = resultItems->Fetch(); + uint32 item_guidlow = itemFields[11].GetUInt32(); + uint32 item_template = itemFields[12].GetUInt32(); ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(item_template); if (!itemProto) @@ -4946,7 +4969,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC } Item* pItem = NewItemOrBag(itemProto); - if (!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER), fields, item_template)) + if (!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER), itemFields, item_template)) { pItem->FSetState(ITEM_REMOVED); pItem->SaveToDB(trans); // it also deletes item object! @@ -4959,7 +4982,9 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC } } - trans->PAppend("DELETE FROM mail_items WHERE mail_id = '%u'", mail_id); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); + stmt->setUInt32(0, mail_id); + trans->Append(stmt); uint32 pl_account = sObjectMgr->GetPlayerAccountIdByGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)); @@ -4970,7 +4995,11 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet. // NOW we can finally clear other DB data related to character - if (QueryResult resultPets = CharacterDatabase.PQuery("SELECT id FROM character_pet WHERE owner = '%u'", guid)) + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PETS); + stmt->setUInt32(0, guid); + PreparedQueryResult resultPets = CharacterDatabase.Query(stmt); + + if (resultPets) { do { @@ -4980,7 +5009,11 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC } // Delete char from social list of online chars - if (QueryResult resultFriends = CharacterDatabase.PQuery("SELECT DISTINCT guid FROM character_social WHERE friend = '%u'", guid)) + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL); + stmt->setUInt32(0, guid); + PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt); + + if (resultFriends) { do { @@ -4995,48 +5028,134 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC } while (resultFriends->NextRow()); } - trans->PAppend("DELETE FROM characters WHERE guid = '%u'", guid); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER); stmt->setUInt32(0, guid); trans->Append(stmt); - trans->PAppend("DELETE FROM character_declinedname WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_action WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_aura WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_gifts WHERE guid = '%u'", guid); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT); + stmt->setUInt32(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND); stmt->setUInt32(0, guid); trans->Append(stmt); - trans->PAppend("DELETE FROM character_instance WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_inventory WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_queststatus WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_queststatus_rewarded WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_reputation WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_spell WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_spell_cooldown WHERE guid = '%u'", guid); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN); + stmt->setUInt32(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS); stmt->setUInt32(0, guid); trans->Append(stmt); - trans->PAppend("DELETE FROM item_instance WHERE owner_guid = '%u'", guid); - trans->PAppend("DELETE FROM character_social WHERE guid = '%u' OR friend='%u'", guid, guid); - trans->PAppend("DELETE FROM mail WHERE receiver = '%u'", guid); - trans->PAppend("DELETE FROM mail_items WHERE receiver = '%u'", guid); - trans->PAppend("DELETE FROM character_pet WHERE owner = '%u'", guid); - trans->PAppend("DELETE FROM character_pet_declinedname WHERE owner = '%u'", guid); - trans->PAppend("DELETE FROM character_achievement WHERE guid = '%u' " // NOTE: These achievements have flags & 256 in DBC. - "AND achievement NOT BETWEEN '456' AND '467' " // Realm First Level 80 - "AND achievement NOT BETWEEN '1400' AND '1427' " // Realm First Raid Achievements - "AND achievement NOT IN(1463, 3117, 3259) ", guid); // Realm First Northen Vanguard + Raid Achievements - trans->PAppend("DELETE FROM character_achievement_progress WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_equipmentsets WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM guild_eventlog WHERE PlayerGuid1 = '%u' OR PlayerGuid2 = '%u'", guid, guid); - trans->PAppend("DELETE FROM guild_bank_eventlog WHERE PlayerGuid = '%u'", guid); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER); + stmt->setUInt32(0, guid); + stmt->setUInt32(1, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER); + stmt->setUInt32(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_BGDATA); stmt->setUInt32(0, guid); trans->Append(stmt); - trans->PAppend("DELETE FROM character_glyphs WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_queststatus_daily WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_talent WHERE guid = '%u'", guid); - trans->PAppend("DELETE FROM character_skills WHERE guid = '%u'", guid); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_DAILY); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT); + stmt->setUInt32(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS); + stmt->setUInt32(0, guid); + trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); break; @@ -5084,15 +5203,19 @@ void Player::DeleteOldCharacters(uint32 keepDays) { sLog->outString("Player::DeleteOldChars: Deleting all characters which have been deleted %u days before...", keepDays); - QueryResult resultChars = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < '%u'", uint32(time(NULL) - time_t(keepDays * DAY))); - if (resultChars) + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_OLD_CHARS); + stmt->setUInt32(0, uint32(time(NULL) - time_t(keepDays * DAY))); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) { - sLog->outString("Player::DeleteOldChars: Found " UI64FMTD " character(s) to delete", resultChars->GetRowCount()); + sLog->outString("Player::DeleteOldChars: Found " UI64FMTD " character(s) to delete", result->GetRowCount()); do { - Field* charFields = resultChars->Fetch(); - Player::DeleteFromDB(charFields[0].GetUInt64(), charFields[1].GetUInt32(), true, true); - } while (resultChars->NextRow()); + Field* fields = result->Fetch(); + Player::DeleteFromDB(fields[0].GetUInt32(), fields[1].GetUInt32(), true, true); + } + while (result->NextRow()); } } @@ -5332,7 +5455,7 @@ void Player::CreateCorpse() iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID; iIventoryType = m_items[i]->GetTemplate()->InventoryType; - _cfi = iDisplayID | (iIventoryType << 24); + _cfi = iDisplayID | (iIventoryType << 24); corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi); } } @@ -5388,7 +5511,7 @@ void Player::DurabilityLoss(Item* item, double percent) if (!item) return; - uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY); + uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY); if (!pMaxDurability) return; @@ -6311,7 +6434,7 @@ void Player::UpdateWeaponSkill(WeaponAttackType attType) if (GetShapeshiftForm() == FORM_TREE) return; // use weapon but not skill up - if (victim && victim->GetTypeId() == TYPEID_UNIT && (victim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_SKILLGAIN)) + if (victim && victim->GetTypeId() == TYPEID_UNIT && (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_SKILLGAIN)) return; uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON); @@ -6631,7 +6754,7 @@ uint16 Player::GetBaseSkillValue(uint32 skill) const return 0; int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)))); - result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos))); + result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos))); return result < 0 ? 0 : result; } @@ -6795,11 +6918,6 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, bool t if (GetGroup()) SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); - // code block for underwater state update - // Unit::UpdatePosition() checks for validity and updates our coordinates - // so we re-fetch them instead of using "raw" coordinates from function params - UpdateUnderwaterState(GetMap(), GetPositionX(), GetPositionY(), GetPositionZ()); - if (GetTrader() && !IsWithinDistInMap(GetTrader(), INTERACTION_DISTANCE)) GetSession()->SendCancelTrade(); @@ -6879,7 +6997,7 @@ void Player::CheckAreaExploreAndOutdoor() if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !isOutdoor) RemoveAurasWithAttribute(SPELL_ATTR0_OUTDOORS_ONLY); - if (areaFlag==0xffff) + if (areaFlag == 0xffff) return; int offset = areaFlag / 32; @@ -6898,21 +7016,23 @@ void Player::CheckAreaExploreAndOutdoor() GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA); - AreaTableEntry const* p = GetAreaEntryByAreaFlagAndMap(areaFlag, GetMapId()); - if (!p) + AreaTableEntry const* areaEntry = GetAreaEntryByAreaFlagAndMap(areaFlag, GetMapId()); + if (!areaEntry) { - sLog->outError("PLAYER: Player %u discovered unknown area (x: %f y: %f map: %u", GetGUIDLow(), GetPositionX(), GetPositionY(), GetMapId()); + sLog->outError("Player %u discovered unknown area (x: %f y: %f z: %f map: %u", GetGUIDLow(), GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId()); + return; } - else if (p->area_level > 0) + + if (areaEntry->area_level > 0) { - uint32 area = p->ID; + uint32 area = areaEntry->ID; if (getLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { SendExplorationExperience(area, 0); } else { - int32 diff = int32(getLevel()) - p->area_level; + int32 diff = int32(getLevel()) - areaEntry->area_level; uint32 XP = 0; if (diff < -5) { @@ -6926,17 +7046,17 @@ void Player::CheckAreaExploreAndOutdoor() else if (exploration_percent < 0) exploration_percent = 0; - XP = uint32(sObjectMgr->GetBaseXP(p->area_level)*exploration_percent/100*sWorld->getRate(RATE_XP_EXPLORE)); + XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*exploration_percent/100*sWorld->getRate(RATE_XP_EXPLORE)); } else { - XP = uint32(sObjectMgr->GetBaseXP(p->area_level)*sWorld->getRate(RATE_XP_EXPLORE)); + XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*sWorld->getRate(RATE_XP_EXPLORE)); } GiveXP(XP, NULL); SendExplorationExperience(area, XP); } - sLog->outDetail("PLAYER: Player %u discovered a new area: %u", GetGUIDLow(), area); + sLog->outDetail("Player %u discovered a new area: %u", GetGUIDLow(), area); } } } @@ -7003,15 +7123,15 @@ int32 Player::CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, in } //Calculates how many reputation points player gains in victim's enemy factions -void Player::RewardReputation(Unit* pVictim, float rate) +void Player::RewardReputation(Unit* victim, float rate) { - if (!pVictim || pVictim->GetTypeId() == TYPEID_PLAYER) + if (!victim || victim->GetTypeId() == TYPEID_PLAYER) return; - if (pVictim->ToCreature()->IsReputationGainDisabled()) + if (victim->ToCreature()->IsReputationGainDisabled()) return; - ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(pVictim->ToCreature()->GetCreatureInfo()->Entry); + ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry); if (!Rep) return; @@ -7053,7 +7173,7 @@ void Player::RewardReputation(Unit* pVictim, float rate) if (Rep->RepFaction1 && (!Rep->TeamDependent || team == ALLIANCE)) { - int32 donerep1 = CalculateReputationGain(pVictim->getLevel(), Rep->RepValue1, ChampioningFaction ? ChampioningFaction : Rep->RepFaction1, false); + int32 donerep1 = CalculateReputationGain(victim->getLevel(), Rep->RepValue1, ChampioningFaction ? ChampioningFaction : Rep->RepFaction1, false); donerep1 = int32(donerep1*(rate + favored_rep_mult)); if (recruitAFriend) @@ -7067,7 +7187,7 @@ void Player::RewardReputation(Unit* pVictim, float rate) if (Rep->RepFaction2 && (!Rep->TeamDependent || team == HORDE)) { - int32 donerep2 = CalculateReputationGain(pVictim->getLevel(), Rep->RepValue2, ChampioningFaction ? ChampioningFaction : Rep->RepFaction2, false); + int32 donerep2 = CalculateReputationGain(victim->getLevel(), Rep->RepValue2, ChampioningFaction ? ChampioningFaction : Rep->RepFaction2, false); donerep2 = int32(donerep2*(rate + favored_rep_mult)); if (recruitAFriend) @@ -7490,10 +7610,13 @@ uint32 Player::GetGuildIdFromGuid(uint64 guid) uint8 Player::GetRankFromDB(uint64 guid) { - QueryResult result = CharacterDatabase.PQuery("SELECT rank FROM guild_member WHERE guid='%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER); + stmt->setUInt32(0, GUID_LOPART(guid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { - uint32 v = result->Fetch()[0].GetUInt8(); + uint32 v = result->Fetch()[1].GetUInt8(); return v; } else @@ -7502,7 +7625,11 @@ uint8 Player::GetRankFromDB(uint64 guid) uint32 Player::GetArenaTeamIdFromDB(uint64 guid, uint8 type) { - QueryResult result = CharacterDatabase.PQuery("SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid='%u' AND type='%u' LIMIT 1", GUID_LOPART(guid), type); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID); + stmt->setUInt32(0, GUID_LOPART(guid)); + stmt->setUInt8(1, type); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return 0; @@ -7513,7 +7640,10 @@ uint32 Player::GetArenaTeamIdFromDB(uint64 guid, uint8 type) uint32 Player::GetZoneIdFromDB(uint64 guid) { uint32 guidLow = GUID_LOPART(guid); - QueryResult result = CharacterDatabase.PQuery("SELECT zone FROM characters WHERE guid='%u'", guidLow); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_ZONE); + stmt->setUInt32(0, guidLow); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return 0; Field* fields = result->Fetch(); @@ -7522,7 +7652,10 @@ uint32 Player::GetZoneIdFromDB(uint64 guid) if (!zone) { // stored zone is zero, use generic and slow zone detection - result = CharacterDatabase.PQuery("SELECT map, position_x, position_y, position_z FROM characters WHERE guid='%u'", guidLow); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ); + stmt->setUInt32(0, guidLow); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return 0; fields = result->Fetch(); @@ -7549,7 +7682,10 @@ uint32 Player::GetZoneIdFromDB(uint64 guid) uint32 Player::GetLevelFromDB(uint64 guid) { - QueryResult result = CharacterDatabase.PQuery("SELECT level FROM characters WHERE guid='%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_LEVEL); + stmt->setUInt32(0, GUID_LOPART(guid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return 0; @@ -7593,17 +7729,15 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) } // group update - if (GetGroup()) + if (Group* group = GetGroup()) { SetGroupUpdateFlag(GROUP_UPDATE_FULL); - Group* grp = GetGroup(); - if (GetSession() && grp->isLFGGroup() && sLFGMgr->IsTeleported(GetGUID())) + if (GetSession() && group->isLFGGroup() && sLFGMgr->IsTeleported(GetGUID())) { - for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - Player* tempplr = itr->getSource(); - if (tempplr) - GetSession()->SendNameQueryOpcode(tempplr->GetGUID()); + if (Player* member = itr->getSource()) + GetSession()->SendNameQueryOpcode(member->GetGUID()); } } } @@ -7620,9 +7754,8 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) if (sWorld->getBoolConfig(CONFIG_WEATHER)) { - Weather* wth = WeatherMgr::FindWeather(zone->ID); - if (wth) - wth->SendWeatherUpdateToPlayer(this); + if (Weather* weather = WeatherMgr::FindWeather(zone->ID)) + weather->SendWeatherUpdateToPlayer(this); else { if (!WeatherMgr::AddWeather(zone->ID)) @@ -7633,6 +7766,8 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) } } + sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea); + // in PvP, any not controlled zone (except zone->team == 6, default case) // in PvE, only opposition team capital switch (zone->team) @@ -7652,7 +7787,7 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) break; } - if (zone->flags & AREA_FLAG_CAPITAL) // in capital city + if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city { if (!pvpInfo.inHostileArea || zone->IsSanctuary()) { @@ -7662,19 +7797,21 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) } pvpInfo.inNoPvPArea = true; } - else // anywhere else + else { - if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) // but resting (walk from city or maybe in tavern or leave tavern recently) + if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) { - if (GetRestType() == REST_TYPE_IN_TAVERN) // has been in tavern. Is still in? + if (GetRestType() == REST_TYPE_IN_TAVERN) // Still inside a tavern or has recently left { - if (GetMapId() != GetInnPosMapId() || sqrt((GetPositionX()-GetInnPosX())*(GetPositionX()-GetInnPosX())+(GetPositionY()-GetInnPosY())*(GetPositionY()-GetInnPosY())+(GetPositionZ()-GetInnPosZ())*(GetPositionZ()-GetInnPosZ()))>40) + // Remove rest state if we have recently left a tavern. + // Why is 40 yd hardcoded? + if (GetMapId() != GetInnPosMapId() || GetExactDist(GetInnPosX(), GetInnPosY(), GetInnPosZ()) > 40.0f) { RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); SetRestType(REST_TYPE_NO); } } - else // not in tavern (leave city then) + else // Recently left a capital city { RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); SetRestType(REST_TYPE_NO); @@ -8223,6 +8360,10 @@ void Player::_ApplyWeaponDependentAuraMods(Item* item, WeaponAttackType attackTy void Player::_ApplyWeaponDependentAuraCritMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply) { + // don't apply mod if item is broken or cannot be used + if (item->IsBroken() || !CanUseAttackType(attackType)) + return; + // generic not weapon specific case processes in aura code if (aura->GetSpellInfo()->EquippedItemClass == -1) return; @@ -8236,13 +8377,13 @@ void Player::_ApplyWeaponDependentAuraCritMod(Item* item, WeaponAttackType attac default: return; } - if (!item->IsBroken()&&item->IsFitToSpellRequirements(aura->GetSpellInfo())) + if (item->IsFitToSpellRequirements(aura->GetSpellInfo())) HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply); } void Player::_ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply) { - //don't apply mod if item is broken + // don't apply mod if item is broken or cannot be used if (item->IsBroken() || !CanUseAttackType(attackType)) return; @@ -8473,13 +8614,15 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 { uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot)); SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!pEnchant) continue; + if (!pEnchant) + continue; + for (uint8 s = 0; s < MAX_ITEM_ENCHANTMENT_EFFECTS; ++s) { if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL) continue; - SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id); + SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id); if (entry && entry->procEx) { @@ -8791,7 +8934,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type) if (go->getLootState() == GO_READY) { - uint32 lootid = go->GetGOInfo()->GetLootId(); + uint32 lootid = go->GetGOInfo()->GetLootId(); //TODO: fix this big hack if ((go->GetEntry() == BG_AV_OBJECTID_MINE_N || go->GetEntry() == BG_AV_OBJECTID_MINE_S)) @@ -8966,7 +9109,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type) creature->lootForPickPocketed = true; loot->clear(); - if (uint32 lootid = creature->GetCreatureInfo()->pickpocketLootId) + if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId) loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true); // Generate extra money for pick pocket loot @@ -9013,7 +9156,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type) if (loot_type == LOOT_SKINNING) { loot->clear(); - loot->FillLoot(creature->GetCreatureInfo()->SkinLootId, LootTemplates_Skinning, this, true); + loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true); permission = OWNER_PERMISSION; } // set group rights only for loot_type != LOOT_SKINNING @@ -9179,6 +9322,9 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) case 4100: // The Culling of Stratholme NumberOfFields = 13; break; + case 4273: // Ulduar + NumberOfFields = 10; + break; default: NumberOfFields = 12; break; @@ -9723,6 +9869,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW } break; + // Ulduar + case 4273: + if (instance && mapid == 603) + instance->FillInitialWorldStates(data); + else + { + data << uint32(4132) << uint32(0); // 9 WORLDSTATE_SHOW_CRATES + data << uint32(4131) << uint32(0); // 10 WORLDSTATE_CRATES_REVEALED + } + break; default: data << uint32(0x914) << uint32(0x0); // 7 data << uint32(0x913) << uint32(0x0); // 8 @@ -10106,7 +10262,8 @@ uint32 Player::GetItemCount(uint32 item, bool inBankAlso, Item* skipItem) const if (inBankAlso) { - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i) + // checking every item from 39 to 74 (including bank bags) + for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) if (pItem != skipItem && pItem->GetEntry() == item) count += pItem->GetCount(); @@ -10146,7 +10303,7 @@ uint32 Player::GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipIte if (Bag* pBag = GetBagByPos(i)) count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem); - for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i) + for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) if (pItem != skipItem) if (ItemTemplate const* pProto = pItem->GetTemplate()) @@ -10172,7 +10329,7 @@ Item* Player::GetItemByGuid(uint64 guid) const if (pItem->GetGUID() == guid) return pItem; - for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i) + for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) if (pItem->GetGUID() == guid) return pItem; @@ -11283,7 +11440,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const Item* pItem = pItems[k]; // no item - if (!pItem) continue; + if (!pItem) + continue; sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanStoreItems %i. item = %u, count = %u", k + 1, pItem->GetEntry(), pItem->GetCount()); ItemTemplate const* pProto = pItem->GetTemplate(); @@ -11322,7 +11480,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const break; } } - if (b_found) continue; + if (b_found) + continue; for (int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t) { @@ -11334,7 +11493,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const break; } } - if (b_found) continue; + if (b_found) + continue; for (int t = INVENTORY_SLOT_ITEM_START; t < INVENTORY_SLOT_ITEM_END; ++t) { @@ -11346,7 +11506,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const break; } } - if (b_found) continue; + if (b_found) + continue; for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t) { @@ -11367,7 +11528,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const } } } - if (b_found) continue; + if (b_found) + continue; } // special bag case @@ -11388,7 +11550,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const } } - if (b_found) continue; + if (b_found) + continue; if (pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS) { @@ -11403,7 +11566,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const } } - if (b_found) continue; + if (b_found) + continue; for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t) { @@ -11427,7 +11591,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const } } } - if (b_found) continue; + if (b_found) + continue; } // search free slot @@ -11441,7 +11606,8 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const break; } } - if (b_found) continue; + if (b_found) + continue; // search free slot in bags for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t) @@ -11606,8 +11772,8 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool Item* offItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); ItemPosCountVec off_dest; if (offItem && (!not_loading || - CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND, false) != EQUIP_ERR_OK || - CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK)) + CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND, false) != EQUIP_ERR_OK || + CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK)) return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL; } } @@ -11667,7 +11833,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest uint32 count = pItem->GetCount(); - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanBankItem bag = %u, slot = %u, item = %u, count = %u", bag, slot, pItem->GetEntry(), pItem->GetCount()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanBankItem bag = %u, slot = %u, item = %u, count = %u", bag, slot, pItem->GetEntry(), pItem->GetCount()); ItemTemplate const* pProto = pItem->GetTemplate(); if (!pProto) return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; @@ -11851,7 +12017,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const { if (pItem) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanUseItem item = %u", pItem->GetEntry()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanUseItem item = %u", pItem->GetEntry()); if (!isAlive() && not_loading) return EQUIP_ERR_YOU_ARE_DEAD; @@ -11959,7 +12125,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje Map const* map = lootedObject->GetMap(); if (uint32 dungeonId = sLFGMgr->GetDungeon(GetGroup()->GetGUID(), true)) if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId)) - if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty()) + if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == uint32(map->GetDifficulty())) lootedObjectInDungeon = true; if (!lootedObjectInDungeon) @@ -12055,16 +12221,11 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update pItem->SetItemRandomProperties(randomPropertyId); pItem = StoreItem(dest, pItem, update); - const ItemTemplate* proto = pItem->GetTemplate(); - for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) - if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger - CastSpell(this, proto->Spells[i].SpellId, true, pItem); - if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound()) { pItem->SetSoulboundTradeable(allowedLooters); pItem->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, GetTotalPlayedTime()); - m_itemSoulboundTradeable.push_back(pItem); + AddTradeableItem(pItem); // save data std::ostringstream ss; @@ -12115,7 +12276,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool uint8 bag = pos >> 8; uint8 slot = pos & 255; - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: StoreItem bag = %u, slot = %u, item = %u, count = %u, guid = %u", bag, slot, pItem->GetEntry(), count, pItem->GetGUIDLow()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: StoreItem bag = %u, slot = %u, item = %u, count = %u, guid = %u", bag, slot, pItem->GetEntry(), count, pItem->GetGUIDLow()); Item* pItem2 = GetItemByPos(bag, slot); @@ -12165,6 +12326,14 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool AddEnchantmentDurations(pItem); AddItemDurations(pItem); + + const ItemTemplate* proto = pItem->GetTemplate(); + for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) + if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger + if (bag == INVENTORY_SLOT_BAG_0 || (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END)) + if (!HasAura(proto->Spells[i].SpellId)) + CastSpell(this, proto->Spells[i].SpellId, true, pItem); + return pItem; } else @@ -12201,6 +12370,13 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool pItem2->SetState(ITEM_CHANGED, this); + const ItemTemplate* proto = pItem2->GetTemplate(); + for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) + if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger + if (bag == INVENTORY_SLOT_BAG_0 || (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END)) + if (!HasAura(proto->Spells[i].SpellId)) + CastSpell(this, proto->Spells[i].SpellId, true, pItem2); + return pItem2; } } @@ -12371,7 +12547,7 @@ void Player::VisualizeItem(uint8 slot, Item* pItem) if (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM) pItem->SetBinding(true); - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: EquipItem slot = %u, item = %u", slot, pItem->GetEntry()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: EquipItem slot = %u, item = %u", slot, pItem->GetEntry()); m_items[slot] = pItem; SetUInt64Value(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID()); @@ -12396,7 +12572,7 @@ void Player::RemoveItem(uint8 bag, uint8 slot, bool update) Item* pItem = GetItemByPos(bag, slot); if (pItem) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: RemoveItem bag = %u, slot = %u, item = %u", bag, slot, pItem->GetEntry()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: RemoveItem bag = %u, slot = %u, item = %u", bag, slot, pItem->GetEntry()); RemoveEnchantmentDurations(pItem); RemoveItemDurations(pItem); @@ -12507,7 +12683,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool } if (pLastItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_BOP_TRADEABLE)) - m_itemSoulboundTradeable.push_back(pLastItem); + AddTradeableItem(pLastItem); } void Player::DestroyItem(uint8 bag, uint8 slot, bool update) @@ -12515,7 +12691,7 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) Item* pItem = GetItemByPos(bag, slot); if (pItem) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyItem bag = %u, slot = %u, item = %u", bag, slot, pItem->GetEntry()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyItem bag = %u, slot = %u, item = %u", bag, slot, pItem->GetEntry()); // Also remove all contained items if the item is a bag. // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow. if (pItem->IsNotEmptyBag()) @@ -12606,7 +12782,7 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyItemCount item = %u, count = %u", item, count); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyItemCount item = %u, count = %u", item, count); uint32 remcount = 0; // in inventory @@ -12735,7 +12911,7 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ void Player::DestroyZoneLimitedItem(bool update, uint32 new_zone) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyZoneLimitedItem in map %u and area %u", GetMapId(), new_zone); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyZoneLimitedItem in map %u and area %u", GetMapId(), new_zone); // in inventory for (uint8 i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++) @@ -12767,7 +12943,7 @@ void Player::DestroyConjuredItems(bool update) { // used when entering arena // destroys all conjured items - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyConjuredItems"); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyConjuredItems"); // in inventory for (uint8 i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++) @@ -12818,7 +12994,7 @@ void Player::DestroyItemCount(Item* pItem, uint32 &count, bool update) if (!pItem) return; - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyItemCount item (GUID: %u, Entry: %u) count = %u", pItem->GetGUIDLow(), pItem->GetEntry(), count); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: DestroyItemCount item (GUID: %u, Entry: %u) count = %u", pItem->GetGUIDLow(), pItem->GetEntry(), count); if (pItem->GetCount() <= count) { @@ -12881,7 +13057,7 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) return; } - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: SplitItem bag = %u, slot = %u, item = %u, count = %u", dstbag, dstslot, pSrcItem->GetEntry(), count); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: SplitItem bag = %u, slot = %u, item = %u, count = %u", dstbag, dstslot, pSrcItem->GetEntry(), count); Item* pNewItem = pSrcItem->CloneItem(count, this); if (!pNewItem) { @@ -12966,7 +13142,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!pSrcItem) return; - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: SwapItem bag = %u, slot = %u, item = %u", dstbag, dstslot, pSrcItem->GetEntry()); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: SwapItem bag = %u, slot = %u, item = %u", dstbag, dstslot, pSrcItem->GetEntry()); if (!isAlive()) { @@ -12996,7 +13172,7 @@ void Player::SwapItem(uint16 src, uint16 dst) } // prevent put equipped/bank bag in self - if (IsBagPos (src) && srcslot == dstbag) + if (IsBagPos(src) && srcslot == dstbag) { SendEquipError(EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem); return; @@ -13054,7 +13230,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (IsBankPos(src)) ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount()); } - else if (IsBankPos (dst)) + else if (IsBankPos(dst)) { ItemPosCountVec dest; InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false); @@ -13068,7 +13244,7 @@ void Player::SwapItem(uint16 src, uint16 dst) BankItem(dest, pSrcItem, true); ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount()); } - else if (IsEquipmentPos (dst)) + else if (IsEquipmentPos(dst)) { uint16 dest; InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false); @@ -13094,9 +13270,9 @@ void Player::SwapItem(uint16 src, uint16 dst) uint16 eDest = 0; if (IsInventoryPos(dst)) msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false); - else if (IsBankPos (dst)) + else if (IsBankPos(dst)) msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false); - else if (IsEquipmentPos (dst)) + else if (IsEquipmentPos(dst)) msg = CanEquipItem(dstslot, eDest, pSrcItem, false); else return; @@ -13110,9 +13286,9 @@ void Player::SwapItem(uint16 src, uint16 dst) if (IsInventoryPos(dst)) StoreItem(sDest, pSrcItem, true); - else if (IsBankPos (dst)) + else if (IsBankPos(dst)) BankItem(sDest, pSrcItem, true); - else if (IsEquipmentPos (dst)) + else if (IsEquipmentPos(dst)) { EquipItem(eDest, pSrcItem, true); AutoUnequipOffhandIfNeed(); @@ -13342,7 +13518,7 @@ void Player::AddItemToBuyBackSlot(Item* pItem) } RemoveItemFromBuyBackSlot(slot, true); - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: AddItemToBuyBackSlot item = %u, slot = %u", pItem->GetEntry(), slot); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: AddItemToBuyBackSlot item = %u, slot = %u", pItem->GetEntry(), slot); m_items[slot] = pItem; time_t base = time(NULL); @@ -13350,8 +13526,8 @@ void Player::AddItemToBuyBackSlot(Item* pItem) uint32 eslot = slot - BUYBACK_SLOT_START; SetUInt64Value(PLAYER_FIELD_VENDORBUYBACK_SLOT_1 + (eslot * 2), pItem->GetGUID()); - if (ItemTemplate const* pProto = pItem->GetTemplate()) - SetUInt32Value(PLAYER_FIELD_BUYBACK_PRICE_1 + eslot, pProto->SellPrice * pItem->GetCount()); + if (ItemTemplate const* proto = pItem->GetTemplate()) + SetUInt32Value(PLAYER_FIELD_BUYBACK_PRICE_1 + eslot, proto->SellPrice * pItem->GetCount()); else SetUInt32Value(PLAYER_FIELD_BUYBACK_PRICE_1 + eslot, 0); SetUInt32Value(PLAYER_FIELD_BUYBACK_TIMESTAMP_1 + eslot, (uint32)etime); @@ -13364,7 +13540,7 @@ void Player::AddItemToBuyBackSlot(Item* pItem) Item* Player::GetItemFromBuyBackSlot(uint32 slot) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: GetItemFromBuyBackSlot slot = %u", slot); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: GetItemFromBuyBackSlot slot = %u", slot); if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) return m_items[slot]; return NULL; @@ -13372,7 +13548,7 @@ Item* Player::GetItemFromBuyBackSlot(uint32 slot) void Player::RemoveItemFromBuyBackSlot(uint32 slot, bool del) { - sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: RemoveItemFromBuyBackSlot slot = %u", slot); + sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: RemoveItemFromBuyBackSlot slot = %u", slot); if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) { Item* pItem = m_items[slot]; @@ -13504,6 +13680,11 @@ void Player::UpdateSoulboundTradeItems() } } +void Player::AddTradeableItem(Item* item) +{ + m_itemSoulboundTradeable.push_back(item); +} + //TODO: should never allow an item to be added to m_itemSoulboundTradeable twice void Player::RemoveTradeableItem(Item* item) { @@ -14129,12 +14310,10 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0); uint32 npcflags = 0; - Creature* creature = NULL; if (source->GetTypeId() == TYPEID_UNIT) { - creature = source->ToCreature(); - npcflags = creature->GetUInt32Value(UNIT_NPC_FLAGS); + npcflags = source->GetUInt32Value(UNIT_NPC_FLAGS); if (npcflags & UNIT_NPC_FLAG_QUESTGIVER && showQuests) PrepareQuestMenu(source->GetGUID()); } @@ -14149,7 +14328,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions)) continue; - if (source->GetTypeId() == TYPEID_UNIT) + if (Creature* creature = source->ToCreature()) { if (!(itr->second.OptionNpcflag & npcflags)) continue; @@ -14186,7 +14365,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool canTalk = false; break; case GOSSIP_OPTION_UNLEARNPETTALENTS: - if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureInfo()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureInfo()->trainer_class != CLASS_HUNTER) + if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER) canTalk = false; break; case GOSSIP_OPTION_TAXIVENDOR: @@ -14222,10 +14401,8 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool break; } } - else if (source->GetTypeId() == TYPEID_GAMEOBJECT) + else if (GameObject* go = source->ToGameObject()) { - GameObject* go = source->ToGameObject(); - switch (itr->second.OptionType) { case GOSSIP_OPTION_GOSSIP: @@ -14335,15 +14512,15 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men { case GOSSIP_OPTION_GOSSIP: { + if (menuItemData->GossipActionPoi) + PlayerTalkClass->SendPointOfInterest(menuItemData->GossipActionPoi); + if (menuItemData->GossipActionMenuId) { PrepareGossipMenu(source, menuItemData->GossipActionMenuId); SendPreparedGossip(source); } - if (menuItemData->GossipActionPoi) - PlayerTalkClass->SendPointOfInterest(menuItemData->GossipActionPoi); - break; } case GOSSIP_OPTION_OUTDOORPVP: @@ -14422,7 +14599,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men return; } - GetSession()->SendBattlegGroundList(guid, bgTypeId); + GetSession()->SendBattleGroundList(guid, bgTypeId); break; } } @@ -14461,7 +14638,7 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source) switch (source->GetTypeId()) { case TYPEID_UNIT: - return source->ToCreature()->GetCreatureInfo()->GossipMenuId; + return source->ToCreature()->GetCreatureTemplate()->GossipMenuId; case TYPEID_GAMEOBJECT: return source->ToGameObject()->GetGOInfo()->GetGossipMenuId(); default: @@ -14477,15 +14654,15 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source) void Player::PrepareQuestMenu(uint64 guid) { - QuestRelationBounds pObjectQR; - QuestRelationBounds pObjectQIR; + QuestRelationBounds objectQR; + QuestRelationBounds objectQIR; // pets also can have quests Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); if (creature) { - pObjectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); - pObjectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); + objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); + objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); } else { @@ -14496,8 +14673,8 @@ void Player::PrepareQuestMenu(uint64 guid) GameObject* pGameObject = _map->GetGameObject(guid); if (pGameObject) { - pObjectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); - pObjectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry()); + objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); + objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry()); } else return; @@ -14506,7 +14683,7 @@ void Player::PrepareQuestMenu(uint64 guid) QuestMenu &qm = PlayerTalkClass->GetQuestMenu(); qm.ClearMenu(); - for (QuestRelations::const_iterator i = pObjectQIR.first; i != pObjectQIR.second; ++i) + for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i) { uint32 quest_id = i->second; QuestStatus status = GetQuestStatus(quest_id); @@ -14518,7 +14695,7 @@ void Player::PrepareQuestMenu(uint64 guid) // qm.AddMenuItem(quest_id, 2); } - for (QuestRelations::const_iterator i = pObjectQR.first; i != pObjectQR.second; ++i) + for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i) { uint32 quest_id = i->second; Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id); @@ -14638,11 +14815,11 @@ bool Player::IsActiveQuest(uint32 quest_id) const Quest const* Player::GetNextQuest(uint64 guid, Quest const* quest) { - QuestRelationBounds pObjectQR; + QuestRelationBounds objectQR; Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); if (creature) - pObjectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); + objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); else { //we should obtain map pointer from GetMap() in 99% of cases. Special case @@ -14651,13 +14828,13 @@ Quest const* Player::GetNextQuest(uint64 guid, Quest const* quest) ASSERT(_map); GameObject* pGameObject = _map->GetGameObject(guid); if (pGameObject) - pObjectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); + objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); else return NULL; } uint32 nextQuestID = quest->GetNextQuestInChain(); - for (QuestRelations::const_iterator itr = pObjectQR.first; itr != pObjectQR.second; ++itr) + for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr) { if (itr->second == nextQuestID) return sObjectMgr->GetQuestTemplate(nextQuestID); @@ -16057,9 +16234,9 @@ void Player::CastedCreatureOrGO(uint32 entry, uint64 guid, uint32 spell_id) if (reqTarget != entry) // if entry doesn't match, check for killcredits referenced in template { CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(entry); - for (uint8 j = 0; j < MAX_KILL_CREDIT; ++j) - if (cinfo->KillCredit[j] == reqTarget) - entry = cinfo->KillCredit[j]; + for (uint8 k = 0; k < MAX_KILL_CREDIT; ++k) + if (cinfo->KillCredit[k] == reqTarget) + entry = cinfo->KillCredit[k]; } } } @@ -16568,7 +16745,7 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) EquipmentSet eqSet; eqSet.Guid = fields[0].GetUInt64(); - uint32 index = fields[1].GetUInt32(); + uint8 index = fields[1].GetUInt8(); eqSet.Name = fields[2].GetString(); eqSet.IconName = fields[3].GetString(); eqSet.state = EQUIPMENT_SET_UNCHANGED; @@ -16610,7 +16787,10 @@ void Player::_LoadBGData(PreparedQueryResult result) bool Player::LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, float& o, bool& in_flight, uint64 guid) { - QueryResult result = CharacterDatabase.PQuery("SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION); + stmt->setUInt32(0, GUID_LOPART(guid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return false; @@ -16790,12 +16970,12 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) InitPrimaryProfessions(); // to max set before any spell loaded // init saved position, and fix it later if problematic - uint32 transGUID = uint32(fields[31].GetUInt64()); // field type is uint64 but lowguid is saved + uint32 transGUID = uint32(fields[31].GetUInt32()); Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat()); uint32 mapId = fields[15].GetUInt16(); - uint32 instanceId = fields[54].GetUInt8(); + uint32 instanceId = fields[54].GetUInt32(); - uint32 dungeonDiff = fields[39].GetUInt32() & 0x0F; + uint32 dungeonDiff = fields[39].GetUInt8() & 0x0F; if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY) dungeonDiff = DUNGEON_DIFFICULTY_NORMAL; uint32 raidDiff = (fields[39].GetUInt8() >> 4) & 0x0F; @@ -17137,7 +17317,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) float bubble0 = 0.031f; //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour) float bubble1 = 0.125f; - float bubble = fields[23].GetUInt32() > 0 + float bubble = fields[23].GetUInt8() > 0 ? bubble1*sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY) : bubble0*sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS); @@ -17299,7 +17479,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[61].GetUInt32(); + m_grantableLevels = fields[61].GetUInt8(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -17523,6 +17703,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) uint32 zoneId = GetZoneId(); std::map bagMap; // fast guid lookup for bags + std::map invalidBagMap; // fast guid lookup for bags std::list problematicItems; SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -17567,9 +17748,15 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) // Remember bags that may contain items in them if (err == EQUIP_ERR_OK) + { if (IsBagPos(item->GetPos())) if (Bag* pBag = item->ToBag()) bagMap[item->GetGUIDLow()] = pBag; + } + else + if (IsBagPos(item->GetPos())) + if (item->IsBag()) + invalidBagMap[item->GetGUIDLow()] = item; } else { @@ -17581,8 +17768,23 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) ItemPosCountVec dest; err = CanStoreItem(itr->second->GetSlot(), slot, dest, item); if (err == EQUIP_ERR_OK) - itr->second->StoreItem(slot, item, true); + item = StoreItem(dest, item, true); + } + else if (invalidBagMap.find(bagGuid) != invalidBagMap.end()) + { + std::map::iterator itr = invalidBagMap.find(bagGuid); + if (std::find(problematicItems.begin(),problematicItems.end(),itr->second) != problematicItems.end()) + err = EQUIP_ERR_INT_BAG_ERROR; + } + else + { + sLog->outError("Player::_LoadInventory: player (GUID: %u, name: '%s') has item (GUID: %u, entry: %u) which doesnt have a valid bag (Bag GUID: %u, slot: %u). Possible cheat?", + GetGUIDLow(), GetName(), item->GetGUIDLow(), item->GetEntry(), bagGuid, slot); + item->DeleteFromInventoryDB(trans); + delete item; + continue; } + } // Item's state may have changed after storing @@ -17621,6 +17823,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, Field* fields) { + PreparedStatement* stmt = NULL; Item* item = NULL; uint32 itemGuid = fields[13].GetUInt32(); uint32 itemEntry = fields[14].GetUInt32(); @@ -17650,7 +17853,11 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F { sLog->outDebug(LOG_FILTER_PLAYER_LOADING, "Player::_LoadInventory: player (GUID: %u, name: '%s') has item (GUID: %u, entry: %u) with expired refund time (%u). Deleting refund data and removing refundable flag.", GetGUIDLow(), GetName(), item->GetGUIDLow(), item->GetEntry(), item->GetPlayedTime()); - trans->PAppend("DELETE FROM item_refund_instance WHERE item_guid = '%u'", item->GetGUIDLow()); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE); + stmt->setUInt32(0, item->GetGUIDLow()); + trans->Append(stmt); + item->RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_REFUNDABLE); } else @@ -17685,7 +17892,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F for (Tokens::iterator itr = GUIDlist.begin(); itr != GUIDlist.end(); ++itr) looters.insert(atol(*itr)); item->SetSoulboundTradeable(looters); - m_itemSoulboundTradeable.push_back(item); + AddTradeableItem(item); } else { @@ -17701,7 +17908,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList(); for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr) { - if (events[*itr].holiday_id == proto->HolidayId) + if (uint32(events[*itr].holiday_id) == proto->HolidayId) { remove = false; break; @@ -17759,7 +17966,7 @@ void Player::_LoadMailedItems(Mail* mail) { sLog->outError("Player %u has unknown item_template (ProtoType) in mailed items(GUID: %u template: %u) in mail (%u), deleted.", GetGUIDLow(), itemGuid, itemTemplate, mail->messageID); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_MAIL_ITEM); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_MAIL_ITEM); stmt->setUInt32(0, itemGuid); CharacterDatabase.Execute(stmt); @@ -17775,10 +17982,8 @@ void Player::_LoadMailedItems(Mail* mail) { sLog->outError("Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: %u, deleted from mail", mail->messageID, itemGuid); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM); - + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM); stmt->setUInt32(0, itemGuid); - CharacterDatabase.Execute(stmt); item->FSetState(ITEM_REMOVED); @@ -17798,38 +18003,42 @@ void Player::_LoadMailInit(PreparedQueryResult resultUnread, PreparedQueryResult //set a count of unread mails //QueryResult* resultMails = CharacterDatabase.PQuery("SELECT COUNT(id) FROM mail WHERE receiver = '%u' AND (checked & 1)=0 AND deliver_time <= '" UI64FMTD "'", GUID_LOPART(playerGuid), (uint64)cTime); if (resultUnread) - unReadMails = (*resultUnread)[0].GetUInt8(); + unReadMails = uint8((*resultUnread)[0].GetUInt64()); // store nearest delivery time (it > 0 and if it < current then at next player update SendNewMaill will be called) //resultMails = CharacterDatabase.PQuery("SELECT MIN(deliver_time) FROM mail WHERE receiver = '%u' AND (checked & 1)=0", GUID_LOPART(playerGuid)); if (resultDelivery) - m_nextMailDelivereTime = (time_t)(*resultDelivery)[0].GetUInt64(); + m_nextMailDelivereTime = time_t((*resultDelivery)[0].GetUInt32()); } void Player::_LoadMail() { m_mail.clear(); - //mails are in right order 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - QueryResult result = CharacterDatabase.PQuery("SELECT id, messageType, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = '%u' ORDER BY id DESC", GetGUIDLow()); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL); + stmt->setUInt32(0, GetGUIDLow()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { do { Field* fields = result->Fetch(); Mail* m = new Mail; - m->messageID = fields[0].GetUInt32(); - m->messageType = fields[1].GetUInt8(); - m->sender = fields[2].GetUInt32(); - m->receiver = fields[3].GetUInt32(); - m->subject = fields[4].GetString(); - m->body = fields[5].GetString(); - bool has_items = fields[6].GetBool(); - m->expire_time = time_t(fields[7].GetUInt32()); - m->deliver_time = time_t(fields[8].GetUInt32()); - m->money = fields[9].GetUInt32(); - m->COD = fields[10].GetUInt32(); - m->checked = fields[11].GetUInt32(); - m->stationery = fields[12].GetUInt8(); + + m->messageID = fields[0].GetUInt32(); + m->messageType = fields[1].GetUInt8(); + m->sender = fields[2].GetUInt32(); + m->receiver = fields[3].GetUInt32(); + m->subject = fields[4].GetString(); + m->body = fields[5].GetString(); + bool has_items = fields[6].GetBool(); + m->expire_time = time_t(fields[7].GetUInt32()); + m->deliver_time = time_t(fields[8].GetUInt32()); + m->money = fields[9].GetUInt32(); + m->COD = fields[10].GetUInt32(); + m->checked = fields[11].GetUInt8(); + m->stationery = fields[12].GetUInt8(); m->mailTemplateId = fields[13].GetInt16(); if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId)) @@ -17891,7 +18100,8 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) else { questStatusData.Status = QUEST_STATUS_INCOMPLETE; - sLog->outError("Player %s have invalid quest %d status (%u), replaced by QUEST_STATUS_INCOMPLETE(3).", GetName(), quest_id, qstatus); + sLog->outError("Player %s (GUID: %u) has invalid quest %d status (%u), replaced by QUEST_STATUS_INCOMPLETE(3).", + GetName(), GetGUIDLow(), quest_id, qstatus); } questStatusData.Explored = (fields[2].GetUInt8() > 0); @@ -18021,7 +18231,7 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result) uint32 quest_id = fields[0].GetUInt32(); // save _any_ from daily quest times (it must be after last reset anyway) - m_lastDailyQuestTime = (time_t)fields[1].GetUInt64(); + m_lastDailyQuestTime = time_t(fields[1].GetUInt32()); Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id); if (!quest) @@ -18170,7 +18380,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) if (deleteInstance) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt32(1, instanceId); @@ -18226,7 +18436,7 @@ void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficu { if (!unload) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt32(1, itr->second.save->GetInstanceId()); @@ -18234,6 +18444,9 @@ void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficu CharacterDatabase.Execute(stmt); } + if (itr->second.perm) + GetSession()->SendCalendarRaidLockout(itr->second.save, false); + itr->second.save->RemovePlayer(this); // save can become invalid m_boundInstances[difficulty].erase(itr++); } @@ -18303,6 +18516,8 @@ void Player::BindToInstance() data << uint32(0); GetSession()->SendPacket(&data); BindToInstance(mapSave, true); + + GetSession()->SendCalendarRaidLockout(mapSave, true); } void Player::SendRaidInfo() @@ -18583,7 +18798,7 @@ void Player::SaveToDB(bool create /*=false*/) outDebugValues(); PreparedStatement* stmt = NULL; - uint16 index = 0; + uint8 index = 0; if (create) { @@ -18632,7 +18847,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, m_stableSlots); stmt->setUInt16(index++, (uint16)m_atLoginFlags); stmt->setUInt16(index++, GetZoneId()); - stmt->setUInt32(index++, m_deathExpireTime); + stmt->setUInt32(index++, uint32(m_deathExpireTime)); ss.str(""); ss << m_taxi.SaveTaxiDestinationsToString(); @@ -18743,7 +18958,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, m_stableSlots); stmt->setUInt16(index++, (uint16)m_atLoginFlags); stmt->setUInt16(index++, GetZoneId()); - stmt->setUInt32(index++, m_deathExpireTime); + stmt->setUInt32(index++, uint32(m_deathExpireTime)); ss.str(""); ss << m_taxi.SaveTaxiDestinationsToString(); @@ -18849,29 +19064,51 @@ void Player::SaveInventoryAndGoldToDB(SQLTransaction& trans) void Player::SaveGoldToDB(SQLTransaction& trans) { - trans->PAppend("UPDATE characters SET money = '%u' WHERE guid = '%u'", GetMoney(), GetGUIDLow()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_MONEY); + stmt->setUInt32(0, GetMoney()); + stmt->setUInt32(1, GetGUIDLow()); + trans->Append(stmt); } void Player::_SaveActions(SQLTransaction& trans) { + PreparedStatement* stmt = NULL; + for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();) { switch (itr->second.uState) { case ACTIONBUTTON_NEW: - trans->PAppend("INSERT INTO character_action (guid, spec, button, action, type) VALUES ('%u', '%u', '%u', '%u', '%u')", - GetGUIDLow(), GetActiveSpec(), (uint32)itr->first, (uint32)itr->second.GetAction(), (uint32)itr->second.GetType()); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt8(1, m_activeSpec); + stmt->setUInt8(2, itr->first); + stmt->setUInt32(3, itr->second.GetAction()); + stmt->setUInt8(4, uint8(itr->second.GetType())); + trans->Append(stmt); + itr->second.uState = ACTIONBUTTON_UNCHANGED; ++itr; break; case ACTIONBUTTON_CHANGED: - trans->PAppend("UPDATE character_action SET action = '%u', type = '%u' WHERE guid = '%u' AND button = '%u' AND spec = '%u'", - (uint32)itr->second.GetAction(), (uint32)itr->second.GetType(), GetGUIDLow(), (uint32)itr->first, GetActiveSpec()); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION); + stmt->setUInt32(0, itr->second.GetAction()); + stmt->setUInt8(1, uint8(itr->second.GetType())); + stmt->setUInt32(2, GetGUIDLow()); + stmt->setUInt8(3, itr->first); + stmt->setUInt8(4, m_activeSpec); + trans->Append(stmt); + itr->second.uState = ACTIONBUTTON_UNCHANGED; ++itr; break; case ACTIONBUTTON_DELETED: - trans->PAppend("DELETE FROM character_action WHERE guid = '%u' and button = '%u' and spec = '%u'", GetGUIDLow(), (uint32)itr->first, GetActiveSpec()); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt8(1, itr->first); + stmt->setUInt8(2, m_activeSpec); + trans->Append(stmt); + m_actionButtons.erase(itr++); break; default: @@ -18883,11 +19120,11 @@ void Player::_SaveActions(SQLTransaction& trans) void Player::_SaveAuras(SQLTransaction& trans) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AURA); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA); stmt->setUInt32(0, GetGUIDLow()); trans->Append(stmt); - for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end() ; ++itr) + for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr) { if (!itr->second->CanBeSaved()) continue; @@ -18939,6 +19176,7 @@ void Player::_SaveAuras(SQLTransaction& trans) void Player::_SaveInventory(SQLTransaction& trans) { + PreparedStatement* stmt = NULL; // force items in buyback slots to new state // and remove those that aren't already for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i) @@ -18946,8 +19184,12 @@ void Player::_SaveInventory(SQLTransaction& trans) Item* item = m_items[i]; if (!item || item->GetState() == ITEM_NEW) continue; - trans->PAppend("DELETE FROM character_inventory WHERE item = '%u'", item->GetGUIDLow()); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM); + stmt->setUInt32(0, item->GetGUIDLow()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE); stmt->setUInt32(0, item->GetGUIDLow()); trans->Append(stmt); m_items[i]->FSetState(ITEM_NEW); @@ -19005,7 +19247,12 @@ void Player::_SaveInventory(SQLTransaction& trans) bagTestGUID = test2->GetGUIDLow(); sLog->outError("Player(GUID: %u Name: %s)::_SaveInventory - the bag(%u) and slot(%u) values for the item with guid %u (state %d) are incorrect, the player doesn't have an item at that position!", lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUIDLow(), (int32)item->GetState()); // according to the test that was just performed nothing should be in this slot, delete - trans->PAppend("DELETE FROM character_inventory WHERE bag=%u AND slot=%u AND guid=%u", bagTestGUID, item->GetSlot(), lowGuid); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT); + stmt->setUInt32(0, bagTestGUID); + stmt->setUInt8(1, item->GetSlot()); + stmt->setUInt32(2, lowGuid); + trans->Append(stmt); + // also THIS item should be somewhere else, cheat attempt item->FSetState(ITEM_REMOVED); // we are IN updateQueue right now, can't use SetState which modifies the queue DeleteRefundReference(item->GetGUIDLow()); @@ -19036,7 +19283,7 @@ void Player::_SaveInventory(SQLTransaction& trans) trans->Append(stmt); break; case ITEM_REMOVED: - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVENTORY_ITEM); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM); stmt->setUInt32(0, item->GetGUIDLow()); trans->Append(stmt); case ITEM_UNCHANGED: @@ -19053,17 +19300,32 @@ void Player::_SaveMail(SQLTransaction& trans) if (!m_mailsLoaded) return; + PreparedStatement* stmt = NULL; + for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) { Mail* m = (*itr); if (m->state == MAIL_STATE_CHANGED) { - trans->PAppend("UPDATE mail SET has_items = '%u', expire_time = '" UI64FMTD "', deliver_time = '" UI64FMTD "', money = '%u', cod = '%u', checked = '%u' WHERE id = '%u'", - m->HasItems() ? 1 : 0, (uint64)m->expire_time, (uint64)m->deliver_time, m->money, m->COD, m->checked, m->messageID); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL); + stmt->setUInt8(0, uint8(m->HasItems() ? 1 : 0)); + stmt->setUInt32(1, uint32(m->expire_time)); + stmt->setUInt32(2, uint32(m->deliver_time)); + stmt->setUInt32(3, m->money); + stmt->setUInt32(4, m->COD); + stmt->setUInt8(5, uint8(m->checked)); + stmt->setUInt32(6, m->messageID); + + trans->Append(stmt); + if (!m->removedItems.empty()) { for (std::vector::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2) - trans->PAppend("DELETE FROM mail_items WHERE item_guid = '%u'", *itr2); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM); + stmt->setUInt32(0, *itr2); + trans->Append(stmt); + } m->removedItems.clear(); } m->state = MAIL_STATE_UNCHANGED; @@ -19080,8 +19342,13 @@ void Player::_SaveMail(SQLTransaction& trans) trans->Append(stmt); } } - trans->PAppend("DELETE FROM mail WHERE id = '%u'", m->messageID); - trans->PAppend("DELETE FROM mail_items WHERE mail_id = '%u'", m->messageID); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); + stmt->setUInt32(0, m->messageID); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); + stmt->setUInt32(0, m->messageID); + trans->Append(stmt); } } @@ -19110,6 +19377,7 @@ void Player::_SaveQuestStatus(SQLTransaction& trans) QuestStatusSaveMap::iterator saveItr; QuestStatusMap::iterator statusItr; + PreparedStatement* stmt = NULL; bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS); @@ -19119,12 +19387,33 @@ void Player::_SaveQuestStatus(SQLTransaction& trans) { statusItr = m_QuestStatus.find(saveItr->first); if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE)) - trans->PAppend("REPLACE INTO character_queststatus (guid, quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3, itemcount4, playercount) " - "VALUES ('%u', '%u', '%u', '%u', '" UI64FMTD "', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", - GetGUIDLow(), statusItr->first, statusItr->second.Status, statusItr->second.Explored, uint64(statusItr->second.Timer / IN_MILLISECONDS+ sWorld->GetGameTime()), statusItr->second.CreatureOrGOCount[0], statusItr->second.CreatureOrGOCount[1], statusItr->second.CreatureOrGOCount[2], statusItr->second.CreatureOrGOCount[3], statusItr->second.ItemCount[0], statusItr->second.ItemCount[1], statusItr->second.ItemCount[2], statusItr->second.ItemCount[3], statusItr->second.PlayerCount); + { + uint8 index = 0; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS); + + stmt->setUInt32(index++, GetGUIDLow()); + stmt->setUInt32(index++, statusItr->first); + stmt->setUInt8(index++, uint8(statusItr->second.Status)); + stmt->setBool(index++, statusItr->second.Explored); + stmt->setUInt32(index++, uint32(statusItr->second.Timer / IN_MILLISECONDS+ sWorld->GetGameTime())); + + for (uint8 i = 0; i < 4; i++) + stmt->setUInt16(index++, statusItr->second.CreatureOrGOCount[i]); + + for (uint8 i = 0; i < 4; i++) + stmt->setUInt16(index++, statusItr->second.ItemCount[i]); + + stmt->setUInt16(index, statusItr->second.PlayerCount); + trans->Append(stmt); + } } else - trans->PAppend("DELETE FROM character_queststatus WHERE guid = %u AND quest = %u", GetGUIDLow(), saveItr->first); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, saveItr->first); + trans->Append(stmt); + } } m_QuestStatusSave.clear(); @@ -19132,9 +19421,20 @@ void Player::_SaveQuestStatus(SQLTransaction& trans) for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr) { if (saveItr->second) - trans->PAppend("INSERT IGNORE INTO character_queststatus_rewarded (guid, quest) VALUES (%u, %u)", GetGUIDLow(), saveItr->first); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, saveItr->first); + trans->Append(stmt); + + } else if (!keepAbandoned) - trans->PAppend("DELETE FROM character_queststatus_rewarded WHERE guid = %u AND quest = %u", GetGUIDLow(), saveItr->first); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, saveItr->first); + trans->Append(stmt); + } } m_RewardedQuestsSave.clear(); @@ -19157,20 +19457,22 @@ void Player::_SaveDailyQuestStatus(SQLTransaction& trans) stmt->setUInt32(0, GetGUIDLow()); trans->Append(stmt); for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx) + { if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx)) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt32(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx)); stmt->setUInt64(2, uint64(m_lastDailyQuestTime)); trans->Append(stmt); } + } if (!m_DFQuests.empty()) { for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt32(1, (*itr)); stmt->setUInt64(2, uint64(m_lastDailyQuestTime)); @@ -19193,7 +19495,7 @@ void Player::_SaveWeeklyQuestStatus(SQLTransaction& trans) { uint32 quest_id = *iter; - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt32(1, quest_id); trans->Append(stmt); @@ -19219,7 +19521,7 @@ void Player::_SaveSeasonalQuestStatus(SQLTransaction& trans) { uint32 quest_id = (*itr); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt32(1, quest_id); stmt->setUInt32(2, event_id); @@ -19232,6 +19534,7 @@ void Player::_SaveSeasonalQuestStatus(SQLTransaction& trans) void Player::_SaveSkills(SQLTransaction& trans) { + PreparedStatement* stmt = NULL; // we don't need transactions here. for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();) { @@ -19243,7 +19546,11 @@ void Player::_SaveSkills(SQLTransaction& trans) if (itr->second.uState == SKILL_DELETED) { - trans->PAppend("DELETE FROM character_skills WHERE guid = '%u' AND skill = '%u' ", GetGUIDLow(), itr->first); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, itr->first); + trans->Append(stmt); + mSkillStatus.erase(itr++); continue; } @@ -19255,12 +19562,22 @@ void Player::_SaveSkills(SQLTransaction& trans) switch (itr->second.uState) { case SKILL_NEW: - trans->PAppend("INSERT INTO character_skills (guid, skill, value, max) VALUES ('%u', '%u', '%u', '%u')", - GetGUIDLow(), itr->first, value, max); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt16(1, uint16(itr->first)); + stmt->setUInt16(2, value); + stmt->setUInt16(3, max); + trans->Append(stmt); + break; case SKILL_CHANGED: - trans->PAppend("UPDATE character_skills SET value = '%u', max = '%u'WHERE guid = '%u' AND skill = '%u' ", - value, max, GetGUIDLow(), itr->first); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS); + stmt->setUInt16(0, value); + stmt->setUInt16(1, max); + stmt->setUInt32(2, GetGUIDLow()); + stmt->setUInt16(3, uint16(itr->first)); + trans->Append(stmt); + break; default: break; @@ -19273,14 +19590,28 @@ void Player::_SaveSkills(SQLTransaction& trans) void Player::_SaveSpells(SQLTransaction& trans) { + PreparedStatement* stmt = NULL; + for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();) { if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->state == PLAYERSPELL_CHANGED) - trans->PAppend("DELETE FROM character_spell WHERE guid = '%u' and spell = '%u'", GetGUIDLow(), itr->first); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL); + stmt->setUInt32(0, itr->first); + stmt->setUInt32(1, GetGUIDLow()); + trans->Append(stmt); + } // add only changed/new not dependent spells if (!itr->second->dependent && (itr->second->state == PLAYERSPELL_NEW || itr->second->state == PLAYERSPELL_CHANGED)) - trans->PAppend("INSERT INTO character_spell (guid, spell, active, disabled) VALUES ('%u', '%u', '%u', '%u')", GetGUIDLow(), itr->first, itr->second->active ? 1 : 0, itr->second->disabled ? 1 : 0); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, itr->first); + stmt->setBool(2, itr->second->active); + stmt->setBool(3, itr->second->disabled); + trans->Append(stmt); + } if (itr->second->state == PLAYERSPELL_REMOVED) { @@ -19303,31 +19634,38 @@ void Player::_SaveStats(SQLTransaction& trans) if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || getLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE)) return; - trans->PAppend("DELETE FROM character_stats WHERE guid = '%u'", GetGUIDLow()); - std::ostringstream ss; - ss << "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, " - "strength, agility, stamina, intellect, spirit, armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, " - "blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, spellPower, resilience) VALUES (" - << GetGUIDLow() << ',' - << GetMaxHealth() << ','; - for (uint8 i = 0; i < MAX_STORED_POWERS; ++i) - ss << GetMaxPower(Powers(i)) << ','; + PreparedStatement* stmt = NULL; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS); + stmt->setUInt32(0, GetGUIDLow()); + trans->Append(stmt); + + uint8 index = 0; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS); + stmt->setUInt32(index++, GetGUIDLow()); + stmt->setUInt32(index++, GetMaxHealth()); + + stmt->setUInt32(index++, GetMaxPower(Powers(i))); + for (uint8 i = 0; i < MAX_STATS; ++i) - ss << GetStat(Stats(i)) << ','; - // armor + school resistances + stmt->setUInt32(index++, GetStat(Stats(i))); + for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) - ss << GetResistance(SpellSchools(i)) << ','; - ss << GetFloatValue(PLAYER_BLOCK_PERCENTAGE) << ',' - << GetFloatValue(PLAYER_DODGE_PERCENTAGE) << ',' - << GetFloatValue(PLAYER_PARRY_PERCENTAGE) << ',' - << GetFloatValue(PLAYER_CRIT_PERCENTAGE) << ',' - << GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE) << ',' - << GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1) << ',' - << GetUInt32Value(UNIT_FIELD_ATTACK_POWER) << ',' - << GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER) << ',' - << GetBaseSpellPowerBonus() << ',' - << GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + CR_CRIT_TAKEN_SPELL) << ')'; - trans->Append(ss.str().c_str()); + stmt->setUInt32(index++, GetResistance(SpellSchools(i))); + + stmt->setFloat(index++, GetFloatValue(PLAYER_BLOCK_PERCENTAGE)); + stmt->setFloat(index++, GetFloatValue(PLAYER_DODGE_PERCENTAGE)); + stmt->setFloat(index++, GetFloatValue(PLAYER_PARRY_PERCENTAGE)); + stmt->setFloat(index++, GetFloatValue(PLAYER_CRIT_PERCENTAGE)); + stmt->setFloat(index++, GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE)); + stmt->setFloat(index++, GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1)); + stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_ATTACK_POWER)); + stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER)); + stmt->setUInt32(index++, GetBaseSpellPowerBonus()); + stmt->setUInt32(index++, GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + CR_CRIT_TAKEN_SPELL)); + + trans->Append(stmt); } void Player::outDebugValues() const @@ -19426,8 +19764,10 @@ void Player::SetUInt32ValueInArray(Tokens& tokens, uint16 index, uint32 value) void Player::Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair) { - // 0 - QueryResult result = CharacterDatabase.PQuery("SELECT playerBytes2 FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PLAYERBYTES2); + stmt->setUInt32(0, GUID_LOPART(guid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return; @@ -19437,7 +19777,7 @@ void Player::Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 playerBytes2 &= ~0xFF; playerBytes2 |= facialHair; - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_PLAYERBYTES); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_PLAYERBYTES); stmt->setUInt8(0, gender); stmt->setUInt32(1, skin | (face << 8) | (hairStyle << 16) | (hairColor << 24)); @@ -19571,7 +19911,11 @@ void Player::SendResetInstanceSuccess(uint32 MapId) void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) { - // TODO: find what other fail reasons there are besides players in the instance + /*reasons for instance reset failure: + // 0: There are players inside the instance. + // 1: There are players offline in your party. + // 2>: There are players in your party attempting to zone into an instance. + */ WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 4); data << uint32(reason); data << uint32(MapId); @@ -19864,7 +20208,7 @@ void Player::PetSpellInitialize() WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1); data << uint64(pet->GetGUID()); - data << uint16(pet->GetCreatureInfo()->family); // creature family (required for pet talents) + data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents) data << uint32(0); data << uint8(pet->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0); @@ -19958,7 +20302,7 @@ void Player::VehicleSpellInitialize() WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4)); data << uint64(veh->GetGUID()); - data << uint16(veh->GetCreatureInfo()->family); + data << uint16(veh->GetCreatureTemplate()->family); data << uint32(0); // The following three segments are read as one uint32 data << uint8(veh->GetReactState()); @@ -20044,7 +20388,7 @@ void Player::CharmSpellInitialize() uint8 addlist = 0; if (charm->GetTypeId() != TYPEID_PLAYER) { - //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureInfo(); + //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate(); //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK) { for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i) @@ -20174,9 +20518,13 @@ void Player::RestoreSpellMods(Spell* spell, uint32 ownerAuraId, Aura* aura) continue; // check if mod affected this spell + // first, check if the mod aura applied at least one spellmod to this spell Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura); if (iterMod == spell->m_appliedMods.end()) continue; + // secondly, check if the current mod is one of the spellmods applied by the mod aura + if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags)) + continue; // remove from list spell->m_appliedMods.erase(iterMod); @@ -20270,16 +20618,24 @@ void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) { WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4); data << uint8(itemClass) << uint32(itemSubclassMask); - GetSession()->SendPacket (&data); + GetSession()->SendPacket(&data); } void Player::RemovePetitionsAndSigns(uint64 guid, uint32 type) { - QueryResult result = QueryResult(NULL); + PreparedStatement* stmt; + if (type == 10) - result = CharacterDatabase.PQuery("SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = '%u'", GUID_LOPART(guid)); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIG_BY_GUID); else - result = CharacterDatabase.PQuery("SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = '%u' AND type = '%u'", GUID_LOPART(guid), type); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIG_BY_GUID_TYPE); + stmt->setUInt8(0, uint8(type)); + } + + stmt->setUInt32(0, GUID_LOPART(guid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { do // this part effectively does nothing, since the deletion / modification only takes place _after_ the PetitionQuery. Though I don't know if the result remains intact if I execute the delete query beforehand. @@ -20316,13 +20672,25 @@ void Player::RemovePetitionsAndSigns(uint64 guid, uint32 type) SQLTransaction trans = CharacterDatabase.BeginTransaction(); if (type == 10) { - trans->PAppend("DELETE FROM petition WHERE ownerguid = '%u'", GUID_LOPART(guid)); - trans->PAppend("DELETE FROM petition_sign WHERE ownerguid = '%u'", GUID_LOPART(guid)); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_OWNER); + stmt->setUInt32(0, GUID_LOPART(guid)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER); + stmt->setUInt32(0, GUID_LOPART(guid)); + trans->Append(stmt); } else { - trans->PAppend("DELETE FROM petition WHERE ownerguid = '%u' AND type = '%u'", GUID_LOPART(guid), type); - trans->PAppend("DELETE FROM petition_sign WHERE ownerguid = '%u' AND type = '%u'", GUID_LOPART(guid), type); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE); + stmt->setUInt32(0, GUID_LOPART(guid)); + stmt->setUInt8(1, uint8(type)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE); + stmt->setUInt32(0, GUID_LOPART(guid)); + stmt->setUInt8(1, uint8(type)); + trans->Append(stmt); } CharacterDatabase.CommitTransaction(trans); } @@ -20905,10 +21273,10 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 } uint32 price = 0; - if(crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32) + if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32) { uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice; - if((uint32)count > maxCount) + if ((uint32)count > maxCount) { sLog->outError("Player %s tried to buy %u item id %u, causing overflow", GetName(), (uint32)count, pProto->ItemId); count = (uint8)maxCount; @@ -21541,13 +21909,6 @@ inline void UpdateVisibilityOf_helper(std::set& s64, T* target, std::set s64.insert(target->GetGUID()); } -template<> -inline void UpdateVisibilityOf_helper(std::set& s64, GameObject* target, std::set& /*v*/) -{ - if (!target->IsTransport()) - s64.insert(target->GetGUID()); -} - template<> inline void UpdateVisibilityOf_helper(std::set& s64, Creature* target, std::set& v) { @@ -22238,6 +22599,18 @@ void Player::SendAurasForTarget(Unit* target) if (!target || target->GetVisibleAuras()->empty()) // speedup things return; + /*! Blizz sends certain movement packets sometimes even before CreateObject + These movement packets are usually found in SMSG_COMPRESSED_MOVES + */ + if (target->HasAuraType(SPELL_AURA_FEATHER_FALL)) + target->SendMovementFeatherFall(); + + if (target->HasAuraType(SPELL_AURA_WATER_WALK)) + target->SendMovementWaterWalking(); + + if (target->HasAuraType(SPELL_AURA_HOVER)) + target->SendMovementHover(); + WorldPacket data(SMSG_AURA_UPDATE_ALL); data.append(target->GetPackGUID()); @@ -22711,20 +23084,20 @@ uint32 Player::GetResurrectionSpellId() } // Used in triggers for check "Only to targets that grant experience or honor" req -bool Player::isHonorOrXPTarget(Unit* pVictim) +bool Player::isHonorOrXPTarget(Unit* victim) { - uint8 v_level = pVictim->getLevel(); + uint8 v_level = victim->getLevel(); uint8 k_grey = Trinity::XP::GetGrayLevel(getLevel()); // Victim level less gray level if (v_level <= k_grey) return false; - if (pVictim->GetTypeId() == TYPEID_UNIT) + if (victim->GetTypeId() == TYPEID_UNIT) { - if (pVictim->ToCreature()->isTotem() || - pVictim->ToCreature()->isPet() || - pVictim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) + if (victim->ToCreature()->isTotem() || + victim->ToCreature()->isPet() || + victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) return false; } return true; @@ -22771,9 +23144,9 @@ bool Player::GetsRecruitAFriendBonus(bool forXP) return recruitAFriend; } -void Player::RewardPlayerAndGroupAtKill(Unit* pVictim, bool isBattleGround) +void Player::RewardPlayerAndGroupAtKill(Unit* victim, bool isBattleGround) { - KillRewarder(this, pVictim, isBattleGround).Reward(); + KillRewarder(this, victim, isBattleGround).Reward(); } void Player::RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource) @@ -23005,7 +23378,8 @@ void Player::SendCorpseReclaimDelay(bool load) else delay = GetCorpseReclaimDelay(pvp); - if (!delay) return; + if (!delay) + return; //! corpse reclaim delay 30 * 1000ms or longer at often deaths WorldPacket data(SMSG_CORPSE_RECLAIM_DELAY, 4); @@ -23129,15 +23503,39 @@ void Player::UpdateUnderwaterState(Map* m, float x, float y, float z) ZLiquidStatus res = m->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquid_status); if (!res) { - m_MirrorTimerFlags &= ~(UNDERWATER_INWATER|UNDERWATER_INLAVA|UNDERWATER_INSLIME|UNDERWARER_INDARKWATER); - // Small hack for enable breath in WMO - /* if (IsInWater()) - m_MirrorTimerFlags|=UNDERWATER_INWATER; */ + m_MirrorTimerFlags &= ~(UNDERWATER_INWATER | UNDERWATER_INLAVA | UNDERWATER_INSLIME | UNDERWARER_INDARKWATER); + if (_lastLiquid && _lastLiquid->SpellId) + RemoveAurasDueToSpell(_lastLiquid->SpellId); + + _lastLiquid = NULL; return; } + if (uint32 liqEntry = liquid_status.entry) + { + LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry); + if (_lastLiquid && _lastLiquid->SpellId && _lastLiquid->Id != liqEntry) + RemoveAurasDueToSpell(_lastLiquid->SpellId); + + if (liquid && liquid->SpellId) + { + if (res & (LIQUID_MAP_UNDER_WATER | LIQUID_MAP_IN_WATER)) + CastSpell(this, liquid->SpellId, true); + else + RemoveAurasDueToSpell(liquid->SpellId); + } + + _lastLiquid = liquid; + } + else if (_lastLiquid && _lastLiquid->SpellId) + { + RemoveAurasDueToSpell(_lastLiquid->SpellId); + _lastLiquid = NULL; + } + + // All liquids type - check under water position - if (liquid_status.type&(MAP_LIQUID_TYPE_WATER|MAP_LIQUID_TYPE_OCEAN|MAP_LIQUID_TYPE_MAGMA|MAP_LIQUID_TYPE_SLIME)) + if (liquid_status.type_flags & (MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN | MAP_LIQUID_TYPE_MAGMA | MAP_LIQUID_TYPE_SLIME)) { if (res & LIQUID_MAP_UNDER_WATER) m_MirrorTimerFlags |= UNDERWATER_INWATER; @@ -23146,23 +23544,23 @@ void Player::UpdateUnderwaterState(Map* m, float x, float y, float z) } // Allow travel in dark water on taxi or transport - if ((liquid_status.type & MAP_LIQUID_TYPE_DARK_WATER) && !isInFlight() && !GetTransport()) + if ((liquid_status.type_flags & MAP_LIQUID_TYPE_DARK_WATER) && !isInFlight() && !GetTransport()) m_MirrorTimerFlags |= UNDERWARER_INDARKWATER; else m_MirrorTimerFlags &= ~UNDERWARER_INDARKWATER; // in lava check, anywhere in lava level - if (liquid_status.type&MAP_LIQUID_TYPE_MAGMA) + if (liquid_status.type_flags & MAP_LIQUID_TYPE_MAGMA) { - if (res & (LIQUID_MAP_UNDER_WATER|LIQUID_MAP_IN_WATER|LIQUID_MAP_WATER_WALK)) + if (res & (LIQUID_MAP_UNDER_WATER | LIQUID_MAP_IN_WATER | LIQUID_MAP_WATER_WALK)) m_MirrorTimerFlags |= UNDERWATER_INLAVA; else m_MirrorTimerFlags &= ~UNDERWATER_INLAVA; } // in slime check, anywhere in slime level - if (liquid_status.type&MAP_LIQUID_TYPE_SLIME) + if (liquid_status.type_flags & MAP_LIQUID_TYPE_SLIME) { - if (res & (LIQUID_MAP_UNDER_WATER|LIQUID_MAP_IN_WATER|LIQUID_MAP_WATER_WALK)) + if (res & (LIQUID_MAP_UNDER_WATER | LIQUID_MAP_IN_WATER | LIQUID_MAP_WATER_WALK)) m_MirrorTimerFlags |= UNDERWATER_INSLIME; else m_MirrorTimerFlags &= ~UNDERWATER_INSLIME; @@ -23386,7 +23784,6 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) GetSession()->SendPacket(&data); } -/*-----------------------TRINITY--------------------------*/ bool Player::isTotalImmunity() { AuraEffectList const& immune = GetAuraEffectsByType(SPELL_AURA_SCHOOL_IMMUNITY); @@ -23518,7 +23915,8 @@ void Player::AddRunePower(uint8 index) GetSession()->SendPacket(&data); } -static RuneType runeSlotTypes[MAX_RUNES] = { +static RuneType runeSlotTypes[MAX_RUNES] = +{ /*0*/ RUNE_BLOOD, /*1*/ RUNE_BLOOD, /*2*/ RUNE_UNHOLY, @@ -24107,7 +24505,7 @@ void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank) if (!talentTabInfo) return; - CreatureTemplate const* ci = pet->GetCreatureInfo(); + CreatureTemplate const* ci = pet->GetCreatureTemplate(); if (!ci) return; @@ -24370,7 +24768,7 @@ void Player::BuildPetTalentsInfoData(WorldPacket* data) data->put(pointsPos, unspentTalentPoints); // put real points - CreatureTemplate const* ci = pet->GetCreatureInfo(); + CreatureTemplate const* ci = pet->GetCreatureTemplate(); if (!ci) return; @@ -24690,11 +25088,24 @@ void Player::_LoadGlyphs(PreparedQueryResult result) void Player::_SaveGlyphs(SQLTransaction& trans) { - trans->PAppend("DELETE FROM character_glyphs WHERE guid='%u'", GetGUIDLow()); - for (uint8 spec = 0; spec < GetSpecsCount(); ++spec) + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); + stmt->setUInt32(0, GetGUIDLow()); + trans->Append(stmt); + + + for (uint8 spec = 0; spec < m_specsCount; ++spec) { - trans->PAppend("INSERT INTO character_glyphs VALUES('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", - GetGUIDLow(), spec, GetGlyph(spec, 0), GetGlyph(spec, 1), GetGlyph(spec, 2), GetGlyph(spec, 3), GetGlyph(spec, 4), GetGlyph(spec, 5)); + uint8 index = 0; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS); + stmt->setUInt32(index++, GetGUIDLow()); + + stmt->setUInt8(index++, spec); + + for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) + stmt->setUInt16(index++, uint16(m_Glyphs[spec][i])); + + trans->Append(stmt); } } @@ -24704,22 +25115,36 @@ void Player::_LoadTalents(PreparedQueryResult result) if (result) { do - AddTalent((*result)[0].GetUInt32(), (*result)[1].GetUInt32(), false); + AddTalent((*result)[0].GetUInt32(), (*result)[1].GetUInt8(), false); while (result->NextRow()); } } void Player::_SaveTalents(SQLTransaction& trans) { + PreparedStatement* stmt = NULL; + for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i) { for (PlayerTalentMap::iterator itr = GetTalentMap(i)->begin(); itr != GetTalentMap(i)->end();) { if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->state == PLAYERSPELL_CHANGED) - trans->PAppend("DELETE FROM character_talent WHERE guid = '%u' and spell = '%u' and spec = '%u'", GetGUIDLow(), itr->first, itr->second->spec); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, itr->first); + stmt->setUInt8(2, itr->second->spec); + trans->Append(stmt); + } if (itr->second->state == PLAYERSPELL_NEW || itr->second->state == PLAYERSPELL_CHANGED) - trans->PAppend("INSERT INTO character_talent (guid, spell, spec) VALUES ('%u', '%u', '%u')", GetGUIDLow(), itr->first, itr->second->spec); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32(1, itr->first); + stmt->setUInt8(2, itr->second->spec); + trans->Append(stmt); + } if (itr->second->state == PLAYERSPELL_REMOVED) { @@ -24745,21 +25170,33 @@ void Player::UpdateSpecCount(uint8 count) ActivateSpec(0); SQLTransaction trans = CharacterDatabase.BeginTransaction(); + PreparedStatement* stmt = NULL; // Copy spec data if (count > curCount) { _SaveActions(trans); // make sure the button list is cleaned up for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end(); ++itr) - trans->PAppend("INSERT INTO character_action (guid, button, action, type, spec) VALUES ('%u', '%u', '%u', '%u', '%u')", - GetGUIDLow(), uint32(itr->first), uint32(itr->second.GetAction()), uint32(itr->second.GetType()), 1); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt8(1, 1); + stmt->setUInt8(2, itr->first); + stmt->setUInt32(3, itr->second.GetAction()); + stmt->setUInt8(4, uint8(itr->second.GetType())); + trans->Append(stmt); + } } // Delete spec data for removed spec. else if (count < curCount) { _SaveActions(trans); - trans->PAppend("DELETE FROM character_action WHERE spec<>'%u' AND guid='%u'", GetActiveSpec(), GetGUIDLow()); - SetActiveSpec(0); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC); + stmt->setUInt8(0, m_activeSpec); + stmt->setUInt32(1, GetGUIDLow()); + trans->Append(stmt); + } CharacterDatabase.CommitTransaction(trans); @@ -25231,3 +25668,53 @@ bool Player::IsInWhisperWhiteList(uint64 guid) } return false; } + +bool Player::SetHover(bool enable) +{ + if (!Unit::SetHover(enable)) + return false; + + return true; +} + +void Player::SendMovementSetCanFly(bool apply) +{ + WorldPacket data(apply ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY, 12); + data.append(GetPackGUID()); + data << uint32(0); //! movement counter + SendDirectMessage(&data); +} + +void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) +{ + WorldPacket data(apply ? + SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY : + SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, 12); + data.append(GetPackGUID()); + data << uint32(0); //! movement counter + SendDirectMessage(&data); +} + +void Player::SendMovementSetHover(bool apply) +{ + WorldPacket data(apply ? SMSG_MOVE_SET_HOVER : SMSG_MOVE_UNSET_HOVER, 12); + data.append(GetPackGUID()); + data << uint32(0); //! movement counter + SendDirectMessage(&data); +} + +void Player::SendMovementSetWaterWalking(bool apply) +{ + WorldPacket data(apply ? SMSG_MOVE_WATER_WALK : SMSG_MOVE_LAND_WALK, 12); + data.append(GetPackGUID()); + data << uint32(0); //! movement counter + SendDirectMessage(&data); +} + +void Player::SendMovementSetFeatherFall(bool apply) +{ + WorldPacket data(apply ? SMSG_MOVE_FEATHER_FALL : SMSG_MOVE_NORMAL_FALL, 12); + data.append(GetPackGUID()); + data << uint32(0); //! movement counter + SendDirectMessage(&data); +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b3315ceec9f..dc6fd7eab26 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -703,9 +703,9 @@ enum TransferAbortReason TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place! TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later. TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1 - TRANSFER_ABORT_NOT_FOUND2 = 0x0C, // 3.1 - TRANSFER_ABORT_NOT_FOUND3 = 0x0D, // 3.1 - TRANSFER_ABORT_NOT_FOUND4 = 0x0E, // 3.2 + TRANSFER_ABORT_NOT_FOUND1 = 0x0C, // 3.1 + TRANSFER_ABORT_NOT_FOUND2 = 0x0D, // 3.1 + TRANSFER_ABORT_NOT_FOUND3 = 0x0E, // 3.2 TRANSFER_ABORT_REALM_ONLY = 0x0F, // All players on party must be from the same realm. TRANSFER_ABORT_MAP_NOT_ALLOWED = 0x10, // Map can't be entered at this time. TRANSFER_ABORT_LOCKED_TO_DIFFERENT_INSTANCE = 0x12, // 4.2.2 @@ -1120,7 +1120,7 @@ class Player : public Unit, public GridObject friend void Item::RemoveFromUpdateQueueOf(Player* player); public: explicit Player (WorldSession* session); - ~Player (); + ~Player(); void CleanupsBeforeDelete(bool finalCleanup = true); @@ -1395,6 +1395,7 @@ class Player : public Unit, public GridObject void UpdateEnchantTime(uint32 time); void UpdateSoulboundTradeItems(); + void AddTradeableItem(Item* item); void RemoveTradeableItem(Item* item); void UpdateItemDuration(uint32 time, bool realtimeonly = false); void AddEnchantmentDurations(Item* item); @@ -1568,7 +1569,7 @@ class Player : public Unit, public GridObject static uint32 GetLevelFromDB(uint64 guid); static bool LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, float& o, bool& in_flight, uint64 guid); - static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE ; } + static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE; } static bool IsValidClass(uint8 Class) { return (1 << (Class - 1)) & CLASSMASK_ALL_PLAYABLE; } static bool IsValidRace(uint8 Race) { return (1 << (Race - 1)) & RACEMASK_ALL_PLAYABLE; } @@ -1602,7 +1603,7 @@ class Player : public Unit, public GridObject void setRegenTimerCount(uint32 time) {m_regenTimerCount = time;} void setWeaponChangeTimer(uint32 time) {m_weaponChangeTimer = time;} - uint32 GetMoney() const { return GetUInt32Value (PLAYER_FIELD_COINAGE); } + uint32 GetMoney() const { return GetUInt32Value(PLAYER_FIELD_COINAGE); } void ModifyMoney(int32 d); bool HasEnoughMoney(uint32 amount) const { return (GetMoney() >= amount); } bool HasEnoughMoney(int32 amount) const @@ -1614,13 +1615,13 @@ class Player : public Unit, public GridObject void SetMoney(uint32 value) { - SetUInt32Value (PLAYER_FIELD_COINAGE, value); + SetUInt32Value(PLAYER_FIELD_COINAGE, value); MoneyChanged(value); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED); } RewardedQuestSet const& getRewardedQuests() const { return m_RewardedQuests; } - QuestStatusMap& getQuestStatusMap() { return m_QuestStatus; }; + QuestStatusMap& getQuestStatusMap() { return m_QuestStatus; } size_t GetRewardedQuestCount() const { return m_RewardedQuests.size(); } bool IsQuestRewarded(uint32 quest_id) const @@ -1633,7 +1634,7 @@ class Player : public Unit, public GridObject Player* GetSelectedPlayer() const; void SetSelection(uint64 guid) { m_curSelection = guid; SetUInt64Value(UNIT_FIELD_TARGET, guid); } - uint8 GetComboPoints() { return m_comboPoints; } + uint8 GetComboPoints() const { return m_comboPoints; } uint64 GetComboTarget() const { return m_comboTarget; } void AddComboPoints(Unit* target, int8 count, Spell* spell = NULL); @@ -1996,7 +1997,7 @@ class Player : public Unit, public GridObject WorldSession* GetSession() const { return m_session; } void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const; - void DestroyForPlayer(Player* target, bool anim = false) const; + void DestroyForPlayer(Player* target, bool onDeath = false) const; void SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend = false, float group_rate=1.0f); // notifiers @@ -2064,7 +2065,7 @@ class Player : public Unit, public GridObject void UpdateDefense(); void UpdateWeaponSkill (WeaponAttackType attType); - void UpdateCombatSkills(Unit* pVictim, WeaponAttackType attType, bool defence); + void UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence); void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal); uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus @@ -2097,9 +2098,9 @@ class Player : public Unit, public GridObject bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const; bool IsAtRecruitAFriendDistance(WorldObject const* pOther) const; - void RewardPlayerAndGroupAtKill(Unit* pVictim, bool isBattleGround); + void RewardPlayerAndGroupAtKill(Unit* victim, bool isBattleGround); void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource); - bool isHonorOrXPTarget(Unit* pVictim); + bool isHonorOrXPTarget(Unit* victim); bool GetsRecruitAFriendBonus(bool forXP); uint8 GetGrantableLevels() { return m_grantableLevels; } @@ -2108,7 +2109,7 @@ class Player : public Unit, public GridObject ReputationMgr& GetReputationMgr() { return m_reputationMgr; } ReputationMgr const& GetReputationMgr() const { return m_reputationMgr; } ReputationRank GetReputationRank(uint32 faction_id) const; - void RewardReputation(Unit* pVictim, float rate); + void RewardReputation(Unit* victim, float rate); void RewardReputation(Quest const* quest); void UpdateSkillsForLevel(); @@ -2362,6 +2363,8 @@ class Player : public Unit, public GridObject m_mover->m_movedPlayer = this; } + bool SetHover(bool enable); + void SetSeer(WorldObject* target) { m_seer = target; } void SetViewpoint(WorldObject* target, bool apply); WorldObject* GetViewpoint() const; @@ -2407,7 +2410,7 @@ class Player : public Unit, public GridObject void UpdateTriggerVisibility(); template - void UpdateVisibilityOf(T* target, UpdateData& data, std::set& visibleNow); + void UpdateVisibilityOf(T* target, UpdateData& data, std::set& visibleNow); uint8 m_forced_speed_changes[MAX_MOVE_TYPE]; @@ -2490,6 +2493,7 @@ class Player : public Unit, public GridObject void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); } Player* GetNextRandomRaidMember(float radius); PartyResult CanUninviteFromGroup() const; + // Battleground Group System void SetBattlegroundRaid(Group* group, int8 subgroup = -1); void RemoveFromBattlegroundRaid(); @@ -2553,6 +2557,17 @@ class Player : public Unit, public GridObject void AddWhisperWhiteList(uint64 guid) { WhisperList.push_back(guid); } bool IsInWhisperWhiteList(uint64 guid); + /*! These methods send different packets to the client in apply and unapply case. + These methods are only sent to the current unit. + */ + void SendMovementSetCanFly(bool apply); + void SendMovementSetCanTransitionBetweenSwimAndFly(bool apply); + void SendMovementSetHover(bool apply); + void SendMovementSetWaterWalking(bool apply); + void SendMovementSetFeatherFall(bool apply); + + bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); } + //! Return collision height sent to client float GetCollisionHeight(bool mounted) { @@ -2585,7 +2600,6 @@ class Player : public Unit, public GridObject return modelData->CollisionHeight; } - //! TODO: Need a proper calculation for collision height when mounted } protected: diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index cb327b83d17..1ded8cda81b 100755 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -61,7 +61,7 @@ bool PlayerSocial::AddToSocialList(uint32 friendGuid, bool ignore) return false; } - uint32 flag = SOCIAL_FLAG_FRIEND; + uint8 flag = SOCIAL_FLAG_FRIEND; if (ignore) flag = SOCIAL_FLAG_IGNORED; @@ -70,7 +70,7 @@ bool PlayerSocial::AddToSocialList(uint32 friendGuid, bool ignore) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS); - stmt->setUInt8(0, uint8(flag)); + stmt->setUInt8(0, flag); stmt->setUInt32(1, GetPlayerGUID()); stmt->setUInt32(2, friendGuid); @@ -84,7 +84,7 @@ bool PlayerSocial::AddToSocialList(uint32 friendGuid, bool ignore) stmt->setUInt32(0, GetPlayerGUID()); stmt->setUInt32(1, friendGuid); - stmt->setUInt8(2, uint8(flag)); + stmt->setUInt8(2, flag); CharacterDatabase.Execute(stmt); @@ -101,7 +101,7 @@ void PlayerSocial::RemoveFromSocialList(uint32 friendGuid, bool ignore) if (itr == m_playerSocialMap.end()) // not exist return; - uint32 flag = SOCIAL_FLAG_FRIEND; + uint8 flag = SOCIAL_FLAG_FRIEND; if (ignore) flag = SOCIAL_FLAG_IGNORED; @@ -121,7 +121,7 @@ void PlayerSocial::RemoveFromSocialList(uint32 friendGuid, bool ignore) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS); - stmt->setUInt8(0, uint8(flag)); + stmt->setUInt8(0, flag); stmt->setUInt32(1, GetPlayerGUID()); stmt->setUInt32(2, friendGuid); @@ -321,7 +321,7 @@ void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket* packet) } } -PlayerSocial *SocialMgr::LoadFromDB(PreparedQueryResult result, uint32 guid) +PlayerSocial* SocialMgr::LoadFromDB(PreparedQueryResult result, uint32 guid) { PlayerSocial *social = &m_socialMap[guid]; social->SetPlayerGUID(guid); @@ -330,7 +330,7 @@ PlayerSocial *SocialMgr::LoadFromDB(PreparedQueryResult result, uint32 guid) return social; uint32 friend_guid = 0; - uint32 flags = 0; + uint8 flags = 0; std::string note = ""; do @@ -338,7 +338,7 @@ PlayerSocial *SocialMgr::LoadFromDB(PreparedQueryResult result, uint32 guid) Field* fields = result->Fetch(); friend_guid = fields[0].GetUInt32(); - flags = fields[1].GetUInt32(); + flags = fields[1].GetUInt8(); note = fields[2].GetString(); social->m_playerSocialMap[friend_guid] = FriendInfo(flags, note); diff --git a/src/server/game/Entities/Player/SocialMgr.h b/src/server/game/Entities/Player/SocialMgr.h index 540b425588e..3c7d13070fa 100755 --- a/src/server/game/Entities/Player/SocialMgr.h +++ b/src/server/game/Entities/Player/SocialMgr.h @@ -48,7 +48,7 @@ enum SocialFlag struct FriendInfo { FriendStatus Status; - uint32 Flags; + uint8 Flags; uint32 Area; uint8 Level; uint8 Class; @@ -64,7 +64,7 @@ struct FriendInfo Note = ""; } - FriendInfo(uint32 flags, const std::string& note) + FriendInfo(uint8 flags, const std::string& note) { Status = FRIEND_STATUS_OFFLINE; Flags = flags; diff --git a/src/server/game/Entities/Totem/Totem.h b/src/server/game/Entities/Totem/Totem.h index 8b00da34d73..c33b8776660 100755 --- a/src/server/game/Entities/Totem/Totem.h +++ b/src/server/game/Entities/Totem/Totem.h @@ -60,4 +60,3 @@ class Totem : public Minion uint32 m_duration; }; #endif - diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index f18b041ba88..a00fcae1e09 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -52,7 +52,7 @@ void MapManager::LoadTransports() uint32 period = fields[3].GetUInt32(); uint32 scriptId = sObjectMgr->GetScriptId(fields[4].GetCString()); - const GameObjectTemplate* goinfo = sObjectMgr->GetGameObjectTemplate(entry); + GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry); if (!goinfo) { @@ -86,7 +86,7 @@ void MapManager::LoadTransports() float o = 1.0f; // creates the Gameobject - if (!t->Create(lowguid, entry, mapid, x, y, z, o, 100, 0)) + if (!t->Create(lowguid, entry, mapid, x, y, z, o, 255, 0)) { delete t; continue; @@ -129,8 +129,8 @@ void MapManager::LoadTransportNPCs() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 7 - QueryResult result = WorldDatabase.PQuery("SELECT guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO, emote FROM creature_transport"); + // 0 1 2 3 4 5 6 7 + QueryResult result = WorldDatabase.Query("SELECT guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO, emote FROM creature_transport"); if (!result) { @@ -144,14 +144,14 @@ void MapManager::LoadTransportNPCs() do { Field* fields = result->Fetch(); - uint32 guid = fields[0].GetUInt32(); - uint32 entry = fields[1].GetUInt32(); - uint32 transportEntry = fields[2].GetUInt32(); + uint32 guid = fields[0].GetInt32(); + uint32 entry = fields[1].GetInt32(); + uint32 transportEntry = fields[2].GetInt32(); float tX = fields[3].GetFloat(); float tY = fields[4].GetFloat(); float tZ = fields[5].GetFloat(); float tO = fields[6].GetFloat(); - uint32 anim = fields[7].GetUInt32(); + uint32 anim = fields[7].GetInt32(); for (MapManager::TransportSet::iterator itr = m_Transports.begin(); itr != m_Transports.end(); ++itr) { @@ -173,7 +173,7 @@ void MapManager::LoadTransportNPCs() Transport::Transport(uint32 period, uint32 script) : GameObject(), m_pathTime(0), m_timer(0), currenttguid(0), m_period(period), ScriptId(script), m_nextNodeTime(0) { - m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_ROTATION); + m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION); } Transport::~Transport() @@ -214,11 +214,10 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa m_goInfo = goinfo; - SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size); + SetObjectScale(goinfo->size); SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction); - //SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags); - SetUInt32Value(GAMEOBJECT_FLAGS, MAKE_PAIR32(0x28, 0x64)); + SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags); SetUInt32Value(GAMEOBJECT_LEVEL, m_period); SetEntry(goinfo->entry); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index c25c4d3d79d..c307324bead 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -142,13 +142,13 @@ void Player::ApplySpellPowerBonus(int32 amount, bool apply) void Player::UpdateSpellDamageAndHealingBonus() { - // Magic damage modifiers implemented in Unit::SpellDamageBonus + // Magic damage modifiers implemented in Unit::SpellDamageBonusDone // This information for client side use only // Get healing bonus for all schools - SetStatInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS, SpellBaseHealingBonus(SPELL_SCHOOL_MASK_ALL)); + SetStatInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS, SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_ALL)); // Get damage bonus for all schools for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - SetStatInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i, SpellBaseDamageBonus(SpellSchoolMask(1 << i))); + SetStatInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i, SpellBaseDamageBonusDone(SpellSchoolMask(1 << i))); } bool Player::UpdateAllStats() @@ -352,7 +352,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) break; } case CLASS_MAGE: - val2 = GetStat(STAT_STRENGTH) - 10.0f; + val2 = GetStat(STAT_STRENGTH) - 10.0f; break; case CLASS_PRIEST: val2 = GetStat(STAT_STRENGTH) - 10.0f; @@ -967,12 +967,12 @@ void Creature::UpdateDamagePhysical(WeaponAttackType attType) float weapon_maxdamage = GetWeaponDamageRange(attType, MAXDAMAGE); /* difference in AP between current attack power and base value from DB */ - float att_pwr_change = GetTotalAttackPowerValue(attType) - GetCreatureInfo()->attackpower; + float att_pwr_change = GetTotalAttackPowerValue(attType) - GetCreatureTemplate()->attackpower; float base_value = GetModifierValue(unitMod, BASE_VALUE) + (att_pwr_change * GetAPMultiplier(attType, false) / 14.0f); float base_pct = GetModifierValue(unitMod, BASE_PCT); float total_value = GetModifierValue(unitMod, TOTAL_VALUE); float total_pct = GetModifierValue(unitMod, TOTAL_PCT); - float dmg_multiplier = GetCreatureInfo()->dmg_multiplier; + float dmg_multiplier = GetCreatureTemplate()->dmg_multiplier; if (!CanUseAttackType(attType)) { @@ -1016,6 +1016,7 @@ void Creature::UpdateDamagePhysical(WeaponAttackType attType) #define ENTRY_TREANT 1964 #define ENTRY_FIRE_ELEMENTAL 15438 #define ENTRY_GHOUL 26125 +#define ENTRY_BLOODWORM 28017 bool Guardian::UpdateStats(Stats stat) { @@ -1165,6 +1166,7 @@ void Guardian::UpdateMaxHealth() case ENTRY_SUCCUBUS: multiplicator = 9.1f; break; case ENTRY_FELHUNTER: multiplicator = 9.5f; break; case ENTRY_FELGUARD: multiplicator = 11.0f; break; + case ENTRY_BLOODWORM: multiplicator = 1.0f; break; default: multiplicator = 10.0f; break; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 01c1175f074..6ae8e0b7caf 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -71,7 +71,9 @@ float baseMoveSpeed[MAX_MOVE_TYPE] = 4.5f, // MOVE_FLIGHT_BACK 3.14f // MOVE_PITCH_RATE }; -float playerBaseMoveSpeed[MAX_MOVE_TYPE] = { + +float playerBaseMoveSpeed[MAX_MOVE_TYPE] = +{ 2.5f, // MOVE_WALK 7.0f, // MOVE_RUN 4.5f, // MOVE_RUN_BACK @@ -110,23 +112,27 @@ m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType) m_resist = 0; m_block = 0; } + void DamageInfo::ModifyDamage(int32 amount) { amount = std::min(amount, int32(GetDamage())); m_damage += amount; } + void DamageInfo::AbsorbDamage(uint32 amount) { amount = std::min(amount, GetDamage()); m_absorb += amount; m_damage -= amount; } + void DamageInfo::ResistDamage(uint32 amount) { amount = std::min(amount, GetDamage()); m_resist += amount; m_damage -= amount; } + void DamageInfo::BlockDamage(uint32 amount) { amount = std::min(amount, GetDamage()); @@ -158,7 +164,7 @@ m_HostileRefManager(this) m_objectType |= TYPEMASK_UNIT; m_objectTypeId = TYPEID_UNIT; - m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION); + m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_STATIONARY_POSITION); m_attackTimer[BASE_ATTACK] = 0; m_attackTimer[OFF_ATTACK] = 0; @@ -246,6 +252,7 @@ m_HostileRefManager(this) _focusSpell = NULL; _targetLocked = false; + _lastLiquid = NULL; } //////////////////////////////////////////////////////////// @@ -430,7 +437,7 @@ void Unit::SendMonsterMoveTransport(Unit* vehicleOwner) data.append(GetPackGUID()); data.append(vehicleOwner->GetPackGUID()); data << int8(GetTransSeat()); - data << uint8(GetTypeId() == TYPEID_PLAYER ? 1 : 0); // boolean + data << uint8(0); data << GetPositionX() - vehicleOwner->GetPositionX(); data << GetPositionY() - vehicleOwner->GetPositionY(); data << GetPositionZ() - vehicleOwner->GetPositionZ(); @@ -453,7 +460,8 @@ void Unit::resetAttackTimer(WeaponAttackType type) bool Unit::IsWithinCombatRange(const Unit* obj, float dist2compare) const { - if (!obj || !IsInMap(obj)) return false; + if (!obj || !IsInMap(obj) || !InSamePhase(obj)) + return false; float dx = GetPositionX() - obj->GetPositionX(); float dy = GetPositionY() - obj->GetPositionY(); @@ -468,7 +476,8 @@ bool Unit::IsWithinCombatRange(const Unit* obj, float dist2compare) const bool Unit::IsWithinMeleeRange(const Unit* obj, float dist) const { - if (!obj || !IsInMap(obj)) return false; + if (!obj || !IsInMap(obj) || !InSamePhase(obj)) + return false; float dx = GetPositionX() - obj->GetPositionX(); float dy = GetPositionY() - obj->GetPositionY(); @@ -564,6 +573,15 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam if (IsAIEnabled) GetAI()->DamageDealt(victim, damage, damagetype); + // Signal to pets that their owner was attacked + if (victim->GetTypeId() == TYPEID_PLAYER) + { + Pet* pet = victim->ToPlayer()->GetPet(); + + if (pet && pet->isAlive()) + pet->AI()->OwnerDamagedBy(this); + } + if (damagetype != NODAMAGE) { // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras) @@ -661,7 +679,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam duel_hasEnded = true; } - else if (victim->IsVehicle() && damage >= (health-1) && victim->GetCharmer() && victim->GetCharmer()->GetTypeId() == TYPEID_PLAYER) + else if (victim->IsVehicle() && damage >= (health-1) && victim->GetCharmer() && victim->GetCharmer()->GetTypeId() == TYPEID_PLAYER) { Player* victimRider = victim->GetCharmer()->ToPlayer(); @@ -784,20 +802,9 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam // last damage from duel opponent if (duel_hasEnded) { - Player* he; - - if (duel_wasMounted) - { - ASSERT(victim->GetCharmer()->GetTypeId() == TYPEID_PLAYER); - he = victim->GetCharmer()->ToPlayer(); - } - else - { - ASSERT(victim->GetTypeId() == TYPEID_PLAYER); - he = victim->ToPlayer(); - } + Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer(); - ASSERT(he->duel); + ASSERT(he && he->duel); if (duel_wasMounted) // In this case victim==mount victim->SetHealth(1); @@ -946,7 +953,9 @@ uint32 Unit::SpellNonMeleeDamageLog(Unit* victim, uint32 spellID, uint32 damage) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID); SpellNonMeleeDamage damageInfo(this, victim, spellInfo->Id, spellInfo->SchoolMask); - damage = SpellDamageBonus(victim, spellInfo, damage, SPELL_DIRECT_DAMAGE); + damage = SpellDamageBonusDone(victim, spellInfo, damage, SPELL_DIRECT_DAMAGE); + damage = victim->SpellDamageBonusTaken(this, spellInfo, damage, SPELL_DIRECT_DAMAGE); + CalculateSpellDamageTaken(&damageInfo, damage, spellInfo); DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); SendSpellNonMeleeDamageLog(&damageInfo); @@ -1107,6 +1116,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam if (!victim) return; + if (!isAlive() || !victim->isAlive()) return; @@ -1116,12 +1126,11 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam case BASE_ATTACK: damageInfo->procAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_MAINHAND_ATTACK; damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; - damageInfo->HitInfo = HITINFO_NORMALSWING2; break; case OFF_ATTACK: damageInfo->procAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK; damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; - damageInfo->HitInfo = HITINFO_LEFTSWING; + damageInfo->HitInfo = HITINFO_OFFHAND; break; default: return; @@ -1141,7 +1150,8 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damage += CalculateDamage(damageInfo->attackType, false, true); // Add melee damage bonus - MeleeDamageBonus(damageInfo->target, &damage, damageInfo->attackType); + damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType); + damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType); // Calculate armor reduction if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damageSchoolMask))) @@ -1157,29 +1167,29 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam switch (damageInfo->hitOutCome) { case MELEE_HIT_EVADE: - damageInfo->HitInfo |= HITINFO_MISS|HITINFO_SWINGNOHITSOUND; - damageInfo->TargetState = VICTIMSTATE_EVADES; - damageInfo->procEx|=PROC_EX_EVADE; + damageInfo->HitInfo |= HITINFO_MISS | HITINFO_SWINGNOHITSOUND; + damageInfo->TargetState = VICTIMSTATE_EVADES; + damageInfo->procEx |= PROC_EX_EVADE; damageInfo->damage = 0; damageInfo->cleanDamage = 0; return; case MELEE_HIT_MISS: - damageInfo->HitInfo |= HITINFO_MISS; - damageInfo->TargetState = VICTIMSTATE_INTACT; - damageInfo->procEx |= PROC_EX_MISS; - damageInfo->damage = 0; - damageInfo->cleanDamage = 0; + damageInfo->HitInfo |= HITINFO_MISS; + damageInfo->TargetState = VICTIMSTATE_INTACT; + damageInfo->procEx |= PROC_EX_MISS; + damageInfo->damage = 0; + damageInfo->cleanDamage = 0; break; case MELEE_HIT_NORMAL: - damageInfo->TargetState = VICTIMSTATE_HIT; - damageInfo->procEx|=PROC_EX_NORMAL_HIT; + damageInfo->TargetState = VICTIMSTATE_HIT; + damageInfo->procEx |= PROC_EX_NORMAL_HIT; break; case MELEE_HIT_CRIT: { - damageInfo->HitInfo |= HITINFO_CRITICALHIT; - damageInfo->TargetState = VICTIMSTATE_HIT; + damageInfo->HitInfo |= HITINFO_CRITICALHIT; + damageInfo->TargetState = VICTIMSTATE_HIT; - damageInfo->procEx |= PROC_EX_CRITICAL_HIT; + damageInfo->procEx |= PROC_EX_CRITICAL_HIT; // Crit bonus calc damageInfo->damage += damageInfo->damage; float mod = 0.0f; @@ -1240,8 +1250,8 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam if (leveldif > 3) leveldif = 3; float reducePercent = 1 - leveldif * 0.1f; - damageInfo->cleanDamage += damageInfo->damage-uint32(reducePercent * damageInfo->damage); - damageInfo->damage = uint32(reducePercent * damageInfo->damage); + damageInfo->cleanDamage += damageInfo->damage - uint32(reducePercent * damageInfo->damage); + damageInfo->damage = uint32(reducePercent * damageInfo->damage); break; } case MELEE_HIT_CRUSHING: @@ -1255,6 +1265,10 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam break; } + // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss + if (!(damageInfo->HitInfo & HITINFO_MISS)) + damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM; + int32 resilienceReduction = damageInfo->damage; if (attackType != RANGED_ATTACK) ApplyResilience(victim, NULL, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE); @@ -1270,14 +1284,17 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE; // Calculate absorb & resists CalcAbsorbResist(damageInfo->target, SpellSchoolMask(damageInfo->damageSchoolMask), DIRECT_DAMAGE, damageInfo->damage, &damageInfo->absorb, &damageInfo->resist); - damageInfo->damage -= damageInfo->absorb + damageInfo->resist; + if (damageInfo->absorb) { - damageInfo->HitInfo |= HITINFO_ABSORB; + damageInfo->HitInfo |= (damageInfo->damage - damageInfo->absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB); damageInfo->procEx |= PROC_EX_ABSORB; } + if (damageInfo->resist) - damageInfo->HitInfo |= HITINFO_RESIST; + damageInfo->HitInfo |= (damageInfo->damage - damageInfo->resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST); + + damageInfo->damage -= damageInfo->absorb + damageInfo->resist; } else // Impossible get negative result but.... damageInfo->damage = 0; @@ -1386,7 +1403,10 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) uint32 damage = (*dmgShieldItr)->GetAmount(); if (Unit* caster = (*dmgShieldItr)->GetCaster()) - damage = caster->SpellDamageBonus(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE); + { + damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE); + damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE); + } // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that victim->DealDamageMods(this, damage, NULL); @@ -1478,8 +1498,8 @@ uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo if (GetTypeId() == TYPEID_PLAYER) { float bonusPct = 0; - AuraEffectList const& ResIgnoreAuras = GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT); - for (AuraEffectList::const_iterator itr = ResIgnoreAuras.begin(); itr != ResIgnoreAuras.end(); ++itr) + AuraEffectList const& armorPenAuras = GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT); + for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr) { if ((*itr)->GetSpellInfo()->EquippedItemClass == -1) { @@ -1490,7 +1510,7 @@ uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo } else { - if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo())) + if (ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo())) bonusPct += (*itr)->GetAmount(); } } @@ -1500,6 +1520,7 @@ uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo maxArmorPen = float(400 + 85 * victim->getLevel()); else maxArmorPen = 400 + 85 * victim->getLevel() + 4.5f * 85 * (victim->getLevel() - 59); + // Cap armor penetration to this number maxArmorPen = std::min((armor + maxArmorPen) / 3, armor); // Figure out how much armor do we ignore @@ -1536,7 +1557,8 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe DamageInfo dmgInfo = DamageInfo(this, victim, damage, spellInfo, schoolMask, damagetype); // Magic damage, check for resists - if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0) + // Ignore spells that cant be resisted + if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0 && (!spellInfo || (spellInfo->AttributesEx4 & SPELL_ATTR4_IGNORE_RESISTANCES) == 0)) { float victimResistance = float(victim->GetResistance(schoolMask)); victimResistance += float(GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask)); @@ -2023,7 +2045,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT else parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25; - if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY)) + if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY)) { int32 tmp2 = int32(parry_chance); if (tmp2 > 0 // check if unit _can_ parry @@ -2035,7 +2057,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT } } - if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)) + if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)) { tmp = block_chance; if (tmp > 0 // check if unit _can_ block @@ -2054,7 +2076,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT if (tmp > 0 && roll < (sum += tmp)) { sLog->outStaticDebug ("RollMeleeOutcomeAgainst: CRIT <%d, %d)", sum-tmp, sum); - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) + if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) sLog->outStaticDebug ("RollMeleeOutcomeAgainst: CRIT DISABLED)"); else return MELEE_HIT_CRIT; @@ -2084,7 +2106,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 && // can be from by creature (if can) or from controlled player that considered as creature !IsControlledByPlayer() && - !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH)) + !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH)) { // when their weapon skill is 15 or more above victim's defense skill tmp = victimDefenseSkill; @@ -2177,8 +2199,8 @@ void Unit::SendMeleeAttackStop(Unit* victim) { WorldPacket data(SMSG_ATTACKSTOP, (8+8+4)); data.append(GetPackGUID()); - data.append(victim ? victim->GetPackGUID() : 0); // can be 0x00... - data << uint32(0); // can be 0x1 + data.append(victim ? victim->GetPackGUID() : 0); + data << uint32(0); //! Can also take the value 0x01, which seems related to updating rotation SendMessageToSet(&data, true); sLog->outStaticDebug("WORLD: Sent SMSG_ATTACKSTOP"); @@ -2198,7 +2220,7 @@ bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttac { // Check creatures flags_extra for disable block if (victim->GetTypeId() == TYPEID_UNIT && - victim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK) + victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK) return false; float blockChance = victim->GetUnitBlockChance(); @@ -2336,7 +2358,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spell) // Check creatures flags_extra for disable parry if (victim->GetTypeId() == TYPEID_UNIT) { - uint32 flagEx = victim->ToCreature()->GetCreatureInfo()->flags_extra; + uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra; if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY) canParry = false; // Check creatures flags_extra for disable block @@ -2887,7 +2909,8 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell) CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer(); - if (pSpell == m_currentSpells[CSpellType]) return; // avoid breaking self + if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self + return; // break same type spell if it is not delayed InterruptSpell(CSpellType, false); @@ -3008,20 +3031,20 @@ bool Unit::IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled, bool skip (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED)) { if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) - return(true); + return true; } // channeled spells may be delayed, but they are still considered casted else if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] && (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)) { if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) - return(true); + return true; } // autorepeat spells may be finished or delayed, but they are still considered casted else if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]) - return(true); + return true; - return(false); + return false; } void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id, bool withInstant) @@ -3069,7 +3092,7 @@ bool Unit::isInAccessiblePlaceFor(Creature const* c) const if (IsInWater()) return c->canSwim(); else - return c->canWalk() || c->canFly(); + return c->canWalk() || c->CanFly(); } bool Unit::IsInWater() const @@ -3082,6 +3105,48 @@ bool Unit::IsUnderWater() const return GetBaseMap()->IsUnderWater(GetPositionX(), GetPositionY(), GetPositionZ()); } +void Unit::UpdateUnderwaterState(Map* m, float x, float y, float z) +{ + if (!isPet() && !IsVehicle()) + return; + + LiquidData liquid_status; + ZLiquidStatus res = m->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquid_status); + if (!res) + { + if (_lastLiquid && _lastLiquid->SpellId) + RemoveAurasDueToSpell(_lastLiquid->SpellId); + + RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER); + _lastLiquid = NULL; + return; + } + + if (uint32 liqEntry = liquid_status.entry) + { + LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry); + if (_lastLiquid && _lastLiquid->SpellId && _lastLiquid->Id != liqEntry) + RemoveAurasDueToSpell(_lastLiquid->SpellId); + + if (liquid && liquid->SpellId) + { + if (res & (LIQUID_MAP_UNDER_WATER | LIQUID_MAP_IN_WATER)) + CastSpell(this, liquid->SpellId, true); + else + RemoveAurasDueToSpell(liquid->SpellId); + } + + RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER); + _lastLiquid = liquid; + } + else if (_lastLiquid && _lastLiquid->SpellId) + { + RemoveAurasDueToSpell(_lastLiquid->SpellId); + RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER); + _lastLiquid = NULL; + } +} + void Unit::DeMorph() { SetDisplayId(GetNativeDisplayId()); @@ -3254,7 +3319,7 @@ void Unit::_ApplyAura(AuraApplication * aurApp, uint8 effMask) aura->HandleAuraSpecificMods(aurApp, caster, true, false); // apply effects of the aura - for (uint8 i = 0 ; i < MAX_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (effMask & 1<GetRemoveMode())) aurApp->_HandleEffect(i, true); @@ -3313,7 +3378,7 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMo aura->_UnapplyForTarget(this, caster, aurApp); // remove effects of the spell - needs to be done after removing aura from lists - for (uint8 itr = 0 ; itr < MAX_SPELL_EFFECTS; ++itr) + for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr) { if (aurApp->HasEffect(itr)) aurApp->_HandleEffect(itr, false); @@ -3490,7 +3555,7 @@ void Unit::RemoveAura(AuraApplication * aurApp, AuraRemoveMode mode) if (aurApp->GetRemoveMode()) { // remove remaining effects of an aura - for (uint8 itr = 0 ; itr < MAX_SPELL_EFFECTS; ++itr) + for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr) { if (aurApp->HasEffect(itr)) aurApp->_HandleEffect(itr, false); @@ -3601,8 +3666,12 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId { // final heal int32 healAmount = aurEff->GetAmount(); - int32 stack = dispelInfo.GetRemovedCharges(); - CastCustomSpell(this, 33778, &healAmount, &stack, NULL, true, NULL, NULL, aura->GetCasterGUID()); + if (Unit* caster = aura->GetCaster()) + { + healAmount = caster->SpellHealingBonusDone(this, aura->GetSpellInfo(), healAmount, HEAL, dispelInfo.GetRemovedCharges()); + healAmount = this->SpellHealingBonusTaken(caster, aura->GetSpellInfo(), healAmount, HEAL, dispelInfo.GetRemovedCharges()); + } + CastCustomSpell(this, 33778, &healAmount, NULL, NULL, true, NULL, NULL, aura->GetCasterGUID()); // mana if (Unit* caster = aura->GetCaster()) @@ -4133,6 +4202,45 @@ Aura* Unit::GetAuraOfRankedSpell(uint32 spellId, uint64 casterGUID, uint64 itemC return aurApp ? aurApp->GetBase() : NULL; } +void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelChargesList& dispelList) +{ + // we should not be able to dispel diseases if the target is affected by unholy blight + if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536)) + dispelMask &= ~(1 << DISPEL_DISEASE); + + AuraMap const& auras = GetOwnedAuras(); + for (AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) + { + Aura* aura = itr->second; + AuraApplication * aurApp = aura->GetApplicationOfTarget(GetGUID()); + if (!aurApp) + continue; + + // don't try to remove passive auras + if (aura->IsPassive()) + continue; + + if (aura->GetSpellInfo()->GetDispelMask() & dispelMask) + { + if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC) + { + // do not remove positive auras if friendly target + // negative auras if non-friendly target + if (aurApp->IsPositive() == IsFriendlyTo(caster)) + continue; + } + + // The charges / stack amounts don't count towards the total number of auras that can be dispelled. + // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell + // Polymorph instead of 1 / (5 + 1) -> 16%. + bool dispel_charges = aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES; + uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount(); + if (charges > 0) + dispelList.push_back(std::make_pair(aura, charges)); + } + } +} + bool Unit::HasAuraEffect(uint32 spellId, uint8 effIndex, uint64 caster) const { for (AuraApplicationMap::const_iterator itr = m_appliedAuras.lower_bound(spellId); itr != m_appliedAuras.upper_bound(spellId); ++itr) @@ -4389,9 +4497,7 @@ float Unit::GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask } // Add the highest of the Same Effect Stack Rule SpellGroups to the multiplier for (std::map::const_iterator itr = SameEffectSpellGroup.begin(); itr != SameEffectSpellGroup.end(); ++itr) - { AddPctN(multiplier, itr->second); - } return multiplier; } @@ -4426,27 +4532,39 @@ int32 Unit::GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_ int32 Unit::GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const { + std::map SameEffectSpellGroup; int32 modifier = 0; AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype); for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i) { if ((*i)->GetMiscValue() == misc_value) - modifier += (*i)->GetAmount(); + if (!sSpellMgr->AddSameEffectStackRuleSpellGroups((*i)->GetSpellInfo(), (*i)->GetAmount(), SameEffectSpellGroup)) + modifier += (*i)->GetAmount(); } + + for (std::map::const_iterator itr = SameEffectSpellGroup.begin(); itr != SameEffectSpellGroup.end(); ++itr) + modifier += itr->second; + return modifier; } float Unit::GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const { + std::map SameEffectSpellGroup; float multiplier = 1.0f; AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype); for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i) { if ((*i)->GetMiscValue() == misc_value) - AddPctN(multiplier, (*i)->GetAmount()); + if (!sSpellMgr->AddSameEffectStackRuleSpellGroups((*i)->GetSpellInfo(), (*i)->GetAmount(), SameEffectSpellGroup)) + AddPctN(multiplier, (*i)->GetAmount()); } + + for (std::map::const_iterator itr = SameEffectSpellGroup.begin(); itr != SameEffectSpellGroup.end(); ++itr) + AddPctN(multiplier, itr->second); + return multiplier; } @@ -4480,27 +4598,39 @@ int32 Unit::GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_ int32 Unit::GetTotalAuraModifierByAffectMask(AuraType auratype, SpellInfo const* affectedSpell) const { + std::map SameEffectSpellGroup; int32 modifier = 0; AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype); for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i) { if ((*i)->IsAffectingSpell(affectedSpell)) - modifier += (*i)->GetAmount(); + if (!sSpellMgr->AddSameEffectStackRuleSpellGroups((*i)->GetSpellInfo(), (*i)->GetAmount(), SameEffectSpellGroup)) + modifier += (*i)->GetAmount(); } + + for (std::map::const_iterator itr = SameEffectSpellGroup.begin(); itr != SameEffectSpellGroup.end(); ++itr) + modifier += itr->second; + return modifier; } float Unit::GetTotalAuraMultiplierByAffectMask(AuraType auratype, SpellInfo const* affectedSpell) const { + std::map SameEffectSpellGroup; float multiplier = 1.0f; AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype); for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i) { if ((*i)->IsAffectingSpell(affectedSpell)) - AddPctN(multiplier, (*i)->GetAmount()); + if (!sSpellMgr->AddSameEffectStackRuleSpellGroups((*i)->GetSpellInfo(), (*i)->GetAmount(), SameEffectSpellGroup)) + AddPctN(multiplier, (*i)->GetAmount()); } + + for (std::map::const_iterator itr = SameEffectSpellGroup.begin(); itr != SameEffectSpellGroup.end(); ++itr) + AddPctN(multiplier, itr->second); + return multiplier; } @@ -4589,7 +4719,9 @@ GameObject* Unit::GetGameObject(uint32 spellId) const void Unit::AddGameObject(GameObject* gameObj) { - if (!gameObj || !gameObj->GetOwnerGUID() == 0) return; + if (!gameObj || !gameObj->GetOwnerGUID() == 0) + return; + m_gameObj.push_back(gameObj); gameObj->SetOwnerGUID(GetGUID()); @@ -4605,7 +4737,8 @@ void Unit::AddGameObject(GameObject* gameObj) void Unit::RemoveGameObject(GameObject* gameObj, bool del) { - if (!gameObj || !gameObj->GetOwnerGUID() == GetGUID()) return; + if (!gameObj || gameObj->GetOwnerGUID() != GetGUID()) + return; gameObj->SetOwnerGUID(0); @@ -4826,28 +4959,29 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) data << uint32(damageInfo->damage); // Sub Damage } - if (damageInfo->HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2)) + if (damageInfo->HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) { for (uint32 i = 0; i < count; ++i) data << uint32(damageInfo->absorb); // Absorb } - if (damageInfo->HitInfo & (HITINFO_RESIST | HITINFO_RESIST2)) + if (damageInfo->HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) { for (uint32 i = 0; i < count; ++i) data << uint32(damageInfo->resist); // Resist } data << uint8(damageInfo->TargetState); - data << uint32(0); - data << uint32(0); + data << uint32(0); // Unknown attackerstate + data << uint32(0); // Melee spellid if (damageInfo->HitInfo & HITINFO_BLOCK) data << uint32(damageInfo->blocked_amount); - if (damageInfo->HitInfo & HITINFO_UNK3) + if (damageInfo->HitInfo & HITINFO_RAGE_GAIN) data << uint32(0); + //! Probably used for debugging purposes, as it is not known to appear on retail servers if (damageInfo->HitInfo & HITINFO_UNK1) { data << uint32(0); @@ -5492,6 +5626,13 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } break; } + case 71875: // Item - Black Bruise: Necrotic Touch Proc + case 71877: + { + basepoints0 = CalculatePctN(int32(damage), triggerAmount); + triggered_spell_id = 71879; + break; + } // Item - Shadowmourne Legendary case 71903: { @@ -5673,7 +5814,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Glyph of Polymorph case 56375: { - if(!target) + if (!target) return false; target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, 0, target->GetAura(32409)); // SW:D shall not be removed. target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); @@ -5732,13 +5873,13 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Blessing of Ancient Kings (Val'anyr, Hammer of Ancient Kings) case 64411: { - if(!victim) + if (!victim) return false; basepoints0 = int32(CalculatePctN(damage, 15)); if (AuraEffect* aurEff = victim->GetAuraEffect(64413, 0, GetGUID())) { // The shield can grow to a maximum size of 20, 000 damage absorbtion - aurEff->SetAmount(std::max(aurEff->GetAmount() + basepoints0, 20000)); + aurEff->SetAmount(std::min(aurEff->GetAmount() + basepoints0, 20000)); // Refresh and return to prevent replacing the aura aurEff->GetBase()->RefreshDuration(); @@ -5920,6 +6061,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Siphon Life case 63108: { + if (!damage) + break; // Glyph of Siphon Life if (HasAura(56216)) triggerAmount += triggerAmount / 4; @@ -6043,7 +6186,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Divine Aegis if (dummySpell->SpellIconID == 2820) { - if(!target) + if (!target) return false; // Multiple effects stack, so let's try to find this aura. @@ -6213,7 +6356,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Glyph of Shred case 54815: { - if(!target) + if (!target) return false; // try to find spell Rip on the target @@ -6519,7 +6662,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Explosive Shot if (procSpell->SpellFamilyFlags[2] & 0x200) { - if(!victim) + if (!victim) return false; if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID())) basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4/10/3; @@ -6576,9 +6719,11 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere { case 34477: // Misdirection { + if (!GetMisdirectionTarget()) + return false; triggered_spell_id = 35079; // 4 sec buff on self target = this; - return true; + break; } case 57870: // Glyph of Mend Pet { @@ -6597,8 +6742,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere return false; triggered_spell_id = 25742; float ap = GetTotalAttackPowerValue(BASE_ATTACK); - int32 holy = SpellBaseDamageBonus(SPELL_SCHOOL_MASK_HOLY) + - SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_HOLY, victim); + int32 holy = SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY) + + victim->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_HOLY); basepoints0 = (int32)GetAttackTime(BASE_ATTACK) * int32(ap * 0.022f + 0.044f * holy) / 1000; break; } @@ -7230,30 +7375,16 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (procSpell->SpellIconID != 2019) return false; - AuraEffect* aurEffA = NULL; - AuraEffectList const& auras = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE); - for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) + if (Creature* totem = GetMap()->GetCreature(m_SummonSlot[1])) // Fire totem summon slot { - SpellInfo const* spell = (*i)->GetSpellInfo(); - if (spell->SpellFamilyName == uint32(SPELLFAMILY_SHAMAN) && spell->SpellFamilyFlags.HasFlag(0, 0x02000000, 0)) + if (SpellInfo const* totemSpell = sSpellMgr->GetSpellInfo(totem->m_spells[0])) { - if ((*i)->GetCasterGUID() != GetGUID()) - continue; - if (spell->Id == 63283) - continue; - aurEffA = (*i); - break; + int32 bp0 = CalculatePctN(totemSpell->Effects[EFFECT_0].CalcValue(), triggerAmount); + int32 bp1 = CalculatePctN(totemSpell->Effects[EFFECT_1].CalcValue(), triggerAmount); + CastCustomSpell(this, 63283, &bp0, &bp1, NULL, true); + return true; } } - if (aurEffA) - { - int32 bp0 = 0, bp1 = 0; - bp0 = CalculatePctN(triggerAmount, aurEffA->GetAmount()); - if (AuraEffect* aurEffB = aurEffA->GetBase()->GetEffect(EFFECT_1)) - bp1 = CalculatePctN(triggerAmount, aurEffB->GetAmount()); - CastCustomSpell(this, 63283, &bp0, &bp1, NULL, true, NULL, triggeredByAura); - return true; - } return false; } break; @@ -7272,20 +7403,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere triggered_spell_id = 63685; break; } - // Storm, Earth and Fire - if (dummySpell->SpellIconID == 3063) - { - // Earthbind Totem summon only - if (procSpell->Id != 2484) - return false; - - float chance = (float)triggerAmount; - if (!roll_chance_f(chance)) - return false; - - triggered_spell_id = 64695; - break; - } // Ancestral Awakening if (dummySpell->SpellIconID == 3065) { @@ -7314,8 +7431,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->isAlive() || !castItem || !castItem->IsEquipped()) return false; - Player* player = ToPlayer(); - WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot())); + WeaponAttackType attType = WeaponAttackType(Player::GetAttackBySlot(castItem->GetSlot())); if ((attType != BASE_ATTACK && attType != OFF_ATTACK) || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK) || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)) @@ -7323,8 +7439,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere float fire_onhit = float(CalculatePctF(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f)); - float add_spellpower = (float)(SpellBaseDamageBonus(SPELL_SCHOOL_MASK_FIRE) - + SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_FIRE, victim)); + float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE) + + victim->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_FIRE)); // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84% ApplyPctF(add_spellpower, 3.84f); @@ -7665,17 +7781,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } } } - // Item - Death Knight T10 Melee 4P Bonus - if (dummySpell->Id == 70656) - { - Player* player = ToPlayer(); - if (!player) - return false; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - if (player->GetRuneCooldown(i) == 0) - return false; - } break; } case SPELLFAMILY_POTION: @@ -7903,11 +8008,7 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp for (uint8 i = 1; i < stack; ++i) dmg += mod * stack; if (Unit* caster = triggeredByAura->GetCaster()) - { caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg); - if (Creature* creature = caster->ToCreature()) - creature->DespawnOrUnsummon(1); - } break; } // Ball of Flames Proc @@ -7947,7 +8048,7 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp *handled = true; if (victim && victim->HasAura(53601)) { - int32 bp0 = CalculatePctN(int32(damage / 12), dummySpell->Effects[EFFECT_2]. CalcValue()); + int32 bp0 = CalculatePctN(int32(damage / 12), dummySpell->Effects[EFFECT_2].CalcValue()); // Item - Paladin T9 Holy 4P Bonus if (AuraEffect const* aurEff = GetAuraEffect(67191, 0)) AddPctN(bp0, aurEff->GetAmount()); @@ -7972,10 +8073,10 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp { *handled = true; // Check if we are the target and prevent mana gain - if (triggeredByAura->GetCasterGUID() == victim->GetGUID()) + if (victim && triggeredByAura->GetCasterGUID() == victim->GetGUID()) return false; // Lookup base amount mana restore - for (uint8 i = 0; iEffects[i].Effect == SPELL_EFFECT_ENERGIZE) { @@ -8118,6 +8219,16 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp CastCustomSpell(this, 70845, &basepoints0, NULL, NULL, true); break; } + // Recklessness + case 1719: + { + //! Possible hack alert + //! Don't drop charges on proc, they will be dropped on SpellMod removal + //! Before this change, it was dropping two charges per attack, one in ProcDamageAndSpellFor, and one in RemoveSpellMods. + //! The reason of this behaviour is Recklessness having three auras, 2 of them can not proc (isTriggeredAura array) but the other one can, making the whole spell proc. + *handled = true; + break; + } default: break; } @@ -8241,6 +8352,12 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg RemoveAuraFromStack(auraSpellInfo->Id); return false; } + if (auraSpellInfo->Id == 50720) + { + target = triggeredByAura->GetCaster(); + if (!target) + return false; + } break; case SPELLFAMILY_WARLOCK: { @@ -8591,6 +8708,36 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg trigger_spell_id = 50475; basepoints0 = CalculatePctN(int32(damage), triggerAmount); } + // Item - Death Knight T10 Melee 4P Bonus + else if (auraSpellInfo->Id == 70656) + { + if (GetTypeId() != TYPEID_PLAYER || getClass() != CLASS_DEATH_KNIGHT) + return false; + + for (uint8 i = 0; i < MAX_RUNES; ++i) + if (ToPlayer()->GetRuneCooldown(i) == 0) + return false; + } + break; + } + case SPELLFAMILY_ROGUE: + { + switch (auraSpellInfo->Id) + { + // Rogue T10 2P bonus, should only proc on caster + case 70805: + { + if (victim != this) + return false; + break; + } + // Rogue T10 4P bonus, should proc on victim + case 70803: + { + target = victim; + break; + } + } break; } default: @@ -8757,7 +8904,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg } // Blade Barrier - if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && auraSpellInfo->SpellIconID == 85) + if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && auraSpellInfo->SpellIconID == 85 && procSpell) { Player* player = ToPlayer(); if (!player || player->getClass() != CLASS_DEATH_KNIGHT) @@ -8863,7 +9010,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg { if (AuraEffect* aurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, 3220, 0)) { - basepoints0 = int32((aurEff->GetAmount() * owner->SpellBaseDamageBonus(SpellSchoolMask(SPELL_SCHOOL_MASK_MAGIC)) + 100.0f) / 100.0f); // TODO: Is it right? + basepoints0 = int32((aurEff->GetAmount() * owner->SpellBaseDamageBonusDone(SpellSchoolMask(SPELL_SCHOOL_MASK_MAGIC)) + 100.0f) / 100.0f); // TODO: Is it right? CastCustomSpell(this, trigger_spell_id, &basepoints0, &basepoints0, NULL, true, castItem, triggeredByAura); return true; } @@ -8972,10 +9119,10 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case 70893: { // check if we're doing a critical hit - if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT) ) + if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT)) return false; // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it) - if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473 )) + if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473)) return false; break; } @@ -9183,7 +9330,7 @@ FactionTemplateEntry const* Unit::getFactionTemplateEntry() const if (Player const* player = ToPlayer()) sLog->outError("Player %s has invalid faction (faction template id) #%u", player->GetName(), getFaction()); else if (Creature const* creature = ToCreature()) - sLog->outError("Creature (template id: %u) has invalid faction (faction template id) #%u", creature->GetCreatureInfo()->Entry, getFaction()); + sLog->outError("Creature (template id: %u) has invalid faction (faction template id) #%u", creature->GetCreatureTemplate()->Entry, getFaction()); else sLog->outError("Unit (name=%s, type=%u) has invalid faction (faction template id) #%u", GetName(), uint32(GetTypeId()), getFaction()); @@ -9441,6 +9588,16 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) if (meleeAttack) SendMeleeAttackStart(victim); + // Let the pet know we've started attacking someting. Handles melee attacks only + // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode + if (this->GetTypeId() == TYPEID_PLAYER) + { + Pet* playerPet = this->ToPlayer()->GetPet(); + + if (playerPet && playerPet->isAlive()) + playerPet->AI()->OwnerAttacked(victim); + } + return true; } @@ -9911,7 +10068,7 @@ void Unit::SetCharm(Unit* charm, bool apply) if (charm->HasUnitMovementFlag(MOVEMENTFLAG_WALKING)) { - charm->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + charm->SetWalk(false); charm->SendMovementFlagUpdate(); } @@ -10039,7 +10196,7 @@ Unit* Unit::GetFirstControlled() const // Sequence: charmed, pet, other guardians Unit* unit = GetCharm(); if (!unit) - if (uint64 guid = GetUInt64Value(UNIT_FIELD_SUMMON)) + if (uint64 guid = GetMinionGUID()) unit = ObjectAccessor::GetUnit(*this, guid); return unit; @@ -10216,7 +10373,7 @@ void Unit::EnergizeBySpell(Unit* victim, uint32 spellID, uint32 damage, Powers p victim->getHostileRefManager().threatAssist(this, float(damage) * 0.5f, spellInfo); } -uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack) +uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack) { if (!spellProto || !victim || damagetype == DIRECT_DAMAGE) return pdamage; @@ -10229,33 +10386,35 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 // For totems get damage bonus from owner if (GetTypeId() == TYPEID_UNIT && ToCreature()->isTotem()) if (Unit* owner = GetOwner()) - return owner->SpellDamageBonus(victim, spellProto, pdamage, damagetype); + return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype); - // Taken/Done total percent damage auras + // Done total percent damage auras float DoneTotalMod = 1.0f; float ApCoeffMod = 1.0f; int32 DoneTotal = 0; - int32 TakenTotal = 0; - // ..done // Pet damage? if (GetTypeId() == TYPEID_UNIT && !ToCreature()->isPet()) - DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureInfo()->rank); + DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank); - AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i) + // Some spells don't benefit from pct done mods + if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS) && !spellProto->IsRankOf(sSpellMgr->GetSpellInfo(12162))) { - if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1) //prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization) - continue; - - if ((*i)->GetMiscValue() & spellProto->GetSchoolMask()) + AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i) { - if ((*i)->GetSpellInfo()->EquippedItemClass == -1) - AddPctN(DoneTotalMod, (*i)->GetAmount()); - else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) - AddPctN(DoneTotalMod, (*i)->GetAmount()); - else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) - AddPctN(DoneTotalMod, (*i)->GetAmount()); + if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1) //prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization) + continue; + + if ((*i)->GetMiscValue() & spellProto->GetSchoolMask()) + { + if ((*i)->GetSpellInfo()->EquippedItemClass == -1) + AddPctN(DoneTotalMod, (*i)->GetAmount()); + else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + AddPctN(DoneTotalMod, (*i)->GetAmount()); + else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) + AddPctN(DoneTotalMod, (*i)->GetAmount()); + } } } @@ -10435,7 +10594,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 break; } } - break; + break; case SPELLFAMILY_PRIEST: // Mind Flay if (spellProto->SpellFamilyFlags[0] & 0x800000) @@ -10468,7 +10627,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT)) AddPctN(DoneTotalMod, aurEff->GetAmount()); } - break; + break; case SPELLFAMILY_PALADIN: // Judgement of Vengeance/Judgement of Corruption if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292) @@ -10486,7 +10645,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 if (stacks) AddPctU(DoneTotalMod, 10 * stacks); } - break; + break; case SPELLFAMILY_DRUID: // Thorns if (spellProto->SpellFamilyFlags[0] & 0x100) @@ -10495,7 +10654,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0)) AddPctN(DoneTotalMod, aurEff->GetAmount()); } - break; + break; case SPELLFAMILY_WARLOCK: // Fire and Brimstone if (spellProto->SpellFamilyFlags[1] & 0x00020040) @@ -10517,14 +10676,14 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && isPet()) if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID())) AddPctN(DoneTotalMod, 15 * count); - break; + break; case SPELLFAMILY_HUNTER: // Steady Shot if (spellProto->SpellFamilyFlags[1] & 0x1) if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID())) AddPctN(DoneTotalMod, aurEff->GetAmount()); - break; + break; case SPELLFAMILY_DEATHKNIGHT: // Improved Icy Touch if (spellProto->SpellFamilyFlags[0] & 0x2) @@ -10565,53 +10724,11 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 } } } - break; - } - - // ..taken - float TakenTotalMod = 1.0f; - - // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN - // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) - TakenTotalMod *= victim->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask()); - - // .. taken pct: dummy auras - AuraEffectList const& mDummyAuras = victim->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i) - { - switch ((*i)->GetSpellInfo()->SpellIconID) - { - // Cheat Death - case 2109: - if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) - { - if (victim->GetTypeId() != TYPEID_PLAYER) - continue; - float mod = victim->ToPlayer()->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE) * (-8.0f); - AddPctF(TakenTotalMod, std::max(mod, float((*i)->GetAmount()))); - } - break; - } - } - - // From caster spells - AuraEffectList const& mOwnerTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); - for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) - if ((*i)->GetCasterGUID() == GetGUID() && (*i)->IsAffectingSpell(spellProto)) - AddPctN(TakenTotalMod, (*i)->GetAmount()); - - // Mod damage from spell mechanic - if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask()) - { - AuraEffectList const& mDamageDoneMechanic = victim->GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); - for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i) - if (mechanicMask & uint32(1<<((*i)->GetMiscValue()))) - AddPctN(TakenTotalMod, (*i)->GetAmount()); + break; } - // Taken/Done fixed damage bonus auras - int32 DoneAdvertisedBenefit = SpellBaseDamageBonus(spellProto->GetSchoolMask()); - int32 TakenAdvertisedBenefit = SpellBaseDamageBonusForVictim(spellProto->GetSchoolMask(), victim); + // Done fixed damage bonus auras + int32 DoneAdvertisedBenefit = SpellBaseDamageBonusDone(spellProto->GetSchoolMask()); // Pets just add their bonus damage to their spell damage // note that their spell damage is just gain of their own auras if (HasUnitTypeMask(UNIT_MASK_GUARDIAN)) @@ -10628,7 +10745,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 if (bonus->ap_dot_bonus > 0) { WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK; - float APbonus = (float) victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS); + float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS)); APbonus += GetTotalAttackPowerValue(attType); DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus); } @@ -10639,74 +10756,20 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 if (bonus->ap_bonus > 0) { WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK; - float APbonus = (float) victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS); + float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS)); APbonus += GetTotalAttackPowerValue(attType); DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus); } } } // Default calculation - if (DoneAdvertisedBenefit || TakenAdvertisedBenefit) + if (DoneAdvertisedBenefit) { if (!bonus || coeff < 0) - { - // Damage Done from spell damage bonus - int32 CastingTime = spellProto->IsChanneled() ? spellProto->GetDuration() : spellProto->CalcCastTime(); - // Damage over Time spells bonus calculation - float DotFactor = 1.0f; - if (damagetype == DOT) - { - int32 DotDuration = spellProto->GetDuration(); - // 200% limit - if (DotDuration > 0) - { - if (DotDuration > 30000) - DotDuration = 30000; - if (!spellProto->IsChanneled()) - DotFactor = DotDuration / 15000.0f; - uint8 x = 0; - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) - { - if (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && ( - spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || - spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) - { - x = j; - break; - } - } - int32 DotTicks = 6; - if (spellProto->Effects[x].Amplitude != 0) - DotTicks = DotDuration / spellProto->Effects[x].Amplitude; - if (DotTicks) - { - DoneAdvertisedBenefit /= DotTicks; - TakenAdvertisedBenefit /= DotTicks; - } - } - } - // Distribute Damage over multiple effects, reduce by AoE - CastingTime = GetCastingTimeForBonus(spellProto, damagetype, CastingTime); - - // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) - { - if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH || - (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) - { - CastingTime /= 2; - break; - } - } - if (spellProto->SchoolMask != SPELL_SCHOOL_MASK_NORMAL) - coeff = (CastingTime / 3500.0f) * DotFactor; - else - coeff = DotFactor; - } + coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack); float factorMod = CalculateLevelPenalty(spellProto) * stack; - // level penalty still applied on Taken bonus - is it blizzlike? - TakenTotal+= int32(TakenAdvertisedBenefit * factorMod); + if (Player* modOwner = GetSpellModOwner()) { coeff *= 100.0f; @@ -10723,27 +10786,94 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32 DoneTotalMod = 1.0f; } - // Some spells don't benefit from pct done mods - // maybe should be implemented like SPELL_ATTR3_NO_DONE_BONUS, - // but then it may break spell power coeffs work on spell 31117 - if (spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS) - DoneTotalMod = 1.0f; - float tmpDamage = (int32(pdamage) + DoneTotal) * DoneTotalMod; // apply spellmod to Done damage (flat and pct) if (Player* modOwner = GetSpellModOwner()) modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage); - tmpDamage = (tmpDamage + TakenTotal) * TakenTotalMod; + return uint32(std::max(tmpDamage, 0.0f)); +} + +uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack) +{ + if (!spellProto || damagetype == DIRECT_DAMAGE) + return pdamage; + + int32 TakenTotal = 0; + float TakenTotalMod = 1.0f; + + // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN + // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) + TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask()); + + //.. taken pct: dummy auras + AuraEffectList const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY); + for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i) + { + switch ((*i)->GetSpellInfo()->SpellIconID) + { + // Cheat Death + case 2109: + if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) + { + if (GetTypeId() != TYPEID_PLAYER) + continue; + float mod = ToPlayer()->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE) * (-8.0f); + AddPctF(TakenTotalMod, std::max(mod, float((*i)->GetAmount()))); + } + break; + } + } + + // From caster spells + AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); + for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) + if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) + AddPctN(TakenTotalMod, (*i)->GetAmount()); + + // Mod damage from spell mechanic + if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask()) + { + AuraEffectList const& mDamageDoneMechanic = GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); + for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i) + if (mechanicMask & uint32(1<<((*i)->GetMiscValue()))) + AddPctN(TakenTotalMod, (*i)->GetAmount()); + } + + int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask()); + + // Check for table values + float coeff = 0; + SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); + if (bonus) + coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage; + + // Default calculation + if (TakenAdvertisedBenefit) + { + if (!bonus || coeff < 0) + coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack); + + float factorMod = CalculateLevelPenalty(spellProto) * stack; + // level penalty still applied on Taken bonus - is it blizzlike? + if (Player* modOwner = GetSpellModOwner()) + { + coeff *= 100.0f; + modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff); + coeff /= 100.0f; + } + TakenTotal+= int32(TakenAdvertisedBenefit * coeff * factorMod); + } + + float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod; return uint32(std::max(tmpDamage, 0.0f)); } -int32 Unit::SpellBaseDamageBonus(SpellSchoolMask schoolMask) +int32 Unit::SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) { int32 DoneAdvertisedBenefit = 0; - // ..done AuraEffectList const& mDamageDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE); for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i) if (((*i)->GetMiscValue() & schoolMask) != 0 && @@ -10776,27 +10906,19 @@ int32 Unit::SpellBaseDamageBonus(SpellSchoolMask schoolMask) DoneAdvertisedBenefit += int32(CalculatePctN(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount())); } - return DoneAdvertisedBenefit > 0 ? DoneAdvertisedBenefit : 0; + return DoneAdvertisedBenefit; } -int32 Unit::SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit* victim) +int32 Unit::SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask) { - uint32 creatureTypeMask = victim->GetCreatureTypeMask(); - int32 TakenAdvertisedBenefit = 0; - // ..done (for creature type by mask) in taken - AuraEffectList const& mDamageDoneCreature = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE_CREATURE); - for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i) - if (creatureTypeMask & uint32((*i)->GetMiscValue())) - TakenAdvertisedBenefit += (*i)->GetAmount(); - // ..taken - AuraEffectList const& mDamageTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_TAKEN); + AuraEffectList const& mDamageTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_TAKEN); for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i) if (((*i)->GetMiscValue() & schoolMask) != 0) TakenAdvertisedBenefit += (*i)->GetAmount(); - return TakenAdvertisedBenefit > 0 ? TakenAdvertisedBenefit : 0; + return TakenAdvertisedBenefit; } bool Unit::isSpellCrit(Unit* victim, SpellInfo const* spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType) const @@ -11065,23 +11187,19 @@ uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* spellProto, uint32 damag return damage; } -uint32 Unit::SpellHealingBonus(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack) +uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack) { // For totems get healing bonus from owner (statue isn't totem in fact) - if (GetTypeId() == TYPEID_UNIT && ToCreature()->isTotem()) + if (GetTypeId() == TYPEID_UNIT && isTotem()) if (Unit* owner = GetOwner()) - return owner->SpellHealingBonus(victim, spellProto, healamount, damagetype, stack); + return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, stack); - // no bonus for heal potions/bandages + // No bonus healing for potion spells if (spellProto->SpellFamilyName == SPELLFAMILY_POTION) return healamount; - // Healing Done - // Taken/Done total percent damage auras - float DoneTotalMod = 1.0f; - float TakenTotalMod = 1.0f; - int32 DoneTotal = 0; - int32 TakenTotal = 0; + float DoneTotalMod = 1.0f; + int32 DoneTotal = 0; // Healing done percent AuraEffectList const& mHealingDonePct = GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT); @@ -11144,28 +11262,11 @@ uint32 Unit::SpellHealingBonus(Unit* victim, SpellInfo const* spellProto, uint32 } } - // Taken/Done fixed damage bonus auras - int32 DoneAdvertisedBenefit = SpellBaseHealingBonus(spellProto->GetSchoolMask()); - int32 TakenAdvertisedBenefit = SpellBaseHealingBonusForVictim(spellProto->GetSchoolMask(), victim); - - bool scripted = false; - - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - switch (spellProto->Effects[i].ApplyAuraName) - { - // These auras do not use healing coeff - case SPELL_AURA_PERIODIC_LEECH: - case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: - scripted = true; - break; - } - if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH) - scripted = true; - } + // Done fixed damage bonus auras + int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask()); // Check for table values - SpellBonusEntry const* bonus = !scripted ? sSpellMgr->GetSpellBonusData(spellProto->Id) : NULL; + SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); float coeff = 0; float factorMod = 1.0f; if (bonus) @@ -11175,159 +11276,184 @@ uint32 Unit::SpellHealingBonus(Unit* victim, SpellInfo const* spellProto, uint32 coeff = bonus->dot_damage; if (bonus->ap_dot_bonus > 0) DoneTotal += int32(bonus->ap_dot_bonus * stack * GetTotalAttackPowerValue( - (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE)? RANGED_ATTACK : BASE_ATTACK)); + (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK)); } else { coeff = bonus->direct_damage; if (bonus->ap_bonus > 0) DoneTotal += int32(bonus->ap_bonus * stack * GetTotalAttackPowerValue( - (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE)? RANGED_ATTACK : BASE_ATTACK)); + (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK)); } } - else // scripted bonus + else { - // Gift of the Naaru - if (spellProto->SpellFamilyFlags[2] & 0x80000000 && spellProto->SpellIconID == 329) - { - scripted = true; - int32 apBonus = int32(std::max(GetTotalAttackPowerValue(BASE_ATTACK), GetTotalAttackPowerValue(RANGED_ATTACK))); - if (apBonus > DoneAdvertisedBenefit) - DoneTotal += int32(apBonus * 0.22f); // 22% of AP per tick - else - DoneTotal += int32(DoneAdvertisedBenefit * 0.377f); // 37.7% of BH per tick - } - // Earthliving - 0.45% of normal hot coeff - else if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000) - factorMod *= 0.45f; - // Already set to scripted? so not uses healing bonus coefficient - // No heal coeff for SPELL_DAMAGE_CLASS_NONE class spells by default - else if (scripted || spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) - { - scripted = true; - coeff = 0.0f; - } + // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default + if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) + return healamount; } // Default calculation - if (DoneAdvertisedBenefit || TakenAdvertisedBenefit) + if (DoneAdvertisedBenefit) { - if ((!bonus && !scripted) || coeff < 0) - { - // Damage Done from spell damage bonus - int32 CastingTime = !spellProto->IsChanneled() ? spellProto->CalcCastTime() : spellProto->GetDuration(); - // Damage over Time spells bonus calculation - float DotFactor = 1.0f; - if (damagetype == DOT) - { - int32 DotDuration = spellProto->GetDuration(); - // 200% limit - if (DotDuration > 0) - { - if (DotDuration > 30000) DotDuration = 30000; - if (!spellProto->IsChanneled()) DotFactor = DotDuration / 15000.0f; - uint32 x = 0; - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; j++) - { - if (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && ( - spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || - spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) - { - x = j; - break; - } - } - int32 DotTicks = 6; - if (spellProto->Effects[x].Amplitude != 0) - DotTicks = DotDuration / spellProto->Effects[x].Amplitude; - if (DotTicks) - { - DoneAdvertisedBenefit = DoneAdvertisedBenefit * int32(stack) / DotTicks; - TakenAdvertisedBenefit = TakenAdvertisedBenefit * int32(stack) / DotTicks; - } - } - } - // Distribute Damage over multiple effects, reduce by AoE - CastingTime = GetCastingTimeForBonus(spellProto, damagetype, CastingTime); - // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) - { - if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH || - (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) - { - CastingTime /= 2; - break; - } - } - // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells) - coeff = (CastingTime / 3500.0f) * DotFactor * 1.88f; - } + if (!bonus || coeff < 0) + coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells) factorMod *= CalculateLevelPenalty(spellProto) * stack; - // level penalty still applied on Taken bonus - is it blizzlike? - TakenTotal += int32(TakenAdvertisedBenefit * factorMod); + if (Player* modOwner = GetSpellModOwner()) { coeff *= 100.0f; modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff); coeff /= 100.0f; } + + // Earthliving - 0.45% of normal hot coeff + if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000) + factorMod *= 0.45f; + DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod); } + // Gift of the Naaru + if (spellProto->SpellFamilyFlags[2] & 0x80000000 && spellProto->SpellIconID == 329) + { + int32 apBonus = int32(std::max(GetTotalAttackPowerValue(BASE_ATTACK), GetTotalAttackPowerValue(RANGED_ATTACK))); + if (apBonus > DoneAdvertisedBenefit) + DoneTotal += int32(apBonus * 0.22f); // 22% of AP per tick + else + DoneTotal += int32(DoneAdvertisedBenefit * 0.377f); // 37.7% of BH per tick + } + + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + switch (spellProto->Effects[i].ApplyAuraName) + { + // Bonus healing does not apply to these spells + case SPELL_AURA_PERIODIC_LEECH: + case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: + DoneTotal = 0; + break; + } + if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH) + DoneTotal = 0; + } + // use float as more appropriate for negative values and percent applying - float heal = (int32(healamount) + DoneTotal) * DoneTotalMod; + float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod; // apply spellmod to Done amount if (Player* modOwner = GetSpellModOwner()) modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal); - // Nourish cast - if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000) - { - // Rejuvenation, Regrowth, Lifebloom, or Wild Growth - if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x50, 0x4000010, 0)) - // increase healing by 20% - TakenTotalMod *= 1.2f; - } - - // Taken mods + return uint32(std::max(heal, 0.0f)); +} - // Tenacity increase healing % taken - if (AuraEffect const* Tenacity = victim->GetAuraEffect(58549, 0)) - AddPctN(TakenTotalMod, Tenacity->GetAmount()); +uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack) +{ + float TakenTotalMod = 1.0f; // Healing taken percent - float minval = (float)victim->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT); + float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); if (minval) AddPctF(TakenTotalMod, minval); - float maxval = (float)victim->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT); + float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); if (maxval) AddPctF(TakenTotalMod, maxval); + // Tenacity increase healing % taken + if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0)) + AddPctN(TakenTotalMod, Tenacity->GetAmount()); + + // Healing Done + int32 TakenTotal = 0; + + // Taken fixed damage bonus auras + int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask()); + + // Nourish cast + if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000) + { + // Rejuvenation, Regrowth, Lifebloom, or Wild Growth + if (GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x50, 0x4000010, 0)) + // increase healing by 20% + TakenTotalMod *= 1.2f; + } + if (damagetype == DOT) { // Healing over time taken percent - float minval_hot = (float)victim->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT); + float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT)); if (minval_hot) AddPctF(TakenTotalMod, minval_hot); - float maxval_hot = (float)victim->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT); + float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT)); if (maxval_hot) AddPctF(TakenTotalMod, maxval_hot); } - AuraEffectList const& mHealingGet= victim->GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_RECEIVED); + // Check for table values + SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); + float coeff = 0; + float factorMod = 1.0f; + if (bonus) + coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage; + else + { + // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default + if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) + { + healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f)); + return healamount; + } + } + + // Default calculation + if (TakenAdvertisedBenefit) + { + if (!bonus || coeff < 0) + coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells) + + factorMod *= CalculateLevelPenalty(spellProto) * int32(stack); + if (Player* modOwner = GetSpellModOwner()) + { + coeff *= 100.0f; + modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff); + coeff /= 100.0f; + } + + // Earthliving - 0.45% of normal hot coeff + if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000) + factorMod *= 0.45f; + + TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod); + } + + AuraEffectList const& mHealingGet= GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_RECEIVED); for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i) - if (GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectingSpell(spellProto)) + if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto)) AddPctN(TakenTotalMod, (*i)->GetAmount()); - heal = (int32(heal) + TakenTotal) * TakenTotalMod; + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + switch (spellProto->Effects[i].ApplyAuraName) + { + // Bonus healing does not apply to these spells + case SPELL_AURA_PERIODIC_LEECH: + case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: + TakenTotal = 0; + break; + } + if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH) + TakenTotal = 0; + } + + float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod; return uint32(std::max(heal, 0.0f)); } -int32 Unit::SpellBaseHealingBonus(SpellSchoolMask schoolMask) +int32 Unit::SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) { int32 AdvertisedBenefit = 0; @@ -11360,13 +11486,15 @@ int32 Unit::SpellBaseHealingBonus(SpellSchoolMask schoolMask) return AdvertisedBenefit; } -int32 Unit::SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit* victim) +int32 Unit::SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask) { int32 AdvertisedBenefit = 0; - AuraEffectList const& mDamageTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_HEALING); + + AuraEffectList const& mDamageTaken = GetAuraEffectsByType(SPELL_AURA_MOD_HEALING); for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i) if (((*i)->GetMiscValue() & schoolMask) != 0) AdvertisedBenefit += (*i)->GetAmount(); + return AdvertisedBenefit; } @@ -11393,7 +11521,7 @@ bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) return false; uint32 shoolMask = spellInfo->GetSchoolMask(); - if (spellInfo->Id != 42292 && spellInfo->Id !=59752) + if (spellInfo->Id != 42292 && spellInfo->Id != 59752) { // If m_immuneToSchool type contain this school type, IMMUNE damage. SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; @@ -11434,7 +11562,7 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) } // Spells that don't have effectMechanics. - if (!spellInfo->HasAnyEffectMechanic() && spellInfo->Mechanic) + if (spellInfo->Mechanic) { SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC]; for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr) @@ -11447,16 +11575,17 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) { // State/effect immunities applied by aura expect full spell immunity // Ignore effects with mechanic, they are supposed to be checked separately - if (spellInfo->Effects[i].Mechanic || !IsImmunedToSpellEffect(spellInfo, i)) + if (!IsImmunedToSpellEffect(spellInfo, i)) { immuneToAllEffects = false; break; } } + if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects. return true; - if (spellInfo->Id != 42292 && spellInfo->Id !=59752) + if (spellInfo->Id != 42292 && spellInfo->Id != 59752) { SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr) @@ -11474,8 +11603,9 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const { - if (!spellInfo) + if (!spellInfo || !spellInfo->Effects[index].IsEffect()) return false; + // If m_immuneToEffect type contain this effect type, IMMUNE effect. uint32 effect = spellInfo->Effects[index].Effect; SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT]; @@ -11509,21 +11639,17 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons return false; } -void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attType, SpellInfo const* spellProto) +uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto) { - if (!victim) - return; - - if (*pdamage == 0) - return; + if (!victim || pdamage == 0) + return 0; uint32 creatureTypeMask = victim->GetCreatureTypeMask(); - // Taken/Done fixed damage bonus auras + // Done fixed damage bonus auras int32 DoneFlatBenefit = 0; - int32 TakenFlatBenefit = 0; - // ..done (for creature type by mask) in taken + // ..done AuraEffectList const& mDamageDoneCreature = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE_CREATURE); for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i) if (creatureTypeMask & uint32((*i)->GetMiscValue())) @@ -11569,54 +11695,27 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT DoneFlatBenefit += int32(APbonus/14.0f * GetAPMultiplier(attType, normalized)); } - // ..taken - AuraEffectList const& mDamageTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_TAKEN); - for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i) - if ((*i)->GetMiscValue() & GetMeleeDamageSchoolMask()) - TakenFlatBenefit += (*i)->GetAmount(); - - if (attType != RANGED_ATTACK) - TakenFlatBenefit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN); - else - TakenFlatBenefit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN); - - // Done/Taken total percent damage auras + // Done total percent damage auras float DoneTotalMod = 1.0f; - float TakenTotalMod = 1.0f; - // ..done - // SPELL_AURA_MOD_AUTOATTACK_DAMAGE - if (!spellProto) - { - AuraEffectList const & autoattackDamage = GetAuraEffectsByType(SPELL_AURA_MOD_AUTOATTACK_DAMAGE); - for (AuraEffectList::const_iterator i = autoattackDamage.begin(); i != autoattackDamage.end(); ++i) - { - int32 amount = (*i)->GetAmount(); - if ((*i)->GetSpellInfo()->EquippedItemClass == -1) - AddPctN(DoneTotalMod, amount); - else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) - AddPctN(DoneTotalMod, amount); - else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) - AddPctN(DoneTotalMod, amount); - } - } - - AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i) - { - if (spellProto) + // Some spells don't benefit from pct done mods + if (spellProto) + if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS) && !spellProto->IsRankOf(sSpellMgr->GetSpellInfo(12162))) { - if ((*i)->GetMiscValue() & spellProto->GetSchoolMask() && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL)) + AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i) { - if ((*i)->GetSpellInfo()->EquippedItemClass == -1) - AddPctN(DoneTotalMod, (*i)->GetAmount()); - else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) - AddPctN(DoneTotalMod, (*i)->GetAmount()); - else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) - AddPctN(DoneTotalMod, (*i)->GetAmount()); + if ((*i)->GetMiscValue() & spellProto->GetSchoolMask() && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL)) + { + if ((*i)->GetSpellInfo()->EquippedItemClass == -1) + AddPctN(DoneTotalMod, (*i)->GetAmount()); + else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + AddPctN(DoneTotalMod, (*i)->GetAmount()); + else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) + AddPctN(DoneTotalMod, (*i)->GetAmount()); + } } } - } AuraEffectList const& mDamageDoneVersus = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS); for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i) @@ -11704,18 +11803,50 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT break; } + float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod; + + // apply spellmod to Done damage + if (spellProto) + if (Player* modOwner = GetSpellModOwner()) + modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage); + + // bonus result can be negative + return uint32(std::max(tmpDamage, 0.0f)); +} + +uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto) +{ + if (pdamage == 0) + return 0; + + int32 TakenFlatBenefit = 0; + // ..taken - TakenTotalMod *= victim->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetMeleeDamageSchoolMask()); + AuraEffectList const& mDamageTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_TAKEN); + for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i) + if ((*i)->GetMiscValue() & GetMeleeDamageSchoolMask()) + TakenFlatBenefit += (*i)->GetAmount(); - // From caster spells - AuraEffectList const& mOwnerTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); - for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) - if ((*i)->GetCasterGUID() == GetGUID() && (*i)->IsAffectingSpell(spellProto)) - AddPctN(TakenTotalMod, (*i)->GetAmount()); + if (attType != RANGED_ATTACK) + TakenFlatBenefit += GetTotalAuraModifier(SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN); + else + TakenFlatBenefit += GetTotalAuraModifier(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN); + + // Taken total percent damage auras + float TakenTotalMod = 1.0f; + + // ..taken + TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetMeleeDamageSchoolMask()); // .. taken pct (special attacks) if (spellProto) { + // From caster spells + AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); + for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) + if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) + AddPctN(TakenTotalMod, (*i)->GetAmount()); + // Mod damage from spell mechanic uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask(); @@ -11725,7 +11856,7 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT if (mechanicMask) { - AuraEffectList const& mDamageDoneMechanic = victim->GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); + AuraEffectList const& mDamageDoneMechanic = GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i) if (mechanicMask & uint32(1<<((*i)->GetMiscValue()))) AddPctN(TakenTotalMod, (*i)->GetAmount()); @@ -11733,7 +11864,7 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT } // .. taken pct: dummy auras - AuraEffectList const& mDummyAuras = victim->GetAuraEffectsByType(SPELL_AURA_DUMMY); + AuraEffectList const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY); for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i) { switch ((*i)->GetSpellInfo()->SpellIconID) @@ -11742,9 +11873,9 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT case 2109: if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (GetTypeId() != TYPEID_PLAYER) continue; - float mod = victim->ToPlayer()->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE) * (-8.0f); + float mod = ToPlayer()->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE) * (-8.0f); AddPctF(TakenTotalMod, std::max(mod, float((*i)->GetAmount()))); } break; @@ -11752,38 +11883,31 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT } // .. taken pct: class scripts - /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); - for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i) - { - switch ((*i)->GetMiscValue()) - { - } - }*/ + //*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); + //for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i) + //{ + // switch ((*i)->GetMiscValue()) + // { + // } + //}*/ if (attType != RANGED_ATTACK) { - AuraEffectList const& mModMeleeDamageTakenPercent = victim->GetAuraEffectsByType(SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT); + AuraEffectList const& mModMeleeDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT); for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i) AddPctN(TakenTotalMod, (*i)->GetAmount()); } else { - AuraEffectList const& mModRangedDamageTakenPercent = victim->GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT); + AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT); for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i) AddPctN(TakenTotalMod, (*i)->GetAmount()); } - float tmpDamage = float(int32(*pdamage) + DoneFlatBenefit) * DoneTotalMod; - - // apply spellmod to Done damage - if (spellProto) - if (Player* modOwner = GetSpellModOwner()) - modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage); - - tmpDamage = (tmpDamage + TakenFlatBenefit) * TakenTotalMod; + float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod; // bonus result can be negative - *pdamage = uint32(std::max(tmpDamage, 0.0f)); + return uint32(std::max(tmpDamage, 0.0f)); } void Unit::ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply) @@ -11855,7 +11979,9 @@ float Unit::GetWeaponProcChance() const float Unit::GetPPMProcChance(uint32 WeaponSpeed, float PPM, const SpellInfo* spellProto) const { // proc per minute chance calculation - if (PPM <= 0) return 0.0f; + if (PPM <= 0) + return 0.0f; + // Apply chance modifer aura if (spellProto) if (Player* modOwner = GetSpellModOwner()) @@ -12116,7 +12242,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy) UpdateSpeed(MOVE_FLIGHT, true); } - if (!(creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_MOUNTED_COMBAT)) + if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_MOUNTED_COMBAT)) Dismount(); } @@ -12135,12 +12261,12 @@ void Unit::ClearInCombat() // Player's state will be cleared in Player::UpdateContestedPvP if (Creature* creature = ToCreature()) { - if (creature->GetCreatureInfo() && creature->GetCreatureInfo()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC) + if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); // set immunity state to the one from db on evade ClearUnitState(UNIT_STATE_ATTACK_PLAYER); if (HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED)) - SetUInt32Value(UNIT_DYNAMIC_FLAGS, creature->GetCreatureInfo()->dynamicflags); + SetUInt32Value(UNIT_DYNAMIC_FLAGS, creature->GetCreatureTemplate()->dynamicflags); if (creature->isPet()) { @@ -12179,7 +12305,7 @@ bool Unit::IsValidAttackTarget(Unit const* target) const } // function based on function Unit::CanAttack from 13850 client -bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) const +bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, WorldObject const* obj) const { ASSERT(target); @@ -12197,8 +12323,8 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) co if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target)) return false; - // can't attack invisible (ignore stealth for aoe spells) - if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea())) + // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit. + if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))) return false; // can't attack dead @@ -12255,7 +12381,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) co } Creature const* creatureAttacker = ToCreature(); - if (creatureAttacker && creatureAttacker->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_UNK26) + if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) return false; Player const* playerAffectingAttacker = HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE) ? GetAffectingPlayer() : NULL; @@ -12342,7 +12468,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co // can't assist non-friendly targets if (GetReactionTo(target) <= REP_NEUTRAL && target->GetReactionTo(this) <= REP_NEUTRAL - && (!ToCreature() || !(ToCreature()->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_UNK26))) + && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER))) return false; // PvP case @@ -12376,7 +12502,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co && !((target->GetByteValue(UNIT_FIELD_BYTES_2, 1) & UNIT_BYTE2_FLAG_PVP))) { if (Creature const* creatureTarget = target->ToCreature()) - return creatureTarget->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_UNK26 || creatureTarget->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS; + return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS; } return true; } @@ -12490,6 +12616,12 @@ bool Unit::IsAlwaysVisibleFor(WorldObject const* seer) const if (seer->GetGUID() == guid) return true; + if (Player const* seerPlayer = seer->ToPlayer()) + if (Unit* owner = GetOwner()) + if (Player* ownerPlayer = owner->ToPlayer()) + if (ownerPlayer->IsGroupVisibleFor(seerPlayer)) + return true; + return false; } @@ -12598,7 +12730,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) { // Set creature speed rate from CreatureInfo if (GetTypeId() == TYPEID_UNIT) - speed *= ToCreature()->GetCreatureInfo()->speed_walk; + speed *= ToCreature()->GetCreatureTemplate()->speed_walk; // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need // TODO: possible affect only on MOVE_RUN @@ -13080,21 +13212,9 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) } } -void Unit::SetHover(bool on) -{ - if (on) - CastSpell(this, 11010, true); - else - RemoveAurasDueToSpell(11010); -} - void Unit::setDeathState(DeathState s) { - // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that - // it can be used to check creation of death items (such as soul shards). - m_deathState = s; - - if (s != ALIVE && s != JUST_ALIVED) + if (s != ALIVE && s != JUST_RESPAWNED) { CombatStop(); DeleteThreatList(); @@ -13116,9 +13236,18 @@ void Unit::setDeathState(DeathState s) // remove aurastates allowing special moves ClearAllReactives(); ClearDiminishings(); - GetMotionMaster()->Clear(false); - GetMotionMaster()->MoveIdle(); + if (IsInWorld()) + { + // Only clear MotionMaster for entities that exists in world + // Avoids crashes in the following conditions : + // * Using 'call pet' on dead pets + // * Using 'call stabled pet' + // * Logging in with dead pets + GetMotionMaster()->Clear(false); + GetMotionMaster()->MoveIdle(); + } StopMoving(); + DisableSpline(); // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp // do not why since in IncreaseMaxHealth currenthealth is checked SetHealth(0); @@ -13128,8 +13257,10 @@ void Unit::setDeathState(DeathState s) if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : (ZoneScript*)GetInstanceScript()) zoneScript->OnUnitDeath(this); } - else if (s == JUST_ALIVED) - RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground) + else if (s == JUST_RESPAWNED) + RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground) + + m_deathState = s; } /*######################################## @@ -13605,7 +13736,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration, Unit const* source = casterOwner ? casterOwner : caster; if ((target->GetTypeId() == TYPEID_PLAYER - || ((Creature*)target)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) + || ((Creature*)target)->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) && source->GetTypeId() == TYPEID_PLAYER) duration = limitduration; } @@ -13614,7 +13745,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration, if (group == DIMINISHING_TAUNT) { - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TAUNT_DIMINISH)) + if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_TAUNT_DIMINISH)) { DiminishingLevels diminish = Level; switch (diminish) @@ -13631,7 +13762,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration, // Some diminishings applies to mobs too (for example, Stun) else if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && ((targetOwner ? (targetOwner->GetTypeId() == TYPEID_PLAYER) : (GetTypeId() == TYPEID_PLAYER)) - || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) + || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) { DiminishingLevels diminish = Level; @@ -13715,7 +13846,7 @@ uint32 Unit::GetCreatureType() const return CREATURE_TYPE_HUMANOID; } else - return ToCreature()->GetCreatureInfo()->type; + return ToCreature()->GetCreatureTemplate()->type; } /*####################################### @@ -14365,12 +14496,7 @@ void CharmInfo::InitCharmCreateSpells() newstate = ACT_PASSIVE; else { - bool autocast = false; - for (uint32 i = 0; i < MAX_SPELL_EFFECTS && !autocast; ++i) - if (spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_UNIT_TARGET) - autocast = true; - - if (autocast) + if (spellInfo->NeedsExplicitUnitTarget()) { newstate = ACT_ENABLED; ToggleCreatureAutocast(spellInfo, true); @@ -14804,7 +14930,8 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: doing %u damage from spell id %u (triggered by %s aura of spell %u)", triggeredByAura->GetAmount(), spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); SpellNonMeleeDamage damageInfo(this, target, spellInfo->Id, spellInfo->SchoolMask); - uint32 newDamage = SpellDamageBonus(target, spellInfo, triggeredByAura->GetAmount(), SPELL_DIRECT_DAMAGE); + uint32 newDamage = SpellDamageBonusDone(target, spellInfo, triggeredByAura->GetAmount(), SPELL_DIRECT_DAMAGE); + newDamage = target->SpellDamageBonusTaken(this, spellInfo, newDamage, SPELL_DIRECT_DAMAGE); CalculateSpellDamageTaken(&damageInfo, newDamage, spellInfo); DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); SendSpellNonMeleeDamageLog(&damageInfo); @@ -15046,9 +15173,9 @@ Player* Unit::GetSpellModOwner() const } ///----------Pet responses methods----------------- -void Unit::SendPetCastFail(uint32 spellid, SpellCastResult msg) +void Unit::SendPetCastFail(uint32 spellid, SpellCastResult result) { - if (msg == SPELL_CAST_OK) + if (result == SPELL_CAST_OK) return; Unit* owner = GetCharmerOrOwner(); @@ -15056,15 +15183,13 @@ void Unit::SendPetCastFail(uint32 spellid, SpellCastResult msg) return; WorldPacket data(SMSG_PET_CAST_FAILED, 1 + 4 + 1); - data << uint8(0); // cast count? + data << uint8(0); // cast count data << uint32(spellid); - data << uint8(msg); - // uint32 for some reason - // uint32 for some reason + data << uint8(result); owner->ToPlayer()->GetSession()->SendPacket(&data); } -void Unit::SendPetActionFeedback (uint8 msg) +void Unit::SendPetActionFeedback(uint8 msg) { Unit* owner = GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER) @@ -15075,7 +15200,7 @@ void Unit::SendPetActionFeedback (uint8 msg) owner->ToPlayer()->GetSession()->SendPacket(&data); } -void Unit::SendPetTalk (uint32 pettalk) +void Unit::SendPetTalk(uint32 pettalk) { Unit* owner = GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER) @@ -15306,7 +15431,7 @@ Unit* Unit::SelectNearbyTarget(Unit* exclude, float dist) const return NULL; // select random - return SelectRandomContainerElement(targets); + return Trinity::Containers::SelectRandomContainerElement(targets); } void Unit::ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply) @@ -15333,7 +15458,7 @@ void Unit::ApplyCastTimePercentMod(float val, bool apply) ApplyPercentModFloatValue(UNIT_MOD_CAST_SPEED, -val, apply); } -uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime) +uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime) const { // Not apply this to creature casted spells with casttime == 0 if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !ToCreature()->isPet()) @@ -15406,20 +15531,21 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp if (AreaEffect) CastingTime /= 2; - // -5% of total per any additional effect - for (uint8 i = 0; i < effects; ++i) + // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing + for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) { - if (CastingTime > 175) - { - CastingTime -= 175; - } - else + if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH || + (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) { - CastingTime = 0; + CastingTime /= 2; break; } } + // -5% of total per any additional effect + for (uint8 i = 0; i < effects; ++i) + CastingTime *= 0.95f; + return CastingTime; } @@ -15450,6 +15576,29 @@ void Unit::UpdateAuraForGroup(uint8 slot) } } +float Unit::CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const +{ + // Damage over Time spells bonus calculation + float DotFactor = 1.0f; + if (damagetype == DOT) + { + + int32 DotDuration = spellInfo->GetDuration(); + if (!spellInfo->IsChanneled() && DotDuration > 0) + DotFactor = DotDuration / 15000.0f; + + if (uint32 DotTicks = spellInfo->GetMaxTicks()) + DotFactor /= DotTicks; + } + + int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime(); + // Distribute Damage over multiple effects, reduce by AoE + CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime); + + // As wowwiki says: C = (Cast Time / 3.5) + return (CastingTime / 3500.0f) * DotFactor; +} + float Unit::GetAPMultiplier(WeaponAttackType attType, bool normalized) { if (!normalized || GetTypeId() != TYPEID_PLAYER) @@ -15860,10 +16009,10 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) creature->lootForPickPocketed = false; loot->clear(); - if (uint32 lootid = creature->GetCreatureInfo()->lootid) + if (uint32 lootid = creature->GetCreatureTemplate()->lootid) loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode()); - loot->generateMoneyLoot(creature->GetCreatureInfo()->mingold, creature->GetCreatureInfo()->maxgold); + loot->generateMoneyLoot(creature->GetCreatureTemplate()->mingold, creature->GetCreatureTemplate()->maxgold); } player->RewardPlayerAndGroupAtKill(victim, false); @@ -15921,7 +16070,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) // Inform pets (if any) when player kills target) // MUST come after victim->setDeathState(JUST_DIED); or pet next target // selection will get stuck on same target and break pet react state - if (Player* player = ToPlayer()) + if (player) { Pet* pet = player->GetPet(); if (pet && pet->isAlive() && pet->isControlled()) @@ -15964,7 +16113,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) if (!creature->isPet()) { creature->DeleteThreatList(); - CreatureTemplate const* cInfo = creature->GetCreatureInfo(); + CreatureTemplate const* cInfo = creature->GetCreatureTemplate(); if (cInfo && (cInfo->lootid || cInfo->maxgold > 0)) creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } @@ -15993,7 +16142,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) { if (instanceMap->IsRaidOrHeroicDungeon()) { - if (creature->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) + if (creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) ((InstanceMap*)instanceMap)->PermBindAllPlayers(creditedPlayer); } else @@ -16402,7 +16551,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au case CHARM_TYPE_CHARM: if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK) { - CreatureTemplate const* cinfo = ToCreature()->GetCreatureInfo(); + CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) { // to prevent client crash @@ -16506,7 +16655,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) case CHARM_TYPE_CHARM: if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK) { - CreatureTemplate const* cinfo = ToCreature()->GetCreatureInfo(); + CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) { SetByteValue(UNIT_FIELD_BYTES_0, 1, uint8(cinfo->unit_class)); @@ -16545,7 +16694,7 @@ void Unit::RestoreFaction() } } - if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureInfo()) // normal creature + if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature { FactionTemplateEntry const* faction = getFactionTemplateEntry(); setFaction((faction && faction->friendlyMask & 0x004) ? cinfo->faction_H : cinfo->faction_A); @@ -16616,7 +16765,10 @@ bool Unit::IsInPartyWith(Unit const* unit) const return true; if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER) - return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer()); + return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer()); + else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) || + (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER)) + return true; else return false; } @@ -16632,82 +16784,14 @@ bool Unit::IsInRaidWith(Unit const* unit) const return true; if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER) - return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer()); + return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer()); + else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) || + (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER)) + return true; else return false; } -void Unit::GetRaidMember(std::list &nearMembers, float radius) -{ - Player* owner = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (!owner) - return; - - Group* group = owner->GetGroup(); - if (group) - { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) - { - Player* Target = itr->getSource(); - - if (Target && !IsHostileTo(Target)) - { - if (Target->isAlive() && IsWithinDistInMap(Target, radius)) - nearMembers.push_back(Target); - - if (Guardian* pet = Target->GetGuardianPet()) - if (pet->isAlive() && IsWithinDistInMap(pet, radius)) - nearMembers.push_back(pet); - } - } - } - else - { - if (owner->isAlive() && (owner == this || IsWithinDistInMap(owner, radius))) - nearMembers.push_back(owner); - if (Guardian* pet = owner->GetGuardianPet()) - if (pet->isAlive() && (pet == this || IsWithinDistInMap(pet, radius))) - nearMembers.push_back(pet); - } -} - -void Unit::GetPartyMemberInDist(std::list &TagUnitMap, float radius) -{ - Unit* owner = GetCharmerOrOwnerOrSelf(); - Group* group = NULL; - if (owner->GetTypeId() == TYPEID_PLAYER) - group = owner->ToPlayer()->GetGroup(); - - if (group) - { - uint8 subgroup = owner->ToPlayer()->GetSubGroup(); - - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) - { - Player* Target = itr->getSource(); - - // IsHostileTo check duel and controlled by enemy - if (Target && Target->GetSubGroup() == subgroup && !IsHostileTo(Target)) - { - if (Target->isAlive() && IsWithinDistInMap(Target, radius)) - TagUnitMap.push_back(Target); - - if (Guardian* pet = Target->GetGuardianPet()) - if (pet->isAlive() && IsWithinDistInMap(pet, radius)) - TagUnitMap.push_back(pet); - } - } - } - else - { - if (owner->isAlive() && (owner == this || IsWithinDistInMap(owner, radius))) - TagUnitMap.push_back(owner); - if (Guardian* pet = owner->GetGuardianPet()) - if (pet->isAlive() && (pet == this || IsWithinDistInMap(pet, radius))) - TagUnitMap.push_back(pet); - } -} - void Unit::GetPartyMembers(std::list &TagUnitMap) { Unit* owner = GetCharmerOrOwnerOrSelf(); @@ -16919,7 +17003,41 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) return; if (IsInWorld()) - RemoveNotOwnSingleTargetAuras(newPhaseMask); // we can lost access to caster or target + { + RemoveNotOwnSingleTargetAuras(newPhaseMask); // we can lost access to caster or target + + // modify hostile references for new phasemask, some special cases deal with hostile references themselves + if (GetTypeId() == TYPEID_UNIT || (!ToPlayer()->isGameMaster() && !ToPlayer()->GetSession()->PlayerLogout())) + { + HostileRefManager& refManager = getHostileRefManager(); + HostileReference* ref = refManager.getFirst(); + + while (ref) + { + if (Unit* unit = ref->getSource()->getOwner()) + if (Creature* creature = unit->ToCreature()) + refManager.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask)); + + ref = ref->next(); + } + + // modify threat lists for new phasemask + if (GetTypeId() != TYPEID_PLAYER) + { + std::list threatList = getThreatManager().getThreatList(); + std::list offlineThreatList = getThreatManager().getOfflineThreatList(); + + // merge expects sorted lists + threatList.sort(); + offlineThreatList.sort(); + threatList.merge(offlineThreatList); + + for (std::list::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) + if (Unit* unit = (*itr)->getTarget()) + unit->getHostileRefManager().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask)); + } + } + } WorldObject::SetPhaseMask(newPhaseMask, update); @@ -17393,7 +17511,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) } if (IsInMap(caster)) - caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1, target, true, NULL, NULL, origCasterGUID); + caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1, target, false, NULL, NULL, origCasterGUID); else // This can happen during Player::_LoadAuras { int32 bp0 = seatId; @@ -17403,7 +17521,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) else { if (IsInMap(caster)) - caster->CastSpell(target, spellEntry, true, NULL, NULL, origCasterGUID); + caster->CastSpell(target, spellEntry, false, NULL, NULL, origCasterGUID); else Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, NULL, NULL, origCasterGUID); } @@ -17497,14 +17615,14 @@ void Unit::ChangeSeat(int8 seatId, bool next) ASSERT(false); } -void Unit::ExitVehicle(Position const* exitPosition) +void Unit::ExitVehicle(Position const* /*exitPosition*/) { //! This function can be called at upper level code to initialize an exit from the passenger's side. if (!m_vehicle) return; GetVehicleBase()->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, GetGUID()); - //! The following call would not even be executed successfully as the + //! The following call would not even be executed successfully as the //! SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without //! specifying an exitposition. The subsequent call below would return on if (!m_vehicle). /*_ExitVehicle(exitPosition);*/ @@ -17513,7 +17631,7 @@ void Unit::ExitVehicle(Position const* exitPosition) //! to specify exit coordinates and either store those per passenger, or we need to //! init spline movement based on those coordinates in unapply handlers, and //! relocate exiting passengers based on Unit::moveSpline data. Either way, - //! Coming Soon™ + //! Coming Soon(TM) } void Unit::_ExitVehicle(Position const* exitPosition) @@ -17670,18 +17788,12 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const *data << (float)m_movementInfo.splineElevation; } -void Unit::SetFlying(bool apply) +void Unit::SetCanFly(bool apply) { if (apply) - { - SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02); - AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING); - } + AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); else - { - RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02); - RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING); - } + RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); } void Unit::NearTeleportTo(float x, float y, float z, float orientation, bool casting /*= false*/) @@ -17722,14 +17834,30 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation); } else if (turn) - SetOrientation(orientation); + UpdateOrientation(orientation); - if ((relocated || turn) && IsVehicle()) - GetVehicleKit()->RelocatePassengers(x, y, z, orientation); + // code block for underwater state update + UpdateUnderwaterState(GetMap(), x, y, z); return (relocated || turn); } +//! Only server-side orientation update, does not broadcast to client +void Unit::UpdateOrientation(float orientation) +{ + SetOrientation(orientation); + if (IsVehicle()) + GetVehicleKit()->RelocatePassengers(GetPositionX(), GetPositionY(), GetPositionZ(), orientation); +} + +//! Only server-side height update, does not broadcast to client +void Unit::UpdateHeight(float newZ) +{ + Relocate(GetPositionX(), GetPositionY(), newZ); + if (IsVehicle()) + GetVehicleKit()->RelocatePassengers(GetPositionX(), GetPositionY(), newZ, GetOrientation()); +} + void Unit::SendThreatListUpdate() { if (!getThreatManager().isThreatListEmpty()) @@ -17992,12 +18120,130 @@ void Unit::SetFacingTo(float ori) init.Launch(); } -void Unit::SetFacingToObject(WorldObject* pObject) +void Unit::SetFacingToObject(WorldObject* object) { // never face when already moving if (!IsStopped()) return; // TODO: figure out under what conditions creature will move towards object instead of facing it where it currently is. - SetFacingTo(GetAngle(pObject)); + SetFacingTo(GetAngle(object)); +} + +bool Unit::SetWalk(bool enable) +{ + if (enable == IsWalking()) + return false; + + if (enable) + AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + else + RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + + return true; +} + +bool Unit::SetDisableGravity(bool disable, bool /*packetOnly = false*/) +{ + if (disable == IsLevitating()) + return false; + + if (disable) + AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + else + RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + + return true; +} + +bool Unit::SetHover(bool enable) +{ + if (enable == HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) + return false; + + if (enable) + { + //! No need to check height on ascent + AddUnitMovementFlag(MOVEMENTFLAG_HOVER); + if (float hh = GetFloatValue(UNIT_FIELD_HOVERHEIGHT)) + UpdateHeight(GetPositionZ() + hh); + } + else + { + RemoveUnitMovementFlag(MOVEMENTFLAG_HOVER); + if (float hh = GetFloatValue(UNIT_FIELD_HOVERHEIGHT)) + { + float newZ = GetPositionZ() - hh; + UpdateAllowedPositionZ(GetPositionX(), GetPositionY(), newZ); + UpdateHeight(newZ); + } + } + + return true; +} + +void Unit::SendMovementHover() +{ + if (GetTypeId() == TYPEID_PLAYER) + ToPlayer()->SendMovementSetHover(HasUnitMovementFlag(MOVEMENTFLAG_HOVER)); + + WorldPacket data(MSG_MOVE_HOVER, 64); + data.append(GetPackGUID()); + BuildMovementPacket(&data); + SendMessageToSet(&data, false); +} + +void Unit::SendMovementWaterWalking() +{ + if (GetTypeId() == TYPEID_PLAYER) + ToPlayer()->SendMovementSetWaterWalking(HasUnitMovementFlag(MOVEMENTFLAG_WATERWALKING)); + + WorldPacket data(MSG_MOVE_WATER_WALK, 64); + data.append(GetPackGUID()); + BuildMovementPacket(&data); + SendMessageToSet(&data, false); +} + +void Unit::SendMovementFeatherFall() +{ + if (GetTypeId() == TYPEID_PLAYER) + ToPlayer()->SendMovementSetFeatherFall(HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW)); + + WorldPacket data(MSG_MOVE_FEATHER_FALL, 64); + data.append(GetPackGUID()); + BuildMovementPacket(&data); + SendMessageToSet(&data, false); +} + +void Unit::SendMovementGravityChange() +{ + WorldPacket data(MSG_MOVE_GRAVITY_CHNG, 64); + data.append(GetPackGUID()); + BuildMovementPacket(&data); + SendMessageToSet(&data, false); +} + +void Unit::SendMovementCanFlyChange() +{ + /*! + if ( a3->MoveFlags & MOVEMENTFLAG_CAN_FLY ) + { + v4->MoveFlags |= 0x1000000u; + result = 1; + } + else + { + if ( v4->MoveFlags & MOVEMENTFLAG_FLYING ) + CMovement::DisableFlying(v4); + v4->MoveFlags &= 0xFEFFFFFFu; + result = 1; + } + */ + if (GetTypeId() == TYPEID_PLAYER) + ToPlayer()->SendMovementSetCanFly(CanFly()); + + WorldPacket data(MSG_MOVE_UPDATE_CAN_FLY, 64); + data.append(GetPackGUID()); + BuildMovementPacket(&data); + SendMessageToSet(&data, false); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index e82c755ae41..9d6c22ab8b5 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -185,10 +185,10 @@ enum UnitStandFlags // byte flags value (UNIT_FIELD_BYTES_1, 3) enum UnitBytes1_Flags { - UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01, - UNIT_BYTE1_FLAG_UNK_2 = 0x02, - UNIT_BYTE1_FLAG_UNK_3 = 0x04, - UNIT_BYTE1_FLAG_ALL = 0xFF + UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01, + UNIT_BYTE1_FLAG_HOVER = 0x02, + UNIT_BYTE1_FLAG_UNK_3 = 0x04, + UNIT_BYTE1_FLAG_ALL = 0xFF }; // high byte (3 from 0..3) of UNIT_FIELD_BYTES_2 @@ -287,29 +287,29 @@ enum HitInfo { HITINFO_NORMALSWING = 0x00000000, HITINFO_UNK1 = 0x00000001, // req correct packet structure - HITINFO_NORMALSWING2 = 0x00000002, - HITINFO_LEFTSWING = 0x00000004, + HITINFO_AFFECTS_VICTIM = 0x00000002, + HITINFO_OFFHAND = 0x00000004, HITINFO_UNK2 = 0x00000008, HITINFO_MISS = 0x00000010, - HITINFO_ABSORB = 0x00000020, // absorbed damage - HITINFO_ABSORB2 = 0x00000040, // absorbed damage - HITINFO_RESIST = 0x00000080, // resisted atleast some damage - HITINFO_RESIST2 = 0x00000100, // resisted atleast some damage + HITINFO_FULL_ABSORB = 0x00000020, + HITINFO_PARTIAL_ABSORB = 0x00000040, + HITINFO_FULL_RESIST = 0x00000080, + HITINFO_PARTIAL_RESIST = 0x00000100, HITINFO_CRITICALHIT = 0x00000200, // critical hit // 0x00000400 // 0x00000800 // 0x00001000 HITINFO_BLOCK = 0x00002000, // blocked damage - // 0x00004000 - // 0x00008000 + // 0x00004000 // Hides worldtext for 0 damage + // 0x00008000 // Related to blood visual HITINFO_GLANCING = 0x00010000, HITINFO_CRUSHING = 0x00020000, - HITINFO_NOACTION = 0x00040000, // guessed + HITINFO_NO_ANIMATION = 0x00040000, // 0x00080000 // 0x00100000 - HITINFO_SWINGNOHITSOUND = 0x00200000, // guessed + HITINFO_SWINGNOHITSOUND = 0x00200000, // unused? // 0x00400000 - HITINFO_UNK3 = 0x00800000 + HITINFO_RAGE_GAIN = 0x00800000 }; //i would like to remove this: (it is defined in item.h @@ -342,6 +342,7 @@ class Transport; class Vehicle; typedef std::list UnitList; +typedef std::list< std::pair > DispelChargesList; struct SpellImmune { @@ -464,7 +465,7 @@ enum DeathState JUST_DIED = 1, CORPSE = 2, DEAD = 3, - JUST_ALIVED = 4, + JUST_RESPAWNED = 4, }; enum UnitState @@ -498,9 +499,8 @@ enum UnitState UNIT_STATE_CHASE_MOVE = 0x04000000, UNIT_STATE_FOLLOW_MOVE = 0x08000000, UNIT_STATE_UNATTACKABLE = (UNIT_STATE_IN_FLIGHT | UNIT_STATE_ONVEHICLE), - //UNIT_STATE_MOVING = (UNIT_STATE_ROAMING | UNIT_STATE_CHASE), // for real move using movegen check and stop (except unstoppable flight) - UNIT_STATE_MOVING = UNIT_STATE_ROAMING_MOVE | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE| UNIT_STATE_CHASE_MOVE | UNIT_STATE_FOLLOW_MOVE , + UNIT_STATE_MOVING = UNIT_STATE_ROAMING_MOVE | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE | UNIT_STATE_CHASE_MOVE | UNIT_STATE_FOLLOW_MOVE , UNIT_STATE_CONTROLLED = (UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING), UNIT_STATE_LOST_CONTROL = (UNIT_STATE_CONTROLLED | UNIT_STATE_JUMPING | UNIT_STATE_CHARGING), UNIT_STATE_SIGHTLESS = (UNIT_STATE_LOST_CONTROL | UNIT_STATE_EVADE), @@ -676,10 +676,10 @@ enum MovementFlags MOVEMENTFLAG_PITCH_DOWN = 0x00000080, MOVEMENTFLAG_WALKING = 0x00000100, // Walking MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures - MOVEMENTFLAG_LEVITATING = 0x00000400, + MOVEMENTFLAG_DISABLE_GRAVITY = 0x00000400, // Former MOVEMENTFLAG_LEVITATING. This is used when walking is not possible. MOVEMENTFLAG_ROOT = 0x00000800, // Must not be set along with MOVEMENTFLAG_MASK_MOVING - MOVEMENTFLAG_JUMPING = 0x00001000, - MOVEMENTFLAG_FALLING = 0x00002000, // damage dealt on that type of falling + MOVEMENTFLAG_FALLING = 0x00001000, // damage dealt on that type of falling + MOVEMENTFLAG_FALLING_FAR = 0x00002000, MOVEMENTFLAG_PENDING_STOP = 0x00004000, MOVEMENTFLAG_PENDING_STRAFE_STOP = 0x00008000, MOVEMENTFLAG_PENDING_FORWARD = 0x00010000, @@ -690,8 +690,8 @@ enum MovementFlags MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also MOVEMENTFLAG_ASCENDING = 0x00400000, // press "space" when flying MOVEMENTFLAG_DESCENDING = 0x00800000, - MOVEMENTFLAG_CAN_FLY = 0x01000000, // can fly - MOVEMENTFLAG_FLYING = 0x02000000, // hover + MOVEMENTFLAG_CAN_FLY = 0x01000000, // Appears when unit can fly AND also walk + MOVEMENTFLAG_FLYING = 0x02000000, // unit is actually flying. pretty sure this is only used for players. creatures use disable_gravity MOVEMENTFLAG_SPLINE_ELEVATION = 0x04000000, // used for flight paths MOVEMENTFLAG_SPLINE_ENABLED = 0x08000000, // used for flight paths MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water @@ -701,11 +701,18 @@ enum MovementFlags // TODO: Check if PITCH_UP and PITCH_DOWN really belong here.. MOVEMENTFLAG_MASK_MOVING = MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT | - MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN | MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING | + MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING | MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_MASK_TURNING = MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT, + + MOVEMENTFLAG_MASK_MOVING_FLY = + MOVEMENTFLAG_FLYING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING, + + //! TODO if needed: add more flags to this masks that are exclusive to players + MOVEMENTFLAG_MASK_PLAYER_ONLY = + MOVEMENTFLAG_FLYING, }; enum MovementFlags2 { @@ -1232,7 +1239,7 @@ class Unit : public WorldObject typedef std::map VisibleAuraMap; - virtual ~Unit (); + virtual ~Unit(); UnitAI* GetAI() { return i_AI; } void SetAI(UnitAI* newAI) { i_AI = newAI; } @@ -1301,7 +1308,7 @@ class Unit : public WorldObject void StopAttackFaction(uint32 faction_id); Unit* SelectNearbyTarget(Unit* exclude = NULL, float dist = NOMINAL_MELEE_RANGE) const; void SendMeleeAttackStop(Unit* victim = NULL); - void SendMeleeAttackStart(Unit* pVictim); + void SendMeleeAttackStart(Unit* victim); void AddUnitState(uint32 f) { m_state |= f; } bool HasUnitState(const uint32 f) const { return (m_state & f); } @@ -1332,7 +1339,7 @@ class Unit : public WorldObject float GetStat(Stats stat) const { return float(GetUInt32Value(UNIT_FIELD_STAT0+stat)); } void SetStat(Stats stat, int32 val) { SetStatInt32Value(UNIT_FIELD_STAT0+stat, val); } - uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL) ; } + uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL); } void SetArmor(int32 val) { SetResistance(SPELL_SCHOOL_NORMAL, val); } uint32 GetResistance(SpellSchools school) const { return GetUInt32Value(UNIT_FIELD_RESISTANCES+school); } @@ -1396,9 +1403,7 @@ class Unit : public WorldObject bool IsNeutralToAll() const; bool IsInPartyWith(Unit const* unit) const; bool IsInRaidWith(Unit const* unit) const; - void GetPartyMemberInDist(std::list &units, float dist); void GetPartyMembers(std::list &units); - void GetRaidMember(std::list &units, float dist); bool IsContestedGuard() const { if (FactionTemplateEntry const* entry = getFactionTemplateEntry()) @@ -1436,12 +1441,12 @@ class Unit : public WorldObject MountCapabilityEntry const* GetMountCapability(uint32 mountType) const; uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; } - void DealDamageMods(Unit* pVictim, uint32 &damage, uint32* absorb); - uint32 DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDamage = NULL, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = NULL, bool durabilityLoss = true); - void Kill(Unit* pVictim, bool durabilityLoss = true); - int32 DealHeal(Unit* pVictim, uint32 addhealth); + void DealDamageMods(Unit* victim, uint32 &damage, uint32* absorb); + uint32 DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDamage = NULL, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = NULL, bool durabilityLoss = true); + void Kill(Unit* victim, bool durabilityLoss = true); + int32 DealHeal(Unit* victim, uint32 addhealth); - void ProcDamageAndSpell(Unit* pVictim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType = BASE_ATTACK, SpellInfo const* procSpell = NULL, SpellInfo const* procAura = NULL); + void ProcDamageAndSpell(Unit* victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType = BASE_ATTACK, SpellInfo const* procSpell = NULL, SpellInfo const* procAura = NULL); void ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const* procSpell, uint32 damage, SpellInfo const* procAura = NULL); void GetProcAurasTriggeredOnEvent(std::list& aurasTriggeringProc, std::list* procAuras, ProcEventInfo eventInfo); @@ -1450,9 +1455,9 @@ class Unit : public WorldObject void TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, std::list& procAuras); void HandleEmoteCommand(uint32 anim_id); - void AttackerStateUpdate (Unit* pVictim, WeaponAttackType attType = BASE_ATTACK, bool extra = false); + void AttackerStateUpdate (Unit* victim, WeaponAttackType attType = BASE_ATTACK, bool extra = false); - void CalculateMeleeDamage(Unit* pVictim, uint32 damage, CalcDamageInfo* damageInfo, WeaponAttackType attackType = BASE_ATTACK); + void CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* damageInfo, WeaponAttackType attackType = BASE_ATTACK); void DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss); void HandleProcExtraAttackFor(Unit* victim); @@ -1474,18 +1479,18 @@ class Unit : public WorldObject uint32 GetRangedDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_RANGED, 2.0f, 100.0f, damage); } uint32 GetSpellDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_SPELL, 2.0f, 100.0f, damage); } - void ApplyResilience(const Unit* pVictim, float * crit, int32 * damage, bool isCrit, CombatRating type) const; + void ApplyResilience(const Unit* victim, float * crit, int32 * damage, bool isCrit, CombatRating type) const; - float MeleeSpellMissChance(const Unit* pVictim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const; - SpellMissInfo MeleeSpellHitResult(Unit* pVictim, SpellInfo const* spell); - SpellMissInfo MagicSpellHitResult(Unit* pVictim, SpellInfo const* spell); - SpellMissInfo SpellHitResult(Unit* pVictim, SpellInfo const* spell, bool canReflect = false); + float MeleeSpellMissChance(const Unit* victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const; + SpellMissInfo MeleeSpellHitResult(Unit* victim, SpellInfo const* spell); + SpellMissInfo MagicSpellHitResult(Unit* victim, SpellInfo const* spell); + SpellMissInfo SpellHitResult(Unit* victim, SpellInfo const* spell, bool canReflect = false); float GetUnitDodgeChance() const; float GetUnitParryChance() const; float GetUnitBlockChance() const; float GetUnitMissChance(WeaponAttackType attType) const; - float GetUnitCriticalChance(WeaponAttackType attackType, const Unit* pVictim) const; + float GetUnitCriticalChance(WeaponAttackType attackType, const Unit* victim) const; int32 GetMechanicResistChance(const SpellInfo* spell); bool CanUseAttackType(uint8 attacktype) const { @@ -1519,8 +1524,8 @@ class Unit : public WorldObject float GetWeaponProcChance() const; float GetPPMProcChance(uint32 WeaponSpeed, float PPM, const SpellInfo* spellProto) const; - MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit* pVictim, WeaponAttackType attType) const; - MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit* pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const; + MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackType attType) const; + MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const; bool isVendor() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VENDOR); } bool isTrainer() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER); } @@ -1571,20 +1576,21 @@ class Unit : public WorldObject bool isTargetableForAttack(bool checkFakeDeath = true) const; bool IsValidAttackTarget(Unit const* target) const; - bool _IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) const; + bool _IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, WorldObject const* obj = NULL) const; bool IsValidAssistTarget(Unit const* target) const; bool _IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) const; virtual bool IsInWater() const; virtual bool IsUnderWater() const; + virtual void UpdateUnderwaterState(Map* m, float x, float y, float z); bool isInAccessiblePlaceFor(Creature const* c) const; - void SendHealSpellLog(Unit* pVictim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical = false); - int32 HealBySpell(Unit* pVictim, SpellInfo const* spellInfo, uint32 addHealth, bool critical = false); - void SendEnergizeSpellLog(Unit* pVictim, uint32 SpellID, uint32 Damage, Powers powertype); - void EnergizeBySpell(Unit* pVictim, uint32 SpellID, uint32 Damage, Powers powertype); - uint32 SpellNonMeleeDamageLog(Unit* pVictim, uint32 spellID, uint32 damage); + void SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical = false); + int32 HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHealth, bool critical = false); + void SendEnergizeSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, Powers powertype); + void EnergizeBySpell(Unit* victim, uint32 SpellID, uint32 Damage, Powers powertype); + uint32 SpellNonMeleeDamageLog(Unit* victim, uint32 spellID, uint32 damage); void CastSpell(SpellCastTargets const& targets, SpellInfo const* spellInfo, CustomSpellValues const* value, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0); void CastSpell(Unit* victim, uint32 spellId, bool triggered, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0); @@ -1617,6 +1623,8 @@ class Unit : public WorldObject virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport = false); // returns true if unit's position really changed bool UpdatePosition(const Position &pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } + void UpdateOrientation(float orientation); + void UpdateHeight(float newZ); void KnockbackFrom(float x, float y, float speedXY, float speedZ); void JumpTo(float speedXY, float speedZ, bool forward = true); @@ -1628,12 +1636,27 @@ class Unit : public WorldObject //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL); void SendMonsterMoveTransport(Unit* vehicleOwner); void SendMovementFlagUpdate(); - bool IsLevitating() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_LEVITATING);} + + /*! These methods send the same packet to the client in apply and unapply case. + The client-side interpretation of this packet depends on the presence of relevant movementflags + which are sent with movementinfo. Furthermore, these packets are broadcast to nearby players as well + as the current unit. + */ + void SendMovementHover(); + void SendMovementFeatherFall(); + void SendMovementWaterWalking(); + void SendMovementGravityChange(); + void SendMovementCanFlyChange(); + + bool IsLevitating() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);} bool IsWalking() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING);} + virtual bool SetWalk(bool enable); + virtual bool SetDisableGravity(bool disable, bool packetOnly = false); + bool SetHover(bool enable); void SetInFront(Unit const* target); void SetFacingTo(float ori); - void SetFacingToObject(WorldObject* pObject); + void SetFacingToObject(WorldObject* object); void SendChangeCurrentVictimOpcode(HostileReference* pHostileReference); void SendClearThreatListOpcode(); @@ -1805,6 +1828,8 @@ class Unit : public WorldObject AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, uint64 casterGUID = 0, uint64 itemCasterGUID = 0, uint8 reqEffMask = 0, AuraApplication * except = NULL) const; Aura* GetAuraOfRankedSpell(uint32 spellId, uint64 casterGUID = 0, uint64 itemCasterGUID = 0, uint8 reqEffMask = 0) const; + void GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelChargesList& dispelList); + bool HasAuraEffect(uint32 spellId, uint8 effIndex, uint64 caster = 0) const; uint32 GetAuraCount(uint32 spellId) const; bool HasAura(uint32 spellId, uint64 casterGUID = 0, uint64 itemCasterGUID = 0, uint8 reqEffMask = 0) const; @@ -1958,10 +1983,10 @@ class Unit : public WorldObject // Threat related methods bool CanHaveThreatList() const; - void AddThreat(Unit* pVictim, float fThreat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* threatSpell = NULL); + void AddThreat(Unit* victim, float fThreat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* threatSpell = NULL); float ApplyTotalThreatModifier(float fThreat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL); void DeleteThreatList(); - void TauntApply(Unit* pVictim); + void TauntApply(Unit* victim); void TauntFadeOut(Unit* taunter); ThreatManager& getThreatManager() { return m_ThreatManager; } void addHatedBy(HostileReference* pHostileReference) { m_HostileRefManager.insertFirst(pHostileReference); }; @@ -2008,29 +2033,37 @@ class Unit : public WorldObject float GetAPMultiplier(WeaponAttackType attType, bool normalized); void ModifyAuraState(AuraStateType flag, bool apply); uint32 BuildAuraStateUpdateForTarget(Unit* target) const; - bool HasAuraState(AuraStateType flag, SpellInfo const* spellProto = NULL, Unit const* Caster = NULL) const ; + bool HasAuraState(AuraStateType flag, SpellInfo const* spellProto = NULL, Unit const* Caster = NULL) const; void UnsummonAllTotems(); Unit* GetMagicHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo); Unit* GetMeleeHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo = NULL); - int32 SpellBaseDamageBonus(SpellSchoolMask schoolMask); - int32 SpellBaseHealingBonus(SpellSchoolMask schoolMask); - int32 SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit* pVictim); - int32 SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit* pVictim); - uint32 SpellDamageBonus(Unit* pVictim, SpellInfo const* spellProto, uint32 damage, DamageEffectType damagetype, uint32 stack = 1); - uint32 SpellHealingBonus(Unit* pVictim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1); - bool isSpellBlocked(Unit* pVictim, SpellInfo const* spellProto, WeaponAttackType attackType = BASE_ATTACK); + + int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask); + int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask); + uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1); + uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1); + int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask); + int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask); + uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1); + uint32 SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1); + + uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto = NULL); + uint32 MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage,WeaponAttackType attType, SpellInfo const *spellProto = NULL); + + + bool isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType attackType = BASE_ATTACK); bool isBlockCritical(); - bool isSpellCrit(Unit* pVictim, SpellInfo const* spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType = BASE_ATTACK) const; - uint32 SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* pVictim); - uint32 SpellCriticalHealingBonus(SpellInfo const* spellProto, uint32 damage, Unit* pVictim); + bool isSpellCrit(Unit* victim, SpellInfo const* spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType = BASE_ATTACK) const; + uint32 SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* victim); + uint32 SpellCriticalHealingBonus(SpellInfo const* spellProto, uint32 damage, Unit* victim); void SetLastManaUse(uint32 spellCastTime) { m_lastManaUse = spellCastTime; } bool IsUnderLastManaUseEffect() const; void SetContestedPvP(Player* attackedPlayer = NULL); - void MeleeDamageBonus(Unit* pVictim, uint32 *damage, WeaponAttackType attType, SpellInfo const* spellProto = NULL); - uint32 GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime); + uint32 GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime) const; + float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const; uint32 GetRemainingPeriodicAmount(uint64 caster, uint32 spellId, AuraType auraType, uint8 effectIndex = 0) const; @@ -2043,9 +2076,9 @@ class Unit : public WorldObject virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // redefined in Creature static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS); - uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType=MAX_ATTACK); - void CalcAbsorbResist(Unit* pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellInfo const* spellInfo = NULL); - void CalcHealAbsorb(Unit* pVictim, const SpellInfo* spellProto, uint32 &healAmount, uint32 &absorb); + uint32 CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType=MAX_ATTACK); + void CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellInfo const* spellInfo = NULL); + void CalcHealAbsorb(Unit* victim, const SpellInfo* spellProto, uint32 &healAmount, uint32 &absorb); void UpdateSpeed(UnitMoveType mtype, bool forced); float GetSpeed(UnitMoveType mtype) const; @@ -2053,7 +2086,6 @@ class Unit : public WorldObject void SetSpeed(UnitMoveType mtype, float rate, bool forced = false); float m_TempSpeed; - void SetHover(bool on); bool isHover() const { return HasAuraType(SPELL_AURA_HOVER); } float ApplyEffectModifiers(SpellInfo const* spellProto, uint8 effect_index, float value) const; @@ -2077,7 +2109,7 @@ class Unit : public WorldObject void AddUnitMovementFlag(uint32 f) { m_movementInfo.flags |= f; } void RemoveUnitMovementFlag(uint32 f) { m_movementInfo.flags &= ~f; } - uint32 HasUnitMovementFlag(uint32 f) const { return m_movementInfo.flags & f; } + bool HasUnitMovementFlag(uint32 f) const { return (m_movementInfo.flags & f) == f; } uint32 GetUnitMovementFlags() const { return m_movementInfo.flags; } void SetUnitMovementFlags(uint32 f) { m_movementInfo.flags = f; } @@ -2087,6 +2119,15 @@ class Unit : public WorldObject uint16 GetExtraUnitMovementFlags() const { return m_movementInfo.flags2; } void SetExtraUnitMovementFlags(uint16 f) { m_movementInfo.flags2 = f; } + float GetPositionZMinusOffset() const + { + float offset = 0.0f; + if (HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) + offset = GetFloatValue(UNIT_FIELD_HOVERHEIGHT); + + return GetPositionZ() - offset; + } + void SetControlled(bool apply, UnitState state); void AddComboPointHolder(uint32 lowguid) { m_ComboPointHolders.insert(lowguid); } @@ -2171,9 +2212,9 @@ class Unit : public WorldObject bool isMoving() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING); } bool isTurning() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_TURNING); } - bool canFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); } - bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); } - void SetFlying(bool apply); + virtual bool CanFly() const = 0; + bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_DISABLE_GRAVITY); } + void SetCanFly(bool apply); void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker); @@ -2290,21 +2331,22 @@ class Unit : public WorldObject Vehicle* m_vehicleKit; uint32 m_unitTypeMask; + LiquidTypeEntry const* _lastLiquid; bool IsAlwaysVisibleFor(WorldObject const* seer) const; bool IsAlwaysDetectableFor(WorldObject const* seer) const; void DisableSpline(); private: - bool IsTriggeredAtSpellProcEvent(Unit* pVictim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent); - bool HandleDummyAuraProc(Unit* pVictim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); - bool HandleHasteAuraProc(Unit* pVictim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); - bool HandleSpellCritChanceAuraProc(Unit* pVictim, uint32 damage, AuraEffect* triggredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); - bool HandleObsModEnergyAuraProc(Unit* pVictim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); - bool HandleModDamagePctTakenAuraProc(Unit* pVictim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); - bool HandleAuraProc(Unit* pVictim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool * handled); - bool HandleProcTriggerSpell(Unit* pVictim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); - bool HandleOverrideClassScriptAuraProc(Unit* pVictim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 cooldown); + bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent); + bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleHasteAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleSpellCritChanceAuraProc(Unit* victim, uint32 damage, AuraEffect* triggredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleObsModEnergyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleModDamagePctTakenAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool * handled); + bool HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleOverrideClassScriptAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 cooldown); bool HandleAuraRaidProcFromChargeWithValue(AuraEffect* triggeredByAura); bool HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index e0d67e9ceef..090a1db382a 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -146,7 +146,7 @@ void Vehicle::ApplyAllImmunities() _me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); // Mechanical units & vehicles ( which are not Bosses, they have own immunities in DB ) should be also immune on healing ( exceptions in switch below ) - if (_me->ToCreature() && _me->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_MECHANICAL && !_me->ToCreature()->isWorldBoss()) + if (_me->ToCreature() && _me->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL && !_me->ToCreature()->isWorldBoss()) { // Heal & dispel ... _me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true); @@ -285,9 +285,6 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ // return; // Something went wrong in the spellsystem //} - // This is not good, we have to send update twice - accessory->SendMovementFlagUpdate(); - if (GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnInstallAccessory(this, accessory); } @@ -352,6 +349,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) unit->m_movementInfo.t_pos.m_orientation = 0; unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; + unit->m_movementInfo.t_guid = _me->GetGUID(); if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER @@ -424,13 +422,14 @@ void Vehicle::RemovePassenger(Unit* unit) _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false); // only for flyable vehicles - if (unit->HasUnitMovementFlag(MOVEMENTFLAG_FLYING)) + if (unit->IsFlying()) _me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true); if (GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnRemovePassenger(this, unit); } +//! Must be called after m_base::Relocate void Vehicle::RelocatePassengers(float x, float y, float z, float ang) { ASSERT(_me->GetMap()); @@ -440,8 +439,6 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang) if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.Passenger)) { ASSERT(passenger->IsInWorld()); - ASSERT(passenger->IsOnVehicle(GetBase())); - ASSERT(GetSeatForPassenger(passenger)); float px = x + passenger->m_movementInfo.t_pos.m_positionX; float py = y + passenger->m_movementInfo.t_pos.m_positionY; @@ -454,11 +451,12 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang) void Vehicle::Dismiss() { + if (GetBase()->GetTypeId() != TYPEID_UNIT) + return; + sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Dismiss Entry: %u, GuidLow %u", _creatureEntry, _me->GetGUIDLow()); Uninstall(); - _me->DestroyForNearbyPlayers(); - _me->CombatStop(); - _me->AddObjectToRemoveList(); + GetBase()->ToCreature()->DespawnOrUnsummon(); } void Vehicle::InitMovementInfoForBase() diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 6f5dc0e511e..d5e85d2cf2f 100755 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -80,7 +80,7 @@ uint32 GameEventMgr::NextCheck(uint16 entry) const if (mGameEvent[entry].state == GAMEEVENT_WORLD_CONDITIONS) { if (mGameEvent[entry].length) - return mGameEvent[entry].length * 60 ; + return mGameEvent[entry].length * 60; else return max_ge_check_delay; } @@ -205,7 +205,7 @@ void GameEventMgr::LoadFromDB() { { uint32 oldMSTime = getMSTime(); - + // 1 2 3 4 5 6 7 8 QueryResult result = WorldDatabase.Query("SELECT eventEntry, UNIX_TIMESTAMP(start_time), UNIX_TIMESTAMP(end_time), occurence, length, holiday, description, world_event FROM game_event"); if (!result) { @@ -220,7 +220,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint8 event_id = fields[0].GetUInt8(); if (event_id == 0) { sLog->outErrorDb("`game_event` game event entry 0 is reserved and can't be used."); @@ -232,8 +232,8 @@ void GameEventMgr::LoadFromDB() pGameEvent.start = time_t(starttime); uint64 endtime = fields[2].GetUInt64(); pGameEvent.end = time_t(endtime); - pGameEvent.occurence = fields[3].GetUInt32(); - pGameEvent.length = fields[4].GetUInt32(); + pGameEvent.occurence = fields[3].GetUInt64(); + pGameEvent.length = fields[4].GetUInt64(); pGameEvent.holiday_id = HolidayIds(fields[5].GetUInt32()); pGameEvent.state = (GameEventState)(fields[7].GetUInt8()); @@ -283,7 +283,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint8 event_id = fields[0].GetUInt8(); if (event_id >= mGameEvent.size()) { @@ -315,6 +315,7 @@ void GameEventMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); + // 0 1 QueryResult result = WorldDatabase.Query("SELECT eventEntry, prerequisite_event FROM game_event_prerequisite"); if (!result) { @@ -328,7 +329,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint16 event_id = fields[0].GetUInt8(); if (event_id >= mGameEvent.size()) { @@ -338,7 +339,7 @@ void GameEventMgr::LoadFromDB() if (mGameEvent[event_id].state != GAMEEVENT_NORMAL && mGameEvent[event_id].state != GAMEEVENT_INTERNAL) { - uint16 prerequisite_event = fields[1].GetUInt16(); + uint16 prerequisite_event = fields[1].GetUInt32(); if (prerequisite_event >= mGameEvent.size()) { sLog->outErrorDb("`game_event_prerequisite` game event prerequisite id (%i) is out of range compared to max event id in `game_event`", prerequisite_event); @@ -382,7 +383,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); - int16 event_id = fields[1].GetInt16(); + int16 event_id = fields[1].GetInt8(); int32 internal_event_id = mGameEvent.size() + event_id - 1; @@ -408,7 +409,7 @@ void GameEventMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - // 1 2 + // 0 1 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, game_event_gameobject.eventEntry FROM gameobject" " JOIN game_event_gameobject ON gameobject.guid=game_event_gameobject.guid"); @@ -425,7 +426,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); - int16 event_id = fields[1].GetInt16(); + int16 event_id = fields[1].GetInt8(); int32 internal_event_id = mGameEvent.size() + event_id - 1; @@ -468,7 +469,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); - uint16 event_id = fields[1].GetUInt16(); + uint16 event_id = fields[1].GetUInt8(); if (event_id >= mGameEventModelEquip.size()) { @@ -525,7 +526,7 @@ void GameEventMgr::LoadFromDB() uint32 id = fields[0].GetUInt32(); uint32 quest = fields[1].GetUInt32(); - uint16 event_id = fields[2].GetUInt16(); + uint16 event_id = fields[2].GetUInt8(); if (event_id >= mGameEventCreatureQuests.size()) { @@ -566,7 +567,7 @@ void GameEventMgr::LoadFromDB() uint32 id = fields[0].GetUInt32(); uint32 quest = fields[1].GetUInt32(); - uint16 event_id = fields[2].GetUInt16(); + uint16 event_id = fields[2].GetUInt8(); if (event_id >= mGameEventGameObjectQuests.size()) { @@ -590,7 +591,7 @@ void GameEventMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT quest, eventEntry, condition_id, num FROM game_event_quest_condition"); if (!result) @@ -606,7 +607,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 quest = fields[0].GetUInt32(); - uint16 event_id = fields[1].GetUInt16(); + uint16 event_id = fields[1].GetUInt8(); uint32 condition = fields[2].GetUInt32(); float num = fields[3].GetFloat(); @@ -648,7 +649,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint16 event_id = fields[0].GetUInt8(); uint32 condition = fields[1].GetUInt32(); if (event_id >= mGameEvent.size()) @@ -659,8 +660,8 @@ void GameEventMgr::LoadFromDB() mGameEvent[event_id].conditions[condition].reqNum = fields[2].GetFloat(); mGameEvent[event_id].conditions[condition].done = 0; - mGameEvent[event_id].conditions[condition].max_world_state = fields[3].GetUInt32(); - mGameEvent[event_id].conditions[condition].done_world_state = fields[4].GetUInt32(); + mGameEvent[event_id].conditions[condition].max_world_state = fields[3].GetUInt16(); + mGameEvent[event_id].conditions[condition].done_world_state = fields[4].GetUInt16(); ++count; } @@ -690,7 +691,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint16 event_id = fields[0].GetUInt8(); uint32 condition = fields[1].GetUInt32(); if (event_id >= mGameEvent.size()) @@ -739,7 +740,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); - uint16 event_id = fields[1].GetUInt16(); + uint16 event_id = fields[1].GetUInt8(); uint32 npcflag = fields[2].GetUInt32(); if (event_id >= mGameEvent.size()) @@ -763,7 +764,7 @@ void GameEventMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - // 0 1 + // 0 1 QueryResult result = WorldDatabase.Query("SELECT questId, eventEntry FROM game_event_seasonal_questrelation"); if (!result) @@ -779,7 +780,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 questId = fields[0].GetUInt32(); - uint16 eventEntry = fields[1].GetUInt16(); + uint32 eventEntry = fields[1].GetUInt32(); // TODO: Change to uint8 if (!sObjectMgr->GetQuestTemplate(questId)) { @@ -822,7 +823,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint8 event_id = fields[0].GetUInt8(); if (event_id >= mGameEventVendors.size()) { @@ -834,7 +835,7 @@ void GameEventMgr::LoadFromDB() NPCVendorEntry newEntry; uint32 guid = fields[1].GetUInt32(); newEntry.item = fields[2].GetUInt32(); - newEntry.maxcount = fields[3].GetInt32(); + newEntry.maxcount = fields[3].GetUInt32(); newEntry.incrtime = fields[4].GetUInt32(); newEntry.ExtendedCost = fields[5].GetUInt32(); // get the event npc flag for checking if the npc will be vendor during the event or not @@ -888,7 +889,7 @@ void GameEventMgr::LoadFromDB() { Field* fields = result->Fetch(); - uint16 event_id = fields[0].GetUInt16(); + uint16 event_id = fields[0].GetUInt8(); if (event_id >= mGameEvent.size()) { @@ -911,7 +912,7 @@ void GameEventMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - // 1 2 + // 0 1 QueryResult result = WorldDatabase.Query("SELECT pool_template.entry, game_event_pool.eventEntry FROM pool_template" " JOIN game_event_pool ON pool_template.entry = game_event_pool.pool_entry"); @@ -928,7 +929,7 @@ void GameEventMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); - int16 event_id = fields[1].GetInt16(); + int16 event_id = fields[1].GetInt8(); int32 internal_event_id = mGameEvent.size() + event_id - 1; @@ -981,7 +982,7 @@ void GameEventMgr::Initialize() { Field* fields = result->Fetch(); - uint32 maxEventId = fields[0].GetUInt16(); + uint32 maxEventId = fields[0].GetUInt8(); // Id starts with 1 and vector with 0, thus increment maxEventId++; @@ -1019,7 +1020,7 @@ void GameEventMgr::StartArenaSeason() } Field* fields = result->Fetch(); - uint16 eventId = fields[0].GetUInt16(); + uint16 eventId = fields[0].GetUInt8(); if (eventId >= mGameEvent.size()) { @@ -1123,8 +1124,6 @@ void GameEventMgr::UnApplyEvent(uint16 event_id) UpdateEventNPCVendor(event_id, false); // update bg holiday UpdateBattlegroundSettings(); - // check for seasonal quest reset. - sWorld->ResetEventSeasonalQuests(event_id); } void GameEventMgr::ApplyNewEvent(uint16 event_id) @@ -1159,6 +1158,8 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id) UpdateEventNPCVendor(event_id, true); // update bg holiday UpdateBattlegroundSettings(); + // check for seasonal quest reset. + sWorld->ResetEventSeasonalQuests(event_id); } void GameEventMgr::UpdateEventNPCFlags(uint16 event_id) @@ -1174,7 +1175,7 @@ void GameEventMgr::UpdateEventNPCFlags(uint16 event_id) if (cr) { uint32 npcflag = GetNPCFlag(cr); - if (const CreatureTemplate* ci = cr->GetCreatureInfo()) + if (const CreatureTemplate* ci = cr->GetCreatureTemplate()) npcflag |= ci->npcflag; cr->SetUInt32Value(UNIT_NPC_FLAGS, npcflag); // reset gossip options, since the flag change might have added / removed some diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index 1a069a27825..9a99a28c7aa 100755 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -166,10 +166,18 @@ Unit* ObjectAccessor::FindUnit(uint64 guid) Player* ObjectAccessor::FindPlayerByName(const char* name) { TRINITY_READ_GUARD(HashMapHolder::LockType, *HashMapHolder::GetLock()); + std::string nameStr = name; + std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower); HashMapHolder::MapType const& m = GetPlayers(); for (HashMapHolder::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter) - if (iter->second->IsInWorld() && strcmp(name, iter->second->GetName()) == 0) + { + if (!iter->second->IsInWorld()) + continue; + std::string currentName = iter->second->GetName(); + std::transform(currentName.begin(), currentName.end(), currentName.begin(), ::tolower); + if (nameStr.compare(currentName) == 0) return iter->second; + } return NULL; } @@ -400,4 +408,4 @@ template Pet* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float template Creature* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float y, uint64 guid, Creature* /*fake*/); template Corpse* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float y, uint64 guid, Corpse* /*fake*/); template GameObject* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float y, uint64 guid, GameObject* /*fake*/); -template DynamicObject* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float y, uint64 guid, DynamicObject* /*fake*/); \ No newline at end of file +template DynamicObject* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float y, uint64 guid, DynamicObject* /*fake*/); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b30b36dbdc1..a14a49d2069 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -256,6 +256,10 @@ ObjectMgr::~ObjectMgr() itr->second.Clear(); _cacheTrainerSpellStore.clear(); + + for (DungeonEncounterContainer::iterator itr =_dungeonEncounterStore.begin(); itr != _dungeonEncounterStore.end(); ++itr) + for (DungeonEncounterList::iterator encounterItr = itr->second.begin(); encounterItr != itr->second.end(); ++encounterItr) + delete *encounterItr; } void ObjectMgr::AddLocaleString(std::string const& s, LocaleConstant locale, StringVector& data) @@ -380,10 +384,10 @@ void ObjectMgr::LoadCreatureTemplates() "type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, " // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " - // 68 69 70 71 72 73 74 75 76 77 78 - "InhabitType, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, " - // 79 80 81 82 83 84 - "movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName " + // 69 70 71 72 73 74 75 76 77 78 79 + "InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, " + // 80 81 82 83 84 85 86 + " questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); if (!result) @@ -393,6 +397,7 @@ void ObjectMgr::LoadCreatureTemplates() return; } + _creatureTemplateStore.rehash(result->GetRowCount()); uint32 count = 0; do { @@ -421,7 +426,7 @@ void ObjectMgr::LoadCreatureTemplates() creatureTemplate.GossipMenuId = fields[13].GetUInt32(); creatureTemplate.minlevel = fields[14].GetUInt8(); creatureTemplate.maxlevel = fields[15].GetUInt8(); - creatureTemplate.expansion = uint32(fields[16].GetUInt16()); + creatureTemplate.expansion = uint32(fields[16].GetInt16()); creatureTemplate.expansionUnknown = uint32(fields[17].GetUInt16()); creatureTemplate.faction_A = uint32(fields[18].GetUInt16()); creatureTemplate.faction_H = uint32(fields[19].GetUInt16()); @@ -456,7 +461,7 @@ void ObjectMgr::LoadCreatureTemplates() creatureTemplate.SkinLootId = fields[48].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - creatureTemplate.resistance[i] = fields[50 + i -1].GetInt32(); + creatureTemplate.resistance[i] = fields[50 + i -1].GetInt16(); for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) creatureTemplate.spells[i] = fields[55 + i].GetUInt32(); @@ -468,20 +473,21 @@ void ObjectMgr::LoadCreatureTemplates() creatureTemplate.AIName = fields[67].GetString(); creatureTemplate.MovementType = uint32(fields[68].GetUInt8()); creatureTemplate.InhabitType = uint32(fields[69].GetUInt8()); - creatureTemplate.ModHealth = fields[70].GetFloat(); - creatureTemplate.ModMana = fields[71].GetFloat(); - creatureTemplate.ModArmor = fields[72].GetFloat(); - creatureTemplate.RacialLeader = fields[73].GetBool(); + creatureTemplate.HoverHeight = fields[70].GetFloat(); + creatureTemplate.ModHealth = fields[71].GetFloat(); + creatureTemplate.ModMana = fields[72].GetFloat(); + creatureTemplate.ModArmor = fields[73].GetFloat(); + creatureTemplate.RacialLeader = fields[74].GetBool(); for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - creatureTemplate.questItems[i] = fields[74 + i].GetUInt32(); + creatureTemplate.questItems[i] = fields[75 + i].GetUInt32(); - creatureTemplate.movementId = fields[80].GetUInt32(); - creatureTemplate.RegenHealth = fields[81].GetBool(); - creatureTemplate.equipmentId = fields[82].GetUInt32(); - creatureTemplate.MechanicImmuneMask = fields[83].GetUInt32(); - creatureTemplate.flags_extra = fields[84].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[85].GetCString()); + creatureTemplate.movementId = fields[81].GetUInt32(); + creatureTemplate.RegenHealth = fields[82].GetBool(); + creatureTemplate.equipmentId = fields[83].GetUInt32(); + creatureTemplate.MechanicImmuneMask = fields[84].GetUInt32(); + creatureTemplate.flags_extra = fields[85].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[86].GetCString()); ++count; } @@ -554,7 +560,10 @@ void ObjectMgr::LoadCreatureTemplateAddons() } if (!sEmotesStore.LookupEntry(creatureAddon.emote)) - sLog->outErrorDb("Creature (Entry: %u) has invalid emote (%u) defined in `creature_template_addon`.", entry, creatureAddon.emote); + { + sLog->outErrorDb("Creature (Entry: %u) has invalid emote (%u) defined in `creature_addon`.", entry, creatureAddon.emote); + creatureAddon.emote = 0; + } ++count; } @@ -706,7 +715,7 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) else if (!displayScaleEntry) displayScaleEntry = displayEntry; - CreatureModelInfo const* modelInfo = GetCreatureModelInfo(cInfo->Modelid2);; + CreatureModelInfo const* modelInfo = GetCreatureModelInfo(cInfo->Modelid2); if (!modelInfo) sLog->outErrorDb("No model data exist for `Modelid2` = %u listed by creature (Entry: %u).", cInfo->Modelid2, cInfo->Entry); } @@ -738,7 +747,7 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) else if (!displayScaleEntry) displayScaleEntry = displayEntry; - CreatureModelInfo const* modelInfo = GetCreatureModelInfo(cInfo->Modelid4);; + CreatureModelInfo const* modelInfo = GetCreatureModelInfo(cInfo->Modelid4); if (!modelInfo) sLog->outErrorDb("No model data exist for `Modelid4` = %u listed by creature (Entry: %u).", cInfo->Modelid4, cInfo->Entry); } @@ -798,6 +807,12 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) const_cast(cInfo)->InhabitType = INHABIT_ANYWHERE; } + if (cInfo->HoverHeight < 0.0f) + { + sLog->outErrorDb("Creature (Entry: %u) has wrong value (%f) in `HoverHeight`", cInfo->Entry, cInfo->HoverHeight); + const_cast(cInfo)->HoverHeight = 1.0f; + } + if (cInfo->VehicleId) { VehicleEntry const* vehId = sVehicleStore.LookupEntry(cInfo->VehicleId); @@ -925,7 +940,7 @@ void ObjectMgr::LoadCreatureAddons() creatureAddon.auras[i++] = uint32(atol(*itr)); } - if (creatureAddon.mount) + if (creatureAddon.mount) { if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount)) { @@ -935,7 +950,10 @@ void ObjectMgr::LoadCreatureAddons() } if (!sEmotesStore.LookupEntry(creatureAddon.emote)) + { sLog->outErrorDb("Creature (GUID: %u) has invalid emote (%u) defined in `creature_addon`.", guid, creatureAddon.emote); + creatureAddon.emote = 0; + } ++count; } @@ -1003,7 +1021,7 @@ void ObjectMgr::LoadEquipmentTemplates() if (!equipmentInfo.ItemEntry[i]) continue; - ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]); + ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]); if (!dbcItem) { @@ -1082,25 +1100,25 @@ void ObjectMgr::ChooseCreatureFlags(const CreatureTemplate* cinfo, uint32& npcfl CreatureModelInfo const* ObjectMgr::GetCreatureModelRandomGender(uint32* displayID) { - CreatureModelInfo const* minfo = GetCreatureModelInfo(*displayID); - if (!minfo) + CreatureModelInfo const* modelInfo = GetCreatureModelInfo(*displayID); + if (!modelInfo) return NULL; // If a model for another gender exists, 50% chance to use it - if (minfo->modelid_other_gender != 0 && urand(0, 1) == 0) + if (modelInfo->modelid_other_gender != 0 && urand(0, 1) == 0) { - CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(minfo->modelid_other_gender); + CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(modelInfo->modelid_other_gender); if (!minfo_tmp) - sLog->outErrorDb("Model (Entry: %u) has modelid_other_gender %u not found in table `creature_model_info`. ", *displayID, minfo->modelid_other_gender); + sLog->outErrorDb("Model (Entry: %u) has modelid_other_gender %u not found in table `creature_model_info`. ", *displayID, modelInfo->modelid_other_gender); else { // Model ID changed - *displayID = minfo->modelid_other_gender; + *displayID = modelInfo->modelid_other_gender; return minfo_tmp; } } - return minfo; + return modelInfo; } void ObjectMgr::LoadCreatureModelInfo() @@ -1116,6 +1134,7 @@ void ObjectMgr::LoadCreatureModelInfo() return; } + _creatureModelStore.rehash(result->GetRowCount()); uint32 count = 0; do @@ -1124,7 +1143,7 @@ void ObjectMgr::LoadCreatureModelInfo() uint32 modelId = fields[0].GetUInt32(); - CreatureModelInfo& modelInfo = _creatureModelStore[modelId]; + CreatureModelInfo& modelInfo = _creatureModelStore[modelId]; modelInfo.bounding_radius = fields[1].GetFloat(); modelInfo.combat_reach = fields[2].GetFloat(); @@ -1149,9 +1168,7 @@ void ObjectMgr::LoadCreatureModelInfo() } if (modelInfo.combat_reach < 0.1f) - { modelInfo.combat_reach = DEFAULT_COMBAT_REACH; - } ++count; } @@ -1166,6 +1183,7 @@ void ObjectMgr::LoadLinkedRespawn() uint32 oldMSTime = getMSTime(); _linkedRespawnStore.clear(); + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT guid, linkedGuid, linkType FROM linked_respawn ORDER BY guid ASC"); if (!result) @@ -1339,7 +1357,6 @@ void ObjectMgr::LoadLinkedRespawn() if (!error) _linkedRespawnStore[guid] = linkedGuid; - } while (result->NextRow()); @@ -1393,9 +1410,9 @@ void ObjectMgr::LoadCreatures() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 7 8 9 10 + // 0 1 2 3 4 5 6 7 8 9 10 QueryResult result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, " - // 11 12 13 14 15 16 17 18 19 20 21 + // 11 12 13 14 15 16 17 18 19 20 21 "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, eventEntry, pool_entry, creature.npcflag, creature.unit_flags, creature.dynamicflags " "FROM creature " "LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid " @@ -1416,13 +1433,14 @@ void ObjectMgr::LoadCreatures() if (GetMapDifficultyData(i, Difficulty(k))) spawnMasks[i] |= (1 << k); + _creatureDataStore.rehash(result->GetRowCount()); uint32 count = 0; do { Field* fields = result->Fetch(); - uint32 guid = fields[ 0].GetUInt32(); - uint32 entry = fields[ 1].GetUInt32(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); CreatureTemplate const* cInfo = GetCreatureTemplate(entry); if (!cInfo) @@ -1432,16 +1450,15 @@ void ObjectMgr::LoadCreatures() } CreatureData& data = _creatureDataStore[guid]; - data.id = entry; - data.mapid = fields[ 2].GetUInt32(); - data.displayid = fields[ 3].GetUInt32(); - data.equipmentId = fields[ 4].GetUInt32(); - data.posX = fields[ 5].GetFloat(); - data.posY = fields[ 6].GetFloat(); - data.posZ = fields[ 7].GetFloat(); - data.orientation = fields[ 8].GetFloat(); - data.spawntimesecs = fields[ 9].GetUInt32(); + data.mapid = fields[2].GetUInt16(); + data.displayid = fields[3].GetUInt32(); + data.equipmentId = fields[4].GetInt32(); + data.posX = fields[5].GetFloat(); + data.posY = fields[6].GetFloat(); + data.posZ = fields[7].GetFloat(); + data.orientation = fields[8].GetFloat(); + data.spawntimesecs = fields[9].GetUInt32(); data.spawndist = fields[10].GetFloat(); data.currentwaypoint= fields[11].GetUInt32(); data.curhealth = fields[12].GetUInt32(); @@ -1449,7 +1466,7 @@ void ObjectMgr::LoadCreatures() data.movementType = fields[14].GetUInt8(); data.spawnMask = fields[15].GetUInt8(); data.phaseMask = fields[16].GetUInt16(); - int16 gameEvent = fields[17].GetInt16(); + int16 gameEvent = fields[17].GetInt8(); uint32 PoolId = fields[18].GetUInt32(); data.npcflag = fields[19].GetUInt32(); data.unit_flags = fields[20].GetUInt32(); @@ -1706,7 +1723,7 @@ void ObjectMgr::LoadGameobjects() // 0 1 2 3 4 5 6 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, " - // 7 8 9 10 11 12 13 14 15 16 17 + // 7 8 9 10 11 12 13 14 15 16 17 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, eventEntry, pool_entry " "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid " "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid"); @@ -1726,12 +1743,13 @@ void ObjectMgr::LoadGameobjects() if (GetMapDifficultyData(i, Difficulty(k))) spawnMasks[i] |= (1 << k); + _gameObjectDataStore.rehash(result->GetRowCount()); do { Field* fields = result->Fetch(); - uint32 guid = fields[ 0].GetUInt32(); - uint32 entry = fields[ 1].GetUInt32(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry); if (!gInfo) @@ -1762,14 +1780,14 @@ void ObjectMgr::LoadGameobjects() GameObjectData& data = _gameObjectDataStore[guid]; data.id = entry; - data.mapid = fields[ 2].GetUInt32(); - data.posX = fields[ 3].GetFloat(); - data.posY = fields[ 4].GetFloat(); - data.posZ = fields[ 5].GetFloat(); - data.orientation = fields[ 6].GetFloat(); - data.rotation0 = fields[ 7].GetFloat(); - data.rotation1 = fields[ 8].GetFloat(); - data.rotation2 = fields[ 9].GetFloat(); + data.mapid = fields[2].GetUInt16(); + data.posX = fields[3].GetFloat(); + data.posY = fields[4].GetFloat(); + data.posZ = fields[5].GetFloat(); + data.orientation = fields[6].GetFloat(); + data.rotation0 = fields[7].GetFloat(); + data.rotation1 = fields[8].GetFloat(); + data.rotation2 = fields[9].GetFloat(); data.rotation3 = fields[10].GetFloat(); data.spawntimesecs = fields[11].GetInt32(); @@ -1785,10 +1803,10 @@ void ObjectMgr::LoadGameobjects() sLog->outErrorDb("Table `gameobject` has gameobject (GUID: %u Entry: %u) with `spawntimesecs` (0) value, but the gameobejct is marked as despawnable at action.", guid, data.id); } - data.animprogress = fields[12].GetUInt32(); + data.animprogress = fields[12].GetUInt8(); data.artKit = 0; - uint32 go_state = fields[13].GetUInt32(); + uint32 go_state = fields[13].GetUInt8(); if (go_state >= MAX_GO_STATE) { sLog->outErrorDb("Table `gameobject` has gameobject (GUID: %u Entry: %u) with invalid `state` (%u) value, skip", guid, data.id, go_state); @@ -1802,7 +1820,7 @@ void ObjectMgr::LoadGameobjects() sLog->outErrorDb("Table `gameobject` has gameobject (GUID: %u Entry: %u) that has wrong spawn mask %u including not supported difficulty modes for map (Id: %u), skip", guid, data.id, data.spawnMask, data.mapid); data.phaseMask = fields[15].GetUInt16(); - int16 gameEvent = fields[16].GetInt16(); + int16 gameEvent = fields[16].GetInt8(); uint32 PoolId = fields[17].GetUInt32(); if (data.rotation2 < -1.0f || data.rotation2 > 1.0f) @@ -1832,7 +1850,6 @@ void ObjectMgr::LoadGameobjects() if (gameEvent == 0 && PoolId == 0) // if not this is to be managed by GameEvent System or Pool system AddGameobjectToGrid(guid, &data); ++count; - } while (result->NextRow()); sLog->outString(">> Loaded %lu gameobjects in %u ms", (unsigned long)_gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime)); @@ -1903,7 +1920,7 @@ void ObjectMgr::LoadGameobjectRespawnTimes() uint32 oldMSTime = getMSTime(); // Remove outdated data - CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_GO_RESPAWNS)); + CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE respawnTime <= UNIX_TIMESTAMP(NOW())"); uint32 count = 0; @@ -1943,10 +1960,12 @@ uint64 ObjectMgr::GetPlayerGUIDByName(std::string name) const { uint64 guid = 0; - CharacterDatabase.EscapeString(name); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_BY_NAME); + + stmt->setString(0, name); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); - // Player name safe to sending to DB (checked at login) and this function using - QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE name = '%s'", name.c_str()); if (result) guid = MAKE_NEW_GUID((*result)[0].GetUInt32(), 0, HIGHGUID_PLAYER); @@ -1962,7 +1981,11 @@ bool ObjectMgr::GetPlayerNameByGUID(uint64 guid, std::string &name) const return true; } - QueryResult result = CharacterDatabase.PQuery("SELECT name FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME); + + stmt->setUInt32(0, GUID_LOPART(guid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -1981,7 +2004,11 @@ uint32 ObjectMgr::GetPlayerTeamByGUID(uint64 guid) const return Player::TeamForRace(player->getRace()); } - QueryResult result = CharacterDatabase.PQuery("SELECT race FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_RACE); + + stmt->setUInt32(0, GUID_LOPART(guid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -2000,7 +2027,12 @@ uint32 ObjectMgr::GetPlayerAccountIdByGUID(uint64 guid) const return player->GetSession()->GetAccountId(); } - QueryResult result = CharacterDatabase.PQuery("SELECT account FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_BY_GUID); + + stmt->setUInt32(0, GUID_LOPART(guid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { uint32 acc = (*result)[0].GetUInt32(); @@ -2012,7 +2044,12 @@ uint32 ObjectMgr::GetPlayerAccountIdByGUID(uint64 guid) const uint32 ObjectMgr::GetPlayerAccountIdByPlayerName(const std::string& name) const { - QueryResult result = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'", name.c_str()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_BY_NAME); + + stmt->setString(0, name); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { uint32 acc = (*result)[0].GetUInt32(); @@ -2613,7 +2650,8 @@ void ObjectMgr::LoadItemSetNames() if (setEntry->itemId[i]) itemSetItems.insert(setEntry->itemId[i]); } - + + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`"); if (!result) @@ -2623,6 +2661,7 @@ void ObjectMgr::LoadItemSetNames() return; } + _itemSetNameStore.rehash(result->GetRowCount()); uint32 count = 0; do @@ -2639,7 +2678,7 @@ void ObjectMgr::LoadItemSetNames() ItemSetNameEntry &data = _itemSetNameStore[entry]; data.name = fields[1].GetString(); - uint32 invType = fields[2].GetUInt32(); + uint32 invType = fields[2].GetUInt8(); if (invType >= MAX_INVTYPE) { sLog->outErrorDb("Item set name (Entry: %u) has wrong InventoryType value (%u)", entry, invType); @@ -2684,6 +2723,7 @@ void ObjectMgr::LoadVehicleTemplateAccessories() uint32 count = 0; + // 0 1 2 3 4 5 QueryResult result = WorldDatabase.Query("SELECT `entry`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_template_accessory`"); if (!result) @@ -2699,7 +2739,7 @@ void ObjectMgr::LoadVehicleTemplateAccessories() uint32 uiEntry = fields[0].GetUInt32(); uint32 uiAccessory = fields[1].GetUInt32(); - int8 uiSeat = int8(fields[2].GetInt16()); + int8 uiSeat = int8(fields[2].GetInt8()); bool bMinion = fields[3].GetBool(); uint8 uiSummonType = fields[4].GetUInt8(); uint32 uiSummonTimer= fields[5].GetUInt32(); @@ -2740,6 +2780,7 @@ void ObjectMgr::LoadVehicleAccessories() uint32 count = 0; + // 0 1 2 3 4 5 QueryResult result = WorldDatabase.Query("SELECT `guid`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_accessory`"); if (!result) @@ -2781,7 +2822,7 @@ void ObjectMgr::LoadPetLevelInfo() uint32 oldMSTime = getMSTime(); // 0 1 2 3 4 5 6 7 8 9 - QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor FROM pet_levelstats"); + QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor FROM pet_levelstats"); if (!result) { @@ -2803,7 +2844,7 @@ void ObjectMgr::LoadPetLevelInfo() continue; } - uint32 current_level = fields[1].GetUInt32(); + uint32 current_level = fields[1].GetUInt8(); if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum @@ -2824,14 +2865,14 @@ void ObjectMgr::LoadPetLevelInfo() PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id]; if (pInfoMapEntry == NULL) - pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)]; + pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)]; // data for level 1 stored in [0] array element, ... PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level-1]; pLevelInfo->health = fields[2].GetUInt16(); pLevelInfo->mana = fields[3].GetUInt16(); - pLevelInfo->armor = fields[9].GetUInt16(); + pLevelInfo->armor = fields[9].GetUInt32(); for (int i = 0; i < MAX_STATS; i++) { @@ -2927,7 +2968,7 @@ void ObjectMgr::LoadPlayerInfo() // Load playercreate { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 + // 0 1 2 3 4 5 6 QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo"); if (!result) @@ -2944,10 +2985,10 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_race = fields[0].GetUInt32(); - uint32 current_class = fields[1].GetUInt32(); - uint32 mapId = fields[2].GetUInt32(); - uint32 areaId = fields[3].GetUInt32(); + uint32 current_race = fields[0].GetUInt8(); + uint32 current_class = fields[1].GetUInt8(); + uint32 mapId = fields[2].GetUInt16(); + uint32 areaId = fields[3].GetUInt32(); // zone float positionX = fields[4].GetFloat(); float positionY = fields[5].GetFloat(); float positionZ = fields[6].GetFloat(); @@ -3032,14 +3073,14 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_race = fields[0].GetUInt32(); + uint32 current_race = fields[0].GetUInt8(); if (current_race >= MAX_RACES) { sLog->outErrorDb("Wrong race %u in `playercreateinfo_item` table, ignoring.", current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); + uint32 current_class = fields[1].GetUInt8(); if (current_class >= MAX_CLASSES) { sLog->outErrorDb("Wrong class %u in `playercreateinfo_item` table, ignoring.", current_class); @@ -3048,13 +3089,13 @@ void ObjectMgr::LoadPlayerInfo() uint32 item_id = fields[2].GetUInt32(); - if (!sObjectMgr->GetItemTemplate(item_id)) + if (!GetItemTemplate(item_id)) { sLog->outErrorDb("Item id %u (race %u class %u) in `playercreateinfo_item` table but not listed in `item_template`, ignoring.", item_id, current_race, current_class); continue; } - int32 amount = fields[3].GetInt32(); + int32 amount = fields[3].GetInt8(); if (!amount) { @@ -3089,11 +3130,8 @@ void ObjectMgr::LoadPlayerInfo() { uint32 oldMSTime = getMSTime(); - QueryResult result = QueryResult(NULL); - if (sWorld->getBoolConfig(CONFIG_START_ALL_SPELLS)) - result = WorldDatabase.Query("SELECT race, class, Spell, Active FROM playercreateinfo_spell_custom"); - else - result = WorldDatabase.Query("SELECT race, class, Spell FROM playercreateinfo_spell"); + std::string tableName = sWorld->getBoolConfig(CONFIG_START_ALL_SPELLS) ? "playercreateinfo_spell_custom" : "playercreateinfo_spell"; + QueryResult result = WorldDatabase.PQuery("SELECT race, class, Spell FROM %s", tableName.c_str()); if (!result) { @@ -3108,14 +3146,14 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_race = fields[0].GetUInt32(); + uint32 current_race = fields[0].GetUInt8(); if (current_race >= MAX_RACES) { sLog->outErrorDb("Wrong race %u in `playercreateinfo_spell` table, ignoring.", current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); + uint32 current_class = fields[1].GetUInt8(); if (current_class >= MAX_CLASSES) { sLog->outErrorDb("Wrong class %u in `playercreateinfo_spell` table, ignoring.", current_class); @@ -3165,14 +3203,14 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_race = fields[0].GetUInt32(); + uint32 current_race = fields[0].GetUInt8(); if (current_race >= MAX_RACES) { sLog->outErrorDb("Wrong race %u in `playercreateinfo_action` table, ignoring.", current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); + uint32 current_class = fields[1].GetUInt8(); if (current_class >= MAX_CLASSES) { sLog->outErrorDb("Wrong class %u in `playercreateinfo_action` table, ignoring.", current_class); @@ -3180,7 +3218,7 @@ void ObjectMgr::LoadPlayerInfo() } PlayerInfo* pInfo = &_playerInfo[current_race][current_class]; - pInfo->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt8(), fields[3].GetUInt32(), fields[4].GetUInt8())); + pInfo->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16())); ++count; } @@ -3212,7 +3250,7 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_class = fields[0].GetUInt32(); + uint32 current_class = fields[0].GetUInt8(); if (current_class >= MAX_CLASSES) { sLog->outErrorDb("Wrong class %u in `player_classlevelstats` table, ignoring.", current_class); @@ -3293,21 +3331,21 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_race = fields[0].GetUInt32(); + uint32 current_race = fields[0].GetUInt8(); if (current_race >= MAX_RACES) { sLog->outErrorDb("Wrong race %u in `player_levelstats` table, ignoring.", current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); + uint32 current_class = fields[1].GetUInt8(); if (current_class >= MAX_CLASSES) { sLog->outErrorDb("Wrong class %u in `player_levelstats` table, ignoring.", current_class); continue; } - uint32 current_level = fields[2].GetUInt32(); + uint32 current_level = fields[2].GetUInt8(); if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum @@ -3411,7 +3449,7 @@ void ObjectMgr::LoadPlayerInfo() { Field* fields = result->Fetch(); - uint32 current_level = fields[0].GetUInt32(); + uint32 current_level = fields[0].GetUInt8(); uint32 current_xp = fields[1].GetUInt32(); if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) @@ -3615,7 +3653,7 @@ void ObjectMgr::LoadQuests() { Field* fields = result->Fetch(); - Quest * newQuest = new Quest(fields); + Quest* newQuest = new Quest(fields); _questTemplates[newQuest->GetQuestId()] = newQuest; } while (result->NextRow()); @@ -3633,9 +3671,7 @@ void ObjectMgr::LoadQuests() // additional quest integrity checks (GO, creature_template and item_template must be loaded already) if (qinfo->GetQuestMethod() >= 3) - { sLog->outErrorDb("Quest %u has `Method` = %u, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod()); - } if (qinfo->Flags & ~QUEST_TRINITY_FLAGS_DB_ALLOWED) { @@ -4466,9 +4502,8 @@ void ObjectMgr::LoadScripts(ScriptsType type) scripts->clear(); // need for reload support bool isSpellScriptTable = (type == SCRIPTS_SPELL); - char buff[125]; - sprintf(buff, "SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o%s FROM %s", isSpellScriptTable ? ", effIndex" : "", tableName.c_str()); - QueryResult result = WorldDatabase.Query(buff); + // 0 1 2 3 4 5 6 7 8 9 + QueryResult result = WorldDatabase.PQuery("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o%s FROM %s", isSpellScriptTable ? ", effIndex" : "", tableName.c_str()); if (!result) { @@ -4481,7 +4516,6 @@ void ObjectMgr::LoadScripts(ScriptsType type) do { - Field* fields = result->Fetch(); ScriptInfo tmp; tmp.type = type; @@ -4881,7 +4915,9 @@ void ObjectMgr::LoadWaypointScripts() for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr) actionSet.insert(itr->first); - QueryResult result = WorldDatabase.PQuery("SELECT DISTINCT(`action`) FROM waypoint_data"); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WOLRD_SEL_WAYPOINT_DATA_ACTION); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (result) { do @@ -4890,8 +4926,8 @@ void ObjectMgr::LoadWaypointScripts() uint32 action = fields[0].GetUInt32(); actionSet.erase(action); - - } while (result->NextRow()); + } + while (result->NextRow()); } for (std::set::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr) @@ -5022,6 +5058,7 @@ void ObjectMgr::LoadPageTexts() { uint32 oldMSTime = getMSTime(); + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT entry, text, next_page FROM page_text"); if (!result) @@ -5036,10 +5073,10 @@ void ObjectMgr::LoadPageTexts() { Field* fields = result->Fetch(); - PageText& pageText = _pageTextStore[fields[0].GetUInt32()]; + PageText& pageText = _pageTextStore[fields[0].GetUInt32()]; pageText.Text = fields[1].GetString(); - pageText.NextPage = fields[2].GetInt16(); + pageText.NextPage = fields[2].GetUInt32(); ++count; } @@ -5100,6 +5137,7 @@ void ObjectMgr::LoadInstanceTemplate() { uint32 oldMSTime = getMSTime(); + // 0 1 2 4 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template"); if (!result) @@ -5151,6 +5189,7 @@ void ObjectMgr::LoadInstanceEncounters() { uint32 oldMSTime = getMSTime(); + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters"); if (!result) { @@ -5167,7 +5206,7 @@ void ObjectMgr::LoadInstanceEncounters() uint32 entry = fields[0].GetUInt32(); uint8 creditType = fields[1].GetUInt8(); uint32 creditEntry = fields[2].GetUInt32(); - uint32 lastEncounterDungeon = fields[3].GetUInt32(); + uint32 lastEncounterDungeon = fields[3].GetUInt16(); DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry); if (!dungeonEncounter) { @@ -5244,11 +5283,11 @@ void ObjectMgr::LoadGossipText() int count = 0; if (!result) { - sLog->outString(">> Loaded %u npc texts", count); sLog->outString(); return; } + _gossipTextStore.rehash(result->GetRowCount()); int cic; @@ -5273,13 +5312,13 @@ void ObjectMgr::LoadGossipText() gText.Options[i].Text_0 = fields[cic++].GetString(); gText.Options[i].Text_1 = fields[cic++].GetString(); - gText.Options[i].Language = fields[cic++].GetUInt32(); + gText.Options[i].Language = fields[cic++].GetUInt8(); gText.Options[i].Probability = fields[cic++].GetFloat(); for (uint8 j=0; j < MAX_GOSSIP_TEXT_EMOTES; ++j) { - gText.Options[i].Emotes[j]._Delay = fields[cic++].GetUInt32(); - gText.Options[i].Emotes[j]._Emote = fields[cic++].GetUInt32(); + gText.Options[i].Emotes[j]._Delay = fields[cic++].GetUInt16(); + gText.Options[i].Emotes[j]._Emote = fields[cic++].GetUInt16(); } } } while (result->NextRow()); @@ -5360,7 +5399,7 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) std::map itemsCache; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS); - stmt->setUInt64(0, basetime); + stmt->setUInt32(0, (uint32)basetime); if (PreparedQueryResult items = CharacterDatabase.Query(stmt)) { MailItemInfo item; @@ -5378,18 +5417,17 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) uint32 returnedCount = 0; do { - Field* fields = result->Fetch(); Mail* m = new Mail; - m->messageID = fields[0].GetUInt32(); - m->messageType = fields[1].GetUInt8(); - m->sender = fields[2].GetUInt32(); - m->receiver = fields[3].GetUInt32(); - bool has_items = fields[4].GetBool(); - m->expire_time = time_t(fields[5].GetUInt32()); - m->deliver_time = 0; - m->COD = fields[6].GetUInt32(); - m->checked = fields[7].GetUInt32(); + m->messageID = fields[0].GetUInt32(); + m->messageType = fields[1].GetUInt8(); + m->sender = fields[2].GetUInt32(); + m->receiver = fields[3].GetUInt32(); + bool has_items = fields[4].GetBool(); + m->expire_time = time_t(fields[5].GetUInt32()); + m->deliver_time = 0; + m->COD = fields[6].GetUInt32(); + m->checked = fields[7].GetUInt8(); m->mailTemplateId = fields[8].GetInt16(); Player* player = NULL; @@ -5426,8 +5464,8 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED); stmt->setUInt32(0, m->receiver); stmt->setUInt32(1, m->sender); - stmt->setUInt64(2, basetime + 30 * DAY); - stmt->setUInt64(3, basetime); + stmt->setUInt32(2, basetime + 30 * DAY); + stmt->setUInt32(3, basetime); stmt->setUInt8 (4, uint8(MAIL_CHECK_MASK_RETURNED)); stmt->setUInt32(5, m->messageID); CharacterDatabase.Execute(stmt); @@ -5450,7 +5488,7 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) } } - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); stmt->setUInt32(0, m->messageID); CharacterDatabase.Execute(stmt); delete m; @@ -5697,7 +5735,7 @@ uint32 ObjectMgr::GetTaxiMountDisplayId(uint32 id, uint32 team, bool allowed_alt } // minfo is not actually used but the mount_id was updated - sObjectMgr->GetCreatureModelRandomGender(&mount_id); + GetCreatureModelRandomGender(&mount_id); return mount_id; } @@ -5708,6 +5746,7 @@ void ObjectMgr::LoadGraveyardZones() GraveYardStore.clear(); // need for reload case + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT id, ghost_zone, faction FROM game_graveyard_zone"); if (!result) @@ -5727,7 +5766,7 @@ void ObjectMgr::LoadGraveyardZones() uint32 safeLocId = fields[0].GetUInt32(); uint32 zoneId = fields[1].GetUInt32(); - uint32 team = fields[2].GetUInt32(); + uint32 team = fields[2].GetUInt16(); WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(safeLocId); if (!entry) @@ -5845,10 +5884,10 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float if (MapId != entry->map_id) { // if find graveyard at different map from where entrance placed (or no entrance data), use any first - if (!mapEntry || - mapEntry->entrance_map < 0 || - uint32(mapEntry->entrance_map) != entry->map_id || - (mapEntry->entrance_x == 0 && mapEntry->entrance_y == 0)) + if (!mapEntry + || mapEntry->entrance_map < 0 + || uint32(mapEntry->entrance_map) != entry->map_id + || (mapEntry->entrance_x == 0 && mapEntry->entrance_y == 0)) { // not have any corrdinates for check distance anyway entryFar = entry; @@ -5993,8 +6032,6 @@ void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool WorldDatabase.Execute(stmt); } - - return; } void ObjectMgr::LoadAreaTriggerTeleports() @@ -6024,7 +6061,7 @@ void ObjectMgr::LoadAreaTriggerTeleports() AreaTrigger at; - at.target_mapId = fields[1].GetUInt32(); + at.target_mapId = fields[1].GetUInt16(); at.target_X = fields[2].GetFloat(); at.target_Y = fields[3].GetFloat(); at.target_Z = fields[4].GetFloat(); @@ -6064,7 +6101,7 @@ void ObjectMgr::LoadAccessRequirements() _accessRequirementStore.clear(); // need for reload case - // 0 1 2 3 4 5 6 7 8 9 + // 0 1 2 3 4 5 6 7 8 9 QueryResult result = WorldDatabase.Query("SELECT mapid, difficulty, level_min, level_max, item, item2, quest_done_A, quest_done_H, completed_achievement, quest_failed_text FROM access_requirement"); if (!result) { @@ -6098,7 +6135,7 @@ void ObjectMgr::LoadAccessRequirements() if (ar.item) { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(ar.item); + ItemTemplate const* pProto = GetItemTemplate(ar.item); if (!pProto) { sLog->outError("Key item %u does not exist for map %u difficulty %u, removing key requirement.", ar.item, mapid, difficulty); @@ -6108,7 +6145,7 @@ void ObjectMgr::LoadAccessRequirements() if (ar.item2) { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(ar.item2); + ItemTemplate const* pProto = GetItemTemplate(ar.item2); if (!pProto) { sLog->outError("Second item %u does not exist for map %u difficulty %u, removing key requirement.", ar.item2, mapid, difficulty); @@ -6215,10 +6252,10 @@ void ObjectMgr::SetHighestGuids() _hiItemGuid = (*result)[0].GetUInt32()+1; // Cleanup other tables from not existed guids ( >= _hiItemGuid) - CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", _hiItemGuid); // One-time query - CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", _hiItemGuid); // One-time query - CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE itemguid >= '%u'", _hiItemGuid); // One-time query - CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '%u'", _hiItemGuid); // One-time query + CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", _hiItemGuid); // One-time query + CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", _hiItemGuid); // One-time query + CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE itemguid >= '%u'", _hiItemGuid); // One-time query + CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '%u'", _hiItemGuid); // One-time query result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject"); if (result) @@ -6292,74 +6329,54 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh) switch (guidhigh) { case HIGHGUID_ITEM: - if (_hiItemGuid >= 0xFFFFFFFE) - { - sLog->outError("Item guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiItemGuid < 0xFFFFFFFE && "Item guid overflow!"); return _hiItemGuid++; + } case HIGHGUID_UNIT: - if (_hiCreatureGuid >= 0x00FFFFFE) - { - sLog->outError("Creature guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiCreatureGuid < 0x00FFFFFE && "Creature guid overflow!"); return _hiCreatureGuid++; + } case HIGHGUID_PET: - if (_hiPetGuid >= 0x00FFFFFE) - { - sLog->outError("Pet guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiPetGuid < 0x00FFFFFE && "Pet guid overflow!"); return _hiPetGuid++; + } case HIGHGUID_VEHICLE: - if (_hiVehicleGuid >= 0x00FFFFFF) - { - sLog->outError("Vehicle guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiVehicleGuid < 0x00FFFFFF && "Vehicle guid overflow!"); return _hiVehicleGuid++; + } case HIGHGUID_PLAYER: - if (_hiCharGuid >= 0xFFFFFFFE) - { - sLog->outError("Players guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiCharGuid < 0xFFFFFFFE && "Player guid overflow!"); return _hiCharGuid++; + } case HIGHGUID_GAMEOBJECT: - if (_hiGoGuid >= 0x00FFFFFE) - { - sLog->outError("Gameobject guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiGoGuid < 0x00FFFFFE && "Gameobject guid overflow!"); return _hiGoGuid++; + } case HIGHGUID_CORPSE: - if (_hiCorpseGuid >= 0xFFFFFFFE) - { - sLog->outError("Corpse guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiCorpseGuid < 0xFFFFFFFE && "Corpse guid overflow!"); return _hiCorpseGuid++; + } case HIGHGUID_DYNAMICOBJECT: - if (_hiDoGuid >= 0xFFFFFFFE) - { - sLog->outError("DynamicObject guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiDoGuid < 0xFFFFFFFE && "DynamicObject guid overflow!"); return _hiDoGuid++; + } case HIGHGUID_MO_TRANSPORT: - if (_hiMoTransGuid >= 0xFFFFFFFE) - { - sLog->outError("MO Transport guid overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } + { + ASSERT(_hiMoTransGuid < 0xFFFFFFFE && "MO Transport guid overflow!"); return _hiMoTransGuid++; + } default: - ASSERT(0); + ASSERT(false && "ObjectMgr::GenerateLowGuid - Unknown HIGHGUID type"); + return 0; } - - ASSERT(0); - return 0; } void ObjectMgr::LoadGameObjectLocales() @@ -6475,6 +6492,7 @@ void ObjectMgr::LoadGameObjectTemplate() return; } + _gameObjectTemplateStore.rehash(result->GetRowCount()); uint32 count = 0; do { @@ -6513,13 +6531,13 @@ void ObjectMgr::LoadGameObjectTemplate() { if (got.door.lockId) CheckGOLockId(&got, got.door.lockId, 1); - CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3); + CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3); break; } case GAMEOBJECT_TYPE_BUTTON: //1 { if (got.button.lockId) - CheckGOLockId(&got, got.button.lockId, 1); + CheckGOLockId(&got, got.button.lockId, 1); CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4); break; } @@ -6661,10 +6679,9 @@ void ObjectMgr::LoadExplorationBaseXP() do { - Field* fields = result->Fetch(); uint8 level = fields[0].GetUInt8(); - uint32 basexp = fields[1].GetUInt32(); + uint32 basexp = fields[1].GetInt32(); _baseXPTable[level] = basexp; ++count; } @@ -6689,7 +6706,7 @@ uint32 ObjectMgr::GetXPForLevel(uint8 level) void ObjectMgr::LoadPetNames() { uint32 oldMSTime = getMSTime(); - + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT word, entry, half FROM pet_name_generation"); if (!result) @@ -6703,7 +6720,6 @@ void ObjectMgr::LoadPetNames() do { - Field* fields = result->Fetch(); std::string word = fields[0].GetString(); uint32 entry = fields[1].GetUInt32(); @@ -6807,7 +6823,7 @@ void ObjectMgr::LoadReputationRewardRate() _repRewardRateStore.clear(); // for reload case - uint32 count = 0; + uint32 count = 0; // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT faction, quest_rate, creature_rate, spell_rate FROM reputation_reward_rate"); if (!result) @@ -6819,7 +6835,6 @@ void ObjectMgr::LoadReputationRewardRate() do { - Field* fields = result->Fetch(); uint32 factionId = fields[0].GetUInt32(); @@ -6894,13 +6909,13 @@ void ObjectMgr::LoadReputationOnKill() uint32 creature_id = fields[0].GetUInt32(); ReputationOnKillEntry repOnKill; - repOnKill.RepFaction1 = fields[1].GetUInt32(); - repOnKill.RepFaction2 = fields[2].GetUInt32(); + repOnKill.RepFaction1 = fields[1].GetInt16(); + repOnKill.RepFaction2 = fields[2].GetInt16(); repOnKill.IsTeamAward1 = fields[3].GetBool(); - repOnKill.ReputationMaxCap1 = fields[4].GetUInt32(); + repOnKill.ReputationMaxCap1 = fields[4].GetUInt8(); repOnKill.RepValue1 = fields[5].GetInt32(); repOnKill.IsTeamAward2 = fields[6].GetBool(); - repOnKill.ReputationMaxCap2 = fields[7].GetUInt32(); + repOnKill.ReputationMaxCap2 = fields[7].GetUInt8(); repOnKill.RepValue2 = fields[8].GetInt32(); repOnKill.TeamDependent = fields[9].GetUInt8(); @@ -6945,7 +6960,7 @@ void ObjectMgr::LoadReputationSpilloverTemplate() _repSpilloverTemplateStore.clear(); // for reload case - uint32 count = 0; + uint32 count = 0; // 0 1 2 3 4 5 6 7 8 9 10 11 12 QueryResult result = WorldDatabase.Query("SELECT faction, faction1, rate_1, rank_1, faction2, rate_2, rank_2, faction3, rate_3, rank_3, faction4, rate_4, rank_4 FROM reputation_spillover_template"); if (!result) @@ -6957,25 +6972,24 @@ void ObjectMgr::LoadReputationSpilloverTemplate() do { - Field* fields = result->Fetch(); - uint32 factionId = fields[0].GetUInt32(); + uint32 factionId = fields[0].GetUInt16(); RepSpilloverTemplate repTemplate; - repTemplate.faction[0] = fields[1].GetUInt32(); + repTemplate.faction[0] = fields[1].GetUInt16(); repTemplate.faction_rate[0] = fields[2].GetFloat(); - repTemplate.faction_rank[0] = fields[3].GetUInt32(); - repTemplate.faction[1] = fields[4].GetUInt32(); + repTemplate.faction_rank[0] = fields[3].GetUInt8(); + repTemplate.faction[1] = fields[4].GetUInt16(); repTemplate.faction_rate[1] = fields[5].GetFloat(); - repTemplate.faction_rank[1] = fields[6].GetUInt32(); - repTemplate.faction[2] = fields[7].GetUInt32(); + repTemplate.faction_rank[1] = fields[6].GetUInt8(); + repTemplate.faction[2] = fields[7].GetUInt16(); repTemplate.faction_rate[2] = fields[8].GetFloat(); - repTemplate.faction_rank[2] = fields[9].GetUInt32(); - repTemplate.faction[3] = fields[10].GetUInt32(); + repTemplate.faction_rank[2] = fields[9].GetUInt8(); + repTemplate.faction[3] = fields[10].GetUInt16(); repTemplate.faction_rate[3] = fields[11].GetFloat(); - repTemplate.faction_rank[3] = fields[12].GetUInt32(); + repTemplate.faction_rank[3] = fields[12].GetUInt8(); FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); @@ -7060,7 +7074,7 @@ void ObjectMgr::LoadPointsOfInterest() uint32 count = 0; - // 0 1 2 3 4 5 6 + // 0 1 2 3 4 5 6 QueryResult result = WorldDatabase.Query("SELECT entry, x, y, icon, flags, data, icon_name FROM points_of_interest"); if (!result) @@ -7077,12 +7091,12 @@ void ObjectMgr::LoadPointsOfInterest() uint32 point_id = fields[0].GetUInt32(); PointOfInterest POI; - POI.x = fields[1].GetFloat(); - POI.y = fields[2].GetFloat(); - POI.icon = fields[3].GetUInt32(); - POI.flags = fields[4].GetUInt32(); - POI.data = fields[5].GetUInt32(); - POI.icon_name = fields[6].GetString(); + POI.x = fields[1].GetFloat(); + POI.y = fields[2].GetFloat(); + POI.icon = fields[3].GetUInt32(); + POI.flags = fields[4].GetUInt32(); + POI.data = fields[5].GetUInt32(); + POI.icon_name = fields[6].GetString(); if (!Trinity::IsValidMapCoord(POI.x, POI.y)) { @@ -7117,8 +7131,8 @@ void ObjectMgr::LoadQuestPOI() return; } - // 0 1 2 3 - QueryResult points = WorldDatabase.PQuery("SELECT questId, id, x, y FROM quest_poi_points ORDER BY questId DESC, idx"); + // 0 1 2 3 + QueryResult points = WorldDatabase.Query("SELECT questId, id, x, y FROM quest_poi_points ORDER BY questId DESC, idx"); std::vector > > POIs; @@ -7131,7 +7145,6 @@ void ObjectMgr::LoadQuestPOI() do { - fields = points->Fetch(); uint32 questId = fields[0].GetUInt32(); @@ -7177,7 +7190,7 @@ void ObjectMgr::LoadNPCSpellClickSpells() uint32 oldMSTime = getMSTime(); _spellClickInfoStore.clear(); - // 0 1 2 3 + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells"); if (!result) @@ -7209,7 +7222,7 @@ void ObjectMgr::LoadNPCSpellClickSpells() continue; } - uint8 userType = fields[3].GetUInt8(); + uint8 userType = fields[3].GetUInt16(); if (userType >= SPELL_CLICK_USER_MAX) sLog->outErrorDb("Table npc_spellclick_spells references unknown user type %u. Skipping entry.", uint32(userType)); @@ -7256,9 +7269,9 @@ void ObjectMgr::SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t _creatureRespawnTimesMutex.release(); } - PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN); stmt->setUInt32(0, loguid); - stmt->setUInt64(1, uint64(t)); + stmt->setUInt32(1, uint32(t)); stmt->setUInt32(2, instance); CharacterDatabase.Execute(stmt); } @@ -7272,7 +7285,7 @@ void ObjectMgr::RemoveCreatureRespawnTime(uint32 loguid, uint32 instance) _creatureRespawnTimesMutex.release(); } - PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); stmt->setUInt32(0, loguid); stmt->setUInt32(1, instance); CharacterDatabase.Execute(stmt); @@ -7410,7 +7423,6 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string table, do { - uint32 id = result->Fetch()[0].GetUInt32(); uint32 quest = result->Fetch()[1].GetUInt32(); uint32 poolId = result->Fetch()[2].GetUInt32(); @@ -7733,7 +7745,7 @@ void ObjectMgr::LoadGameObjectForQuests() sLog->outString(); } -bool ObjectMgr::LoadTrinityStrings(char const* table, int32 min_value, int32 max_value) +bool ObjectMgr::LoadTrinityStrings(const char* table, int32 min_value, int32 max_value) { uint32 oldMSTime = getMSTime(); @@ -7775,7 +7787,6 @@ bool ObjectMgr::LoadTrinityStrings(char const* table, int32 min_value, int32 max if (!result) { - if (min_value == MIN_TRINITY_STRING_ID) // error only in case internal strings sLog->outErrorDb(">> Loaded 0 trinity strings. DB table `%s` is empty. Cannot continue.", table); else @@ -7863,10 +7874,9 @@ void ObjectMgr::LoadFishingBaseSkillLevel() do { - Field* fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); - int32 skill = fields[1].GetInt32(); + int32 skill = fields[1].GetInt16(); AreaTableEntry const* fArea = GetAreaEntryByAreaID(entry); if (!fArea) @@ -7893,7 +7903,7 @@ bool ObjectMgr::CheckDeclinedNames(std::wstring w_ownname, DeclinedName const& n bool y = true; // check declined names - for (uint8 i =0; i < MAX_DECLINED_NAME_CASES; ++i) + for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) { std::wstring wname; if (!Utf8toWStr(names.name[i], wname)) @@ -7959,6 +7969,7 @@ void ObjectMgr::LoadGameTele() _gameTeleStore.clear(); // for reload case + // 0 1 2 3 4 5 6 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele"); if (!result) @@ -7972,7 +7983,6 @@ void ObjectMgr::LoadGameTele() do { - Field* fields = result->Fetch(); uint32 id = fields[0].GetUInt32(); @@ -7983,7 +7993,7 @@ void ObjectMgr::LoadGameTele() gt.position_y = fields[2].GetFloat(); gt.position_z = fields[3].GetFloat(); gt.orientation = fields[4].GetFloat(); - gt.mapId = fields[5].GetUInt32(); + gt.mapId = fields[5].GetUInt16(); gt.name = fields[6].GetString(); if (!MapManager::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation)) @@ -8015,7 +8025,7 @@ GameTele const* ObjectMgr::GetGameTele(const std::string& name) const // explicit name case std::wstring wname; if (!Utf8toWStr(name, wname)) - return false; + return NULL; // converting string that we try to find to lower case wstrToLower(wname); @@ -8100,6 +8110,7 @@ void ObjectMgr::LoadMailLevelRewards() _mailLevelRewardStore.clear(); // for reload case + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward"); if (!result) @@ -8113,7 +8124,6 @@ void ObjectMgr::LoadMailLevelRewards() do { - Field* fields = result->Fetch(); uint8 level = fields[0].GetUInt8(); @@ -8257,20 +8267,18 @@ void ObjectMgr::LoadTrainerSpell() do { - Field* fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); uint32 spell = fields[1].GetUInt32(); uint32 spellCost = fields[2].GetUInt32(); - uint32 reqSkill = fields[3].GetUInt32(); - uint32 reqSkillValue = fields[4].GetUInt32(); - uint32 reqLevel = fields[5].GetUInt32(); + uint32 reqSkill = fields[3].GetUInt16(); + uint32 reqSkillValue = fields[4].GetUInt16(); + uint32 reqLevel = fields[5].GetUInt8(); AddSpellToTrainer(entry, spell, spellCost, reqSkill, reqSkillValue, reqLevel); - count++; - + ++count; } while (result->NextRow()); @@ -8281,7 +8289,10 @@ void ObjectMgr::LoadTrainerSpell() int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set *skip_vendors) { // find all items from the reference vendor - QueryResult result = WorldDatabase.PQuery("SELECT item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry='%d' ORDER BY slot ASC", item); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_NPC_VENDOR_REF); + stmt->setUInt32(0, uint32(item)); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) return 0; @@ -8297,7 +8308,7 @@ int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set *s count += LoadReferenceVendor(vendor, -item_id, skip_vendors); else { - int32 maxcount = fields[1].GetInt32(); + int32 maxcount = fields[1].GetUInt8(); uint32 incrtime = fields[2].GetUInt32(); uint32 ExtendedCost = fields[3].GetUInt32(); @@ -8309,7 +8320,6 @@ int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set *s vList.AddItem(item_id, maxcount, incrtime, ExtendedCost); ++count; } - } while (result->NextRow()); return count; @@ -8348,7 +8358,7 @@ void ObjectMgr::LoadVendors() count += LoadReferenceVendor(entry, -item_id, &skip_vendors); else { - int32 maxcount = fields[2].GetInt32(); + uint32 maxcount = fields[2].GetUInt8(); uint32 incrtime = fields[3].GetUInt32(); uint32 ExtendedCost = fields[4].GetUInt32(); @@ -8360,7 +8370,6 @@ void ObjectMgr::LoadVendors() vList.AddItem(item_id, maxcount, incrtime, ExtendedCost); ++count; } - } while (result->NextRow()); @@ -8387,12 +8396,11 @@ void ObjectMgr::LoadGossipMenu() do { - Field* fields = result->Fetch(); GossipMenus gMenu; - gMenu.entry = fields[0].GetUInt32(); + gMenu.entry = fields[0].GetUInt16(); gMenu.text_id = fields[1].GetUInt32(); if (!GetGossipText(gMenu.text_id)) @@ -8418,7 +8426,9 @@ void ObjectMgr::LoadGossipMenuItems() _gossipMenuItemsStore.clear(); QueryResult result = WorldDatabase.Query( + // 0 1 2 3 4 "SELECT menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, " + // 5 6 7 8 9 "action_menu_id, action_poi_id, box_coded, box_money, box_text " "FROM gossip_menu_option ORDER BY menu_id, id"); @@ -8437,11 +8447,11 @@ void ObjectMgr::LoadGossipMenuItems() GossipMenuItems gMenuItem; - gMenuItem.MenuId = fields[0].GetUInt32(); - gMenuItem.OptionIndex = fields[1].GetUInt32(); - gMenuItem.OptionIcon = fields[2].GetUInt8(); + gMenuItem.MenuId = fields[0].GetUInt16(); + gMenuItem.OptionIndex = fields[1].GetUInt16(); + gMenuItem.OptionIcon = fields[2].GetUInt32(); gMenuItem.OptionText = fields[3].GetString(); - gMenuItem.OptionType = fields[4].GetUInt32(); + gMenuItem.OptionType = fields[4].GetUInt8(); gMenuItem.OptionNpcflag = fields[5].GetUInt32(); gMenuItem.ActionMenuId = fields[6].GetUInt32(); gMenuItem.ActionPoiId = fields[7].GetUInt32(); @@ -8656,10 +8666,13 @@ uint32 ObjectMgr::GetScriptId(const char *name) { // use binary search to find the script name in the sorted vector // assume "" is the first element - if (!name) return 0; - ScriptNameContainer::const_iterator itr = - std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name); - if (itr == _scriptNamesStore.end() || *itr != name) return 0; + if (!name) + return 0; + + ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name); + if (itr == _scriptNamesStore.end() || *itr != name) + return 0; + return uint32(itr - _scriptNamesStore.begin()); } @@ -8668,6 +8681,7 @@ void ObjectMgr::CheckScripts(ScriptsType type, std::set& ids) ScriptMapMap* scripts = GetScriptsMapByType(type); if (!scripts) return; + for (ScriptMapMap::const_iterator itrMM = scripts->begin(); itrMM != scripts->end(); ++itrMM) { for (ScriptMap::const_iterator itrM = itrMM->second.begin(); itrM != itrMM->second.end(); ++itrM) @@ -8706,7 +8720,7 @@ void ObjectMgr::LoadDbScriptStrings() sLog->outErrorDb("Table `db_script_string` has unused string id %u", *itr); } -bool LoadTrinityStrings(char const* table, int32 start_value, int32 end_value) +bool LoadTrinityStrings(const char* table, int32 start_value, int32 end_value) { // MAX_DB_SCRIPT_STRING_ID is max allowed negative value for scripts (scrpts can use only more deep negative values // start/end reversed for negative values @@ -8758,16 +8772,16 @@ void ObjectMgr::LoadCreatureClassLevelStats() { Field* fields = result->Fetch(); - uint8 Level = fields[0].GetUInt8(); - uint8 Class = fields[1].GetUInt8(); + uint8 Level = fields[0].GetInt8(); + uint8 Class = fields[1].GetInt8(); CreatureBaseStats stats; for (uint8 i = 0; i < MAX_CREATURE_BASE_HP; ++i) - stats.BaseHealth[i] = fields[i + 2].GetUInt32(); + stats.BaseHealth[i] = fields[i + 2].GetInt16(); - stats.BaseMana = fields[5].GetUInt32(); - stats.BaseArmor = fields[6].GetUInt32(); + stats.BaseMana = fields[5].GetInt16(); + stats.BaseArmor = fields[6].GetInt16(); if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0) sLog->outErrorDb("Creature base stats for level %u has invalid class %u", Level, Class); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index ae699a01da7..9ab7898573f 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -526,6 +526,7 @@ struct GraveYardData uint32 safeLocId; uint32 team; }; + typedef std::multimap GraveYardContainer; typedef UNORDERED_MAP CacheVendorItemContainer; @@ -649,7 +650,7 @@ class ObjectMgr return NULL; } - InstanceTemplate const* GetInstanceTemplate(uint32 mapID); + InstanceTemplate const* GetInstanceTemplate(uint32 mapId); PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint8 level) const; @@ -1035,15 +1036,6 @@ class ObjectMgr return &itr->second; } - bool IsGoOfSpecificEntrySpawned(uint32 entry) const - { - for (GameObjectDataContainer::const_iterator it = _gameObjectDataStore.begin(); it != _gameObjectDataStore.end(); ++it) - if (it->second.id == entry) - return true; - - return false; - } - GameObjectData const* GetGOData(uint32 guid) const { GameObjectDataContainer::const_iterator itr = _gameObjectDataStore.find(guid); @@ -1349,7 +1341,6 @@ class ObjectMgr }; HotfixData _hotfixData; - }; #define sObjectMgr ACE_Singleton::instance() diff --git a/src/server/game/Grids/Cells/CellImpl.h b/src/server/game/Grids/Cells/CellImpl.h index 77830bc59d5..b224b3865e0 100644 --- a/src/server/game/Grids/Cells/CellImpl.h +++ b/src/server/game/Grids/Cells/CellImpl.h @@ -91,7 +91,7 @@ inline void Cell::Visit(CellCoord const& standing_cell, TypeContainerVisitor 4) && ((area.high_bound.y_coord - area.low_bound.y_coord) > 4)) + if ((area.high_bound.x_coord > (area.low_bound.x_coord + 4)) && (area.high_bound.y_coord > (area.low_bound.y_coord + 4))) { VisitCircle(visitor, map, area.low_bound, area.high_bound); return; diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h index d096bb7ab63..7bd0da34a46 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -67,12 +67,12 @@ typedef GridRefManager PlayerMapType; enum GridMapTypeMask { - GRID_MAP_TYPE_MASK_CORPSE = 0x01, - GRID_MAP_TYPE_MASK_CREATURE = 0x02, - GRID_MAP_TYPE_MASK_DYNAMICOBJECT = 0x04, - GRID_MAP_TYPE_MASK_GAMEOBJECT = 0x08, - GRID_MAP_TYPE_MASK_PLAYER = 0x10, - GRID_MAP_TYPE_MASK_ALL = 0x1F + GRID_MAP_TYPE_MASK_CORPSE = 0x01, + GRID_MAP_TYPE_MASK_CREATURE = 0x02, + GRID_MAP_TYPE_MASK_DYNAMICOBJECT = 0x04, + GRID_MAP_TYPE_MASK_GAMEOBJECT = 0x08, + GRID_MAP_TYPE_MASK_PLAYER = 0x10, + GRID_MAP_TYPE_MASK_ALL = 0x1F }; typedef Grid GridType; @@ -172,14 +172,14 @@ typedef CoordPair CellCoord; namespace Trinity { template - inline RET_TYPE Compute(float x, float y, float center_offset, float size) + inline RET_TYPE Compute(float x, float y, float center_offset, float size) { // calculate and store temporary values in double format for having same result as same mySQL calculations double x_offset = (double(x) - center_offset)/size; double y_offset = (double(y) - center_offset)/size; - int x_val = int(x_offset+CENTER_VAL + 0.5f); - int y_val = int(y_offset+CENTER_VAL + 0.5f); + int x_val = int(x_offset + CENTER_VAL + 0.5f); + int y_val = int(y_offset + CENTER_VAL + 0.5f); return RET_TYPE(x_val, y_val); } diff --git a/src/server/game/Grids/GridStates.h b/src/server/game/Grids/GridStates.h index 08b66f6bb35..cf649f8d896 100755 --- a/src/server/game/Grids/GridStates.h +++ b/src/server/game/Grids/GridStates.h @@ -40,6 +40,7 @@ class GridState void setMagic() { i_Magic = MAGIC_TESTVAL; } unsigned int i_Magic; #endif + virtual ~GridState() {}; virtual void Update(Map &, NGridType&, GridInfo &, const uint32 t_diff) const = 0; }; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index 17d3066e64d..a02c18ca008 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -120,7 +120,7 @@ inline void CreatureUnitRelocationWorker(Creature* c, Unit* u) void PlayerRelocationNotifier::Visit(PlayerMapType &m) { - for (PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) + for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { Player* player = iter->getSource(); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 48b9860eb0b..54bc1206e18 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -797,7 +797,7 @@ namespace Trinity if (u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->isTotem()) return false; - if(!u->isTargetableForAttack(false)) + if (!u->isTargetableForAttack(false)) return false; return i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u); @@ -858,6 +858,30 @@ namespace Trinity float i_range; }; + class AnyGroupedUnitInObjectRangeCheck + { + public: + AnyGroupedUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool raid) : _source(obj), _refUnit(funit), _range(range), _raid(raid) {} + bool operator()(Unit* u) + { + if (_raid) + { + if (!_refUnit->IsInRaidWith(u)) + return false; + } + else if (!_refUnit->IsInPartyWith(u)) + return false; + + return !_refUnit->IsHostileTo(u) && u->isAlive() && _source->IsWithinDistInMap(u, _range); + } + + private: + WorldObject const* _source; + Unit const* _refUnit; + float _range; + bool _raid; + }; + class AnyUnitInObjectRangeCheck { public: @@ -903,13 +927,15 @@ namespace Trinity { public: AnyAoETargetUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) - : i_obj(obj), i_funit(funit), i_range(range) + : i_obj(obj), i_funit(funit), _spellInfo(NULL), i_range(range) { Unit const* check = i_funit; Unit const* owner = i_funit->GetOwner(); if (owner) check = owner; i_targetForPlayer = (check->GetTypeId() == TYPEID_PLAYER); + if (i_obj->GetTypeId() == TYPEID_DYNAMICOBJECT) + _spellInfo = sSpellMgr->GetSpellInfo(((DynamicObject*)i_obj)->GetSpellId()); } bool operator()(Unit* u) { @@ -917,7 +943,7 @@ namespace Trinity if (u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->isTotem()) return false; - if (i_funit->IsValidAttackTarget(u) && i_obj->IsWithinDistInMap(u, i_range)) + if (i_funit->_IsValidAttackTarget(u, _spellInfo,i_obj->GetTypeId() == TYPEID_DYNAMICOBJECT ? i_obj : NULL) && i_obj->IsWithinDistInMap(u, i_range)) return true; return false; @@ -926,6 +952,7 @@ namespace Trinity bool i_targetForPlayer; WorldObject const* i_obj; Unit const* i_funit; + SpellInfo const* _spellInfo; float i_range; }; @@ -945,7 +972,7 @@ namespace Trinity return; // too far - if (!u->IsWithinDistInMap(i_enemy, i_range)) + if (!u->IsWithinDistInMap(i_funit, i_range)) return; // only if see assisted creature's enemy @@ -1188,7 +1215,7 @@ namespace Trinity class AllGameObjectsWithEntryInRange { public: - AllGameObjectsWithEntryInRange(const WorldObject* pObject, uint32 uiEntry, float fMaxRange) : m_pObject(pObject), m_uiEntry(uiEntry), m_fRange(fMaxRange) {} + AllGameObjectsWithEntryInRange(const WorldObject* object, uint32 entry, float maxRange) : m_pObject(object), m_uiEntry(entry), m_fRange(maxRange) {} bool operator() (GameObject* go) { if (go->GetEntry() == m_uiEntry && m_pObject->IsWithinDist(go, m_fRange, false)) @@ -1205,7 +1232,7 @@ namespace Trinity class AllCreaturesOfEntryInRange { public: - AllCreaturesOfEntryInRange(const WorldObject* pObject, uint32 uiEntry, float fMaxRange) : m_pObject(pObject), m_uiEntry(uiEntry), m_fRange(fMaxRange) {} + AllCreaturesOfEntryInRange(const WorldObject* object, uint32 entry, float maxRange) : m_pObject(object), m_uiEntry(entry), m_fRange(maxRange) {} bool operator() (Unit* unit) { if (unit->GetEntry() == m_uiEntry && m_pObject->IsWithinDist(unit, m_fRange, false)) @@ -1257,10 +1284,10 @@ namespace Trinity class AllWorldObjectsInRange { public: - AllWorldObjectsInRange(const WorldObject* pObject, float fMaxRange) : m_pObject(pObject), m_fRange(fMaxRange) {} + AllWorldObjectsInRange(const WorldObject* object, float maxRange) : m_pObject(object), m_fRange(maxRange) {} bool operator() (WorldObject* go) { - return m_pObject->IsWithinDist(go, m_fRange, false); + return m_pObject->IsWithinDist(go, m_fRange, false) && m_pObject->InSamePhase(go); } private: const WorldObject* m_pObject; diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 40b3863679b..e3cda4dd76d 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -251,9 +251,8 @@ void Trinity::WorldObjectListSearcher::Visit(PlayerMapType &m) return; for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->getSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->getSource())) - i_objects.push_back(itr->getSource()); + if (i_check(itr->getSource())) + i_objects.push_back(itr->getSource()); } template @@ -263,9 +262,8 @@ void Trinity::WorldObjectListSearcher::Visit(CreatureMapType &m) return; for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->getSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->getSource())) - i_objects.push_back(itr->getSource()); + if (i_check(itr->getSource())) + i_objects.push_back(itr->getSource()); } template @@ -275,9 +273,8 @@ void Trinity::WorldObjectListSearcher::Visit(CorpseMapType &m) return; for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->getSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->getSource())) - i_objects.push_back(itr->getSource()); + if (i_check(itr->getSource())) + i_objects.push_back(itr->getSource()); } template @@ -287,9 +284,8 @@ void Trinity::WorldObjectListSearcher::Visit(GameObjectMapType &m) return; for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->getSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->getSource())) - i_objects.push_back(itr->getSource()); + if (i_check(itr->getSource())) + i_objects.push_back(itr->getSource()); } template @@ -299,9 +295,8 @@ void Trinity::WorldObjectListSearcher::Visit(DynamicObjectMapType &m) return; for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->getSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->getSource())) - i_objects.push_back(itr->getSource()); + if (i_check(itr->getSource())) + i_objects.push_back(itr->getSource()); } // Gameobject searchers diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 1af656d7664..4c6b6249887 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -41,6 +41,7 @@ totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0), rollVoteMask(ROLL_ALL_TYPE_NO_DISENCHANT) { } + Roll::~Roll() { } @@ -170,7 +171,7 @@ void Group::LoadGroupFromDB(Field* fields) m_lootMethod = LootMethod(fields[1].GetUInt8()); m_looterGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER); - m_lootThreshold = ItemQualities(fields[3].GetUInt16()); + m_lootThreshold = ItemQualities(fields[3].GetUInt8()); for (uint8 i = 0; i < TARGETICONCOUNT; ++i) m_targetIcons[i] = fields[4+i].GetUInt32(); @@ -728,13 +729,21 @@ void Group::Disband(bool hideDestroy /* = false */) if (!isBGGroup()) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM groups WHERE guid = %u", m_dbStoreId); - trans->PAppend("DELETE FROM group_member WHERE guid = %u", m_dbStoreId); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP); + stmt->setUInt32(0, m_dbStoreId); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER_ALL); + stmt->setUInt32(0, m_dbStoreId); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); + ResetInstances(INSTANCE_RESET_GROUP_DISBAND, false, NULL); ResetInstances(INSTANCE_RESET_GROUP_DISBAND, true, NULL); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA); stmt->setUInt32(0, m_dbStoreId); CharacterDatabase.Execute(stmt); @@ -779,7 +788,7 @@ void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, if (!p || !p->GetSession()) return; - WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1 )); + WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1)); data << uint64(r.itemGUID); // guid of rolled item data << uint32(mapId); // 3.3.3 mapid data << uint32(r.totalPlayersRolling); // maybe the number of players rolling for it??? @@ -843,28 +852,28 @@ void Group::SendLootRollWon(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumb } } -void Group::SendLootAllPassed(uint32 NumberOfPlayers, const Roll &r) +void Group::SendLootAllPassed(uint32 numberOfPlayers, Roll const& roll) { WorldPacket data(SMSG_LOOT_ALL_PASSED, (8+4+4+4+4)); - data << uint64(r.itemGUID); // Guid of the item rolled - data << uint32(NumberOfPlayers); // The number of players rolling for it??? - data << uint32(r.itemid); // The itemEntryId for the item that shall be rolled for - data << uint32(r.itemRandomPropId); // Item random property ID - data << uint32(r.itemRandomSuffix); // Item random suffix ID + data << uint64(roll.itemGUID); // Guid of the item rolled + data << uint32(numberOfPlayers); // The number of players rolling for it + data << uint32(roll.itemid); // The itemEntryId for the item that shall be rolled for + data << uint32(roll.itemRandomPropId); // Item random property ID + data << uint32(roll.itemRandomSuffix); // Item random suffix ID - for (Roll::PlayerVote::const_iterator itr=r.playerVote.begin(); itr != r.playerVote.end(); ++itr) + for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr) { - Player* p = ObjectAccessor::FindPlayer(itr->first); - if (!p || !p->GetSession()) + Player* player = ObjectAccessor::FindPlayer(itr->first); + if (!player || !player->GetSession()) continue; if (itr->second != NOT_VALID) - p->GetSession()->SendPacket(&data); + player->GetSession()->SendPacket(&data); } } // notify group members which player is the allowed looter for the given creature -void Group::SendLooter(Creature* creature, Player* pLooter) +void Group::SendLooter(Creature* creature, Player* groupLooter) { ASSERT(creature); @@ -872,8 +881,8 @@ void Group::SendLooter(Creature* creature, Player* pLooter) data << uint64(creature->GetGUID()); data << uint8(0); // unk1 - if (pLooter) - data.append(pLooter->GetPackGUID()); + if (groupLooter) + data.append(groupLooter->GetPackGUID()); else data << uint8(0); @@ -1758,7 +1767,7 @@ bool Group::InCombatToInstance(uint32 instanceId) Player* player = itr->getSource(); if (player && !player->getAttackers().empty() && player->GetInstanceId() == instanceId && (player->GetMap()->IsRaidOrHeroicDungeon())) for (std::set::const_iterator i = player->getAttackers().begin(); i != player->getAttackers().end(); ++i) - if ((*i) && (*i)->GetTypeId() == TYPEID_UNIT && (*i)->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) + if ((*i) && (*i)->GetTypeId() == TYPEID_UNIT && (*i)->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) return true; } return false; @@ -2158,7 +2167,7 @@ void Group::SetGroupMemberFlag(uint64 guid, bool apply, GroupMemberFlags flag) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_MEMBER_FLAG); stmt->setUInt8(0, slot->flags); - stmt->setUInt32(0, GUID_LOPART(guid)); + stmt->setUInt32(1, GUID_LOPART(guid)); CharacterDatabase.Execute(stmt); diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp index ae400852c73..f372f08c941 100644 --- a/src/server/game/Groups/GroupMgr.cpp +++ b/src/server/game/Groups/GroupMgr.cpp @@ -120,7 +120,7 @@ void GroupMgr::LoadGroups() CharacterDatabase.DirectExecute("DELETE FROM groups WHERE guid NOT IN (SELECT guid FROM group_member GROUP BY guid HAVING COUNT(guid) > 1)"); // 0 1 2 3 4 5 6 7 8 9 - QueryResult result = CharacterDatabase.PQuery("SELECT g.leaderGuid, g.lootMethod, g.looterGuid, g.lootThreshold, g.icon1, g.icon2, g.icon3, g.icon4, g.icon5, g.icon6" + QueryResult result = CharacterDatabase.Query("SELECT g.leaderGuid, g.lootMethod, g.looterGuid, g.lootThreshold, g.icon1, g.icon2, g.icon3, g.icon4, g.icon5, g.icon6" // 10 11 12 13 14 15 16 17 ", g.icon7, g.icon8, g.groupType, g.difficulty, g.raiddifficulty, g.guid, lfg.dungeon, lfg.state FROM groups g LEFT JOIN lfg_data lfg ON lfg.guid = g.guid ORDER BY g.guid ASC"); if (!result) @@ -215,10 +215,10 @@ void GroupMgr::LoadGroups() Group* group = GetGroupByDbStoreId(fields[0].GetUInt32()); // group will never be NULL (we have run consistency sql's before loading) - MapEntry const* mapEntry = sMapStore.LookupEntry(fields[1].GetUInt32()); + MapEntry const* mapEntry = sMapStore.LookupEntry(fields[1].GetUInt16()); if (!mapEntry || !mapEntry->IsDungeon()) { - sLog->outErrorDb("Incorrect entry in group_instance table : no dungeon map %d", fields[1].GetUInt32()); + sLog->outErrorDb("Incorrect entry in group_instance table : no dungeon map %d", fields[1].GetUInt16()); continue; } @@ -229,7 +229,7 @@ void GroupMgr::LoadGroups() diff = 0; // default for both difficaly types } - InstanceSave* save = sInstanceSaveMgr->AddInstanceSave(mapEntry->MapID, fields[2].GetUInt32(), Difficulty(diff), time_t(fields[5].GetUInt64()), fields[6].GetBool(), true); + InstanceSave* save = sInstanceSaveMgr->AddInstanceSave(mapEntry->MapID, fields[2].GetUInt32(), Difficulty(diff), time_t(fields[5].GetUInt32()), (bool)fields[6].GetUInt64(), true); group->BindToInstance(save, fields[3].GetBool(), true); ++count; } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index a7c5b04bcba..dfeb3f7cad9 100755 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -588,11 +588,11 @@ bool Guild::Member::LoadFromDB(Field* fields) } SetStats(fields[19].GetString(), - fields[20].GetUInt8(), - fields[21].GetUInt8(), - fields[22].GetUInt32(), - fields[23].GetUInt32()); - m_logoutTime = fields[24].GetUInt32(); + fields[20].GetUInt8(), // characters.level + fields[21].GetUInt8(), // characters.class + fields[22].GetUInt16(), // characters.zone + fields[23].GetUInt32()); // characters.account + m_logoutTime = fields[24].GetUInt32(); // characters.logout_time if (!CheckStats()) return false; @@ -1376,12 +1376,12 @@ void Guild::HandleSetMemberNote(WorldSession* session, const std::string& name, if (!_HasRankRight(session->GetPlayer(), officer ? GR_RIGHT_EOFFNOTE : GR_RIGHT_EPNOTE)) SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_PERMISSIONS); // Noted player must be a member of guild - else if (Member* pMember = GetMember(session, name)) + else if (Member* member = GetMember(session, name)) { if (officer) - pMember->SetOfficerNote(note); + member->SetOfficerNote(note); else - pMember->SetPublicNote(note); + member->SetPublicNote(note); HandleRoster(session); } } @@ -1526,17 +1526,17 @@ void Guild::HandleRemoveMember(WorldSession* session, const std::string& name) if (!_HasRankRight(player, GR_RIGHT_REMOVE)) SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_PERMISSIONS); // Removed player must be a member of guild - else if (Member* pMember = GetMember(session, name)) + else if (Member* member = GetMember(session, name)) { // Leader cannot be removed - if (pMember->IsRank(GR_GUILDMASTER)) + if (member->IsRank(GR_GUILDMASTER)) SendCommandResult(session, GUILD_QUIT_S, ERR_GUILD_LEADER_LEAVE); // Do not allow to remove player with the same rank or higher - else if (pMember->IsRankNotLower(player->GetRank())) + else if (member->IsRankNotLower(player->GetRank())) SendCommandResult(session, GUILD_QUIT_S, ERR_GUILD_RANK_TOO_HIGH_S, name); else { - uint64 guid = pMember->GetGUID(); + uint64 guid = member->GetGUID(); // After call to DeleteMember pointer to member becomes invalid DeleteMember(guid, false, true); _LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUIDLow(), GUID_LOPART(guid)); @@ -1552,10 +1552,10 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, const std::string& nam if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE)) SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_PERMISSIONS); // Promoted player must be a member of guild - else if (Member* pMember = GetMember(session, name)) + else if (Member* member = GetMember(session, name)) { // Player cannot promote himself - if (pMember->IsSamePlayer(player->GetGUID())) + if (member->IsSamePlayer(player->GetGUID())) { SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_NAME_INVALID); return; @@ -1564,13 +1564,13 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, const std::string& nam if (demote) { // Player can demote only lower rank members - if (pMember->IsRankNotLower(player->GetRank())) + if (member->IsRankNotLower(player->GetRank())) { SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_RANK_TOO_HIGH_S, name); return; } // Lowest rank cannot be demoted - if (pMember->GetRankId() >= _GetLowestRankId()) + if (member->GetRankId() >= _GetLowestRankId()) { SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_RANK_TOO_LOW_S, name); return; @@ -1579,8 +1579,8 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, const std::string& nam else { // Allow to promote only to lower rank than member's rank - // pMember->GetRank() + 1 is the highest rank that current player can promote to - if (pMember->IsRankNotLower(player->GetRank() + 1)) + // member->GetRank() + 1 is the highest rank that current player can promote to + if (member->IsRankNotLower(player->GetRank() + 1)) { SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_RANK_TOO_HIGH_S, name); return; @@ -1588,9 +1588,9 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, const std::string& nam } // When promoting player, rank is decreased, when demoting - increased - uint32 newRankId = pMember->GetRankId() + (demote ? 1 : -1); - pMember->ChangeRank(newRankId); - _LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUIDLow(), GUID_LOPART(pMember->GetGUID()), newRankId); + uint32 newRankId = member->GetRankId() + (demote ? 1 : -1); + member->ChangeRank(newRankId); + _LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUIDLow(), GUID_LOPART(member->GetGUID()), newRankId); _BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, 0, player->GetName(), name.c_str(), _GetRankName(newRankId).c_str()); } } @@ -1643,9 +1643,6 @@ void Guild::HandleRemoveLowestRank(WorldSession* session) void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount) { - if (!_GetPurchasedTabsSize()) - return; // No guild bank tabs - no money in bank - Player* player = session->GetPlayer(); // Call script after validation and before money transfer. @@ -1676,9 +1673,6 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount) bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool repair) { - if (!_GetPurchasedTabsSize()) - return false; // No guild bank tabs - no money - if (m_bankMoney < amount) // Not enough money in bank return false; @@ -1699,8 +1693,8 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool SQLTransaction trans = CharacterDatabase.BeginTransaction(); // Update remaining money amount if (remainingMoney < uint32(GUILD_WITHDRAW_MONEY_UNLIMITED)) - if (Member* pMember = GetMember(player->GetGUID())) - pMember->DecreaseBankRemainingValue(trans, GUILD_BANK_MAX_TABS, amount); + if (Member* member = GetMember(player->GetGUID())) + member->DecreaseBankRemainingValue(trans, GUILD_BANK_MAX_TABS, amount); // Remove money from bank _ModifyBankMoney(trans, amount, false); // Add money to player (if required) @@ -1726,10 +1720,10 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool void Guild::HandleMemberLogout(WorldSession* session) { Player* player = session->GetPlayer(); - if (Member* pMember = GetMember(player->GetGUID())) + if (Member* member = GetMember(player->GetGUID())) { - pMember->SetStats(player); - pMember->UpdateLogoutTime(); + member->SetStats(player); + member->UpdateLogoutTime(); } _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName()); } @@ -1869,7 +1863,7 @@ bool Guild::LoadFromDB(Field* fields) m_createdDate = time_t(fields[10].GetUInt32()); m_bankMoney = fields[11].GetUInt64(); - uint8 purchasedTabs = uint8(fields[12].GetUInt32()); + uint8 purchasedTabs = uint8(fields[12].GetUInt64()); if (purchasedTabs > GUILD_BANK_MAX_TABS) purchasedTabs = GUILD_BANK_MAX_TABS; @@ -1893,14 +1887,14 @@ void Guild::LoadRankFromDB(Field* fields) bool Guild::LoadMemberFromDB(Field* fields) { uint32 lowguid = fields[1].GetUInt32(); - Member *pMember = new Member(m_id, MAKE_NEW_GUID(lowguid, 0, HIGHGUID_PLAYER), fields[2].GetUInt8()); - if (!pMember->LoadFromDB(fields)) + Member *member = new Member(m_id, MAKE_NEW_GUID(lowguid, 0, HIGHGUID_PLAYER), fields[2].GetUInt8()); + if (!member->LoadFromDB(fields)) { _DeleteMemberFromDB(lowguid); - delete pMember; + delete member; return false; } - m_members[lowguid] = pMember; + m_members[lowguid] = member; return true; } @@ -1971,7 +1965,7 @@ bool Guild::LoadBankEventLogFromDB(Field* fields) bool Guild::LoadBankTabFromDB(Field* fields) { - uint32 tabId = fields[1].GetUInt8(); + uint8 tabId = fields[1].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { sLog->outError("Invalid tab (tabId: %u) in guild bank, skipped.", tabId); @@ -2112,9 +2106,9 @@ bool Guild::AddMember(uint64 guid, uint8 rankId) if (rankId == GUILD_RANK_NONE) rankId = _GetLowestRankId(); - Member* pMember = new Member(m_id, guid, rankId); + Member* member = new Member(m_id, guid, rankId); if (player) - pMember->SetStats(player); + member->SetStats(player); else { bool ok = false; @@ -2124,25 +2118,25 @@ bool Guild::AddMember(uint64 guid, uint8 rankId) if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) { Field* fields = result->Fetch(); - pMember->SetStats( + member->SetStats( fields[0].GetString(), fields[1].GetUInt8(), fields[2].GetUInt8(), fields[3].GetUInt16(), fields[4].GetUInt32()); - ok = pMember->CheckStats(); + ok = member->CheckStats(); } if (!ok) { - delete pMember; + delete member; return false; } } - m_members[lowguid] = pMember; + m_members[lowguid] = member; SQLTransaction trans(NULL); - pMember->SaveToDB(trans); + member->SaveToDB(trans); // If player not in game data in will be loaded from guild tables, so no need to update it! if (player) { @@ -2199,8 +2193,8 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked) // Call script on remove before member is acutally removed from guild (and database) sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked); - if (Member* pMember = GetMember(guid)) - delete pMember; + if (Member* member = GetMember(guid)) + delete member; m_members.erase(lowguid); // If player not online data in data field will be loaded from guild tabs no need to update it !! @@ -2218,9 +2212,9 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked) bool Guild::ChangeMemberRank(uint64 guid, uint8 newRank) { if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks) - if (Member* pMember = GetMember(guid)) + if (Member* member = GetMember(guid)) { - pMember->ChangeRank(newRank); + member->ChangeRank(newRank); return true; } return false; @@ -2369,8 +2363,8 @@ bool Guild::_IsLeader(Player* player) const { if (player->GetGUID() == m_leaderGuid) return true; - if (const Member* pMember = GetMember(player->GetGUID())) - return pMember->IsRank(GR_GUILDMASTER); + if (const Member* member = GetMember(player->GetGUID())) + return member->IsRank(GR_GUILDMASTER); return false; } @@ -2483,15 +2477,15 @@ inline uint8 Guild::_GetRankBankTabRights(uint8 rankId, uint8 tabId) const inline uint32 Guild::_GetMemberRemainingSlots(uint64 guid, uint8 tabId) const { - if (const Member* pMember = GetMember(guid)) - return pMember->GetBankRemainingValue(tabId, this); + if (const Member* member = GetMember(guid)) + return member->GetBankRemainingValue(tabId, this); return 0; } inline uint32 Guild::_GetMemberRemainingMoney(uint64 guid) const { - if (const Member* pMember = GetMember(guid)) - return pMember->GetBankRemainingValue(GUILD_BANK_MAX_TABS, this); + if (const Member* member = GetMember(guid)) + return member->GetBankRemainingValue(GUILD_BANK_MAX_TABS, this); return 0; } @@ -2501,18 +2495,18 @@ inline void Guild::_DecreaseMemberRemainingSlots(SQLTransaction& trans, uint64 g if (uint32 remainingSlots = _GetMemberRemainingSlots(guid, tabId)) // Ignore guild master if (remainingSlots < uint32(GUILD_WITHDRAW_SLOT_UNLIMITED)) - if (Member* pMember = GetMember(guid)) - pMember->DecreaseBankRemainingValue(trans, tabId, 1); + if (Member* member = GetMember(guid)) + member->DecreaseBankRemainingValue(trans, tabId, 1); } inline bool Guild::_MemberHasTabRights(uint64 guid, uint8 tabId, uint32 rights) const { - if (const Member* pMember = GetMember(guid)) + if (const Member* member = GetMember(guid)) { // Leader always has full rights - if (pMember->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid) + if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid) return true; - return (_GetRankBankTabRights(pMember->GetRankId(), tabId) & rights) == rights; + return (_GetRankBankTabRights(member->GetRankId(), tabId) & rights) == rights; } return false; } diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 2a7a7f2ca8b..450a49e345c 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -232,7 +232,6 @@ void GuildMgr::LoadGuilds() // Delete orphaned guild bank right entries before loading the valid ones CharacterDatabase.DirectExecute("DELETE gbr FROM guild_bank_right gbr LEFT JOIN guild g ON gbr.guildId = g.guildId WHERE g.guildId IS NULL"); - // 0 1 2 3 4 QueryResult result = CharacterDatabase.Query("SELECT guildid, TabId, rid, gbright, SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC"); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 929532b6362..27eb559fb68 100755 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -241,6 +241,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) else AH->auctioneer = GUID_LOPART(auctioneer); + // Required stack size of auction matches to current item stack size, just move item to auctionhouse if (itemsCount == 1 && item->GetCount() == count[i]) { if (GetSecurity() > SEC_PLAYER && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) @@ -278,7 +279,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); return; } - else + else // Required stack size of auction does not match to current item stack size, clone item and set correct stack size { Item* newItem = item->CloneItem(finalCount, _player); if (!newItem) @@ -309,33 +310,35 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) sAuctionMgr->AddAItem(newItem); auctionHouse->AddAuction(AH); - for (uint32 i = 0; i < itemsCount; ++i) + for (uint32 j = 0; j < itemsCount; ++j) { - Item* item = items[i]; + Item* item2 = items[j]; - if (item->GetCount() == count[i]) + // Item stack count equals required count, ready to delete item - cloned item will be used for auction + if (item2->GetCount() == count[j]) { - _player->MoveItemFromInventory(item->GetBagSlot(), item->GetSlot(), true); + _player->MoveItemFromInventory(item2->GetBagSlot(), item2->GetSlot(), true); SQLTransaction trans = CharacterDatabase.BeginTransaction(); - item->DeleteFromInventoryDB(trans); - item->SaveToDB(trans); + item2->DeleteFromInventoryDB(trans); + item2->DeleteFromDB(trans); CharacterDatabase.CommitTransaction(trans); } - else + else // Item stack count is bigger than required count, update item stack count and save to database - cloned item will be used for auction { - item->SetCount(item->GetCount() - count[i]); - item->SetState(ITEM_CHANGED, _player); - _player->ItemRemovedQuestCheck(item->GetEntry(), count[i]); - item->SendUpdateToPlayer(_player); + item2->SetCount(item2->GetCount() - count[j]); + item2->SetState(ITEM_CHANGED, _player); + _player->ItemRemovedQuestCheck(item2->GetEntry(), count[j]); + item2->SendUpdateToPlayer(_player); SQLTransaction trans = CharacterDatabase.BeginTransaction(); - item->SaveToDB(trans); + item2->SaveToDB(trans); CharacterDatabase.CommitTransaction(trans); } } SQLTransaction trans = CharacterDatabase.BeginTransaction(); + newItem->SaveToDB(trans); AH->SaveToDB(trans); _player->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); @@ -436,7 +439,11 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) auction->bid = price; GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, price); - trans->PAppend("UPDATE auctionhouse SET buyguid = '%u', lastbid = '%u' WHERE id = '%u'", auction->bidder, auction->bid, auction->Id); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID); + stmt->setUInt32(0, auction->bidder); + stmt->setUInt32(1, auction->bid); + stmt->setUInt32(2, auction->Id); + trans->Append(stmt); SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, AUCTION_OK, 0); } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 00f18217eed..41188e1134e 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -60,10 +60,10 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket & recv_data) return; } - SendBattlegGroundList(guid, bgTypeId); + SendBattleGroundList(guid, bgTypeId); } -void WorldSession::SendBattlegGroundList(uint64 guid, BattlegroundTypeId bgTypeId) +void WorldSession::SendBattleGroundList(uint64 guid, BattlegroundTypeId bgTypeId) { WorldPacket data; sBattlegroundMgr->BuildBattlegroundListPacket(&data, guid, _player, bgTypeId); @@ -216,7 +216,8 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data) for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* member = itr->getSource(); - if (!member) continue; // this should never happen + if (!member) + continue; // this should never happen WorldPacket data; diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 820079a90e1..298c742fc3a 100755 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -16,6 +16,22 @@ * with this program. If not, see . */ +/* +----- Opcodes Not Used yet ----- + +SMSG_CALENDAR_CLEAR_PENDING_ACTION SendCalendarClearPendingAction() +SMSG_CALENDAR_RAID_LOCKOUT_UPDATED SendCalendarRaidLockoutUpdated(InstanceSave const* save) + +----- Opcodes without Sniffs ----- +SMSG_CALENDAR_FILTER_GUILD [ for (... uint32(count) { packguid(???), uint8(???) } ] +SMSG_CALENDAR_ARENA_TEAM [ for (... uint32(count) { packguid(???), uint8(???) } ] +CMSG_CALENDAR_EVENT_INVITE_NOTES [ packguid(Invitee), uint64(inviteId), string(Text), Boolean(Unk) ] +SMSG_CALENDAR_EVENT_INVITE_NOTES [ uint32(unk1), uint32(unk2), uint32(unk3), uint32(unk4), uint32(unk5) ] +SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT [ uint64(inviteId), string(Text) ] +SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT [ Structure unkown ] + +*/ + #include "Common.h" #include "WorldPacket.h" #include "WorldSession.h" @@ -24,8 +40,12 @@ #include "Log.h" #include "Opcodes.h" #include "Player.h" +#include "CalendarMgr.h" +#include "ObjectMgr.h" +#include "ObjectAccessor.h" +#include "DatabaseEnv.h" -void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recv_data*/) +void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/) { uint64 guid = _player->GetGUID(); sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_GET_CALENDAR [" UI64FMTD "]", guid); @@ -33,32 +53,62 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recv_data*/) time_t cur_time = time_t(time(NULL)); sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_SEND_CALENDAR [" UI64FMTD "]", guid); - WorldPacket data(SMSG_CALENDAR_SEND_CALENDAR, 4+4*0+4+4*0+4+4); + WorldPacket data(SMSG_CALENDAR_SEND_CALENDAR, 1000); // Impossible to get the correct size without doing a double iteration of some elements - data << uint32(0); // invite count - /* - for (;;) + CalendarInviteIdList const& invites = sCalendarMgr->GetPlayerInvites(guid); + data << uint32(invites.size()); + for (CalendarInviteIdList::const_iterator it = invites.begin(); it != invites.end(); ++it) { - uint64 inviteId; - uint64 unkGuid0; - uint8 unk1, unk2, unk3; - uint64 creatorGuid; + CalendarInvite* invite = sCalendarMgr->GetInvite(*it); + CalendarEvent* calendarEvent = invite ? sCalendarMgr->GetEvent(invite->GetEventId()) : NULL; + + if (calendarEvent) + { + data << uint64(invite->GetEventId()); + data << uint64(invite->GetInviteId()); + data << uint8(invite->GetStatus()); + data << uint8(invite->GetRank()); + data << uint8(calendarEvent->GetGuildId() != 0); + data.appendPackGUID(calendarEvent->GetCreatorGUID()); + } + else + { + sLog->outError("SMSG_CALENDAR_SEND_CALENDAR: No Invite found with id [" UI64FMTD "]", *it); + data << uint64(0); + data << uint64(0); + data << uint8(0); + data << uint8(0); + data << uint8(0); + data.appendPackGUID(0); + } } - */ - data << uint32(0); // event count - /* - for (;;) + CalendarEventIdList const& events = sCalendarMgr->GetPlayerEvents(guid); + data << uint32(events.size()); + for (CalendarEventIdList::const_iterator it = events.begin(); it != events.end(); ++it) { - uint64 eventId; - std::string title; // 128 chars - uint32 type; - uint32 occurrenceTime; - uint32 flags; - uint32 unk4; -- possibly mapid for dungeon/raid - uint64 creatorGuid; + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(*it)) + { + data << uint64(*it); + data << calendarEvent->GetTitle().c_str(); + data << uint32(calendarEvent->GetType()); + data << uint32(calendarEvent->GetTime()); + data << uint32(calendarEvent->GetFlags()); + data << uint32(calendarEvent->GetDungeonId()); + data.appendPackGUID(calendarEvent->GetCreatorGUID()); + } + else + { + sLog->outError("SMSG_CALENDAR_SEND_CALENDAR: No Event found with id [" UI64FMTD "]", *it); + data << uint64(0); + data << uint8(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); + data.appendPackGUID(0); + } } - */ data << uint32(cur_time); // server time data << uint32(secsToTimeBitFields(cur_time)); // server time @@ -108,202 +158,751 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recv_data*/) data << uint32(mapEntry->unk_time); ++counter; } - data.put(p_counter, counter); - data << uint32(0); // holiday count? - /* - for (;;) + // TODO: Fix this, how we do know how many and what holidays to send? + uint32 holidayCount = 0; + data << uint32(holidayCount); + for (uint32 i = 0; i < holidayCount; ++i) { - uint32 unk5, unk6, unk7, unk8, unk9; - for (uint32 j = 0; j < 26; ++j) - { - uint32 unk10; - } - for (uint32 j = 0; j < 10; ++j) + HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(666); + + data << uint32(holiday->Id); // m_ID + data << uint32(holiday->Region); // m_region, might be looping + data << uint32(holiday->Looping); // m_looping, might be region + data << uint32(holiday->Priority); // m_priority + data << uint32(holiday->CalendarFilterType); // m_calendarFilterType + + for (uint8 j = 0; j < MAX_HOLIDAY_DATES; ++j) + data << uint32(holiday->Date[j]); // 26 * m_date + + for (uint8 j = 0; j < MAX_HOLIDAY_DURATIONS; ++j) + data << uint32(holiday->Duration[j]); // 10 * m_duration + + for (uint8 j = 0; j < MAX_HOLIDAY_FLAGS; ++j) + data << uint32(holiday->CalendarFlags[j]); // 10 * m_calendarFlags + + data << holiday->TextureFilename; // m_textureFilename (holiday name) + } + + SendPacket(&data); +} + +void WorldSession::HandleCalendarGetEvent(WorldPacket& recvData) +{ + uint64 eventId; + recvData >> eventId; + + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_GET_EVENT. Event: [" + UI64FMTD "] Event [" UI64FMTD "]", _player->GetGUID(), eventId); + + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + SendCalendarEvent(*calendarEvent, CALENDAR_SENDTYPE_GET); +} + +void WorldSession::HandleCalendarGuildFilter(WorldPacket& recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_GUILD_FILTER [" UI64FMTD "]", _player->GetGUID()); + + int32 unk1, unk2, unk3; + recvData >> unk1; + recvData >> unk2; + recvData >> unk3; + + sLog->outDebug(LOG_FILTER_NETWORKIO, "Calendar: CMSG_CALENDAR_GUILD_FILTER - unk1: %d unk2: %d unk3: %d", unk1, unk2, unk3); +} + +void WorldSession::HandleCalendarArenaTeam(WorldPacket& recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_ARENA_TEAM [" UI64FMTD "]", _player->GetGUID()); + + int32 unk1; + recvData >> unk1; + + sLog->outDebug(LOG_FILTER_NETWORKIO, "Calendar: CMSG_CALENDAR_ARENA_TEAM - unk1: %d", unk1); +} + +void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) +{ + uint64 guid = _player->GetGUID(); + std::string title; + std::string description; + uint8 type; + bool repeatable; + uint32 maxInvites; + int32 dungeonId; + uint32 eventPackedTime; + uint32 unkPackedTime; + uint32 flags; + uint64 inviteId = 0; + uint64 invitee = 0; + uint8 status; + uint8 rank; + + recvData >> title >> description >> type >> repeatable >> maxInvites; + recvData >> dungeonId >> eventPackedTime >> unkPackedTime >> flags; + + if (!(flags & CALENDAR_FLAG_WITHOUT_INVITES)) + { + uint32 inviteCount; + recvData >> inviteCount; + recvData.readPackGUID(invitee); + recvData >> status >> rank; + + if (inviteCount != 1 || invitee != guid) { - uint32 unk11; + sLog->outError("HandleCalendarAddEvent: [" UI64FMTD + "]: More than one invite (%d) or Invitee [" UI64FMTD + "] differs", guid, inviteCount, invitee); + return; } - for (uint32 j = 0; j < 10; ++j) + + inviteId = sCalendarMgr->GetFreeInviteId(); + } + else + { + inviteId = 0; + status = CALENDAR_STATUS_NO_OWNER; + rank = CALENDAR_RANK_PLAYER; + } + + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_ADD_EVENT: [" UI64FMTD "] " + "Title %s, Description %s, type %u, Repeatable %u, MaxInvites %u, " + "Dungeon ID %d, Time %u, Time2 %u, Flags %u, Invitee [" UI64FMTD "] " + "Status %d, Rank %d", guid, title.c_str(), description.c_str(), + type, repeatable, maxInvites, dungeonId, eventPackedTime, + unkPackedTime, flags, invitee, status, rank); + + CalendarAction action; + + action.SetAction(CALENDAR_ACTION_ADD_EVENT); + action.SetPlayer(_player); + action.Event.SetEventId(sCalendarMgr->GetFreeEventId()); + action.Event.SetCreatorGUID(guid); + action.Event.SetType((CalendarEventType) type); + action.Event.SetFlags(flags); + action.Event.SetTime(eventPackedTime); + action.Event.SetTimeZoneTime(unkPackedTime); + action.Event.SetRepeatable(repeatable); + action.Event.SetMaxInvites(maxInvites); + action.Event.SetDungeonId(dungeonId); + action.Event.SetGuildId((flags & CALENDAR_FLAG_GUILD_ONLY) ? GetPlayer()->GetGuildId() : 0); + action.Event.SetTitle(title); + action.Event.SetDescription(description); + action.Event.AddInvite(inviteId); + action.Invite.SetEventId(action.Event.GetEventId()); + action.Invite.SetInviteId(inviteId); + action.Invite.SetInvitee(invitee); + action.Invite.SetStatus((CalendarInviteStatus) status); + action.Invite.SetRank((CalendarModerationRank) rank); + action.Invite.SetSenderGUID(guid); + + sCalendarMgr->AddAction(action); +} + +void WorldSession::HandleCalendarUpdateEvent(WorldPacket& recvData) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint64 inviteId; + std::string title; + std::string description; + uint8 type; + bool repeatable; + uint32 maxInvites; + int32 dungeonId; + uint32 eventPackedTime; + uint32 timeZoneTime; + uint32 flags; + + recvData >> eventId >> inviteId >> title >> description >> type; + recvData >> repeatable >> maxInvites >> dungeonId; + recvData >> eventPackedTime >> timeZoneTime >> flags; + + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_UPDATE_EVENT [" UI64FMTD "] EventId [" UI64FMTD + "], InviteId [" UI64FMTD "] Title %s, Description %s, type %u " + "Repeatable %u, MaxInvites %u, Dungeon ID %d, Time %u " + "Time2 %u, Flags %u", guid, eventId, inviteId, title.c_str(), + description.c_str(), type, repeatable, maxInvites, dungeonId, + eventPackedTime, timeZoneTime, flags); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_MODIFY_EVENT); + action.SetPlayer(_player); + action.SetInviteId(inviteId); + action.Event.SetEventId(eventId); + action.Event.SetType((CalendarEventType) type); + action.Event.SetFlags((CalendarFlags) flags); + action.Event.SetTime(eventPackedTime); + action.Event.SetTimeZoneTime(timeZoneTime); + action.Event.SetRepeatable(repeatable); + action.Event.SetDungeonId(dungeonId); + action.Event.SetTitle(title); + action.Event.SetDescription(description); + action.Event.SetMaxInvites(maxInvites); + + sCalendarMgr->AddAction(action); +} + +void WorldSession::HandleCalendarRemoveEvent(WorldPacket& recvData) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint64 inviteId; + uint32 flags; + + recvData >> eventId >> inviteId >> flags; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_REMOVE_EVENT [" UI64FMTD "], EventId [" UI64FMTD + "] inviteId [" UI64FMTD "] Flags?: %u", guid, eventId, inviteId, flags); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_REMOVE_EVENT); + action.SetPlayer(_player); + action.SetInviteId(inviteId); + action.Event.SetEventId(eventId); + action.Event.SetFlags((CalendarFlags) flags); + + sCalendarMgr->AddAction(action); +} + +void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint64 inviteId; + uint32 time; + + recvData >> eventId >> inviteId >> time; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_COPY_EVENT [" UI64FMTD "], EventId [" UI64FMTD + "] inviteId [" UI64FMTD "] Time: %u", guid, eventId, inviteId, time); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_COPY_EVENT); + action.SetPlayer(_player); + action.SetInviteId(inviteId); + action.Event.SetEventId(eventId); + action.Event.SetTime(time); + + sCalendarMgr->AddAction(action); +} + +void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint64 inviteId; + std::string name; + uint8 status; + uint8 rank; + uint64 invitee = 0; + uint32 team = 0; + + recvData >> eventId >> inviteId >> name >> status >> rank; + if (Player* player = sObjectAccessor->FindPlayerByName(name.c_str())) + { + invitee = player->GetGUID(); + team = player->GetTeam(); + } + else + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME); + stmt->setString(0, name); + if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) { - uint32 unk12; + Field* fields = result->Fetch(); + invitee = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER); + team = Player::TeamForRace(fields[1].GetUInt8()); } - std::string holidayName; // 64 chars } - */ - SendPacket(&data); + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_EVENT_INVITE [" UI64FMTD "], EventId [" + UI64FMTD "] InviteId [" UI64FMTD "] Name %s ([" UI64FMTD "]), status %u, " + "Rank %u", guid, eventId, inviteId, name.c_str(), invitee, status, rank); + + if (!invitee) + { + SendCalendarCommandResult(CALENDAR_ERROR_PLAYER_NOT_FOUND); + return; + } + + if (_player->GetTeam() != team) + { + SendCalendarCommandResult(CALENDAR_ERROR_NOT_ALLIED); + return; + } + + // TODO: Check ignore, even if offline (db query) + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_ADD_EVENT_INVITE); + action.SetPlayer(_player); + action.SetInviteId(inviteId); + action.Invite.SetEventId(eventId); + action.Invite.SetInviteId(sCalendarMgr->GetFreeInviteId()); + action.Invite.SetSenderGUID(_player->GetGUID()); + action.Invite.SetInvitee(invitee); + action.Invite.SetRank((CalendarModerationRank) rank); + action.Invite.SetStatus((CalendarInviteStatus) status); + + sCalendarMgr->AddAction(action); } -void WorldSession::HandleCalendarGetEvent(WorldPacket& recv_data) +void WorldSession::HandleCalendarEventSignup(WorldPacket& recvData) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_GET_EVENT"); - recv_data.read_skip(); // unk + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint8 status; + + recvData >> eventId >> status; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_EVENT_SIGNUP [" UI64FMTD "] EventId [" + UI64FMTD "] Status %u", guid, eventId, status); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_SIGNUP_TO_EVENT); + action.SetPlayer(_player); + action.SetExtraData(GetPlayer()->GetGuildId()); + action.Event.SetEventId(eventId); + action.Invite.SetStatus((CalendarInviteStatus) status); + sCalendarMgr->AddAction(action); } -void WorldSession::HandleCalendarGuildFilter(WorldPacket& recv_data) +void WorldSession::HandleCalendarEventRsvp(WorldPacket& recvData) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_GUILD_FILTER"); - recv_data.read_skip(); // unk1 - recv_data.read_skip(); // unk2 - recv_data.read_skip(); // unk3 + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint64 inviteId; + uint8 status; + + recvData >> eventId >> inviteId >> status; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_EVENT_RSVP [" UI64FMTD"] EventId [" + UI64FMTD "], InviteId [" UI64FMTD "], status %u", guid, eventId, + inviteId, status); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_MODIFY_EVENT_INVITE); + action.SetPlayer(_player); + action.SetInviteId(inviteId); + action.Invite.SetInviteId(inviteId); + action.Invite.SetEventId(eventId); + action.Invite.SetStatus((CalendarInviteStatus) status); + + sCalendarMgr->AddAction(action); } -void WorldSession::HandleCalendarArenaTeam(WorldPacket& recv_data) +void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket& recvData) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_ARENA_TEAM"); - recv_data.read_skip(); // unk + uint64 guid = _player->GetGUID(); + uint64 invitee; + uint64 eventId; + uint64 owninviteId; + uint64 inviteId; + + recvData.readPackGUID(invitee); + recvData >> inviteId >> owninviteId >> eventId; + + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_EVENT_REMOVE_INVITE [" + UI64FMTD "] EventId [" UI64FMTD "], OwnInviteId [" + UI64FMTD "], Invitee ([" UI64FMTD "] id: [" UI64FMTD "])", + guid, eventId, owninviteId, invitee, inviteId); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_REMOVE_EVENT_INVITE); + action.SetPlayer(_player); + action.SetInviteId(owninviteId); + action.Invite.SetInviteId(inviteId); + action.Invite.SetEventId(eventId); + action.Invite.SetInvitee(invitee); + + sCalendarMgr->AddAction(action); } -void WorldSession::HandleCalendarAddEvent(WorldPacket& recv_data) +void WorldSession::HandleCalendarEventStatus(WorldPacket& recvData) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_ADD_EVENT"); - recv_data.rfinish(); // set to end to avoid warnings spam - - //std::string unk1, unk2; - //recv_data >> (std::string)unk1; - //recv_data >> (std::string)unk2; - - //uint8 unk3, unk4; - //uint32 unk5, unk6, unk7, unk8, unk9, count = 0; - //recv_data >> (uint8)unk3; - //recv_data >> (uint8)unk4; - //recv_data >> (uint32)unk5; - //recv_data >> (uint32)unk6; - //recv_data >> (uint32)unk7; - //recv_data >> (uint32)unk8; - //recv_data >> (uint32)unk9; - //if (!((unk9 >> 6) & 1)) - //{ - // recv_data >> (uint32)count; - // if (count) - // { - // uint8 unk12, unk13; - // uint64 guid; - // for (int i=0; i> (uint8)unk12; - // recv_data >> (uint8)unk13; - // } - // } - //} + uint64 guid = _player->GetGUID(); + uint64 invitee; + uint64 eventId; + uint64 inviteId; + uint64 owninviteId; + uint8 status; + + recvData.readPackGUID(invitee); + recvData >> eventId >> inviteId >> owninviteId >> status; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_EVENT_STATUS [" UI64FMTD"] EventId [" + UI64FMTD "] OwnInviteId [" UI64FMTD "], Invitee ([" UI64FMTD "] id: [" + UI64FMTD "], status %u", guid, eventId, owninviteId, invitee, inviteId, status); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_MODIFY_EVENT_INVITE); + action.SetPlayer(_player); + action.SetInviteId(owninviteId); + action.Invite.SetInviteId(inviteId); + action.Invite.SetEventId(eventId); + action.Invite.SetInvitee(invitee); + action.Invite.SetStatus((CalendarInviteStatus) status); + + sCalendarMgr->AddAction(action); } -void WorldSession::HandleCalendarUpdateEvent(WorldPacket& recv_data) +void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket& recvData) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_UPDATE_EVENT"); - recv_data.rfinish(); // set to end to avoid warnings spam - - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> std::string - //recv_data >> std::string - //recv_data >> uint8 - //recv_data >> uint8 - //recv_data >> uint32 - //recv_data >> uint32 - //recv_data >> uint32 - //recv_data >> uint32 - //recv_data >> uint32 + uint64 guid = _player->GetGUID(); + uint64 invitee; + uint64 eventId; + uint64 inviteId; + uint64 owninviteId; + uint8 status; + + recvData.readPackGUID(invitee); + recvData >> eventId >> inviteId >> owninviteId >> status; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_EVENT_MODERATOR_STATUS [" UI64FMTD "] EventId [" + UI64FMTD "] OwnInviteId [" UI64FMTD "], Invitee ([" UI64FMTD "] id: [" + UI64FMTD "], status %u", guid, eventId, owninviteId, invitee, inviteId, status); + + CalendarAction action; + action.SetAction(CALENDAR_ACTION_MODIFY_MODERATOR_EVENT_INVITE); + action.SetPlayer(_player); + action.SetInviteId(owninviteId); + action.Invite.SetInviteId(inviteId); + action.Invite.SetEventId(eventId); + action.Invite.SetInvitee(invitee); + action.Invite.SetStatus((CalendarInviteStatus) status); + + sCalendarMgr->AddAction(action); } -void WorldSession::HandleCalendarRemoveEvent(WorldPacket& recv_data) +void WorldSession::HandleCalendarComplain(WorldPacket& recvData) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_REMOVE_EVENT"); - recv_data.rfinish(); // set to end to avoid warnings spam + uint64 guid = _player->GetGUID(); + uint64 eventId; + uint64 complainGUID; + + recvData >> eventId >> complainGUID; + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_COMPLAIN [" UI64FMTD "] EventId [" + UI64FMTD "] guid [" UI64FMTD "]", guid, eventId, complainGUID); +} + +void WorldSession::HandleCalendarGetNumPending(WorldPacket& /*recvData*/) +{ + uint64 guid = _player->GetGUID(); + uint32 pending = sCalendarMgr->GetPlayerNumPending(guid); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_GET_NUM_PENDING: [" UI64FMTD + "] Pending: %u", guid, pending); + + WorldPacket data(SMSG_CALENDAR_SEND_NUM_PENDING, 4); + data << uint32(pending); + SendPacket(&data); +} + +// ----------------------------------- SEND ------------------------------------ - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint32 +void WorldSession::SendCalendarEvent(CalendarEvent const& calendarEvent, CalendarSendEventType sendEventType) +{ + uint64 eventId = calendarEvent.GetEventId(); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_SEND_EVENT [" UI64FMTD "] EventId [" + UI64FMTD "] SendType %u", _player->GetGUID(), eventId, sendEventType); + + WorldPacket data(SMSG_CALENDAR_SEND_EVENT); + data << uint8(sendEventType); + data.appendPackGUID(calendarEvent.GetCreatorGUID()); + data << uint64(eventId); + data << calendarEvent.GetTitle().c_str(); + data << calendarEvent.GetDescription().c_str(); + data << uint8(calendarEvent.GetType()); + data << uint8(calendarEvent.GetRepeatable()); + data << uint32(calendarEvent.GetMaxInvites()); + data << int32(calendarEvent.GetDungeonId()); + data << uint32(calendarEvent.GetFlags()); + data << uint32(calendarEvent.GetTime()); + data << uint32(calendarEvent.GetTimeZoneTime()); + data << uint32(calendarEvent.GetGuildId()); + + CalendarInviteIdList const& invites = calendarEvent.GetInviteIdList(); + data << uint32(invites.size()); + for (CalendarInviteIdList::const_iterator it = invites.begin(); it != invites.end(); ++it) + { + if (CalendarInvite* invite = sCalendarMgr->GetInvite(*it)) + { + uint64 guid = invite->GetInvitee(); + Player* player = ObjectAccessor::FindPlayer(guid); + uint8 level = player ? player->getLevel() : Player::GetLevelFromDB(guid); + + data.appendPackGUID(guid); + data << uint8(level); + data << uint8(invite->GetStatus()); + data << uint8(invite->GetRank()); + data << uint8(calendarEvent.GetGuildId() != 0); + data << uint64(invite->GetInviteId()); + data << uint32(invite->GetStatusTime()); + data << invite->GetText().c_str(); + } + else + { + data.appendPackGUID(_player->GetGUID()); + data << uint8(0) << uint8(0) << uint8(0) << uint8(0) + << uint64(0) << uint32(0) << uint8(0); + sLog->outError("SendCalendarEvent: No Invite found with id [" UI64FMTD "]", *it); + } + } + SendPacket(&data); } -void WorldSession::HandleCalendarCopyEvent(WorldPacket& recv_data) +void WorldSession::SendCalendarEventInvite(CalendarInvite const& invite, bool pending) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_COPY_EVENT"); - recv_data.rfinish(); // set to end to avoid warnings spam + uint64 guid = _player->GetGUID(); + uint64 eventId = invite.GetEventId(); + uint64 inviteId = invite.GetInviteId(); + uint64 invitee = invite.GetInvitee(); + uint8 status = invite.GetStatus(); + uint32 statusTime = invite.GetStatusTime(); + Player* player = ObjectAccessor::FindPlayer(invitee); + uint8 level = player ? player->getLevel() : Player::GetLevelFromDB(invitee); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_INVITE [" UI64FMTD "] EventId [" + UI64FMTD "] InviteId [" UI64FMTD "] Invitee [" UI64FMTD "] " + " Level %u, Status %u, StatusTime %u" , guid, eventId, inviteId, + invitee, level, status, statusTime); + + WorldPacket data(SMSG_CALENDAR_EVENT_INVITE, 8 + 8 + 8 + 1 + 1 + 1 + (statusTime ? 4 : 0) + 1); + data.appendPackGUID(invitee); + data << uint64(eventId); + data << uint64(inviteId); + data << uint8(level); + data << uint8(status); + if (statusTime) + data << uint8(1) << uint32(statusTime); + else + data << uint8(0); + data << uint8(pending); - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint32 + SendPacket(&data); +} +void WorldSession::SendCalendarEventInviteAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId = calendarEvent.GetEventId(); + uint64 inviteId = invite.GetInviteId(); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_INVITE_ALERT [" UI64FMTD "] EventId [" + UI64FMTD "] InviteId [" UI64FMTD "]", guid, eventId, inviteId); + + WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_ALERT); + data << uint64(eventId); + data << calendarEvent.GetTitle().c_str(); + data << uint32(calendarEvent.GetTime()); + data << uint32(calendarEvent.GetFlags()); + data << uint32(calendarEvent.GetType()); + data << uint32(calendarEvent.GetDungeonId()); + data << uint64(inviteId); + data << uint8(invite.GetStatus()); + data << uint8(invite.GetRank()); + data.appendPackGUID(calendarEvent.GetCreatorGUID()); + data.appendPackGUID(invite.GetSenderGUID()); + SendPacket(&data); +} + +void WorldSession::SendCalendarEventUpdateAlert(CalendarEvent const& calendarEvent, CalendarSendEventType sendEventType) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId = calendarEvent.GetEventId(); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_UPDATED_ALERT [" + UI64FMTD "] EventId [" UI64FMTD "]", guid, eventId); + + + WorldPacket data(SMSG_CALENDAR_EVENT_UPDATED_ALERT, 1 + 8 + 4 + 4 + 4 + 1 + 4 + + calendarEvent.GetTitle().size() + calendarEvent.GetDescription().size() + 1 + 4 + 4); + data << uint8(sendEventType); + data << uint64(eventId); + data << uint32(calendarEvent.GetTime()); + data << uint32(calendarEvent.GetFlags()); + data << uint32(calendarEvent.GetTime()); + data << uint8(calendarEvent.GetType()); + data << uint32(calendarEvent.GetDungeonId()); + data << calendarEvent.GetTitle().c_str(); + data << calendarEvent.GetDescription().c_str(); + data << uint8(calendarEvent.GetRepeatable()); + data << uint32(calendarEvent.GetMaxInvites()); + data << uint32(0); // FIXME + SendPacket(&data); } -void WorldSession::HandleCalendarEventInvite(WorldPacket& recv_data) +void WorldSession::SendCalendarEventRemovedAlert(CalendarEvent const& calendarEvent) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_EVENT_INVITE"); - recv_data.rfinish(); // set to end to avoid warnings spam + uint64 guid = _player->GetGUID(); + uint64 eventId = calendarEvent.GetEventId(); + uint32 eventTime = (calendarEvent.GetTime()); - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> std::string - //recv_data >> uint8 - //recv_data >> uint8 + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_REMOVED_ALERT [" UI64FMTD "] EventId [" + UI64FMTD "] Time %u", guid, eventId, eventTime); + + WorldPacket data(SMSG_CALENDAR_EVENT_REMOVED_ALERT, 1 + 8 + 1); + data << uint8(1); // FIXME: If true does not SignalEvent(EVENT_CALENDAR_ACTION_PENDING) + data << uint64(eventId); + data << uint32(eventTime); + SendPacket(&data); +} +void WorldSession::SendCalendarEventStatus(CalendarEvent const& calendarEvent, CalendarInvite const& invite) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId = calendarEvent.GetEventId(); + uint64 inviteId = invite.GetInviteId(); + uint64 invitee = invite.GetInvitee(); + uint32 eventTime = (calendarEvent.GetTime()); + uint32 flags = calendarEvent.GetFlags(); + uint8 status = invite.GetStatus(); + uint8 rank = invite.GetRank(); + uint32 statusTime = secsToTimeBitFields(invite.GetStatusTime()); + + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_STATUS [" UI64FMTD "] EventId [" + UI64FMTD "] InviteId [" UI64FMTD "] Invitee [" UI64FMTD "] Time %u " + "Flags %u, Status %u, Rank %u, StatusTime %u", + guid, eventId, inviteId, invitee, eventTime, flags, status, rank, + statusTime); + + WorldPacket data(SMSG_CALENDAR_EVENT_STATUS, 8 + 8 + 4 + 4 + 1 + 1 + 4); + data.appendPackGUID(invitee); + data << uint64(eventId); + data << uint32(eventTime); + data << uint32(flags); + data << uint8(status); + data << uint8(rank); + data << uint32(statusTime); + SendPacket(&data); } -void WorldSession::HandleCalendarEventRsvp(WorldPacket& recv_data) +void WorldSession::SendCalendarEventModeratorStatusAlert(CalendarInvite const& invite) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_EVENT_RSVP"); - recv_data.rfinish(); // set to end to avoid warnings spam + uint64 guid = _player->GetGUID(); + uint64 eventId = invite.GetEventId(); + uint64 invitee = invite.GetInvitee(); + uint8 status = invite.GetStatus(); - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint32 + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT [" UI64FMTD + "] Invitee [" UI64FMTD "] EventId [" UI64FMTD "] Status %u ", guid, + invitee, eventId, status); + + + WorldPacket data(SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT, 8 + 8 + 1 + 1); + data.appendPackGUID(invitee); + data << uint64(eventId); + data << uint8(status); + data << uint8(1); // FIXME + SendPacket(&data); } -void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket& recv_data) +void WorldSession::SendCalendarEventInviteRemoveAlert(CalendarEvent const& calendarEvent, CalendarInviteStatus status) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE"); - recv_data.rfinish(); // set to end to avoid warnings spam + uint64 guid = _player->GetGUID(); + uint64 eventId = calendarEvent.GetEventId(); + uint32 eventTime = (calendarEvent.GetTime()); + uint32 flags = calendarEvent.GetFlags(); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT [" + UI64FMTD "] EventId [" UI64FMTD "] Time %u, Flags %u, Status %u", + guid, eventId, eventTime, flags, status); + + WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, 8 + 4 + 4 + 1); + data << uint64(eventId); + data << uint32(eventTime); + data << uint32(flags); + data << uint8(status); + SendPacket(&data); +} - //recv_data.readPackGUID(guid) - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint64 +void WorldSession::SendCalendarEventInviteRemove(CalendarInvite const& invite, uint32 flags) +{ + uint64 guid = _player->GetGUID(); + uint64 eventId = invite.GetEventId(); + uint64 invitee = invite.GetInvitee(); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_INVITE_REMOVED [" + UI64FMTD "] Invitee [" UI64FMTD "] EventId [" UI64FMTD + "] Flags %u", guid, invitee, eventId, flags); + + WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_REMOVED, 8 + 4 + 4 + 1); + data.appendPackGUID(invitee); + data << uint32(eventId); + data << uint32(flags); + data << uint8(1); // FIXME + SendPacket(&data); } -void WorldSession::HandleCalendarEventStatus(WorldPacket& recv_data) +void WorldSession::SendCalendarClearPendingAction() { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_EVENT_STATUS"); - recv_data.rfinish(); // set to end to avoid warnings spam - - //recv_data.readPackGUID(guid) - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint32 + uint64 guid = _player->GetGUID(); + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_CLEAR_PENDING_ACTION [" UI64FMTD "]", guid); + + WorldPacket data(SMSG_CALENDAR_CLEAR_PENDING_ACTION, 0); + SendPacket(&data); } -void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket& recv_data) +void WorldSession::SendCalendarCommandResult(CalendarError err, char const* param /*= NULL*/) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS"); - recv_data.rfinish(); // set to end to avoid warnings spam - - //recv_data.readPackGUID(guid) - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint32 + uint64 guid = _player->GetGUID(); + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_COMMAND_RESULT [" UI64FMTD "] Value: %u", guid, err); + + WorldPacket data(SMSG_CALENDAR_COMMAND_RESULT, 0); + data << uint32(0); + data << uint8(0); + switch (err) + { + case CALENDAR_ERROR_OTHER_INVITES_EXCEEDED: + case CALENDAR_ERROR_ALREADY_INVITED_TO_EVENT_S: + case CALENDAR_ERROR_IGNORING_YOU_S: + data << param; + break; + default: + data << uint8(0); + break; + } + + data << uint32(err); + + SendPacket(&data); } -void WorldSession::HandleCalendarComplain(WorldPacket& recv_data) +void WorldSession::SendCalendarRaidLockout(InstanceSave const* save, bool add) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_COMPLAIN"); - recv_data.rfinish(); // set to end to avoid warnings spam + sLog->outDebug(LOG_FILTER_NETWORKIO, "%s", add ? "SMSG_CALENDAR_RAID_LOCKOUT_ADDED" : "SMSG_CALENDAR_RAID_LOCKOUT_REMOVED"); + time_t currTime = time(NULL); - //recv_data >> uint64 - //recv_data >> uint64 - //recv_data >> uint64 + WorldPacket data(SMSG_CALENDAR_RAID_LOCKOUT_REMOVED, (add ? 4 : 0) + 4 + 4 + 4 + 8); + if (add) + { + data.SetOpcode(SMSG_CALENDAR_RAID_LOCKOUT_ADDED); + data << uint32(secsToTimeBitFields(currTime)); + } + + data << uint32(save->GetMapId()); + data << uint32(save->GetDifficulty()); + data << uint32(save->GetResetTime() - currTime); + data << uint64(save->GetInstanceId()); + SendPacket(&data); } -void WorldSession::HandleCalendarGetNumPending(WorldPacket& /*recv_data*/) +void WorldSession::SendCalendarRaidLockoutUpdated(InstanceSave const* save) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_CALENDAR_GET_NUM_PENDING"); // empty + if (!save) + return; - WorldPacket data(SMSG_CALENDAR_SEND_NUM_PENDING, 4); - data << uint32(0); // 0 - no pending invites, 1 - some pending invites + uint64 guid = _player->GetGUID(); + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_RAID_LOCKOUT_UPDATED [" UI64FMTD + "] Map: %u, Difficulty %u", guid, save->GetMapId(), save->GetDifficulty()); + + time_t cur_time = time_t(time(NULL)); + + WorldPacket data(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, 4 + 4 + 4 + 4 + 8); + data << secsToTimeBitFields(cur_time); + data << uint32(save->GetMapId()); + data << uint32(save->GetDifficulty()); + data << uint32(0); // Amount of seconds that has changed to the reset time + data << uint32(save->GetResetTime() - cur_time); SendPacket(&data); } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 16129985d0f..887bebe5656 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -532,7 +532,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte if (result) { Field* fields = result->Fetch(); - createInfo->CharCount = fields[0].GetUInt8(); + createInfo->CharCount = uint8(fields[0].GetUInt64()); // SQL's COUNT() returns uint64 but it will always be less than uint8.Max if (createInfo->CharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_REALM)) { @@ -711,7 +711,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte SQLTransaction trans = LoginDatabase.BeginTransaction(); - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM); stmt->setUInt32(0, GetAccountId()); stmt->setUInt32(1, realmID); trans->Append(stmt); @@ -724,8 +724,6 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte LoginDatabase.CommitTransaction(trans); - newChar.CleanupsBeforeDelete(); - WorldPacket data(SMSG_CHAR_CREATE, 1); data << uint8(CHAR_CREATE_SUCCESS); SendPacket(&data); @@ -736,6 +734,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte sScriptMgr->OnPlayerCreate(&newChar); sWorld->AddCharacterNameData(newChar.GetGUIDLow(), std::string(newChar.GetName()), newChar.getGender(), newChar.getRace(), newChar.getClass()); + newChar.CleanupsBeforeDelete(); delete createInfo; _charCreateCallback.Reset(); } @@ -773,12 +772,17 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket & recv_data) return; } - QueryResult result = CharacterDatabase.PQuery("SELECT account, name FROM characters WHERE guid='%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_NAME_BY_GUID); + + stmt->setUInt32(0, GUID_LOPART(guid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { Field* fields = result->Fetch(); - accountId = fields[0].GetUInt32(); - name = fields[1].GetString(); + accountId = fields[0].GetUInt32(); + name = fields[1].GetString(); } // prevent deleting other players' characters using cheating tools @@ -1110,8 +1114,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) SendNotification(LANG_GM_ON); std::string IP_str = GetRemoteAddress(); - sLog->outChar("Account: %d (IP: %s) Login Character:[%s] (GUID: %u)", - GetAccountId(), IP_str.c_str(), pCurrChar->GetName(), pCurrChar->GetGUIDLow()); + sLog->outChar("Account: %d (IP: %s) Login Character:[%s] (GUID: %u) Level: %d", + GetAccountId(), IP_str.c_str(), pCurrChar->GetName(), pCurrChar->GetGUIDLow(), pCurrChar->getLevel()); if (!pCurrChar->IsStandState() && !pCurrChar->HasUnitState(UNIT_STATE_STUNNED)) pCurrChar->SetStandState(UNIT_STAND_STATE_STAND); @@ -1222,8 +1226,10 @@ void WorldSession::HandleCharRenameOpcode(WorldPacket& recv_data) uint8 res = ObjectMgr::CheckPlayerName(newName, true); if (res != CHAR_NAME_SUCCESS) { - WorldPacket data(SMSG_CHAR_RENAME, 1); + WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newName.size()+1)); data << uint8(res); + data << uint64(guid); + data << newName; SendPacket(&data); return; } @@ -1372,9 +1378,19 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recv_data) CharacterDatabase.EscapeString(declinedname.name[i]); SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM character_declinedname WHERE guid = '%u'", GUID_LOPART(guid)); - trans->PAppend("INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES ('%u', '%s', '%s', '%s', '%s', '%s')", - GUID_LOPART(guid), declinedname.name[0].c_str(), declinedname.name[1].c_str(), declinedname.name[2].c_str(), declinedname.name[3].c_str(), declinedname.name[4].c_str()); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME); + stmt->setUInt32(0, GUID_LOPART(guid)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_DECLINED_NAME); + stmt->setUInt32(0, GUID_LOPART(guid)); + + for (uint8 i = 0; i < 5; i++) + stmt->setString(i+1, declinedname.name[i]); + + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8); @@ -1471,7 +1487,12 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data) uint8 gender, skin, face, hairStyle, hairColor, facialHair; recv_data >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face; - QueryResult result = CharacterDatabase.PQuery("SELECT at_login FROM characters WHERE guid ='%u'", GUID_LOPART(guid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AT_LOGIN); + + stmt->setUInt32(0, GUID_LOPART(guid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) { WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1); @@ -1530,15 +1551,19 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data) } } - if (QueryResult oldNameResult = CharacterDatabase.PQuery("SELECT name FROM characters WHERE guid ='%u'", GUID_LOPART(guid))) + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME); + stmt->setUInt32(0, GUID_LOPART(guid)); + result = CharacterDatabase.Query(stmt); + + if (result) { - std::string oldname = oldNameResult->Fetch()[0].GetString(); - std::string IP_str = GetRemoteAddress(); - sLog->outChar("Account: %d (IP: %s), Character[%s] (guid:%u) Customized to: %s", GetAccountId(), IP_str.c_str(), oldname.c_str(), GUID_LOPART(guid), newName.c_str()); + std::string oldname = result->Fetch()[0].GetString(); + sLog->outChar("Account: %d (IP: %s), Character[%s] (guid:%u) Customized to: %s", GetAccountId(), GetRemoteAddress().c_str(), oldname.c_str(), GUID_LOPART(guid), newName.c_str()); } + Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN); stmt->setString(0, newName); stmt->setUInt16(1, uint16(AT_LOGIN_CUSTOMIZE)); @@ -1683,7 +1708,13 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) recv_data >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face >> race; uint32 lowGuid = GUID_LOPART(guid); - QueryResult result = CharacterDatabase.PQuery("SELECT class, level, at_login FROM characters WHERE guid ='%u'", lowGuid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN); + + stmt->setUInt32(0, lowGuid); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) { WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); @@ -1693,8 +1724,8 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) } Field* fields = result->Fetch(); - uint32 playerClass = fields[0].GetUInt32(); - uint32 level = fields[1].GetUInt32(); + uint32 playerClass = uint32(fields[0].GetUInt8()); + uint32 level = uint32(fields[1].GetUInt8()); uint32 at_loginFlags = fields[2].GetUInt16(); uint32 used_loginFlag = ((recv_data.GetOpcode() == CMSG_CHAR_RACE_CHANGE) ? AT_LOGIN_CHANGE_RACE : AT_LOGIN_CHANGE_FACTION); @@ -1749,7 +1780,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) { WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); data << uint8(CHAR_NAME_RESERVED); - SendPacket (&data); + SendPacket(&data); return; } @@ -1768,8 +1799,18 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) CharacterDatabase.EscapeString(newname); Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair); SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("UPDATE `characters` SET name='%s', race='%u', at_login=at_login & ~ %u WHERE guid='%u'", newname.c_str(), race, used_loginFlag, lowGuid); - trans->PAppend("DELETE FROM character_declinedname WHERE guid ='%u'", lowGuid); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_FACTION_OR_RACE); + stmt->setString(0, newname); + stmt->setUInt8(1, race); + stmt->setUInt16(2, used_loginFlag); + stmt->setUInt32(3, lowGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME); + stmt->setUInt32(0, lowGuid); + trans->Append(stmt); + sWorld->UpdateCharacterNameData(GUID_LOPART(guid), newname, gender, race); BattlegroundTeamId team = BG_TEAM_ALLIANCE; @@ -1791,58 +1832,71 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) // Switch Languages // delete all languages first - trans->PAppend("DELETE FROM `character_skills` WHERE `skill` IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137, 791, 792) AND `guid`='%u'", lowGuid); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_LANGUAGES); + stmt->setUInt32(0, lowGuid); + trans->Append(stmt); + + // Now add them back + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILL_LANGUAGE); + stmt->setUInt32(0, lowGuid); + + // Faction specific languages + if (team == BG_TEAM_HORDE) + stmt->setUInt16(1, 109); + else + stmt->setUInt16(1, 98); - // now add them back - if (team == BG_TEAM_ALLIANCE) + trans->Append(stmt); + + // Race specific languages + if (race != RACE_ORC && race != RACE_HUMAN) { - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 98, 300, 300)", lowGuid); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILL_LANGUAGE); + stmt->setUInt32(0, lowGuid); + switch (race) { - case RACE_DWARF: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 111, 300, 300)", lowGuid); - break; - case RACE_DRAENEI: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 759, 300, 300)", lowGuid); - break; - case RACE_GNOME: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 313, 300, 300)", lowGuid); - break; - case RACE_NIGHTELF: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 113, 300, 300)", lowGuid); - break; + case RACE_DWARF: + stmt->setUInt16(1, 111); + break; + case RACE_DRAENEI: + stmt->setUInt16(1, 759); + break; + case RACE_GNOME: + stmt->setUInt16(1, 313); + break; + case RACE_NIGHTELF: + stmt->setUInt16(1, 113); + break; case RACE_WORGEN: trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 791, 300, 300)", lowGuid); break; - } - } - else if (team == BG_TEAM_HORDE) - { - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 109, 300, 300)", lowGuid); - switch (race) - { - case RACE_UNDEAD_PLAYER: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 673, 300, 300)", lowGuid); - break; - case RACE_TAUREN: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 115, 300, 300)", lowGuid); - break; - case RACE_TROLL: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 315, 300, 300)", lowGuid); - break; - case RACE_BLOODELF: - trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 137, 300, 300)", lowGuid); - break; + case RACE_UNDEAD_PLAYER: + stmt->setUInt16(1, 673); + break; + case RACE_TAUREN: + stmt->setUInt16(1, 115); + break; + case RACE_TROLL: + stmt->setUInt16(1, 315); + break; + case RACE_BLOODELF: + stmt->setUInt16(1, 137); + break; case RACE_GOBLIN: trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 792, 300, 300)", lowGuid); break; } + + trans->Append(stmt); } if (recv_data.GetOpcode() == CMSG_CHAR_FACTION_CHANGE) { // Delete all Flypaths - trans->PAppend("UPDATE `characters` SET taxi_path = '' WHERE guid ='%u'", lowGuid); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_TAXI_PATH); + stmt->setUInt32(0, lowGuid); + trans->Append(stmt); if (level > 7) { @@ -1884,11 +1938,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) taximaskstream << "0 "; taximaskstream << '0'; std::string taximask = taximaskstream.str(); - trans->PAppend("UPDATE `characters` SET `taximask`= '%s' WHERE `guid` = '%u'", taximask.c_str(), lowGuid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_TAXIMASK); + stmt->setString(0, taximask); + stmt->setUInt32(1, lowGuid); + trans->Append(stmt); } // Delete all current quests - trans->PAppend("DELETE FROM `character_queststatus` WHERE guid ='%u'", GUID_LOPART(guid)); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS); + stmt->setUInt32(0, GUID_LOPART(guid)); + trans->Append(stmt); // Delete record of the faction old completed quests { @@ -1926,7 +1986,12 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD)) { // Reset guild - if (QueryResult result = CharacterDatabase.PQuery("SELECT guildid FROM `guild_member` WHERE guid ='%u'", lowGuid)) + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER); + + stmt->setUInt32(0, lowGuid); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) if (Guild* guild = sGuildMgr->GetGuildById((result->Fetch()[0]).GetUInt32())) guild->DeleteMember(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER)); } @@ -1934,15 +1999,21 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND)) { // Delete Friend List - trans->PAppend("DELETE FROM `character_social` WHERE `guid`= '%u'", lowGuid); - trans->PAppend("DELETE FROM `character_social` WHERE `friend`= '%u'", lowGuid); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID); + stmt->setUInt32(0, lowGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND); + stmt->setUInt32(0, lowGuid); + trans->Append(stmt); + } // Leave Arena Teams Player::LeaveAllArenaTeams(guid); // Reset homebind and position - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND); stmt->setUInt32(0, lowGuid); trans->Append(stmt); @@ -1973,10 +2044,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) { uint32 achiev_alliance = it->first; uint32 achiev_horde = it->second; - trans->PAppend("DELETE FROM `character_achievement` WHERE `achievement`=%u AND `guid`=%u", - team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, lowGuid); - trans->PAppend("UPDATE `character_achievement` SET achievement = '%u' where achievement = '%u' AND guid = '%u'", - team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, team == BG_TEAM_ALLIANCE ? achiev_horde : achiev_alliance, lowGuid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT); + stmt->setUInt16(0, uint16(team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde)); + stmt->setUInt32(1, lowGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACHIEVEMENT); + stmt->setUInt16(0, uint16(team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde)); + stmt->setUInt16(1, uint16(team == BG_TEAM_ALLIANCE ? achiev_horde : achiev_alliance)); + stmt->setUInt32(2, lowGuid); + trans->Append(stmt); } // Item conversion @@ -1984,8 +2062,12 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) { uint32 item_alliance = it->first; uint32 item_horde = it->second; - trans->PAppend("UPDATE `item_instance` ii, `character_inventory` ci SET ii.itemEntry = '%u' WHERE ii.itemEntry = '%u' AND ci.guid = '%u' AND ci.item = ii.guid", - team == BG_TEAM_ALLIANCE ? item_alliance : item_horde, team == BG_TEAM_ALLIANCE ? item_horde : item_alliance, guid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE); + stmt->setUInt32(0, (team == BG_TEAM_ALLIANCE ? item_alliance : item_horde)); + stmt->setUInt32(1, (team == BG_TEAM_ALLIANCE ? item_horde : item_alliance)); + stmt->setUInt32(2, guid); + trans->Append(stmt); } // Spell conversion @@ -1993,10 +2075,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) { uint32 spell_alliance = it->first; uint32 spell_horde = it->second; - trans->PAppend("DELETE FROM `character_spell` WHERE `spell`=%u AND `guid`=%u", - team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, lowGuid); - trans->PAppend("UPDATE `character_spell` SET spell = '%u' where spell = '%u' AND guid = '%u'", - team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, team == BG_TEAM_ALLIANCE ? spell_horde : spell_alliance, lowGuid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL); + stmt->setUInt32(0, (team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde)); + stmt->setUInt32(1, lowGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE); + stmt->setUInt32(0, (team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde)); + stmt->setUInt32(1, (team == BG_TEAM_ALLIANCE ? spell_horde : spell_alliance)); + stmt->setUInt32(2, lowGuid); + trans->Append(stmt); } // Reputation conversion @@ -2004,10 +2093,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) { uint32 reputation_alliance = it->first; uint32 reputation_horde = it->second; - trans->PAppend("DELETE FROM character_reputation WHERE faction = '%u' AND guid = '%u'", - team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, lowGuid); - trans->PAppend("UPDATE `character_reputation` SET faction = '%u' where faction = '%u' AND guid = '%u'", - team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, team == BG_TEAM_ALLIANCE ? reputation_horde : reputation_alliance, lowGuid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REP_BY_FACTION); + stmt->setUInt32(0, uint16(team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde)); + stmt->setUInt32(1, lowGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE); + stmt->setUInt16(0, uint16(team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde)); + stmt->setUInt16(1, uint16(team == BG_TEAM_ALLIANCE ? reputation_horde : reputation_alliance)); + stmt->setUInt32(2, lowGuid); + trans->Append(stmt); } } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 3d919335e1a..d725419ac84 100755 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -277,8 +277,9 @@ void WorldSession::HandleGroupDeclineOpcode(WorldPacket & /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GROUP_DECLINE"); - Group *group = GetPlayer()->GetGroupInvite(); - if (!group) return; + Group* group = GetPlayer()->GetGroupInvite(); + if (!group) + return; // Remember leader if online (group pointer will be invalid if group gets disbanded) Player* leader = ObjectAccessor::FindPlayer(group->GetLeaderGUID()); @@ -459,7 +460,8 @@ void WorldSession::HandleLootMethodOpcode(WorldPacket & recv_data) void WorldSession::HandleLootRoll(WorldPacket &recv_data) { - if (!GetPlayer()->GetGroup()) + Group* group = GetPlayer()->GetGroup(); + if (!group) { recv_data.rfinish(); return; @@ -472,12 +474,6 @@ void WorldSession::HandleLootRoll(WorldPacket &recv_data) recv_data >> NumberOfPlayers; recv_data >> rollType; //0: pass, 1: need, 2: greed - //sLog->outDebug("WORLD RECIEVE CMSG_LOOT_ROLL, From:%u, Numberofplayers:%u, Choise:%u", (uint32)Guid, NumberOfPlayers, Choise); - - Group* group = GetPlayer()->GetGroup(); - if (!group) - return; - // everything's fine, do it group->CountRollVote(GetPlayer()->GetGUID(), Guid, NumberOfPlayers, rollType); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index fd3f0c07fb4..c2ff61bb912 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -373,8 +373,8 @@ void WorldSession::HandleGuildBankerActivate(WorldPacket & recv_data) uint64 GoGuid; recv_data >> GoGuid; - uint8 unk; - recv_data >> unk; + uint8 fullSlotList; + recv_data >> fullSlotList; // 0 = only slots updated in last operation are shown. 1 = all slots updated if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK)) { @@ -396,8 +396,8 @@ void WorldSession::HandleGuildBankQueryTab(WorldPacket & recv_data) uint8 tabId; recv_data >> tabId; - uint8 unk1; - recv_data >> unk1; + uint8 fullSlotList; + recv_data >> fullSlotList; // 0 = only slots updated in last operation are shown. 1 = all slots updated if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK)) if (Guild* guild = _GetPlayerGuild(this)) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 00ff1f8ffa4..2d85a4cb689 100755 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -115,7 +115,7 @@ void WorldSession::HandleSwapItem(WorldPacket & recv_data) //sLog->outDebug(LOG_FILTER_PACKETIO, "WORLD: CMSG_SWAP_ITEM"); uint8 dstbag, dstslot, srcbag, srcslot; - recv_data >> dstbag >> dstslot >> srcbag >> srcslot ; + recv_data >> dstbag >> dstslot >> srcbag >> srcslot; //sLog->outDebug("STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", srcbag, srcslot, dstbag, dstslot); uint16 src = ((srcbag << 8) | srcslot); @@ -1144,7 +1144,14 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recv_data) } SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("INSERT INTO character_gifts VALUES ('%u', '%u', '%u', '%u')", GUID_LOPART(item->GetOwnerGUID()), item->GetGUIDLow(), item->GetEntry(), item->GetUInt32Value(ITEM_FIELD_FLAGS)); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GIFT); + stmt->setUInt32(0, GUID_LOPART(item->GetOwnerGUID())); + stmt->setUInt32(1, item->GetGUIDLow()); + stmt->setUInt32(2, item->GetEntry()); + stmt->setUInt32(3, item->GetUInt32Value(ITEM_FIELD_FLAGS)); + trans->Append(stmt); + item->SetEntry(gift->GetEntry()); switch (item->GetEntry()) @@ -1282,7 +1289,6 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data) } } } - } } diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 842e19cf510..9c66ca44383 100755 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -72,7 +72,7 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket& recv_data) } LfgDungeonSet newDungeons; - for (int8 i = 0 ; i < numDungeons; ++i) + for (int8 i = 0; i < numDungeons; ++i) { recv_data >> dungeon; newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry @@ -527,9 +527,9 @@ void WorldSession::SendLfgBootPlayer(const LfgPlayerBoot* pBoot) ++agreeNum; } } - sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_LFG_BOOT_PLAYER [" UI64FMTD "] inProgress: %u - didVote: %u - agree: %u - victim: [" UI64FMTD "] votes: %u - agrees: %u - left: %u - needed: %u - reason %s", + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_LFG_BOOT_PROPOSAL_UPDATE [" UI64FMTD "] inProgress: %u - didVote: %u - agree: %u - victim: [" UI64FMTD "] votes: %u - agrees: %u - left: %u - needed: %u - reason %s", guid, uint8(pBoot->inProgress), uint8(playerVote != LFG_ANSWER_PENDING), uint8(playerVote == LFG_ANSWER_AGREE), pBoot->victim, votesNum, agreeNum, secsleft, pBoot->votedNeeded, pBoot->reason.c_str()); - WorldPacket data(SMSG_LFG_BOOT_PLAYER, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length()); + WorldPacket data(SMSG_LFG_BOOT_PROPOSAL_UPDATE, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length()); data << uint8(pBoot->inProgress); // Vote in progress data << uint8(playerVote != LFG_ANSWER_PENDING); // Did Vote data << uint8(playerVote == LFG_ANSWER_AGREE); // Agree diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 6508f08dc22..8e4b41a9be4 100755 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -80,9 +80,9 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket & recv_data) { Creature* creature = GetPlayer()->GetMap()->GetCreature(lguid); - bool ok_loot = creature && creature->isAlive() == (player->getClass() == CLASS_ROGUE && creature->lootForPickPocketed); + bool lootAllowed = creature && creature->isAlive() == (player->getClass() == CLASS_ROGUE && creature->lootForPickPocketed); - if (!ok_loot || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE)) + if (!lootAllowed || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE)) { player->SendLootRelease(lguid); return; @@ -386,8 +386,8 @@ void WorldSession::DoLootRelease(uint64 lguid) { Creature* creature = GetPlayer()->GetMap()->GetCreature(lguid); - bool ok_loot = creature && creature->isAlive() == (player->getClass() == CLASS_ROGUE && creature->lootForPickPocketed); - if (!ok_loot || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE)) + bool lootAllowed = creature && creature->isAlive() == (player->getClass() == CLASS_ROGUE && creature->lootForPickPocketed); + if (!lootAllowed || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE)) return; loot = &creature->loot; @@ -448,7 +448,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket & recv_data) if (_player->GetLootGUID() != lootguid) return; - Loot* pLoot = NULL; + Loot* loot = NULL; if (IS_CRE_OR_VEH_GUID(GetPlayer()->GetLootGUID())) { @@ -456,7 +456,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket & recv_data) if (!creature) return; - pLoot = &creature->loot; + loot = &creature->loot; } else if (IS_GAMEOBJECT_GUID(GetPlayer()->GetLootGUID())) { @@ -464,19 +464,19 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket & recv_data) if (!pGO) return; - pLoot = &pGO->loot; + loot = &pGO->loot; } - if (!pLoot) + if (!loot) return; - if (slotid > pLoot->items.size()) + if (slotid > loot->items.size()) { - sLog->outDebug(LOG_FILTER_LOOT, "MasterLootItem: Player %s might be using a hack! (slot %d, size %lu)", GetPlayer()->GetName(), slotid, (unsigned long)pLoot->items.size()); + sLog->outDebug(LOG_FILTER_LOOT, "MasterLootItem: Player %s might be using a hack! (slot %d, size %lu)", GetPlayer()->GetName(), slotid, (unsigned long)loot->items.size()); return; } - LootItem& item = pLoot->items[slotid]; + LootItem& item = loot->items[slotid]; ItemPosCountVec dest; InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count); @@ -495,14 +495,13 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket & recv_data) Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, looters); target->SendNewItem(newitem, uint32(item.count), false, false, true); target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count); - target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, pLoot->loot_type, item.count); + target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item.count); target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count); // mark as looted item.count=0; item.is_looted=true; - pLoot->NotifyItemRemoved(slotid); - --pLoot->unlootedCount; + loot->NotifyItemRemoved(slotid); + --loot->unlootedCount; } - diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 95459bae0fa..988857558c9 100755 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -128,12 +128,26 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data) else { rc_team = sObjectMgr->GetPlayerTeamByGUID(rc); - if (QueryResult result = CharacterDatabase.PQuery("SELECT COUNT(*) FROM mail WHERE receiver = '%u'", GUID_LOPART(rc))) + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_COUNT); + + stmt->setUInt32(0, GUID_LOPART(rc)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) { Field* fields = result->Fetch(); - mails_count = fields[0].GetUInt32(); + mails_count = fields[0].GetUInt64(); } - if (QueryResult result = CharacterDatabase.PQuery("SELECT level FROM characters WHERE guid = '%u'", GUID_LOPART(rc))) + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_LEVEL); + + stmt->setUInt32(0, GUID_LOPART(rc)); + + result = CharacterDatabase.Query(stmt); + + if (result) { Field* fields = result->Fetch(); receiveLevel = fields[0].GetUInt8(); @@ -360,8 +374,15 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recv_data) //we can return mail now //so firstly delete the old one SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM mail WHERE id = '%u'", mailId); // needed? - trans->PAppend("DELETE FROM mail_items WHERE mail_id = '%u'", mailId); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); + stmt->setUInt32(0, mailId); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); + stmt->setUInt32(0, mailId); + trans->Append(stmt); + player->RemoveMail(mailId); // only return mail if the player exists (and delete if not existing) @@ -541,7 +562,7 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data) //load players mails, and mailed items if (!player->m_mailsLoaded) - player ->_LoadMail(); + player->_LoadMail(); // client can't work with packets > max int16 value const uint32 maxPacketSize = 32767; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index e04704785e0..7cea7b2ea8e 100755 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -51,6 +51,7 @@ #include "GameObjectAI.h" #include "Group.h" #include "AccountMgr.h" +#include "Spell.h" void WorldSession::HandleRepopRequestOpcode(WorldPacket & recv_data) { @@ -125,11 +126,11 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket & recv_data) if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); - if ((unit && unit->GetCreatureInfo()->ScriptID != unit->LastUsedScriptID) || (go && go->GetGOInfo()->ScriptId != go->LastUsedScriptID)) + if ((unit && unit->GetCreatureTemplate()->ScriptID != unit->LastUsedScriptID) || (go && go->GetGOInfo()->ScriptId != go->LastUsedScriptID)) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleGossipSelectOptionOpcode - Script reloaded while in use, ignoring and set new scipt id"); if (unit) - unit->LastUsedScriptID = unit->GetCreatureInfo()->ScriptID; + unit->LastUsedScriptID = unit->GetCreatureTemplate()->ScriptID; if (go) go->LastUsedScriptID = go->GetGOInfo()->ScriptId; _player->PlayerTalkClass->SendCloseGossip(); @@ -374,7 +375,7 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket & /*recv_data*/) if (GetPlayer()->isInCombat()) reason = 1; - else if (GetPlayer()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING)) + else if (GetPlayer()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR)) reason = 3; // is jumping or falling else if (GetPlayer()->duel || GetPlayer()->HasAura(9454)) // is dueling or frozen by GM via freeze command reason = 2; // FIXME - Need the correct value @@ -429,6 +430,10 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPacket & /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_LOGOUT_CANCEL Message"); + // Player have already logged out serverside, too late to cancel + if (!GetPlayer()) + return; + LogoutRequest(0); WorldPacket data(SMSG_LOGOUT_CANCEL_ACK, 0); @@ -818,7 +823,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) Player* player = GetPlayer(); if (player->isInFlight()) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Player '%s' (GUID: %u) in flight, ignore Area Trigger ID:%u", + sLog->outDebug(LOG_FILTER_NETWORKIO, "HandleAreaTriggerOpcode: Player '%s' (GUID: %u) in flight, ignore Area Trigger ID:%u", player->GetName(), player->GetGUIDLow(), triggerId); return; } @@ -826,14 +831,14 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(triggerId); if (!atEntry) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Player '%s' (GUID: %u) send unknown (by DBC) Area Trigger ID:%u", + sLog->outDebug(LOG_FILTER_NETWORKIO, "HandleAreaTriggerOpcode: Player '%s' (GUID: %u) send unknown (by DBC) Area Trigger ID:%u", player->GetName(), player->GetGUIDLow(), triggerId); return; } if (player->GetMapId() != atEntry->mapid) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Player '%s' (GUID: %u) too far (trigger map: %u player map: %u), ignore Area Trigger ID: %u", + sLog->outDebug(LOG_FILTER_NETWORKIO, "HandleAreaTriggerOpcode: Player '%s' (GUID: %u) too far (trigger map: %u player map: %u), ignore Area Trigger ID: %u", player->GetName(), atEntry->mapid, player->GetMapId(), player->GetGUIDLow(), triggerId); return; } @@ -847,7 +852,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) float dist = player->GetDistance(atEntry->x, atEntry->y, atEntry->z); if (dist > atEntry->radius + delta) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Player '%s' (GUID: %u) too far (radius: %f distance: %f), ignore Area Trigger ID: %u", + sLog->outDebug(LOG_FILTER_NETWORKIO, "HandleAreaTriggerOpcode: Player '%s' (GUID: %u) too far (radius: %f distance: %f), ignore Area Trigger ID: %u", player->GetName(), player->GetGUIDLow(), atEntry->radius, dist, triggerId); return; } @@ -878,7 +883,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) (fabs(dy) > atEntry->box_y / 2 + delta) || (fabs(dz) > atEntry->box_z / 2 + delta)) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Player '%s' (GUID: %u) too far (1/2 box X: %f 1/2 box Y: %f 1/2 box Z: %f rotatedPlayerX: %f rotatedPlayerY: %f dZ:%f), ignore Area Trigger ID: %u", + sLog->outDebug(LOG_FILTER_NETWORKIO, "HandleAreaTriggerOpcode: Player '%s' (GUID: %u) too far (1/2 box X: %f 1/2 box Y: %f 1/2 box Z: %f rotatedPlayerX: %f rotatedPlayerY: %f dZ:%f), ignore Area Trigger ID: %u", player->GetName(), player->GetGUIDLow(), atEntry->box_x/2, atEntry->box_y/2, atEntry->box_z/2, rotPlayerX, rotPlayerY, dz, triggerId); return; } @@ -1065,7 +1070,7 @@ void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data) sLog->outDetail("MISC: Added Item %u into button %u", action, button); break; default: - sLog->outError("MISC: Unknown action button type %u for action %u into button %u", type, action, button); + sLog->outError("MISC: Unknown action button type %u for action %u into button %u for player %s (GUID: %u)", type, action, button, _player->GetName(), _player->GetGUIDLow()); return; } GetPlayer()->addActionButton(button, action, type); @@ -1327,7 +1332,12 @@ void WorldSession::HandleWhoisOpcode(WorldPacket& recv_data) uint32 accid = player->GetSession()->GetAccountId(); - QueryResult result = LoginDatabase.PQuery("SELECT username, email, last_ip FROM account WHERE id=%u", accid); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_WHOIS); + + stmt->setUInt32(0, accid); + + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (!result) { SendNotification(LANG_ACCOUNT_FOR_PLAYER_NOT_FOUND, charname.c_str()); @@ -1349,7 +1359,7 @@ void WorldSession::HandleWhoisOpcode(WorldPacket& recv_data) WorldPacket data(SMSG_WHOIS, msg.size()+1); data << msg; - _player->GetSession()->SendPacket(&data); + SendPacket(&data); sLog->outDebug(LOG_FILTER_NETWORKIO, "Received whois command from player %s for character %s", GetPlayer()->GetName(), charname.c_str()); } @@ -1526,16 +1536,16 @@ void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket & recv_data) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - Player* pGroupGuy = itr->getSource(); - if (!pGroupGuy) + Player* groupGuy = itr->getSource(); + if (!groupGuy) continue; - if (!pGroupGuy->IsInMap(pGroupGuy)) + if (!groupGuy->IsInMap(groupGuy)) return; - if (pGroupGuy->GetMap()->IsNonRaidDungeon()) + if (groupGuy->GetMap()->IsNonRaidDungeon()) { - sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while group member (Name: %s, GUID: %u) is inside!", _player->GetGUIDLow(), pGroupGuy->GetName(), pGroupGuy->GetGUIDLow()); + sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while group member (Name: %s, GUID: %u) is inside!", _player->GetGUIDLow(), groupGuy->GetName(), groupGuy->GetGUIDLow()); return; } } @@ -1583,14 +1593,14 @@ void WorldSession::HandleSetRaidDifficultyOpcode(WorldPacket & recv_data) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - Player* pGroupGuy = itr->getSource(); - if (!pGroupGuy) + Player* groupGuy = itr->getSource(); + if (!groupGuy) continue; - if (!pGroupGuy->IsInMap(pGroupGuy)) + if (!groupGuy->IsInMap(groupGuy)) return; - if (pGroupGuy->GetMap()->IsRaid()) + if (groupGuy->GetMap()->IsRaid()) { sLog->outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow()); return; @@ -1779,3 +1789,47 @@ void WorldSession::HandleRequestHotfix(WorldPacket& recvPacket) delete[] guidBytes; delete[] mask; } + +void WorldSession::HandleUpdateMissileTrajectory(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_UPDATE_MISSILE_TRAJECTORY"); + + uint64 guid; + uint32 spellId; + float elevation, speed; + float curX, curY, curZ; + float targetX, targetY, targetZ; + uint8 moveStop; + + recvPacket >> guid >> spellId >> elevation >> speed; + recvPacket >> curX >> curY >> curZ; + recvPacket >> targetX >> targetY >> targetZ; + recvPacket >> moveStop; + + Unit* caster = ObjectAccessor::GetUnit(*_player, guid); + Spell* spell = caster ? caster->GetCurrentSpell(CURRENT_GENERIC_SPELL) : NULL; + if (!spell || spell->m_spellInfo->Id != spellId || !spell->m_targets.HasDst() || !spell->m_targets.HasSrc()) + { + recvPacket.rfinish(); + return; + } + + Position pos = *spell->m_targets.GetSrcPos(); + pos.Relocate(curX, curY, curZ); + spell->m_targets.ModSrc(pos); + + pos = *spell->m_targets.GetDstPos(); + pos.Relocate(targetX, targetY, targetZ); + spell->m_targets.ModDst(pos); + + spell->m_targets.SetElevation(elevation); + spell->m_targets.SetSpeed(speed); + + if (moveStop) + { + uint32 opcode; + recvPacket >> opcode; + recvPacket.SetOpcode(opcode); + HandleMovementOpcodes(recvPacket); + } +} diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 5cac0b99c77..3d9968d9a9d 100755 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -47,7 +47,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->SetSemaphoreTeleportFar(false); // get the teleport destination - WorldLocation &loc = GetPlayer()->GetTeleportDest(); + WorldLocation const loc = GetPlayer()->GetTeleportDest(); // possible errors in the coordinate validity check if (!MapManager::IsValidMapCoord(loc)) @@ -65,10 +65,9 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->m_InstanceValid = true; Map* oldMap = GetPlayer()->GetMap(); - ASSERT(oldMap); if (GetPlayer()->IsInWorld()) { - sLog->outCrash("Player (Name %s) is still in world when teleported from map %u to new map %u", GetPlayer()->GetName(), oldMap->GetId(), loc.GetMapId()); + sLog->outError("Player (Name %s) is still in world when teleported from map %u to new map %u", GetPlayer()->GetName(), oldMap->GetId(), loc.GetMapId()); oldMap->RemovePlayerFromMap(GetPlayer(), false); } @@ -213,8 +212,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) sLog->outStaticDebug("Guid " UI64FMTD, guid); sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS); - Unit* mover = _player->m_mover; - Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; + Player* plMover = _player->m_mover->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; @@ -253,25 +251,25 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) GetPlayer()->ProcessDelayedOperations(); } -void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) +void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) { - uint16 opcode = recv_data.GetOpcode(); + uint16 opcode = recvData.GetOpcode(); Unit* mover = _player->m_mover; - ASSERT(mover != NULL); // there must always be a mover + ASSERT(mover != NULL); // there must always be a mover - Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; + Player* plrMover = mover->ToPlayer(); // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck - if (plMover && plMover->IsBeingTeleported()) + if (plrMover && plrMover->IsBeingTeleported()) { return; } /* extract packet */ MovementInfo movementInfo; - ReadMovementInfo(recv_data, &movementInfo); + ReadMovementInfo(recvData, &movementInfo); // prevent tampered movement data if (movementInfo.guid != mover->GetGUID()) @@ -292,27 +290,27 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) if (movementInfo.t_pos.GetPositionX() > 50 || movementInfo.t_pos.GetPositionY() > 50 || movementInfo.t_pos.GetPositionZ() > 50) { - recv_data.rfinish(); // prevent warnings spam + recvData.rfinish(); // prevent warnings spam return; } if (!Trinity::IsValidMapCoord(movementInfo.pos.GetPositionX() + movementInfo.t_pos.GetPositionX(), movementInfo.pos.GetPositionY() + movementInfo.t_pos.GetPositionY(), movementInfo.pos.GetPositionZ() + movementInfo.t_pos.GetPositionZ(), movementInfo.pos.GetOrientation() + movementInfo.t_pos.GetOrientation())) { - recv_data.rfinish(); // prevent warnings spam + recvData.rfinish(); // prevent warnings spam return; } // if we boarded a transport, add us to it - if (plMover && !plMover->GetTransport()) + if (plrMover && !plrMover->GetTransport()) { // elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just dismount if the guid can be found in the transport list for (MapManager::TransportSet::const_iterator iter = sMapMgr->m_Transports.begin(); iter != sMapMgr->m_Transports.end(); ++iter) { if ((*iter)->GetGUID() == movementInfo.t_guid) { - plMover->m_transport = (*iter); - (*iter)->AddPassenger(plMover); + plrMover->m_transport = (*iter); + (*iter)->AddPassenger(plrMover); break; } } @@ -325,23 +323,23 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT; } } - else if (plMover && plMover->GetTransport()) // if we were on a transport, leave + else if (plrMover && plrMover->GetTransport()) // if we were on a transport, leave { - plMover->m_transport->RemovePassenger(plMover); - plMover->m_transport = NULL; + plrMover->m_transport->RemovePassenger(plrMover); + plrMover->m_transport = NULL; movementInfo.t_pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f); movementInfo.t_time = 0; movementInfo.t_seat = -1; } // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map). - if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->isInFlight()) - plMover->HandleFall(movementInfo); + if (opcode == MSG_MOVE_FALL_LAND && plrMover && !plrMover->isInFlight()) + plrMover->HandleFall(movementInfo); - if (plMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plMover->IsInWater()) + if (plrMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plrMover->IsInWater()) { // now client not include swimming flag in case jumping under water - plMover->SetInWater(!plMover->IsInWater() || plMover->GetBaseMap()->IsUnderWater(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ())); + plrMover->SetInWater(!plrMover->IsInWater() || plrMover->GetBaseMap()->IsUnderWater(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ())); } /*----------------------*/ @@ -364,27 +362,25 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) mover->UpdatePosition(movementInfo.pos); - if (plMover) // nothing is charmed, or player charmed + if (plrMover) // nothing is charmed, or player charmed { - plMover->UpdateFallInformationIfNeed(movementInfo, opcode); + plrMover->UpdateFallInformationIfNeed(movementInfo, opcode); if (movementInfo.pos.GetPositionZ() < -500.0f) { - if (!(plMover->InBattleground() - && plMover->GetBattleground() - && plMover->GetBattleground()->HandlePlayerUnderMap(_player))) + if (!(plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player))) { // NOTE: this is actually called many times while falling // even after the player has been teleported away // TODO: discard movement packets after the player is rooted - if (plMover->isAlive()) + if (plrMover->isAlive()) { - plMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth()); + plrMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth()); // player can be alive if GM/etc // change the death state to CORPSE to prevent the death timer from // starting in the next player update - if (!plMover->isAlive()) - plMover->KillPlayer(); + if (!plrMover->isAlive()) + plrMover->KillPlayer(); } } } @@ -492,9 +488,10 @@ void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data) recv_data.readPackGUID(old_mover_guid); MovementInfo mi; - mi.guid = old_mover_guid; ReadMovementInfo(recv_data, &mi); + mi.guid = old_mover_guid; + _player->m_movementInfo = mi; } @@ -520,6 +517,7 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket & recv_data) MovementInfo movementInfo; ReadMovementInfo(recv_data, &movementInfo); + _player->m_movementInfo = movementInfo; WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, 66); @@ -744,6 +742,78 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) if (HaveTransportData && mi->pos.m_positionX != mi->t_pos.m_positionX) if (GetPlayer()->GetTransport()) GetPlayer()->GetTransport()->UpdatePosition(mi); + + //! Anti-cheat checks. Please keep them in seperate if() blocks to maintain a clear overview. + //! Might be subject to latency, so just remove improper flags. + #ifdef TRINITY_DEBUG + #define REMOVE_VIOLATING_FLAGS(check, maskToRemove) \ + { \ + if (check) \ + { \ + sLog->outDebug(LOG_FILTER_UNITS, "WorldSession::ReadMovementInfo: Violation of MovementFlags found (%s). " \ + "MovementFlags: %u, MovementFlags2: %u for player GUID: %u. Mask %u will be removed.", \ + STRINGIZE(check), mi->GetMovementFlags(), mi->GetExtraMovementFlags(), GetPlayer()->GetGUIDLow(), maskToRemove); \ + mi->RemoveMovementFlag((maskToRemove)); \ + } \ + } + #else + #define REMOVE_VIOLATING_FLAGS(check, maskToRemove) \ + if (check) \ + mi->RemoveMovementFlag((maskToRemove)); + #endif + + + /*! This must be a packet spoofing attempt. MOVEMENTFLAG_ROOT sent from the client is not valid + in conjunction with any of the moving movement flags such as MOVEMENTFLAG_FORWARD. + It will freeze clients that receive this player's movement info. + */ + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_ROOT), + MOVEMENTFLAG_ROOT); + + //! Cannot hover without SPELL_AURA_HOVER + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && !GetPlayer()->HasAuraType(SPELL_AURA_HOVER), + MOVEMENTFLAG_HOVER); + + //! Cannot ascend and descend at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_ASCENDING) && mi->HasMovementFlag(MOVEMENTFLAG_DESCENDING), + MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING); + + //! Cannot move left and right at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_RIGHT), + MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT); + + //! Cannot strafe left and right at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_RIGHT), + MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT); + + //! Cannot pitch up and down at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_PITCH_UP) && mi->HasMovementFlag(MOVEMENTFLAG_PITCH_DOWN), + MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN); + + //! Cannot move forwards and backwards at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FORWARD) && mi->HasMovementFlag(MOVEMENTFLAG_BACKWARD), + MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD); + + //! Cannot walk on water without SPELL_AURA_WATER_WALK + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_WATERWALKING) && !GetPlayer()->HasAuraType(SPELL_AURA_WATER_WALK), + MOVEMENTFLAG_WATERWALKING); + + //! Cannot feather fall without SPELL_AURA_FEATHER_FALL + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FALLING_SLOW) && !GetPlayer()->HasAuraType(SPELL_AURA_FEATHER_FALL), + MOVEMENTFLAG_FALLING_SLOW); + + /*! Cannot fly if no fly auras present. Exception is being a GM. + Note that we check for account level instead of Player::IsGameMaster() because in some + situations it may be feasable to use .gm fly on as a GM without having .gm on, + e.g. aerial combat. + */ + + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSecurity() == SEC_PLAYER && + !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_FLY) && + !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED), + MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); + + #undef REMOVE_VIOLATING_FLAGS } void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi) @@ -901,4 +971,4 @@ void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi) WPError(false, "Incorrect sequence element detected at ReadMovementInfo"); } } -} +} \ No newline at end of file diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 385b91c9f7d..4da8805614b 100755 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -135,7 +135,7 @@ void WorldSession::SendTrainerList(uint64 guid, const std::string& strTitle) if (!unit->isCanTrainingOf(_player, true)) return; - CreatureTemplate const* ci = unit->GetCreatureInfo(); + CreatureTemplate const* ci = unit->GetCreatureTemplate(); if (!ci) { @@ -170,7 +170,7 @@ void WorldSession::SendTrainerList(uint64 guid, const std::string& strTitle) bool valid = true; bool primary_prof_first_rank = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS ; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (!tSpell->learnedSpell[i]) continue; @@ -197,7 +197,7 @@ void WorldSession::SendTrainerList(uint64 guid, const std::string& strTitle) data << uint32(tSpell->reqSkillValue); //prev + req or req + 0 uint8 maxReq = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS ; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (!tSpell->learnedSpell[i]) continue; @@ -341,7 +341,7 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) if (!sScriptMgr->OnGossipHello(_player, unit)) { // _player->TalkedToCreature(unit->GetEntry(), unit->GetGUID()); - _player->PrepareGossipMenu(unit, unit->GetCreatureInfo()->GossipMenuId, true); + _player->PrepareGossipMenu(unit, unit->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(unit); } unit->AI()->sGossipHello(_player); diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index f278e6b017e..5f7e4ce04a8 100755 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -158,8 +158,6 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid switch (spellid) { case COMMAND_STAY: //flat=1792 //STAY - pet->AttackStop(); - pet->InterruptNonMeleeSpells(false); pet->StopMoving(); pet->GetMotionMaster()->Clear(false); pet->GetMotionMaster()->MoveIdle(); @@ -652,15 +650,25 @@ void WorldSession::HandlePetRename(WorldPacket & recv_data) SQLTransaction trans = CharacterDatabase.BeginTransaction(); if (isdeclined) { - for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - CharacterDatabase.EscapeString(declinedname.name[i]); - trans->PAppend("DELETE FROM character_pet_declinedname WHERE owner = '%u' AND id = '%u'", _player->GetGUIDLow(), pet->GetCharmInfo()->GetPetNumber()); - trans->PAppend("INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES ('%u', '%u', '%s', '%s', '%s', '%s', '%s')", - pet->GetCharmInfo()->GetPetNumber(), _player->GetGUIDLow(), declinedname.name[0].c_str(), declinedname.name[1].c_str(), declinedname.name[2].c_str(), declinedname.name[3].c_str(), declinedname.name[4].c_str()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME); + stmt->setUInt32(0, pet->GetCharmInfo()->GetPetNumber()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_CHAR_PET_DECLINEDNAME); + stmt->setUInt32(0, _player->GetGUIDLow()); + + for (uint8 i = 0; i < 5; i++) + stmt->setString(i+1, declinedname.name[i]); + + trans->Append(stmt); } - CharacterDatabase.EscapeString(name); - trans->PAppend("UPDATE character_pet SET name = '%s', renamed = '1' WHERE owner = '%u' AND id = '%u'", name.c_str(), _player->GetGUIDLow(), pet->GetCharmInfo()->GetPetNumber()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_PET_NAME); + stmt->setString(0, name); + stmt->setUInt32(1, _player->GetGUIDLow()); + stmt->setUInt32(2, pet->GetCharmInfo()->GetPetNumber()); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(time(NULL))); // cast can't be helped diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index 7faabb730e4..0c2f8741b15 100755 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -215,7 +215,10 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data) // a petition is invalid, if both the owner and the type matches // we checked above, if this player is in an arenateam, so this must be // datacorruption - QueryResult result = CharacterDatabase.PQuery("SELECT petitionguid FROM petition WHERE ownerguid = '%u' AND type = '%u'", _player->GetGUIDLow(), type); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_BY_OWNER); + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt8(1, type); + PreparedQueryResult result = CharacterDatabase.Query(stmt); std::ostringstream ssInvalidPetitionGUIDs; @@ -236,8 +239,14 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data) SQLTransaction trans = CharacterDatabase.BeginTransaction(); trans->PAppend("DELETE FROM petition WHERE petitionguid IN (%s)", ssInvalidPetitionGUIDs.str().c_str()); trans->PAppend("DELETE FROM petition_sign WHERE petitionguid IN (%s)", ssInvalidPetitionGUIDs.str().c_str()); - trans->PAppend("INSERT INTO petition (ownerguid, petitionguid, name, type) VALUES ('%u', '%u', '%s', '%u')", - _player->GetGUIDLow(), charter->GetGUIDLow(), name.c_str(), type); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION); + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt32(1, charter->GetGUIDLow()); + stmt->setString(2, name); + stmt->setUInt8(3, uint8(type)); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } @@ -250,9 +259,14 @@ void WorldSession::HandlePetitionShowSignOpcode(WorldPacket& recv_data) recv_data >> petitionguid; // petition guid // solve (possible) some strange compile problems with explicit use GUID_LOPART(petitionguid) at some GCC versions (wrong code optimization in compiler?) - uint32 petitionguid_low = GUID_LOPART(petitionguid); + uint32 petitionGuidLow = GUID_LOPART(petitionguid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_TYPE); + + stmt->setUInt32(0, petitionGuidLow); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); - QueryResult result = CharacterDatabase.PQuery("SELECT type FROM petition WHERE petitionguid = '%u'", petitionguid_low); if (!result) { sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "Petition %u is not found for player %u %s", GUID_LOPART(petitionguid), GetPlayer()->GetGUIDLow(), GetPlayer()->GetName()); @@ -265,26 +279,30 @@ void WorldSession::HandlePetitionShowSignOpcode(WorldPacket& recv_data) if (type == GUILD_CHARTER_TYPE && _player->GetGuildId()) return; - result = CharacterDatabase.PQuery("SELECT playerguid FROM petition_sign WHERE petitionguid = '%u'", petitionguid_low); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE); + + stmt->setUInt32(0, petitionGuidLow); + + result = CharacterDatabase.Query(stmt); // result == NULL also correct in case no sign yet if (result) signs = uint8(result->GetRowCount()); - sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_PETITION_SHOW_SIGNATURES petition entry: '%u'", petitionguid_low); + sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_PETITION_SHOW_SIGNATURES petition entry: '%u'", petitionGuidLow); WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, (8+8+4+1+signs*12)); data << uint64(petitionguid); // petition guid data << uint64(_player->GetGUID()); // owner guid - data << uint32(petitionguid_low); // guild guid + data << uint32(petitionGuidLow); // guild guid data << uint8(signs); // sign's count for (uint8 i = 1; i <= signs; ++i) { Field* fields2 = result->Fetch(); - uint64 plguid = fields2[0].GetUInt64(); + uint32 lowGuid = fields2[0].GetUInt32(); - data << uint64(plguid); // Player GUID + data << uint64(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER)); // Player GUID data << uint32(0); // there 0 ... result->NextRow(); @@ -311,16 +329,18 @@ void WorldSession::SendPetitionQueryOpcode(uint64 petitionguid) uint32 type; std::string name = "NO_NAME_FOR_GUID"; - // TODO: Use CHAR_LOAD_PETITION PS - QueryResult result = CharacterDatabase.PQuery("SELECT ownerguid, name, type " - "FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION); + + stmt->setUInt32(0, GUID_LOPART(petitionguid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { Field* fields = result->Fetch(); ownerguid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER); name = fields[1].GetString(); - type = fields[2].GetUInt32(); + type = fields[2].GetUInt8(); } else { @@ -382,7 +402,11 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket & recv_data) if (!item) return; - QueryResult result = CharacterDatabase.PQuery("SELECT type FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionGuid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_TYPE); + + stmt->setUInt32(0, GUID_LOPART(petitionGuid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { @@ -422,7 +446,7 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket & recv_data) } } - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_PETITION_NAME); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_PETITION_NAME); stmt->setString(0, newName); stmt->setUInt32(1, GUID_LOPART(petitionGuid)); @@ -446,11 +470,12 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data) recv_data >> petitionGuid; // petition guid recv_data >> unk; - QueryResult result = CharacterDatabase.PQuery( - "SELECT ownerguid, " - " (SELECT COUNT(playerguid) FROM petition_sign WHERE petition_sign.petitionguid = '%u') AS signs, " - " type " - "FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionGuid), GUID_LOPART(petitionGuid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURES); + + stmt->setUInt32(0, GUID_LOPART(petitionGuid)); + stmt->setUInt32(1, GUID_LOPART(petitionGuid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) { @@ -460,8 +485,8 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data) fields = result->Fetch(); uint64 ownerGuid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER); - uint8 signs = fields[1].GetUInt8(); - uint32 type = fields[2].GetUInt32(); + uint64 signs = fields[1].GetUInt64(); + uint8 type = fields[2].GetUInt8(); uint32 playerGuid = _player->GetGUIDLow(); if (GUID_LOPART(ownerGuid) == playerGuid) @@ -518,9 +543,14 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data) if (++signs > type) // client signs maximum return; - //client doesn't allow to sign petition two times by one character, but not check sign by another character from same account - //not allow sign another player from already sign player account - result = CharacterDatabase.PQuery("SELECT playerguid FROM petition_sign WHERE player_account = '%u' AND petitionguid = '%u'", GetAccountId(), GUID_LOPART(petitionGuid)); + // Client doesn't allow to sign petition two times by one character, but not check sign by another character from same account + // not allow sign another player from already sign player account + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIG_BY_ACCOUNT); + + stmt->setUInt32(0, GetAccountId()); + stmt->setUInt32(1, GUID_LOPART(petitionGuid)); + + result = CharacterDatabase.Query(stmt); if (result) { @@ -538,7 +568,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data) return; } - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION_SIGNATURE); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION_SIGNATURE); stmt->setUInt32(0, GUID_LOPART(ownerGuid)); stmt->setUInt32(1, GUID_LOPART(petitionGuid)); @@ -576,7 +606,12 @@ void WorldSession::HandlePetitionDeclineOpcode(WorldPacket & recv_data) recv_data >> petitionguid; // petition guid sLog->outDebug(LOG_FILTER_NETWORKIO, "Petition %u declined by %u", GUID_LOPART(petitionguid), _player->GetGUIDLow()); - QueryResult result = CharacterDatabase.PQuery("SELECT ownerguid FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_OWNER_BY_GUID); + + stmt->setUInt32(0, GUID_LOPART(petitionguid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return; @@ -608,7 +643,12 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data) if (!player) return; - QueryResult result = CharacterDatabase.PQuery("SELECT type FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_TYPE); + + stmt->setUInt32(0, GUID_LOPART(petitionguid)); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) return; @@ -667,7 +707,13 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data) } } - result = CharacterDatabase.PQuery("SELECT playerguid FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE); + + stmt->setUInt32(0, GUID_LOPART(petitionguid)); + + result = CharacterDatabase.Query(stmt); + // result == NULL also correct charter without signs if (result) signs = uint8(result->GetRowCount()); @@ -681,9 +727,7 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data) for (uint8 i = 1; i <= signs; ++i) { Field* fields2 = result->Fetch(); - plguid = fields2[0].GetUInt64(); - - data << uint64(plguid); // Player GUID + data << uint64(MAKE_NEW_GUID(fields2[0].GetUInt32(), 0, HIGHGUID_PLAYER)); // Player GUID data << uint32(0); // there 0 ... result->NextRow(); @@ -861,8 +905,15 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data) } SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionGuid)); - trans->PAppend("DELETE FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionGuid)); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_GUID); + stmt->setUInt32(0, GUID_LOPART(petitionGuid)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID); + stmt->setUInt32(0, GUID_LOPART(petitionGuid)); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); // created diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index a18fbcddfca..f0e681b535c 100755 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -33,42 +33,33 @@ void WorldSession::SendNameQueryOpcode(uint64 guid) { - Player* player = NULL; - const CharacterNameData* nameData = sWorld->GetCharacterNameData(GUID_LOPART(guid)); - if (nameData) - player = ObjectAccessor::FindPlayer(guid); + Player* player = ObjectAccessor::FindPlayer(guid); + CharacterNameData const* nameData = sWorld->GetCharacterNameData(GUID_LOPART(guid)); - // guess size WorldPacket data(SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10)); data.appendPackGUID(guid); - data << uint8(0); // added in 3.1 - if (nameData) - { - data << nameData->m_name; // played name - data << uint8(0); // realm name for cross realm BG usage - data << uint8(nameData->m_race); - data << uint8(nameData->m_gender); - data << uint8(nameData->m_class); - } - else + if (!nameData) { - data << std::string(GetTrinityString(LANG_NON_EXIST_CHARACTER)); - data << uint32(0); + data << uint8(1); // name unknown + SendPacket(&data); + return; } - if (player) + data << uint8(0); // name known + data << nameData->m_name; // played name + data << uint8(0); // realm name - only set for cross realm interaction (such as Battlegrounds) + data << uint8(nameData->m_race); + data << uint8(nameData->m_gender); + data << uint8(nameData->m_class); + + if (DeclinedName const* names = (player ? player->GetDeclinedNames() : NULL)) { - if (DeclinedName const* names = player->GetDeclinedNames()) - { - data << uint8(1); // is declined - for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - data << names->name[i]; - } - else - data << uint8(0); // is not declined + data << uint8(1); // Name is declined + for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + data << names->name[i]; } - else //TODO: decline names may also need to be stored in char name data - data << uint8(0); + else + data << uint8(0); // Name is not declined SendPacket(&data); } @@ -76,7 +67,6 @@ void WorldSession::SendNameQueryOpcode(uint64 guid) void WorldSession::HandleNameQueryOpcode(WorldPacket& recv_data) { uint64 guid; - recv_data >> guid; // This is disable by default to prevent lots of console spam diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 761fb9657c9..62372004f03 100755 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -53,7 +53,7 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket & recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u", uint32(GUID_LOPART(guid))); Creature* cr_questgiver=questgiver->ToCreature(); - if (!cr_questgiver->IsHostileTo(_player)) // not show quest status to enemies + if (!cr_questgiver->IsHostileTo(_player)) // do not show quest status to enemies { questStatus = sScriptMgr->GetDialogStatus(_player, cr_questgiver); if (questStatus > 6) @@ -103,7 +103,7 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket & recv_data) if (sScriptMgr->OnGossipHello(_player, creature)) return; - _player->PrepareGossipMenu(creature, creature->GetCreatureInfo()->GossipMenuId, true); + _player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(creature); creature->AI()->sGossipHello(_player); @@ -112,17 +112,17 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket & recv_data) void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data) { uint64 guid; - uint32 quest; + uint32 questId; uint32 unk1; - recv_data >> guid >> quest >> unk1; + recv_data >> guid >> questId >> unk1; - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), questId, unk1); - Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER); + Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER); // no or incorrect quest giver - if (!pObject || (pObject->GetTypeId() != TYPEID_PLAYER && !pObject->hasQuest(quest)) || - (pObject->GetTypeId() == TYPEID_PLAYER && !pObject->ToPlayer()->CanShareQuest(quest))) + if (!object || (object->GetTypeId() != TYPEID_PLAYER && !object->hasQuest(questId)) || + (object->GetTypeId() == TYPEID_PLAYER && !object->ToPlayer()->CanShareQuest(questId))) { _player->PlayerTalkClass->SendCloseGossip(); _player->SetDivider(0); @@ -130,14 +130,13 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data) } // some kind of WPE protection - if (!_player->CanInteractWithQuestGiver(pObject)) + if (!_player->CanInteractWithQuestGiver(object)) return; - Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest); - if (qInfo) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) { // prevent cheating - if (!GetPlayer()->CanTakeQuest(qInfo, true)) + if (!GetPlayer()->CanTakeQuest(quest, true)) { _player->PlayerTalkClass->SendCloseGossip(); _player->SetDivider(0); @@ -154,11 +153,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data) } } - if (_player->CanAddQuest(qInfo, true)) + if (_player->CanAddQuest(quest, true)) { - _player->AddQuest(qInfo, pObject); + _player->AddQuest(quest, object); - if (qInfo->HasFlag(QUEST_FLAGS_PARTY_ACCEPT)) + if (quest->HasFlag(QUEST_FLAGS_PARTY_ACCEPT)) { if (Group* group = _player->GetGroup()) { @@ -169,38 +168,38 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data) if (!player || player == _player) // not self continue; - if (player->CanTakeQuest(qInfo, true)) + if (player->CanTakeQuest(quest, true)) { player->SetDivider(_player->GetGUID()); //need confirmation that any gossip window will close player->PlayerTalkClass->SendCloseGossip(); - _player->SendQuestConfirmAccept(qInfo, player); + _player->SendQuestConfirmAccept(quest, player); } } } } - if (_player->CanCompleteQuest(quest)) - _player->CompleteQuest(quest); + if (_player->CanCompleteQuest(questId)) + _player->CompleteQuest(questId); - switch (pObject->GetTypeId()) + switch (object->GetTypeId()) { case TYPEID_UNIT: - sScriptMgr->OnQuestAccept(_player, (pObject->ToCreature()), qInfo); - (pObject->ToCreature())->AI()->sQuestAccept(_player, qInfo); + sScriptMgr->OnQuestAccept(_player, (object->ToCreature()), quest); + (object->ToCreature())->AI()->sQuestAccept(_player, quest); break; case TYPEID_ITEM: case TYPEID_CONTAINER: { - sScriptMgr->OnQuestAccept(_player, ((Item*)pObject), qInfo); + sScriptMgr->OnQuestAccept(_player, ((Item*)object), quest); // destroy not required for quest finish quest starting item bool destroyItem = true; for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) { - if ((qInfo->RequiredItemId[i] == ((Item*)pObject)->GetEntry()) && (((Item*)pObject)->GetTemplate()->MaxCount > 0)) + if ((quest->RequiredItemId[i] == ((Item*)object)->GetEntry()) && (((Item*)object)->GetTemplate()->MaxCount > 0)) { destroyItem = false; break; @@ -208,21 +207,21 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data) } if (destroyItem) - _player->DestroyItem(((Item*)pObject)->GetBagSlot(), ((Item*)pObject)->GetSlot(), true); + _player->DestroyItem(((Item*)object)->GetBagSlot(), ((Item*)object)->GetSlot(), true); break; } case TYPEID_GAMEOBJECT: - sScriptMgr->OnQuestAccept(_player, ((GameObject*)pObject), qInfo); - (pObject->ToGameObject())->AI()->QuestAccept(_player, qInfo); + sScriptMgr->OnQuestAccept(_player, ((GameObject*)object), quest); + (object->ToGameObject())->AI()->QuestAccept(_player, quest); break; default: break; } _player->PlayerTalkClass->SendCloseGossip(); - if (qInfo->GetSrcSpell() > 0) - _player->CastSpell(_player, qInfo->GetSrcSpell(), true); + if (quest->GetSrcSpell() > 0) + _player->CastSpell(_player, quest->GetSrcSpell(), true); return; } @@ -247,8 +246,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket & recv_data) return; } - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); - if (quest) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) { // not sure here what should happen to quests with QUEST_FLAGS_AUTOCOMPLETE // if this breaks them, add && object->GetTypeId() == TYPEID_ITEM to this check @@ -275,15 +273,12 @@ void WorldSession::HandleQuestQueryOpcode(WorldPacket & recv_data) if (!_player) return; - uint32 quest; - recv_data >> quest; - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUEST_QUERY quest = %u", quest); + uint32 questId; + recv_data >> questId; + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUEST_QUERY quest = %u", questId); - Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest); - if (pQuest) - { - _player->PlayerTalkClass->SendQuestQueryResponse(pQuest); - } + if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) + _player->PlayerTalkClass->SendQuestQueryResponse(quest); } void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket & recv_data) @@ -372,28 +367,28 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket & recv_data) void WorldSession::HandleQuestgiverRequestRewardOpcode(WorldPacket & recv_data) { - uint32 quest; + uint32 questId; uint64 guid; - recv_data >> guid >> quest; + recv_data >> guid >> questId; - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_REQUEST_REWARD npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_REQUEST_REWARD npc = %u, quest = %u", uint32(GUID_LOPART(guid)), questId); - Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); - if (!pObject || !pObject->hasInvolvedQuest(quest)) + Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + if (!object || !object->hasInvolvedQuest(questId)) return; // some kind of WPE protection - if (!_player->CanInteractWithQuestGiver(pObject)) + if (!_player->CanInteractWithQuestGiver(object)) return; - if (_player->CanCompleteQuest(quest)) - _player->CompleteQuest(quest); + if (_player->CanCompleteQuest(questId)) + _player->CompleteQuest(questId); - if (_player->GetQuestStatus(quest) != QUEST_STATUS_COMPLETE) + if (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE) return; - if (Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest)) - _player->PlayerTalkClass->SendQuestGiverOfferReward(pQuest, guid, true); + if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) + _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); } void WorldSession::HandleQuestgiverCancel(WorldPacket& /*recv_data*/) @@ -425,22 +420,22 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPacket& recv_data) if (slot < MAX_QUEST_LOG_SIZE) { - if (uint32 quest = _player->GetQuestSlotQuestId(slot)) + if (uint32 questId = _player->GetQuestSlotQuestId(slot)) { - if (!_player->TakeQuestSourceItem(quest, true)) + if (!_player->TakeQuestSourceItem(questId, true)) return; // can't un-equip some items, reject quest cancel - if (const Quest *pQuest = sObjectMgr->GetQuestTemplate(quest)) + if (const Quest *quest = sObjectMgr->GetQuestTemplate(questId)) { - if (pQuest->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) - _player->RemoveTimedQuest(quest); + if (quest->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) + _player->RemoveTimedQuest(questId); } - _player->TakeQuestSourceItem(quest, true); // remove quest src item from player - _player->RemoveActiveQuest(quest); - _player->GetAchievementMgr().RemoveTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, quest); + _player->TakeQuestSourceItem(questId, true); // remove quest src item from player + _player->RemoveActiveQuest(questId); + _player->GetAchievementMgr().RemoveTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, questId); - sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), quest); + sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), questId); } _player->SetQuestSlot(slot, 0); @@ -494,6 +489,8 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, questId = %u", uint32(GUID_LOPART(playerGuid)), questId); Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, playerGuid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + if (!object || !object->hasInvolvedQuest(questId)) + Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); if (!object || !object->hasInvolvedQuest(questId)) return; @@ -545,7 +542,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_PUSHQUESTTOPARTY questId = %u", questId); - if (Quest const* pQuest = sObjectMgr->GetQuestTemplate(questId)) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) { if (Group* group = _player->GetGroup()) { @@ -558,7 +555,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_SHARING_QUEST); - if (!player->SatisfyQuestStatus(pQuest, false)) + if (!player->SatisfyQuestStatus(quest, false)) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_HAVE_QUEST); continue; @@ -570,7 +567,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) continue; } - if (!player->CanTakeQuest(pQuest, false)) + if (!player->CanTakeQuest(quest, false)) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_CANT_TAKE_QUEST); continue; @@ -588,7 +585,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) continue; } - player->PlayerTalkClass->SendQuestGiverQuestDetails(pQuest, _player->GetGUID(), true); + player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, _player->GetGUID(), true); player->SetDivider(_player->GetGUID()); } } @@ -648,18 +645,19 @@ uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32 { uint32 result2 = 0; uint32 quest_id = i->second; - Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest_id); - if (!pQuest) continue; + Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id); + if (!quest) + continue; - ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK, pQuest->GetQuestId()); + ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK, quest->GetQuestId()); if (!sConditionMgr->IsObjectMeetToConditions(player, conditions)) continue; QuestStatus status = player->GetQuestStatus(quest_id); if ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(quest_id)) || - (pQuest->IsAutoComplete() && player->CanTakeQuest(pQuest, false))) + (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))) { - if (pQuest->IsAutoComplete() && pQuest->IsRepeatable()) + if (quest->IsAutoComplete() && quest->IsRepeatable()) result2 = DIALOG_STATUS_REWARD_REP; else result2 = DIALOG_STATUS_REWARD; @@ -675,26 +673,26 @@ uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32 { uint32 result2 = 0; uint32 quest_id = i->second; - Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest_id); - if (!pQuest) + Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id); + if (!quest) continue; - ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK, pQuest->GetQuestId()); + ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK, quest->GetQuestId()); if (!sConditionMgr->IsObjectMeetToConditions(player, conditions)) continue; QuestStatus status = player->GetQuestStatus(quest_id); if (status == QUEST_STATUS_NONE) { - if (player->CanSeeStartQuest(pQuest)) + if (player->CanSeeStartQuest(quest)) { - if (player->SatisfyQuestLevel(pQuest, false)) + if (player->SatisfyQuestLevel(quest, false)) { - if (pQuest->IsAutoComplete() || (pQuest->IsRepeatable() && player->IsQuestRewarded(quest_id))) + if (quest->IsAutoComplete() || (quest->IsRepeatable() && player->IsQuestRewarded(quest_id))) result2 = DIALOG_STATUS_REWARD_REP; - else if (player->getLevel() <= ((player->GetQuestLevel(pQuest) == -1) ? player->getLevel() : player->GetQuestLevel(pQuest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) + else if (player->getLevel() <= ((player->GetQuestLevel(quest) == -1) ? player->getLevel() : player->GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) { - if (pQuest->HasFlag(QUEST_FLAGS_DAILY) || pQuest->HasFlag(QUEST_FLAGS_WEEKLY)) + if (quest->HasFlag(QUEST_FLAGS_DAILY) || quest->HasFlag(QUEST_FLAGS_WEEKLY)) result2 = DIALOG_STATUS_AVAILABLE_REP; else result2 = DIALOG_STATUS_AVAILABLE; diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 886368821f5..cec5ea2bbda 100755 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -110,4 +110,3 @@ void WorldSession::HandleUnlearnSkillOpcode(WorldPacket& recv_data) recv_data >> skillId; GetPlayer()->SetSkill(skillId, 0, 0, 0); } - diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 4e3a5a91db7..c56d86d11db 100755 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -236,7 +236,12 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED))// wrapped? { - QueryResult result = CharacterDatabase.PQuery("SELECT entry, flags FROM character_gifts WHERE item_guid = '%u'", item->GetGUIDLow()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM); + + stmt->setUInt32(0, item->GetGUIDLow()); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { Field* fields = result->Fetch(); @@ -255,7 +260,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) return; } - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); stmt->setUInt32(0, item->GetGUIDLow()); @@ -656,13 +661,22 @@ void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket) uint8 castCount; float x, y, z; // Position of missile hit - recvPacket.readPackGUID(casterGuid); + recvPacket >> casterGuid; recvPacket >> spellId; recvPacket >> castCount; recvPacket >> x; recvPacket >> y; recvPacket >> z; + Unit* caster = ObjectAccessor::GetUnit(*_player, casterGuid); + Spell* spell = caster ? caster->FindCurrentSpellBySpellId(spellId) : NULL; + if (spell && spell->m_targets.HasDst()) + { + Position pos = *spell->m_targets.GetDstPos(); + pos.Relocate(x, y, z); + spell->m_targets.ModDst(pos); + } + WorldPacket data(SMSG_SET_PROJECTILE_POSITION, 21); data << uint64(casterGuid); data << uint8(castCount); diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index 44889e6dda8..b774fbcba70 100755 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -103,7 +103,7 @@ void WorldSession::SendTaxiMenu(Creature* unit) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_TAXINODE_STATUS_QUERY %u ", curloc); - WorldPacket data(SMSG_SHOWTAXINODES, (4+8+4+8*4)); + WorldPacket data(SMSG_SHOWTAXINODES, (4 + 8 + 4 + 8 * 4)); data << uint32(1); data << uint64(unit->GetGUID()); data << uint32(curloc); diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp index a270d42b000..d6675188f6e 100755 --- a/src/server/game/Handlers/TicketHandler.cpp +++ b/src/server/game/Handlers/TicketHandler.cpp @@ -38,7 +38,7 @@ void WorldSession::HandleGMTicketCreateOpcode(WorldPacket & recv_data) return; } - GMTicketResponse response = GMTICKET_RESPONSE_FAILURE; + GMTicketResponse response = GMTICKET_RESPONSE_CREATE_ERROR; // Player must not have ticket if (!sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID())) { @@ -48,7 +48,7 @@ void WorldSession::HandleGMTicketCreateOpcode(WorldPacket & recv_data) sWorld->SendGMText(LANG_COMMAND_TICKETNEW, GetPlayer()->GetName(), ticket->GetId()); - response = GMTICKET_RESPONSE_SUCCESS; + response = GMTICKET_RESPONSE_CREATE_SUCCESS; } WorldPacket data(SMSG_GMTICKET_CREATE, 4); @@ -61,8 +61,8 @@ void WorldSession::HandleGMTicketUpdateOpcode(WorldPacket & recv_data) std::string message; recv_data >> message; - GMTicketResponse response = GMTICKET_RESPONSE_FAILURE; - if (GmTicket *ticket = sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID())) + GMTicketResponse response = GMTICKET_RESPONSE_UPDATE_ERROR; + if (GmTicket* ticket = sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID())) { SQLTransaction trans = SQLTransaction(NULL); ticket->SetMessage(message); @@ -70,7 +70,7 @@ void WorldSession::HandleGMTicketUpdateOpcode(WorldPacket & recv_data) sWorld->SendGMText(LANG_COMMAND_TICKETUPDATED, GetPlayer()->GetName(), ticket->GetId()); - response = GMTICKET_RESPONSE_SUCCESS; + response = GMTICKET_RESPONSE_UPDATE_SUCCESS; } WorldPacket data(SMSG_GMTICKET_UPDATETEXT, 4); @@ -176,6 +176,8 @@ void WorldSession::HandleReportLag(WorldPacket& recv_data) stmt->setFloat (3, x); stmt->setFloat (4, y); stmt->setFloat (5, z); + stmt->setUInt32(6, GetLatency()); + stmt->setUInt32(7, time(NULL)); CharacterDatabase.Execute(stmt); } diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index b51f13a5063..b2a89ed3021 100755 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -412,7 +412,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) trader->GetSession()->SendTradeStatus(TRADE_STATUS_TRADE_ACCEPT); // test if item will fit in each inventory - hisCanCompleteTrade = (trader->CanStoreItems(myItems, TRADE_SLOT_TRADED_COUNT) == EQUIP_ERR_OK); + hisCanCompleteTrade = (trader->CanStoreItems(myItems, TRADE_SLOT_TRADED_COUNT) == EQUIP_ERR_OK); myCanCompleteTrade = (_player->CanStoreItems(hisItems, TRADE_SLOT_TRADED_COUNT) == EQUIP_ERR_OK); clearAcceptTradeMode(myItems, hisItems); @@ -551,7 +551,7 @@ void WorldSession::HandleBeginTradeOpcode(WorldPacket& recvPacket) void WorldSession::SendCancelTrade() { - if (m_playerRecentlyLogout) + if (PlayerRecentlyLoggedOut() || PlayerLogout()) return; SendTradeStatus(TRADE_STATUS_TRADE_CANCELED); @@ -566,15 +566,12 @@ void WorldSession::HandleCancelTradeOpcode(WorldPacket& /*recvPacket*/) void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { - if (GetPlayer()->m_trade) - { - recvPacket.rfinish(); - return; - } - uint64 ID; recvPacket >> ID; + if (GetPlayer()->m_trade) + return; + if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); @@ -748,4 +745,3 @@ void WorldSession::HandleClearTradeItemOpcode(WorldPacket& recvPacket) my_trade->SetItem(TradeSlots(tradeSlot), NULL); } - diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index ce4f6ccb8fe..cfd73c2c987 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -81,7 +81,9 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) uint64 guid; // current vehicle guid recv_data.readPackGUID(guid); - ReadMovementInfo(recv_data, &vehicle_base->m_movementInfo); + MovementInfo movementInfo; + ReadMovementInfo(recv_data, &movementInfo); + vehicle_base->m_movementInfo = movementInfo; uint64 accessory; // accessory guid recv_data.readPackGUID(accessory); diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 722b7089a17..8078a91d082 100755 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -124,11 +124,21 @@ InstanceSave* InstanceSaveManager::GetInstanceSave(uint32 InstanceId) void InstanceSaveManager::DeleteInstanceFromDB(uint32 instanceid) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM instance WHERE id = '%u'", instanceid); - trans->PAppend("DELETE FROM character_instance WHERE instance = '%u'", instanceid); - trans->PAppend("DELETE FROM group_instance WHERE instance = '%u'", instanceid); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE_BY_INSTANCE); + stmt->setUInt32(0, instanceid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE); + stmt->setUInt32(0, instanceid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE); + stmt->setUInt32(0, instanceid); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); - // respawn times should be deleted only when the map gets unloaded + // Respawn times should be deleted only when the map gets unloaded } void InstanceSaveManager::RemoveInstanceSave(uint32 InstanceId) @@ -250,13 +260,13 @@ void InstanceSaveManager::LoadInstances() CharacterDatabase.DirectExecute("DELETE i.* FROM instance AS i LEFT JOIN character_instance AS ci ON i.id = ci.instance LEFT JOIN group_instance AS gi ON i.id = gi.instance WHERE ci.guid IS NULL AND gi.guid IS NULL"); // Delete invalid references to instance - CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_INSTANCE_CREATURE_RESPAWNS)); - CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_INSTANCE_GO_RESPAWNS)); + CharacterDatabase.DirectExecute("DELETE FROM creature_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)"); + CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)"); CharacterDatabase.DirectExecute("DELETE tmp.* FROM character_instance AS tmp LEFT JOIN instance ON tmp.instance = instance.id WHERE tmp.instance > 0 AND instance.id IS NULL"); CharacterDatabase.DirectExecute("DELETE tmp.* FROM group_instance AS tmp LEFT JOIN instance ON tmp.instance = instance.id WHERE tmp.instance > 0 AND instance.id IS NULL"); // Clean invalid references to instance - CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_NONEXISTENT_INSTANCE_FOR_CORPSES)); + CharacterDatabase.DirectExecute("UPDATE corpse SET instanceId = 0 WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)"); CharacterDatabase.DirectExecute("UPDATE characters AS tmp LEFT JOIN instance ON tmp.instance_id = instance.id SET tmp.instance_id = 0 WHERE tmp.instance_id > 0 AND instance.id IS NULL"); // Initialize instance id storage (Needs to be done after the trash has been clean out) @@ -348,7 +358,7 @@ void InstanceSaveManager::LoadResetTimes() { Field* fields = result->Fetch(); uint32 mapid = fields[0].GetUInt16(); - Difficulty difficulty = Difficulty(fields[1].GetUInt32()); + Difficulty difficulty = Difficulty(fields[1].GetUInt8()); uint64 oldresettime = fields[2].GetUInt32(); MapDifficulty const* mapDiff = GetMapDifficultyData(mapid, difficulty); @@ -568,9 +578,22 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b // delete them from the DB, even if not loaded SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM character_instance USING character_instance LEFT JOIN instance ON character_instance.instance = id WHERE map = '%u' and difficulty='%u'", mapid, difficulty); - trans->PAppend("DELETE FROM group_instance USING group_instance LEFT JOIN instance ON group_instance.instance = id WHERE map = '%u' and difficulty='%u'", mapid, difficulty); - trans->PAppend("DELETE FROM instance WHERE map = '%u' and difficulty='%u'", mapid, difficulty); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF); + stmt->setUInt16(0, uint16(mapid)); + stmt->setUInt8(1, uint8(difficulty)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF); + stmt->setUInt16(0, uint16(mapid)); + stmt->setUInt8(1, uint8(difficulty)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE_BY_MAP_DIFF); + stmt->setUInt16(0, uint16(mapid)); + stmt->setUInt8(1, uint8(difficulty)); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); // calculate the next reset time @@ -580,13 +603,13 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b if (period < DAY) period = DAY; - uint32 next_reset = ((resetTime + MINUTE) / DAY * DAY) + period + diff; + uint32 next_reset = uint32(((resetTime + MINUTE) / DAY * DAY) + period + diff); SetResetTimeFor(mapid, difficulty, next_reset); ScheduleReset(true, time_t(next_reset-3600), InstResetEvent(1, mapid, difficulty, 0)); // Update it in the DB - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GLOBAL_INSTANCE_RESETTIME); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GLOBAL_INSTANCE_RESETTIME); stmt->setUInt32(0, next_reset); stmt->setUInt16(1, uint16(mapid)); @@ -639,4 +662,4 @@ uint32 InstanceSaveManager::GetNumBoundGroupsTotal() ret += itr->second->GetGroupCount(); return ret; -} \ No newline at end of file +} diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index d0a96e3b62e..66621dc43ee 100755 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -397,22 +397,22 @@ void InstanceScript::SendEncounterUnit(uint32 type, Unit* unit /*= NULL*/, uint8 switch (type) { - case ENCOUNTER_FRAME_ADD: - case ENCOUNTER_FRAME_REMOVE: - case 2: + case ENCOUNTER_FRAME_ENGAGE: + case ENCOUNTER_FRAME_DISENGAGE: + case ENCOUNTER_FRAME_UPDATE_PRIORITY: data.append(unit->GetPackGUID()); data << uint8(param1); break; - case 3: - case 4: - case 6: + case ENCOUNTER_FRAME_ADD_TIMER: + case ENCOUNTER_FRAME_ENABLE_OBJECTIVE: + case ENCOUNTER_FRAME_DISABLE_OBJECTIVE: data << uint8(param1); - data << uint8(param2); break; - case 5: + case ENCOUNTER_FRAME_UPDATE_OBJECTIVE: data << uint8(param1); + data << uint8(param2); break; - case 7: + case ENCOUNTER_FRAME_UNK7: default: break; } diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 69f11c203c1..71f1572624b 100755 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -42,8 +42,14 @@ typedef std::set MinionSet; enum EncounterFrameType { - ENCOUNTER_FRAME_ADD = 0, - ENCOUNTER_FRAME_REMOVE = 1, + ENCOUNTER_FRAME_ENGAGE = 0, + ENCOUNTER_FRAME_DISENGAGE = 1, + ENCOUNTER_FRAME_UPDATE_PRIORITY = 2, + ENCOUNTER_FRAME_ADD_TIMER = 3, + ENCOUNTER_FRAME_ENABLE_OBJECTIVE = 4, + ENCOUNTER_FRAME_UPDATE_OBJECTIVE = 5, + ENCOUNTER_FRAME_DISABLE_OBJECTIVE = 6, + ENCOUNTER_FRAME_UNK7 = 7, // Seems to have something to do with sorting the encounter units }; enum EncounterState diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index edc8d24c635..2100eb26346 100755 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -26,7 +26,8 @@ #include "SpellInfo.h" #include "Group.h" -static Rates const qualityToRate[MAX_ITEM_QUALITY] = { +static Rates const qualityToRate[MAX_ITEM_QUALITY] = +{ RATE_DROP_ITEM_POOR, // ITEM_QUALITY_POOR RATE_DROP_ITEM_NORMAL, // ITEM_QUALITY_NORMAL RATE_DROP_ITEM_UNCOMMON, // ITEM_QUALITY_UNCOMMON @@ -116,7 +117,7 @@ uint32 LootStore::LoadLootTable() uint16 lootmode = fields[3].GetUInt16(); uint8 group = fields[4].GetUInt8(); int32 mincountOrRef = fields[5].GetInt32(); - int32 maxcount = fields[6].GetInt32(); + int32 maxcount = fields[6].GetUInt8(); if (maxcount > std::numeric_limits::max()) { @@ -147,7 +148,6 @@ uint32 LootStore::LoadLootTable() // Adds current row to the template tab->second->AddEntry(storeitem); ++count; - } while (result->NextRow()); @@ -205,12 +205,12 @@ LootTemplate* LootStore::GetLootForConditionFill(uint32 loot_id) return tab->second; } -uint32 LootStore::LoadAndCollectLootIds(LootIdSet& ids_set) +uint32 LootStore::LoadAndCollectLootIds(LootIdSet& lootIdSet) { uint32 count = LoadLootTable(); for (LootTemplateMap::const_iterator tab = m_LootTemplates.begin(); tab != m_LootTemplates.end(); ++tab) - ids_set.insert(tab->first); + lootIdSet.insert(tab->first); return count; } @@ -221,10 +221,10 @@ void LootStore::CheckLootRefs(LootIdSet* ref_set) const ltItr->second->CheckLootRefs(m_LootTemplates, ref_set); } -void LootStore::ReportUnusedIds(LootIdSet const& ids_set) const +void LootStore::ReportUnusedIds(LootIdSet const& lootIdSet) const { // all still listed ids isn't referenced - for (LootIdSet::const_iterator itr = ids_set.begin(); itr != ids_set.end(); ++itr) + for (LootIdSet::const_iterator itr = lootIdSet.begin(); itr != lootIdSet.end(); ++itr) sLog->outErrorDb("Table '%s' entry %d isn't %s and not referenced from loot, and then useless.", GetName(), *itr, GetEntryName()); } @@ -296,7 +296,6 @@ bool LootStoreItem::IsValid(LootStore const& store, uint32 entry) const sLog->outErrorDb("Table '%s' entry %d item %d: max count (%u) less that min count (%i) - skipped", store.GetName(), entry, itemid, int32(maxcount), mincountOrRef); return false; } - } else // mincountOrRef < 0 { @@ -514,7 +513,9 @@ QuestItemList* Loot::FillFFALoot(Player* player) QuestItemList* Loot::FillQuestLoot(Player* player) { - if (items.size() == MAX_NR_LOOT_ITEMS) return NULL; + if (items.size() == MAX_NR_LOOT_ITEMS) + return NULL; + QuestItemList* ql = new QuestItemList(); for (uint8 i = 0; i < quest_items.size(); ++i) @@ -736,7 +737,7 @@ bool Loot::hasItemFor(Player* player) const if (q_itr != lootPlayerQuestItems.end()) { QuestItemList* q_list = q_itr->second; - for (QuestItemList::const_iterator qi = q_list->begin() ; qi != q_list->end(); ++qi) + for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi) { const LootItem &item = quest_items[qi->index]; if (!qi->is_looted && !item.is_looted) @@ -749,7 +750,7 @@ bool Loot::hasItemFor(Player* player) const if (ffa_itr != lootPlayerFFAItems.end()) { QuestItemList* ffa_list = ffa_itr->second; - for (QuestItemList::const_iterator fi = ffa_list->begin() ; fi != ffa_list->end(); ++fi) + for (QuestItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi) { const LootItem &item = items[fi->index]; if (!fi->is_looted && !item.is_looted) @@ -761,8 +762,8 @@ bool Loot::hasItemFor(Player* player) const QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(player->GetGUIDLow()); if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end()) { - QuestItemList* conditional_list = nn_itr->second; - for (QuestItemList::const_iterator ci = conditional_list->begin() ; ci != conditional_list->end(); ++ci) + QuestItemList* conditional_list = nn_itr->second; + for (QuestItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci) { const LootItem &item = items[ci->index]; if (!ci->is_looted && !item.is_looted) @@ -903,7 +904,7 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) if (q_itr != lootPlayerQuestItems.end()) { QuestItemList* q_list = q_itr->second; - for (QuestItemList::const_iterator qi = q_list->begin() ; qi != q_list->end(); ++qi) + for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi) { LootItem &item = l.quest_items[qi->index]; if (!qi->is_looted && !item.is_looted) @@ -921,7 +922,7 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) if (ffa_itr != lootPlayerFFAItems.end()) { QuestItemList* ffa_list = ffa_itr->second; - for (QuestItemList::const_iterator fi = ffa_list->begin() ; fi != ffa_list->end(); ++fi) + for (QuestItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi) { LootItem &item = l.items[fi->index]; if (!fi->is_looted && !item.is_looted) @@ -938,8 +939,8 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(lv.viewer->GetGUIDLow()); if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end()) { - QuestItemList* conditional_list = nn_itr->second; - for (QuestItemList::const_iterator ci = conditional_list->begin() ; ci != conditional_list->end(); ++ci) + QuestItemList* conditional_list = nn_itr->second; + for (QuestItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci) { LootItem &item = l.items[ci->index]; if (!ci->is_looted && !item.is_looted) @@ -1288,7 +1289,7 @@ bool LootTemplate::HasQuestDrop(LootTemplateMap const& store, uint8 groupId) con } // Now processing groups - for (LootGroups::const_iterator i = Groups.begin() ; i != Groups.end(); ++i) + for (LootGroups::const_iterator i = Groups.begin(); i != Groups.end(); ++i) if (i->HasQuestDrop()) return true; @@ -1306,7 +1307,7 @@ bool LootTemplate::HasQuestDropForPlayer(LootTemplateMap const& store, Player co } // Checking non-grouped entries - for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end(); ++i) + for (LootStoreItemList::const_iterator i = Entries.begin(); i != Entries.end(); ++i) { if (i->mincountOrRef < 0) // References processing { @@ -1421,8 +1422,8 @@ void LoadLootTemplates_Creature() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set, ids_setUsed; - uint32 count = LootTemplates_Creature.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet, lootIdSetUsed; + uint32 count = LootTemplates_Creature.LoadAndCollectLootIds(lootIdSet); // Remove real entries and check loot existence CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates(); @@ -1430,18 +1431,18 @@ void LoadLootTemplates_Creature() { if (uint32 lootid = itr->second.lootid) { - if (ids_set.find(lootid) == ids_set.end()) + if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Creature.ReportNotExistedId(lootid); else - ids_setUsed.insert(lootid); + lootIdSetUsed.insert(lootid); } } - for (LootIdSet::const_iterator itr = ids_setUsed.begin(); itr != ids_setUsed.end(); ++itr) - ids_set.erase(*itr); + for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr) + lootIdSet.erase(*itr); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Creature.ReportUnusedIds(ids_set); + LootTemplates_Creature.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u creature loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1457,7 +1458,7 @@ void LoadLootTemplates_Disenchant() uint32 oldMSTime = getMSTime(); - LootIdSet lootIdSet, loodIdSetUsed; + LootIdSet lootIdSet, lootIdSetUsed; uint32 count = LootTemplates_Disenchant.LoadAndCollectLootIds(lootIdSet); for (uint32 i = 0; i < sItemDisenchantLootStore.GetNumRows(); ++i) @@ -1470,10 +1471,10 @@ void LoadLootTemplates_Disenchant() if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Disenchant.ReportNotExistedId(lootid); else - loodIdSetUsed.insert(lootid); + lootIdSetUsed.insert(lootid); } - for (LootIdSet::const_iterator itr = loodIdSetUsed.begin(); itr != loodIdSetUsed.end(); ++itr) + for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr) lootIdSet.erase(*itr); // output error for any still listed (not referenced from appropriate table) ids @@ -1492,17 +1493,17 @@ void LoadLootTemplates_Fishing() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot for (uint32 i = 1; i < sAreaStore.GetNumRows(); ++i) if (AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(i)) - if (ids_set.find(areaEntry->ID) != ids_set.end()) - ids_set.erase(areaEntry->ID); + if (lootIdSet.find(areaEntry->ID) != lootIdSet.end()) + lootIdSet.erase(areaEntry->ID); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Fishing.ReportUnusedIds(ids_set); + LootTemplates_Fishing.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u fishing loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1518,8 +1519,8 @@ void LoadLootTemplates_Gameobject() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set, ids_setUsed; - uint32 count = LootTemplates_Gameobject.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet, lootIdSetUsed; + uint32 count = LootTemplates_Gameobject.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates(); @@ -1527,18 +1528,18 @@ void LoadLootTemplates_Gameobject() { if (uint32 lootid = itr->second.GetLootId()) { - if (sObjectMgr->IsGoOfSpecificEntrySpawned(itr->second.entry) && ids_set.find(lootid) == ids_set.end()) + if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Gameobject.ReportNotExistedId(lootid); else - ids_setUsed.insert(lootid); + lootIdSetUsed.insert(lootid); } } - for (LootIdSet::const_iterator itr = ids_setUsed.begin(); itr != ids_setUsed.end(); ++itr) - ids_set.erase(*itr); + for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr) + lootIdSet.erase(*itr); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Gameobject.ReportUnusedIds(ids_set); + LootTemplates_Gameobject.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u gameobject loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1554,17 +1555,17 @@ void LoadLootTemplates_Item() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - uint32 count = LootTemplates_Item.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + uint32 count = LootTemplates_Item.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) - if (ids_set.find(itr->second.ItemId) != ids_set.end() && itr->second.Flags & ITEM_PROTO_FLAG_OPENABLE) - ids_set.erase(itr->second.ItemId); + if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end() && itr->second.Flags & ITEM_PROTO_FLAG_OPENABLE) + lootIdSet.erase(itr->second.ItemId); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Item.ReportUnusedIds(ids_set); + LootTemplates_Item.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u prospecting loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1580,8 +1581,8 @@ void LoadLootTemplates_Milling() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - uint32 count = LootTemplates_Milling.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + uint32 count = LootTemplates_Milling.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); @@ -1590,12 +1591,12 @@ void LoadLootTemplates_Milling() if (!(itr->second.Flags & ITEM_PROTO_FLAG_MILLABLE)) continue; - if (ids_set.find(itr->second.ItemId) != ids_set.end()) - ids_set.erase(itr->second.ItemId); + if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end()) + lootIdSet.erase(itr->second.ItemId); } // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Milling.ReportUnusedIds(ids_set); + LootTemplates_Milling.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u milling loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1611,8 +1612,8 @@ void LoadLootTemplates_Pickpocketing() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set, ids_setUsed; - uint32 count = LootTemplates_Pickpocketing.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet, lootIdSetUsed; + uint32 count = LootTemplates_Pickpocketing.LoadAndCollectLootIds(lootIdSet); // Remove real entries and check loot existence CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates(); @@ -1620,18 +1621,18 @@ void LoadLootTemplates_Pickpocketing() { if (uint32 lootid = itr->second.pickpocketLootId) { - if (ids_set.find(lootid) == ids_set.end()) + if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Pickpocketing.ReportNotExistedId(lootid); else - ids_setUsed.insert(lootid); + lootIdSetUsed.insert(lootid); } } - for (LootIdSet::const_iterator itr = ids_setUsed.begin(); itr != ids_setUsed.end(); ++itr) - ids_set.erase(*itr); + for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr) + lootIdSet.erase(*itr); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Pickpocketing.ReportUnusedIds(ids_set); + LootTemplates_Pickpocketing.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u pickpocketing loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1647,8 +1648,8 @@ void LoadLootTemplates_Prospecting() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - uint32 count = LootTemplates_Prospecting.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + uint32 count = LootTemplates_Prospecting.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); @@ -1657,12 +1658,12 @@ void LoadLootTemplates_Prospecting() if (!(itr->second.Flags & ITEM_PROTO_FLAG_PROSPECTABLE)) continue; - if (ids_set.find(itr->second.ItemId) != ids_set.end()) - ids_set.erase(itr->second.ItemId); + if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end()) + lootIdSet.erase(itr->second.ItemId); } // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Prospecting.ReportUnusedIds(ids_set); + LootTemplates_Prospecting.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u prospecting loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1678,17 +1679,17 @@ void LoadLootTemplates_Mail() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - uint32 count = LootTemplates_Mail.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + uint32 count = LootTemplates_Mail.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot for (uint32 i = 1; i < sMailTemplateStore.GetNumRows(); ++i) if (sMailTemplateStore.LookupEntry(i)) - if (ids_set.find(i) != ids_set.end()) - ids_set.erase(i); + if (lootIdSet.find(i) != lootIdSet.end()) + lootIdSet.erase(i); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Mail.ReportUnusedIds(ids_set); + LootTemplates_Mail.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u mail loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1704,8 +1705,8 @@ void LoadLootTemplates_Skinning() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set, ids_setUsed; - uint32 count = LootTemplates_Skinning.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet, lootIdSetUsed; + uint32 count = LootTemplates_Skinning.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates(); @@ -1713,18 +1714,18 @@ void LoadLootTemplates_Skinning() { if (uint32 lootid = itr->second.SkinLootId) { - if (ids_set.find(lootid) == ids_set.end()) + if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Skinning.ReportNotExistedId(lootid); else - ids_setUsed.insert(lootid); + lootIdSetUsed.insert(lootid); } } - for (LootIdSet::const_iterator itr = ids_setUsed.begin(); itr != ids_setUsed.end(); ++itr) - ids_set.erase(*itr); + for (LootIdSet::const_iterator itr = lootIdSetUsed.begin(); itr != lootIdSetUsed.end(); ++itr) + lootIdSet.erase(*itr); // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Skinning.ReportUnusedIds(ids_set); + LootTemplates_Skinning.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u skinning loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1740,8 +1741,8 @@ void LoadLootTemplates_Spell() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - uint32 count = LootTemplates_Spell.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + uint32 count = LootTemplates_Spell.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot for (uint32 spell_id = 1; spell_id < sSpellMgr->GetSpellInfoStoreSize(); ++spell_id) @@ -1754,7 +1755,7 @@ void LoadLootTemplates_Spell() if (!spellInfo->IsLootCrafting()) continue; - if (ids_set.find(spell_id) == ids_set.end()) + if (lootIdSet.find(spell_id) == lootIdSet.end()) { // not report about not trainable spells (optionally supported by DB) // ignore 61756 (Northrend Inscription Research (FAST QA VERSION) for example @@ -1764,11 +1765,11 @@ void LoadLootTemplates_Spell() } } else - ids_set.erase(spell_id); + lootIdSet.erase(spell_id); } // output error for any still listed (not referenced from appropriate table) ids - LootTemplates_Spell.ReportUnusedIds(ids_set); + LootTemplates_Spell.ReportUnusedIds(lootIdSet); if (count) sLog->outString(">> Loaded %u spell loot templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -1783,24 +1784,24 @@ void LoadLootTemplates_Reference() uint32 oldMSTime = getMSTime(); - LootIdSet ids_set; - LootTemplates_Reference.LoadAndCollectLootIds(ids_set); + LootIdSet lootIdSet; + LootTemplates_Reference.LoadAndCollectLootIds(lootIdSet); // check references and remove used - LootTemplates_Creature.CheckLootRefs(&ids_set); - LootTemplates_Fishing.CheckLootRefs(&ids_set); - LootTemplates_Gameobject.CheckLootRefs(&ids_set); - LootTemplates_Item.CheckLootRefs(&ids_set); - LootTemplates_Milling.CheckLootRefs(&ids_set); - LootTemplates_Pickpocketing.CheckLootRefs(&ids_set); - LootTemplates_Skinning.CheckLootRefs(&ids_set); - LootTemplates_Disenchant.CheckLootRefs(&ids_set); - LootTemplates_Prospecting.CheckLootRefs(&ids_set); - LootTemplates_Mail.CheckLootRefs(&ids_set); - LootTemplates_Reference.CheckLootRefs(&ids_set); + LootTemplates_Creature.CheckLootRefs(&lootIdSet); + LootTemplates_Fishing.CheckLootRefs(&lootIdSet); + LootTemplates_Gameobject.CheckLootRefs(&lootIdSet); + LootTemplates_Item.CheckLootRefs(&lootIdSet); + LootTemplates_Milling.CheckLootRefs(&lootIdSet); + LootTemplates_Pickpocketing.CheckLootRefs(&lootIdSet); + LootTemplates_Skinning.CheckLootRefs(&lootIdSet); + LootTemplates_Disenchant.CheckLootRefs(&lootIdSet); + LootTemplates_Prospecting.CheckLootRefs(&lootIdSet); + LootTemplates_Mail.CheckLootRefs(&lootIdSet); + LootTemplates_Reference.CheckLootRefs(&lootIdSet); // output error for any still listed ids (not referenced from any loot table) - LootTemplates_Reference.ReportUnusedIds(ids_set); + LootTemplates_Reference.ReportUnusedIds(lootIdSet); sLog->outString(">> Loaded refence loot templates in %u ms", GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h index 6615d59160a..dbd03bd96ee 100755 --- a/src/server/game/Mails/Mail.h +++ b/src/server/game/Mails/Mail.h @@ -15,6 +15,7 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ + #ifndef TRINITY_MAIL_H #define TRINITY_MAIL_H diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 81b4f958e5d..073ceae5b62 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -32,6 +32,7 @@ #include "Group.h" #include "LFGMgr.h" #include "DynamicTree.h" +#include "Vehicle.h" union u_map_magic { @@ -40,7 +41,7 @@ union u_map_magic }; u_map_magic MapMagic = { {'M','A','P','S'} }; -u_map_magic MapVersionMagic = { {'v','1','.','1'} }; +u_map_magic MapVersionMagic = { {'v','1','.','2'} }; u_map_magic MapAreaMagic = { {'A','R','E','A'} }; u_map_magic MapHeightMagic = { {'M','H','G','T'} }; u_map_magic MapLiquidMagic = { {'M','L','I','Q'} }; @@ -492,6 +493,7 @@ void Map::VisitNearbyCellsOf(WorldObject* obj, TypeContainerVisitorIsInWorld()) { //player->Update(t_diff); - WorldSession* pSession = player->GetSession(); - MapSessionFilter updater(pSession); - pSession->Update(t_diff, updater); + WorldSession* session = player->GetSession(); + MapSessionFilter updater(session); + session->Update(t_diff, updater); } } /// update active cells around players and active objects @@ -701,7 +703,15 @@ void Map::PlayerRelocation(Player* player, float x, float y, float z, float orie Cell old_cell(player->GetPositionX(), player->GetPositionY()); Cell new_cell(x, y); + //! If hovering, always increase our server-side Z position + //! Client automatically projects correct position based on Z coord sent in monster move + //! and UNIT_FIELD_HOVERHEIGHT sent in object updates + if (player->HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) + z += player->GetFloatValue(UNIT_FIELD_HOVERHEIGHT); + player->Relocate(x, y, z, orientation); + if (player->IsVehicle()) + player->GetVehicleKit()->RelocatePassengers(x, y, z, orientation); if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell)) { @@ -728,6 +738,12 @@ void Map::CreatureRelocation(Creature* creature, float x, float y, float z, floa if (!respawnRelocationOnFail && !getNGrid(new_cell.GridX(), new_cell.GridY())) return; + //! If hovering, always increase our server-side Z position + //! Client automatically projects correct position based on Z coord sent in monster move + //! and UNIT_FIELD_HOVERHEIGHT sent in object updates + if (creature->HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) + z += creature->GetFloatValue(UNIT_FIELD_HOVERHEIGHT); + // delay creature move for grid/cell to grid/cell moves if (old_cell.DiffCell(new_cell) || old_cell.DiffGrid(new_cell)) { @@ -740,6 +756,8 @@ void Map::CreatureRelocation(Creature* creature, float x, float y, float z, floa else { creature->Relocate(x, y, z, ang); + if (creature->IsVehicle()) + creature->GetVehicleKit()->RelocatePassengers(x, y, z, ang); creature->UpdateObjectVisibility(false); RemoveCreatureFromMoveList(creature); } @@ -769,20 +787,20 @@ void Map::RemoveCreatureFromMoveList(Creature* c) void Map::MoveAllCreaturesInMoveList() { _creatureToMoveLock = true; - for(std::vector::iterator itr = _creaturesToMove.begin(); itr != _creaturesToMove.end(); ++itr) + for (std::vector::iterator itr = _creaturesToMove.begin(); itr != _creaturesToMove.end(); ++itr) { Creature* c = *itr; - if(c->FindMap() != this) //pet is teleported to another map + if (c->FindMap() != this) //pet is teleported to another map continue; - if(c->_moveState != CREATURE_CELL_MOVE_ACTIVE) + if (c->_moveState != CREATURE_CELL_MOVE_ACTIVE) { c->_moveState = CREATURE_CELL_MOVE_NONE; continue; } c->_moveState = CREATURE_CELL_MOVE_NONE; - if(!c->IsInWorld()) + if (!c->IsInWorld()) continue; // do move or do move to respawn or remove creature if previous all fail @@ -1039,7 +1057,8 @@ GridMap::GridMap() _liquidWidth = 0; _liquidHeight = 0; _liquidLevel = INVALID_HEIGHT; - _liquidData = NULL; + _liquidEntry = NULL; + _liquidFlags = NULL; _liquidMap = NULL; } @@ -1101,12 +1120,14 @@ void GridMap::unloadData() delete[] _areaMap; delete[] m_V9; delete[] m_V8; - delete[] _liquidData; + delete[] _liquidEntry; + delete[] _liquidFlags; delete[] _liquidMap; _areaMap = NULL; m_V9 = NULL; m_V8 = NULL; - _liquidData = NULL; + _liquidEntry = NULL; + _liquidFlags = NULL; _liquidMap = NULL; _gridGetHeight = &GridMap::getHeightFromFlat; } @@ -1187,18 +1208,22 @@ bool GridMap::loadLiquidData(FILE* in, uint32 offset, uint32 /*size*/) _liquidOffX = header.offsetX; _liquidOffY = header.offsetY; _liquidWidth = header.width; - _liquidHeight= header.height; + _liquidHeight = header.height; _liquidLevel = header.liquidLevel; if (!(header.flags & MAP_LIQUID_NO_TYPE)) { - _liquidData = new uint8 [16*16]; - if (fread(_liquidData, sizeof(uint8), 16*16, in) != 16*16) + _liquidEntry = new uint16[16*16]; + if (fread(_liquidEntry, sizeof(uint16), 16*16, in) != 16*16) + return false; + + _liquidFlags = new uint8[16*16]; + if (fread(_liquidFlags, sizeof(uint8), 16*16, in) != 16*16) return false; } if (!(header.flags & MAP_LIQUID_NO_HEIGHT)) { - _liquidMap = new float [_liquidWidth*_liquidHeight]; + _liquidMap = new float[_liquidWidth*_liquidHeight]; if (fread(_liquidMap, sizeof(float), _liquidWidth*_liquidHeight, in) != _liquidWidth*_liquidHeight) return false; } @@ -1457,23 +1482,24 @@ float GridMap::getLiquidLevel(float x, float y) return _liquidMap[cx_int*_liquidWidth + cy_int]; } +// Why does this return LIQUID data? uint8 GridMap::getTerrainType(float x, float y) { - if (!_liquidData) + if (!_liquidFlags) return 0; x = 16 * (32 - x/SIZE_OF_GRIDS); y = 16 * (32 - y/SIZE_OF_GRIDS); int lx = (int)x & 15; int ly = (int)y & 15; - return _liquidData[lx*16 + ly]; + return _liquidFlags[lx*16 + ly]; } // Get water state on map inline ZLiquidStatus GridMap::getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data) { // Check water type (if no water return) - if (!_liquidType && !_liquidData) + if (!_liquidType && !_liquidFlags) return LIQUID_MAP_NO_WATER; // Get cell @@ -1484,7 +1510,40 @@ inline ZLiquidStatus GridMap::getLiquidStatus(float x, float y, float z, uint8 R int y_int = (int)cy & (MAP_RESOLUTION-1); // Check water type in cell - uint8 type = _liquidData ? _liquidData[(x_int>>3)*16 + (y_int>>3)] : _liquidType; + int idx=(x_int>>3)*16 + (y_int>>3); + uint8 type = _liquidFlags ? _liquidFlags[idx] : _liquidType; + uint32 entry = 0; + if (_liquidEntry) + { + if (LiquidTypeEntry const* liquidEntry = sLiquidTypeStore.LookupEntry(_liquidEntry[idx])) + { + entry = liquidEntry->Id; + type &= MAP_LIQUID_TYPE_DARK_WATER; + uint32 liqTypeIdx = liquidEntry->Type; + if (entry < 21) + { + if (AreaTableEntry const* area = GetAreaEntryByAreaFlagAndMap(getArea(x, y), MAPID_INVALID)) + { + uint32 overrideLiquid = area->LiquidTypeOverride[liquidEntry->Type]; + if (!overrideLiquid && area->zone) + { + area = GetAreaEntryByAreaID(area->zone); + if (area) + overrideLiquid = area->LiquidTypeOverride[liquidEntry->Type]; + } + + if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(overrideLiquid)) + { + entry = overrideLiquid; + liqTypeIdx = liq->Type; + } + } + } + + type |= 1 << liqTypeIdx; + } + } + if (type == 0) return LIQUID_MAP_NO_WATER; @@ -1513,20 +1572,20 @@ inline ZLiquidStatus GridMap::getLiquidStatus(float x, float y, float z, uint8 R // All ok in water -> store data if (data) { - data->type = type; + data->entry = entry; + data->type_flags = type; data->level = liquid_level; data->depth_level = ground_level; } // For speed check as int values - int delta = int((liquid_level - z) * 10); + float delta = liquid_level - z; - // Get position delta - if (delta > 20) // Under water + if (delta > 2.0f) // Under water return LIQUID_MAP_UNDER_WATER; - if (delta > 0) // In water + if (delta > 0.0f) // In water return LIQUID_MAP_IN_WATER; - if (delta > -1) // Walk on water + if (delta > -0.1f) // Walk on water return LIQUID_MAP_WATER_WALK; // Above water return LIQUID_MAP_ABOVE_WATER; @@ -1717,8 +1776,9 @@ ZLiquidStatus Map::getLiquidStatus(float x, float y, float z, uint8 ReqLiquidTyp { ZLiquidStatus result = LIQUID_MAP_NO_WATER; VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); - float liquid_level, ground_level = INVALID_HEIGHT; - uint32 liquid_type; + float liquid_level = INVALID_HEIGHT; + float ground_level = INVALID_HEIGHT; + uint32 liquid_type = 0; if (vmgr->GetLiquidLevel(GetId(), x, y, z, ReqLiquidType, liquid_level, ground_level, liquid_type)) { sLog->outDebug(LOG_FILTER_MAPS, "getLiquidStatus(): vmap liquid level: %f ground: %f type: %u", liquid_level, ground_level, liquid_type); @@ -1728,20 +1788,49 @@ ZLiquidStatus Map::getLiquidStatus(float x, float y, float z, uint8 ReqLiquidTyp // All ok in water -> store data if (data) { - data->type = liquid_type; + // hardcoded in client like this + if (GetId() == 530 && liquid_type == 2) + liquid_type = 15; + + uint32 liquidFlagType = 0; + if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquid_type)) + liquidFlagType = liq->Type; + + if (liquid_type && liquid_type < 21) + { + if (AreaTableEntry const* area = GetAreaEntryByAreaFlagAndMap(GetAreaFlag(x, y, z), GetId())) + { + uint32 overrideLiquid = area->LiquidTypeOverride[liquidFlagType]; + if (!overrideLiquid && area->zone) + { + area = GetAreaEntryByAreaID(area->zone); + if (area) + overrideLiquid = area->LiquidTypeOverride[liquidFlagType]; + } + + if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(overrideLiquid)) + { + liquid_type = overrideLiquid; + liquidFlagType = liq->Type; + } + } + } + data->level = liquid_level; data->depth_level = ground_level; + + data->entry = liquid_type; + data->type_flags = 1 << liquidFlagType; } - // For speed check as int values - int delta = int((liquid_level - z) * 10); + float delta = liquid_level - z; // Get position delta - if (delta > 20) // Under water + if (delta > 2.0f) // Under water return LIQUID_MAP_UNDER_WATER; - if (delta > 0 ) // In water + if (delta > 0.0f) // In water return LIQUID_MAP_IN_WATER; - if (delta > -1) // Walk on water + if (delta > -0.1f) // Walk on water return LIQUID_MAP_WATER_WALK; result = LIQUID_MAP_ABOVE_WATER; } @@ -1755,7 +1844,13 @@ ZLiquidStatus Map::getLiquidStatus(float x, float y, float z, uint8 ReqLiquidTyp if (map_result != LIQUID_MAP_NO_WATER && (map_data.level > ground_level)) { if (data) + { + // hardcoded in client like this + if (GetId() == 530 && map_data.entry == 2) + map_data.entry = 15; + *data = map_data; + } return map_result; } } @@ -2260,7 +2355,7 @@ bool InstanceMap::CanEnter(Player* player) return false; } // player inside instance has no group or his groups is different to entering player's one, deny entry - if (!iPlayer->GetGroup() || iPlayer->GetGroup() != player->GetGroup() ) + if (!iPlayer->GetGroup() || iPlayer->GetGroup() != player->GetGroup()) { player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS); return false; @@ -2376,7 +2471,7 @@ bool InstanceMap::AddPlayerToMap(Player* player) if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true)) if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId)) if (LFGDungeonEntry const* randomDungeon = sLFGDungeonStore.LookupEntry(*(sLFGMgr->GetSelectedDungeons(player->GetGUID()).begin()))) - if (uint32(dungeon->map) == GetId() && dungeon->difficulty == GetDifficulty() && randomDungeon->type == LFG_TYPE_RANDOM) + if (uint32(dungeon->map) == GetId() && dungeon->difficulty == uint32(GetDifficulty()) && randomDungeon->type == uint32(LFG_TYPE_RANDOM)) player->CastSpell(player, LFG_SPELL_LUCK_OF_THE_DRAW, true); } @@ -2439,7 +2534,11 @@ void InstanceMap::CreateInstanceData(bool load) if (load) { // TODO: make a global storage for this - QueryResult result = CharacterDatabase.PQuery("SELECT data, completedEncounters FROM instance WHERE map = '%u' AND id = '%u'", GetId(), i_InstanceId); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_INSTANCE); + stmt->setUInt16(0, uint16(GetId())); + stmt->setUInt32(1, i_InstanceId); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { Field* fields = result->Fetch(); @@ -2519,6 +2618,8 @@ void InstanceMap::PermBindAllPlayers(Player* source) WorldPacket data(SMSG_INSTANCE_SAVE_CREATED, 4); data << uint32(0); player->GetSession()->SendPacket(&data); + + player->GetSession()->SendCalendarRaidLockout(save, true); } // if the leader is not in the instance the group will not get a perm bind diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index d8db4c947a3..6ba08646f25 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -136,7 +136,8 @@ enum ZLiquidStatus struct LiquidData { - uint32 type; + uint32 type_flags; + uint32 entry; float level; float depth_level; }; @@ -163,7 +164,8 @@ class GridMap // Liquid data float _liquidLevel; - uint8* _liquidData; + uint16* _liquidEntry; + uint8* _liquidFlags; float* _liquidMap; uint16 _gridArea; uint16 _liquidType; @@ -226,7 +228,7 @@ enum LevelRequirementVsMode #define MAX_HEIGHT 100000.0f // can be use for find ground height at surface #define INVALID_HEIGHT -100000.0f // for check, must be equal to VMAP_INVALID_HEIGHT, real value for unknown height is VMAP_INVALID_HEIGHT_VALUE #define MAX_FALL_DISTANCE 250000.0f // "unlimited fall" to find VMap ground if it is available, just larger than MAX_HEIGHT - INVALID_HEIGHT -#define DEFAULT_HEIGHT_SEARCH 10.0f // default search distance to find height at nearby locations +#define DEFAULT_HEIGHT_SEARCH 50.0f // default search distance to find height at nearby locations #define MIN_UNLOAD_DELAY 1 // immediate unload typedef std::map CreatureGroupHolderType; @@ -243,8 +245,12 @@ class Map : public GridRefManager // currently unused for normal maps bool CanUnload(uint32 diff) { - if (!m_unloadTimer) return false; - if (m_unloadTimer <= diff) return true; + if (!m_unloadTimer) + return false; + + if (m_unloadTimer <= diff) + return true; + m_unloadTimer -= diff; return false; } diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index fbe609bee23..5543251e115 100755 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -116,19 +116,21 @@ Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player) return NULL; Map* map = NULL; - uint32 NewInstanceId = 0; // instanceId of the resulting map + uint32 newInstanceId = 0; // instanceId of the resulting map if (IsBattlegroundOrArena()) { // instantiate or find existing bg map for player // the instance id is set in battlegroundid - NewInstanceId = player->GetBattlegroundId(); - if (!NewInstanceId) return NULL; - map = sMapMgr->FindMap(mapId, NewInstanceId); + newInstanceId = player->GetBattlegroundId(); + if (!newInstanceId) + return NULL; + + map = sMapMgr->FindMap(mapId, newInstanceId); if (!map) { if (Battleground* bg = player->GetBattleground()) - map = CreateBattleground(NewInstanceId, bg); + map = CreateBattleground(newInstanceId, bg); else { player->TeleportToBGEntryPoint(); @@ -158,24 +160,24 @@ Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player) if (pSave) { // solo/perm/group - NewInstanceId = pSave->GetInstanceId(); - map = FindInstanceMap(NewInstanceId); + newInstanceId = pSave->GetInstanceId(); + map = FindInstanceMap(newInstanceId); // it is possible that the save exists but the map doesn't if (!map) - map = CreateInstance(NewInstanceId, pSave, pSave->GetDifficulty()); + map = CreateInstance(newInstanceId, pSave, pSave->GetDifficulty()); } else { // if no instanceId via group members or instance saves is found // the instance will be created for the first time - NewInstanceId = sMapMgr->GenerateInstanceId(); + newInstanceId = sMapMgr->GenerateInstanceId(); Difficulty diff = player->GetGroup() ? player->GetGroup()->GetDifficulty(IsRaid()) : player->GetDifficulty(IsRaid()); //Seems it is now possible, but I do not know if it should be allowed //ASSERT(!FindInstanceMap(NewInstanceId)); - map = FindInstanceMap(NewInstanceId); + map = FindInstanceMap(newInstanceId); if (!map) - map = CreateInstance(NewInstanceId, NULL, diff); + map = CreateInstance(newInstanceId, NULL, diff); } } diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 6890ec8ac2e..ce93fe5af1a 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -96,32 +96,32 @@ void MapManager::checkAndCorrectGridStatesArray() Map* MapManager::CreateBaseMap(uint32 id) { - Map* m = FindBaseMap(id); + Map* map = FindBaseMap(id); - if (m == NULL) + if (map == NULL) { TRINITY_GUARD(ACE_Thread_Mutex, Lock); const MapEntry* entry = sMapStore.LookupEntry(id); if (entry && entry->Instanceable()) { - m = new MapInstanced(id, i_gridCleanUpDelay); + map = new MapInstanced(id, i_gridCleanUpDelay); } else { - m = new Map(id, i_gridCleanUpDelay, 0, REGULAR_DIFFICULTY); + map = new Map(id, i_gridCleanUpDelay, 0, REGULAR_DIFFICULTY); } - i_maps[id] = m; + i_maps[id] = map; } - ASSERT(m != NULL); - return m; + ASSERT(map); + return map; } Map* MapManager::FindBaseNonInstanceMap(uint32 mapId) const { Map* map = FindBaseMap(mapId); - if(map && map->Instanceable()) + if (map && map->Instanceable()) return NULL; return map; } diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index 80025680753..b747d065a14 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -52,7 +52,7 @@ class MapUpdateRequest : public ACE_Method_Request virtual int call() { m_map.Update (m_diff); - m_updater.update_finished (); + m_updater.update_finished(); return 0; } }; diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 27397837265..dacd9962251 100755 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -165,8 +165,8 @@ namespace Trinity if (u->GetTypeId() == TYPEID_UNIT && (((Creature*)u)->isTotem() || ((Creature*)u)->isPet() || - (((Creature*)u)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) || - ((Creature*)u)->GetCreatureInfo()->type == CREATURE_TYPE_CRITTER)) + (((Creature*)u)->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) || + ((Creature*)u)->GetCreatureTemplate()->type == CREATURE_TYPE_CRITTER)) gain = 0; else { diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index e751dbf92fe..aec72835d86 100755 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -522,8 +522,11 @@ enum TrinityStrings LANG_YOURS_EXPLORE_SET_ALL = 553, LANG_YOURS_EXPLORE_SET_NOTHING = 554, - LANG_HOVER_ENABLED = 555, - LANG_HOVER_DISABLED = 556, + LANG_NPC_SETDATA = 555, + + //! Old ones now free: + // LANG_HOVER_DISABLED = 556, + LANG_YOURS_LEVEL_UP = 557, LANG_YOURS_LEVEL_DOWN = 558, LANG_YOURS_LEVEL_PROGRESS_RESET = 559, @@ -811,7 +814,9 @@ enum TrinityStrings LANG_MOVEGENS_FOLLOW_CREATURE = 1140, LANG_MOVEGENS_FOLLOW_NULL = 1141, LANG_MOVEGENS_EFFECT = 1142, - // Room for more level 3 1143-1199 not used + LANG_MOVEFLAGS_GET = 1143, + LANG_MOVEFLAGS_SET = 1144, + // Room for more level 3 1144-1199 not used // Debug commands LANG_CINEMATIC_NOT_EXIST = 1200, diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index f1ebfb6ec96..7b77ecaa17e 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -258,7 +258,8 @@ enum SpellCategory SPELL_CATEGORY_DRINK = 59, }; -const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { +const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = +{ 0xff9d9d9d, //GREY 0xffffffff, //WHITE 0xff1eff00, //GREEN @@ -278,7 +279,7 @@ enum SpellAttr0 SPELL_ATTR0_UNK0 = 0x00000001, // 0 SPELL_ATTR0_REQ_AMMO = 0x00000002, // 1 on next ranged SPELL_ATTR0_ON_NEXT_SWING = 0x00000004, // 2 - SPELL_ATTR0_UNK3 = 0x00000008, // 3 not set in 3.0.3 + SPELL_ATTR0_IS_REPLENISHMENT = 0x00000008, // 3 not set in 3.0.3 SPELL_ATTR0_ABILITY = 0x00000010, // 4 client puts 'ability' instead of 'spell' in game strings for these spells SPELL_ATTR0_TRADESPELL = 0x00000020, // 5 trade spells (recipes), will be added by client to a sublist of profession spell SPELL_ATTR0_PASSIVE = 0x00000040, // 6 Passive spell @@ -323,7 +324,7 @@ enum SpellAttr1 SPELL_ATTR1_MELEE_COMBAT_START = 0x00000200, // 9 player starts melee combat after this spell is cast SPELL_ATTR1_NO_THREAT = 0x00000400, // 10 no generates threat on cast 100% (old NO_INITIAL_AGGRO) SPELL_ATTR1_UNK11 = 0x00000800, // 11 aura - SPELL_ATTR1_UNK12 = 0x00001000, // 12 pickpoket + SPELL_ATTR1_IS_PICKPOCKET = 0x00001000, // 12 Pickpocket SPELL_ATTR1_FARSIGHT = 0x00002000, // 13 Client removes farsight on aura loss SPELL_ATTR1_CHANNEL_TRACK_TARGET = 0x00004000, // 14 Client automatically forces player to face target when channeling SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY = 0x00008000, // 15 remove auras on immunity @@ -335,7 +336,7 @@ enum SpellAttr1 SPELL_ATTR1_UNK21 = 0x00200000, // 21 SPELL_ATTR1_REQ_COMBO_POINTS2 = 0x00400000, // 22 Req combo points on target SPELL_ATTR1_UNK23 = 0x00800000, // 23 - SPELL_ATTR1_UNK24 = 0x01000000, // 24 only fishing spells + SPELL_ATTR1_IS_FISHING = 0x01000000, // 24 only fishing spells SPELL_ATTR1_UNK25 = 0x02000000, // 25 SPELL_ATTR1_UNK26 = 0x04000000, // 26 works correctly with [target=focus] and [target=mouseover] macros? SPELL_ATTR1_UNK27 = 0x08000000, // 27 melee spell? @@ -360,17 +361,17 @@ enum SpellAttr2 SPELL_ATTR2_UNK10 = 0x00000400, // 10 related to tame SPELL_ATTR2_HEALTH_FUNNEL = 0x00000800, // 11 SPELL_ATTR2_UNK12 = 0x00001000, // 12 Cleave, Heart Strike, Maul, Sunder Armor, Swipe - SPELL_ATTR2_UNK13 = 0x00002000, // 13 Items enchanted by spells with this flag preserve the enchant to arenas + SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA = 0x00002000, // 13 Items enchanted by spells with this flag preserve the enchant to arenas SPELL_ATTR2_UNK14 = 0x00004000, // 14 SPELL_ATTR2_UNK15 = 0x00008000, // 15 not set in 3.0.3 SPELL_ATTR2_TAME_BEAST = 0x00010000, // 16 SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS = 0x00020000, // 17 don't reset timers for melee autoattacks (swings) or ranged autoattacks (autoshoots) - SPELL_ATTR2_UNK18 = 0x00040000, // 18 Only Revive pet - possible req dead pet + SPELL_ATTR2_REQ_DEAD_PET = 0x00040000, // 18 Only Revive pet and Heart of the Pheonix SPELL_ATTR2_NOT_NEED_SHAPESHIFT = 0x00080000, // 19 does not necessarly need shapeshift SPELL_ATTR2_UNK20 = 0x00100000, // 20 SPELL_ATTR2_DAMAGE_REDUCED_SHIELD = 0x00200000, // 21 for ice blocks, pala immunity buffs, priest absorb shields, but used also for other spells -> not sure! SPELL_ATTR2_UNK22 = 0x00400000, // 22 Ambush, Backstab, Cheap Shot, Death Grip, Garrote, Judgements, Mutilate, Pounce, Ravage, Shiv, Shred - SPELL_ATTR2_UNK23 = 0x00800000, // 23 Only mage Arcane Concentration have this flag + SPELL_ATTR2_IS_ARCANE_CONCENTRATION = 0x00800000, // 23 Only mage Arcane Concentration have this flag SPELL_ATTR2_UNK24 = 0x01000000, // 24 SPELL_ATTR2_UNK25 = 0x02000000, // 25 SPELL_ATTR2_UNK26 = 0x04000000, // 26 unaffected by school immunity @@ -397,7 +398,7 @@ enum SpellAttr3 SPELL_ATTR3_BATTLEGROUND = 0x00000800, // 11 Can casted only on battleground SPELL_ATTR3_ONLY_TARGET_GHOSTS = 0x00001000, // 12 SPELL_ATTR3_UNK13 = 0x00002000, // 13 - SPELL_ATTR3_UNK14 = 0x00004000, // 14 "Honorless Target" only this spells have this flag + SPELL_ATTR3_IS_HONORLESS_TARGET = 0x00004000, // 14 "Honorless Target" only this spells have this flag SPELL_ATTR3_UNK15 = 0x00008000, // 15 Auto Shoot, Shoot, Throw, - this is autoshot flag SPELL_ATTR3_CANT_TRIGGER_PROC = 0x00010000, // 16 confirmed with many patchnotes SPELL_ATTR3_NO_INITIAL_AGGRO = 0x00020000, // 17 Soothe Animal, 39758, Mind Soothe @@ -419,8 +420,8 @@ enum SpellAttr3 enum SpellAttr4 { - SPELL_ATTR4_UNK0 = 0x00000001, // 0 - SPELL_ATTR4_PROC_ONLY_ON_DUMMY = 0x00000002, // 1 proc only on SPELL_EFFECT_DUMMY? + SPELL_ATTR4_IGNORE_RESISTANCES = 0x00000001, // 0 spells with this attribute will completely ignore the target's resistance (these spells can't be resisted) + SPELL_ATTR4_PROC_ONLY_ON_CASTER = 0x00000002, // 1 proc only on effects with TARGET_UNIT_CASTER? SPELL_ATTR4_UNK2 = 0x00000004, // 2 SPELL_ATTR4_UNK3 = 0x00000008, // 3 SPELL_ATTR4_UNK4 = 0x00000010, // 4 This will no longer cause guards to attack on use?? @@ -441,16 +442,16 @@ enum SpellAttr4 SPELL_ATTR4_UNK19 = 0x00080000, // 19 proc dalayed, after damage or don't proc on absorb? SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER = 0x00100000, // 20 supersedes message "More powerful spell applied" for self casts. SPELL_ATTR4_UNK21 = 0x00200000, // 21 Pally aura, dk presence, dudu form, warrior stance, shadowform, hunter track - SPELL_ATTR4_UNK22 = 0x00400000, // 22 + SPELL_ATTR4_UNK22 = 0x00400000, // 22 Seal of Command (42058,57770) and Gymer's Smash 55426 SPELL_ATTR4_UNK23 = 0x00800000, // 23 SPELL_ATTR4_UNK24 = 0x01000000, // 24 some shoot spell - SPELL_ATTR4_UNK25 = 0x02000000, // 25 pet scaling auras + SPELL_ATTR4_IS_PET_SCALING = 0x02000000, // 25 pet scaling auras SPELL_ATTR4_CAST_ONLY_IN_OUTLAND = 0x04000000, // 26 Can only be used in Outland. SPELL_ATTR4_UNK27 = 0x08000000, // 27 SPELL_ATTR4_UNK28 = 0x10000000, // 28 Aimed Shot SPELL_ATTR4_UNK29 = 0x20000000, // 29 SPELL_ATTR4_UNK30 = 0x40000000, // 30 - SPELL_ATTR4_UNK31 = 0x80000000 // 31 + SPELL_ATTR4_UNK31 = 0x80000000 // 31 Polymorph (chicken) 228 and Sonic Boom (38052,38488) }; enum SpellAttr5 @@ -470,7 +471,7 @@ enum SpellAttr5 SPELL_ATTR5_UNK12 = 0x00001000, // 12 Cleave related? SPELL_ATTR5_HASTE_AFFECT_DURATION = 0x00002000, // 13 haste effects decrease duration of this SPELL_ATTR5_UNK14 = 0x00004000, // 14 - SPELL_ATTR5_UNK15 = 0x00008000, // 15 + SPELL_ATTR5_UNK15 = 0x00008000, // 15 Inflits on multiple targets? SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK = 0x00010000, // 16 this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped SPELL_ATTR5_USABLE_WHILE_FEARED = 0x00020000, // 17 usable while feared SPELL_ATTR5_USABLE_WHILE_CONFUSED = 0x00040000, // 18 usable while confused @@ -2640,7 +2641,7 @@ enum CreatureTypeFlags { CREATURE_TYPEFLAGS_TAMEABLE = 0x00000001, // Tameable by any hunter CREATURE_TYPEFLAGS_GHOST = 0x00000002, // Creature are also visible for not alive player. Allow gossip interaction if npcflag allow? - CREATURE_TYPEFLAGS_UNK2 = 0x00000004, + CREATURE_TYPEFLAGS_BOSS = 0x00000004, CREATURE_TYPEFLAGS_UNK3 = 0x00000008, CREATURE_TYPEFLAGS_UNK4 = 0x00000010, CREATURE_TYPEFLAGS_UNK5 = 0x00000020, @@ -2664,7 +2665,7 @@ enum CreatureTypeFlags CREATURE_TYPEFLAGS_UNK23 = 0x00800000, // ? First seen in 3.2.2. Related to banner/backpack of creature/companion? CREATURE_TYPEFLAGS_UNK24 = 0x01000000, CREATURE_TYPEFLAGS_UNK25 = 0x02000000, - CREATURE_TYPEFLAGS_UNK26 = 0x04000000, + CREATURE_TYPEFLAGS_PARTY_MEMBER = 0x04000000, //! Creature can be targeted by spells that require target to be in caster's party/raid CREATURE_TYPEFLAGS_UNK27 = 0x08000000, CREATURE_TYPEFLAGS_UNK28 = 0x10000000, CREATURE_TYPEFLAGS_UNK29 = 0x20000000, @@ -3421,25 +3422,25 @@ enum BanReturn // indexes of BattlemasterList.dbc enum BattlegroundTypeId { - BATTLEGROUND_TYPE_NONE = 0, - BATTLEGROUND_AV = 1, - BATTLEGROUND_WS = 2, - BATTLEGROUND_AB = 3, - BATTLEGROUND_NA = 4, - BATTLEGROUND_BE = 5, - BATTLEGROUND_AA = 6, - BATTLEGROUND_EY = 7, - BATTLEGROUND_RL = 8, - BATTLEGROUND_SA = 9, - BATTLEGROUND_DS = 10, - BATTLEGROUND_RV = 11, - BATTLEGROUND_IC = 30, - BATTLEGROUND_RB = 32, - BATTLEGROUND_RATED_10_VS_10 = 100, - BATTLEGROUND_RATED_15_VS_15 = 101, - BATTLEGROUND_RATED_25_VS_25 = 102, - BATTLEGROUND_TP = 108, - BATTLEGROUND_BFG = 120, + BATTLEGROUND_TYPE_NONE = 0, // None + BATTLEGROUND_AV = 1, // Alterac Valley + BATTLEGROUND_WS = 2, // Warsong Gulch + BATTLEGROUND_AB = 3, // Arathi Basin + BATTLEGROUND_NA = 4, // Nagrand Arena + BATTLEGROUND_BE = 5, // Blade's Edge Arena + BATTLEGROUND_AA = 6, // All Arenas + BATTLEGROUND_EY = 7, // Eye of the Storm + BATTLEGROUND_RL = 8, // Ruins of Lordaernon + BATTLEGROUND_SA = 9, // Strand of the Ancients + BATTLEGROUND_DS = 10, // Dalaran Sewers + BATTLEGROUND_RV = 11, // Ring of Valor + BATTLEGROUND_IC = 30, // Isle of Conquest + BATTLEGROUND_RB = 32, // Random Battleground + BATTLEGROUND_RATED_10_VS_10 = 100, // Rated BG 10 vs 10 + BATTLEGROUND_RATED_15_VS_15 = 101, // Rated BG 15 vs 15 + BATTLEGROUND_RATED_25_VS_25 = 102, // Rated BG 25 vs 25 + BATTLEGROUND_TP = 108, // Twin Peaks + BATTLEGROUND_BFG = 120, // Battle For Gilneas // 441 = "Icecrown Citadel" // 443 = "The Ruby Sanctum" // 656 = "Rated Eye of the Storm" @@ -3559,4 +3560,105 @@ enum ActivateTaxiReply ERR_TAXINOTSTANDING = 12 }; +// Calendar - start + +enum CalendarFlags +{ + CALENDAR_FLAG_ALL_ALLOWED = 0x001, + CALENDAR_FLAG_INVITES_LOCKED = 0x010, + CALENDAR_FLAG_WITHOUT_INVITES = 0x040, + CALENDAR_FLAG_GUILD_ONLY = 0x400, +}; + +enum CalendarActionData +{ + CALENDAR_ACTION_NONE, + CALENDAR_ACTION_ADD_EVENT, + CALENDAR_ACTION_MODIFY_EVENT, + CALENDAR_ACTION_REMOVE_EVENT, + CALENDAR_ACTION_COPY_EVENT, + CALENDAR_ACTION_ADD_EVENT_INVITE, + CALENDAR_ACTION_MODIFY_EVENT_INVITE, + CALENDAR_ACTION_MODIFY_MODERATOR_EVENT_INVITE, + CALENDAR_ACTION_REMOVE_EVENT_INVITE, + CALENDAR_ACTION_SIGNUP_TO_EVENT, +}; + +enum CalendarModerationRank +{ + CALENDAR_RANK_PLAYER, + CALENDAR_RANK_MODERATOR, + CALENDAR_RANK_OWNER, +}; + +enum CalendarSendEventType +{ + CALENDAR_SENDTYPE_GET, + CALENDAR_SENDTYPE_ADD, + CALENDAR_SENDTYPE_COPY, +}; + +enum CalendarEventType +{ + CALENDAR_TYPE_RAID, + CALENDAR_TYPE_DUNGEON, + CALENDAR_TYPE_PVP, + CALENDAR_TYPE_MEETING, + CALENDAR_TYPE_OTHER, +}; + +enum CalendarInviteStatus +{ + CALENDAR_STATUS_INVITED, + CALENDAR_STATUS_ACCEPTED, + CALENDAR_STATUS_DECLINED, + CALENDAR_STATUS_TENTATIVE, + CALENDAR_STATUS_OUT, + CALENDAR_STATUS_STANDBY, + CALENDAR_STATUS_CONFIRMED, + CALENDAR_STATUS_NO_OWNER, + CALENDAR_STATUS_8, + CALENDAR_STATUS_9, +}; + +enum CalendarError +{ + CALENDAR_OK = 0, + CALENDAR_ERROR_GUILD_EVENTS_EXCEEDED = 1, + CALENDAR_ERROR_EVENTS_EXCEEDED = 2, + CALENDAR_ERROR_SELF_INVITES_EXCEEDED = 3, + CALENDAR_ERROR_OTHER_INVITES_EXCEEDED = 4, + CALENDAR_ERROR_PERMISSIONS = 5, + CALENDAR_ERROR_EVENT_INVALID = 6, + CALENDAR_ERROR_NOT_INVITED = 7, + CALENDAR_ERROR_INTERNAL = 8, + CALENDAR_ERROR_GUILD_PLAYER_NOT_IN_GUILD = 9, + CALENDAR_ERROR_ALREADY_INVITED_TO_EVENT_S = 10, + CALENDAR_ERROR_PLAYER_NOT_FOUND = 11, + CALENDAR_ERROR_NOT_ALLIED = 12, + CALENDAR_ERROR_IGNORING_YOU_S = 13, + CALENDAR_ERROR_INVITES_EXCEEDED = 14, + CALENDAR_ERROR_INVALID_DATE = 16, + CALENDAR_ERROR_INVALID_TIME = 17, + + CALENDAR_ERROR_NEEDS_TITLE = 19, + CALENDAR_ERROR_EVENT_PASSED = 20, + CALENDAR_ERROR_EVENT_LOCKED = 21, + CALENDAR_ERROR_DELETE_CREATOR_FAILED = 22, + CALENDAR_ERROR_SYSTEM_DISABLED = 24, + CALENDAR_ERROR_RESTRICTED_ACCOUNT = 25, + CALENDAR_ERROR_ARENA_EVENTS_EXCEEDED = 26, + CALENDAR_ERROR_RESTRICTED_LEVEL = 27, + CALENDAR_ERROR_USER_SQUELCHED = 28, + CALENDAR_ERROR_NO_INVITE = 29, + + CALENDAR_ERROR_EVENT_WRONG_SERVER = 36, + CALENDAR_ERROR_INVITE_WRONG_SERVER = 37, + CALENDAR_ERROR_NO_GUILD_INVITES = 38, + CALENDAR_ERROR_INVALID_SIGNUP = 39, + CALENDAR_ERROR_NO_MODERATOR = 40 +}; + +// Calendar - end + #endif diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 27816753ca7..c0e1eb842ae 100755 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -114,6 +114,9 @@ void MotionMaster::UpdateMotion(uint32 diff) _cleanFlag &= ~MMCF_RESET; } + + // probably not the best place to pu this but im not really sure where else to put it. + _owner->UpdateUnderwaterState(_owner->GetMap(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); } void MotionMaster::DirectClean(bool reset) @@ -202,11 +205,11 @@ void MotionMaster::MoveTargetedHome() } else if (_owner->GetTypeId()==TYPEID_UNIT && ((Creature*)_owner)->GetCharmerOrOwnerGUID()) { - sLog->outStaticDebug("Pet or controlled creature (Entry: %u GUID: %u) targeting home", _owner->GetEntry(), _owner->GetGUIDLow() ); + sLog->outStaticDebug("Pet or controlled creature (Entry: %u GUID: %u) targeting home", _owner->GetEntry(), _owner->GetGUIDLow()); Unit *target = ((Creature*)_owner)->GetCharmerOrOwner(); if (target) { - sLog->outStaticDebug("Following %s (GUID: %u)", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() ); + sLog->outStaticDebug("Following %s (GUID: %u)", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow()); Mutate(new FollowMovementGenerator(*target,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE), MOTION_SLOT_ACTIVE); } } @@ -383,6 +386,12 @@ void MotionMaster::MoveFall(uint32 id/*=0*/) if (fabs(_owner->GetPositionZ() - tz) < 0.1f) return; + if (_owner->GetTypeId() == TYPEID_PLAYER) + { + _owner->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + _owner->m_movementInfo.SetFallTime(0); + } + Movement::MoveSplineInit init(*_owner); init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz); init.SetFall(); diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h index dd9ba32f337..0a2ebcfaeee 100755 --- a/src/server/game/Movement/MovementGenerator.h +++ b/src/server/game/Movement/MovementGenerator.h @@ -38,7 +38,7 @@ class MovementGenerator virtual void Reset(Unit &) = 0; - virtual bool Update(Unit &, const uint32 time_diff) = 0; + virtual bool Update(Unit &, const uint32& time_diff) = 0; virtual MovementGeneratorType GetMovementGeneratorType() = 0; @@ -64,7 +64,7 @@ class MovementGeneratorMedium : public MovementGenerator //u->AssertIsType(); (static_cast(this))->Reset(*((T*)&u)); } - bool Update(Unit &u, const uint32 time_diff) + bool Update(Unit &u, const uint32& time_diff) { //u->AssertIsType(); return (static_cast(this))->Update(*((T*)&u), time_diff); @@ -74,7 +74,7 @@ class MovementGeneratorMedium : public MovementGenerator void Initialize(T &u); void Finalize(T &u); void Reset(T &u); - bool Update(T &u, const uint32 time_diff); + bool Update(T &u, const uint32& time_diff); }; struct SelectableMovement : public FactoryHolder diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index 32b960028c2..54a68f92c66 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -32,11 +32,10 @@ template void ConfusedMovementGenerator::Initialize(T &unit) { - const float wander_distance=4; - float x,y,z; - x = unit.GetPositionX(); - y = unit.GetPositionY(); - z = unit.GetPositionZ(); + float const wander_distance = 4; + float x = unit.GetPositionX(); + float y = unit.GetPositionY(); + float z = unit.GetPositionZ(); Map const* map = unit.GetBaseMap(); @@ -47,31 +46,42 @@ void ConfusedMovementGenerator::Initialize(T &unit) for (uint8 idx = 0; idx < MAX_CONF_WAYPOINTS + 1; ++idx) { - const float wanderX=wander_distance*(float)rand_norm() - wander_distance/2; - const float wanderY=wander_distance*(float)rand_norm() - wander_distance/2; - - i_waypoints[idx][0] = x + wanderX; - i_waypoints[idx][1] = y + wanderY; + float wanderX = x + (wander_distance * (float)rand_norm() - wander_distance/2); + float wanderY = y + (wander_distance * (float)rand_norm() - wander_distance/2); // prevent invalid coordinates generation - Trinity::NormalizeMapCoord(i_waypoints[idx][0]); - Trinity::NormalizeMapCoord(i_waypoints[idx][1]); + Trinity::NormalizeMapCoord(wanderX); + Trinity::NormalizeMapCoord(wanderY); - bool is_water = map->IsInWater(i_waypoints[idx][0],i_waypoints[idx][1],z); - // if generated wrong path just ignore - if ((is_water && !is_water_ok) || (!is_water && !is_land_ok)) + if (unit.IsWithinLOS(wanderX, wanderY, z)) + { + bool is_water = map->IsInWater(wanderX, wanderY, z); + + if ((is_water && !is_water_ok) || (!is_water && !is_land_ok)) + { + //! Cannot use coordinates outside our InhabitType. Use the current or previous position. + wanderX = idx > 0 ? i_waypoints[idx-1][0] : x; + wanderY = idx > 0 ? i_waypoints[idx-1][1] : y; + } + } + else { - i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x; - i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y; + //! Trying to access path outside line of sight. Skip this by using the current or previous position. + wanderX = idx > 0 ? i_waypoints[idx-1][0] : x; + wanderY = idx > 0 ? i_waypoints[idx-1][1] : y; } - unit.UpdateAllowedPositionZ(i_waypoints[idx][0], i_waypoints[idx][1], z); - i_waypoints[idx][2] = z; + unit.UpdateAllowedPositionZ(wanderX, wanderY, z); + + //! Positions are fine - apply them to this waypoint + i_waypoints[idx][0] = wanderX; + i_waypoints[idx][1] = wanderY; + i_waypoints[idx][2] = z; } unit.StopMoving(); unit.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); - unit.AddUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); + unit.AddUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); } template<> @@ -94,7 +104,7 @@ void ConfusedMovementGenerator::Reset(T &unit) i_nextMove = 1; i_nextMoveTime.Reset(0); unit.StopMoving(); - unit.AddUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); + unit.AddUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); } template @@ -110,20 +120,20 @@ bool ConfusedMovementGenerator::Update(T &unit, const uint32 &diff) if (unit.movespline->Finalized()) { - i_nextMove = urand(1,MAX_CONF_WAYPOINTS); - i_nextMoveTime.Reset(urand(0, 1500-1)); // TODO: check the minimum reset time, should be probably higher + i_nextMove = urand(1, MAX_CONF_WAYPOINTS); + i_nextMoveTime.Reset(urand(500, 1200)); // Guessed } } else { // waiting for next move i_nextMoveTime.Update(diff); - if(i_nextMoveTime.Passed() ) + if (i_nextMoveTime.Passed()) { // start moving unit.AddUnitState(UNIT_STATE_CONFUSED_MOVE); - ASSERT( i_nextMove <= MAX_CONF_WAYPOINTS ); + ASSERT(i_nextMove <= MAX_CONF_WAYPOINTS); float x = i_waypoints[i_nextMove][0]; float y = i_waypoints[i_nextMove][1]; float z = i_waypoints[i_nextMove][2]; @@ -141,14 +151,14 @@ template<> void ConfusedMovementGenerator::Finalize(Player &unit) { unit.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); - unit.ClearUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); + unit.ClearUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); } template<> void ConfusedMovementGenerator::Finalize(Creature &unit) { unit.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); - unit.ClearUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_CONFUSED_MOVE); + unit.ClearUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); if (unit.getVictim()) unit.SetTarget(unit.getVictim()->GetGUID()); } diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h index b9f96bb785d..7f2226ea069 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h @@ -22,11 +22,10 @@ #include "MovementGenerator.h" #include "Timer.h" -#define MAX_CONF_WAYPOINTS 24 +#define MAX_CONF_WAYPOINTS 24 //! Allows a twelve second confusion if i_nextMove always is the absolute minimum timer. template -class ConfusedMovementGenerator -: public MovementGeneratorMedium< T, ConfusedMovementGenerator > +class ConfusedMovementGenerator : public MovementGeneratorMedium< T, ConfusedMovementGenerator > { public: explicit ConfusedMovementGenerator() : i_nextMoveTime(0) {} diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 216afbb2b20..08e27abf050 100755 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -28,8 +28,7 @@ #define MAX_QUIET_DISTANCE 43.0f template -void -FleeingMovementGenerator::_setTargetLocation(T &owner) +void FleeingMovementGenerator::_setTargetLocation(T &owner) { if (!&owner) return; @@ -53,8 +52,7 @@ FleeingMovementGenerator::_setTargetLocation(T &owner) } template -bool -FleeingMovementGenerator::_getPoint(T &owner, float &x, float &y, float &z) +bool FleeingMovementGenerator::_getPoint(T &owner, float &x, float &y, float &z) { if (!&owner) return false; @@ -65,8 +63,8 @@ FleeingMovementGenerator::_getPoint(T &owner, float &x, float &y, float &z) float temp_x, temp_y, angle; const Map* _map = owner.GetBaseMap(); - //primitive path-finding - for(uint8 i = 0; i < 18; ++i) + // primitive path-finding + for (uint8 i = 0; i < 18; ++i) { if (i_only_forward && i > 2) break; @@ -182,13 +180,12 @@ FleeingMovementGenerator::_getPoint(T &owner, float &x, float &y, float &z) } } i_to_distance_from_caster = 0.0f; - i_nextCheckTime.Reset( urand(500,1000) ); + i_nextCheckTime.Reset(urand(500,1000)); return false; } template -bool -FleeingMovementGenerator::_setMoveData(T &owner) +bool FleeingMovementGenerator::_setMoveData(T &owner) { float cur_dist_xyz = owner.GetDistance(i_caster_x, i_caster_y, i_caster_z); @@ -201,12 +198,12 @@ FleeingMovementGenerator::_setMoveData(T &owner) (i_last_distance_from_caster < i_to_distance_from_caster && cur_dist_xyz > i_to_distance_from_caster) || // if we reach bigger distance (cur_dist_xyz > MAX_QUIET_DISTANCE) || // if we are too far - (i_last_distance_from_caster > MIN_QUIET_DISTANCE && cur_dist_xyz < MIN_QUIET_DISTANCE) ) + (i_last_distance_from_caster > MIN_QUIET_DISTANCE && cur_dist_xyz < MIN_QUIET_DISTANCE)) // if we leave 'quiet zone' { // we are very far or too close, stopping i_to_distance_from_caster = 0.0f; - i_nextCheckTime.Reset( urand(500,1000) ); + i_nextCheckTime.Reset(urand(500,1000)); return false; } else @@ -280,8 +277,7 @@ FleeingMovementGenerator::_setMoveData(T &owner) } template -void -FleeingMovementGenerator::Initialize(T &owner) +void FleeingMovementGenerator::Initialize(T &owner) { if (!&owner) return; @@ -312,8 +308,7 @@ FleeingMovementGenerator::Initialize(T &owner) } template<> -void -FleeingMovementGenerator::_Init(Creature &owner) +void FleeingMovementGenerator::_Init(Creature &owner) { if (!&owner) return; @@ -324,8 +319,7 @@ FleeingMovementGenerator::_Init(Creature &owner) } template<> -void -FleeingMovementGenerator::_Init(Player &) +void FleeingMovementGenerator::_Init(Player &) { is_water_ok = true; is_land_ok = true; @@ -354,8 +348,7 @@ void FleeingMovementGenerator::Reset(T &owner) } template -bool -FleeingMovementGenerator::Update(T &owner, const uint32 &time_diff) +bool FleeingMovementGenerator::Update(T &owner, const uint32 &time_diff) { if (!&owner || !owner.isAlive()) return false; @@ -399,7 +392,7 @@ void TimedFleeingMovementGenerator::Finalize(Unit &owner) } } -bool TimedFleeingMovementGenerator::Update(Unit & owner, const uint32 time_diff) +bool TimedFleeingMovementGenerator::Update(Unit & owner, const uint32& time_diff) { if (!owner.isAlive()) return false; diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h index 750db52bb5a..aec93ad3375 100755 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h @@ -22,8 +22,7 @@ #include "MovementGenerator.h" template -class FleeingMovementGenerator -: public MovementGeneratorMedium< T, FleeingMovementGenerator > +class FleeingMovementGenerator : public MovementGeneratorMedium< T, FleeingMovementGenerator > { public: FleeingMovementGenerator(uint64 fright) : i_frightGUID(fright), i_nextCheckTime(0) {} @@ -55,8 +54,7 @@ class FleeingMovementGenerator TimeTracker i_nextCheckTime; }; -class TimedFleeingMovementGenerator -: public FleeingMovementGenerator +class TimedFleeingMovementGenerator : public FleeingMovementGenerator { public: TimedFleeingMovementGenerator(uint64 fright, uint32 time) : @@ -64,7 +62,7 @@ class TimedFleeingMovementGenerator i_totalFleeTime(time) {} MovementGeneratorType GetMovementGeneratorType() { return TIMED_FLEEING_MOTION_TYPE; } - bool Update(Unit &, const uint32); + bool Update(Unit &, const uint32&); void Finalize(Unit &); private: diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 5725aec54f6..a8bdb698432 100755 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -25,7 +25,6 @@ void HomeMovementGenerator::Initialize(Creature & owner) { - owner.AddUnitState(UNIT_STATE_EVADE); _setTargetLocation(owner); } @@ -35,9 +34,6 @@ void HomeMovementGenerator::Reset(Creature &) void HomeMovementGenerator::_setTargetLocation(Creature & owner) { - if (!&owner) - return; - if (owner.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) return; diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h index c724edc91ff..95eb05f281c 100755 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h @@ -27,8 +27,7 @@ template < class T > class HomeMovementGenerator; template <> -class HomeMovementGenerator -: public MovementGeneratorMedium< Creature, HomeMovementGenerator > +class HomeMovementGenerator : public MovementGeneratorMedium< Creature, HomeMovementGenerator > { public: diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp index 36561e00b93..5a2090cfe28 100755 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp @@ -29,16 +29,15 @@ void IdleMovementGenerator::Initialize(Unit &owner) Reset(owner); } -void -IdleMovementGenerator::Reset(Unit& owner) +void IdleMovementGenerator::Reset(Unit& owner) { - if (owner.HasUnitState(UNIT_STATE_MOVE)) + if (!owner.IsStopped()) owner.StopMoving(); } void RotateMovementGenerator::Initialize(Unit& owner) { - if (owner.HasUnitState(UNIT_STATE_MOVE)) + if (!owner.IsStopped()) owner.StopMoving(); if (owner.getVictim()) @@ -49,7 +48,7 @@ void RotateMovementGenerator::Initialize(Unit& owner) owner.AttackStop(); } -bool RotateMovementGenerator::Update(Unit& owner, const uint32 diff) +bool RotateMovementGenerator::Update(Unit& owner, const uint32& diff) { float angle = owner.GetOrientation(); if (m_direction == ROTATE_DIRECTION_LEFT) @@ -80,20 +79,17 @@ void RotateMovementGenerator::Finalize(Unit &unit) unit.ToCreature()->AI()->MovementInform(ROTATE_MOTION_TYPE, 0); } -void -DistractMovementGenerator::Initialize(Unit& owner) +void DistractMovementGenerator::Initialize(Unit& owner) { owner.AddUnitState(UNIT_STATE_DISTRACTED); } -void -DistractMovementGenerator::Finalize(Unit& owner) +void DistractMovementGenerator::Finalize(Unit& owner) { owner.ClearUnitState(UNIT_STATE_DISTRACTED); } -bool -DistractMovementGenerator::Update(Unit& /*owner*/, const uint32 time_diff) +bool DistractMovementGenerator::Update(Unit& /*owner*/, const uint32& time_diff) { if (time_diff > m_timer) return false; @@ -102,8 +98,7 @@ DistractMovementGenerator::Update(Unit& /*owner*/, const uint32 time_diff) return true; } -void -AssistanceDistractMovementGenerator::Finalize(Unit &unit) +void AssistanceDistractMovementGenerator::Finalize(Unit &unit) { unit.ClearUnitState(UNIT_STATE_DISTRACTED); unit.ToCreature()->SetReactState(REACT_AGGRESSIVE); diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h index 8180a86c49b..7acec82af98 100755 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h @@ -28,7 +28,7 @@ class IdleMovementGenerator : public MovementGenerator void Initialize(Unit &); void Finalize(Unit &) { } void Reset(Unit &); - bool Update(Unit &, const uint32) { return true; } + bool Update(Unit &, const uint32&) { return true; } MovementGeneratorType GetMovementGeneratorType() { return IDLE_MOTION_TYPE; } }; @@ -42,7 +42,7 @@ class RotateMovementGenerator : public MovementGenerator void Initialize(Unit& owner); void Finalize(Unit& owner); void Reset(Unit& owner) { Initialize(owner); } - bool Update(Unit& owner, const uint32 time_diff); + bool Update(Unit& owner, const uint32& time_diff); MovementGeneratorType GetMovementGeneratorType() { return ROTATE_MOTION_TYPE; } private: @@ -58,7 +58,7 @@ class DistractMovementGenerator : public MovementGenerator void Initialize(Unit& owner); void Finalize(Unit& owner); void Reset(Unit& owner) { Initialize(owner); } - bool Update(Unit& owner, const uint32 time_diff); + bool Update(Unit& owner, const uint32& time_diff); MovementGeneratorType GetMovementGeneratorType() { return DISTRACT_MOTION_TYPE; } private: diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index c565e150740..a922c937b5f 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -46,7 +46,7 @@ bool PointMovementGenerator::Update(T &unit, const uint32 & /*diff*/) if (!&unit) return false; - if(unit.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) + if (unit.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) { unit.ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; @@ -57,7 +57,7 @@ bool PointMovementGenerator::Update(T &unit, const uint32 & /*diff*/) } template -void PointMovementGenerator:: Finalize(T &unit) +void PointMovementGenerator::Finalize(T &unit) { unit.ClearUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); @@ -107,7 +107,7 @@ void AssistanceMovementGenerator::Finalize(Unit &unit) unit.GetMotionMaster()->MoveSeekAssistanceDistract(sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY)); } -bool EffectMovementGenerator::Update(Unit &unit, const uint32) +bool EffectMovementGenerator::Update(Unit &unit, const uint32&) { return !unit.movespline->Finalized(); } @@ -117,7 +117,7 @@ void EffectMovementGenerator::Finalize(Unit &unit) if (unit.GetTypeId() != TYPEID_UNIT) return; - if (((Creature&)unit).AI() && unit.movespline->Finalized()) + if (((Creature&)unit).AI()) ((Creature&)unit).AI()->MovementInform(EFFECT_MOTION_TYPE, m_Id); // Need restore previous movement since we have no proper states system //if (unit.isAlive() && !unit.HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_FLEEING)) diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h index e47f3d93450..13be9fee77b 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h @@ -23,8 +23,7 @@ #include "FollowerReference.h" template -class PointMovementGenerator -: public MovementGeneratorMedium< T, PointMovementGenerator > +class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementGenerator > { public: PointMovementGenerator(uint32 _id, float _x, float _y, float _z, float _speed = 0.0f) : id(_id), @@ -46,8 +45,7 @@ class PointMovementGenerator float speed; }; -class AssistanceMovementGenerator -: public PointMovementGenerator +class AssistanceMovementGenerator : public PointMovementGenerator { public: AssistanceMovementGenerator(float _x, float _y, float _z) : @@ -65,7 +63,7 @@ class EffectMovementGenerator : public MovementGenerator void Initialize(Unit &) {} void Finalize(Unit &unit); void Reset(Unit &) {} - bool Update(Unit &u, const uint32); + bool Update(Unit &u, const uint32&); MovementGeneratorType GetMovementGeneratorType() { return EFFECT_MOTION_TYPE; } private: uint32 m_Id; diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index b65fa210723..84cd9e88295 100755 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -42,7 +42,7 @@ void RandomMovementGenerator::_setRandomLocation(Creature& creature) // For 2D/3D system selection //bool is_land_ok = creature.CanWalk(); // not used? //bool is_water_ok = creature.CanSwim(); // not used? - bool is_air_ok = creature.canFly(); + bool is_air_ok = creature.CanFly(); const float angle = float(rand_norm()) * static_cast(M_PI*2.0f); const float range = float(rand_norm()) * wander_distance; @@ -127,8 +127,7 @@ void RandomMovementGenerator::Initialize(Creature &creature) } template<> -void -RandomMovementGenerator::Reset(Creature &creature) +void RandomMovementGenerator::Reset(Creature &creature) { Initialize(creature); } @@ -141,8 +140,7 @@ void RandomMovementGenerator::Finalize(Creature &creature) } template<> -bool -RandomMovementGenerator::Update(Creature &creature, const uint32 diff) +bool RandomMovementGenerator::Update(Creature &creature, const uint32 diff) { if (creature.HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) { diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index 67161b6fc29..07ec3647052 100755 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -22,8 +22,7 @@ #include "MovementGenerator.h" template -class RandomMovementGenerator -: public MovementGeneratorMedium< T, RandomMovementGenerator > +class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovementGenerator > { public: RandomMovementGenerator(float spawn_dist = 0.0f) : i_nextMoveTime(0), wander_distance(spawn_dist) {} diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 064a8fc8297..fdff5a92564 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -40,12 +40,12 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T &owner) float x, y, z; //! Following block of code deleted by MrSmite in issue 4891 //! Code kept for learning and diagnostical purposes -// +// // if (i_offset && i_target->IsWithinDistInMap(&owner,2*i_offset)) // { // if (!owner.movespline->Finalized()) // return; -// +// // owner.GetPosition(x, y, z); // } // else @@ -78,7 +78,7 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T &owner) //We don't update Mob Movement, if the difference between New destination and last destination is < BothObjectSize float bothObjectSize = i_target->GetObjectBoundingRadius() + owner.GetObjectBoundingRadius() + CONTACT_DISTANCE; - if( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x,y,z) < bothObjectSize ) + if ( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x,y,z) < bothObjectSize ) return; */ @@ -135,7 +135,7 @@ bool TargetedMovementGeneratorMedium::Update(T &owner, const uint32 & time_ } // prevent movement while casting spells with cast time or channel time - if (owner.IsNonMeleeSpellCasted(false, false, true)) + if (owner.HasUnitState(UNIT_STATE_CASTING)) { if (!owner.IsStopped()) owner.StopMoving(); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index b851dbc0e05..29fd73624e1 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -34,8 +34,7 @@ class TargetedMovementGeneratorBase }; template -class TargetedMovementGeneratorMedium -: public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase +class TargetedMovementGeneratorMedium : public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase { protected: TargetedMovementGeneratorMedium(Unit &target, float offset, float angle) : diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index fb2249c508e..25730f92161 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -79,7 +79,7 @@ void WaypointMovementGenerator::OnArrived(Creature& creature) if (i_path->at(i_currentNode)->event_id && urand(0, 99) < i_path->at(i_currentNode)->event_chance) { sLog->outDebug(LOG_FILTER_MAPSCRIPTS, "Creature movement start script %u at point %u for "UI64FMTD".", i_path->at(i_currentNode)->event_id, i_currentNode, creature.GetGUID()); - creature.GetMap()->ScriptsStart(sWaypointScripts, i_path->at(i_currentNode)->event_id, &creature, NULL/*, false*/); + creature.GetMap()->ScriptsStart(sWaypointScripts, i_path->at(i_currentNode)->event_id, &creature, NULL); } // Inform script @@ -107,7 +107,7 @@ bool WaypointMovementGenerator::StartMove(Creature &creature) i_currentNode = (i_currentNode+1) % i_path->size(); } - const WaypointData *node = i_path->at(i_currentNode); + WaypointData const* node = i_path->at(i_currentNode); m_isArrivalDone = false; @@ -116,7 +116,8 @@ bool WaypointMovementGenerator::StartMove(Creature &creature) Movement::MoveSplineInit init(creature); init.MoveTo(node->x, node->y, node->z); - if (node->orientation != 100 && node->delay != 0) + //! Accepts angles such as 0.00001 and -0.00001, 0 must be ignored, default value in waypoint table + if (node->orientation && node->delay) init.SetFacing(node->orientation); init.SetWalk(!node->run); @@ -231,7 +232,7 @@ void FlightPathMovementGenerator::Reset(Player & player) uint32 end = GetPathAtMapEnd(); for (uint32 i = GetCurrentNode(); i != end; ++i) { - G3D::Vector3 vertice((*i_path)[i].x,(*i_path)[i].y,(*i_path)[i].z); + G3D::Vector3 vertice((*i_path)[i].x, (*i_path)[i].y, (*i_path)[i].z); init.Path().push_back(vertice); } init.SetFirstPointId(GetCurrentNode()); @@ -240,7 +241,7 @@ void FlightPathMovementGenerator::Reset(Player & player) init.Launch(); } -bool FlightPathMovementGenerator::Update(Player &player, const uint32 /*diff*/) +bool FlightPathMovementGenerator::Update(Player &player, const uint32& /*diff*/) { uint32 pointId = (uint32)player.movespline->currentPathIdx(); if (pointId > i_currentNode) diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 9c2475267f6..0d8f047c83a 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -58,9 +58,8 @@ template class WaypointMovementGenerator; template<> -class WaypointMovementGenerator -: public MovementGeneratorMedium< Creature, WaypointMovementGenerator >, -public PathMovementBase +class WaypointMovementGenerator : public MovementGeneratorMedium< Creature, WaypointMovementGenerator >, + public PathMovementBase { public: WaypointMovementGenerator(uint32 _path_id = 0, bool _repeating = true) @@ -110,9 +109,8 @@ public PathMovementBase /** FlightPathMovementGenerator generates movement of the player for the paths * and hence generates ground and activities for the player. */ -class FlightPathMovementGenerator -: public MovementGeneratorMedium< Player, FlightPathMovementGenerator >, -public PathMovementBase +class FlightPathMovementGenerator : public MovementGeneratorMedium< Player, FlightPathMovementGenerator >, + public PathMovementBase { public: explicit FlightPathMovementGenerator(TaxiPathNodeList const& pathnodes, uint32 startNode = 0) @@ -123,7 +121,7 @@ public PathMovementBase void Initialize(Player &); void Reset(Player &); void Finalize(Player &); - bool Update(Player &, const uint32); + bool Update(Player &, const uint32&); MovementGeneratorType GetMovementGeneratorType() { return FLIGHT_MOTION_TYPE; } TaxiPathNodeList const& GetPath() { return *i_path; } diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index 5d0344f9769..91b4ff08250 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -288,7 +288,7 @@ std::string MoveSpline::ToString() const str << "facing angle: " << facing.angle; else if (splineflags.final_target) str << "facing target: " << facing.target; - else if(splineflags.final_point) + else if (splineflags.final_point) str << "facing point: " << facing.f.x << " " << facing.f.y << " " << facing.f.z; str << std::endl; str << "time passed: " << time_passed << std::endl; diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index b5ae923dc32..e586cb4f4f9 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -25,9 +25,13 @@ namespace Movement { UnitMoveType SelectSpeedType(uint32 moveFlags) { - if (moveFlags & MOVEMENTFLAG_FLYING) + /*! Not sure about MOVEMENTFLAG_CAN_FLY here - do creatures that can fly + but are on ground right now also have it? If yes, this needs a more + dynamic check, such as is flying now + */ + if (moveFlags & (MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY)) { - if ( moveFlags & MOVEMENTFLAG_BACKWARD /*&& speed_obj.flight >= speed_obj.flight_back*/ ) + if (moveFlags & MOVEMENTFLAG_BACKWARD /*&& speed_obj.flight >= speed_obj.flight_back*/) return MOVE_FLIGHT_BACK; else return MOVE_FLIGHT; @@ -41,7 +45,7 @@ namespace Movement } else if (moveFlags & MOVEMENTFLAG_WALKING) { - //if ( speed_obj.run > speed_obj.walk ) + //if (speed_obj.run > speed_obj.walk) return MOVE_WALK; } else if (moveFlags & MOVEMENTFLAG_BACKWARD /*&& speed_obj.run >= speed_obj.run_back*/) @@ -54,7 +58,7 @@ namespace Movement { MoveSpline& move_spline = *unit.movespline; - Location real_position(unit.GetPositionX(),unit.GetPositionY(),unit.GetPositionZ(),unit.GetOrientation()); + Location real_position(unit.GetPositionX(),unit.GetPositionY(),unit.GetPositionZMinusOffset(),unit.GetOrientation()); // there is a big chane that current position is unknown if current state is not finalized, need compute it // this also allows calculate spline position and update map position in much greater intervals if (!move_spline.Finalized()) @@ -100,7 +104,7 @@ namespace Movement { // mix existing state into new args.flags.walkmode = unit.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); - args.flags.flying = unit.m_movementInfo.HasMovementFlag((MovementFlags)(MOVEMENTFLAG_FLYING|MOVEMENTFLAG_LEVITATING)); + args.flags.flying = unit.m_movementInfo.HasMovementFlag((MovementFlags)(MOVEMENTFLAG_CAN_FLY|MOVEMENTFLAG_DISABLE_GRAVITY)); } void MoveSplineInit::SetFacing(const Unit * target) diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp index 73fdbf4c2f6..0260767dbe2 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp @@ -44,11 +44,17 @@ namespace Movement void PacketBuilder::WriteCommonMonsterMovePart(const MoveSpline& move_spline, WorldPacket& data) { MoveSplineFlag splineflags = move_spline.splineflags; - /*if (mov.IsBoarded()) + /*if (unit->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) { data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT); - data << mov.GetTransport()->Owner.GetPackGUID(); - data << int8(mov.m_unused.transport_seat); + if (unit->GetVehicle()) + data << unit->GetVehicle()->GetBase()->GetPackGUID(); + else if (unit->GetTransport()) + data << unit->GetTransport()->GetPackGUID(); + else + data << uint64(0); + + data << int8(unit->GetTransSeat()); }*/ data << uint8(0); @@ -57,21 +63,21 @@ namespace Movement switch(splineflags & MoveSplineFlag::Mask_Final_Facing) { - default: - data << uint8(MonsterMoveNormal); - break; - case MoveSplineFlag::Final_Target: - data << uint8(MonsterMoveFacingTarget); - data << move_spline.facing.target; - break; - case MoveSplineFlag::Final_Angle: - data << uint8(MonsterMoveFacingAngle); - data << move_spline.facing.angle; - break; - case MoveSplineFlag::Final_Point: - data << uint8(MonsterMoveFacingSpot); - data << move_spline.facing.f.x << move_spline.facing.f.y << move_spline.facing.f.z; - break; + case MoveSplineFlag::Final_Target: + data << uint8(MonsterMoveFacingTarget); + data << move_spline.facing.target; + break; + case MoveSplineFlag::Final_Angle: + data << uint8(MonsterMoveFacingAngle); + data << move_spline.facing.angle; + break; + case MoveSplineFlag::Final_Point: + data << uint8(MonsterMoveFacingSpot); + data << move_spline.facing.f.x << move_spline.facing.f.y << move_spline.facing.f.z; + break; + default: + data << uint8(MonsterMoveNormal); + break; } // add fake Enter_Cycle flag - needed for client-side cyclic movement (client will erase first spline vertex after first cycle done) @@ -105,7 +111,7 @@ namespace Movement Vector3 middle = (real_path[0] + real_path[last_idx]) / 2.f; Vector3 offset; // first and last points already appended - for(uint32 i = 1; i < last_idx; ++i) + for (uint32 i = 1; i < last_idx; ++i) { offset = middle - real_path[i]; data.appendPackXYZ(offset.x, offset.y, offset.z); @@ -163,7 +169,7 @@ namespace Movement { data << move_spline.facing.target; } - else if(splineFlags.final_point) + else if (splineFlags.final_point) { data << move_spline.facing.f.x << move_spline.facing.f.y << move_spline.facing.f.z; } diff --git a/src/server/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp index b957674151b..296c9eee50f 100755 --- a/src/server/game/Movement/Waypoints/WaypointManager.cpp +++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp @@ -43,6 +43,7 @@ void WaypointMgr::Load() { uint32 oldMSTime = getMSTime(); + // 0 1 2 3 4 5 6 7 8 9 QueryResult result = WorldDatabase.Query("SELECT id, point, position_x, position_y, position_z, orientation, move_flag, delay, action, action_chance FROM waypoint_data ORDER BY id, point"); if (!result) @@ -78,7 +79,7 @@ void WaypointMgr::Load() wp->run = fields[6].GetBool(); wp->delay = fields[7].GetUInt32(); wp->event_id = fields[8].GetUInt32(); - wp->event_chance = fields[9].GetUInt8(); + wp->event_chance = fields[9].GetInt16(); path.push_back(wp); ++count; @@ -100,7 +101,12 @@ void WaypointMgr::ReloadPath(uint32 id) _waypointStore.erase(itr); } - QueryResult result = WorldDatabase.PQuery("SELECT point, position_x, position_y, position_z, orientation, move_flag, delay, action, action_chance FROM waypoint_data WHERE id = %u ORDER BY point", id); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_BY_ID); + + stmt->setUInt32(0, id); + + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) return; diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 9f6ec547342..465fca75030 100755 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -436,20 +436,20 @@ void OutdoorPvP::HandleKill(Player* killer, Unit* killed) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - Player* pGroupGuy = itr->getSource(); + Player* groupGuy = itr->getSource(); - if (!pGroupGuy) + if (!groupGuy) continue; // skip if too far away - if (!pGroupGuy->IsAtGroupRewardDistance(killed)) + if (!groupGuy->IsAtGroupRewardDistance(killed)) continue; // creature kills must be notified, even if not inside objective / not outdoor pvp active // player kills only count if active and inside objective - if ((pGroupGuy->IsOutdoorPvPActive() && IsInsideObjective(pGroupGuy)) || killed->GetTypeId() == TYPEID_UNIT) + if ((groupGuy->IsOutdoorPvPActive() && IsInsideObjective(groupGuy)) || killed->GetTypeId() == TYPEID_UNIT) { - HandleKillImpl(pGroupGuy, killed); + HandleKillImpl(groupGuy, killed); } } } diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp index 88e6db971f0..a079d2f643b 100755 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp @@ -27,7 +27,7 @@ OutdoorPvPMgr::OutdoorPvPMgr() //sLog->outDebug(LOG_FILTER_OUTDOORPVP, "Instantiating OutdoorPvPMgr"); } -OutdoorPvPMgr::~OutdoorPvPMgr() +void OutdoorPvPMgr::Die() { //sLog->outDebug(LOG_FILTER_OUTDOORPVP, "Deleting OutdoorPvPMgr"); for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr) @@ -41,7 +41,7 @@ void OutdoorPvPMgr::InitOutdoorPvP() { uint32 oldMSTime = getMSTime(); - // 0 1 + // 0 1 QueryResult result = WorldDatabase.Query("SELECT TypeId, ScriptName FROM outdoorpvp_template"); if (!result) @@ -58,7 +58,7 @@ void OutdoorPvPMgr::InitOutdoorPvP() { Field* fields = result->Fetch(); - typeId = fields[0].GetUInt32(); + typeId = fields[0].GetUInt8(); if (DisableMgr::IsDisabledFor(DISABLE_TYPE_OUTDOORPVP, typeId, NULL)) continue; diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h index 3a66a87ecba..1313e29bfb4 100755 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h @@ -42,12 +42,15 @@ class OutdoorPvPMgr private: OutdoorPvPMgr(); - ~OutdoorPvPMgr(); + ~OutdoorPvPMgr() {}; public: // create outdoor pvp events void InitOutdoorPvP(); + // cleanup + void Die(); + // called when a player enters an outdoor pvp area void HandlePlayerEnterZone(Player* player, uint32 areaflag); diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 05ce7a0a50d..d8548b552d3 100755 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -440,7 +440,12 @@ void PoolGroup::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 // load state from db if (!triggerFrom) { - QueryResult result = CharacterDatabase.PQuery("SELECT quest_id FROM pool_quest_save WHERE pool_id = %u", poolId); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_POOL_QUEST_SAVE); + + stmt->setUInt32(0, poolId); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) { do @@ -474,7 +479,7 @@ void PoolGroup::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 { do { - uint32 questId = SelectRandomContainerElement(currentQuests); + uint32 questId = Trinity::Containers::SelectRandomContainerElement(currentQuests); newQuests.insert(questId); currentQuests.erase(questId); } while (newQuests.size() < limit && !currentQuests.empty()); // failsafe @@ -486,7 +491,7 @@ void PoolGroup::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 // activate random quests do { - uint32 questId = SelectRandomContainerElement(newQuests); + uint32 questId = Trinity::Containers::SelectRandomContainerElement(newQuests); spawns.ActivateObject(questId, poolId); PoolObject tempObj(questId, 0.0f); Spawn1Object(&tempObj); @@ -595,7 +600,7 @@ void PoolMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - // 1 2 3 + // 1 2 3 QueryResult result = WorldDatabase.Query("SELECT guid, pool_entry, chance FROM pool_creature"); if (!result) diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index abd8ebbb302..31c05c2723e 100755 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -23,31 +23,31 @@ Quest::Quest(Field* questRecord) { Id = questRecord[0].GetUInt32(); - Method = questRecord[1].GetUInt32(); - Level = questRecord[2].GetInt32(); - MinLevel = questRecord[3].GetUInt32(); - MaxLevel = questRecord[4].GetUInt32(); - ZoneOrSort = questRecord[5].GetInt32(); - Type = questRecord[6].GetUInt32(); - SuggestedPlayers = questRecord[7].GetUInt32(); + Method = questRecord[1].GetUInt8(); + Level = questRecord[2].GetInt16(); + MinLevel = questRecord[3].GetUInt8(); + MaxLevel = questRecord[4].GetUInt8(); + ZoneOrSort = questRecord[5].GetInt16(); + Type = questRecord[6].GetUInt16(); + SuggestedPlayers = questRecord[7].GetUInt8(); LimitTime = questRecord[8].GetUInt32(); - RequiredClasses = questRecord[9].GetUInt32(); - RequiredRaces = questRecord[10].GetUInt32(); - RequiredSkillId = questRecord[11].GetUInt32(); - RequiredSkillPoints = questRecord[12].GetUInt32(); - RequiredFactionId1 = questRecord[13].GetUInt32(); - RequiredFactionId2 = questRecord[14].GetUInt32(); + RequiredClasses = questRecord[9].GetUInt16(); + RequiredRaces = questRecord[10].GetUInt16(); + RequiredSkillId = questRecord[11].GetUInt16(); + RequiredSkillPoints = questRecord[12].GetUInt16(); + RequiredFactionId1 = questRecord[13].GetUInt16(); + RequiredFactionId2 = questRecord[14].GetUInt16(); RequiredFactionValue1 = questRecord[15].GetInt32(); RequiredFactionValue2 = questRecord[16].GetInt32(); - RequiredMinRepFaction = questRecord[17].GetUInt32(); - RequiredMaxRepFaction = questRecord[18].GetUInt32(); + RequiredMinRepFaction = questRecord[17].GetUInt16(); + RequiredMaxRepFaction = questRecord[18].GetUInt16(); RequiredMinRepValue = questRecord[19].GetInt32(); RequiredMaxRepValue = questRecord[20].GetInt32(); PrevQuestId = questRecord[21].GetInt32(); NextQuestId = questRecord[22].GetInt32(); ExclusiveGroup = questRecord[23].GetInt32(); NextQuestIdChain = questRecord[24].GetUInt32(); - RewardXPId = questRecord[25].GetUInt32(); + RewardXPId = questRecord[25].GetUInt8(); RewardOrRequiredMoney = questRecord[26].GetInt32(); RewardMoneyMaxLevel = questRecord[27].GetUInt32(); RewardSpell = questRecord[28].GetUInt32(); @@ -57,15 +57,15 @@ Quest::Quest(Field* questRecord) RewardMailTemplateId = questRecord[32].GetUInt32(); RewardMailDelay = questRecord[33].GetUInt32(); SourceItemId = questRecord[34].GetUInt32(); - SourceItemIdCount = questRecord[35].GetUInt32(); + SourceItemIdCount = questRecord[35].GetUInt8(); SourceSpellid = questRecord[36].GetUInt32(); Flags = questRecord[37].GetUInt32(); - uint32 SpecialFlags = questRecord[38].GetUInt16(); + uint32 SpecialFlags = questRecord[38].GetUInt8(); MinimapTargetMark = questRecord[39].GetUInt32(); - RewardTitleId = questRecord[40].GetUInt32(); - RequiredPlayerKills = questRecord[41].GetUInt32(); - RewardTalents = questRecord[42].GetUInt32(); - RewardArenaPoints = questRecord[43].GetInt32(); + RewardTitleId = questRecord[40].GetUInt8(); + RequiredPlayerKills = questRecord[41].GetUInt8(); + RewardTalents = questRecord[42].GetUInt8(); + RewardArenaPoints = questRecord[43].GetUInt16(); RewardSkillId = questRecord[44].GetUInt32(); RewardSkillPoints = questRecord[45].GetUInt32(); RewardReputationMask = questRecord[46].GetUInt32(); @@ -76,16 +76,16 @@ Quest::Quest(Field* questRecord) RewardItemId[i] = questRecord[49+i].GetUInt32(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewardItemIdCount[i] = questRecord[53+i].GetUInt32(); + RewardItemIdCount[i] = questRecord[53+i].GetUInt16(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) RewardChoiceItemId[i] = questRecord[57+i].GetUInt32(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewardChoiceItemCount[i] = questRecord[63+i].GetUInt32(); + RewardChoiceItemCount[i] = questRecord[63+i].GetUInt16(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionId[i] = questRecord[69+i].GetUInt32(); + RewardFactionId[i] = questRecord[69+i].GetUInt16(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) RewardFactionValueId[i] = questRecord[74+i].GetInt32(); @@ -93,7 +93,7 @@ Quest::Quest(Field* questRecord) for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) RewardFactionValueIdOverride[i] = questRecord[79+i].GetInt32(); - PointMapId = questRecord[84].GetUInt32(); + PointMapId = questRecord[84].GetUInt16(); PointX = questRecord[85].GetFloat(); PointY = questRecord[86].GetFloat(); PointOption = questRecord[87].GetUInt32(); @@ -109,19 +109,19 @@ Quest::Quest(Field* questRecord) RequiredNpcOrGo[i] = questRecord[95+i].GetInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGoCount[i] = questRecord[99+i].GetUInt32(); + RequiredNpcOrGoCount[i] = questRecord[99+i].GetUInt16(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) RequiredSourceItemId[i] = questRecord[103+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemCount[i] = questRecord[107+i].GetUInt32(); + RequiredSourceItemCount[i] = questRecord[107+i].GetUInt16(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) RequiredItemId[i] = questRecord[111+i].GetUInt32(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemCount[i] = questRecord[117+i].GetUInt32(); + RequiredItemCount[i] = questRecord[117+i].GetUInt16(); RequiredSpell = questRecord[123].GetUInt32(); @@ -151,16 +151,16 @@ Quest::Quest(Field* questRecord) SoundTurnIn = questRecord[153].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = questRecord[154+i].GetUInt32(); + DetailsEmote[i] = questRecord[154+i].GetUInt16(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) DetailsEmoteDelay[i] = questRecord[158+i].GetUInt32(); - EmoteOnIncomplete = questRecord[162].GetUInt32(); - EmoteOnComplete = questRecord[163].GetUInt32(); + EmoteOnIncomplete = questRecord[162].GetUInt16(); + EmoteOnComplete = questRecord[163].GetUInt16(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = questRecord[164+i].GetInt32(); + OfferRewardEmote[i] = questRecord[164+i].GetInt16(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) OfferRewardEmoteDelay[i] = questRecord[168+i].GetInt32(); diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index b1f38dfb86d..94a6590cc4a 100755 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -166,15 +166,16 @@ void ReputationMgr::SendState(FactionState const* faction) { uint32 count = 1; - WorldPacket data(SMSG_SET_FACTION_STANDING, (16)); // last check 2.4.0 - data << (float) 0; // unk 2.4.0 - data << (uint8) 0; // wotlk 8634 + WorldPacket data(SMSG_SET_FACTION_STANDING, 17); + data << float(0); + data << uint8(_sendFactionIncreased); + _sendFactionIncreased = false; // Reset size_t p_count = data.wpos(); - data << (uint32) count; // placeholder + data << uint32(count); - data << (uint32) faction->ReputationListID; - data << (uint32) faction->Standing; + data << uint32(faction->ReputationListID); + data << uint32(faction->Standing); for (FactionStateList::iterator itr = _factions.begin(); itr != _factions.end(); ++itr) { @@ -183,8 +184,8 @@ void ReputationMgr::SendState(FactionState const* faction) itr->second.needSend = false; if (itr->second.ReputationListID != faction->ReputationListID) { - data << (uint32) itr->second.ReputationListID; - data << (uint32) itr->second.Standing; + data << uint32(itr->second.ReputationListID); + data << uint32(itr->second.Standing); ++count; } } @@ -253,6 +254,7 @@ void ReputationMgr::Initialize() _honoredFactionCount = 0; _reveredFactionCount = 0; _exaltedFactionCount = 0; + _sendFactionIncreased = false; for (unsigned int i = 1; i < sFactionStore.GetNumRows(); i++) { @@ -337,6 +339,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi } } } + // spillover done, update faction itself FactionStateList::iterator faction = _factions.find(factionEntry->reputationListID); if (faction != _factions.end()) @@ -379,11 +382,14 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in if (new_rank <= REP_HOSTILE) SetAtWar(&itr->second, true); + if (new_rank > old_rank) + _sendFactionIncreased = true; + UpdateRankCounters(old_rank, new_rank); _player->ReputationChanged(factionEntry); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID); + _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID); + _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID); _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, factionEntry->ID); _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, factionEntry->ID); _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, factionEntry->ID); @@ -515,7 +521,7 @@ void ReputationMgr::LoadFromDB(PreparedQueryResult result) FactionState* faction = &_factions[factionEntry->reputationListID]; // update standing to current - faction->Standing = int32(fields[1].GetUInt32()); + faction->Standing = fields[1].GetInt32(); // update counters int32 BaseRep = GetBaseReputation(factionEntry); @@ -562,8 +568,18 @@ void ReputationMgr::SaveToDB(SQLTransaction& trans) { if (itr->second.needSave) { - trans->PAppend("DELETE FROM character_reputation WHERE guid = '%u' AND faction='%u'", _player->GetGUIDLow(), itr->second.ID); - trans->PAppend("INSERT INTO character_reputation (guid, faction, standing, flags) VALUES ('%u', '%u', '%i', '%u')", _player->GetGUIDLow(), itr->second.ID, itr->second.Standing, itr->second.Flags); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION); + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt16(1, uint16(itr->second.ID)); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION); + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt16(1, uint16(itr->second.ID)); + stmt->setInt32(2, itr->second.Standing); + stmt->setUInt16(3, uint16(itr->second.Flags)); + trans->Append(stmt); + itr->second.needSave = false; } } diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h index 84013f7ec20..a073845ea73 100755 --- a/src/server/game/Reputation/ReputationMgr.h +++ b/src/server/game/Reputation/ReputationMgr.h @@ -132,6 +132,9 @@ class ReputationMgr void ApplyForceReaction(uint32 faction_id, ReputationRank rank, bool apply); + //! Public for chat command needs + bool SetOneFactionReputation(FactionEntry const* factionEntry, int32 standing, bool incremental); + public: // senders void SendInitialReputations(); void SendForceReactions(); @@ -142,7 +145,6 @@ class ReputationMgr void Initialize(); uint32 GetDefaultStateFlags(FactionEntry const* factionEntry) const; bool SetReputation(FactionEntry const* factionEntry, int32 standing, bool incremental); - bool SetOneFactionReputation(FactionEntry const* factionEntry, int32 standing, bool incremental); void SetVisible(FactionState* faction); void SetAtWar(FactionState* faction, bool atWar) const; void SetInactive(FactionState* faction, bool inactive) const; @@ -156,6 +158,7 @@ class ReputationMgr uint8 _honoredFactionCount :8; uint8 _reveredFactionCount :8; uint8 _exaltedFactionCount :8; + bool _sendFactionIncreased; //! Play visual effect on next SMSG_SET_FACTION_STANDING sent }; #endif diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 7757e1a1a35..5387a3132c6 100755 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -39,9 +39,9 @@ void Map::ScriptsStart(ScriptMapMap const& scripts, uint32 id, Object* source, O return; // prepare static data - uint64 sourceGUID = source ? source->GetGUID() : (uint64)0; //some script commands doesn't have source - uint64 targetGUID = target ? target->GetGUID() : (uint64)0; - uint64 ownerGUID = (source->GetTypeId() == TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : (uint64)0; + uint64 sourceGUID = source ? source->GetGUID() : uint64(0); //some script commands doesn't have source + uint64 targetGUID = target ? target->GetGUID() : uint64(0); + uint64 ownerGUID = (source && source->GetTypeId() == TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : uint64(0); ///- Schedule script execution for all scripts in the script map ScriptMap const* s2 = &(s->second); @@ -74,9 +74,9 @@ void Map::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* sou // NOTE: script record _must_ exist until command executed // prepare static data - uint64 sourceGUID = source ? source->GetGUID() : (uint64)0; - uint64 targetGUID = target ? target->GetGUID() : (uint64)0; - uint64 ownerGUID = (source->GetTypeId() == TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : (uint64)0; + uint64 sourceGUID = source ? source->GetGUID() : uint64(0); + uint64 targetGUID = target ? target->GetGUID() : uint64(0); + uint64 ownerGUID = (source && source->GetTypeId() == TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : uint64(0); ScriptAction sa; sa.sourceGUID = sourceGUID; @@ -375,22 +375,22 @@ void Map::ScriptsProcess() } if (step.script->Talk.Flags & SF_TALK_USE_PLAYER) { - if (Player* pSource = _GetScriptPlayerSourceOrTarget(source, target, step.script)) + if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script)) { - LocaleConstant loc_idx = pSource->GetSession()->GetSessionDbLocaleIndex(); + LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); std::string text(sObjectMgr->GetTrinityString(step.script->Talk.TextID, loc_idx)); switch (step.script->Talk.ChatType) { case CHAT_TYPE_SAY: - pSource->Say(text, LANG_UNIVERSAL); + player->Say(text, LANG_UNIVERSAL); break; case CHAT_TYPE_YELL: - pSource->Yell(text, LANG_UNIVERSAL); + player->Yell(text, LANG_UNIVERSAL); break; case CHAT_TYPE_TEXT_EMOTE: case CHAT_TYPE_BOSS_EMOTE: - pSource->TextEmote(text); + player->TextEmote(text); break; case CHAT_TYPE_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: @@ -399,7 +399,7 @@ void Map::ScriptsProcess() if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) sLog->outError("%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); else - pSource->Whisper(text, LANG_UNIVERSAL, targetGUID); + player->Whisper(text, LANG_UNIVERSAL, targetGUID); break; } default: @@ -524,8 +524,8 @@ void Map::ScriptsProcess() else { // Source or target must be Player. - if (Player* pSource = _GetScriptPlayerSourceOrTarget(source, target, step.script)) - pSource->TeleportTo(step.script->TeleportTo.MapID, step.script->TeleportTo.DestX, step.script->TeleportTo.DestY, step.script->TeleportTo.DestZ, step.script->TeleportTo.Orientation); + if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script)) + player->TeleportTo(step.script->TeleportTo.MapID, step.script->TeleportTo.DestX, step.script->TeleportTo.DestY, step.script->TeleportTo.DestZ, step.script->TeleportTo.Orientation); } break; @@ -544,8 +544,8 @@ void Map::ScriptsProcess() // when script called for item spell casting then target == (unit or GO) and source is player WorldObject* worldObject; - Player* plrTarget = target->ToPlayer(); - if (plrTarget) + Player* player = target->ToPlayer(); + if (player) { if (source->GetTypeId() != TYPEID_UNIT && source->GetTypeId() != TYPEID_GAMEOBJECT && source->GetTypeId() != TYPEID_PLAYER) { @@ -557,8 +557,8 @@ void Map::ScriptsProcess() } else { - plrTarget = source->ToPlayer(); - if (plrTarget) + player = source->ToPlayer(); + if (player) { if (target->GetTypeId() != TYPEID_UNIT && target->GetTypeId() != TYPEID_GAMEOBJECT && target->GetTypeId() != TYPEID_PLAYER) { @@ -566,7 +566,7 @@ void Map::ScriptsProcess() step.script->GetDebugInfo().c_str(), target->GetTypeId(), target->GetEntry(), target->GetGUIDLow()); break; } - worldObject = dynamic_cast(target); + worldObject = dynamic_cast(target); } else { @@ -579,22 +579,22 @@ void Map::ScriptsProcess() // quest id and flags checked at script loading if ((worldObject->GetTypeId() != TYPEID_UNIT || ((Unit*)worldObject)->isAlive()) && - (step.script->QuestExplored.Distance == 0 || worldObject->IsWithinDistInMap(plrTarget, float(step.script->QuestExplored.Distance)))) - plrTarget->AreaExploredOrEventHappens(step.script->QuestExplored.QuestID); + (step.script->QuestExplored.Distance == 0 || worldObject->IsWithinDistInMap(player, float(step.script->QuestExplored.Distance)))) + player->AreaExploredOrEventHappens(step.script->QuestExplored.QuestID); else - plrTarget->FailQuest(step.script->QuestExplored.QuestID); + player->FailQuest(step.script->QuestExplored.QuestID); break; } case SCRIPT_COMMAND_KILL_CREDIT: // Source or target must be Player. - if (Player* pSource = _GetScriptPlayerSourceOrTarget(source, target, step.script)) + if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script)) { if (step.script->KillCredit.Flags & SF_KILLCREDIT_REWARD_GROUP) - pSource->RewardPlayerAndGroupAtEvent(step.script->KillCredit.CreatureEntry, pSource); + player->RewardPlayerAndGroupAtEvent(step.script->KillCredit.CreatureEntry, player); else - pSource->KilledMonsterCredit(step.script->KillCredit.CreatureEntry, 0); + player->KilledMonsterCredit(step.script->KillCredit.CreatureEntry, 0); } break; @@ -665,7 +665,7 @@ void Map::ScriptsProcess() case SCRIPT_COMMAND_ACTIVATE_OBJECT: // Source must be Unit. - if (Unit* pSource = _GetScriptUnit(source, true, step.script)) + if (Unit* unit = _GetScriptUnit(source, true, step.script)) { // Target must be GameObject. if (!target) @@ -682,7 +682,7 @@ void Map::ScriptsProcess() } if (GameObject* pGO = target->ToGameObject()) - pGO->Use(pSource); + pGO->Use(unit); } break; @@ -690,8 +690,8 @@ void Map::ScriptsProcess() { // Source (datalong2 != 0) or target (datalong2 == 0) must be Unit. bool bReverse = step.script->RemoveAura.Flags & SF_REMOVEAURA_REVERSE; - if (Unit* pTarget = _GetScriptUnit(bReverse ? source : target, bReverse, step.script)) - pTarget->RemoveAurasDueToSpell(step.script->RemoveAura.SpellID); + if (Unit* unit = _GetScriptUnit(bReverse ? source : target, bReverse, step.script)) + unit->RemoveAurasDueToSpell(step.script->RemoveAura.SpellID); break; } @@ -752,23 +752,23 @@ void Map::ScriptsProcess() case SCRIPT_COMMAND_PLAY_SOUND: // Source must be WorldObject. - if (WorldObject* pSource = _GetScriptWorldObject(source, true, step.script)) + if (WorldObject* object = _GetScriptWorldObject(source, true, step.script)) { // PlaySound.Flags bitmask: 0/1=anyone/target - Player* pTarget = NULL; + Player* player = NULL; if (step.script->PlaySound.Flags & SF_PLAYSOUND_TARGET_PLAYER) { // Target must be Player. - pTarget = _GetScriptPlayer(target, false, step.script); - if (!pTarget) + player = _GetScriptPlayer(target, false, step.script); + if (!target) break; } // PlaySound.Flags bitmask: 0/2=without/with distance dependent if (step.script->PlaySound.Flags & SF_PLAYSOUND_DISTANCE_SOUND) - pSource->PlayDistanceSound(step.script->PlaySound.SoundID, pTarget); + object->PlayDistanceSound(step.script->PlaySound.SoundID, player); else - pSource->PlayDirectSound(step.script->PlaySound.SoundID, pTarget); + object->PlayDirectSound(step.script->PlaySound.SoundID, player); } break; @@ -796,12 +796,12 @@ void Map::ScriptsProcess() case SCRIPT_COMMAND_LOAD_PATH: // Source must be Unit. - if (Unit* pSource = _GetScriptUnit(source, true, step.script)) + if (Unit* unit = _GetScriptUnit(source, true, step.script)) { if (!sWaypointMgr->GetPath(step.script->LoadPath.PathID)) sLog->outError("%s source object has an invalid path (%u), skipping.", step.script->GetDebugInfo().c_str(), step.script->LoadPath.PathID); else - pSource->GetMotionMaster()->MovePath(step.script->LoadPath.PathID, step.script->LoadPath.IsRepeatable); + unit->GetMotionMaster()->MovePath(step.script->LoadPath.PathID, step.script->LoadPath.IsRepeatable); } break; @@ -876,21 +876,21 @@ void Map::ScriptsProcess() case SCRIPT_COMMAND_ORIENTATION: // Source must be Unit. - if (Unit* pSource = _GetScriptUnit(source, true, step.script)) + if (Unit* sourceUnit = _GetScriptUnit(source, true, step.script)) { - if (step.script->Orientation.Flags& SF_ORIENTATION_FACE_TARGET) + if (step.script->Orientation.Flags & SF_ORIENTATION_FACE_TARGET) { // Target must be Unit. - Unit* pTarget = _GetScriptUnit(target, false, step.script); - if (!pTarget) + Unit* targetUnit = _GetScriptUnit(target, false, step.script); + if (!targetUnit) break; - pSource->SetInFront(pTarget); + sourceUnit->SetInFront(targetUnit); } else - pSource->SetOrientation(step.script->Orientation.Orientation); + sourceUnit->SetOrientation(step.script->Orientation.Orientation); - pSource->SendMovementFlagUpdate(); + sourceUnit->SendMovementFlagUpdate(); } break; @@ -908,14 +908,14 @@ void Map::ScriptsProcess() case SCRIPT_COMMAND_CLOSE_GOSSIP: // Source must be Player. - if (Player* pSource = _GetScriptPlayer(source, true, step.script)) - pSource->PlayerTalkClass->SendCloseGossip(); + if (Player* player = _GetScriptPlayer(source, true, step.script)) + player->PlayerTalkClass->SendCloseGossip(); break; case SCRIPT_COMMAND_PLAYMOVIE: // Source must be Player. - if (Player* pSource = _GetScriptPlayer(source, true, step.script)) - pSource->SendMovieStart(step.script->PlayMovie.MovieID); + if (Player* player = _GetScriptPlayer(source, true, step.script)) + player->SendMovieStart(step.script->PlayMovie.MovieID); break; default: diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 1207b654817..f64d0953e86 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -61,7 +61,6 @@ void AddSC_reload_commandscript(); void AddSC_tele_commandscript(); void AddSC_titles_commandscript(); void AddSC_wp_commandscript(); -void AddSC_gps_commandscript(); #ifdef SCRIPTS //world @@ -151,7 +150,6 @@ void AddSC_boss_sulfuron(); void AddSC_boss_majordomo(); void AddSC_boss_ragnaros(); void AddSC_instance_molten_core(); -void AddSC_molten_core(); void AddSC_the_scarlet_enclave(); //Scarlet Enclave void AddSC_the_scarlet_enclave_c1(); void AddSC_the_scarlet_enclave_c2(); @@ -426,6 +424,7 @@ void AddSC_ulduar_teleporter(); void AddSC_boss_mimiron(); void AddSC_boss_hodir(); void AddSC_boss_freya(); +void AddSC_boss_algalon_the_observer(); void AddSC_instance_ulduar(); void AddSC_boss_keleseth(); //Utgarde Keep void AddSC_boss_skarvald_dalronn(); @@ -664,7 +663,6 @@ void AddCommandScripts() AddSC_tele_commandscript(); AddSC_titles_commandscript(); AddSC_wp_commandscript(); - AddSC_gps_commandscript(); } void AddWorldScripts() @@ -761,7 +759,6 @@ void AddEasternKingdomsScripts() AddSC_boss_majordomo(); AddSC_boss_ragnaros(); AddSC_instance_molten_core(); - AddSC_molten_core(); AddSC_the_scarlet_enclave(); //Scarlet Enclave AddSC_the_scarlet_enclave_c1(); AddSC_the_scarlet_enclave_c2(); @@ -1131,6 +1128,7 @@ void AddNorthrendScripts() AddSC_boss_mimiron(); AddSC_boss_hodir(); AddSC_boss_freya(); + AddSC_boss_algalon_the_observer(); AddSC_instance_ulduar(); AddSC_boss_keleseth(); //Utgarde Keep AddSC_boss_skarvald_dalronn(); diff --git a/src/server/game/Scripting/ScriptLoader.h b/src/server/game/Scripting/ScriptLoader.h index 409b3db4b7f..0db6917a0d4 100644 --- a/src/server/game/Scripting/ScriptLoader.h +++ b/src/server/game/Scripting/ScriptLoader.h @@ -1,6 +1,19 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 -* This program is free software licensed under GPL version 2 -* Please see the included DOCS/LICENSE.TXT for more information */ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ #ifndef SC_SCRIPTLOADER_H #define SC_SCRIPTLOADER_H diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 47751338d66..23d18e12097 100755 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -181,7 +181,7 @@ void DoScriptText(int32 iTextEntry, WorldObject* pSource, Unit* target) if (pData->uiSoundId) { - if (GetSoundEntriesStore()->LookupEntry(pData->uiSoundId)) + if (sSoundEntriesStore.LookupEntry(pData->uiSoundId)) pSource->SendPlaySound(pData->uiSoundId, false); else sLog->outError("TSCR: DoScriptText entry %i tried to process invalid sound id %u.", iTextEntry, pData->uiSoundId); @@ -260,7 +260,7 @@ void ScriptMgr::Initialize() void ScriptMgr::Unload() { #define SCR_CLEAR(T) \ - FOR_SCRIPTS(T, itr, end) \ + for (SCR_REG_ITR(T) itr = SCR_REG_LST(T).begin(); itr != SCR_REG_LST(T).end(); ++itr) \ delete itr->second; \ SCR_REG_LST(T).clear(); @@ -582,7 +582,7 @@ void ScriptMgr::OnCreateMap(Map* map) { ASSERT(map); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnCreate(map); SCR_MAP_END; @@ -599,7 +599,7 @@ void ScriptMgr::OnDestroyMap(Map* map) { ASSERT(map); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnDestroy(map); SCR_MAP_END; @@ -617,7 +617,7 @@ void ScriptMgr::OnLoadGridMap(Map* map, GridMap* gmap, uint32 gx, uint32 gy) ASSERT(map); ASSERT(gmap); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnLoadGridMap(map, gmap, gx, gy); SCR_MAP_END; @@ -635,7 +635,7 @@ void ScriptMgr::OnUnloadGridMap(Map* map, GridMap* gmap, uint32 gx, uint32 gy) ASSERT(map); ASSERT(gmap); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnUnloadGridMap(map, gmap, gx, gy); SCR_MAP_END; @@ -653,7 +653,7 @@ void ScriptMgr::OnPlayerEnterMap(Map* map, Player* player) ASSERT(map); ASSERT(player); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnPlayerEnter(map, player); SCR_MAP_END; @@ -671,7 +671,7 @@ void ScriptMgr::OnPlayerLeaveMap(Map* map, Player* player) ASSERT(map); ASSERT(player); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnPlayerLeave(map, player); SCR_MAP_END; @@ -688,7 +688,7 @@ void ScriptMgr::OnMapUpdate(Map* map, uint32 diff) { ASSERT(map); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsContinent); + SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); itr->second->OnUpdate(map, diff); SCR_MAP_END; @@ -937,6 +937,22 @@ void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player) tmpscript->OnDamaged(go, player); } +void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit) +{ + ASSERT(go); + + GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); + tmpscript->OnLootStateChanged(go, state, unit); +} + +void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state) +{ + ASSERT(go); + + GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); + tmpscript->OnGameObjectStateChanged(go, state); +} + void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff) { ASSERT(go); @@ -954,6 +970,14 @@ bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effInd return tmpscript->OnDummyEffect(caster, spellId, effIndex, target); } +GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* go) +{ + ASSERT(go); + + GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, NULL); + return tmpscript->GetAI(go); +} + bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger) { ASSERT(player); @@ -1295,6 +1319,11 @@ void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, ui FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent); } +void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea) +{ + FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea); +} + // Guild void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank) { @@ -1410,7 +1439,7 @@ FormulaScript::FormulaScript(const char* name) WorldMapScript::WorldMapScript(const char* name, uint32 mapId) : ScriptObject(name), MapScript(mapId) { - if (GetEntry() && !GetEntry()->IsContinent()) + if (GetEntry() && !GetEntry()->IsWorldMap()) sLog->outError("WorldMapScript for map %u is invalid.", mapId); ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 048a7581215..b3d445af0c6 100755 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -39,6 +39,7 @@ class Creature; class CreatureAI; class DynamicObject; class GameObject; +class GameObjectAI; class Guild; class GridMap; class Group; @@ -471,6 +472,15 @@ class GameObjectScript : public ScriptObject, public UpdatableScript // Called when the game object is damaged (destructible buildings only). virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { } + + // Called when the game object loot state is changed. + virtual void OnLootStateChanged(GameObject* /*go*/, uint32 /*state*/, Unit* /*unit*/) { } + + // Called when the game object state is changed. + virtual void OnGameObjectStateChanged(GameObject* /*go*/, uint32 /*state*/) { } + + // Called when a GameObjectAI object is needed for the gameobject. + virtual GameObjectAI* GetAI(GameObject* /*go*/) const { return NULL; } }; class AreaTriggerScript : public ScriptObject @@ -724,6 +734,9 @@ class PlayerScript : public ScriptObject // Called when a player is bound to an instance virtual void OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/) { } + + // Called when a player switches to a new zone + virtual void OnUpdateZone(Player* /*player*/, uint32 /*newZone*/, uint32 /*newArea*/) { } }; class GuildScript : public ScriptObject @@ -907,7 +920,10 @@ class ScriptMgr uint32 GetDialogStatus(Player* player, GameObject* go); void OnGameObjectDestroyed(GameObject* go, Player* player); void OnGameObjectDamaged(GameObject* go, Player* player); + void OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit); + void OnGameObjectStateChanged(GameObject* go, uint32 state); void OnGameObjectUpdate(GameObject* go, uint32 diff); + GameObjectAI* GetGameObjectAI(GameObject* go); public: /* AreaTriggerScript */ @@ -993,6 +1009,7 @@ class ScriptMgr void OnPlayerCreate(Player* player); void OnPlayerDelete(uint64 guid); void OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent); + void OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea); public: /* GuildScript */ diff --git a/src/server/game/Scripting/ScriptSystem.cpp b/src/server/game/Scripting/ScriptSystem.cpp index 56d3109a6a0..c38d559372f 100755 --- a/src/server/game/Scripting/ScriptSystem.cpp +++ b/src/server/game/Scripting/ScriptSystem.cpp @@ -30,7 +30,8 @@ void SystemMgr::LoadScriptTexts() sLog->outString("TSCR: Loading Script Texts additional data..."); uint32 oldMSTime = getMSTime(); - + + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT entry, sound, type, language, emote FROM script_texts"); if (!result) @@ -49,9 +50,9 @@ void SystemMgr::LoadScriptTexts() int32 iId = pFields[0].GetInt32(); temp.uiSoundId = pFields[1].GetUInt32(); - temp.uiType = pFields[2].GetUInt32(); - temp.uiLanguage = pFields[3].GetUInt32(); - temp.uiEmote = pFields[4].GetUInt32(); + temp.uiType = pFields[2].GetUInt8(); + temp.uiLanguage = pFields[3].GetUInt8(); + temp.uiEmote = pFields[4].GetUInt16(); if (iId >= 0) { @@ -67,7 +68,7 @@ void SystemMgr::LoadScriptTexts() if (temp.uiSoundId) { - if (!GetSoundEntriesStore()->LookupEntry(temp.uiSoundId)) + if (!sSoundEntriesStore.LookupEntry(temp.uiSoundId)) sLog->outErrorDb("TSCR: Entry %i in table `script_texts` has soundId %u but sound does not exist.", iId, temp.uiSoundId); } @@ -79,7 +80,8 @@ void SystemMgr::LoadScriptTexts() m_mTextDataMap[iId] = temp; ++uiCount; - } while (result->NextRow()); + } + while (result->NextRow()); sLog->outString(">> Loaded %u additional Script Texts data in %u ms", uiCount, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); @@ -108,11 +110,11 @@ void SystemMgr::LoadScriptTextsCustom() Field* pFields = result->Fetch(); StringTextData temp; - int32 iId = pFields[0].GetInt32(); + int32 iId = pFields[0].GetInt32(); temp.uiSoundId = pFields[1].GetUInt32(); - temp.uiType = pFields[2].GetUInt32(); - temp.uiLanguage = pFields[3].GetUInt32(); - temp.uiEmote = pFields[4].GetUInt32(); + temp.uiType = pFields[2].GetUInt8(); + temp.uiLanguage = pFields[3].GetUInt8(); + temp.uiEmote = pFields[4].GetUInt16(); if (iId >= 0) { @@ -128,7 +130,7 @@ void SystemMgr::LoadScriptTextsCustom() if (temp.uiSoundId) { - if (!GetSoundEntriesStore()->LookupEntry(temp.uiSoundId)) + if (!sSoundEntriesStore.LookupEntry(temp.uiSoundId)) sLog->outErrorDb("TSCR: Entry %i in table `custom_texts` has soundId %u but sound does not exist.", iId, temp.uiSoundId); } @@ -140,7 +142,8 @@ void SystemMgr::LoadScriptTextsCustom() m_mTextDataMap[iId] = temp; ++uiCount; - } while (result->NextRow()); + } + while (result->NextRow()); sLog->outString(">> Loaded %u additional Custom Texts data.", uiCount); sLog->outString(); @@ -162,6 +165,7 @@ void SystemMgr::LoadScriptWaypoints() sLog->outString("TSCR: Loading Script Waypoints for " UI64FMTD " creature(s)...", uiCreatureCount); + // 0 1 2 3 4 5 result = WorldDatabase.Query("SELECT entry, pointid, location_x, location_y, location_z, waittime FROM script_waypoint ORDER BY pointid"); if (!result) @@ -199,7 +203,8 @@ void SystemMgr::LoadScriptWaypoints() m_mPointMoveMap[uiEntry].push_back(temp); ++count; - } while (result->NextRow()); + } + while (result->NextRow()); sLog->outString(">> Loaded %u Script Waypoint nodes in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); diff --git a/src/server/game/Scripting/ScriptSystem.h b/src/server/game/Scripting/ScriptSystem.h index daa7fe0d596..cf6332b22f2 100644 --- a/src/server/game/Scripting/ScriptSystem.h +++ b/src/server/game/Scripting/ScriptSystem.h @@ -4,6 +4,7 @@ #ifndef SC_SYSTEM_H #define SC_SYSTEM_H + #include #define TEXT_SOURCE_RANGE -1000000 //the amount of entries each text source has available diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 8e53d6230c4..a3fd1f523d9 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1183,7 +1183,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_OPCODE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); DEFINE_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 65fa2a5a950..66fd54cd960 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -454,7 +454,8 @@ enum Opcodes CMSG_UNLEARN_SKILL = 0xAC3, CMSG_UNREGISTER_ALL_ADDON_PREFIXES = 0x00, CMSG_UPDATE_ACCOUNT_DATA = 0x4AFE, - CMSG_UPDATE_PROJECTILE_POSITION = 0xEDB, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x9525, + CMSG_UPDATE_PROJECTILE_POSITION = 0x00, // sub_677360 CMSG_USE_ITEM = 0xD8EA, CMSG_VIOLENCE_LEVEL = 0x00, CMSG_VOICE_SESSION_ENABLE = 0x00, diff --git a/src/server/game/Server/Protocol/WorldLog.cpp b/src/server/game/Server/Protocol/WorldLog.cpp index 5b1a3af996f..38b13dff095 100755 --- a/src/server/game/Server/Protocol/WorldLog.cpp +++ b/src/server/game/Server/Protocol/WorldLog.cpp @@ -34,6 +34,7 @@ WorldLog::~WorldLog() { if (i_file != NULL) fclose(i_file); + i_file = NULL; } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index e93c0eb8102..a9e4ffbf362 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -48,7 +48,7 @@ bool MapSessionFilter::Process(WorldPacket* packet) { Opcodes opcode = DropHighBytes(packet->GetOpcode()); - const OpcodeHandler* opHandle = opcodeTable[opcode]; + OpcodeHandler const* opHandle = opcodeTable[opcode]; //let's check if our opcode can be really processed in Map::Update() if (opHandle->packetProcessing == PROCESS_INPLACE) @@ -71,7 +71,7 @@ bool MapSessionFilter::Process(WorldPacket* packet) bool WorldSessionFilter::Process(WorldPacket* packet) { Opcodes opcode = DropHighBytes(packet->GetOpcode()); - const OpcodeHandler* opHandle = opcodeTable[opcode]; + OpcodeHandler const* opHandle = opcodeTable[opcode]; //check if packet handler is supposed to be safe if (opHandle->packetProcessing == PROCESS_INPLACE) return true; @@ -123,8 +123,8 @@ WorldSession::~WorldSession() /// - If have unclosed socket, close it if (m_Socket) { - m_Socket->CloseSocket (); - m_Socket->RemoveReference (); + m_Socket->CloseSocket(); + m_Socket->RemoveReference(); m_Socket = NULL; } @@ -139,7 +139,7 @@ WorldSession::~WorldSession() LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = %u;", GetAccountId()); // One-time query } -void WorldSession::SizeError(WorldPacket const &packet, uint32 size) const +void WorldSession::SizeError(WorldPacket const& packet, uint32 size) const { sLog->outError("Client (account %u) send packet %s (%u) with size " SIZEFMTD " but expected %u (attempt to crash server?), skipped", GetAccountId(), LookupOpcodeName(packet.GetOpcode()), packet.GetOpcode(), packet.size(), size); @@ -205,8 +205,8 @@ void WorldSession::SendPacket(WorldPacket const* packet) } #endif // !TRINITY_DEBUG - if (m_Socket->SendPacket (*packet) == -1) - m_Socket->CloseSocket (); + if (m_Socket->SendPacket(*packet) == -1) + m_Socket->CloseSocket(); } /// Add an incoming packet to the queue @@ -292,7 +292,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) // lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer break; case STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT: - if (!_player && !m_playerRecentlyLogout) + if (!_player && !m_playerRecentlyLogout && !m_playerLogout) // There's a short delay between _player = null and m_playerRecentlyLogout = true during logout LogUnexpectedOpcode(packet, "STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT", "the player has not logged in yet and not recently logout"); else @@ -325,9 +325,9 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) break; } - // single from authed time opcodes send in to after logout time - // and before other STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT opcodes. - if (packet->GetOpcode() != CMSG_SET_ACTIVE_VOICE_CHANNEL) + // some auth opcodes can be recieved before STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT opcodes + // however when we recieve CMSG_CHAR_ENUM we are surely no longer during the logout process. + if (packet->GetOpcode() == CMSG_CHAR_ENUM) m_playerRecentlyLogout = false; sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet)); @@ -405,7 +405,7 @@ void WorldSession::LogoutPlayer(bool Save) if (_player) { - if (uint64 lguid = GetPlayer()->GetLootGUID()) + if (uint64 lguid = _player->GetLootGUID()) DoLootRelease(lguid); ///- If the player just died before logging out, make him appear as a ghost @@ -519,44 +519,41 @@ void WorldSession::LogoutPlayer(bool Save) if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket) _player->RemoveFromGroup(); - ///- Send update to group and reset stored max enchanting level + //! Send update to group and reset stored max enchanting level if (_player->GetGroup()) { _player->GetGroup()->SendUpdate(); _player->GetGroup()->ResetMaxEnchantingLevel(); } - ///- Broadcast a logout message to the player's friends + //! Broadcast a logout message to the player's friends sSocialMgr->SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetGUIDLow(), true); - sSocialMgr->RemovePlayerSocial (_player->GetGUIDLow ()); + sSocialMgr->RemovePlayerSocial(_player->GetGUIDLow()); - // Call script hook before deletion - sScriptMgr->OnPlayerLogout(GetPlayer()); + //! Call script hook before deletion + sScriptMgr->OnPlayerLogout(_player); - ///- Remove the player from the world + //! Remove the player from the world // the player may not be in the world when logging out // e.g if he got disconnected during a transfer to another map // calls to GetMap in this case may cause crashes _player->CleanupsBeforeDelete(); - sLog->outChar("Account: %d (IP: %s) Logout Character:[%s] (GUID: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow()); + sLog->outChar("Account: %d (IP: %s) Logout Character:[%s] (GUID: %u) Level: %d", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow(), _player->getLevel()); if (Map* _map = _player->FindMap()) _map->RemovePlayerFromMap(_player, true); - SetPlayer(NULL); // deleted in Remove call - ///- Send the 'logout complete' packet to the client + SetPlayer(NULL); //! Pointer already deleted during RemovePlayerFromMap + + //! Send the 'logout complete' packet to the client + //! Client will respond by sending 3x CMSG_CANCEL_TRADE, which we currently dont handle WorldPacket data(SMSG_LOGOUT_COMPLETE, 0); SendPacket(&data); + sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION: Sent SMSG_LOGOUT_COMPLETE Message"); - ///- Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline - //No SQL injection as AccountId is uint32 - + //! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE); - stmt->setUInt32(0, GetAccountId()); - CharacterDatabase.Execute(stmt); - - sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION: Sent SMSG_LOGOUT_COMPLETE Message"); } m_playerLogout = false; @@ -773,6 +770,7 @@ void WorldSession::ReadAddonsInfo(WorldPacket &data) { if (data.rpos() + 4 > data.size()) return; + uint32 size; data >> size; @@ -792,7 +790,7 @@ void WorldSession::ReadAddonsInfo(WorldPacket &data) ByteBuffer addonInfo; addonInfo.resize(size); - if (uncompress(const_cast(addonInfo.contents()), &uSize, const_cast(data.contents() + pos), data.size() - pos) == Z_OK) + if (uncompress(const_cast(addonInfo.contents()), &uSize, const_cast(data.contents() + pos), data.size() - pos) == Z_OK) { uint32 addonsCount; addonInfo >> addonsCount; // addons count diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 21cc3991b9f..83677aada88 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -31,24 +31,25 @@ #include "WorldPacket.h" #include "Cryptography/BigNumber.h" -struct ItemTemplate; -struct AuctionEntry; -struct DeclinedName; -struct MovementInfo; - +class CalendarEvent; +class CalendarInvite; class Creature; +class GameObject; +class InstanceSave; class Item; +class LoginQueryHolder; class Object; class Player; -class Unit; -class GameObject; class Quest; -class WorldPacket; -class WorldSocket; -class LoginQueryHolder; class SpellCastTargets; +class Unit; class Warden; +class WorldPacket; +class WorldSocket; struct AreaTableEntry; +struct AuctionEntry; +struct DeclinedName; +struct ItemTemplate; struct LfgJoinResultData; struct LfgLockStatus; struct LfgPlayerBoot; @@ -56,6 +57,7 @@ struct LfgProposal; struct LfgReward; struct LfgRoleCheck; struct LfgUpdateData; +struct MovementInfo; enum AccountDataType { @@ -229,6 +231,7 @@ class WorldSession bool PlayerLoading() const { return m_playerLoading; } bool PlayerLogout() const { return m_playerLogout; } bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; } + bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } void SizeError(WorldPacket const& packet, uint32 size) const; @@ -302,7 +305,7 @@ class WorldSession void SendAttackStop(Unit const* enemy); - void SendBattlegGroundList(uint64 guid, BattlegroundTypeId bgTypeId); + void SendBattleGroundList(uint64 guid, BattlegroundTypeId bgTypeId); void SendTradeStatus(TradeStatus status); void SendUpdateTrade(bool trader_data = true); @@ -403,7 +406,7 @@ class WorldSession public: // opcodes handlers void Handle_NULL(WorldPacket& recvPacket); // not used - void Handle_EarlyProccess(WorldPacket& recvPacket);// just mark packets processed in WorldSocket::OnRead + void Handle_EarlyProccess(WorldPacket& recvPacket); // just mark packets processed in WorldSocket::OnRead void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client @@ -799,6 +802,7 @@ class WorldSession void HandleResetInstancesOpcode(WorldPacket& recv_data); void HandleHearthAndResurrect(WorldPacket& recv_data); void HandleInstanceLockResponse(WorldPacket& recvPacket); + void HandleUpdateMissileTrajectory(WorldPacket& recvPacket); // Looking for Dungeon/Raid void HandleLfgSetCommentOpcode(WorldPacket& recv_data); @@ -879,21 +883,36 @@ class WorldSession void HandleAcceptGrantLevel(WorldPacket& recv_data); // Calendar - void HandleCalendarGetCalendar(WorldPacket& recv_data); - void HandleCalendarGetEvent(WorldPacket& recv_data); - void HandleCalendarGuildFilter(WorldPacket& recv_data); - void HandleCalendarArenaTeam(WorldPacket& recv_data); - void HandleCalendarAddEvent(WorldPacket& recv_data); - void HandleCalendarUpdateEvent(WorldPacket& recv_data); - void HandleCalendarRemoveEvent(WorldPacket& recv_data); - void HandleCalendarCopyEvent(WorldPacket& recv_data); - void HandleCalendarEventInvite(WorldPacket& recv_data); - void HandleCalendarEventRsvp(WorldPacket& recv_data); - void HandleCalendarEventRemoveInvite(WorldPacket& recv_data); - void HandleCalendarEventStatus(WorldPacket& recv_data); - void HandleCalendarEventModeratorStatus(WorldPacket& recv_data); - void HandleCalendarComplain(WorldPacket& recv_data); - void HandleCalendarGetNumPending(WorldPacket& recv_data); + void HandleCalendarGetCalendar(WorldPacket& recvData); + void HandleCalendarGetEvent(WorldPacket& recvData); + void HandleCalendarGuildFilter(WorldPacket& recvData); + void HandleCalendarArenaTeam(WorldPacket& recvData); + void HandleCalendarAddEvent(WorldPacket& recvData); + void HandleCalendarUpdateEvent(WorldPacket& recvData); + void HandleCalendarRemoveEvent(WorldPacket& recvData); + void HandleCalendarCopyEvent(WorldPacket& recvData); + void HandleCalendarEventInvite(WorldPacket& recvData); + void HandleCalendarEventRsvp(WorldPacket& recvData); + void HandleCalendarEventRemoveInvite(WorldPacket& recvData); + void HandleCalendarEventStatus(WorldPacket& recvData); + void HandleCalendarEventModeratorStatus(WorldPacket& recvData); + void HandleCalendarComplain(WorldPacket& recvData); + void HandleCalendarGetNumPending(WorldPacket& recvData); + void HandleCalendarEventSignup(WorldPacket& recvData); + + void SendCalendarEvent(CalendarEvent const& calendarEvent, CalendarSendEventType sendEventType); + void SendCalendarEventInvite(CalendarInvite const& invite, bool pending); + void SendCalendarEventInviteAlert(CalendarEvent const& calendarEvent, CalendarInvite const& calendarInvite); + void SendCalendarEventInviteRemove(CalendarInvite const& invite, uint32 flags); + void SendCalendarEventInviteRemoveAlert(CalendarEvent const& calendarEvent, CalendarInviteStatus status); + void SendCalendarEventRemovedAlert(CalendarEvent const& calendarEvent); + void SendCalendarEventUpdateAlert(CalendarEvent const& calendarEvent, CalendarSendEventType sendEventType); + void SendCalendarEventStatus(CalendarEvent const& calendarEvent, CalendarInvite const& invite); + void SendCalendarEventModeratorStatusAlert(CalendarInvite const& invite); + void SendCalendarClearPendingAction(); + void SendCalendarRaidLockout(InstanceSave const* save, bool add); + void SendCalendarRaidLockoutUpdated(InstanceSave const* save); + void SendCalendarCommandResult(CalendarError err, char const* param = NULL); void HandleSpellClick(WorldPacket& recv_data); void HandleMirrorImageDataRequest(WorldPacket& recv_data); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 761d64b200c..3e4a38ba6b1 100755 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -152,7 +152,7 @@ const std::string& WorldSocket::GetRemoteAddress (void) const return m_Address; } -int WorldSocket::SendPacket (const WorldPacket& pct) +int WorldSocket::SendPacket(const WorldPacket& pct) { ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1); @@ -254,7 +254,7 @@ int WorldSocket::open (void *a) if (peer().get_remote_addr(remote_addr) == -1) { - sLog->outError ("WorldSocket::open: peer().get_remote_addr errno = %s", ACE_OS::strerror (errno)); + sLog->outError("WorldSocket::open: peer().get_remote_addr errno = %s", ACE_OS::strerror (errno)); return -1; } @@ -271,7 +271,7 @@ int WorldSocket::open (void *a) // Register with ACE Reactor if (reactor()->register_handler(this, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK) == -1) { - sLog->outError ("WorldSocket::open: unable to register client handler errno = %s", ACE_OS::strerror (errno)); + sLog->outError("WorldSocket::open: unable to register client handler errno = %s", ACE_OS::strerror (errno)); return -1; } @@ -490,7 +490,7 @@ int WorldSocket::handle_input_header (void) if ((header.size < 4) || (header.size > 10240)) { Player* _player = m_Session ? m_Session->GetPlayer() : NULL; - sLog->outError ("WorldSocket::handle_input_header(): client (account: %u, char [GUID: %u, name: %s]) sent malformed packet (size: %d, cmd: %d)", + sLog->outError("WorldSocket::handle_input_header(): client (account: %u, char [GUID: %u, name: %s]) sent malformed packet (size: %d, cmd: %d)", m_Session ? m_Session->GetAccountId() : 0, _player ? _player->GetGUIDLow() : 0, _player ? _player->GetName() : "", @@ -596,7 +596,7 @@ int WorldSocket::handle_input_missing_data (void) // hope this is not hack, as proper m_RecvWPct is asserted around if (!m_RecvWPct) { - sLog->outError ("Forcing close on input m_RecvWPct = NULL"); + sLog->outError("Forcing close on input m_RecvWPct = NULL"); errno = EINVAL; return -1; } @@ -642,7 +642,7 @@ int WorldSocket::cancel_wakeup_output (GuardType& g) (this, ACE_Event_Handler::WRITE_MASK) == -1) { // would be good to store errno from reactor with errno guard - sLog->outError ("WorldSocket::cancel_wakeup_output"); + sLog->outError("WorldSocket::cancel_wakeup_output"); return -1; } @@ -661,7 +661,7 @@ int WorldSocket::schedule_wakeup_output (GuardType& g) if (reactor()->schedule_wakeup (this, ACE_Event_Handler::WRITE_MASK) == -1) { - sLog->outError ("WorldSocket::schedule_wakeup_output"); + sLog->outError("WorldSocket::schedule_wakeup_output"); return -1; } @@ -711,7 +711,7 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct) case CMSG_AUTH_SESSION: if (m_Session) { - sLog->outError ("WorldSocket::ProcessIncoming: Player send CMSG_AUTH_SESSION again"); + sLog->outError("WorldSocket::ProcessIncoming: Player send CMSG_AUTH_SESSION again"); return -1; } @@ -760,7 +760,7 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct) } else { - sLog->outError ("WorldSocket::ProcessIncoming: Client not authed opcode = %u", uint32(opcode)); + sLog->outError("WorldSocket::ProcessIncoming: Client not authed opcode = %u", uint32(opcode)); return -1; } } @@ -846,20 +846,18 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) { packet.Initialize(SMSG_AUTH_RESPONSE, 1); packet << uint8(AUTH_REJECT); - SendPacket (packet); + SendPacket(packet); sLog->outError("WorldSocket::HandleAuthSession: World closed, denying client (%s).", GetRemoteAddress().c_str()); return -1; } // Get the account information from the realmd database - std::string safe_account = account; // Duplicate, else will screw the SHA hash verification below - LoginDatabase.EscapeString (safe_account); - // No SQL injection, username escaped. + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME); - QueryResult result = - LoginDatabase.PQuery ("SELECT " - "id, " //0 + stmt->setString(0, account); + + PreparedQueryResult result = LoginDatabase.Query(stmt); "sessionkey, " //1 "last_ip, " //2 "locked, " //3 @@ -880,9 +878,9 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) packet.Initialize (SMSG_AUTH_RESPONSE, 1); packet << uint8 (AUTH_UNKNOWN_ACCOUNT); - SendPacket (packet); + SendPacket(packet); - sLog->outError ("WorldSocket::HandleAuthSession: Sent Auth Response (unknown account)."); + sLog->outError("WorldSocket::HandleAuthSession: Sent Auth Response (unknown account)."); return -1; } @@ -916,7 +914,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) { packet.Initialize (SMSG_AUTH_RESPONSE, 1); packet << uint8 (AUTH_FAILED); - SendPacket (packet); + SendPacket(packet); sLog->outBasic ("WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs)."); return -1; @@ -953,36 +951,36 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) std::string os = fields[10].GetString(); // Checks gmlevel per Realm - result = LoginDatabase.PQuery ("SELECT " - "RealmID, " //0 - "gmlevel " //1 - "FROM account_access " - "WHERE id = '%d'" - " AND (RealmID = '%d'" - " OR RealmID = '-1')", - id, realmID); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_GMLEVEL_BY_REALMID); + + stmt->setUInt32(0, id); + stmt->setInt32(1, int32(realmID)); + + result = LoginDatabase.Query(stmt); + if (!result) security = 0; else { fields = result->Fetch(); - security = fields[1].GetInt32(); + security = fields[0].GetUInt8(); } // Re-check account ban (same check as in realmd) - QueryResult banresult = - LoginDatabase.PQuery ("SELECT 1 FROM account_banned WHERE id = %u AND active = 1 " - "UNION " - "SELECT 1 FROM ip_banned WHERE ip = '%s'", - id, GetRemoteAddress().c_str()); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BANS); + + stmt->setUInt32(0, id); + stmt->setString(1, GetRemoteAddress()); + + PreparedQueryResult banresult = LoginDatabase.Query(stmt); if (banresult) // if account banned { packet.Initialize (SMSG_AUTH_RESPONSE, 1); packet << uint8 (AUTH_BANNED); - SendPacket (packet); + SendPacket(packet); - sLog->outError ("WorldSocket::HandleAuthSession: Sent Auth Response (Account banned)."); + sLog->outError("WorldSocket::HandleAuthSession: Sent Auth Response (Account banned)."); return -1; } @@ -994,9 +992,9 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) WorldPacket Packet (SMSG_AUTH_RESPONSE, 1); Packet << uint8 (AUTH_UNAVAILABLE); - SendPacket (packet); + SendPacket(packet); - sLog->outDetail ("WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); + sLog->outDetail("WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); return -1; } @@ -1018,7 +1016,11 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) address.c_str()); // Check if this user is by any chance a recruiter - result = LoginDatabase.PQuery ("SELECT 1 FROM account WHERE recruiter = %u", id); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_RECRUITER); + + stmt->setUInt32(0, id); + + result = LoginDatabase.Query(stmt); bool isRecruiter = false; if (result) @@ -1026,7 +1028,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) // Update the last_ip in the database - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_IP); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_IP); stmt->setString(0, address); stmt->setString(1, account); @@ -1109,7 +1111,7 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket) m_Session->SetLatency (latency); else { - sLog->outError ("WorldSocket::HandlePing: peer sent CMSG_PING, " + sLog->outError("WorldSocket::HandlePing: peer sent CMSG_PING, " "but is not authenticated or got recently kicked, " " address = %s", GetRemoteAddress().c_str()); @@ -1119,5 +1121,5 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket) WorldPacket packet (SMSG_PONG, 4); packet << ping; - return SendPacket (packet); + return SendPacket(packet); } diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 375808db569..3a256c07095 100755 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -108,7 +108,7 @@ class WorldSocket : public WorldHandler /// Send A packet on the socket, this function is reentrant. /// @param pct packet to send /// @return -1 of failure - int SendPacket (const WorldPacket& pct); + int SendPacket(const WorldPacket& pct); /// Add reference to this object. long AddReference (void); diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 00a8b263847..d357651a5bf 100755 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -236,7 +236,7 @@ WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address) if (num_threads <= 0) { - sLog->outError ("Network.Threads is wrong in your config file"); + sLog->outError("Network.Threads is wrong in your config file"); return -1; } @@ -253,7 +253,7 @@ WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address) if (m_SockOutUBuff <= 0) { - sLog->outError ("Network.OutUBuff is wrong in your config file"); + sLog->outError("Network.OutUBuff is wrong in your config file"); return -1; } @@ -263,7 +263,7 @@ WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address) if (m_Acceptor->open(listen_addr, m_NetThreads[0].GetReactor(), ACE_NONBLOCK) == -1) { - sLog->outError ("Failed to open acceptor, check if the port is free"); + sLog->outError("Failed to open acceptor, check if the port is free"); return -1; } @@ -327,7 +327,7 @@ WorldSocketMgr::OnSocketOpen (WorldSocket* sock) (void*) & m_SockOutKBuff, sizeof (int)) == -1 && errno != ENOTSUP) { - sLog->outError ("WorldSocketMgr::OnSocketOpen set_option SO_SNDBUF"); + sLog->outError("WorldSocketMgr::OnSocketOpen set_option SO_SNDBUF"); return -1; } } @@ -342,7 +342,7 @@ WorldSocketMgr::OnSocketOpen (WorldSocket* sock) (void*)&ndoption, sizeof (int)) == -1) { - sLog->outError ("WorldSocketMgr::OnSocketOpen: peer().set_option TCP_NODELAY errno = %s", ACE_OS::strerror (errno)); + sLog->outError("WorldSocketMgr::OnSocketOpen: peer().set_option TCP_NODELAY errno = %s", ACE_OS::strerror (errno)); return -1; } } diff --git a/src/server/game/Skills/SkillDiscovery.cpp b/src/server/game/Skills/SkillDiscovery.cpp index 466d3ac83a2..e314fab07be 100755 --- a/src/server/game/Skills/SkillDiscovery.cpp +++ b/src/server/game/Skills/SkillDiscovery.cpp @@ -71,7 +71,7 @@ void LoadSkillDiscoveryTable() uint32 spellId = fields[0].GetUInt32(); int32 reqSkillOrSpell = fields[1].GetInt32(); - uint32 reqSkillValue = fields[2].GetUInt32(); + uint32 reqSkillValue = fields[2].GetUInt16(); float chance = fields[3].GetFloat(); if (chance <= 0) // chance @@ -132,7 +132,8 @@ void LoadSkillDiscoveryTable() } ++count; - } while (result->NextRow()); + } + while (result->NextRow()); if (!ssNonDiscoverableEntries.str().empty()) sLog->outErrorDb("Some items can't be successfully discovered: have in chance field value < 0.000001 in `skill_discovery_template` DB table . List:\n%s", ssNonDiscoverableEntries.str().c_str()); @@ -246,4 +247,3 @@ uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player) return 0; } - diff --git a/src/server/game/Skills/SkillDiscovery.h b/src/server/game/Skills/SkillDiscovery.h index 110adb91cf2..ba5542e0189 100755 --- a/src/server/game/Skills/SkillDiscovery.h +++ b/src/server/game/Skills/SkillDiscovery.h @@ -28,4 +28,3 @@ uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player); bool HasDiscoveredAllSpells(uint32 spellId, Player* player); uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player); #endif - diff --git a/src/server/game/Skills/SkillExtraItems.cpp b/src/server/game/Skills/SkillExtraItems.cpp index b5b6b5d7b96..3bb435145f1 100755 --- a/src/server/game/Skills/SkillExtraItems.cpp +++ b/src/server/game/Skills/SkillExtraItems.cpp @@ -55,7 +55,7 @@ void LoadSkillExtraItemTable() SkillExtraItemStore.clear(); // need for reload - // 0 1 2 3 + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT spellId, requiredSpecialization, additionalCreateChance, additionalMaxNum FROM skill_extra_item_template"); if (!result) @@ -138,4 +138,3 @@ bool canCreateExtraItems(Player* player, uint32 spellId, float &additionalChance // enable extra item creation return true; } - diff --git a/src/server/game/Skills/SkillExtraItems.h b/src/server/game/Skills/SkillExtraItems.h index c4e20b9fbef..0cf49021e1c 100755 --- a/src/server/game/Skills/SkillExtraItems.h +++ b/src/server/game/Skills/SkillExtraItems.h @@ -28,4 +28,3 @@ bool canCreateExtraItems(Player* player, uint32 spellId, float &additionalChance // function to load the extra item creation info from DB void LoadSkillExtraItemTable(); #endif - diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 273fcb4f049..200007c3190 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -536,7 +536,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster) if (GetSpellInfo()->SpellFamilyFlags[1] & 0x1 && GetSpellInfo()->SpellFamilyFlags[2] & 0x8) { // +80.68% from sp bonus - DoneActualBenefit += caster->SpellBaseDamageBonus(m_spellInfo->GetSchoolMask()) * 0.8068f; + DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage DoneActualBenefit = caster->ApplyEffectModifiers(GetSpellInfo(), m_effIndex, DoneActualBenefit); @@ -545,13 +545,13 @@ int32 AuraEffect::CalculateAmount(Unit* caster) else if (GetSpellInfo()->SpellFamilyFlags[0] & 0x8 && GetSpellInfo()->SpellFamilyFlags[2] & 0x8) { // +80.68% from sp bonus - DoneActualBenefit += caster->SpellBaseDamageBonus(m_spellInfo->GetSchoolMask()) * 0.8068f; + DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; } // Frost Ward else if (GetSpellInfo()->SpellFamilyFlags[0] & 0x100 && GetSpellInfo()->SpellFamilyFlags[2] & 0x8) { // +80.68% from sp bonus - DoneActualBenefit += caster->SpellBaseDamageBonus(m_spellInfo->GetSchoolMask()) * 0.8068f; + DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; } break; case SPELLFAMILY_WARLOCK: @@ -559,7 +559,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster) if (m_spellInfo->SpellFamilyFlags[2] & 0x40) { // +80.68% from sp bonus - DoneActualBenefit += caster->SpellBaseDamageBonus(m_spellInfo->GetSchoolMask()) * 0.8068f; + DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; } break; case SPELLFAMILY_PRIEST: @@ -573,7 +573,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster) if (AuraEffect const* pAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 2899, 1)) bonus += CalculatePctN(1.0f, pAurEff->GetAmount()); - DoneActualBenefit += caster->SpellBaseHealingBonus(m_spellInfo->GetSchoolMask()) * bonus; + DoneActualBenefit += caster->SpellBaseHealingBonusDone(m_spellInfo->GetSchoolMask()) * bonus; // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage DoneActualBenefit = caster->ApplyEffectModifiers(GetSpellInfo(), m_effIndex, DoneActualBenefit); @@ -601,7 +601,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster) //+75.00% from sp bonus float bonus = 0.75f; - DoneActualBenefit += caster->SpellBaseHealingBonus(m_spellInfo->GetSchoolMask()) * bonus; + DoneActualBenefit += caster->SpellBaseHealingBonusDone(m_spellInfo->GetSchoolMask()) * bonus; // Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage DoneActualBenefit = caster->ApplyEffectModifiers(GetSpellInfo(), m_effIndex, DoneActualBenefit); DoneActualBenefit *= caster->CalculateLevelPenalty(GetSpellInfo()); @@ -630,7 +630,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster) if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_MAGE && GetSpellInfo()->SpellFamilyFlags[0] & 0x8000 && m_spellInfo->SpellFamilyFlags[2] & 0x8) { // +80.53% from +spd bonus - DoneActualBenefit += caster->SpellBaseDamageBonus(m_spellInfo->GetSchoolMask()) * 0.8053f;; + DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8053f; } break; case SPELL_AURA_DUMMY: @@ -638,7 +638,10 @@ int32 AuraEffect::CalculateAmount(Unit* caster) break; // Earth Shield if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[1] & 0x400) - amount = caster->SpellHealingBonus(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE); + { + amount = caster->SpellHealingBonusDone(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE); + amount = GetBase()->GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE); + } break; case SPELL_AURA_PERIODIC_DAMAGE: if (!caster) @@ -703,19 +706,23 @@ int32 AuraEffect::CalculateAmount(Unit* caster) } break; case SPELL_AURA_PERIODIC_ENERGIZE: - if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_GENERIC) + switch (m_spellInfo->Id) { - // Replenishment (0.25% from max) - // Infinite Replenishment - if (m_spellInfo->SpellIconID == 3184 && m_spellInfo->SpellVisual[0] == 12495) - amount = GetBase()->GetUnitOwner()->GetMaxPower(POWER_MANA) * 25 / 10000; - } - // Innervate - else if (m_spellInfo->Id == 29166) + case 57669: // Replenishment (0.2% from max) + amount = GetBase()->GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f; + break; + case 61782: // Infinite Replenishment + amount = GetBase()->GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f; + break; + case 29166: // Innervate ApplyPctF(amount, float(GetBase()->GetUnitOwner()->GetCreatePowers(POWER_MANA)) / GetTotalTicks()); - // Owlkin Frenzy - else if (m_spellInfo->Id == 48391) + break; + case 48391: // Owlkin Frenzy ApplyPctU(amount, GetBase()->GetUnitOwner()->GetCreatePowers(POWER_MANA)); + break; + default: + break; + } break; case SPELL_AURA_PERIODIC_HEAL: if (!caster) @@ -983,6 +990,7 @@ void AuraEffect::ChangeAmount(int32 newAmount, bool mark, bool onStackOrReapply) handleMask |= AURA_EFFECT_HANDLE_CHANGE_AMOUNT; if (onStackOrReapply) handleMask |= AURA_EFFECT_HANDLE_REAPPLY; + if (!handleMask) return; @@ -1281,12 +1289,11 @@ bool AuraEffect::IsPeriodicTickCrit(Unit* target, Unit const* caster) const if ((*itr)->IsAffectingSpell(m_spellInfo) && caster->isSpellCrit(target, m_spellInfo, m_spellInfo->GetSchoolMask())) return true; } + // Rupture - since 3.3.3 can crit - if (target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0x0, 0x0, caster->GetGUID())) - { - if (caster->isSpellCrit(target, m_spellInfo, m_spellInfo->GetSchoolMask())) - return true; - } + if (m_spellInfo->SpellIconID == 500 && m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE) + return caster->isSpellCrit(target, m_spellInfo, m_spellInfo->GetSchoolMask()); + return false; } @@ -1512,13 +1519,36 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const const PlayerSpellMap& sp_list = target->ToPlayer()->GetSpellMap(); for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) { - if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) continue; - if (itr->first == spellId || itr->first == spellId2) continue; + if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) + continue; + + if (itr->first == spellId || itr->first == spellId2) + continue; + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); - if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) continue; + if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) + continue; + if (spellInfo->Stances & (1<<(GetMiscValue()-1))) target->CastSpell(target, itr->first, true, NULL, this); } + + // Also do it for Glyphs + for (uint32 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) + { + if (uint32 glyphId = target->ToPlayer()->GetGlyph(i)) + { + if (GlyphPropertiesEntry const* glyph = sGlyphPropertiesStore.LookupEntry(glyphId)) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyph->SpellId); + if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) + continue; + if (spellInfo->Stances & (1<<(GetMiscValue()-1))) + target->CastSpell(target, glyph->SpellId, true, NULL, this); + } + } + } + // Leader of the Pack if (target->ToPlayer()->HasSpell(17007)) { @@ -1628,10 +1658,25 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const } } + const Unit::AuraEffectList& shapeshifts = target->GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT); + AuraEffect* newAura = NULL; + // Iterate through all the shapeshift auras that the target has, if there is another aura with SPELL_AURA_MOD_SHAPESHIFT, then this aura is being removed due to that one being applied + for (Unit::AuraEffectList::const_iterator itr = shapeshifts.begin(); itr != shapeshifts.end(); ++itr) + { + if ((*itr) != this) + { + newAura = *itr; + break; + } + } Unit::AuraApplicationMap& tAuras = target->GetAppliedAuras(); for (Unit::AuraApplicationMap::iterator itr = tAuras.begin(); itr != tAuras.end();) { - if (itr->second->GetBase()->IsRemovedOnShapeLost(target)) + // Use the new aura to see on what stance the target will be + uint32 newStance = (1<<((newAura ? newAura->GetMiscValue() : 0)-1)); + + // If the stances are not compatible with the spell, remove it + if (itr->second->GetBase()->IsRemovedOnShapeLost(target) && !(itr->second->GetBase()->GetSpellInfo()->Stances & newStance)) target->RemoveAura(itr); else ++itr; @@ -2119,7 +2164,9 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo PlayerSpellMap const& sp_list = target->ToPlayer()->GetSpellMap(); for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) { - if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) continue; + if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) + continue; + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); if (spellInfo && spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && spellInfo->SpellIconID == 139) Rage_val += target->CalculateSpellDamage(target, spellInfo, 0) * 10; @@ -2428,7 +2475,7 @@ void AuraEffect::HandleAuraCloneCaster(AuraApplication const* aurApp, uint8 mode // What must be cloned? at least display and scale target->SetDisplayId(caster->GetDisplayId()); - //target->SetFloatValue(OBJECT_FIELD_SCALE_X, caster->GetFloatValue(OBJECT_FIELD_SCALE_X)); // we need retail info about how scaling is handled (aura maybe?) + //target->SetObjectScale(caster->GetFloatValue(OBJECT_FIELD_SCALE_X)); // we need retail info about how scaling is handled (aura maybe?) target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_MIRROR_IMAGE); } else @@ -2904,14 +2951,23 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode return; } - if (target->GetTypeId() == TYPEID_UNIT) - target->SetFlying(apply); - - if (Player* player = target->m_movedPlayer) + //! Not entirely sure if this should be sent for creatures as well, but I don't think so. + target->SetCanFly(apply); + if (!apply) { - // allow flying - player->SendSetFlyPacket(apply); + target->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY); + target->GetMotionMaster()->MoveFall(); } + + Player* player = target->ToPlayer(); + if (!player) + player = target->m_movedPlayer; + + if (player) + player->SendMovementCanFlyChange(); + + //! We still need to initiate a server-side MoveFall here, + //! which requires MSG_MOVE_FALL_LAND on landing. } void AuraEffect::HandleAuraWaterWalk(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -2928,14 +2984,12 @@ void AuraEffect::HandleAuraWaterWalk(AuraApplication const* aurApp, uint8 mode, return; } - WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_SPLINE_SET_WATER_WALK, 8+4); + target->AddUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); else - data.Initialize(SMSG_MOVE_SPLINE_SET_LAND_WALK, 8+4); - data.append(target->GetPackGUID()); - data << uint32(0); - target->SendMessageToSet(&data, true); + target->RemoveUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); + + target->SendMovementWaterWalking(); } void AuraEffect::HandleAuraFeatherFall(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -2952,14 +3006,12 @@ void AuraEffect::HandleAuraFeatherFall(AuraApplication const* aurApp, uint8 mode return; } - WorldPacket data; if (apply) - data.Initialize(SMSG_MOVE_SPLINE_SET_FEATHER_FALL, 8+4); + target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); else - data.Initialize(SMSG_MOVE_SPLINE_SET_NORMAL_FALL, 8+4); - data.append(target->GetPackGUID()); - data << uint32(0); - target->SendMessageToSet(&data, true); + target->RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); + + target->SendMovementFeatherFall(); // start fall from current height if (!apply && target->GetTypeId() == TYPEID_PLAYER) @@ -2980,14 +3032,8 @@ void AuraEffect::HandleAuraHover(AuraApplication const* aurApp, uint8 mode, bool return; } - WorldPacket data; - if (apply) - data.Initialize(SMSG_MOVE_SPLINE_SET_HOVER, 8+4); - else - data.Initialize(SMSG_MOVE_SPLINE_UNSET_HOVER, 8+4); - data.append(target->GetPackGUID()); - data << uint32(0); - target->SendMessageToSet(&data, true); + target->SetHover(apply); //! Sets movementflags + target->SendMovementHover(); } void AuraEffect::HandleWaterBreathing(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const @@ -3293,16 +3339,30 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, Unit* target = aurApp->GetTarget(); - // Enable Fly mode for flying mounts + //! Update ability to fly if (GetAuraType() == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK && (apply || (!target->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !target->HasAuraType(SPELL_AURA_FLY)))) { - if (Player* player = target->m_movedPlayer) - player->SendSetFlyPacket(apply); + target->SetCanFly(apply); + if (!apply) + target->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); + target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + target->m_movementInfo.SetFallTime(0); + + Player* player = target->ToPlayer(); + if (!player) + player = target->m_movedPlayer; + + if (player) + player->SendMovementCanFlyChange(); + + //! We still need to initiate a server-side MoveFall here, + //! which requires MSG_MOVE_FALL_LAND on landing. } + //! Someone should clean up these hacks and remove it from this function. It doesn't even belong here. if (mode & AURA_EFFECT_HANDLE_REAL) { //Players on flying mounts must be immune to polymorph @@ -3514,7 +3574,7 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint { bool banishFound = false; Unit::AuraEffectList const& banishAuras = target->GetAuraEffectsByType(GetAuraType()); - for (Unit::AuraEffectList::const_iterator i = banishAuras.begin(); i != banishAuras.end(); ++i) + for (Unit::AuraEffectList::const_iterator i = banishAuras.begin(); i != banishAuras.end(); ++i) if ((*i)->GetSpellInfo()->Mechanic == MECHANIC_BANISH) { banishFound = true; @@ -4621,7 +4681,7 @@ void AuraEffect::HandleNoReagentUseAura(AuraApplication const* aurApp, uint8 mod flag96 mask; Unit::AuraEffectList const& noReagent = target->GetAuraEffectsByType(SPELL_AURA_NO_REAGENT_USE); - for (Unit::AuraEffectList::const_iterator i = noReagent.begin(); i != noReagent.end(); ++i) + for (Unit::AuraEffectList::const_iterator i = noReagent.begin(); i != noReagent.end(); ++i) mask |= (*i)->m_spellInfo->Effects[(*i)->m_effIndex].SpellClassMask; target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1 , mask[0]); @@ -4724,11 +4784,11 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (owner_aura) { owner_aura->SetStackAmount(owner_aura->GetSpellInfo()->StackAmount); - } - if (pet_aura) - { - pet_aura->SetCharges(0); - pet_aura->SetStackAmount(owner_aura->GetSpellInfo()->StackAmount); + if (pet_aura) + { + pet_aura->SetCharges(0); + pet_aura->SetStackAmount(owner_aura->GetSpellInfo()->StackAmount); + } } break; } @@ -4791,11 +4851,6 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (caster) target->GetMotionMaster()->MoveFall(); break; - case 49028: - if (caster) - if (AuraEffect* aurEff = caster->GetAuraEffect(63330, 0)) // glyph of Dancing Rune Weapon - GetBase()->SetDuration(GetBase()->GetDuration() + aurEff->GetAmount()); - break; case 52916: // Honor Among Thieves if (target->GetTypeId() == TYPEID_PLAYER) if (Unit* spellTarget = ObjectAccessor::GetUnit(*target, target->ToPlayer()->GetComboTarget())) @@ -4961,7 +5016,13 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool // final heal int32 stack = GetBase()->GetStackAmount(); - target->CastCustomSpell(target, 33778, &m_amount, &stack, NULL, true, NULL, this, GetCasterGUID()); + int32 heal = m_amount; + if (caster) + { + heal = caster->SpellHealingBonusDone(target, GetSpellInfo(), heal, HEAL, stack); + heal = target->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, HEAL, stack); + } + target->CastCustomSpell(target, 33778, &heal, &stack, NULL, true, NULL, this, GetCasterGUID()); // restore mana if (caster) @@ -4971,18 +5032,6 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool } } break; - case SPELLFAMILY_HUNTER: - switch (GetId()) - { - case 34477: // Misdirection - if (aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - target->SetReducedThreatPercent(0, 0); - break; - case 35079: // Misdirection proc - target->SetReducedThreatPercent(0, 0); - break; - } - break; case SPELLFAMILY_DEATHKNIGHT: // Summon Gargoyle (Dismiss Gargoyle at remove) if (GetId() == 61777) @@ -5224,7 +5273,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool target->CastCustomSpell(target, 50322, &bp0, NULL, NULL, true); } else - target-> RemoveAurasDueToSpell(50322); + target->RemoveAurasDueToSpell(50322); break; } } @@ -5275,66 +5324,63 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod if (!(mode & AURA_EFFECT_HANDLE_REAL)) return; - if (!apply) - { - Unit* caster = GetCaster(); + if (apply || aurApp->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + return; - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) - return; + Unit* caster = GetCaster(); - Player* plCaster = caster->ToPlayer(); - Unit* target = aurApp->GetTarget(); + if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + return; - if (target->getDeathState() != JUST_DIED) - return; + Player* plCaster = caster->ToPlayer(); + Unit* target = aurApp->GetTarget(); - // Item amount - if (GetAmount() <= 0) - return; + // Item amount + if (GetAmount() <= 0) + return; + + if (GetSpellInfo()->Effects[m_effIndex].ItemType == 0) + return; - if (GetSpellInfo()->Effects[m_effIndex].ItemType == 0) + // Soul Shard + if (GetSpellInfo()->Effects[m_effIndex].ItemType == 6265) + { + // Soul Shard only from units that grant XP or honor + if (!plCaster->isHonorOrXPTarget(target) || + (target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(plCaster))) return; - // Soul Shard - if (GetSpellInfo()->Effects[m_effIndex].ItemType == 6265) + // If this is Drain Soul, check for Glyph of Drain Soul + if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000)) { - // Soul Shard only from units that grant XP or honor - if (!plCaster->isHonorOrXPTarget(target) || - (target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(plCaster))) - return; - - // If this is Drain Soul, check for Glyph of Drain Soul - if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000)) - { - // Glyph of Drain Soul - chance to create an additional Soul Shard - if (AuraEffect* aur = caster->GetAuraEffect(58070, 0)) - if (roll_chance_i(aur->GetMiscValue())) - caster->CastSpell(caster, 58068, true, 0, aur); // We _could_ simply do ++count here, but Blizz does it this way :) - } + // Glyph of Drain Soul - chance to create an additional Soul Shard + if (AuraEffect* aur = caster->GetAuraEffect(58070, 0)) + if (roll_chance_i(aur->GetMiscValue())) + caster->CastSpell(caster, 58068, true, 0, aur); // We _could_ simply do ++count here, but Blizz does it this way :) } + } - //Adding items - uint32 noSpaceForCount = 0; - uint32 count = m_amount; + //Adding items + uint32 noSpaceForCount = 0; + uint32 count = m_amount; - ItemPosCountVec dest; - InventoryResult msg = plCaster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, GetSpellInfo()->Effects[m_effIndex].ItemType, count, &noSpaceForCount); - if (msg != EQUIP_ERR_OK) - { - count-=noSpaceForCount; - plCaster->SendEquipError(msg, NULL, NULL, GetSpellInfo()->Effects[m_effIndex].ItemType); - if (count == 0) - return; - } - - Item* newitem = plCaster->StoreNewItem(dest, GetSpellInfo()->Effects[m_effIndex].ItemType, true); - if (!newitem) - { - plCaster->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + ItemPosCountVec dest; + InventoryResult msg = plCaster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, GetSpellInfo()->Effects[m_effIndex].ItemType, count, &noSpaceForCount); + if (msg != EQUIP_ERR_OK) + { + count-=noSpaceForCount; + plCaster->SendEquipError(msg, NULL, NULL, GetSpellInfo()->Effects[m_effIndex].ItemType); + if (count == 0) return; - } - plCaster->SendNewItem(newitem, count, true, true); } + + Item* newitem = plCaster->StoreNewItem(dest, GetSpellInfo()->Effects[m_effIndex].ItemType, true); + if (!newitem) + { + plCaster->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + return; + } + plCaster->SendNewItem(newitem, count, true, true); } void AuraEffect::HandleBindSight(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -5661,21 +5707,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const caster->CastCustomSpell(66153, SPELLVALUE_MAX_TARGETS, urand(1, 6), target, true); break; } - case 54798: // FLAMING Arrow Triggered Effect - { - if (!caster || !target || !target->ToCreature() || !caster->GetVehicle() || target->HasAura(54683)) - break; - - target->CastSpell(target, 54683, true); - - // Credit Frostworgs - if (target->GetEntry() == 29358) - caster->CastSpell(caster, 54896, true); - // Credit Frost Giants - else if (target->GetEntry() == 29351) - caster->CastSpell(caster, 54893, true); - break; - } case 62292: // Blaze (Pool of Tar) // should we use custom damage? target->CastSpell((Unit*)NULL, m_spellInfo->Effects[m_effIndex].TriggerSpell, true); @@ -5705,27 +5736,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const target->CastSpell((Unit*)NULL, m_spellInfo->Effects[m_effIndex].TriggerSpell, true); break; } - case SPELLFAMILY_WARLOCK: - { - switch (GetSpellInfo()->Id) - { - // Demonic Circle - case 48018: - if (GameObject* obj = target->GetGameObject(GetSpellInfo()->Id)) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(48020); - if (target->IsWithinDist(obj, spellInfo->GetMaxRange(true))) - { - if (!target->HasAura(62388)) - target->CastSpell(target, 62388, true); - } - else - target->RemoveAura(62388); - } - break; - } - break; - } case SPELLFAMILY_DRUID: { switch (GetSpellInfo()->Id) @@ -5785,7 +5795,7 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const if (targets.empty()) return; - Unit* spellTarget = SelectRandomContainerElement(targets); + Unit* spellTarget = Trinity::Containers::SelectRandomContainerElement(targets); target->CastSpell(spellTarget, 57840, true); target->CastSpell(spellTarget, 57841, true); @@ -5949,15 +5959,15 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) // move loot to player inventory and despawn target if (caster && caster->GetTypeId() == TYPEID_PLAYER && target->GetTypeId() == TYPEID_UNIT && - target->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_GAS_CLOUD) + target->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_GAS_CLOUD) { Player* player = caster->ToPlayer(); Creature* creature = target->ToCreature(); // missing lootid has been reported on startup - just return - if (!creature->GetCreatureInfo()->SkinLootId) + if (!creature->GetCreatureTemplate()->SkinLootId) return; - player->AutoStoreLoot(creature->GetCreatureInfo()->SkinLootId, LootTemplates_Skinning, true); + player->AutoStoreLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, true); creature->DespawnOrUnsummon(); } @@ -6232,14 +6242,15 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const uint32 absorb = 0; uint32 resist = 0; - CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); + CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); // ignore non positive values (can be result apply spellmods to aura damage uint32 damage = std::max(GetAmount(), 0); if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE) { - damage = caster->SpellDamageBonus(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); // Calculate armor mitigation if (Unit::IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) @@ -6331,7 +6342,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) const { - if (!caster || !caster->isAlive() || !target->isAlive()) + if (!caster || !target->isAlive()) return; if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo())) @@ -6349,7 +6360,9 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); uint32 damage = std::max(GetAmount(), 0); - damage = caster->SpellDamageBonus(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); bool crit = IsPeriodicTickCrit(target, caster); if (crit) @@ -6384,15 +6397,19 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c damage = (damage <= absorb+resist) ? 0 : (damage-absorb-resist); if (damage) procVictim |= PROC_FLAG_TAKEN_DAMAGE; - caster->ProcDamageAndSpell(target, procAttacker, procVictim, procEx, damage, BASE_ATTACK, GetSpellInfo()); + if (caster->isAlive()) + caster->ProcDamageAndSpell(target, procAttacker, procVictim, procEx, damage, BASE_ATTACK, GetSpellInfo()); int32 new_damage = caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), false); + if (caster->isAlive()) + { + float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); - float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); - - uint32 heal = uint32(caster->SpellHealingBonus(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, GetBase()->GetStackAmount())); + uint32 heal = uint32(caster->SpellHealingBonusDone(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, GetBase()->GetStackAmount())); + heal = uint32(caster->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT, GetBase()->GetStackAmount())); - int32 gain = caster->HealBySpell(caster, GetSpellInfo(), heal); - caster->getHostileRefManager().threatAssist(caster, gain * 0.5f, GetSpellInfo()); + int32 gain = caster->HealBySpell(caster, GetSpellInfo(), heal); + caster->getHostileRefManager().threatAssist(caster, gain * 0.5f, GetSpellInfo()); + } } void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) const @@ -6492,7 +6509,8 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const damage += addition; } - damage = caster->SpellHealingBonus(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); } bool crit = IsPeriodicTickCrit(target, caster); @@ -6507,7 +6525,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const caster->CalcHealAbsorb(target, GetSpellInfo(), heal, absorb); int32 gain = caster->DealHeal(target, heal); - SpellPeriodicAuraLogInfo pInfo(this, damage, damage - gain, absorb, 0, 0.0f, crit); + SpellPeriodicAuraLogInfo pInfo(this, heal, heal - gain, absorb, 0, 0.0f, crit); target->SendPeriodicAuraLog(&pInfo); target->getHostileRefManager().threatAssist(caster, float(gain) * 0.5f, GetSpellInfo()); @@ -6518,14 +6536,14 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const // damage caster for heal amount if (target != caster && GetSpellInfo()->AttributesEx2 & SPELL_ATTR2_HEALTH_FUNNEL) { - uint32 funnelDamage = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); // damage is not affected by spell power + uint32 funnelDamage = GetSpellInfo()->ManaPerSecond; // damage is not affected by spell power if ((int32)funnelDamage > gain) funnelDamage = gain; uint32 funnelAbsorb = 0; caster->DealDamageMods(caster, funnelDamage, &funnelAbsorb); caster->SendSpellNonMeleeDamageLog(caster, GetId(), funnelDamage, GetSpellInfo()->GetSchoolMask(), funnelAbsorb, 0, false, 0, false); - CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); + CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); caster->DealDamage(caster, funnelDamage, &cleanDamage, NODAMAGE, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); } @@ -6782,7 +6800,8 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv Unit* target = aurApp->GetTarget(); Unit* triggerTarget = eventInfo.GetProcTarget(); SpellNonMeleeDamage damageInfo(target, triggerTarget, GetId(), GetSpellInfo()->SchoolMask); - uint32 damage = target->SpellDamageBonus(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE); + uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE); + damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE); target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo()); target->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); target->SendSpellNonMeleeDamageLog(&damageInfo); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index add50042aa5..ea25c0b76b5 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -365,7 +365,7 @@ m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false) void Aura::_InitEffects(uint8 effMask, Unit* caster, int32 *baseAmount) { // shouldn't be in constructor - functions in AuraEffect::AuraEffect use polymorphism - for (uint8 i=0 ; isecond; + AuraApplication * aurApp = appItr->second; Unit* target = aurApp->GetTarget(); target->_UnapplyAura(aurApp, removeMode); appItr = m_applications.begin(); @@ -734,7 +734,8 @@ int32 Aura::CalcMaxDuration(Unit* caster) const if (IsPassive() && !m_spellInfo->DurationEntry) maxDuration = -1; - if (!IsPermanent() && modOwner) + // IsPermanent() checks max duration (which we are supposed to calculate here) + if (maxDuration != -1 && modOwner) modOwner->ApplySpellMod(GetId(), SPELLMOD_DURATION, maxDuration); return maxDuration; } @@ -1217,19 +1218,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b break; } break; - case SPELLFAMILY_WARLOCK: - switch (GetId()) - { - case 48020: // Demonic Circle - if (target->GetTypeId() == TYPEID_PLAYER) - if (GameObject* obj = target->GetGameObject(48018)) - { - target->NearTeleportTo(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation()); - target->RemoveMovementImpairingAuras(); - } - break; - } - break; case SPELLFAMILY_PRIEST: if (!caster) break; @@ -1239,8 +1227,11 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b // Improved Devouring Plague if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 3790, 1)) { - int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * caster->SpellDamageBonus(target, GetSpellInfo(), GetEffect(0)->GetAmount(), DOT) / 100; + uint32 damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), DOT); + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT); + int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * int32(damage) / 100; int32 heal = int32(CalculatePctN(basepoints0, 15)); + caster->CastCustomSpell(target, 63675, &basepoints0, NULL, NULL, true, NULL, GetEffect(0)); caster->CastCustomSpell(caster, 75999, &heal, NULL, NULL, true, NULL, GetEffect(0)); } @@ -1251,7 +1242,10 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b // Empowered Renew if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 3021, 1)) { - int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * caster->SpellHealingBonus(target, GetSpellInfo(), GetEffect(0)->GetAmount(), HEAL) / 100; + uint32 damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), HEAL); + damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, HEAL); + + int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * int32(damage) / 100; caster->CastCustomSpell(target, 63544, &basepoints0, NULL, NULL, true, NULL, GetEffect(0)); } } @@ -1433,17 +1427,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b caster->CastSpell(target, spellId, true); } } - switch (GetId()) - { - case 48018: // Demonic Circle - // Do not remove GO when aura is removed by stack - // to prevent remove GO added by new spell - // old one is already removed - if (!onReapply) - target->RemoveGameObject(GetId(), true); - target->RemoveAura(62388); - break; - } break; case SPELLFAMILY_PRIEST: if (!caster) @@ -2081,7 +2064,7 @@ void Aura::_DeleteRemovedApplications() void Aura::LoadScripts() { sScriptMgr->CreateAuraScripts(m_spellInfo->Id, m_loadedScripts); - for (std::list::iterator itr = m_loadedScripts.begin(); itr != m_loadedScripts.end() ;) + for (std::list::iterator itr = m_loadedScripts.begin(); itr != m_loadedScripts.end();) { if (!(*itr)->_Load(this)) { @@ -2098,11 +2081,11 @@ void Aura::LoadScripts() bool Aura::CallScriptCheckAreaTargetHandlers(Unit* target) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_CHECK_AREA_TARGET); std::list::iterator hookItrEnd = (*scritr)->DoCheckAreaTarget.end(), hookItr = (*scritr)->DoCheckAreaTarget.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) if (!(*hookItr).Call(*scritr, target)) return false; (*scritr)->_FinishScriptCall(); @@ -2112,11 +2095,11 @@ bool Aura::CallScriptCheckAreaTargetHandlers(Unit* target) void Aura::CallScriptDispel(DispelInfo* dispelInfo) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_DISPEL); std::list::iterator hookItrEnd = (*scritr)->OnDispel.end(), hookItr = (*scritr)->OnDispel.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr, dispelInfo); (*scritr)->_FinishScriptCall(); } @@ -2124,11 +2107,11 @@ void Aura::CallScriptDispel(DispelInfo* dispelInfo) void Aura::CallScriptAfterDispel(DispelInfo* dispelInfo) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_AFTER_DISPEL); std::list::iterator hookItrEnd = (*scritr)->AfterDispel.end(), hookItr = (*scritr)->AfterDispel.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr, dispelInfo); (*scritr)->_FinishScriptCall(); } @@ -2137,11 +2120,11 @@ void Aura::CallScriptAfterDispel(DispelInfo* dispelInfo) bool Aura::CallScriptEffectApplyHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode) { bool preventDefault = false; - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_APPLY, aurApp); std::list::iterator effEndItr = (*scritr)->OnEffectApply.end(), effItr = (*scritr)->OnEffectApply.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, mode); @@ -2156,11 +2139,11 @@ bool Aura::CallScriptEffectApplyHandlers(AuraEffect const* aurEff, AuraApplicati bool Aura::CallScriptEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode) { bool preventDefault = false; - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_REMOVE, aurApp); std::list::iterator effEndItr = (*scritr)->OnEffectRemove.end(), effItr = (*scritr)->OnEffectRemove.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, mode); @@ -2174,11 +2157,11 @@ bool Aura::CallScriptEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplicat void Aura::CallScriptAfterEffectApplyHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_AFTER_APPLY, aurApp); std::list::iterator effEndItr = (*scritr)->AfterEffectApply.end(), effItr = (*scritr)->AfterEffectApply.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, mode); @@ -2189,11 +2172,11 @@ void Aura::CallScriptAfterEffectApplyHandlers(AuraEffect const* aurEff, AuraAppl void Aura::CallScriptAfterEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_AFTER_REMOVE, aurApp); std::list::iterator effEndItr = (*scritr)->AfterEffectRemove.end(), effItr = (*scritr)->AfterEffectRemove.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, mode); @@ -2205,11 +2188,11 @@ void Aura::CallScriptAfterEffectRemoveHandlers(AuraEffect const* aurEff, AuraApp bool Aura::CallScriptEffectPeriodicHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp) { bool preventDefault = false; - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_PERIODIC, aurApp); std::list::iterator effEndItr = (*scritr)->OnEffectPeriodic.end(), effItr = (*scritr)->OnEffectPeriodic.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff); @@ -2223,11 +2206,11 @@ bool Aura::CallScriptEffectPeriodicHandlers(AuraEffect const* aurEff, AuraApplic void Aura::CallScriptEffectUpdatePeriodicHandlers(AuraEffect* aurEff) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_UPDATE_PERIODIC); std::list::iterator effEndItr = (*scritr)->OnEffectUpdatePeriodic.end(), effItr = (*scritr)->OnEffectUpdatePeriodic.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff); @@ -2238,11 +2221,11 @@ void Aura::CallScriptEffectUpdatePeriodicHandlers(AuraEffect* aurEff) void Aura::CallScriptEffectCalcAmountHandlers(AuraEffect const* aurEff, int32 & amount, bool & canBeRecalculated) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_CALC_AMOUNT); std::list::iterator effEndItr = (*scritr)->DoEffectCalcAmount.end(), effItr = (*scritr)->DoEffectCalcAmount.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, amount, canBeRecalculated); @@ -2253,11 +2236,11 @@ void Aura::CallScriptEffectCalcAmountHandlers(AuraEffect const* aurEff, int32 & void Aura::CallScriptEffectCalcPeriodicHandlers(AuraEffect const* aurEff, bool & isPeriodic, int32 & amplitude) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_CALC_PERIODIC); std::list::iterator effEndItr = (*scritr)->DoEffectCalcPeriodic.end(), effItr = (*scritr)->DoEffectCalcPeriodic.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, isPeriodic, amplitude); @@ -2268,11 +2251,11 @@ void Aura::CallScriptEffectCalcPeriodicHandlers(AuraEffect const* aurEff, bool & void Aura::CallScriptEffectCalcSpellModHandlers(AuraEffect const* aurEff, SpellModifier* & spellMod) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_CALC_SPELLMOD); std::list::iterator effEndItr = (*scritr)->DoEffectCalcSpellMod.end(), effItr = (*scritr)->DoEffectCalcSpellMod.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, spellMod); @@ -2281,28 +2264,29 @@ void Aura::CallScriptEffectCalcSpellModHandlers(AuraEffect const* aurEff, SpellM } } -void Aura::CallScriptEffectAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount, bool & /*defaultPrevented*/) +void Aura::CallScriptEffectAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount, bool& defaultPrevented) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_ABSORB, aurApp); std::list::iterator effEndItr = (*scritr)->OnEffectAbsorb.end(), effItr = (*scritr)->OnEffectAbsorb.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, dmgInfo, absorbAmount); } + defaultPrevented = (*scritr)->_IsDefaultActionPrevented(); (*scritr)->_FinishScriptCall(); } } void Aura::CallScriptEffectAfterAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_AFTER_ABSORB, aurApp); std::list::iterator effEndItr = (*scritr)->AfterEffectAbsorb.end(), effItr = (*scritr)->AfterEffectAbsorb.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, dmgInfo, absorbAmount); @@ -2313,11 +2297,11 @@ void Aura::CallScriptEffectAfterAbsorbHandlers(AuraEffect* aurEff, AuraApplicati void Aura::CallScriptEffectManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount, bool & /*defaultPrevented*/) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_MANASHIELD, aurApp); std::list::iterator effEndItr = (*scritr)->OnEffectManaShield.end(), effItr = (*scritr)->OnEffectManaShield.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, dmgInfo, absorbAmount); @@ -2328,11 +2312,11 @@ void Aura::CallScriptEffectManaShieldHandlers(AuraEffect* aurEff, AuraApplicatio void Aura::CallScriptEffectAfterManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_AFTER_MANASHIELD, aurApp); std::list::iterator effEndItr = (*scritr)->AfterEffectManaShield.end(), effItr = (*scritr)->AfterEffectManaShield.begin(); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) { if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) (*effItr).Call(*scritr, aurEff, dmgInfo, absorbAmount); @@ -2377,7 +2361,7 @@ void UnitAura::Remove(AuraRemoveMode removeMode) void UnitAura::FillTargetMap(std::map & targets, Unit* caster) { - for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS ; ++effIndex) + for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) { if (!HasEffect(effIndex)) continue; @@ -2396,13 +2380,14 @@ void UnitAura::FillTargetMap(std::map & targets, Unit* caster) switch (GetSpellInfo()->Effects[effIndex].Effect) { case SPELL_EFFECT_APPLY_AREA_AURA_PARTY: - targetList.push_back(GetUnitOwner()); - GetUnitOwner()->GetPartyMemberInDist(targetList, radius); - break; case SPELL_EFFECT_APPLY_AREA_AURA_RAID: + { targetList.push_back(GetUnitOwner()); - GetUnitOwner()->GetRaidMember(targetList, radius); + Trinity::AnyGroupedUnitInObjectRangeCheck u_check(GetUnitOwner(), GetUnitOwner(), radius, GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID); + Trinity::UnitListSearcher searcher(GetUnitOwner(), targetList, u_check); + GetUnitOwner()->VisitNearbyObject(radius, searcher); break; + } case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: { targetList.push_back(GetUnitOwner()); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 8d98e4c2777..aad66a45d17 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -57,6 +57,35 @@ extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS]; +SpellDestination::SpellDestination() +{ + _position.Relocate(0, 0, 0, 0); + _transportGUID = 0; + _transportOffset.Relocate(0, 0, 0, 0); +} + +SpellDestination::SpellDestination(float x, float y, float z, float orientation, uint32 mapId) +{ + _position.Relocate(x, y, z, orientation); + _transportGUID = 0; + _position.m_mapId = mapId; +} + +SpellDestination::SpellDestination(Position const& pos) +{ + _position.Relocate(pos); + _transportGUID = 0; +} + +SpellDestination::SpellDestination(WorldObject const& wObj) +{ + _transportGUID = wObj.GetTransGUID(); + _transportOffset.Relocate(wObj.GetTransOffsetX(), wObj.GetTransOffsetY(), wObj.GetTransOffsetZ(), wObj.GetTransOffsetO()); + _position.Relocate(wObj); + _position.SetOrientation(wObj.GetOrientation()); +} + + SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0) { m_objectTarget = NULL; @@ -66,12 +95,6 @@ SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0) m_itemTargetGUID = 0; m_itemTargetEntry = 0; - m_srcTransGUID = 0; - m_srcTransOffset.Relocate(0, 0, 0, 0); - m_srcPos.Relocate(0, 0, 0, 0); - m_dstTransGUID = 0; - m_dstTransOffset.Relocate(0, 0, 0, 0); - m_dstPos.Relocate(0, 0, 0, 0); m_strTarget = ""; m_targetMask = 0; } @@ -95,36 +118,36 @@ void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) { - data.readPackGUID(m_srcTransGUID); - if (m_srcTransGUID) - data >> m_srcTransOffset.PositionXYZStream(); + data.readPackGUID(m_src._transportGUID); + if (m_src._transportGUID) + data >> m_src._transportOffset.PositionXYZStream(); else - data >> m_srcPos.PositionXYZStream(); + data >> m_src._position.PositionXYZStream(); } else { - m_srcTransGUID = caster->GetTransGUID(); - if (m_srcTransGUID) - m_srcTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); + m_src._transportGUID = caster->GetTransGUID(); + if (m_src._transportGUID) + m_src._transportOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); else - m_srcPos.Relocate(caster); + m_src._position.Relocate(caster); } if (m_targetMask & TARGET_FLAG_DEST_LOCATION) { - data.readPackGUID(m_dstTransGUID); - if (m_dstTransGUID) - data >> m_dstTransOffset.PositionXYZStream(); + data.readPackGUID(m_dst._transportGUID); + if (m_dst._transportGUID) + data >> m_dst._transportOffset.PositionXYZStream(); else - data >> m_dstPos.PositionXYZStream(); + data >> m_dst._position.PositionXYZStream(); } else { - m_dstTransGUID = caster->GetTransGUID(); - if (m_dstTransGUID) - m_dstTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); + m_dst._transportGUID = caster->GetTransGUID(); + if (m_dst._transportGUID) + m_dst._transportOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); else - m_dstPos.Relocate(caster); + m_dst._position.Relocate(caster); } if (m_targetMask & TARGET_FLAG_STRING) @@ -150,20 +173,20 @@ void SpellCastTargets::Write(ByteBuffer& data) if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) { - data.appendPackGUID(m_srcTransGUID); // relative position guid here - transport for example - if (m_srcTransGUID) - data << m_srcTransOffset.PositionXYZStream(); + data.appendPackGUID(m_src._transportGUID); // relative position guid here - transport for example + if (m_src._transportGUID) + data << m_src._transportOffset.PositionXYZStream(); else - data << m_srcPos.PositionXYZStream(); + data << m_src._position.PositionXYZStream(); } if (m_targetMask & TARGET_FLAG_DEST_LOCATION) { - data.appendPackGUID(m_dstTransGUID); // relative position guid here - transport for example - if (m_dstTransGUID) - data << m_dstTransOffset.PositionXYZStream(); + data.appendPackGUID(m_dst._transportGUID); // relative position guid here - transport for example + if (m_dst._transportGUID) + data << m_dst._transportOffset.PositionXYZStream(); else - data << m_dstPos.PositionXYZStream(); + data << m_dst._position.PositionXYZStream(); } if (m_targetMask & TARGET_FLAG_STRING) @@ -296,31 +319,31 @@ void SpellCastTargets::UpdateTradeSlotItem() } } -Position const* SpellCastTargets::GetSrc() const +SpellDestination const* SpellCastTargets::GetSrc() const { - return &m_srcPos; + return &m_src; +} + +Position const* SpellCastTargets::GetSrcPos() const +{ + return &m_src._position; } void SpellCastTargets::SetSrc(float x, float y, float z) { - m_srcPos.Relocate(x, y, z); - m_srcTransGUID = 0; + m_src = SpellDestination(x, y, z); m_targetMask |= TARGET_FLAG_SOURCE_LOCATION; } void SpellCastTargets::SetSrc(Position const& pos) { - m_srcPos.Relocate(pos); - m_srcTransGUID = 0; + m_src = SpellDestination(pos); m_targetMask |= TARGET_FLAG_SOURCE_LOCATION; } void SpellCastTargets::SetSrc(WorldObject const& wObj) { - uint64 guid = wObj.GetTransGUID(); - m_srcTransGUID = guid; - m_srcTransOffset.Relocate(wObj.GetTransOffsetX(), wObj.GetTransOffsetY(), wObj.GetTransOffsetZ(), wObj.GetTransOffsetO()); - m_srcPos.Relocate(wObj); + m_src = SpellDestination(wObj); m_targetMask |= TARGET_FLAG_SOURCE_LOCATION; } @@ -328,13 +351,13 @@ void SpellCastTargets::ModSrc(Position const& pos) { ASSERT(m_targetMask & TARGET_FLAG_SOURCE_LOCATION); - if (m_srcTransGUID) + if (m_src._transportGUID) { Position offset; - m_srcPos.GetPositionOffsetTo(pos, offset); - m_srcTransOffset.RelocateOffset(offset); + m_src._position.GetPositionOffsetTo(pos, offset); + m_src._transportOffset.RelocateOffset(offset); } - m_srcPos.Relocate(pos); + m_src._position.Relocate(pos); } void SpellCastTargets::RemoveSrc() @@ -342,41 +365,37 @@ void SpellCastTargets::RemoveSrc() m_targetMask &= ~(TARGET_FLAG_SOURCE_LOCATION); } -WorldLocation const* SpellCastTargets::GetDst() const +SpellDestination const* SpellCastTargets::GetDst() const +{ + return &m_dst; +} + +WorldLocation const* SpellCastTargets::GetDstPos() const { - return &m_dstPos; + return &m_dst._position; } void SpellCastTargets::SetDst(float x, float y, float z, float orientation, uint32 mapId) { - m_dstPos.Relocate(x, y, z, orientation); - m_dstTransGUID = 0; + m_dst = SpellDestination(x, y, z, orientation, mapId); m_targetMask |= TARGET_FLAG_DEST_LOCATION; - if (mapId != MAPID_INVALID) - m_dstPos.m_mapId = mapId; } void SpellCastTargets::SetDst(Position const& pos) { - m_dstPos.Relocate(pos); - m_dstTransGUID = 0; + m_dst = SpellDestination(pos); m_targetMask |= TARGET_FLAG_DEST_LOCATION; } void SpellCastTargets::SetDst(WorldObject const& wObj) { - uint64 guid = wObj.GetTransGUID(); - m_dstTransGUID = guid; - m_dstTransOffset.Relocate(wObj.GetTransOffsetX(), wObj.GetTransOffsetY(), wObj.GetTransOffsetZ(), wObj.GetTransOffsetO()); - m_dstPos.Relocate(wObj); + m_dst = SpellDestination(wObj); m_targetMask |= TARGET_FLAG_DEST_LOCATION; } void SpellCastTargets::SetDst(SpellCastTargets const& spellTargets) { - m_dstTransGUID = spellTargets.m_dstTransGUID; - m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset); - m_dstPos.Relocate(spellTargets.m_dstPos); + m_dst = spellTargets.m_dst; m_targetMask |= TARGET_FLAG_DEST_LOCATION; } @@ -384,13 +403,13 @@ void SpellCastTargets::ModDst(Position const& pos) { ASSERT(m_targetMask & TARGET_FLAG_DEST_LOCATION); - if (m_dstTransGUID) + if (m_dst._transportGUID) { Position offset; - m_dstPos.GetPositionOffsetTo(pos, offset); - m_dstTransOffset.RelocateOffset(offset); + m_dst._position.GetPositionOffsetTo(pos, offset); + m_dst._transportOffset.RelocateOffset(offset); } - m_dstPos.Relocate(pos); + m_dst._position.Relocate(pos); } void SpellCastTargets::RemoveDst() @@ -418,21 +437,21 @@ void SpellCastTargets::Update(Unit* caster) } // update positions by transport move - if (HasSrc() && m_srcTransGUID) + if (HasSrc() && m_src._transportGUID) { - if (WorldObject* transport = ObjectAccessor::GetWorldObject(*caster, m_srcTransGUID)) + if (WorldObject* transport = ObjectAccessor::GetWorldObject(*caster, m_src._transportGUID)) { - m_srcPos.Relocate(transport); - m_srcPos.RelocateOffset(m_srcTransOffset); + m_src._position.Relocate(transport); + m_src._position.RelocateOffset(m_src._transportOffset); } } - if (HasDst() && m_dstTransGUID) + if (HasDst() && m_dst._transportGUID) { - if (WorldObject* transport = ObjectAccessor::GetWorldObject(*caster, m_dstTransGUID)) + if (WorldObject* transport = ObjectAccessor::GetWorldObject(*caster, m_dst._transportGUID)) { - m_dstPos.Relocate(transport); - m_dstPos.RelocateOffset(m_dstTransOffset); + m_dst._position.Relocate(transport); + m_dst._position.RelocateOffset(m_dst._transportOffset); } } } @@ -450,9 +469,9 @@ void SpellCastTargets::OutDebug() const if (m_targetMask & TARGET_FLAG_TRADE_ITEM) sLog->outString("Trade item target: " UI64FMTD, m_itemTargetGUID); if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) - sLog->outString("Source location: transport guid:" UI64FMTD " trans offset: %s position: %s", m_srcTransGUID, m_srcTransOffset.ToString().c_str(), m_srcPos.ToString().c_str()); + sLog->outString("Source location: transport guid:" UI64FMTD " trans offset: %s position: %s", m_src._transportGUID, m_src._transportOffset.ToString().c_str(), m_src._position.ToString().c_str()); if (m_targetMask & TARGET_FLAG_DEST_LOCATION) - sLog->outString("Destination location: transport guid:" UI64FMTD " trans offset: %s position: %s", m_dstTransGUID, m_dstTransOffset.ToString().c_str(), m_dstPos.ToString().c_str()); + sLog->outString("Destination location: transport guid:" UI64FMTD " trans offset: %s position: %s", m_dst._transportGUID, m_dst._transportOffset.ToString().c_str(), m_dst._position.ToString().c_str()); if (m_targetMask & TARGET_FLAG_STRING) sLog->outString("String: %s", m_strTarget.c_str()); sLog->outString("speed: %f", m_speed); @@ -565,6 +584,9 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme CleanupTargetList(); CleanupEffectExecuteData(); + + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + m_destTargets[i] = SpellDestination(*m_caster); } Spell::~Spell() @@ -721,6 +743,9 @@ void Spell::SelectSpellTargets() // some spell effects don't add anything to target map (confirmed with sniffs) (like SPELL_EFFECT_DESTROY_ALL_TOTEMS) SelectEffectTypeImplicitTargets(i); + if (m_targets.HasDst()) + AddDestTarget(*m_targets.GetDst(), i); + if (m_spellInfo->IsChanneled()) { uint8 mask = (1 << i); @@ -768,7 +793,7 @@ void Spell::SelectSpellTargets() } else if (m_spellInfo->Speed > 0.0f) { - float dist = m_caster->GetDistance(*m_targets.GetDst()); + float dist = m_caster->GetDistance(*m_targets.GetDstPos()); m_delayMoment = (uint64) floor(dist / m_spellInfo->Speed * 1000.0f); } } @@ -827,7 +852,7 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar m_targets.SetSrc(*m_caster); break; default: - ASSERT("Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_SRC"); + ASSERT(false && "Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_SRC"); break; } break; @@ -844,7 +869,7 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar SelectImplicitDestDestTargets(effIndex, targetType); break; default: - ASSERT("Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_DEST"); + ASSERT(false && "Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_DEST"); break; } break; @@ -858,7 +883,7 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar SelectImplicitTargetObjectTargets(effIndex, targetType); break; default: - ASSERT("Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT"); + ASSERT(false && "Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT"); break; } break; @@ -982,7 +1007,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar { case TARGET_OBJECT_TYPE_UNIT: if (Unit* unitTarget = target->ToUnit()) - AddUnitTarget(unitTarget, effMask, false); + AddUnitTarget(unitTarget, effMask, true, false); break; case TARGET_OBJECT_TYPE_GOBJ: if (GameObject* gobjTarget = target->ToGameObject()) @@ -1029,7 +1054,7 @@ void Spell::SelectImplicitConeTargets(SpellEffIndex effIndex, SpellImplicitTarge if ((*j)->IsAffectingSpell(m_spellInfo)) maxTargets += (*j)->GetAmount(); - Trinity::RandomResizeList(targets, maxTargets); + Trinity::Containers::RandomResizeList(targets, maxTargets); } // for compability with older code - add only unit and go targets @@ -1093,10 +1118,10 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge switch (targetType.GetReferenceType()) { case TARGET_REFERENCE_TYPE_SRC: - center = m_targets.GetSrc(); + center = m_targets.GetSrcPos(); break; case TARGET_REFERENCE_TYPE_DEST: - center = m_targets.GetDst(); + center = m_targets.GetDstPos(); break; case TARGET_REFERENCE_TYPE_CASTER: case TARGET_REFERENCE_TYPE_TARGET: @@ -1127,7 +1152,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge case TYPEID_PLAYER: { Unit* unitTarget = (*itr)->ToUnit(); - if (unitTarget->isAlive() || !playerCaster->isHonorOrXPTarget(unitTarget) + if (unitTarget->isAlive() || !playerCaster->isHonorOrXPTarget(unitTarget) || ((unitTarget->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1))) == 0) || (unitTarget->GetDisplayId() != unitTarget->GetNativeDisplayId())) break; @@ -1152,7 +1177,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge case 51328: // check if our target is not valid (spell can target ghoul or dead unit) if (!(m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId() && - ((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()) + ((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()) || m_targets.GetUnitTarget()->isDead()))) { // remove existing targets @@ -1248,7 +1273,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge break; // Remove targets outside caster's raid - for (std::list::iterator itr = unitTargets.begin() ; itr != unitTargets.end();) + for (std::list::iterator itr = unitTargets.begin(); itr != unitTargets.end();) { if (!(*itr)->IsInRaidWith(m_caster)) itr = unitTargets.erase(itr); @@ -1265,7 +1290,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge else if (m_spellInfo->SpellFamilyFlags[2] == 0x0100) // Starfall { // Remove targets not in LoS or in stealth - for (std::list::iterator itr = unitTargets.begin() ; itr != unitTargets.end();) + for (std::list::iterator itr = unitTargets.begin(); itr != unitTargets.end();) { if ((*itr)->HasStealthAura() || (*itr)->HasInvisibilityAura() || !(*itr)->IsWithinLOSInMap(m_caster)) itr = unitTargets.erase(itr); @@ -1278,7 +1303,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge break; // Remove targets outside caster's raid - for (std::list::iterator itr = unitTargets.begin() ; itr != unitTargets.end();) + for (std::list::iterator itr = unitTargets.begin(); itr != unitTargets.end();) if (!(*itr)->IsInRaidWith(m_caster)) itr = unitTargets.erase(itr); else @@ -1300,7 +1325,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge } else { - for (std::list::iterator itr = unitTargets.begin() ; itr != unitTargets.end();) + for (std::list::iterator itr = unitTargets.begin(); itr != unitTargets.end();) if ((*itr)->getPowerType() != (Powers)power) itr = unitTargets.erase(itr); else @@ -1324,7 +1349,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge if (m_spellInfo->Id == 5246) //Intimidating Shout unitTargets.remove(m_targets.GetUnitTarget()); - Trinity::RandomResizeList(unitTargets, maxTargets); + Trinity::Containers::RandomResizeList(unitTargets, maxTargets); } CallScriptAfterUnitTargetSelectHandlers(unitTargets, effIndex); @@ -1342,7 +1367,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge if ((*j)->IsAffectingSpell(m_spellInfo)) maxTargets += (*j)->GetAmount(); - Trinity::RandomResizeList(gObjTargets, maxTargets); + Trinity::Containers::RandomResizeList(gObjTargets, maxTargets); } for (std::list::iterator itr = gObjTargets.begin(); itr != gObjTargets.end(); ++itr) AddGOTarget(*itr, effMask); @@ -1468,7 +1493,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffIndex effIndex, SpellImplicitT if (targetType.GetTarget() == TARGET_DEST_DEST_RANDOM) dist *= (float)rand_norm(); - Position pos = *m_targets.GetDst(); + Position pos = *m_targets.GetDstPos(); m_caster->MovePosition(pos, dist, angle); m_targets.ModDst(pos); } @@ -1518,11 +1543,11 @@ void Spell::SelectImplicitTargetObjectTargets(SpellEffIndex effIndex, SpellImpli { ASSERT((m_targets.GetObjectTarget() || m_targets.GetItemTarget()) && "Spell::SelectImplicitTargetObjectTargets - no explicit object or item target available!"); if (Unit* unit = m_targets.GetUnitTarget()) - AddUnitTarget(unit, 1 << effIndex); + AddUnitTarget(unit, 1 << effIndex, true, false); else if (GameObject* gobj = m_targets.GetGOTarget()) AddGOTarget(gobj, 1 << effIndex); else - AddItemTarget(m_targets.GetItemTarget(), effIndex); + AddItemTarget(m_targets.GetItemTarget(), 1 << effIndex); if (WorldObject* target = m_targets.GetObjectTarget()) SelectImplicitChainTargets(effIndex, targetType, target, 1 << effIndex); @@ -1582,12 +1607,12 @@ void Spell::SelectImplicitTrajTargets() if (!dist2d) return; - float srcToDestDelta = m_targets.GetDst()->m_positionZ - m_targets.GetSrc()->m_positionZ; + float srcToDestDelta = m_targets.GetDstPos()->m_positionZ - m_targets.GetSrcPos()->m_positionZ; std::list targets; - Trinity::WorldObjectSpellTrajTargetCheck check(dist2d, m_targets.GetSrc(), m_caster, m_spellInfo); + Trinity::WorldObjectSpellTrajTargetCheck check(dist2d, m_targets.GetSrcPos(), m_caster, m_spellInfo); Trinity::WorldObjectListSearcher searcher(m_caster, targets, check, GRID_MAP_TYPE_MASK_ALL); - SearchTargets > (searcher, GRID_MAP_TYPE_MASK_ALL, m_caster, m_targets.GetSrc(), dist2d); + SearchTargets > (searcher, GRID_MAP_TYPE_MASK_ALL, m_caster, m_targets.GetSrcPos(), dist2d); if (targets.empty()) return; @@ -1610,8 +1635,8 @@ void Spell::SelectImplicitTrajTargets() const float size = std::max((*itr)->GetObjectSize() * 0.7f, 1.0f); // 1/sqrt(3) // TODO: all calculation should be based on src instead of m_caster - const float objDist2d = m_targets.GetSrc()->GetExactDist2d(*itr) * cos(m_targets.GetSrc()->GetRelativeAngle(*itr)); - const float dz = (*itr)->GetPositionZ() - m_targets.GetSrc()->m_positionZ; + const float objDist2d = m_targets.GetSrcPos()->GetExactDist2d(*itr) * cos(m_targets.GetSrcPos()->GetRelativeAngle(*itr)); + const float dz = (*itr)->GetPositionZ() - m_targets.GetSrcPos()->m_positionZ; DEBUG_TRAJ(sLog->outError("Spell::SelectTrajTargets: check %u, dist between %f %f, height between %f %f.", (*itr)->GetEntry(), objDist2d - size, objDist2d + size, dz - size, dz + size);) @@ -1676,11 +1701,11 @@ void Spell::SelectImplicitTrajTargets() } } - if (m_targets.GetSrc()->GetExactDist2d(m_targets.GetDst()) > bestDist) + if (m_targets.GetSrcPos()->GetExactDist2d(m_targets.GetDstPos()) > bestDist) { - float x = m_targets.GetSrc()->m_positionX + cos(m_caster->GetOrientation()) * bestDist; - float y = m_targets.GetSrc()->m_positionY + sin(m_caster->GetOrientation()) * bestDist; - float z = m_targets.GetSrc()->m_positionZ + bestDist * (a * bestDist + b); + float x = m_targets.GetSrcPos()->m_positionX + cos(m_caster->GetOrientation()) * bestDist; + float y = m_targets.GetSrcPos()->m_positionY + sin(m_caster->GetOrientation()) * bestDist; + float z = m_targets.GetSrcPos()->m_positionZ + bestDist * (a * bestDist + b); if (itr != targets.end()) { @@ -1865,7 +1890,7 @@ void Spell::SearchAreaTargets(std::list& targets, float range, Pos return; Trinity::WorldObjectSpellAreaTargetCheck check(range, position, m_caster, referer, m_spellInfo, selectionType, condList); Trinity::WorldObjectListSearcher searcher(m_caster, targets, check, containerTypeMask); - SearchTargets > (searcher, containerTypeMask, m_caster, m_caster, range); + SearchTargets > (searcher, containerTypeMask, m_caster, position, range); } void Spell::SearchChainTargets(std::list& targets, uint32 chainTargets, WorldObject* target, SpellTargetObjectTypes objectType, SpellTargetCheckTypes selectType, ConditionList* condList, bool isChainHeal) @@ -1894,7 +1919,7 @@ void Spell::SearchChainTargets(std::list& targets, uint32 chainTar } // chain lightning/heal spells and similar - allow to jump at larger distance and go out of los - bool isBouncingFar = (m_spellInfo->AttributesEx4 & SPELL_ATTR4_AREA_TARGET_CHAIN + bool isBouncingFar = (m_spellInfo->AttributesEx4 & SPELL_ATTR4_AREA_TARGET_CHAIN || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_NONE || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC); @@ -2051,7 +2076,7 @@ void Spell::CleanupTargetList() m_delayMoment = 0; } -void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= true*/) +void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= true*/, bool implicit /*= true*/) { for (uint32 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) if (!m_spellInfo->Effects[effIndex].IsEffect() || !CheckEffectTarget(target, effIndex)) @@ -2062,7 +2087,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= return; if (checkIfValid) - if (m_spellInfo->CheckTarget(m_caster, target, true) != SPELL_CAST_OK) + if (m_spellInfo->CheckTarget(m_caster, target, implicit) != SPELL_CAST_OK) return; // Check for effect immune skip if immuned @@ -2140,7 +2165,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= if (targetInfo.missCondition == SPELL_MISS_REFLECT) { // Calculate reflected spell result on caster - targetInfo.reflectResult = m_caster->SpellHitResult(m_caster, m_spellInfo, m_canReflect); + targetInfo.reflectResult = m_caster->SpellHitResult(m_caster, m_spellInfo, m_canReflect); if (targetInfo.reflectResult == SPELL_MISS_REFLECT) // Impossible reflect again, so simply deflect spell targetInfo.reflectResult = SPELL_MISS_PARRY; @@ -2217,12 +2242,6 @@ void Spell::AddGOTarget(GameObject* go, uint32 effectMask) m_UniqueGOTargetInfo.push_back(target); } -void Spell::AddGOTarget(uint64 goGUID, uint32 effectMask) -{ - if (GameObject* go = m_caster->GetMap()->GetGameObject(goGUID)) - AddGOTarget(go, effectMask); -} - void Spell::AddItemTarget(Item* item, uint32 effectMask) { for (uint32 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) @@ -2252,6 +2271,11 @@ void Spell::AddItemTarget(Item* item, uint32 effectMask) m_UniqueItemInfo.push_back(target); } +void Spell::AddDestTarget(SpellDestination const& dest, uint32 effIndex) +{ + m_destTargets[effIndex] = dest; +} + void Spell::DoAllEffectOnTarget(TargetInfo* target) { if (!target || target->processed) @@ -2417,13 +2441,13 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) else procEx |= PROC_EX_NORMAL_HIT; - // Do triggers for unit (reflect triggers passed on hit phase for correct drop charge) - if (canEffectTrigger && missInfo != SPELL_MISS_REFLECT) - caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, addhealth, m_attackType, m_spellInfo, m_triggeredByAuraSpell); - int32 gain = caster->HealBySpell(unitTarget, m_spellInfo, addhealth, crit); unitTarget->getHostileRefManager().threatAssist(caster, float(gain) * 0.5f, m_spellInfo); m_healing = gain; + + // Do triggers for unit (reflect triggers passed on hit phase for correct drop charge) + if (canEffectTrigger && missInfo != SPELL_MISS_REFLECT) + caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, addhealth, m_attackType, m_spellInfo, m_triggeredByAuraSpell); } // Do damage and triggers else if (m_damage > 0) @@ -2450,15 +2474,16 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) caster->ToPlayer()->CastItemCombatSpell(unitTarget, m_attackType, procVictim, procEx); } - caster->DealSpellDamage(&damageInfo, true); - // Haunt if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->SpellFamilyFlags[1] & 0x40000 && m_spellAura && m_spellAura->GetEffect(1)) { AuraEffect* aurEff = m_spellAura->GetEffect(1); aurEff->SetAmount(CalculatePctU(aurEff->GetAmount(), damageInfo.damage)); } + m_damage = damageInfo.damage; + + caster->DealSpellDamage(&damageInfo, true); } // Passive spell hits/misses or active spells only misses (only triggers) else @@ -2479,7 +2504,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } } - if (missInfo != SPELL_MISS_EVADE && m_caster && !m_caster->IsFriendlyTo(unit) && !m_spellInfo->IsPositive()) + if (missInfo != SPELL_MISS_EVADE && m_caster && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))) { m_caster->CombatStart(unit, !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO)); @@ -2720,18 +2745,18 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint8 effMask) if (!m_hitTriggerSpells.empty()) { int _duration = 0; - for (HitTriggerSpells::const_iterator i = m_hitTriggerSpells.begin(); i != m_hitTriggerSpells.end(); ++i) + for (HitTriggerSpellList::const_iterator i = m_hitTriggerSpells.begin(); i != m_hitTriggerSpells.end(); ++i) { - if (CanExecuteTriggersOnHit(effMask, i->first) && roll_chance_i(i->second)) + if (CanExecuteTriggersOnHit(effMask, i->triggeredByAura) && roll_chance_i(i->chance)) { - m_caster->CastSpell(unit, i->first, true); - sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell %d triggered spell %d by SPELL_AURA_ADD_TARGET_TRIGGER aura", m_spellInfo->Id, i->first->Id); + m_caster->CastSpell(unit, i->triggeredSpell, true); + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell %d triggered spell %d by SPELL_AURA_ADD_TARGET_TRIGGER aura", m_spellInfo->Id, i->triggeredSpell->Id); // SPELL_AURA_ADD_TARGET_TRIGGER auras shouldn't trigger auras without duration // set duration of current aura to the triggered spell - if (i->first->GetDuration() == -1) + if (i->triggeredSpell->GetDuration() == -1) { - if (Aura* triggeredAur = unit->GetAura(i->first->Id, m_caster->GetGUID())) + if (Aura* triggeredAur = unit->GetAura(i->triggeredSpell->Id, m_caster->GetGUID())) { // get duration from aura-only once if (!_duration) @@ -2862,34 +2887,6 @@ bool Spell::UpdateChanneledTargetList() return channelTargetEffectMask == 0; } -// Helper for Chain Healing -// Spell target first -// Raidmates then descending by injury suffered (MaxHealth - Health) -// Other players/mobs then descending by injury suffered (MaxHealth - Health) -struct ChainHealingOrder : public std::binary_function -{ - const Unit* MainTarget; - ChainHealingOrder(Unit const* Target) : MainTarget(Target) {}; - // functor for operator ">" - bool operator()(Unit const* _Left, Unit const* _Right) const - { - return (ChainHealingHash(_Left) < ChainHealingHash(_Right)); - } - - int32 ChainHealingHash(Unit const* Target) const - { - if (Target->GetTypeId() == TYPEID_PLAYER && MainTarget->GetTypeId() == TYPEID_PLAYER && Target->ToPlayer()->IsInSameRaidWith(MainTarget->ToPlayer())) - { - if (Target->IsFullHealth()) - return 40000; - else - return 20000 - Target->GetMaxHealth() + Target->GetHealth(); - } - else - return 40000 - Target->GetMaxHealth() + Target->GetHealth(); - } -}; - void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura) { if (m_CastItem) @@ -3083,7 +3080,8 @@ void Spell::cancel() *m_selfContainer = NULL; m_caster->RemoveDynObject(m_spellInfo->Id); - m_caster->RemoveGameObject(m_spellInfo->Id, true); + if (m_spellInfo->IsChanneled()) // if not channeled then the object for the current cast wasn't summoned yet + m_caster->RemoveGameObject(m_spellInfo->Id, true); //set state back so finish will be processed m_spellState = oldState; @@ -3103,11 +3101,20 @@ void Spell::cast(bool skipCheck) return; } - // now that we've done the basic check, now run the scripts - // should be done before the spell is actually executed if (Player* playerCaster = m_caster->ToPlayer()) + { + // now that we've done the basic check, now run the scripts + // should be done before the spell is actually executed sScriptMgr->OnPlayerSpellCast(playerCaster, this, skipCheck); + // As of 3.0.2 pets begin attacking their owner's target immediately + // Let any pets know we've attacked something. Check DmgClass for harmful spells only + // This prevents spells such as Hunter's Mark from triggering pet attack + if (this->GetSpellInfo()->DmgClass != SPELL_DAMAGE_CLASS_NONE) + if (Pet* playerPet = playerCaster->GetPet()) + if (playerPet->isAlive() && playerPet->isControlled() && (m_targets.GetTargetMask() & TARGET_FLAG_UNIT)) + playerPet->AI()->OwnerAttacked(m_targets.GetObjectTarget()->ToUnit()); + } SetExecutedCurrently(true); if (m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster) @@ -3425,29 +3432,13 @@ void Spell::_handle_immediate_phase() return; // Handle procs on cast // TODO: finish new proc system:P - if (m_UniqueTargetInfo.empty()) + if (m_UniqueTargetInfo.empty() && m_targets.HasDst()) { uint32 procAttacker = m_procAttacker; if (!procAttacker) - { - bool positive = m_spellInfo->IsPositive(); - switch (m_spellInfo->DmgClass) - { - case SPELL_DAMAGE_CLASS_MAGIC: - if (positive) - procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS; - else - procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; - break; - case SPELL_DAMAGE_CLASS_NONE: - if (positive) - procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS; - else - procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; - break; - } - } - // Proc damage for spells which have only dest targets (2484 should proc 51486 for example) + procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS; + + // Proc the spells that have DEST target m_originalCaster->ProcDamageAndSpell(NULL, procAttacker, 0, m_procEx | PROC_EX_NORMAL_HIT, 0, BASE_ATTACK, m_spellInfo, m_triggeredByAuraSpell); } } @@ -3508,7 +3499,7 @@ void Spell::update(uint32 difftime) // check if the player caster has moved before the spell finished if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) && m_caster->isMoving() && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT) && - (m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING))) + (m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR))) { // don't cancel for melee, autorepeat, triggered and instant spells if (!IsNextMeleeSwingSpell() && !IsAutoRepeat() && !IsTriggered()) @@ -3757,12 +3748,12 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas case SPELL_FAILED_TOO_MANY_OF_ITEM: { uint32 item = 0; - for (int8 x = 0; x < 3; x++) - if (spellInfo->Effects[x].ItemType) - item = spellInfo->Effects[x].ItemType; - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item); - if (pProto && pProto->ItemLimitCategory) - data << uint32(pProto->ItemLimitCategory); + for (int8 eff = 0; eff < MAX_SPELL_EFFECTS; eff++) + if (spellInfo->Effects[eff].ItemType) + item = spellInfo->Effects[eff].ItemType; + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item); + if (proto && proto->ItemLimitCategory) + data << uint32(proto->ItemLimitCategory); break; } case SPELL_FAILED_PREVENTED_BY_MECHANIC: @@ -3809,6 +3800,23 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas data << uint32(missingItem); // first missing item break; } + case SPELL_FAILED_PREVENTED_BY_MECHANIC: + data << uint32(spellInfo->Mechanic); + break; + case SPELL_FAILED_NEED_EXOTIC_AMMO: + data << uint32(spellInfo->EquippedItemSubClassMask); + break; + case SPELL_FAILED_NEED_MORE_ITEMS: + data << uint32(0); // Item entry + data << uint32(0); // Count + break; + case SPELL_FAILED_MIN_SKILL: + data << uint32(0); // SkillLine.dbc Id + data << uint32(0); // Amount + break; + case SPELL_FAILED_FISHING_TOO_LOW: + data << uint32(0); // Skill level + break; default: break; } @@ -3884,6 +3892,7 @@ void Spell::SendSpellGo() if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) castFlags |= CAST_FLAG_PENDING; + if ((m_caster->GetTypeId() == TYPEID_PLAYER || (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->isPet())) && m_spellInfo->PowerType != POWER_HEALTH) @@ -3896,7 +3905,6 @@ void Spell::SendSpellGo() { castFlags |= CAST_FLAG_UNKNOWN_19; // same as in SMSG_SPELL_START castFlags |= CAST_FLAG_RUNE_LIST; // rune cooldowns list - castFlags |= CAST_FLAG_UNKNOWN_9; // ?? } if (m_spellInfo->HasEffect(SPELL_EFFECT_ACTIVATE_RUNE)) @@ -4281,10 +4289,9 @@ void Spell::TakePower() for (std::list::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) if (ihit->targetGUID == targetGUID) { - if (ihit->missCondition != SPELL_MISS_NONE && ihit->missCondition != SPELL_MISS_MISS/* && ihit->targetGUID != m_caster->GetGUID()*/) - hit = false; if (ihit->missCondition != SPELL_MISS_NONE) { + hit = false; //lower spell cost on fail (by talent aura) if (Player* modOwner = m_caster->ToPlayer()->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_SPELL_COST_REFUND_ON_FAIL, m_powerCost); @@ -4469,9 +4476,7 @@ void Spell::TakeReagents() if (m_caster->GetTypeId() != TYPEID_PLAYER) return; - ItemTemplate const* castItemTemplate = m_CastItem - ? m_CastItem->GetTemplate() - : NULL; + ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : NULL; // do not take reagents for these item casts if (castItemTemplate && castItemTemplate->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST) @@ -4571,6 +4576,7 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGOT unitTarget = pUnitTarget; itemTarget = pItemTarget; gameObjTarget = pGOTarget; + destTarget = &m_destTargets[i]._position; uint8 eff = m_spellInfo->Effects[i].Effect; @@ -4706,7 +4712,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->isMoving()) { // skip stuck spell to allow use it in falling case and apply spell limitations at movement - if ((!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK) && + if ((!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR) || m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK) && (IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0)) return SPELL_FAILED_MOVING; } @@ -4751,11 +4757,17 @@ SpellCastResult Spell::CheckCast(bool strict) // TODO: using WorldSession::SendNotification is not blizzlike if (Player* playerCaster = m_caster->ToPlayer()) { + // mLastFailedCondition can be NULL if there was an error processing the condition in Condition::Meets (i.e. wrong data for ConditionTarget or others) if (playerCaster->GetSession() && condInfo.mLastFailedCondition && condInfo.mLastFailedCondition->ErrorTextId) + { playerCaster->GetSession()->SendNotification(condInfo.mLastFailedCondition->ErrorTextId); + return SPELL_FAILED_DONT_REPORT; + } } - return SPELL_FAILED_DONT_REPORT; + if (!condInfo.mLastFailedCondition || !condInfo.mLastFailedCondition->ConditionTarget) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_FAILED_BAD_TARGETS; } } @@ -4787,8 +4799,9 @@ SpellCastResult Spell::CheckCast(bool strict) if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) && !target->HasInArc(static_cast(M_PI), m_caster)) return SPELL_FAILED_NOT_INFRONT; - if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target)) - return SPELL_FAILED_LINE_OF_SIGHT; + if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly casted by a trigger) + if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target)) + return SPELL_FAILED_LINE_OF_SIGHT; } else { @@ -4806,7 +4819,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_targets.HasDst()) { float x, y, z; - m_targets.GetDst()->GetPosition(x, y, z); + m_targets.GetDstPos()->GetPosition(x, y, z); if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOS(x, y, z)) return SPELL_FAILED_LINE_OF_SIGHT; @@ -4899,6 +4912,37 @@ SpellCastResult Spell::CheckCast(bool strict) if (castResult != SPELL_CAST_OK) return castResult; + bool hasDispellableAura = false; + bool hasNonDispelEffect = false; + for (int i = 0; i < MAX_SPELL_EFFECTS; i++) + if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_DISPEL) + { + if (m_spellInfo->Effects[i].IsTargetingArea() || m_spellInfo->AttributesEx & SPELL_ATTR1_MELEE_COMBAT_START) + { + hasDispellableAura = true; + break; + } + if (Unit* target = m_targets.GetUnitTarget()) + { + DispelChargesList dispelList; + uint32 dispelMask = SpellInfo::GetDispelMask(DispelType(m_spellInfo->Effects[i].MiscValue)); + target->GetDispellableAuraList(m_caster, dispelMask, dispelList); + if (!dispelList.empty()) + { + hasDispellableAura = true; + break; + } + } + } + else if (m_spellInfo->Effects[i].IsEffect()) + { + hasNonDispelEffect = true; + break; + } + + if (!hasNonDispelEffect && !hasDispellableAura && m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL) && !IsTriggered()) + return SPELL_FAILED_NOTHING_TO_DISPEL; + for (int i = 0; i < MAX_SPELL_EFFECTS; i++) { // for effects of spells that have only one target @@ -4906,35 +4950,12 @@ SpellCastResult Spell::CheckCast(bool strict) { case SPELL_EFFECT_DUMMY: { - if (m_spellInfo->Id == 51582) // Rocket Boots Engaged - { - if (m_caster->IsInWater()) - return SPELL_FAILED_ONLY_ABOVEWATER; - } - else if (m_spellInfo->SpellIconID == 156) // Holy Shock - { - // spell different for friends and enemies - // hurt version required facing - if (m_targets.GetUnitTarget() && !m_caster->IsFriendlyTo(m_targets.GetUnitTarget()) && !m_caster->HasInArc(static_cast(M_PI), m_targets.GetUnitTarget())) - return SPELL_FAILED_UNIT_NOT_INFRONT; - } - else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] == 0x2000) // Death Coil (DeathKnight) - { - Unit* target = m_targets.GetUnitTarget(); - if (!target || (target->IsFriendlyTo(m_caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)) - return SPELL_FAILED_BAD_TARGETS; - } - else if (m_spellInfo->Id == 19938) // Awaken Peon + if (m_spellInfo->Id == 19938) // Awaken Peon { Unit* unit = m_targets.GetUnitTarget(); if (!unit || !unit->HasAura(17743)) return SPELL_FAILED_BAD_TARGETS; } - else if (m_spellInfo->Id == 52264) // Deliver Stolen Horse - { - if (!m_caster->FindNearestCreature(28653, 5)) - return SPELL_FAILED_OUT_OF_RANGE; - } else if (m_spellInfo->Id == 31789) // Righteous Defense { if (m_caster->GetTypeId() != TYPEID_PLAYER) @@ -5059,7 +5080,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (creature->GetCreatureType() != CREATURE_TYPE_CRITTER && !creature->loot.isLooted()) return SPELL_FAILED_TARGET_NOT_LOOTED; - uint32 skill = creature->GetCreatureInfo()->GetRequiredLootSkill(); + uint32 skill = creature->GetCreatureTemplate()->GetRequiredLootSkill(); int32 skillValue = m_caster->ToPlayer()->GetSkillValue(skill); int32 TargetLevel = m_targets.GetUnitTarget()->getLevel(); @@ -5142,10 +5163,8 @@ SpellCastResult Spell::CheckCast(bool strict) case SPELL_EFFECT_SUMMON_DEAD_PET: { Creature* pet = m_caster->GetGuardianPet(); - if (!pet) - return SPELL_FAILED_NO_PET; - if (pet->isAlive()) + if (pet && pet->isAlive()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; break; @@ -5195,7 +5214,6 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetCharmGUID()) return SPELL_FAILED_ALREADY_HAVE_CHARM; - break; } case SPELL_EFFECT_SUMMON_PLAYER: @@ -5270,8 +5288,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->Id == 781 && !m_caster->isInCombat()) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - Unit* target = m_targets.GetUnitTarget(); - if (m_caster == target && m_caster->HasUnitState(UNIT_STATE_ROOT)) + if (m_caster->HasUnitState(UNIT_STATE_ROOT)) { if (m_caster->GetTypeId() == TYPEID_PLAYER) return SPELL_FAILED_ROOTED; @@ -5327,7 +5344,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_HIGHLEVEL; // use SMSG_PET_TAME_FAILURE? - if (!target->GetCreatureInfo()->isTameable (m_caster->ToPlayer()->CanTameExoticPets())) + if (!target->GetCreatureTemplate()->isTameable (m_caster->ToPlayer()->CanTameExoticPets())) return SPELL_FAILED_BAD_TARGETS; if (m_caster->GetPetGUID()) @@ -5509,16 +5526,11 @@ SpellCastResult Spell::CheckPetCast(Unit* target) if (!target && m_targets.GetUnitTarget()) target = m_targets.GetUnitTarget(); - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + if (m_spellInfo->NeedsExplicitUnitTarget()) { - if (m_spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_UNIT_TARGET - || m_spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_DEST_TARGET) - { - if (!target) - return SPELL_FAILED_BAD_IMPLICIT_TARGETS; - m_targets.SetUnitTarget(target); - break; - } + if (!target) + return SPELL_FAILED_BAD_IMPLICIT_TARGETS; + m_targets.SetUnitTarget(target); } // cooldown @@ -5748,9 +5760,9 @@ SpellCastResult Spell::CheckRange(bool strict) if (m_targets.HasDst() && !m_targets.HasTraj()) { - if (!m_caster->IsWithinDist3d(m_targets.GetDst(), max_range)) + if (!m_caster->IsWithinDist3d(m_targets.GetDstPos(), max_range)) return SPELL_FAILED_OUT_OF_RANGE; - if (min_range && m_caster->IsWithinDist3d(m_targets.GetDst(), min_range)) + if (min_range && m_caster->IsWithinDist3d(m_targets.GetDstPos(), min_range)) return SPELL_FAILED_TOO_CLOSE; } @@ -5956,7 +5968,7 @@ SpellCastResult Spell::CheckItems() // check totem-item requirements (items presence in inventory) uint32 totems = 2; - for (int i = 0; i < 2 ; ++i) + for (int i = 0; i < 2; ++i) { if (m_spellInfo->Totem[i] != 0) { @@ -6179,9 +6191,12 @@ SpellCastResult Spell::CheckItems() case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_TARGET_NOT_PLAYER; + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_TARGET_NOT_PLAYER; + if (m_attackType != RANGED_ATTACK) break; + Item* pItem = m_caster->ToPlayer()->GetWeaponForAttack(m_attackType); if (!pItem || pItem->IsBroken()) return SPELL_FAILED_EQUIPPED_ITEM; @@ -6193,7 +6208,8 @@ SpellCastResult Spell::CheckItems() uint32 ammo = pItem->GetEntry(); if (!m_caster->ToPlayer()->HasItemCount(ammo, 1)) return SPELL_FAILED_NO_AMMO; - }; break; + }; + break; case ITEM_SUBCLASS_WEAPON_GUN: case ITEM_SUBCLASS_WEAPON_BOW: case ITEM_SUBCLASS_WEAPON_CROSSBOW: @@ -6357,6 +6373,30 @@ void Spell::UpdatePointers() m_CastItem = m_caster->ToPlayer()->GetItemByGuid(m_castItemGUID); m_targets.Update(m_caster); + + // further actions done only for dest targets + if (!m_targets.HasDst()) + return; + + // cache last transport + WorldObject* transport = NULL; + + // update effect destinations (in case of moved transport dest target) + for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + { + SpellDestination& dest = m_destTargets[effIndex]; + if (!dest._transportGUID) + continue; + + if (!transport || transport->GetGUID() != dest._transportGUID) + transport = ObjectAccessor::GetWorldObject(*m_caster, dest._transportGUID); + + if (transport) + { + dest._position.Relocate(transport); + dest._position.RelocateOffset(dest._transportOffset); + } + } } CurrentSpellTypes Spell::GetCurrentContainer() const @@ -6519,7 +6559,7 @@ bool SpellEvent::Execute(uint64 e_time, uint32 p_time) // no, we aren't, do the typical update // check, if we have channeled spell on our hands /* - if (IsChanneledSpell(m_Spell->m_spellInfo)) + if (m_Spell->m_spellInfo->IsChanneled()) { // evented channeled spell is processed separately, casted once after delay, and not destroyed till finish // check, if we have casting anything else except this channeled spell and autorepeat @@ -6840,7 +6880,7 @@ void Spell::CheckEffectExecuteData() void Spell::LoadScripts() { sScriptMgr->CreateSpellScripts(m_spellInfo->Id, m_loadedScripts); - for (std::list::iterator itr = m_loadedScripts.begin(); itr != m_loadedScripts.end() ;) + for (std::list::iterator itr = m_loadedScripts.begin(); itr != m_loadedScripts.end();) { if (!(*itr)->_Load(this)) { @@ -6857,11 +6897,11 @@ void Spell::LoadScripts() void Spell::CallScriptBeforeCastHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_BEFORE_CAST); std::list::iterator hookItrEnd = (*scritr)->BeforeCast.end(), hookItr = (*scritr)->BeforeCast.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr); (*scritr)->_FinishScriptCall(); @@ -6870,11 +6910,11 @@ void Spell::CallScriptBeforeCastHandlers() void Spell::CallScriptOnCastHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_ON_CAST); std::list::iterator hookItrEnd = (*scritr)->OnCast.end(), hookItr = (*scritr)->OnCast.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr); (*scritr)->_FinishScriptCall(); @@ -6883,11 +6923,11 @@ void Spell::CallScriptOnCastHandlers() void Spell::CallScriptAfterCastHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_AFTER_CAST); std::list::iterator hookItrEnd = (*scritr)->AfterCast.end(), hookItr = (*scritr)->AfterCast.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr); (*scritr)->_FinishScriptCall(); @@ -6897,7 +6937,7 @@ void Spell::CallScriptAfterCastHandlers() SpellCastResult Spell::CallScriptCheckCastHandlers() { SpellCastResult retVal = SPELL_CAST_OK; - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_CHECK_CAST); std::list::iterator hookItrEnd = (*scritr)->OnCheckCast.end(), hookItr = (*scritr)->OnCheckCast.begin(); @@ -6915,7 +6955,7 @@ SpellCastResult Spell::CallScriptCheckCastHandlers() void Spell::PrepareScriptHitHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) (*scritr)->_InitHit(); } @@ -6923,7 +6963,7 @@ bool Spell::CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMo { // execute script effect handler hooks and check if effects was prevented bool preventDefault = false; - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { std::list::iterator effItr, effEndItr; SpellScriptHookType hookType; @@ -6954,7 +6994,7 @@ bool Spell::CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMo return false; } (*scritr)->_PrepareScriptCall(hookType); - for (; effItr != effEndItr ; ++effItr) + for (; effItr != effEndItr; ++effItr) // effect execution can be prevented if (!(*scritr)->_IsEffectPrevented(effIndex) && (*effItr).IsEffectAffected(m_spellInfo, effIndex)) (*effItr).Call(*scritr, effIndex); @@ -6969,11 +7009,11 @@ bool Spell::CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMo void Spell::CallScriptBeforeHitHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_BEFORE_HIT); std::list::iterator hookItrEnd = (*scritr)->BeforeHit.end(), hookItr = (*scritr)->BeforeHit.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr); (*scritr)->_FinishScriptCall(); @@ -6982,11 +7022,11 @@ void Spell::CallScriptBeforeHitHandlers() void Spell::CallScriptOnHitHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_HIT); std::list::iterator hookItrEnd = (*scritr)->OnHit.end(), hookItr = (*scritr)->OnHit.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr); (*scritr)->_FinishScriptCall(); @@ -6995,11 +7035,11 @@ void Spell::CallScriptOnHitHandlers() void Spell::CallScriptAfterHitHandlers() { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_AFTER_HIT); std::list::iterator hookItrEnd = (*scritr)->AfterHit.end(), hookItr = (*scritr)->AfterHit.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) (*hookItr).Call(*scritr); (*scritr)->_FinishScriptCall(); @@ -7008,11 +7048,11 @@ void Spell::CallScriptAfterHitHandlers() void Spell::CallScriptAfterUnitTargetSelectHandlers(std::list& unitTargets, SpellEffIndex effIndex) { - for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) { (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_UNIT_TARGET_SELECT); std::list::iterator hookItrEnd = (*scritr)->OnUnitTargetSelect.end(), hookItr = (*scritr)->OnUnitTargetSelect.begin(); - for (; hookItr != hookItrEnd ; ++hookItr) + for (; hookItr != hookItrEnd; ++hookItr) if ((*hookItr).IsEffectAffected(m_spellInfo, effIndex)) (*hookItr).Call(*scritr, unitTargets); @@ -7020,14 +7060,13 @@ void Spell::CallScriptAfterUnitTargetSelectHandlers(std::list& unitTarget } } -bool Spell::CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* spellInfo) const +bool Spell::CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* triggeredByAura) const { - bool only_on_dummy = (spellInfo && (spellInfo->AttributesEx4 & SPELL_ATTR4_PROC_ONLY_ON_DUMMY)); - // If triggered spell has SPELL_ATTR4_PROC_ONLY_ON_DUMMY then it can only proc on a casted spell with SPELL_EFFECT_DUMMY - // If triggered spell doesn't have SPELL_ATTR4_PROC_ONLY_ON_DUMMY then it can NOT proc on SPELL_EFFECT_DUMMY (needs confirmation) + bool only_on_caster = (triggeredByAura && (triggeredByAura->AttributesEx4 & SPELL_ATTR4_PROC_ONLY_ON_CASTER)); + // If triggeredByAura has SPELL_ATTR4_PROC_ONLY_ON_CASTER then it can only proc on a casted spell with TARGET_UNIT_CASTER for (uint8 i = 0;i < MAX_SPELL_EFFECTS; ++i) { - if ((effMask & (1 << i)) && (only_on_dummy == (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_DUMMY))) + if ((effMask & (1 << i)) && (!only_on_caster || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_CASTER))) return true; } return false; @@ -7079,9 +7118,14 @@ void Spell::PrepareTriggersExecutedOnHit() // calculate the chance using spell base amount, because aura amount is not updated on combo-points change // this possibly needs fixing int32 auraBaseAmount = (*i)->GetBaseAmount(); - int32 chance = m_caster->CalculateSpellDamage(NULL, auraSpellInfo, auraSpellIdx, &auraBaseAmount); // proc chance is stored in effect amount - m_hitTriggerSpells.push_back(std::make_pair(spellInfo, chance * (*i)->GetBase()->GetStackAmount())); + int32 chance = m_caster->CalculateSpellDamage(NULL, auraSpellInfo, auraSpellIdx, &auraBaseAmount); + // build trigger and add to the list + HitTriggerSpell spellTriggerInfo; + spellTriggerInfo.triggeredSpell = spellInfo; + spellTriggerInfo.triggeredByAura = auraSpellInfo; + spellTriggerInfo.chance = chance * (*i)->GetBase()->GetStackAmount(); + m_hitTriggerSpells.push_back(spellTriggerInfo); } } } @@ -7154,7 +7198,7 @@ namespace Trinity { WorldObjectSpellTargetCheck::WorldObjectSpellTargetCheck(Unit* caster, Unit* referer, SpellInfo const* spellInfo, - SpellTargetCheckTypes selectionType, ConditionList* condList) : _caster(caster), _referer(referer), _spellInfo(spellInfo), + SpellTargetCheckTypes selectionType, ConditionList* condList) : _caster(caster), _referer(referer), _spellInfo(spellInfo), _targetSelectionType(selectionType), _condList(condList) { if (condList) @@ -7228,7 +7272,7 @@ bool WorldObjectSpellTargetCheck::operator()(WorldObject* target) return sConditionMgr->IsObjectMeetToConditions(*_condSrcInfo, *_condList); } -WorldObjectSpellNearbyTargetCheck::WorldObjectSpellNearbyTargetCheck(float range, Unit* caster, SpellInfo const* spellInfo, +WorldObjectSpellNearbyTargetCheck::WorldObjectSpellNearbyTargetCheck(float range, Unit* caster, SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionList* condList) : WorldObjectSpellTargetCheck(caster, caster, spellInfo, selectionType, condList), _range(range), _position(caster) { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index dd377d66feb..ff29269e281 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -57,7 +57,7 @@ enum SpellCastFlags CAST_FLAG_UNKNOWN_17 = 0x00010000, CAST_FLAG_ADJUST_MISSILE = 0x00020000, CAST_FLAG_UNKNOWN_19 = 0x00040000, - CAST_FLAG_VISUAL_CHAIN = 0x00080000, + CAST_FLAG_VISUAL_CHAIN = 0x00080000, CAST_FLAG_UNKNOWN_21 = 0x00100000, CAST_FLAG_RUNE_LIST = 0x00200000, CAST_FLAG_UNKNOWN_23 = 0x00400000, @@ -79,6 +79,18 @@ enum SpellRangeFlag SPELL_RANGE_RANGED = 2, //hunter range and ranged weapon }; +struct SpellDestination +{ + SpellDestination(); + SpellDestination(float x, float y, float z, float orientation = 0.0f, uint32 mapId = MAPID_INVALID); + SpellDestination(Position const& pos); + SpellDestination(WorldObject const& wObj); + + WorldLocation _position; + uint64 _transportGUID; + Position _transportOffset; +}; + class SpellCastTargets { public: @@ -115,14 +127,16 @@ class SpellCastTargets void SetTradeItemTarget(Player* caster); void UpdateTradeSlotItem(); - Position const* GetSrc() const; + SpellDestination const* GetSrc() const; + Position const* GetSrcPos() const; void SetSrc(float x, float y, float z); void SetSrc(Position const& pos); void SetSrc(WorldObject const& wObj); void ModSrc(Position const& pos); void RemoveSrc(); - WorldLocation const* GetDst() const; + SpellDestination const* GetDst() const; + WorldLocation const* GetDstPos() const; void SetDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID); void SetDst(Position const& pos); void SetDst(WorldObject const& wObj); @@ -139,7 +153,7 @@ class SpellCastTargets float GetSpeed() const { return m_speed; } void SetSpeed(float speed) { m_speed = speed; } - float GetDist2d() const { return m_srcPos.GetExactDist2d(&m_dstPos); } + float GetDist2d() const { return m_src._position.GetExactDist2d(&m_dst._position); } float GetSpeedXY() const { return m_speed * cos(m_elevation); } float GetSpeedZ() const { return m_speed * sin(m_elevation); } @@ -158,13 +172,8 @@ class SpellCastTargets uint64 m_itemTargetGUID; uint32 m_itemTargetEntry; - uint64 m_srcTransGUID; - Position m_srcTransOffset; - Position m_srcPos; - - uint64 m_dstTransGUID; - Position m_dstTransOffset; - WorldLocation m_dstPos; + SpellDestination m_src; + SpellDestination m_dst; float m_elevation, m_speed; std::string m_strTarget; @@ -197,11 +206,6 @@ enum SpellEffectHandleMode SPELL_EFFECT_HANDLE_HIT_TARGET, }; -namespace Trinity -{ - struct SpellNotifierCreatureAndPlayer; -} - class Spell { friend void Unit::SetCurrentCastedSpell(Spell* pSpell); @@ -450,7 +454,7 @@ class Spell void SetAutoRepeat(bool rep) { m_autoRepeat = rep; } void ReSetTimer() { m_timer = m_casttime > 0 ? m_casttime : 0; } bool IsNextMeleeSwingSpell() const; - bool IsTriggered() const {return _triggeredCastFlags & TRIGGERED_FULL_MASK;}; + bool IsTriggered() const { return _triggeredCastFlags & TRIGGERED_FULL_MASK; }; bool IsChannelActive() const { return m_caster->GetUInt32Value(UNIT_CHANNEL_SPELL) != 0; } bool IsAutoActionResetSpell() const; @@ -528,6 +532,7 @@ class Spell Unit* unitTarget; Item* itemTarget; GameObject* gameObjTarget; + WorldLocation* destTarget; int32 damage; SpellEffectHandleMode effectHandleMode; // used in effects handlers @@ -588,10 +593,13 @@ class Spell }; std::list m_UniqueItemInfo; - void AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid = true); + SpellDestination m_destTargets[MAX_SPELL_EFFECTS]; + + void AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid = true, bool implicit = true); void AddGOTarget(GameObject* target, uint32 effectMask); - void AddGOTarget(uint64 goGUID, uint32 effectMask); void AddItemTarget(Item* item, uint32 effectMask); + void AddDestTarget(SpellDestination const& dest, uint32 effIndex); + void DoAllEffectOnTarget(TargetInfo* target); SpellMissInfo DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleAura); void DoTriggersOnSpellHit(Unit* unit, uint8 effMask); @@ -624,13 +632,20 @@ class Spell void CallScriptAfterUnitTargetSelectHandlers(std::list& unitTargets, SpellEffIndex effIndex); std::list m_loadedScripts; - bool CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* spellInfo = NULL) const; + struct HitTriggerSpell + { + SpellInfo const* triggeredSpell; + SpellInfo const* triggeredByAura; + // uint8 triggeredByEffIdx This might be needed at a later stage - No need known for now + int32 chance; + }; + + bool CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* triggeredByAura = NULL) const; void PrepareTriggersExecutedOnHit(); - typedef std::list< std::pair > HitTriggerSpells; - HitTriggerSpells m_hitTriggerSpells; + typedef std::list HitTriggerSpellList; + HitTriggerSpellList m_hitTriggerSpells; // effect helpers - void GetSummonPosition(uint32 i, Position &pos, float radius = 0.0f, uint32 count = 0); void SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons); void CalculateJumpSpeeds(uint8 i, float dist, float & speedxy, float & speedz); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 271d4859c4c..4069cd5271a 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -403,23 +403,6 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (!unitTarget->HasAura(27825)) return; break; - // Cataclysmic Bolt - case 38441: - { - damage = unitTarget->CountPctFromMaxHealth(50); - break; - } - case 20625: // Ritual of Doom Sacrifice - case 29142: // Eyesore Blaster - case 35139: // Throw Boom's Doom - case 42393: // Brewfest - Attack Keg - case 55269: // Deathly Stare - case 56578: // Rapid-Fire Harpoon - case 62775: // Tympanic Tantrum - { - damage = unitTarget->CountPctFromMaxHealth(damage); - break; - } // Gargoyle Strike case 51963: { @@ -497,7 +480,8 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (aura) { uint32 pdamage = uint32(std::max(aura->GetAmount(), 0)); - pdamage = m_caster->SpellDamageBonus(unitTarget, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount()); + pdamage = m_caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount()); + pdamage = unitTarget->SpellDamageBonusTaken(m_caster, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount()); uint32 pct_dir = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, (effIndex + 1)); uint8 baseTotalTicks = uint8(m_caster->CalcSpellDuration(aura->GetSpellInfo()) / aura->GetSpellInfo()->Effects[EFFECT_0].Amplitude); damage += int32(CalculatePctU(pdamage * baseTotalTicks, pct_dir)); @@ -535,7 +519,8 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) // Shadow Word: Death - deals damage equal to damage done to caster if (m_spellInfo->SpellFamilyFlags[1] & 0x2) { - int32 back_damage = m_caster->SpellDamageBonus(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + int32 back_damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + back_damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, (uint32)back_damage, SPELL_DIRECT_DAMAGE); // Pain and Suffering reduces damage if (AuraEffect* aurEff = m_caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 2874, 0)) AddPctN(back_damage, -aurEff->GetAmount()); @@ -679,19 +664,19 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (found) damage += m_spellInfo->Effects[EFFECT_1].CalcValue(); - if (m_caster->GetTypeId() == TYPEID_PLAYER) + if (Player* caster = m_caster->ToPlayer()) { // Add Ammo and Weapon damage plus RAP * 0.1 - Item* item = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK); - if (item) + if (Item* item = caster->GetWeaponForAttack(RANGED_ATTACK)) { - float dmg_min = item->GetTemplate()->DamageMin; - float dmg_max = item->GetTemplate()->DamageMax; + ItemTemplate const* weaponTemplate = item->GetTemplate(); + float dmg_min = weaponTemplate->Damage[0].DamageMin; + float dmg_max = weaponTemplate->Damage[0].DamageMax; if (dmg_max == 0.0f && dmg_min > dmg_max) damage += int32(dmg_min); else damage += irand(int32(dmg_min), int32(dmg_max)); - damage += int32(item->GetTemplate()->Delay*0.001f); + damage += int32(weaponTemplate->Delay * 0.001f); } } } @@ -742,7 +727,10 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) } if (m_originalCaster && damage > 0 && apply_direct_bonus) - damage = m_originalCaster->SpellDamageBonus(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + { + damage = m_originalCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + damage = unitTarget->SpellDamageBonusTaken(m_originalCaster, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + } m_damage += damage; } @@ -787,7 +775,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) uint32 maxTargets = std::min(3, attackers.size()); for (uint32 i = 0; i < maxTargets; ++i) { - Unit* attacker = SelectRandomContainerElement(attackers); + Unit* attacker = Trinity::Containers::SelectRandomContainerElement(attackers); AddUnitTarget(attacker, 1 << 1); attackers.erase(attacker); } @@ -813,7 +801,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) bp = 46585; if (m_targets.HasDst()) - targets.SetDst(*m_targets.GetDst()); + targets.SetDst(*m_targets.GetDstPos()); else { targets.SetDst(*m_caster); @@ -827,8 +815,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) // Raise dead - take reagents and trigger summon spells case 48289: if (m_targets.HasDst()) - targets.SetDst(*m_targets.GetDst()); - + targets.SetDst(*m_targets.GetDstPos()); spell_id = CalculateDamage(0, NULL); break; } @@ -1044,7 +1031,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); return; } @@ -1116,10 +1103,6 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) case 52349: // Overtake unitTarget->CastCustomSpell(unitTarget, spellInfo->Id, &damage, NULL, NULL, true, NULL, NULL, m_originalCasterGUID); return; - case 72378: // Blood Nova - case 73058: // Blood Nova - m_caster->CastSpell(unitTarget, damage, true); // additional spell cast - break; } } @@ -1190,7 +1173,7 @@ void Spell::EffectJumpDest(SpellEffIndex effIndex) // Init dest coordinates float x, y, z; - m_targets.GetDst()->GetPosition(x, y, z); + destTarget->GetPosition(x, y, z); float speedXY, speedZ; CalculateJumpSpeeds(effIndex, m_caster->GetExactDist2d(x, y), speedXY, speedZ); @@ -1263,11 +1246,11 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) } // Init dest coordinates - uint32 mapid = m_targets.GetDst()->GetMapId(); + uint32 mapid = destTarget->GetMapId(); if (mapid == MAPID_INVALID) mapid = unitTarget->GetMapId(); float x, y, z, orientation; - m_targets.GetDst()->GetPosition(x, y, z, orientation); + destTarget->GetPosition(x, y, z, orientation); if (!orientation && m_targets.GetUnitTarget()) orientation = m_targets.GetUnitTarget()->GetOrientation(); sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - teleport unit to %u %f %f %f %f\n", mapid, x, y, z, orientation); @@ -1426,7 +1409,8 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex) return; // add spell damage bonus - damage = m_caster->SpellDamageBonus(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); // resilience reduce mana draining effect at spell crit damage reduction (added in 2.4) int32 power = damage; @@ -1589,7 +1573,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) int32 tickheal = targetAura->GetAmount(); if (Unit* auraCaster = targetAura->GetCaster()) - tickheal = auraCaster->SpellHealingBonus(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT); + tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT); //int32 tickheal = targetAura->GetSpellInfo()->EffectBasePoints[idx] + 1; //It is said that talent bonus should not be included @@ -1610,11 +1594,12 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) //addhealth += tickheal * tickcount; //addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth, HEAL, unitTarget); } - // Glyph of Nourish + // Nourish else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags[1] & 0x2000000) { - addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL); + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL); + // Glyph of Nourish if (AuraEffect const* aurEff = m_caster->GetAuraEffect(62971, 0)) { Unit::AuraEffectList const& Periodic = unitTarget->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HEAL); @@ -1625,25 +1610,13 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) } } } - // Lifebloom - final heal coef multiplied by original DoT stack - else if (m_spellInfo->Id == 33778) - addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL, m_spellValue->EffectBasePoints[1]); - // Riptide - increase healing done by Chain Heal - else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[0] & 0x100) - { - addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL); - if (AuraEffect* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, m_originalCasterGUID)) - { - addhealth = int32(addhealth * 1.25f); - // consume aura - unitTarget->RemoveAura(aurEff->GetBase()); - } - } // Death Pact - return pct of max health to caster else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] & 0x00080000) - addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL); + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL); else - addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL); + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL); + + addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL); // Remove Grievious bite if fully healed if (unitTarget->HasAura(48920) && (unitTarget->GetHealth() + addhealth >= unitTarget->GetMaxHealth())) @@ -1669,7 +1642,10 @@ void Spell::EffectHealPct(SpellEffIndex /*effIndex*/) if (m_spellInfo->Id == 59754 && unitTarget == m_caster) return; - m_healing += m_originalCaster->SpellHealingBonus(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL); + uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL); + heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); + + m_healing += heal; } void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) @@ -1684,7 +1660,9 @@ void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) if (!m_originalCaster) return; - m_healing += m_originalCaster->SpellHealingBonus(unitTarget, m_spellInfo, uint32(damage), HEAL); + uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL); + + m_healing += unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); } void Spell::EffectHealthLeech(SpellEffIndex effIndex) @@ -1695,7 +1673,8 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex) if (!unitTarget || !unitTarget->isAlive() || damage < 0) return; - damage = m_caster->SpellDamageBonus(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "HealthLeech :%i", damage); @@ -1707,7 +1686,9 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex) if (m_caster->isAlive()) { - healthGain = m_caster->SpellHealingBonus(m_caster, m_spellInfo, healthGain, HEAL); + healthGain = m_caster->SpellHealingBonusDone(m_caster, m_spellInfo, healthGain, HEAL); + healthGain = m_caster->SpellHealingBonusTaken(m_caster, m_spellInfo, healthGain, HEAL); + m_caster->HealBySpell(m_caster, m_spellInfo, uint32(healthGain)); } } @@ -1896,7 +1877,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) if (!caster->IsInWorld()) return; DynamicObject* dynObj = new DynamicObject(false); - if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, DYNAMIC_OBJECT_AREA_SPELL)) + if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL)) { delete dynObj; return; @@ -2006,7 +1987,7 @@ void Spell::EffectEnergize(SpellEffIndex effIndex) sSpellMgr->GetSetOfSpellsInSpellGroup(SPELL_GROUP_ELIXIR_GUARDIAN, avalibleElixirs); if (!battleFound) sSpellMgr->GetSetOfSpellsInSpellGroup(SPELL_GROUP_ELIXIR_BATTLE, avalibleElixirs); - for (std::set::iterator itr = avalibleElixirs.begin(); itr != avalibleElixirs.end() ;) + for (std::set::iterator itr = avalibleElixirs.begin(); itr != avalibleElixirs.end();) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(*itr); if (spellInfo->SpellLevel < m_spellInfo->SpellLevel || spellInfo->SpellLevel > unitTarget->getLevel()) @@ -2022,7 +2003,7 @@ void Spell::EffectEnergize(SpellEffIndex effIndex) if (!avalibleElixirs.empty()) { // cast random elixir on target - m_caster->CastSpell(unitTarget, SelectRandomContainerElement(avalibleElixirs), true, m_CastItem); + m_caster->CastSpell(unitTarget, Trinity::Containers::SelectRandomContainerElement(avalibleElixirs), true, m_CastItem); } } } @@ -2370,9 +2351,6 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) if (Player* modOwner = m_originalCaster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration); - Position pos; - GetSummonPosition(effIndex, pos); - TempSummon* summon = NULL; // determine how many units should be summoned @@ -2426,11 +2404,11 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) // Summons a vehicle, but doesn't force anyone to enter it (see SUMMON_CATEGORY_VEHICLE) case SUMMON_TYPE_VEHICLE: case SUMMON_TYPE_VEHICLE2: - summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster, m_spellInfo->Id); + summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id); break; case SUMMON_TYPE_TOTEM: { - summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster, m_spellInfo->Id); + summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id); if (!summon || !summon->isTotem()) return; @@ -2447,12 +2425,12 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) } case SUMMON_TYPE_MINIPET: { - summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster, m_spellInfo->Id); + summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id); if (!summon || !summon->HasUnitTypeMask(UNIT_MASK_MINION)) return; - summon->SelectLevel(summon->GetCreatureInfo()); // some summoned creaters have different from 1 DB data for level/hp - summon->SetUInt32Value(UNIT_NPC_FLAGS, summon->GetCreatureInfo()->npcflag); + summon->SelectLevel(summon->GetCreatureTemplate()); // some summoned creaters have different from 1 DB data for level/hp + summon->SetUInt32Value(UNIT_NPC_FLAGS, summon->GetCreatureTemplate()->npcflag); summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); @@ -2467,9 +2445,14 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) for (uint32 count = 0; count < numSummons; ++count) { - GetSummonPosition(effIndex, pos, radius, count); + Position pos; + if (count == 0) + pos = *destTarget; + else + // randomize position for multiple summons + m_caster->GetRandomPoint(*destTarget, radius, pos); - summon = m_originalCaster->SummonCreature(entry, pos, summonType, duration); + summon = m_originalCaster->SummonCreature(entry, *destTarget, summonType, duration); if (!summon) continue; @@ -2490,14 +2473,14 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) SummonGuardian(effIndex, entry, properties, numSummons); break; case SUMMON_CATEGORY_PUPPET: - summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster, m_spellInfo->Id); + summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id); break; case SUMMON_CATEGORY_VEHICLE: // Summoning spells (usually triggered by npc_spellclick) that spawn a vehicle and that cause the clicker // to cast a ride vehicle spell on the summoned unit. float x, y, z; m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); - summon = m_originalCaster->GetMap()->SummonCreature(entry, pos, properties, duration, m_caster, m_spellInfo->Id); + summon = m_originalCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_caster, m_spellInfo->Id); if (!summon || !summon->IsVehicle()) return; @@ -2548,7 +2531,6 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) } typedef std::list< std::pair > DispelList; -typedef std::list< std::pair > DispelChargesList; void Spell::EffectDispel(SpellEffIndex effIndex) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) @@ -2557,48 +2539,12 @@ void Spell::EffectDispel(SpellEffIndex effIndex) if (!unitTarget) return; - DispelChargesList dispel_list; - // Create dispel mask by dispel type uint32 dispel_type = m_spellInfo->Effects[effIndex].MiscValue; uint32 dispelMask = SpellInfo::GetDispelMask(DispelType(dispel_type)); - // we should not be able to dispel diseases if the target is affected by unholy blight - if (dispelMask & (1 << DISPEL_DISEASE) && unitTarget->HasAura(50536)) - dispelMask &= ~(1 << DISPEL_DISEASE); - - Unit::AuraMap const& auras = unitTarget->GetOwnedAuras(); - for (Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) - { - Aura* aura = itr->second; - AuraApplication * aurApp = aura->GetApplicationOfTarget(unitTarget->GetGUID()); - if (!aurApp) - continue; - - // don't try to remove passive auras - if (aura->IsPassive()) - continue; - - if (aura->GetSpellInfo()->GetDispelMask() & dispelMask) - { - if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC) - { - // do not remove positive auras if friendly target - // negative auras if non-friendly target - if (aurApp->IsPositive() == unitTarget->IsFriendlyTo(m_caster)) - continue; - } - - // The charges / stack amounts don't count towards the total number of auras that can be dispelled. - // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell - // Polymorph instead of 1 / (5 + 1) -> 16%. - bool dispel_charges = aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES; - uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount(); - if (charges > 0) - dispel_list.push_back(std::make_pair(aura, charges)); - } - } - + DispelChargesList dispel_list; + unitTarget->GetDispellableAuraList(m_caster, dispelMask, dispel_list); if (dispel_list.empty()) return; @@ -2719,7 +2665,7 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) if (unitTarget->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING)) return; - unitTarget->SetFacingTo(unitTarget->GetAngle(m_targets.GetDst())); + unitTarget->SetFacingTo(unitTarget->GetAngle(destTarget)); unitTarget->ClearUnitState(UNIT_STATE_MOVING); if (unitTarget->GetTypeId() == TYPEID_UNIT) @@ -2758,7 +2704,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) return; DynamicObject* dynObj = new DynamicObject(true); - if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) + if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj; return; @@ -2810,7 +2756,7 @@ void Spell::EffectLearnSkill(SpellEffIndex effIndex) if (damage < 0) return; - uint32 skillid = m_spellInfo->Effects[effIndex].MiscValue; + uint32 skillid = m_spellInfo->Effects[effIndex].MiscValue; uint16 skillval = unitTarget->ToPlayer()->GetPureSkillValue(skillid); unitTarget->ToPlayer()->SetSkill(skillid, m_spellInfo->Effects[effIndex].CalcValue(), skillval?skillval:1, damage*75); } @@ -3381,7 +3327,7 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) if (m_spellInfo->Id == 20467) { spell_bonus += int32(0.08f * m_caster->GetTotalAttackPowerValue(BASE_ATTACK)); - spell_bonus += int32(0.13f * m_caster->SpellBaseDamageBonus(m_spellInfo->GetSchoolMask())); + spell_bonus += int32(0.13f * m_caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask())); } break; } @@ -3550,8 +3496,9 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) uint32 eff_damage(std::max(weaponDamage, 0)); // Add melee damage bonuses (also check for negative) - m_caster->MeleeDamageBonus(unitTarget, &eff_damage, m_attackType, m_spellInfo); - m_damage += eff_damage; + uint32 damage = m_caster->MeleeDamageBonusDone(unitTarget, eff_damage, m_attackType, m_spellInfo); + + m_damage += unitTarget->MeleeDamageBonusTaken(m_caster, damage, m_attackType, m_spellInfo); } void Spell::EffectThreat(SpellEffIndex /*effIndex*/) @@ -3576,7 +3523,7 @@ void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/) if (!unitTarget || !unitTarget->isAlive()) return; - int32 addhealth; + int32 addhealth = 0; if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN) // Lay on Hands { if (m_caster->GetGUID() == unitTarget->GetGUID()) @@ -3593,8 +3540,7 @@ void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/) else addhealth = unitTarget->GetMaxHealth() - unitTarget->GetHealth(); - if (m_originalCaster) - m_healing += m_originalCaster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL); + m_healing += addhealth; } void Spell::EffectInterruptCast(SpellEffIndex effIndex) @@ -3647,7 +3593,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) float x, y, z; if (m_targets.HasDst()) - m_targets.GetDst()->GetPosition(x, y, z); + destTarget->GetPosition(x, y, z); else m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); @@ -4032,7 +3978,9 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) while (bag) // 256 = 0 due to var type { item = m_caster->ToPlayer()->GetItemByPos(bag, slot); - if (item && item->GetEntry() == 38587) break; + if (item && item->GetEntry() == 38587) + break; + ++slot; if (slot == 39) { @@ -4190,7 +4138,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) float radius = m_spellInfo->Effects[effIndex].CalcRadius(); for (uint8 i = 0; i < 15; ++i) { - m_caster->GetRandomPoint(*m_targets.GetDst(), radius, x, y, z); + m_caster->GetRandomPoint(*destTarget, radius, x, y, z); m_caster->CastSpell(x, y, z, 54522, true); } break; @@ -4622,7 +4570,8 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) 45684 // Polymorph }; - static uint32 const spellTarget[5] = { + static uint32 const spellTarget[5] = + { 45673, // Bigger! 45672, // Shrunk 45677, // Yellow @@ -5075,7 +5024,7 @@ void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex) return; // must be equipped - if (!item ->IsEquipped()) + if (!item->IsEquipped()) return; if (m_spellInfo->Effects[effIndex].MiscValue) @@ -5230,7 +5179,7 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) float x, y, z; // If dest location if present if (m_targets.HasDst()) - m_targets.GetDst()->GetPosition(x, y, z); + destTarget->GetPosition(x, y, z); // Summon in random point all other units if location present else m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); @@ -5360,7 +5309,7 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/) return; Position pos; - m_targets.GetDst()->GetPosition(&pos); + destTarget->GetPosition(&pos); unitTarget->GetFirstCollisionPosition(pos, unitTarget->GetDistance(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + 2.0f), 0.0f); unitTarget->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), unitTarget == m_caster); } @@ -5484,7 +5433,7 @@ void Spell::EffectSkinning(SpellEffIndex /*effIndex*/) Creature* creature = unitTarget->ToCreature(); int32 targetLevel = creature->getLevel(); - uint32 skill = creature->GetCreatureInfo()->GetRequiredLootSkill(); + uint32 skill = creature->GetCreatureTemplate()->GetRequiredLootSkill(); m_caster->ToPlayer()->SendLoot(creature->GetGUID(), LOOT_SKINNING); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); @@ -5532,7 +5481,7 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/) if (m_targets.HasDst()) { Position pos; - m_targets.GetDst()->GetPosition(&pos); + destTarget->GetPosition(&pos); float angle = m_caster->GetRelativeAngle(pos.GetPositionX(), pos.GetPositionY()); float dist = m_caster->GetDistance(pos); m_caster->GetFirstCollisionPosition(pos, dist, angle); @@ -5583,7 +5532,7 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex) if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_KNOCK_BACK_DEST) { if (m_targets.HasDst()) - m_targets.GetDst()->GetPosition(x, y); + destTarget->GetPosition(x, y); else return; } @@ -5671,7 +5620,7 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_PULL_TOWARDS_DEST) { if (m_targets.HasDst()) - pos.Relocate(*m_targets.GetDst()); + pos.Relocate(*destTarget); else return; } @@ -5722,7 +5671,7 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) return; Pet* pet = player->GetPet(); - if (!pet || pet->isAlive()) + if (pet && pet->isAlive()) return; if (damage < 0) @@ -5730,6 +5679,14 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) float x, y, z; player->GetPosition(x, y, z); + if (!pet) + { + player->SummonPet(0, x, y, z, player->GetOrientation(), SUMMON_PET, 0); + pet = player->GetPet(); + } + if (!pet) + return; + player->GetMap()->CreatureRelocation(pet, x, y, z, player->GetOrientation()); pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE); @@ -5858,7 +5815,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) float fx, fy, fz; if (m_targets.HasDst()) - m_targets.GetDst()->GetPosition(fx, fy, fz); + destTarget->GetPosition(fx, fy, fz); //FIXME: this can be better check for most objects but still hack else if (m_spellInfo->Effects[effIndex].HasRadius() && m_spellInfo->Speed == 0) { @@ -6439,7 +6396,11 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* for (uint32 count = 0; count < numGuardians; ++count) { Position pos; - GetSummonPosition(i, pos, radius, count); + if (count == 0) + pos = *destTarget; + else + // randomize position for multiple summons + m_caster->GetRandomPoint(*destTarget, radius, pos); TempSummon* summon = map->SummonCreature(entry, pos, properties, duration, caster, m_spellInfo->Id); if (!summon) @@ -6470,44 +6431,6 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* } } -void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 count) -{ - pos.SetOrientation(m_caster->GetOrientation()); - - if (m_targets.HasDst()) - { - // Summon 1 unit in dest location - if (count == 0) - pos.Relocate(*m_targets.GetDst()); - // Summon in random point all other units if location present - else - { - //This is a workaround. Do not have time to write much about it - switch (m_spellInfo->Effects[i].TargetA.GetTarget()) - { - case TARGET_DEST_CASTER_SUMMON: - case TARGET_DEST_CASTER_RANDOM: - m_caster->GetNearPosition(pos, radius * (float)rand_norm(), (float)rand_norm()*static_cast(2*M_PI)); - break; - case TARGET_DEST_DEST_RANDOM: - case TARGET_DEST_TARGET_RANDOM: - m_caster->GetRandomPoint(*m_targets.GetDst(), radius, pos); - break; - default: - pos.Relocate(*m_targets.GetDst()); - break; - } - } - } - // Summon if dest location not present near caster - else - { - float x, y, z; - m_caster->GetClosePoint(x, y, z, 3.0f); - pos.Relocate(x, y, z); - } -} - void Spell::EffectRenamePet(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 8b8f1fb5afc..183ca747b37 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -61,11 +61,6 @@ bool SpellImplicitTargetInfo::IsArea() const return GetSelectionCategory() == TARGET_SELECT_CATEGORY_AREA || GetSelectionCategory() == TARGET_SELECT_CATEGORY_CONE; } -SpellSelectTargetTypes SpellImplicitTargetInfo::GetType() const -{ - return Type[_target]; -} - SpellTargetSelectionCategories SpellImplicitTargetInfo::GetSelectionCategory() const { return _data[_target].SelectionCategory; @@ -104,7 +99,7 @@ float SpellImplicitTargetInfo::CalcDirectionAngle() const case TARGET_DIR_LEFT: return static_cast(M_PI/2); case TARGET_DIR_FRONT_RIGHT: - return static_cast(M_PI/4); + return static_cast(-M_PI/4); case TARGET_DIR_BACK_RIGHT: return static_cast(-3*M_PI/4); case TARGET_DIR_BACK_LEFT: @@ -207,144 +202,6 @@ uint32 SpellImplicitTargetInfo::GetExplicitTargetMask(bool& srcSet, bool& dstSet return targetMask; } -bool SpellImplicitTargetInfo::InitStaticData() -{ - InitTypeData(); - return true; -} - -void SpellImplicitTargetInfo::InitTypeData() -{ - for (uint8 i = 0; i < TOTAL_SPELL_TARGETS; ++i) - { - switch (i) - { - case TARGET_UNIT_CASTER: - case TARGET_DEST_CASTER_FISHING: - case TARGET_UNIT_MASTER: - case TARGET_UNIT_PET: - case TARGET_UNIT_CASTER_AREA_PARTY: - case TARGET_UNIT_CASTER_AREA_RAID: - case TARGET_UNIT_VEHICLE: - case TARGET_UNIT_PASSENGER_0: - case TARGET_UNIT_PASSENGER_1: - case TARGET_UNIT_PASSENGER_2: - case TARGET_UNIT_PASSENGER_3: - case TARGET_UNIT_PASSENGER_4: - case TARGET_UNIT_PASSENGER_5: - case TARGET_UNIT_PASSENGER_6: - case TARGET_UNIT_PASSENGER_7: - case TARGET_UNIT_SUMMONER: - Type[i] = TARGET_TYPE_UNIT_CASTER; - break; - case TARGET_UNIT_TARGET_MINIPET: - case TARGET_UNIT_TARGET_ALLY: - case TARGET_UNIT_TARGET_RAID: - case TARGET_UNIT_TARGET_ANY: - case TARGET_UNIT_TARGET_ENEMY: - case TARGET_UNIT_TARGET_PARTY: - case TARGET_UNIT_TARGET_PASSENGER: - case TARGET_UNIT_LASTTARGET_AREA_PARTY: - case TARGET_UNIT_TARGET_AREA_RAID_CLASS: - case TARGET_UNIT_TARGET_CHAINHEAL_ALLY: - Type[i] = TARGET_TYPE_UNIT_TARGET; - break; - case TARGET_UNIT_NEARBY_ENEMY: - case TARGET_UNIT_NEARBY_ALLY: - case TARGET_UNIT_NEARBY_ENTRY: - case TARGET_UNIT_NEARBY_PARTY: - case TARGET_UNIT_NEARBY_RAID: - case TARGET_GAMEOBJECT_NEARBY_ENTRY: - Type[i] = TARGET_TYPE_UNIT_NEARBY; - break; - case TARGET_UNIT_SRC_AREA_ENEMY: - case TARGET_UNIT_SRC_AREA_ALLY: - case TARGET_UNIT_SRC_AREA_ENTRY: - case TARGET_UNIT_SRC_AREA_PARTY: - case TARGET_GAMEOBJECT_SRC_AREA: - Type[i] = TARGET_TYPE_AREA_SRC; - break; - case TARGET_UNIT_DEST_AREA_ENEMY: - case TARGET_UNIT_DEST_AREA_ALLY: - case TARGET_UNIT_DEST_AREA_ENTRY: - case TARGET_UNIT_DEST_AREA_PARTY: - case TARGET_GAMEOBJECT_DEST_AREA: - Type[i] = TARGET_TYPE_AREA_DST; - break; - case TARGET_UNIT_CONE_ENEMY_24: - case TARGET_UNIT_CONE_ALLY: - case TARGET_UNIT_CONE_ENTRY: - case TARGET_UNIT_CONE_ENEMY_54: - case TARGET_UNIT_CONE_ENEMY_104: - case TARGET_GAMEOBJECT_CONE: - Type[i] = TARGET_TYPE_AREA_CONE; - break; - case TARGET_DEST_CASTER: - case TARGET_SRC_CASTER: - case TARGET_DEST_CASTER_SUMMON: - case TARGET_DEST_CASTER_FRONT_LEAP: - case TARGET_DEST_CASTER_FRONT: - case TARGET_DEST_CASTER_BACK: - case TARGET_DEST_CASTER_RIGHT: - case TARGET_DEST_CASTER_LEFT: - case TARGET_DEST_CASTER_FRONT_LEFT: - case TARGET_DEST_CASTER_BACK_LEFT: - case TARGET_DEST_CASTER_BACK_RIGHT: - case TARGET_DEST_CASTER_FRONT_RIGHT: - case TARGET_DEST_CASTER_RANDOM: - case TARGET_DEST_CASTER_RADIUS: - Type[i] = TARGET_TYPE_DEST_CASTER; - break; - case TARGET_DEST_TARGET_ENEMY: - case TARGET_DEST_TARGET_ANY: - case TARGET_DEST_TARGET_FRONT: - case TARGET_DEST_TARGET_BACK: - case TARGET_DEST_TARGET_RIGHT: - case TARGET_DEST_TARGET_LEFT: - case TARGET_DEST_TARGET_FRONT_LEFT: - case TARGET_DEST_TARGET_BACK_LEFT: - case TARGET_DEST_TARGET_BACK_RIGHT: - case TARGET_DEST_TARGET_FRONT_RIGHT: - case TARGET_DEST_TARGET_RANDOM: - case TARGET_DEST_TARGET_RADIUS: - Type[i] = TARGET_TYPE_DEST_TARGET; - break; - case TARGET_DEST_DYNOBJ_ENEMY: - case TARGET_DEST_DYNOBJ_ALLY: - case TARGET_DEST_DYNOBJ_NONE: - case TARGET_DEST_DEST: - case TARGET_DEST_TRAJ: - case TARGET_DEST_DEST_FRONT_LEFT: - case TARGET_DEST_DEST_BACK_LEFT: - case TARGET_DEST_DEST_BACK_RIGHT: - case TARGET_DEST_DEST_FRONT_RIGHT: - case TARGET_DEST_DEST_FRONT: - case TARGET_DEST_DEST_BACK: - case TARGET_DEST_DEST_RIGHT: - case TARGET_DEST_DEST_LEFT: - case TARGET_DEST_DEST_RANDOM: - case TARGET_DEST_DEST_RADIUS: - Type[i] = TARGET_TYPE_DEST_DEST; - break; - case TARGET_DEST_DB: - case TARGET_DEST_HOME: - case TARGET_DEST_NEARBY_ENTRY: - Type[i] = TARGET_TYPE_DEST_SPECIAL; - break; - case TARGET_UNIT_CHANNEL_TARGET: - case TARGET_DEST_CHANNEL_TARGET: - case TARGET_DEST_CHANNEL_CASTER: - Type[i] = TARGET_TYPE_CHANNEL; - break; - default: - Type[i] = TARGET_TYPE_DEFAULT; - } - } -} - -bool SpellImplicitTargetInfo::Init = SpellImplicitTargetInfo::InitStaticData(); -SpellSelectTargetTypes SpellImplicitTargetInfo::Type[TOTAL_SPELL_TARGETS]; - SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_TARGETS] = { {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // @@ -496,7 +353,7 @@ bool SpellEffectInfo::IsEffect() const bool SpellEffectInfo::IsEffect(SpellEffects effectName) const { - return Effect == effectName; + return Effect == uint32(effectName); } bool SpellEffectInfo::IsAura() const @@ -759,7 +616,7 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 66 SPELL_EFFECT_CREATE_MANA_GEM {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 67 SPELL_EFFECT_HEAL_MAX_HEALTH {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 68 SPELL_EFFECT_INTERRUPT_CAST - {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 69 SPELL_EFFECT_DISTRACT + {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 69 SPELL_EFFECT_DISTRACT {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 70 SPELL_EFFECT_PULL {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 71 SPELL_EFFECT_PICKPOCKET {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 72 SPELL_EFFECT_ADD_FARSIGHT @@ -1410,7 +1267,6 @@ bool SpellInfo::IsAuraExclusiveBySpecificWith(SpellInfo const* spellInfo) const SpellSpecificType spellSpec2 = spellInfo->GetSpellSpecific(); switch (spellSpec1) { - case SPELL_SPECIFIC_PHASE: case SPELL_SPECIFIC_TRACKER: case SPELL_SPECIFIC_WARLOCK_ARMOR: case SPELL_SPECIFIC_MAGE_ARMOR: @@ -2129,8 +1985,6 @@ SpellSpecificType SpellInfo::GetSpellSpecific() const case SPELL_AURA_TRACK_RESOURCES: case SPELL_AURA_TRACK_STEALTHED: return SPELL_SPECIFIC_TRACKER; - case SPELL_AURA_PHASE: - return SPELL_SPECIFIC_PHASE; } } } @@ -2193,6 +2047,33 @@ uint32 SpellInfo::CalcCastTime(Unit* caster, Spell* spell) const return (castTime > 0) ? uint32(castTime) : 0; } +uint32 SpellInfo::GetMaxTicks() const +{ + int32 DotDuration = GetDuration(); + if (DotDuration == 0) + return 1; + + // 200% limit + if (DotDuration > 30000) + DotDuration = 30000; + + for (uint8 x = 0; x < MAX_SPELL_EFFECTS; x++) + { + if (Effects[x].Effect == SPELL_EFFECT_APPLY_AURA) + switch (Effects[x].ApplyAuraName) + { + case SPELL_AURA_PERIODIC_DAMAGE: + case SPELL_AURA_PERIODIC_HEAL: + case SPELL_AURA_PERIODIC_LEECH: + if (Effects[x].Amplitude != 0) + return DotDuration / Effects[x].Amplitude; + break; + } + } + + return 6; +} + uint32 SpellInfo::GetRecoveryTime() const { return RecoveryTime > CategoryRecoveryTime ? RecoveryTime : CategoryRecoveryTime; @@ -2397,12 +2278,12 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const switch (Id) { case 34700: // Allergic Reaction - case 61716: // Rabbit Costume - case 61734: // Noblegarden Bunny case 61987: // Avenging Wrath Marker case 61988: // Divine Shield exclude aura case 62532: // Conservator's Grip return false; + case 61716: // Rabbit Costume + case 61734: // Noblegarden Bunny case 30877: // Tag Murloc case 62344: // Fists of Stone return true; diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index baf03589794..a338b8d627f 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -133,22 +133,6 @@ enum SpellTargetDirectionTypes TARGET_DIR_ENTRY, }; -enum SpellSelectTargetTypes -{ - TARGET_TYPE_DEFAULT, - TARGET_TYPE_UNIT_CASTER, - TARGET_TYPE_UNIT_TARGET, - TARGET_TYPE_UNIT_NEARBY, - TARGET_TYPE_AREA_SRC, - TARGET_TYPE_AREA_DST, - TARGET_TYPE_AREA_CONE, - TARGET_TYPE_DEST_CASTER, - TARGET_TYPE_DEST_TARGET, - TARGET_TYPE_DEST_DEST, - TARGET_TYPE_DEST_SPECIAL, - TARGET_TYPE_CHANNEL, -}; - enum SpellEffectImplicitTargetTypes { EFFECT_IMPLICIT_TARGET_NONE = 0, @@ -182,7 +166,6 @@ enum SpellSpecificType SPELL_SPECIFIC_WARRIOR_ENRAGE = 26, SPELL_SPECIFIC_PRIEST_DIVINE_SPIRIT = 27, SPELL_SPECIFIC_HAND = 28, - SPELL_SPECIFIC_PHASE = 29, }; enum SpellCustomAttributes @@ -218,7 +201,6 @@ public: SpellImplicitTargetInfo(uint32 target); bool IsArea() const; - SpellSelectTargetTypes GetType() const; SpellTargetSelectionCategories GetSelectionCategory() const; SpellTargetReferenceTypes GetReferenceType() const; SpellTargetObjectTypes GetObjectType() const; @@ -229,14 +211,7 @@ public: Targets GetTarget() const; uint32 GetExplicitTargetMask(bool& srcSet, bool& dstSet) const; - // temporarily avalible to public - static SpellSelectTargetTypes Type[TOTAL_SPELL_TARGETS]; private: - static bool InitStaticData(); - static void InitTypeData(); - - static bool Init; - struct StaticData { SpellTargetObjectTypes ObjectType; // type of object returned by target type @@ -508,6 +483,8 @@ public: int32 GetDuration() const; int32 GetMaxDuration() const; + uint32 GetMaxTicks() const; + uint32 CalcCastTime(Unit* caster = NULL, Spell* spell = NULL) const; uint32 GetRecoveryTime() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 67bd7939d70..117953f2bc0 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -111,24 +111,14 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, } case SPELLFAMILY_WARLOCK: { - // Death Coil - if (spellproto->SpellFamilyFlags[0] & 0x80000) - return DIMINISHING_HORROR; // Curses/etc - else if ((spellproto->SpellFamilyFlags[0] & 0x80000000) || (spellproto->SpellFamilyFlags[1] & 0x200)) + if ((spellproto->SpellFamilyFlags[0] & 0x80000000) || (spellproto->SpellFamilyFlags[1] & 0x200)) return DIMINISHING_LIMITONLY; // Seduction else if (spellproto->SpellFamilyFlags[1] & 0x10000000) return DIMINISHING_FEAR; break; } - case SPELLFAMILY_PRIEST: - { - // Psychic Horror - if (spellproto->SpellFamilyFlags[2] & 0x2000) - return DIMINISHING_HORROR; - break; - } case SPELLFAMILY_DRUID: { // Pounce @@ -228,6 +218,8 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, return DIMINISHING_BANISH; if (mechanic & (1 << MECHANIC_ROOT)) return triggered ? DIMINISHING_ROOT : DIMINISHING_CONTROLLED_ROOT; + if (mechanic & (1 << MECHANIC_HORROR)) + return DIMINISHING_HORROR; return DIMINISHING_NONE; } @@ -651,7 +643,7 @@ SpellSpellGroupMapBounds SpellMgr::GetSpellSpellGroupMapBounds(uint32 spell_id) uint32 SpellMgr::IsSpellMemberOfSpellGroup(uint32 spellid, SpellGroup groupid) const { SpellSpellGroupMapBounds spellGroup = GetSpellSpellGroupMapBounds(spellid); - for (SpellSpellGroupMap::const_iterator itr = spellGroup.first; itr != spellGroup.second ; ++itr) + for (SpellSpellGroupMap::const_iterator itr = spellGroup.first; itr != spellGroup.second; ++itr) { if (itr->second == groupid) return true; @@ -677,7 +669,7 @@ void SpellMgr::GetSetOfSpellsInSpellGroup(SpellGroup group_id, std::set& usedGroups.insert(group_id); SpellGroupSpellMapBounds groupSpell = GetSpellGroupSpellMapBounds(group_id); - for (SpellGroupSpellMap::const_iterator itr = groupSpell.first; itr != groupSpell.second ; ++itr) + for (SpellGroupSpellMap::const_iterator itr = groupSpell.first; itr != groupSpell.second; ++itr) { if (itr->second < 0) { @@ -696,7 +688,7 @@ bool SpellMgr::AddSameEffectStackRuleSpellGroups(SpellInfo const* spellInfo, int uint32 spellId = spellInfo->GetFirstRankSpell()->Id; SpellSpellGroupMapBounds spellGroup = GetSpellSpellGroupMapBounds(spellId); // Find group with SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT if it belongs to one - for (SpellSpellGroupMap::const_iterator itr = spellGroup.first; itr != spellGroup.second ; ++itr) + for (SpellSpellGroupMap::const_iterator itr = spellGroup.first; itr != spellGroup.second; ++itr) { SpellGroup group = itr->second; SpellGroupStackMap::const_iterator found = mSpellGroupStack.find(group); @@ -732,13 +724,13 @@ SpellGroupStackRule SpellMgr::CheckSpellGroupStackRules(SpellInfo const* spellIn // find SpellGroups which are common for both spells SpellSpellGroupMapBounds spellGroup1 = GetSpellSpellGroupMapBounds(spellid_1); std::set groups; - for (SpellSpellGroupMap::const_iterator itr = spellGroup1.first; itr != spellGroup1.second ; ++itr) + for (SpellSpellGroupMap::const_iterator itr = spellGroup1.first; itr != spellGroup1.second; ++itr) { if (IsSpellMemberOfSpellGroup(spellid_2, itr->second)) { bool add = true; SpellGroupSpellMapBounds groupSpell = GetSpellGroupSpellMapBounds(itr->second); - for (SpellGroupSpellMap::const_iterator itr2 = groupSpell.first; itr2 != groupSpell.second ; ++itr2) + for (SpellGroupSpellMap::const_iterator itr2 = groupSpell.first; itr2 != groupSpell.second; ++itr2) { if (itr2->second < 0) { @@ -757,7 +749,7 @@ SpellGroupStackRule SpellMgr::CheckSpellGroupStackRules(SpellInfo const* spellIn SpellGroupStackRule rule = SPELL_GROUP_STACK_RULE_DEFAULT; - for (std::set::iterator itr = groups.begin() ; itr!= groups.end() ; ++itr) + for (std::set::iterator itr = groups.begin(); itr!= groups.end(); ++itr) { SpellGroupStackMap::const_iterator found = mSpellGroupStack.find(*itr); if (found != mSpellGroupStack.end()) @@ -1148,11 +1140,6 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 return true; } -void SpellMgr::LoadSpellInfos() -{ - -} - void SpellMgr::LoadSpellRanks() { uint32 oldMSTime = getMSTime(); @@ -1163,18 +1150,17 @@ void SpellMgr::LoadSpellRanks() mSpellInfoMap[itr->first]->ChainEntry = NULL; } mSpellChains.clear(); - + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT first_spell_id, spell_id, rank from spell_ranks ORDER BY first_spell_id, rank"); if (!result) { - sLog->outString(">> Loaded 0 spell rank records"); + sLog->outString(">> Loaded 0 spell rank records. DB table `spell_ranks` is empty."); sLog->outString(); - sLog->outErrorDb("`spell_ranks` table is empty!"); return; } - uint32 rows = 0; + uint32 count = 0; bool finished = false; do @@ -1193,7 +1179,7 @@ void SpellMgr::LoadSpellRanks() if (lastSpell == -1) lastSpell = currentSpell; uint32 spell_id = fields[1].GetUInt32(); - uint32 rank = fields[2].GetUInt32(); + uint32 rank = fields[2].GetUInt8(); // don't drop the row if we're moving to the next rank if (currentSpell == lastSpell) @@ -1221,7 +1207,7 @@ void SpellMgr::LoadSpellRanks() int32 curRank = 0; bool valid = true; // check spells in chain - for (std::list >::iterator itr = rankChain.begin() ; itr!= rankChain.end(); ++itr) + for (std::list >::iterator itr = rankChain.begin(); itr!= rankChain.end(); ++itr) { SpellInfo const* spell = GetSpellInfo(itr->first); if (!spell) @@ -1245,7 +1231,7 @@ void SpellMgr::LoadSpellRanks() std::list >::iterator itr = rankChain.begin(); do { - ++rows; + ++count; int32 addedSpell = itr->first; mSpellChains[addedSpell].first = GetSpellInfo(lastSpell); mSpellChains[addedSpell].last = GetSpellInfo(rankChain.back().first); @@ -1265,7 +1251,7 @@ void SpellMgr::LoadSpellRanks() while (true); } while (!finished); - sLog->outString(">> Loaded %u spell rank records in %u ms", rows, GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(">> Loaded %u spell rank records in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); } @@ -1276,23 +1262,24 @@ void SpellMgr::LoadSpellRequired() mSpellsReqSpell.clear(); // need for reload case mSpellReq.clear(); // need for reload case + // 0 1 QueryResult result = WorldDatabase.Query("SELECT spell_id, req_spell from spell_required"); if (!result) { - sLog->outString(">> Loaded 0 spell required records"); + sLog->outString(">> Loaded 0 spell required records. DB table `spell_required` is empty."); sLog->outString(); - sLog->outErrorDb("`spell_required` table is empty!"); return; } - uint32 rows = 0; + uint32 count = 0; do { Field* fields = result->Fetch(); - uint32 spell_id = fields[0].GetUInt32(); + uint32 spell_id = fields[0].GetUInt32(); uint32 spell_req = fields[1].GetUInt32(); + // check if chain is made with valid first spell SpellInfo const* spell = GetSpellInfo(spell_id); if (!spell) @@ -1300,17 +1287,20 @@ void SpellMgr::LoadSpellRequired() sLog->outErrorDb("spell_id %u in `spell_required` table is not found in dbcs, skipped", spell_id); continue; } + SpellInfo const* req_spell = GetSpellInfo(spell_req); if (!req_spell) { sLog->outErrorDb("req_spell %u in `spell_required` table is not found in dbcs, skipped", spell_req); continue; } + if (GetFirstSpellInChain(spell_id) == GetFirstSpellInChain(spell_req)) { sLog->outErrorDb("req_spell %u and spell_id %u in `spell_required` table are ranks of the same spell, entry not needed, skipped", spell_req, spell_id); continue; } + if (IsSpellRequiringSpell(spell_id, spell_req)) { sLog->outErrorDb("duplicated entry of req_spell %u and spell_id %u in `spell_required`, skipped", spell_req, spell_id); @@ -1319,10 +1309,10 @@ void SpellMgr::LoadSpellRequired() mSpellReq.insert (std::pair(spell_id, spell_req)); mSpellsReqSpell.insert (std::pair(spell_req, spell_id)); - ++rows; + ++count; } while (result->NextRow()); - sLog->outString(">> Loaded %u spell required records in %u ms", rows, GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(">> Loaded %u spell required records in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); } @@ -1374,24 +1364,22 @@ void SpellMgr::LoadSpellLearnSpells() QueryResult result = WorldDatabase.Query("SELECT entry, SpellID, Active FROM spell_learn_spell"); if (!result) { - sLog->outString(">> Loaded 0 spell learn spells"); + sLog->outString(">> Loaded 0 spell learn spells. DB table `spell_learn_spell` is empty."); sLog->outString(); - sLog->outErrorDb("`spell_learn_spell` table is empty!"); return; } uint32 count = 0; - do { Field* fields = result->Fetch(); - uint32 spell_id = fields[0].GetUInt32(); + uint32 spell_id = fields[0].GetUInt16(); SpellLearnSpellNode node; - node.spell = fields[1].GetUInt32(); - node.active = fields[2].GetBool(); - node.autoLearned= false; + node.spell = fields[1].GetUInt16(); + node.active = fields[2].GetBool(); + node.autoLearned = false; if (!GetSpellInfo(spell_id)) { @@ -1475,7 +1463,7 @@ void SpellMgr::LoadSpellTargetPositions() mSpellTargetPositions.clear(); // need for reload case - // 0 1 2 3 4 5 + // 0 1 2 3 4 5 QueryResult result = WorldDatabase.Query("SELECT id, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM spell_target_position"); if (!result) { @@ -1485,7 +1473,6 @@ void SpellMgr::LoadSpellTargetPositions() } uint32 count = 0; - do { Field* fields = result->Fetch(); @@ -1494,7 +1481,7 @@ void SpellMgr::LoadSpellTargetPositions() SpellTargetPosition st; - st.target_mapId = fields[1].GetUInt32(); + st.target_mapId = fields[1].GetUInt16(); st.target_X = fields[2].GetFloat(); st.target_Y = fields[3].GetFloat(); st.target_Z = fields[4].GetFloat(); @@ -1597,19 +1584,17 @@ void SpellMgr::LoadSpellGroups() mSpellSpellGroup.clear(); // need for reload case mSpellGroupSpell.clear(); - uint32 count = 0; - - // 0 1 + // 0 1 QueryResult result = WorldDatabase.Query("SELECT id, spell_id FROM spell_group"); if (!result) { + sLog->outString(">> Loaded 0 spell group definitions. DB table `spell_group` is empty."); sLog->outString(); - sLog->outString(">> Loaded %u spell group definitions", count); return; } std::set groups; - + uint32 count = 0; do { Field* fields = result->Fetch(); @@ -1617,7 +1602,7 @@ void SpellMgr::LoadSpellGroups() uint32 group_id = fields[0].GetUInt32(); if (group_id <= SPELL_GROUP_DB_RANGE_MIN && group_id >= SPELL_GROUP_CORE_RANGE_MAX) { - sLog->outErrorDb("SpellGroup id %u listed in `spell_groups` is in core range, but is not defined in core!", group_id); + sLog->outErrorDb("SpellGroup id %u listed in `spell_group` is in core range, but is not defined in core!", group_id); continue; } int32 spell_id = fields[1].GetInt32(); @@ -1627,13 +1612,13 @@ void SpellMgr::LoadSpellGroups() } while (result->NextRow()); - for (SpellGroupSpellMap::iterator itr = mSpellGroupSpell.begin(); itr!= mSpellGroupSpell.end() ;) + for (SpellGroupSpellMap::iterator itr = mSpellGroupSpell.begin(); itr!= mSpellGroupSpell.end();) { if (itr->second < 0) { if (groups.find(abs(itr->second)) == groups.end()) { - sLog->outErrorDb("SpellGroup id %u listed in `spell_groups` does not exist", abs(itr->second)); + sLog->outErrorDb("SpellGroup id %u listed in `spell_group` does not exist", abs(itr->second)); mSpellGroupSpell.erase(itr++); } else @@ -1658,12 +1643,12 @@ void SpellMgr::LoadSpellGroups() } } - for (std::set::iterator groupItr = groups.begin() ; groupItr != groups.end() ; ++groupItr) + for (std::set::iterator groupItr = groups.begin(); groupItr != groups.end(); ++groupItr) { std::set spells; GetSetOfSpellsInSpellGroup(SpellGroup(*groupItr), spells); - for (std::set::iterator spellItr = spells.begin() ; spellItr != spells.end() ; ++spellItr) + for (std::set::iterator spellItr = spells.begin(); spellItr != spells.end(); ++spellItr) { ++count; mSpellSpellGroup.insert(SpellSpellGroupMap::value_type(*spellItr, SpellGroup(*groupItr))); @@ -1680,23 +1665,22 @@ void SpellMgr::LoadSpellGroupStackRules() mSpellGroupStack.clear(); // need for reload case - uint32 count = 0; - // 0 1 QueryResult result = WorldDatabase.Query("SELECT group_id, stack_rule FROM spell_group_stack_rules"); if (!result) { - sLog->outString(">> Loaded 0 spell group stack rules"); + sLog->outString(">> Loaded 0 spell group stack rules. DB table `spell_group_stack_rules` is empty."); sLog->outString(); return; } + uint32 count = 0; do { Field* fields = result->Fetch(); uint32 group_id = fields[0].GetUInt32(); - uint8 stack_rule = fields[1].GetUInt32(); + uint8 stack_rule = fields[1].GetInt8(); if (stack_rule >= SPELL_GROUP_STACK_RULE_MAX) { sLog->outErrorDb("SpellGroupStackRule %u listed in `spell_group_stack_rules` does not exist", stack_rule); @@ -1726,17 +1710,16 @@ void SpellMgr::LoadSpellProcEvents() mSpellProcEventMap.clear(); // need for reload case - uint32 count = 0; - // 0 1 2 3 4 5 6 7 8 9 10 QueryResult result = WorldDatabase.Query("SELECT entry, SchoolMask, SpellFamilyName, SpellFamilyMask0, SpellFamilyMask1, SpellFamilyMask2, procFlags, procEx, ppmRate, CustomChance, Cooldown FROM spell_proc_event"); if (!result) { - sLog->outString(">> Loaded %u spell proc event conditions", count); + sLog->outString(">> Loaded 0 spell proc event conditions. DB table `spell_proc_event` is empty."); sLog->outString(); return; } + uint32 count = 0; uint32 customProc = 0; do { @@ -1753,8 +1736,8 @@ void SpellMgr::LoadSpellProcEvents() SpellProcEventEntry spe; - spe.schoolMask = fields[1].GetUInt32(); - spe.spellFamilyName = fields[2].GetUInt32(); + spe.schoolMask = fields[1].GetInt8(); + spe.spellFamilyName = fields[2].GetUInt16(); spe.spellFamilyMask[0] = fields[3].GetUInt32(); spe.spellFamilyMask[1] = fields[4].GetUInt32(); spe.spellFamilyMask[2] = fields[5].GetUInt32(); @@ -1791,17 +1774,16 @@ void SpellMgr::LoadSpellProcs() mSpellProcMap.clear(); // need for reload case - uint32 count = 0; - - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 QueryResult result = WorldDatabase.Query("SELECT spellId, schoolMask, spellFamilyName, spellFamilyMask0, spellFamilyMask1, spellFamilyMask2, typeMask, spellTypeMask, spellPhaseMask, hitMask, attributesMask, ratePerMinute, chance, cooldown, charges FROM spell_proc"); if (!result) { - sLog->outString(">> Loaded %u spell proc conditions and data", count); + sLog->outString(">> Loaded 0 spell proc conditions and data. DB table `spell_proc` is empty."); sLog->outString(); return; } + uint32 count = 0; do { Field* fields = result->Fetch(); @@ -1833,8 +1815,8 @@ void SpellMgr::LoadSpellProcs() SpellProcEntry baseProcEntry; - baseProcEntry.schoolMask = fields[1].GetUInt32(); - baseProcEntry.spellFamilyName = fields[2].GetUInt32(); + baseProcEntry.schoolMask = fields[1].GetInt8(); + baseProcEntry.spellFamilyName = fields[2].GetUInt16(); baseProcEntry.spellFamilyMask[0] = fields[3].GetUInt32(); baseProcEntry.spellFamilyMask[1] = fields[4].GetUInt32(); baseProcEntry.spellFamilyMask[2] = fields[5].GetUInt32(); @@ -1932,16 +1914,17 @@ void SpellMgr::LoadSpellBonusess() uint32 oldMSTime = getMSTime(); mSpellBonusMap.clear(); // need for reload case - uint32 count = 0; + // 0 1 2 3 4 QueryResult result = WorldDatabase.Query("SELECT entry, direct_bonus, dot_bonus, ap_bonus, ap_dot_bonus FROM spell_bonus_data"); if (!result) { - sLog->outString(">> Loaded %u spell bonus data", count); + sLog->outString(">> Loaded 0 spell bonus data. DB table `spell_bonus_data` is empty."); sLog->outString(); return; } + uint32 count = 0; do { Field* fields = result->Fetch(); @@ -1973,17 +1956,16 @@ void SpellMgr::LoadSpellThreats() mSpellThreatMap.clear(); // need for reload case - uint32 count = 0; - // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT entry, flatMod, pctMod, apPctMod FROM spell_threat"); if (!result) { - sLog->outString(">> Loaded 0 aggro generating spells"); + sLog->outString(">> Loaded 0 aggro generating spells. DB table `spell_threat` is empty."); sLog->outString(); return; } + uint32 count = 0; do { Field* fields = result->Fetch(); @@ -1997,7 +1979,7 @@ void SpellMgr::LoadSpellThreats() } SpellThreatEntry ste; - ste.flatMod = fields[1].GetInt16(); + ste.flatMod = fields[1].GetInt32(); ste.pctMod = fields[2].GetFloat(); ste.apPctMod = fields[3].GetFloat(); @@ -2047,7 +2029,6 @@ void SpellMgr::LoadSpellPetAuras() } uint32 count = 0; - do { Field* fields = result->Fetch(); @@ -2102,11 +2083,10 @@ void SpellMgr::LoadEnchantCustomAttr() uint32 size = sSpellItemEnchantmentStore.GetNumRows(); mEnchantCustomAttr.resize(size); - uint32 count = 0; - for (uint32 i = 0; i < size; ++i) mEnchantCustomAttr[i] = 0; + uint32 count = 0; for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo const* spellInfo = GetSpellInfo(i); @@ -2114,7 +2094,7 @@ void SpellMgr::LoadEnchantCustomAttr() continue; // TODO: find a better check - if (!(spellInfo->AttributesEx2 & SPELL_ATTR2_UNK13) || !(spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT)) + if (!(spellInfo->AttributesEx2 & SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA) || !(spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT)) continue; for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) @@ -2142,17 +2122,16 @@ void SpellMgr::LoadSpellEnchantProcData() mSpellEnchantProcEventMap.clear(); // need for reload case - uint32 count = 0; - // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT entry, customChance, PPMChance, procEx FROM spell_enchant_proc_data"); if (!result) { - sLog->outString(">> Loaded %u spell enchant proc event conditions", count); + sLog->outString(">> Loaded 0 spell enchant proc event conditions. DB table `spell_enchant_proc_data` is empty."); sLog->outString(); return; } + uint32 count = 0; do { Field* fields = result->Fetch(); @@ -2197,14 +2176,13 @@ void SpellMgr::LoadSpellLinked() } uint32 count = 0; - do { Field* fields = result->Fetch(); int32 trigger = fields[0].GetInt32(); - int32 effect = fields[1].GetInt32(); - int32 type = fields[2].GetInt32(); + int32 effect = fields[1].GetInt32(); + int32 type = fields[2].GetUInt8(); SpellInfo const* spellInfo = GetSpellInfo(abs(trigger)); if (!spellInfo) @@ -2442,7 +2420,6 @@ void SpellMgr::LoadSpellAreas() } uint32 count = 0; - do { Field* fields = result->Fetch(); @@ -3261,6 +3238,10 @@ void SpellMgr::LoadDbcDataCorrections() spellInfo->EffectDieSides[0] = 0; // was 1, that should probably mean seat 0, but instead it's treated as spell 1 spellInfo->EffectBasePoints[0] = 52391; // Ride Vehicle (forces seat 0) break; + case 64745: // Item - Death Knight T8 Tank 4P Bonus + case 64936: // Item - Warrior T8 Protection 4P Bonus + spellInfo->EffectBasePoints[0] = 100; // 100% chance of procc'ing, not -10% (chance calculated in PrepareTriggersExecutedOnHit) + break; case 19970: // Entangling Roots (Rank 6) -- Nature's Grasp Proc case 19971: // Entangling Roots (Rank 5) -- Nature's Grasp Proc case 19972: // Entangling Roots (Rank 4) -- Nature's Grasp Proc @@ -3317,6 +3298,19 @@ void SpellMgr::LoadDbcDataCorrections() spellInfo->EffectImplicitTargetB[1] = TARGET_UNIT_NEARBY_ENTRY; spellInfo->EffectImplicitTargetB[2] = TARGET_UNIT_NEARBY_ENTRY; break; + case 62301: // Cosmic Smash (Algalon the Observer) + spellInfo->MaxAffectedTargets = 1; + break; + case 64598: // Cosmic Smash (Algalon the Observer) + spellInfo->MaxAffectedTargets = 3; + break; + case 62293: // Cosmic Smash (Algalon the Observer) + spellInfo->EffectImplicitTargetB[0] = TARGET_DEST_CASTER; + break; + case 62311: // Cosmic Smash (Algalon the Observer) + case 64596: // Cosmic Smash (Algalon the Observer) + spellInfo->rangeIndex = 6; // 100yd + break; // ENDOF ULDUAR SPELLS // // TRIAL OF THE CRUSADER SPELLS @@ -3352,13 +3346,22 @@ void SpellMgr::LoadDbcDataCorrections() case 70835: // Bone Storm (Lord Marrowgar) case 70836: // Bone Storm (Lord Marrowgar) case 72864: // Death Plague (Rotting Frost Giant) - case 72378: // Blood Nova (Deathbringer Saurfang) - case 73058: // Blood Nova (Deathbringer Saurfang) case 71160: // Plague Stench (Stinky) case 71161: // Plague Stench (Stinky) case 71123: // Decimate (Stinky & Precious) spellInfo->EffectRadiusIndex[0] = EFFECT_RADIUS_100_YARDS; // 100yd break; + case 72378: // Blood Nova (Deathbringer Saurfang) + case 73058: // Blood Nova (Deathbringer Saurfang) + spellInfo->EffectRadiusIndex[0] = EFFECT_RADIUS_200_YARDS; + spellInfo->EffectRadiusIndex[1] = EFFECT_RADIUS_200_YARDS; + break; + case 72769: // Scent of Blood (Deathbringer Saurfang) + spellInfo->EffectRadiusIndex[0] = EFFECT_RADIUS_200_YARDS; + // no break + case 72771: // Scent of Blood (Deathbringer Saurfang) + spellInfo->EffectRadiusIndex[1] = EFFECT_RADIUS_200_YARDS; + break; case 72723: // Resistant Skin (Deathbringer Saurfang adds) // this spell initially granted Shadow damage immunity, however it was removed but the data was left in client spellInfo->Effect[2] = 0; @@ -3366,9 +3369,9 @@ void SpellMgr::LoadDbcDataCorrections() case 70460: // Coldflame Jets (Traps after Saurfang) spellInfo->DurationIndex = 1; // 10 seconds break; - case 71413: // Green Ooze Summon (Professor Putricide) - case 71414: // Orange Ooze Summon (Professor Putricide) - spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DEST; + case 71412: // Green Ooze Summon (Professor Putricide) + case 71415: // Orange Ooze Summon (Professor Putricide) + spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ANY; break; case 71159: // Awaken Plagued Zombies spellInfo->DurationIndex = 21; @@ -3429,10 +3432,7 @@ void SpellMgr::LoadDbcDataCorrections() spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_CASTER; break; case 69846: // Frost Bomb - spellInfo->speed = 10; - spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_TARGET_ANY; - spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ANY; - spellInfo->Effect[1] = 0; + spellInfo->speed = 0.0f; // This spell's summon happens instantly break; case 71614: // Ice Lock spellInfo->Mechanic = MECHANIC_STUN; @@ -3528,6 +3528,11 @@ void SpellMgr::LoadDbcDataCorrections() case 40166: // Introspection case 40167: // Introspection spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; + break; + case 2378: // Minor Fortitude + spellInfo->manaCost = 0; + spellInfo->manaPerSecond = 0; + break; default: break; } diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 9fffd474651..dcf3c38fe4f 100755 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -605,7 +605,7 @@ class SpellMgr // Accessors (const or static functions) public: - // Spell correctess for client using + // Spell correctness for client using static bool IsSpellValid(SpellInfo const* spellInfo, Player* player = NULL, bool msg = true); // Spell difficulty @@ -693,7 +693,6 @@ class SpellMgr public: // Loading data at server startup - void LoadSpellInfos(); void LoadSpellRanks(); void LoadSpellRequired(); void LoadSpellLearnSkills(); diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index 03fea614c0d..e6ce80c20f0 100755 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -320,29 +320,34 @@ SpellInfo const* SpellScript::GetSpellInfo() return m_spell->GetSpellInfo(); } -WorldLocation const* SpellScript::GetTargetDest() +WorldLocation const* SpellScript::GetExplTargetDest() { if (m_spell->m_targets.HasDst()) - return m_spell->m_targets.GetDst(); + return m_spell->m_targets.GetDstPos(); return NULL; } -void SpellScript::SetTargetDest(WorldLocation& loc) +void SpellScript::SetExplTargetDest(WorldLocation& loc) { m_spell->m_targets.SetDst(loc); } -Unit* SpellScript::GetTargetUnit() +WorldObject* SpellScript::GetExplTargetWorldObject() +{ + return m_spell->m_targets.GetObjectTarget(); +} + +Unit* SpellScript::GetExplTargetUnit() { return m_spell->m_targets.GetUnitTarget(); } -GameObject* SpellScript::GetTargetGObj() +GameObject* SpellScript::GetExplTargetGObj() { return m_spell->m_targets.GetGOTarget(); } -Item* SpellScript::GetTargetItem() +Item* SpellScript::GetExplTargetItem() { return m_spell->m_targets.GetItemTarget(); } @@ -403,6 +408,16 @@ GameObject* SpellScript::GetHitGObj() return m_spell->gameObjTarget; } +WorldLocation* SpellScript::GetHitDest() +{ + if (!IsInEffectHook()) + { + sLog->outError("TSCR: Script: `%s` Spell: `%u`: function SpellScript::GetHitGObj was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId); + return NULL; + } + return m_spell->destTarget; +} + int32 SpellScript::GetHitDamage() { if (!IsInTargetHook()) @@ -468,11 +483,6 @@ void SpellScript::PreventHitAura() m_spell->m_spellAura->Remove(); } -void SpellScript::GetSummonPosition(uint32 i, Position &pos, float radius = 0.0f, uint32 count = 0) -{ - m_spell->GetSummonPosition(i, pos, radius, count); -} - void SpellScript::PreventHitEffect(SpellEffIndex effIndex) { if (!IsInHitPhase() && !IsInEffectHook()) @@ -768,6 +778,7 @@ bool AuraScript::_IsDefaultActionPrevented() case AURA_SCRIPT_HOOK_EFFECT_APPLY: case AURA_SCRIPT_HOOK_EFFECT_REMOVE: case AURA_SCRIPT_HOOK_EFFECT_PERIODIC: + case AURA_SCRIPT_HOOK_EFFECT_ABSORB: return m_defaultActionPrevented; default: ASSERT(false && "AuraScript::_IsDefaultActionPrevented is called in a wrong place"); @@ -782,6 +793,7 @@ void AuraScript::PreventDefaultAction() case AURA_SCRIPT_HOOK_EFFECT_APPLY: case AURA_SCRIPT_HOOK_EFFECT_REMOVE: case AURA_SCRIPT_HOOK_EFFECT_PERIODIC: + case AURA_SCRIPT_HOOK_EFFECT_ABSORB: m_defaultActionPrevented = true; break; default: diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 1bf8d25adef..7b194b7827f 100755 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -295,25 +295,35 @@ class SpellScript : public _SpellScript SpellInfo const* GetSpellInfo(); SpellValue const* GetSpellValue(); - // methods useable after spell targets are set - // accessors to the "focus" targets of the spell - // note: do not confuse these with spell hit targets + // methods useable after spell is prepared + // accessors to the explicit targets of the spell + // explicit target - target selected by caster (player, game client, or script - DoCast(explicitTarget, ...), required for spell to be cast + // examples: + // -shadowstep - explicit target is the unit you want to go behind of + // -chain heal - explicit target is the unit to be healed first + // -holy nova/arcane explosion - explicit target = NULL because target you are selecting doesn't affect how spell targets are selected + // you can determine if spell requires explicit targets by dbc columns: + // - Targets - mask of explicit target types + // - ImplicitTargetXX set to TARGET_XXX_TARGET_YYY, _TARGET_ here means that explicit target is used by the effect, so spell needs one too + // returns: WorldLocation which was selected as a spell destination or NULL - WorldLocation const* GetTargetDest(); + WorldLocation const* GetExplTargetDest(); - void SetTargetDest(WorldLocation& loc); + void SetExplTargetDest(WorldLocation& loc); - // returns: Unit which was selected as a spell target or NULL - Unit* GetTargetUnit(); + // returns: WorldObject which was selected as an explicit spell target or NULL if there's no target + WorldObject* GetExplTargetWorldObject(); - // returns: GameObject which was selected as a spell target or NULL - GameObject* GetTargetGObj(); + // returns: Unit which was selected as an explicit spell target or NULL if there's no target + Unit* GetExplTargetUnit(); - // returns: Item which was selected as a spell target or NULL - Item* GetTargetItem(); + // returns: GameObject which was selected as an explicit spell target or NULL if there's no target + GameObject* GetExplTargetGObj(); - // methods useable only during spell hit on target, or during spell launch on target: + // returns: Item which was selected as an explicit spell target or NULL if there's no target + Item* GetExplTargetItem(); + // methods useable only during spell hit on target, or during spell launch on target: // returns: target of current effect if it was Unit otherwise NULL Unit* GetHitUnit(); // returns: target of current effect if it was Creature otherwise NULL @@ -324,6 +334,8 @@ class SpellScript : public _SpellScript Item* GetHitItem(); // returns: target of current effect if it was GameObject otherwise NULL GameObject* GetHitGObj(); + // returns: destination of current effect + WorldLocation* GetHitDest(); // setter/getter for for damage done by spell to target of spell hit // returns damage calculated before hit, and real dmg done after hit int32 GetHitDamage(); @@ -335,7 +347,6 @@ class SpellScript : public _SpellScript void SetHitHeal(int32 heal); void PreventHitHeal() { SetHitHeal(0); } Spell* GetSpell() { return m_spell; } - void GetSummonPosition(uint32 i, Position &pos, float radius, uint32 count); // returns current spell hit target aura Aura* GetHitAura(); // prevents applying aura on current spell hit target diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index e5a12693aa7..2f79eaff06a 100755 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -17,8 +17,53 @@ #include "Common.h" #include "DatabaseEnv.h" -#include "CreatureTextMgr.h" #include "ObjectMgr.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "CreatureTextMgr.h" + +class CreatureTextBuilder +{ + public: + CreatureTextBuilder(WorldObject* obj, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, uint64 targetGUID) + : _source(obj), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _targetGUID(targetGUID) + { + } + + size_t operator()(WorldPacket* data, LocaleConstant locale) const + { + std::string text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _textGroup, _textId, locale); + char const* localizedName = _source->GetNameForLocaleIdx(locale); + + *data << uint8(_msgType); + *data << uint32(_language); + *data << uint64(_source->GetGUID()); + *data << uint32(1); // 2.1.0 + *data << uint32(strlen(localizedName)+1); + *data << localizedName; + size_t whisperGUIDpos = data->wpos(); + *data << uint64(_targetGUID); // Unit Target + if (_targetGUID && !IS_PLAYER_GUID(_targetGUID)) + { + *data << uint32(1); // target name length + *data << uint8(0); // target name + } + *data << uint32(text.length() + 1); + *data << text; + *data << uint8(0); // ChatTag + + return whisperGUIDpos; + } + + WorldObject* _source; + ChatMsg _msgType; + uint8 _textGroup; + uint32 _textId; + uint32 _language; + uint64 _targetGUID; +}; void CreatureTextMgr::LoadCreatureTexts() { @@ -83,17 +128,8 @@ void CreatureTextMgr::LoadCreatureTexts() } //entry not yet added, add empty TextHolder (list of groups) if (mTextMap.find(temp.entry) == mTextMap.end()) - { ++creatureCount; - CreatureTextHolder TextHolder; - mTextMap[temp.entry] = TextHolder; - } - //group not yet added, add empty TextGroup (list of texts) - if (mTextMap[temp.entry].find(temp.group) == mTextMap[temp.entry].end()) - { - CreatureTextGroup TextGroup; - mTextMap[temp.entry][temp.group] = TextGroup; - } + //add the text into our entry's group mTextMap[temp.entry][temp.group].push_back(temp); @@ -104,42 +140,76 @@ void CreatureTextMgr::LoadCreatureTexts() sLog->outString(); } +void CreatureTextMgr::LoadCreatureTextLocales() +{ + uint32 oldMSTime = getMSTime(); + + mLocaleTextMap.clear(); // for reload case + + QueryResult result = WorldDatabase.Query("SELECT entry, textGroup, id, text_loc1, text_loc2, text_loc3, text_loc4, text_loc5, text_loc6, text_loc7, text_loc8 FROM locales_creature_text"); + + if (!result) + return; + + uint32 textCount = 0; + + do + { + Field* fields = result->Fetch(); + CreatureTextLocale& loc = mLocaleTextMap[CreatureTextId(fields[0].GetUInt32(), uint32(fields[1].GetUInt8()), fields[2].GetUInt32())]; + for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + { + LocaleConstant locale = LocaleConstant(i); + ObjectMgr::AddLocaleString(fields[3 + i - 1].GetString(), locale, loc.Text); + } + + ++textCount; + } while (result->NextRow()); + + sLog->outString(">> Loaded %u creature localized texts in %u ms", textCount, GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(); +} + uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, uint64 whisperGuid /*= 0*/, ChatMsg msgType /*= CHAT_MSG_ADDON*/, Language language /*= LANG_ADDON*/, TextRange range /*= TEXT_RANGE_NORMAL*/, uint32 sound /*= 0*/, Team team /*= TEAM_OTHER*/, bool gmOnly /*= false*/, Player* srcPlr /*= NULL*/) { if (!source) return 0; + CreatureTextMap::const_iterator sList = mTextMap.find(source->GetEntry()); if (sList == mTextMap.end()) { sLog->outErrorDb("CreatureTextMgr: Could not find Text for Creature(%s) Entry %u in 'creature_text' table. Ignoring.", source->GetName(), source->GetEntry()); return 0; } - CreatureTextHolder TextHolder = (*sList).second; - CreatureTextHolder::const_iterator itr = TextHolder.find(textGroup); - if (itr == TextHolder.end()) + + CreatureTextHolder const& textHolder = sList->second; + CreatureTextHolder::const_iterator itr = textHolder.find(textGroup); + if (itr == textHolder.end()) { sLog->outErrorDb("CreatureTextMgr: Could not find TextGroup %u for Creature(%s) GuidLow %u Entry %u. Ignoring.", uint32(textGroup), source->GetName(), source->GetGUIDLow(), source->GetEntry()); return 0; } - CreatureTextGroup TextGroup = (*itr).second;//has all texts in the group + + CreatureTextGroup const& textGroupContainer = itr->second; //has all texts in the group CreatureTextRepeatIds repeatGroup = GetRepeatGroup(source, textGroup);//has all textIDs from the group that were already said CreatureTextGroup tempGroup;//will use this to talk after sorting repeatGroup - for (CreatureTextGroup::const_iterator giter = TextGroup.begin(); giter != TextGroup.end(); ++giter) - { - if (std::find(repeatGroup.begin(), repeatGroup.end(), (*giter).id) == repeatGroup.end()) - tempGroup.push_back((*giter)); - } + for (CreatureTextGroup::const_iterator giter = textGroupContainer.begin(); giter != textGroupContainer.end(); ++giter) + if (std::find(repeatGroup.begin(), repeatGroup.end(), giter->id) == repeatGroup.end()) + tempGroup.push_back(*giter); + if (tempGroup.empty()) { CreatureTextRepeatMap::iterator mapItr = mTextRepeatMap.find(source->GetGUID()); if (mapItr != mTextRepeatMap.end()) { - CreatureTextRepeatGroup::iterator groupItr = (*mapItr).second.find(textGroup); - (*groupItr).second.clear(); + CreatureTextRepeatGroup::iterator groupItr = mapItr->second.find(textGroup); + groupItr->second.clear(); } - tempGroup = TextGroup; + + tempGroup = textGroupContainer; } + uint8 count = 0; float lastChance = -1; bool isEqualChanced = true; @@ -148,173 +218,92 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, uint64 whisp for (CreatureTextGroup::const_iterator iter = tempGroup.begin(); iter != tempGroup.end(); ++iter) { - if (lastChance >= 0 && lastChance != (*iter).probability) + if (lastChance >= 0 && lastChance != iter->probability) isEqualChanced = false; - lastChance = (*iter).probability; - totalChance += (*iter).probability; - count++; + lastChance = iter->probability; + totalChance += iter->probability; + ++count; } + int32 offset = -1; if (!isEqualChanced) { for (CreatureTextGroup::const_iterator iter = tempGroup.begin(); iter != tempGroup.end(); ++iter) { - uint32 chance = uint32((*iter).probability); + uint32 chance = uint32(iter->probability); uint32 r = urand(0, 100); - offset++; + ++offset; if (r <= chance) break; } } + uint32 pos = 0; if (isEqualChanced || offset < 0) pos = urand(0, count - 1); else if (offset >= 0) pos = offset; + CreatureTextGroup::const_iterator iter = tempGroup.begin() + pos; - ChatMsg finalType = (msgType == CHAT_MSG_ADDON) ? (*iter).type : msgType; - Language finalLang = (language == LANG_ADDON) ? (*iter).lang : language; - uint32 finalSound = sound ? sound : (*iter).sound; + ChatMsg finalType = (msgType == CHAT_MSG_ADDON) ? iter->type : msgType; + Language finalLang = (language == LANG_ADDON) ? iter->lang : language; + uint32 finalSound = sound ? sound : iter->sound; if (finalSound) SendSound(source, finalSound, finalType, whisperGuid, range, team, gmOnly); - if ((*iter).emote) - SendEmote(srcPlr ? srcPlr->ToUnit() : source, (*iter).emote); - - SendChatString(srcPlr ? srcPlr->ToUnit() : source, (*iter).text.c_str(), finalType, finalLang, whisperGuid, range, team, gmOnly); - if (isEqualChanced || (!isEqualChanced && totalChance == 100.0f)) - SetRepeatId(source, textGroup, (*iter).id); - - return (*iter).duration; -} - -void CreatureTextMgr::SendSound(Creature* source, uint32 sound, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) -{ - if (!sound || !source) - return; - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << uint32(sound); - SendChatPacket(&data, source, msgType, whisperGuid, range, team, gmOnly); -} - -void CreatureTextMgr::SendEmote(Unit* source, uint32 emote) -{ - if (!source) return; - source->HandleEmoteCommand(emote); -} - -void CreatureTextMgr::SetRepeatId(Creature* source, uint8 textGroup, uint8 id) -{ - if (!source) - return; - - if (mTextRepeatMap.find(source->GetGUID()) == mTextRepeatMap.end()) - { - CreatureTextRepeatGroup TextGroup; - mTextRepeatMap[source->GetGUID()] = TextGroup; - } - if (mTextRepeatMap[source->GetGUID()].find(textGroup) == mTextRepeatMap[source->GetGUID()].end()) - { - CreatureTextRepeatIds ids; - mTextRepeatMap[source->GetGUID()][textGroup] = ids; - } - if (std::find(mTextRepeatMap[source->GetGUID()][textGroup].begin(), mTextRepeatMap[source->GetGUID()][textGroup].end(), id) == mTextRepeatMap[source->GetGUID()][textGroup].end()) - { - mTextRepeatMap[source->GetGUID()][textGroup].push_back(id); - } - else - sLog->outErrorDb("CreatureTextMgr: TextGroup %u for Creature(%s) GuidLow %u Entry %u, id %u already added", uint32(textGroup), source->GetName(), source->GetGUIDLow(), source->GetEntry(), uint32(id)); -} - -CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 textGroup) -{ - ASSERT(source);//should never happen - CreatureTextRepeatIds ids; + Unit* finalSource = source; + if (srcPlr) + finalSource = srcPlr; - CreatureTextRepeatMap::const_iterator mapItr = mTextRepeatMap.find(source->GetGUID()); - if (mapItr != mTextRepeatMap.end()) - { - CreatureTextRepeatGroup::const_iterator groupItr = (*mapItr).second.find(textGroup); - if (groupItr != (*mapItr).second.end()) - { - ids = (*groupItr).second; - } - } - return ids; -} + if (iter->emote) + SendEmote(finalSource, iter->emote); -void CreatureTextMgr::SendChatString(WorldObject* source, char const* text, ChatMsg msgtype /*= CHAT_MSG_MONSTER_SAY*/, Language language /*= LANG_UNIVERSAL*/, uint64 whisperGuid /*= 0*/, TextRange range /*= TEXT_RANGE_NORMAL*/, Team team /*= TEAM_OTHER*/, bool gmOnly /*= false*/) const -{ - if (!source) - return; + CreatureTextBuilder builder(finalSource, finalType, iter->group, iter->id, finalLang, whisperGuid); + SendChatPacket(finalSource, builder, finalType, whisperGuid, range, team, gmOnly); + if (isEqualChanced || (!isEqualChanced && totalChance == 100.0f)) + SetRepeatId(source, textGroup, iter->id); - WorldPacket data(SMSG_MESSAGECHAT, 200); - BuildMonsterChat(&data, source, msgtype, text, language, whisperGuid);//build our packet - SendChatPacket(&data, source, msgtype, whisperGuid, range, team, gmOnly);//send our packet + return iter->duration; } -void CreatureTextMgr::BuildMonsterChat(WorldPacket* data, WorldObject* source, ChatMsg msgType, char const* text, Language language, uint64 whisperGuid) const +float CreatureTextMgr::GetRangeForChatType(ChatMsg msgType) const { - if (!source) - return; - + float dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY); switch (msgType) { - case CHAT_MSG_MONSTER_WHISPER: - if (!whisperGuid) - { - sLog->outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent CHAT_TYPE_WHISPER with targetGuid 0. Ignoring.", source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow()); - return; - } + case CHAT_MSG_MONSTER_YELL: + dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL); break; - case CHAT_MSG_RAID_BOSS_WHISPER: - if (!whisperGuid) - { - sLog->outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent CHAT_TYPE_BOSS_WHISPER with targetGuid 0. Ignoring.", source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow()); - return; - } + case CHAT_MSG_MONSTER_EMOTE: + case CHAT_MSG_RAID_BOSS_EMOTE: + dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE); break; default: break; } - *data << uint8(msgType); - *data << uint32(language); - *data << uint64(source->GetGUID()); - *data << uint32(0); // 2.1.0 - *data << uint32(strlen(source->GetName()) + 1); - *data << source->GetName(); - *data << uint64(whisperGuid); // Unit Target - if (whisperGuid && !IS_PLAYER_GUID(whisperGuid)) //can only whisper players - { - sLog->outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent WHISPER msg to Non-Player target. Ignoring.", source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow()); - return; - // *data << (uint32)1; // target name length - // *data << (uint8)0; // target name - } - *data << uint32(strlen(text) + 1); - *data << text; - *data << uint8(0); // ChatTag + + return dist; } -void CreatureTextMgr::SendChatPacket(WorldPacket* data, WorldObject* source, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) const +void CreatureTextMgr::SendSound(Creature* source, uint32 sound, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) { - if (!source) + if (!sound || !source) return; - float dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY); + WorldPacket data(SMSG_PLAY_SOUND, 4); + data << uint32(sound); + SendNonChatPacket(source, &data, msgType, whisperGuid, range, team, gmOnly); +} + +void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket* data, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) const +{ + float dist = GetRangeForChatType(msgType); switch (msgType) { - case CHAT_MSG_MONSTER_YELL: - dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL); - break; - case CHAT_MSG_MONSTER_EMOTE: - case CHAT_MSG_RAID_BOSS_EMOTE: - dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE); - break; case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { @@ -337,83 +326,134 @@ void CreatureTextMgr::SendChatPacket(WorldPacket* data, WorldObject* source, Cha case TEXT_RANGE_AREA: { uint32 areaId = source->GetAreaId(); - Map::PlayerList const& pList = source->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - { + Map::PlayerList const& players = source->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->getSource()->GetAreaId() == areaId && (!team || Team(itr->getSource()->GetTeam()) == team) && (!gmOnly || itr->getSource()->isGameMaster())) - { - if (data->GetOpcode() == SMSG_MESSAGECHAT)//override whisperguid with actual player's guid - data->put(1+4+8+4+4+(int32)(strlen(source->GetName())+1), uint64(itr->getSource()->GetGUID())); - (itr->getSource())->GetSession()->SendPacket(data); - } - } + itr->getSource()->GetSession()->SendPacket(data); return; } case TEXT_RANGE_ZONE: { uint32 zoneId = source->GetZoneId(); - Map::PlayerList const& pList = source->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - { + Map::PlayerList const& players = source->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->getSource()->GetZoneId() == zoneId && (!team || Team(itr->getSource()->GetTeam()) == team) && (!gmOnly || itr->getSource()->isGameMaster())) - { - if (data->GetOpcode() == SMSG_MESSAGECHAT)//override whisperguid with actual player's guid - data->put(1+4+8+4+4+(int32)(strlen(source->GetName())+1), uint64(itr->getSource()->GetGUID())); - (itr->getSource())->GetSession()->SendPacket(data); - } - } + itr->getSource()->GetSession()->SendPacket(data); return; } case TEXT_RANGE_MAP: { - Map::PlayerList const& pList = source->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - { - if (data->GetOpcode() == SMSG_MESSAGECHAT)//override whisperguid with actual player's guid - data->put(1+4+8+4+4+(int32)(strlen(source->GetName())+1), uint64(itr->getSource()->GetGUID())); + Map::PlayerList const& players = source->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if ((!team || Team(itr->getSource()->GetTeam()) == team) && (!gmOnly || itr->getSource()->isGameMaster())) - (itr->getSource())->GetSession()->SendPacket(data); - } + itr->getSource()->GetSession()->SendPacket(data); return; } case TEXT_RANGE_WORLD: { - const SessionMap smap = sWorld->GetAllSessions(); + SessionMap const& smap = sWorld->GetAllSessions(); for (SessionMap::const_iterator iter = smap.begin(); iter != smap.end(); ++iter) - { - if (Player* player = (*iter).second->GetPlayer()) - { - if (data->GetOpcode() == SMSG_MESSAGECHAT)//override whisperguid with actual player's guid - data->put(1+4+8+4+4+(int32)(strlen(source->GetName())+1), uint64(player->GetGUID())); + if (Player* player = iter->second->GetPlayer()) if (player->GetSession() && (!team || Team(player->GetTeam()) == team) && (!gmOnly || player->isGameMaster())) player->GetSession()->SendPacket(data); - } - } return; } case TEXT_RANGE_NORMAL: default: break; } + source->SendMessageToSetInRange(data, dist, true); } +void CreatureTextMgr::SendEmote(Unit* source, uint32 emote) +{ + if (!source) + return; + + source->HandleEmoteCommand(emote); +} + +void CreatureTextMgr::SetRepeatId(Creature* source, uint8 textGroup, uint8 id) +{ + if (!source) + return; + + CreatureTextRepeatIds& repeats = mTextRepeatMap[source->GetGUID()][textGroup]; + if (std::find(repeats.begin(), repeats.end(), id) == repeats.end()) + repeats.push_back(id); + else + sLog->outErrorDb("CreatureTextMgr: TextGroup %u for Creature(%s) GuidLow %u Entry %u, id %u already added", uint32(textGroup), source->GetName(), source->GetGUIDLow(), source->GetEntry(), uint32(id)); +} + +CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 textGroup) +{ + ASSERT(source);//should never happen + CreatureTextRepeatIds ids; + + CreatureTextRepeatMap::const_iterator mapItr = mTextRepeatMap.find(source->GetGUID()); + if (mapItr != mTextRepeatMap.end()) + { + CreatureTextRepeatGroup::const_iterator groupItr = (*mapItr).second.find(textGroup); + if (groupItr != mapItr->second.end()) + ids = groupItr->second; + } + return ids; +} + bool CreatureTextMgr::TextExist(uint32 sourceEntry, uint8 textGroup) { if (!sourceEntry) return false; + CreatureTextMap::const_iterator sList = mTextMap.find(sourceEntry); if (sList == mTextMap.end()) { sLog->outDebug(LOG_FILTER_UNITS, "CreatureTextMgr::TextExist: Could not find Text for Creature (entry %u) in 'creature_text' table.", sourceEntry); return false; } - CreatureTextHolder TextHolder = (*sList).second; - CreatureTextHolder::const_iterator itr = TextHolder.find(textGroup); - if (itr == TextHolder.end()) + + CreatureTextHolder const& textHolder = sList->second; + CreatureTextHolder::const_iterator itr = textHolder.find(textGroup); + if (itr == textHolder.end()) { sLog->outDebug(LOG_FILTER_UNITS, "CreatureTextMgr::TextExist: Could not find TextGroup %u for Creature (entry %u).", uint32(textGroup), sourceEntry); return false; } + return true; } + +std::string CreatureTextMgr::GetLocalizedChatString(uint32 entry, uint8 textGroup, uint32 id, LocaleConstant locale) const +{ + CreatureTextMap::const_iterator mapitr = mTextMap.find(entry); + if (mapitr == mTextMap.end()) + return ""; + + CreatureTextHolder::const_iterator holderItr = mapitr->second.find(textGroup); + if (holderItr == mapitr->second.end()) + return ""; + + CreatureTextGroup::const_iterator groupItr = holderItr->second.begin(); + for (; groupItr != holderItr->second.end(); ++groupItr) + if (groupItr->id == id) + break; + + if (groupItr == holderItr->second.end()) + return ""; + + std::string baseText = groupItr->text; + if (locale == DEFAULT_LOCALE) + return baseText; + + if (locale > MAX_LOCALES) + return baseText; + + LocaleCreatureTextMap::const_iterator locItr = mLocaleTextMap.find(CreatureTextId(entry, uint32(textGroup), id)); + if (locItr == mLocaleTextMap.end()) + return baseText; + + ObjectMgr::GetLocaleString(locItr->second.Text, locale, baseText); + + return baseText; +} diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 0c80e2d568f..8ed0b01fcd5 100755 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -19,6 +19,8 @@ #define TRINITY_CREATURE_TEXT_MGR_H #include "Creature.h" +#include "GridNotifiers.h" +#include "ObjectAccessor.h" #include "SharedDefines.h" struct CreatureTextEntry @@ -44,10 +46,33 @@ enum TextRange TEXT_RANGE_WORLD = 4 }; +struct CreatureTextLocale +{ + StringVector Text; +}; + +struct CreatureTextId +{ + CreatureTextId(uint32 e, uint32 g, uint32 i) : entry(e), textGroup(g), textId(i) + { + } + + bool operator<(CreatureTextId const& right) const + { + return memcmp(this, &right, sizeof(CreatureTextId)) < 0; + } + + uint32 entry; + uint32 textGroup; + uint32 textId; +}; + typedef std::vector CreatureTextGroup; //texts in a group typedef UNORDERED_MAP CreatureTextHolder; //groups for a creature by groupid typedef UNORDERED_MAP CreatureTextMap; //all creatures by entry +typedef std::map LocaleCreatureTextMap; + //used for handling non-repeatable random texts typedef std::vector CreatureTextRepeatIds; typedef UNORDERED_MAP CreatureTextRepeatGroup; @@ -57,9 +82,11 @@ class CreatureTextMgr { friend class ACE_Singleton; CreatureTextMgr() {}; + public: ~CreatureTextMgr() {}; void LoadCreatureTexts(); + void LoadCreatureTextLocales(); CreatureTextMap const& GetTextMap() const { return mTextMap; } void SendSound(Creature* source, uint32 sound, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly); @@ -67,17 +94,156 @@ class CreatureTextMgr //if sent, returns the 'duration' of the text else 0 if error uint32 SendChat(Creature* source, uint8 textGroup, uint64 whisperGuid = 0, ChatMsg msgType = CHAT_MSG_ADDON, Language language = LANG_ADDON, TextRange range = TEXT_RANGE_NORMAL, uint32 sound = 0, Team team = TEAM_OTHER, bool gmOnly = false, Player* srcPlr = NULL); - void SendChatString(WorldObject* source, char const* text, ChatMsg msgtype = CHAT_MSG_MONSTER_SAY, Language language = LANG_UNIVERSAL, uint64 whisperGuid = 0, TextRange range = TEXT_RANGE_NORMAL, Team team = TEAM_OTHER, bool gmOnly = false) const; bool TextExist(uint32 sourceEntry, uint8 textGroup); + std::string GetLocalizedChatString(uint32 entry, uint8 textGroup, uint32 id, LocaleConstant locale) const; + + template + void SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, uint64 whisperGuid = 0, TextRange range = TEXT_RANGE_NORMAL, Team team = TEAM_OTHER, bool gmOnly = false) const; private: CreatureTextRepeatIds GetRepeatGroup(Creature* source, uint8 textGroup); void SetRepeatId(Creature* source, uint8 textGroup, uint8 id); - void BuildMonsterChat(WorldPacket* data, WorldObject* source, ChatMsg msgType, char const* text, Language language, uint64 whisperGuid) const; - void SendChatPacket(WorldPacket* data, WorldObject* source, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) const; + + void SendNonChatPacket(WorldObject* source, WorldPacket* data, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) const; + float GetRangeForChatType(ChatMsg msgType) const; CreatureTextMap mTextMap; CreatureTextRepeatMap mTextRepeatMap; + LocaleCreatureTextMap mLocaleTextMap; }; #define sCreatureTextMgr ACE_Singleton::instance() + +template +class CreatureTextLocalizer +{ + public: + CreatureTextLocalizer(Builder const& builder, ChatMsg msgType) : _builder(builder), _msgType(msgType) + { + _packetCache.resize(TOTAL_LOCALES, NULL); + } + + ~CreatureTextLocalizer() + { + for (size_t i = 0; i < _packetCache.size(); ++i) + { + if (_packetCache[i]) + delete _packetCache[i]->first; + delete _packetCache[i]; + } + } + + void operator()(Player* player) + { + LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); + WorldPacket* messageTemplate; + size_t whisperGUIDpos; + + // create if not cached yet + if (!_packetCache[loc_idx]) + { + messageTemplate = new WorldPacket(SMSG_MESSAGECHAT, 200); + whisperGUIDpos = _builder(messageTemplate, loc_idx); + _packetCache[loc_idx] = new std::pair(messageTemplate, whisperGUIDpos); + } + else + { + messageTemplate = _packetCache[loc_idx]->first; + whisperGUIDpos = _packetCache[loc_idx]->second; + } + + WorldPacket data(*messageTemplate); + switch (_msgType) + { + case CHAT_MSG_MONSTER_WHISPER: + case CHAT_MSG_RAID_BOSS_WHISPER: + data.put(whisperGUIDpos, player->GetGUID()); + break; + default: + break; + } + + player->SendDirectMessage(&data); + } + + private: + std::vector* > _packetCache; + Builder const& _builder; + ChatMsg _msgType; +}; + +template +void CreatureTextMgr::SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) const +{ + if (!source) + return; + + CreatureTextLocalizer localizer(builder, msgType); + + switch (msgType) + { + case CHAT_MSG_MONSTER_WHISPER: + case CHAT_MSG_RAID_BOSS_WHISPER: + { + if (range == TEXT_RANGE_NORMAL) //ignores team and gmOnly + { + Player* player = ObjectAccessor::FindPlayer(whisperGuid); + if (!player || !player->GetSession()) + return; + + localizer(player); + return; + } + break; + } + default: + break; + } + + switch (range) + { + case TEXT_RANGE_AREA: + { + uint32 areaId = source->GetAreaId(); + Map::PlayerList const& players = source->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (itr->getSource()->GetAreaId() == areaId && (!team || Team(itr->getSource()->GetTeam()) == team) && (!gmOnly || itr->getSource()->isGameMaster())) + localizer(itr->getSource()); + return; + } + case TEXT_RANGE_ZONE: + { + uint32 zoneId = source->GetZoneId(); + Map::PlayerList const& players = source->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (itr->getSource()->GetZoneId() == zoneId && (!team || Team(itr->getSource()->GetTeam()) == team) && (!gmOnly || itr->getSource()->isGameMaster())) + localizer(itr->getSource()); + return; + } + case TEXT_RANGE_MAP: + { + Map::PlayerList const& players = source->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if ((!team || Team(itr->getSource()->GetTeam()) == team) && (!gmOnly || itr->getSource()->isGameMaster())) + localizer(itr->getSource()); + return; + } + case TEXT_RANGE_WORLD: + { + SessionMap const& smap = sWorld->GetAllSessions(); + for (SessionMap::const_iterator iter = smap.begin(); iter != smap.end(); ++iter) + if (Player* player = iter->second->GetPlayer()) + if (player->GetSession() && (!team || Team(player->GetTeam()) == team) && (!gmOnly || player->isGameMaster())) + localizer(player); + return; + } + case TEXT_RANGE_NORMAL: + default: + break; + } + + float dist = GetRangeForChatType(msgType); + Trinity::PlayerDistWorker > worker(source, dist, localizer); + source->VisitNearbyWorldObject(dist, worker); +} + #endif diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index fe8a8c64607..0ed437461d5 100755 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -38,24 +38,38 @@ GmTicket::GmTicket(Player* player, WorldPacket& recv_data) : _createTime(time(NU _playerGuid = player->GetGUID(); uint32 mapId; - recv_data >> mapId; + recv_data >> mapId; // Map is sent as UInt32! _mapId = mapId; recv_data >> _posX; recv_data >> _posY; recv_data >> _posZ; recv_data >> _message; - - uint32 unk1; - recv_data >> unk1; // not sure what this is... replyTo? - uint8 needResponse; - recv_data >> needResponse; // always 1/0 -- not sure what retail does with this + uint32 needResponse; + recv_data >> needResponse; + _needResponse = (needResponse == 17); // Requires GM response. 17 = true, 1 = false (17 is default) + uint8 unk1; + recv_data >> unk1; // Requests further GM interaction on a ticket to which a GM has already responded + + recv_data.rfinish(); + /* + recv_data >> uint32(count); // text lines + for (int i = 0; i < count; i++) + recv_data >> uint32(); + + if (something) + recv_data >> uint32(); + else + compressed uint32 + string; + */ } GmTicket::~GmTicket() { } bool GmTicket::LoadFromDB(Field* fields) { + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + // ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed uint8 index = 0; _id = fields[ index].GetUInt32(); _playerGuid = MAKE_NEW_GUID(fields[++index].GetUInt32(), 0, HIGHGUID_PLAYER); @@ -78,6 +92,8 @@ bool GmTicket::LoadFromDB(Field* fields) void GmTicket::SaveToDB(SQLTransaction& trans) const { + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + // ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); stmt->setUInt32( index, _id); @@ -125,8 +141,8 @@ void GmTicket::WritePacket(WorldPacket& data) const void GmTicket::SendResponse(WorldSession* session) const { WorldPacket data(SMSG_GMRESPONSE_RECEIVED); - data << uint32(1); // unk? Zor says "hasActiveTicket" - data << uint32(0); // can-edit - always 1 or 0, not flags + data << uint32(1); // responseID + data << uint32(_id); // ticketID data << _message.c_str(); data << _response.c_str(); session->SendPacket(&data); @@ -187,13 +203,19 @@ void GmTicket::SetUnassigned() void GmTicket::TeleportTo(Player* player) const { - player->TeleportTo(_mapId, _posX, _posY, _posZ, 1, 0); + player->TeleportTo(_mapId, _posX, _posY, _posZ, 0.0f, 0); } /////////////////////////////////////////////////////////////////////////////////////////////////// // Ticket manager TicketMgr::TicketMgr() : _status(true), _lastTicketId(0), _lastSurveyId(0), _openTicketCount(0), _lastChange(time(NULL)) { } +TicketMgr::~TicketMgr() +{ + for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) + delete itr->second; +} + void TicketMgr::Initialize() { SetStatus(sWorld->getBoolConfig(CONFIG_ALLOW_TICKETS)); } void TicketMgr::ResetTickets() @@ -213,10 +235,8 @@ void TicketMgr::LoadTickets() { uint32 oldMSTime = getMSTime(); - if (!_ticketList.empty()) - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) - if (itr->second) - delete itr->second; + for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) + delete itr->second; _ticketList.clear(); _lastTicketId = 0; @@ -297,6 +317,7 @@ void TicketMgr::RemoveTicket(uint32 ticketId) { ticket->DeleteFromDB(); _ticketList.erase(ticketId); + delete ticket; } } @@ -336,13 +357,13 @@ void TicketMgr::SendTicket(WorldSession* session, GmTicket* ticket) const } WorldPacket data(SMSG_GMTICKET_GETTICKET, (4 + 4 + (ticket ? message.length() + 1 + 4 + 4 + 4 + 1 + 1 : 0))); - data << uint32(status); // standard 0x0A, 0x06 if text present - data << uint32(1); // g_HasActiveGMTicket -- not a flag + data << uint32(status); // standard 0x0A, 0x06 if text present + data << uint32(ticket ? ticket->GetId() : 0); // ticketID if (ticket) { - data << message.c_str(); // ticket text - data << uint8(0x7); // ticket category; why is this hardcoded? does it make a diff re: client? + data << message.c_str(); // ticket text + data << uint8(0x7); // ticket category; why is this hardcoded? does it make a diff re: client? // we've got the easy stuff done by now. // Now we need to go through the client logic for displaying various levels of ticket load diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h index cb0a1bab22b..be8b4063d84 100755 --- a/src/server/game/Tickets/TicketMgr.h +++ b/src/server/game/Tickets/TicketMgr.h @@ -40,8 +40,11 @@ enum GMTicketStatus enum GMTicketResponse { - GMTICKET_RESPONSE_FAILURE = 1, - GMTICKET_RESPONSE_SUCCESS = 2, + GMTICKET_RESPONSE_ALREADY_EXIST = 1, + GMTICKET_RESPONSE_CREATE_SUCCESS = 2, + GMTICKET_RESPONSE_CREATE_ERROR = 3, + GMTICKET_RESPONSE_UPDATE_SUCCESS = 4, + GMTICKET_RESPONSE_UPDATE_ERROR = 5, GMTICKET_RESPONSE_TICKET_DELETED = 9, }; @@ -156,6 +159,7 @@ private: bool _completed; GMTicketEscalationStatus _escalatedStatus; bool _viewed; + bool _needResponse; // TODO: find out the use of this, and then store it in DB std::string _response; }; typedef std::map GmTicketList; @@ -166,6 +170,7 @@ class TicketMgr private: TicketMgr(); + ~TicketMgr(); public: void LoadTickets(); diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 4d9c5a93875..476a19b6885 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -306,22 +306,28 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl switch (type) { case DTT_INVENTORY: - StoreGUID(result, 3, items); break; // item guid collection (character_inventory.item) + StoreGUID(result, 3, items); // item guid collection (character_inventory.item) + break; case DTT_PET: - StoreGUID(result, 0, pets); break; // pet petnumber collection (character_pet.id) + StoreGUID(result, 0, pets); // pet petnumber collection (character_pet.id) + break; case DTT_MAIL: - StoreGUID(result, 0, mails); // mail id collection (mail.id) + StoreGUID(result, 0, mails); // mail id collection (mail.id) + break; case DTT_MAIL_ITEM: - StoreGUID(result, 1, items); break; // item guid collection (mail_items.item_guid) + StoreGUID(result, 1, items); // item guid collection (mail_items.item_guid) + break; case DTT_CHARACTER: { - if (result->GetFieldCount() <= 67) // avoid crashes on next check - return true; - if (result->Fetch()[67].GetUInt32()) // characters.deleteInfos_Account - if filled error + if (result->GetFieldCount() <= 68) // avoid crashes on next check + sLog->outCrash("PlayerDumpWriter::DumpTable - Trying to access non-existing or wrong positioned field (`deleteInfos_Account`) in `characters` table."); + + if (result->Fetch()[68].GetUInt32()) // characters.deleteInfos_Account - if filled error return false; break; } - default: break; + default: + break; } dump += CreateDumpString(tableTo, result); @@ -406,7 +412,10 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s bool incHighest = true; if (guid != 0 && guid < sObjectMgr->_hiCharGuid) { - result = CharacterDatabase.PQuery("SELECT 1 FROM characters WHERE guid = '%d'", guid); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_GUID); + stmt->setUInt32(0, guid); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) guid = sObjectMgr->_hiCharGuid; // use first free if exists else incHighest = false; @@ -420,8 +429,10 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s if (ObjectMgr::CheckPlayerName(name, true) == CHAR_NAME_SUCCESS) { - CharacterDatabase.EscapeString(name); // for safe, we use name only for sql quearies anyway - result = CharacterDatabase.PQuery("SELECT 1 FROM characters WHERE name = '%s'", name.c_str()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME); + stmt->setString(0, name); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) name = ""; // use the one from the dump } @@ -452,7 +463,8 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s { if (!fgets(buf, 32000, fin)) { - if (feof(fin)) break; + if (feof(fin)) + break; ROLLBACK(DUMP_FILE_BROKEN); } @@ -523,9 +535,11 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s { // check if the original name already exists name = getnth(line, 3); - CharacterDatabase.EscapeString(name); - result = CharacterDatabase.PQuery("SELECT 1 FROM characters WHERE name = '%s'", name.c_str()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME); + stmt->setString(0, name); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (result) if (!changenth(line, 37, "1")) // characters.at_login set to "rename on login" ROLLBACK(DUMP_FILE_BROKEN); diff --git a/src/server/game/Warden/Modules/WardenModuleWin.h b/src/server/game/Warden/Modules/WardenModuleWin.h index ca61a270a81..bf40cde546b 100644 --- a/src/server/game/Warden/Modules/WardenModuleWin.h +++ b/src/server/game/Warden/Modules/WardenModuleWin.h @@ -19,1186 +19,1219 @@ #ifndef _WARDEN_MODULE_WIN_H #define _WARDEN_MODULE_WIN_H -uint8 Module_79C0768D657977D697E10BAD956CCED1_Data[18756] = -{ - 0x21, 0x6C, 0xBB, 0x6A, 0xB9, 0xAF, 0xE8, 0xA1, 0x9A, 0x79, 0x18, 0xF1, 0x27, 0x9A, 0x14, 0xF5, - 0x42, 0x5D, 0x00, 0xBA, 0x74, 0x57, 0x0E, 0xAF, 0xD2, 0xAE, 0x8E, 0x51, 0xA5, 0xC1, 0x17, 0x4E, - 0xEC, 0x7F, 0xAC, 0xBC, 0xDD, 0x42, 0x87, 0xA6, 0xF9, 0xC1, 0x4A, 0xCE, 0xB5, 0xDD, 0xB3, 0xF8, - 0x06, 0x52, 0x9D, 0xF2, 0xAE, 0x2A, 0x49, 0x2B, 0x7B, 0x72, 0x5F, 0x40, 0x01, 0x16, 0xDB, 0x98, - 0x77, 0x1F, 0xE3, 0x61, 0x5A, 0x99, 0x39, 0x66, 0x2F, 0x2F, 0x35, 0xBF, 0x00, 0x20, 0xE4, 0xE0, - 0x8F, 0x98, 0xAD, 0xFC, 0xDB, 0x7D, 0xDD, 0xE8, 0x7A, 0xE9, 0x21, 0x6C, 0x86, 0x80, 0x3A, 0xE7, - 0x75, 0x66, 0x0E, 0xD9, 0xC6, 0xC5, 0xD8, 0xD8, 0xA9, 0x9B, 0x84, 0x09, 0xF0, 0xB3, 0x7C, 0x72, - 0x53, 0xE2, 0x29, 0xF9, 0x64, 0x8C, 0x17, 0xFD, 0x90, 0xAE, 0x48, 0x5A, 0x30, 0xFA, 0x30, 0xB7, - 0x54, 0x58, 0x59, 0x61, 0xA0, 0x24, 0x57, 0xE4, 0xF0, 0x05, 0xA2, 0x3F, 0x7A, 0xA6, 0x51, 0x7E, - 0x4F, 0x35, 0xF4, 0xE5, 0xFF, 0x98, 0xE9, 0x3E, 0x1F, 0xF1, 0x66, 0x48, 0x5B, 0xF8, 0xCF, 0x3B, - 0x37, 0x3B, 0x60, 0x47, 0x1C, 0xF7, 0xBE, 0x59, 0x70, 0x3A, 0x03, 0x4C, 0xE6, 0xBD, 0xB6, 0xED, - 0x46, 0xAF, 0x04, 0x5A, 0xAA, 0xC4, 0x30, 0xCF, 0x0B, 0x05, 0x86, 0xA9, 0x56, 0x5B, 0x09, 0xF0, - 0x92, 0x59, 0xC8, 0x48, 0x58, 0x33, 0xBF, 0x81, 0x70, 0x51, 0x92, 0x98, 0xE9, 0x4F, 0x2B, 0xDD, - 0x5B, 0x0A, 0x42, 0x51, 0x73, 0x97, 0xF6, 0x66, 0x00, 0xF2, 0x04, 0x50, 0x4A, 0x54, 0x62, 0x7A, - 0x00, 0x10, 0x5B, 0xAD, 0x0E, 0xFC, 0xE1, 0x44, 0x55, 0x4E, 0x21, 0x76, 0xC6, 0x4B, 0xD5, 0x2E, - 0xF5, 0xF4, 0x0E, 0xFC, 0x55, 0xE1, 0xDE, 0x32, 0x20, 0x22, 0x03, 0x98, 0xF0, 0xD3, 0x4A, 0xE5, - 0x45, 0x49, 0x0C, 0xE8, 0x76, 0xE1, 0xBF, 0x4A, 0x53, 0xD3, 0xCE, 0x64, 0xCF, 0x82, 0xCF, 0x67, - 0xA9, 0x3F, 0xF1, 0x06, 0x24, 0x33, 0x0A, 0x98, 0x6A, 0x5C, 0xAB, 0xEE, 0x7F, 0x64, 0xE3, 0x65, - 0x1F, 0xF6, 0xBE, 0xAF, 0x9C, 0x63, 0x53, 0x54, 0x06, 0x84, 0x4F, 0xF2, 0x7D, 0xC5, 0xBD, 0x70, - 0xC7, 0x6F, 0x59, 0x93, 0x7C, 0xEE, 0xC0, 0xCA, 0xF5, 0x56, 0x21, 0x58, 0x5B, 0xD8, 0x1D, 0xB4, - 0xB7, 0x60, 0x72, 0x46, 0xA2, 0x60, 0x3F, 0xC3, 0x30, 0xAB, 0xE0, 0x3B, 0xAC, 0x9E, 0xB9, 0x64, - 0xA8, 0xEF, 0xD0, 0xE1, 0xE5, 0xE1, 0x83, 0x48, 0xB8, 0x35, 0xA7, 0x12, 0x11, 0x00, 0xC9, 0x29, - 0x1A, 0x41, 0x1D, 0x3B, 0xFB, 0x33, 0x0B, 0x66, 0x45, 0x86, 0x61, 0x70, 0x35, 0x4C, 0x5F, 0x64, - 0x8E, 0xF5, 0x57, 0xBE, 0xA6, 0xFA, 0x49, 0xC9, 0x89, 0xA4, 0x74, 0x02, 0x9E, 0xE7, 0x67, 0x14, - 0x8B, 0xB9, 0xE7, 0xA8, 0xB0, 0x75, 0x65, 0x22, 0xB7, 0xCD, 0xFA, 0x55, 0x18, 0x00, 0x55, 0xB5, - 0x09, 0x70, 0x7E, 0x05, 0x0B, 0x11, 0x42, 0xF0, 0x80, 0x58, 0x2F, 0xFE, 0x3B, 0x2C, 0x4A, 0xCA, - 0x50, 0x34, 0xD0, 0x6F, 0xF1, 0xCC, 0x7F, 0x35, 0xD7, 0x9B, 0xF2, 0x97, 0x16, 0xFE, 0x5F, 0x6C, - 0x94, 0xDC, 0xAC, 0x63, 0xC8, 0x85, 0x2E, 0x60, 0x41, 0x34, 0x89, 0xD3, 0xDD, 0xBF, 0x2D, 0x69, - 0xC2, 0xF7, 0x74, 0xB2, 0x56, 0xD9, 0x76, 0xA2, 0x35, 0x30, 0x60, 0x35, 0xAB, 0x50, 0x21, 0xAE, - 0xFC, 0xFA, 0x19, 0x06, 0xDE, 0x89, 0x46, 0xFF, 0x34, 0x2F, 0x19, 0x84, 0x85, 0xF5, 0x1E, 0x60, - 0x91, 0x0D, 0x8C, 0x94, 0xDB, 0x2E, 0xEE, 0x4D, 0x0A, 0x29, 0x64, 0x81, 0xAD, 0x4C, 0xBF, 0x41, - 0x51, 0x04, 0xCD, 0x1C, 0x5C, 0x89, 0xD3, 0x3A, 0x91, 0xD9, 0x5C, 0x7E, 0xF3, 0xE9, 0x5B, 0x9E, - 0xC2, 0xD2, 0xE4, 0xD5, 0xEF, 0x47, 0x63, 0xD2, 0xD4, 0x19, 0x3E, 0xDF, 0xCF, 0xA4, 0x10, 0x47, - 0x16, 0x93, 0xC2, 0xF2, 0x22, 0xED, 0x1D, 0x9E, 0x21, 0x63, 0xC4, 0xCB, 0x89, 0xBB, 0x3E, 0xF7, - 0x89, 0x68, 0x6D, 0x2C, 0xDF, 0x2C, 0x6F, 0xB2, 0x8D, 0x75, 0xF8, 0xC6, 0x57, 0x98, 0x47, 0x86, - 0x40, 0x72, 0xBB, 0xD7, 0x32, 0xCD, 0x7A, 0x15, 0x64, 0x83, 0xD9, 0x50, 0x2E, 0xDE, 0x0C, 0x8C, - 0x30, 0xCD, 0xB0, 0x64, 0xD6, 0x7F, 0xE7, 0xAD, 0x6E, 0x01, 0x3E, 0x14, 0x8A, 0x24, 0x86, 0x1F, - 0x92, 0xAB, 0x1A, 0xE5, 0xD6, 0xBF, 0x64, 0xE5, 0xF6, 0x34, 0x62, 0xD5, 0x92, 0x5B, 0x64, 0xC4, - 0xFC, 0x1B, 0x7F, 0xA0, 0x13, 0xC1, 0xD4, 0xEB, 0x92, 0x90, 0xEF, 0x8C, 0x5E, 0x75, 0x4B, 0x78, - 0x56, 0x5F, 0xA2, 0x55, 0x4B, 0x1B, 0xE3, 0xDD, 0x80, 0x7E, 0xCF, 0x69, 0x97, 0x5A, 0x76, 0xD5, - 0xAA, 0x7D, 0x85, 0x73, 0x10, 0x4E, 0x79, 0x9A, 0x10, 0x10, 0x01, 0xD8, 0xD7, 0x85, 0x41, 0x8D, - 0x3D, 0xEA, 0xE3, 0x59, 0xD9, 0x31, 0x4B, 0x23, 0xC6, 0x53, 0x11, 0xA6, 0x35, 0x29, 0x64, 0x7E, - 0x28, 0xD7, 0x8D, 0x03, 0x70, 0x5C, 0x53, 0xA7, 0x6D, 0x81, 0x30, 0x7B, 0xDF, 0x2B, 0xAE, 0xAB, - 0x6F, 0x52, 0x93, 0xCF, 0xDD, 0x00, 0x35, 0xE9, 0x65, 0x4A, 0x04, 0x79, 0x11, 0x30, 0xCA, 0xC7, - 0xD2, 0xF3, 0x34, 0xAC, 0x32, 0x1F, 0xE4, 0xE5, 0x83, 0x12, 0x66, 0xD6, 0xA6, 0xE4, 0xEB, 0x67, - 0x7E, 0xDD, 0x64, 0x3E, 0xF1, 0x0C, 0xE6, 0x1C, 0xB6, 0xE1, 0xB0, 0x2B, 0xE7, 0x83, 0xB4, 0x4A, - 0x82, 0xDD, 0xC1, 0x22, 0x3F, 0x03, 0x38, 0x90, 0xB2, 0xA9, 0x7B, 0x60, 0x57, 0xF9, 0xDD, 0x04, - 0x60, 0x5D, 0x7C, 0x2C, 0xD3, 0xE6, 0xFE, 0x02, 0x5A, 0x7D, 0x2A, 0x48, 0x81, 0x42, 0x20, 0x84, - 0xFF, 0x1D, 0xCC, 0x64, 0x11, 0x70, 0xE5, 0x4F, 0x9F, 0xE0, 0x11, 0xFB, 0xF0, 0xE2, 0xC4, 0x9B, - 0x11, 0x30, 0x7F, 0x2F, 0x7F, 0xA1, 0xB1, 0xBC, 0x5F, 0x29, 0x21, 0xDF, 0xB4, 0xEB, 0xB2, 0x4F, - 0xAA, 0x2D, 0x95, 0x60, 0x47, 0x78, 0x37, 0x67, 0xCD, 0xFA, 0x36, 0x17, 0x8F, 0x64, 0x15, 0xAF, - 0x04, 0xAA, 0x5C, 0x76, 0x23, 0x07, 0x64, 0x96, 0xB2, 0x5A, 0xCF, 0x03, 0xDC, 0xC3, 0x2D, 0xFB, - 0x0D, 0x2D, 0xA8, 0xBD, 0xCE, 0x58, 0xF8, 0x44, 0x75, 0xA1, 0x07, 0xAA, 0xDF, 0x25, 0xDC, 0x25, - 0x32, 0xCF, 0xA8, 0x92, 0xC5, 0xC0, 0xD5, 0x70, 0x21, 0x19, 0x6F, 0x32, 0xCA, 0x16, 0xFA, 0x8C, - 0xB2, 0x86, 0xF6, 0xD5, 0x2E, 0xD9, 0x0A, 0x9C, 0x96, 0xDB, 0x4D, 0xA4, 0x11, 0x02, 0x4C, 0x33, - 0x99, 0xB3, 0x5E, 0x45, 0x5C, 0xF1, 0x99, 0x61, 0x04, 0x20, 0xC9, 0xC8, 0xB3, 0xB4, 0xD3, 0x8B, - 0x24, 0x78, 0x55, 0x2E, 0xB7, 0x48, 0x43, 0x17, 0xBF, 0xB9, 0x2A, 0xCC, 0xD5, 0x4A, 0x49, 0xB2, - 0x4E, 0x1E, 0xC7, 0x45, 0x4E, 0x55, 0xC4, 0xBC, 0xB1, 0xD2, 0xA6, 0x62, 0xE9, 0x95, 0xBB, 0xCD, - 0x87, 0xD2, 0x7C, 0xE5, 0xC6, 0x77, 0x5B, 0xFF, 0xAF, 0xDD, 0x44, 0x9D, 0x3D, 0x10, 0x05, 0x3C, - 0x77, 0x7A, 0xF8, 0x84, 0x0D, 0x04, 0x55, 0xB5, 0x20, 0xEA, 0xD2, 0x3F, 0x04, 0x33, 0xFF, 0xE2, - 0x01, 0x3B, 0x51, 0x46, 0x3E, 0x34, 0xAA, 0x40, 0xCA, 0x7C, 0x85, 0x46, 0x57, 0xD9, 0xB7, 0xE1, - 0xDC, 0x65, 0xEF, 0x11, 0x66, 0x0B, 0xBA, 0xD8, 0x37, 0x66, 0x96, 0x64, 0x54, 0x8B, 0x05, 0x81, - 0x47, 0x87, 0x70, 0xA8, 0x54, 0xC6, 0x02, 0x08, 0xB4, 0xAD, 0x69, 0x3C, 0xC0, 0x03, 0x69, 0x19, - 0xE6, 0xAC, 0x13, 0xD5, 0x3F, 0x2C, 0x9D, 0x61, 0xCC, 0xA8, 0x60, 0xB5, 0x60, 0x85, 0x19, 0x5B, - 0x3E, 0x82, 0xCA, 0x34, 0x70, 0x06, 0xCD, 0x37, 0x3E, 0x91, 0x2F, 0x49, 0x82, 0x0A, 0x87, 0xE8, - 0x09, 0x18, 0xB3, 0xF4, 0x16, 0xA4, 0xA5, 0x46, 0xC5, 0x76, 0x6D, 0x73, 0xB1, 0x93, 0xDC, 0x69, - 0xF4, 0x49, 0xF8, 0x2F, 0x97, 0xB4, 0xAA, 0x19, 0x4A, 0x60, 0xD2, 0xF9, 0x7B, 0x5A, 0xF0, 0x57, - 0x45, 0xC6, 0xA2, 0x64, 0x37, 0x56, 0xED, 0x6B, 0x5E, 0x1D, 0x9E, 0x35, 0x5E, 0xFE, 0xDE, 0x04, - 0x08, 0x3B, 0x62, 0x40, 0x82, 0xD4, 0xF9, 0xF3, 0x54, 0x95, 0x3E, 0x57, 0x49, 0x3A, 0x41, 0x41, - 0xDA, 0xD4, 0x78, 0x80, 0xC7, 0xF1, 0xDE, 0xA7, 0xFF, 0xDC, 0x53, 0xC9, 0x3A, 0x37, 0xA5, 0x83, - 0xDE, 0xE8, 0x51, 0x33, 0x7B, 0xE6, 0xAC, 0xA5, 0xC4, 0x7D, 0x34, 0xB0, 0x99, 0x0D, 0x03, 0x34, - 0x0F, 0x8D, 0xB8, 0x10, 0x4E, 0x30, 0x38, 0x10, 0xFC, 0x62, 0xC3, 0xC0, 0xF5, 0x67, 0x69, 0xF5, - 0x23, 0xB4, 0xF2, 0x6B, 0x79, 0xA8, 0xEE, 0xF0, 0xDD, 0x06, 0xA1, 0x50, 0x41, 0x3E, 0x1D, 0x04, - 0xB0, 0xB7, 0xC8, 0x58, 0x20, 0x72, 0xF6, 0x41, 0x53, 0x58, 0xAA, 0xAB, 0xA1, 0x19, 0xB0, 0x99, - 0xE4, 0x35, 0x44, 0x32, 0xF0, 0x34, 0x52, 0x4E, 0xD0, 0xBC, 0x1D, 0xD2, 0x14, 0x6A, 0x22, 0x46, - 0x93, 0x52, 0xFF, 0xD5, 0xD9, 0xEF, 0x19, 0xAF, 0xFB, 0x9A, 0x0D, 0x4A, 0x14, 0x49, 0xAE, 0xC0, - 0x09, 0x5E, 0x40, 0x36, 0x63, 0xE7, 0xC3, 0xFA, 0x84, 0x1C, 0xBF, 0x65, 0x17, 0xED, 0xED, 0x49, - 0x93, 0xB9, 0xCD, 0x85, 0x3F, 0x95, 0x57, 0xF9, 0xE7, 0x59, 0x55, 0x59, 0xED, 0x3A, 0xA1, 0x90, - 0x24, 0x36, 0xB8, 0x38, 0x91, 0x57, 0x59, 0xDB, 0xDE, 0x8E, 0x8B, 0x3A, 0xBB, 0x31, 0x76, 0x39, - 0x0D, 0x20, 0x84, 0x8A, 0x05, 0x5A, 0xC1, 0x93, 0x04, 0x5E, 0x9E, 0x2E, 0x41, 0x13, 0xC9, 0x7F, - 0xAB, 0x45, 0x86, 0x99, 0xB2, 0x5C, 0x7E, 0x1A, 0x1C, 0x9C, 0x7C, 0xCF, 0x60, 0x38, 0xF7, 0x02, - 0x8A, 0xE6, 0x74, 0x4F, 0x31, 0x67, 0x99, 0x96, 0xC3, 0x79, 0xEB, 0x19, 0x07, 0xAD, 0xBB, 0xD2, - 0xD7, 0x51, 0x75, 0xDD, 0xD5, 0x44, 0xC2, 0x9A, 0xDE, 0x01, 0x68, 0x8C, 0xBF, 0x11, 0xFE, 0x5F, - 0xB9, 0xCF, 0x25, 0x35, 0xD2, 0xF7, 0x29, 0xE0, 0x63, 0x0F, 0x0A, 0xCA, 0xB9, 0x38, 0xB6, 0xDA, - 0xDD, 0x66, 0xD9, 0x5F, 0x67, 0x42, 0x15, 0xD8, 0x1C, 0xD1, 0x1C, 0xCC, 0xD6, 0xB9, 0x29, 0x85, - 0x99, 0xD6, 0xDD, 0xCE, 0x8E, 0x3D, 0x63, 0x1C, 0x31, 0x32, 0x37, 0xCD, 0xE1, 0xF8, 0xEA, 0x4E, - 0x31, 0x25, 0xF7, 0x2D, 0xE1, 0xCA, 0x36, 0x5B, 0xEC, 0xAC, 0x2B, 0xB0, 0xA5, 0x69, 0x3B, 0x4C, - 0xAE, 0xD7, 0x15, 0xF7, 0x7F, 0x5C, 0x5F, 0x82, 0xF0, 0x1D, 0x44, 0x62, 0xA0, 0x72, 0x57, 0xAD, - 0xB3, 0xD7, 0x1B, 0xA9, 0xE2, 0x76, 0xFF, 0x18, 0xA6, 0x3E, 0xF9, 0xF5, 0x6F, 0xB5, 0x13, 0x26, - 0x72, 0x0F, 0xF4, 0xE1, 0x7D, 0x43, 0x86, 0x48, 0x42, 0x0B, 0x94, 0x96, 0xBF, 0x0E, 0x32, 0x1C, - 0xE0, 0x18, 0x69, 0xA9, 0xAE, 0x83, 0x6F, 0x36, 0xE7, 0x04, 0x20, 0xEE, 0x34, 0xFF, 0x21, 0xE9, - 0xBA, 0x3B, 0x38, 0x48, 0x2D, 0x81, 0x38, 0x48, 0x25, 0xE5, 0x4A, 0xAD, 0x81, 0xA9, 0xE8, 0x33, - 0x0A, 0x4C, 0x60, 0xAE, 0xBB, 0xCC, 0x24, 0x96, 0x44, 0xF3, 0x1A, 0x2A, 0x89, 0xCB, 0xD9, 0x5E, - 0x89, 0x4C, 0xFD, 0x62, 0xA8, 0x38, 0x1E, 0x73, 0x63, 0xB3, 0xF1, 0x3E, 0xAC, 0xB1, 0x0B, 0x5D, - 0x10, 0xE5, 0xCC, 0x88, 0x2F, 0x9D, 0x57, 0xF1, 0x33, 0xA6, 0x50, 0x13, 0x2C, 0x54, 0x81, 0x1B, - 0x90, 0xD8, 0x6F, 0x7C, 0x02, 0x86, 0xA8, 0x02, 0x5F, 0xCE, 0x24, 0x22, 0x76, 0x73, 0xE8, 0x66, - 0xDC, 0x7F, 0x8F, 0x69, 0x4E, 0xBB, 0x63, 0xEB, 0xCD, 0x38, 0xE6, 0xEE, 0x84, 0x70, 0x97, 0x2F, - 0xD1, 0x77, 0xEE, 0x63, 0xE4, 0x2D, 0x42, 0xDE, 0x17, 0x95, 0x18, 0xB5, 0xA9, 0x4D, 0xFD, 0x2A, - 0xA8, 0x07, 0x1F, 0xCC, 0x3F, 0x22, 0x3B, 0x03, 0x49, 0xCF, 0x83, 0x83, 0x85, 0xAA, 0x87, 0xA0, - 0xC6, 0x30, 0x8C, 0x8F, 0x91, 0x88, 0x67, 0xA7, 0x1F, 0xE0, 0xE2, 0x40, 0x1E, 0xE9, 0x12, 0x2E, - 0x5C, 0x33, 0x44, 0x29, 0x0D, 0xEA, 0x34, 0x8B, 0x1A, 0x48, 0x80, 0x67, 0x45, 0x2A, 0xF2, 0x82, - 0xD8, 0x78, 0x7E, 0x36, 0x59, 0x6C, 0x32, 0x58, 0x3B, 0x0F, 0x2C, 0x0B, 0xD1, 0xFA, 0x67, 0x2B, - 0x0C, 0xFF, 0x16, 0x57, 0x04, 0x38, 0x51, 0x4F, 0x34, 0xEE, 0x94, 0x8B, 0xBB, 0x7B, 0xBE, 0xEA, - 0x37, 0xB5, 0x9F, 0xBA, 0xDE, 0xC1, 0xC6, 0x34, 0x2D, 0x36, 0xE6, 0xC8, 0x67, 0x6A, 0x74, 0x56, - 0xB5, 0x05, 0x53, 0xAE, 0x5C, 0x94, 0x83, 0xF9, 0xE0, 0xD7, 0x21, 0xC2, 0x71, 0x4B, 0x0F, 0x9C, - 0x64, 0x1C, 0xF4, 0x6A, 0xF8, 0xE3, 0x3C, 0x8F, 0xD2, 0x20, 0xCF, 0x14, 0xAC, 0x21, 0xF5, 0x2A, - 0xE7, 0xEC, 0x5C, 0x49, 0xAB, 0x21, 0xF2, 0x41, 0x2C, 0x3B, 0xA0, 0x49, 0x43, 0xF3, 0x14, 0xFE, - 0x68, 0x7C, 0x83, 0x05, 0xF3, 0x71, 0x77, 0x02, 0x2B, 0xD4, 0x94, 0x2B, 0x28, 0x5E, 0x4A, 0x5E, - 0x6E, 0x81, 0x1A, 0xD3, 0xDA, 0x58, 0x9F, 0xD6, 0x7B, 0x6D, 0xAD, 0x14, 0xBC, 0x60, 0xFC, 0xC4, - 0x83, 0x0A, 0x8E, 0x9B, 0x8D, 0x5B, 0x24, 0x77, 0x10, 0x34, 0x78, 0xC9, 0x8F, 0xA5, 0x2D, 0x0F, - 0x6A, 0x88, 0x7F, 0x24, 0x40, 0x46, 0x25, 0x3A, 0xDE, 0xB9, 0x9E, 0xA2, 0xE7, 0x8D, 0x52, 0xA2, - 0xFF, 0xDE, 0xB4, 0x95, 0xDB, 0x05, 0x2E, 0xDF, 0x29, 0x28, 0xB5, 0x76, 0xD6, 0x1D, 0x09, 0x45, - 0x69, 0x29, 0xF9, 0x95, 0xAA, 0x36, 0x71, 0xD9, 0x3F, 0xFF, 0x6B, 0x04, 0xFE, 0xED, 0x63, 0xC8, - 0x3C, 0x4B, 0x6B, 0x0B, 0xF3, 0xD8, 0x71, 0x15, 0xDA, 0xC0, 0xC9, 0xE2, 0x0D, 0x87, 0x94, 0x61, - 0xBE, 0xEF, 0x79, 0x92, 0x4C, 0x14, 0x92, 0xBF, 0x0C, 0x4E, 0xA0, 0x1B, 0x58, 0x00, 0x30, 0xF6, - 0xD0, 0x09, 0xD6, 0x1E, 0x81, 0xA0, 0xE7, 0xFD, 0xFD, 0xFF, 0x21, 0x47, 0xAB, 0xDE, 0x67, 0xC6, - 0xF4, 0x19, 0x60, 0x0C, 0x49, 0xE5, 0xC4, 0xBD, 0x64, 0x05, 0xED, 0x89, 0xD7, 0xBD, 0x74, 0xF7, - 0xD4, 0xCC, 0x4B, 0x9E, 0xEB, 0x6E, 0xB7, 0x87, 0xB6, 0x31, 0x07, 0xCB, 0x6E, 0x0D, 0xDF, 0x3A, - 0xD8, 0x64, 0x1F, 0xF9, 0x2C, 0xEE, 0xC0, 0x61, 0x22, 0x0E, 0x5A, 0x20, 0x0C, 0xD4, 0x4F, 0xC5, - 0x2D, 0x82, 0x63, 0x39, 0x36, 0x34, 0x07, 0xC6, 0x23, 0xBC, 0xF1, 0x56, 0xC6, 0x8C, 0x39, 0x23, - 0x43, 0xFF, 0xEC, 0xBE, 0x95, 0x7B, 0xC7, 0xFD, 0xA9, 0x99, 0x3D, 0xDF, 0x50, 0x28, 0x39, 0xCA, - 0x80, 0xCF, 0x1C, 0xE7, 0x81, 0x06, 0xB4, 0x43, 0x55, 0xFB, 0xB0, 0xA4, 0x5D, 0x78, 0x39, 0x71, - 0x88, 0xEC, 0xBB, 0x01, 0x69, 0x5E, 0x85, 0x97, 0x1F, 0xEB, 0x6C, 0x82, 0x07, 0xF4, 0x00, 0x1B, - 0x90, 0x03, 0x1B, 0x92, 0x9A, 0x4A, 0x95, 0x9D, 0x45, 0x45, 0x65, 0x6F, 0x8B, 0x70, 0x4C, 0xFE, - 0x48, 0x94, 0x5B, 0x71, 0x86, 0x70, 0x45, 0xB7, 0x85, 0xD9, 0x59, 0x29, 0x94, 0x47, 0x5A, 0x17, - 0x96, 0xA1, 0x0E, 0xFD, 0x72, 0x71, 0xE1, 0x3F, 0x7B, 0xE6, 0x59, 0x2A, 0x91, 0x5A, 0x6B, 0x82, - 0xB1, 0xA1, 0x31, 0xC2, 0xE4, 0xE3, 0xB9, 0x8E, 0x5A, 0x68, 0xC1, 0x18, 0xD4, 0x4B, 0x02, 0x2E, - 0x50, 0x3D, 0x73, 0x53, 0x2B, 0x13, 0x77, 0x19, 0xC7, 0x03, 0x0B, 0xB5, 0xAD, 0x5C, 0x0B, 0x6B, - 0x66, 0x12, 0xF0, 0xE8, 0x67, 0xB7, 0xF7, 0x88, 0x64, 0xA8, 0x2C, 0x51, 0xA7, 0xF8, 0x5E, 0xB3, - 0x39, 0xEC, 0x1B, 0xDF, 0x6C, 0x89, 0x16, 0xFD, 0x51, 0x26, 0x29, 0x8D, 0x0E, 0xBE, 0x1B, 0xCE, - 0x61, 0xE5, 0x22, 0x09, 0xC1, 0x0F, 0xAD, 0x0C, 0xA1, 0x61, 0xF8, 0x49, 0x29, 0x11, 0x7C, 0x93, - 0x0C, 0xBE, 0xD0, 0x11, 0x6F, 0x24, 0x4E, 0x4B, 0xF5, 0xEF, 0x41, 0x3D, 0x0C, 0x69, 0xC6, 0xA6, - 0xBF, 0x87, 0x68, 0xFF, 0x2F, 0x76, 0xD9, 0xFD, 0x1D, 0x8E, 0x9F, 0x80, 0x19, 0x3B, 0x35, 0x8B, - 0x2D, 0xDB, 0x5C, 0x3E, 0x86, 0xE8, 0xBF, 0xF1, 0x30, 0x88, 0xE4, 0x80, 0xD0, 0x49, 0xC3, 0x50, - 0xF8, 0x1E, 0xCE, 0xDA, 0xAC, 0x2E, 0x3F, 0x97, 0x51, 0x12, 0x89, 0x47, 0x5D, 0xF4, 0xD4, 0x77, - 0x93, 0x66, 0x74, 0xE3, 0x4C, 0xCD, 0xB4, 0xC8, 0x00, 0x85, 0x64, 0x8C, 0x04, 0x72, 0x1C, 0x14, - 0xDA, 0x77, 0xD7, 0x1D, 0x39, 0xC3, 0x65, 0xD0, 0x28, 0x51, 0xCA, 0x91, 0xAE, 0x2D, 0xCD, 0x50, - 0x0D, 0x1B, 0xA4, 0xF1, 0x5D, 0x4C, 0x28, 0x1C, 0x57, 0xE5, 0x00, 0xEC, 0xA4, 0x02, 0x3B, 0xCA, - 0x70, 0xF3, 0x8B, 0x3C, 0x4F, 0xEE, 0x9D, 0x08, 0xFF, 0x66, 0x31, 0xCE, 0x37, 0x93, 0x90, 0x3D, - 0x6E, 0xDE, 0xB9, 0xCF, 0x35, 0xAA, 0xF0, 0x43, 0x3E, 0x6B, 0x19, 0xEC, 0x69, 0x7A, 0xF0, 0xC6, - 0xC3, 0x7D, 0x49, 0x89, 0x43, 0xCC, 0x2C, 0x20, 0x2E, 0xB8, 0x5D, 0xCC, 0xDB, 0x39, 0xCB, 0x0B, - 0x76, 0xD8, 0xAC, 0xD6, 0x2A, 0x76, 0x59, 0x7F, 0x6A, 0x1B, 0xCD, 0x4A, 0x93, 0xCA, 0x42, 0x5F, - 0xC7, 0x98, 0xFA, 0xC9, 0x30, 0x2E, 0x9F, 0x8F, 0xE5, 0xB5, 0x37, 0x41, 0x19, 0xF4, 0xA0, 0xE5, - 0xDA, 0x7D, 0x3C, 0xF5, 0x61, 0xCC, 0x98, 0x27, 0xED, 0xE4, 0x5C, 0x0E, 0x7C, 0x1B, 0x33, 0x38, - 0x77, 0x20, 0x92, 0xC9, 0xD3, 0x38, 0xC3, 0x03, 0x2C, 0xAF, 0xE2, 0x77, 0x34, 0x4B, 0xE2, 0x1C, - 0x9F, 0xE4, 0x4D, 0xAB, 0x12, 0xFE, 0xCD, 0xB3, 0x2C, 0xD3, 0xE2, 0x42, 0xB8, 0xE7, 0xE0, 0x14, - 0x88, 0x31, 0xB1, 0xDC, 0x35, 0xDE, 0xCD, 0x3D, 0x3B, 0xDF, 0x6C, 0x00, 0xA3, 0x48, 0xA6, 0x71, - 0x7E, 0xC6, 0x3A, 0xE8, 0x07, 0xCE, 0xC8, 0xE7, 0xDC, 0xB1, 0x98, 0x17, 0xDB, 0x75, 0x20, 0xFE, - 0x38, 0xC7, 0x1F, 0x02, 0x8E, 0xE4, 0x91, 0x79, 0x3D, 0xC0, 0x50, 0x2D, 0xC7, 0x49, 0x33, 0x6C, - 0xDF, 0x3C, 0xE9, 0x42, 0xE9, 0x27, 0xBC, 0x39, 0x38, 0xAA, 0x98, 0x16, 0x6E, 0x1F, 0x71, 0xDF, - 0x3B, 0xBA, 0x15, 0x2F, 0x69, 0xEB, 0x06, 0x5C, 0xFB, 0xF8, 0x4C, 0x83, 0x2C, 0x28, 0xC2, 0x19, - 0xAD, 0x04, 0xA1, 0xB0, 0x7F, 0xF1, 0x9C, 0x84, 0x38, 0x42, 0x45, 0x3E, 0x1E, 0xC7, 0x95, 0xD5, - 0xAF, 0x35, 0x7E, 0x2A, 0xCC, 0x06, 0x9D, 0x9A, 0xCF, 0xC2, 0x56, 0xE6, 0x73, 0x7F, 0x7E, 0x9D, - 0x9B, 0x01, 0x27, 0x76, 0x14, 0x8C, 0x3E, 0x3A, 0xBD, 0x2E, 0x6C, 0x7C, 0xB7, 0xF2, 0x9A, 0x92, - 0x41, 0xBC, 0xD0, 0x48, 0xF6, 0xE6, 0x16, 0x62, 0x01, 0x4D, 0x3D, 0x8E, 0xD2, 0x98, 0x8F, 0x61, - 0x70, 0x7C, 0x41, 0xCC, 0xCA, 0x3D, 0x3E, 0x0B, 0x70, 0xC3, 0x9F, 0x9D, 0x3E, 0x33, 0x50, 0x2B, - 0xB0, 0x47, 0xC8, 0xA3, 0xAA, 0x55, 0xBA, 0x16, 0x3B, 0xF4, 0x07, 0x98, 0x1B, 0x6C, 0x49, 0x6A, - 0xA5, 0xB4, 0x7A, 0xBE, 0x28, 0x37, 0xF2, 0x55, 0x69, 0x09, 0x7A, 0xEC, 0x94, 0x1C, 0x60, 0xE3, - 0xB5, 0x89, 0x07, 0x58, 0x43, 0xA3, 0x3F, 0x1D, 0x94, 0x20, 0x49, 0x5E, 0xC1, 0xB7, 0x4E, 0x2C, - 0x75, 0x95, 0x54, 0x91, 0x4A, 0x01, 0x90, 0xF8, 0xF1, 0x81, 0xC6, 0x4C, 0x9A, 0x63, 0x20, 0x55, - 0x65, 0x8D, 0x30, 0xA2, 0xD4, 0xC7, 0xAF, 0x18, 0xA5, 0x83, 0xB6, 0x68, 0x1B, 0x35, 0x13, 0x6D, - 0xC6, 0x77, 0x5A, 0x04, 0xFB, 0xD5, 0xBD, 0x2B, 0x0D, 0x55, 0x5E, 0xEC, 0x7A, 0x80, 0x17, 0x01, - 0x9C, 0x4F, 0x55, 0x39, 0x57, 0x9F, 0x31, 0x9E, 0xB9, 0xB1, 0x35, 0xD5, 0x2F, 0xB9, 0xF3, 0x6A, - 0x9C, 0x30, 0xEA, 0x1B, 0xE9, 0x34, 0x4A, 0x2F, 0xB1, 0x36, 0x9C, 0xF0, 0x8A, 0xE9, 0x62, 0xDB, - 0x06, 0x32, 0x64, 0x39, 0x58, 0x29, 0xBD, 0xB1, 0x2C, 0x06, 0x56, 0x54, 0xAF, 0x6B, 0x97, 0x5A, - 0x7D, 0x49, 0xB6, 0xDF, 0x06, 0xFC, 0x9F, 0x06, 0x64, 0x89, 0xF5, 0xF4, 0xC4, 0x55, 0x02, 0x19, - 0xAA, 0xC9, 0x1D, 0x8A, 0x5E, 0x3D, 0xA7, 0x13, 0xEC, 0x52, 0x29, 0x8B, 0x6E, 0xC5, 0xA0, 0x62, - 0x9E, 0x89, 0x96, 0xDF, 0x5E, 0x74, 0x69, 0x53, 0x75, 0xCA, 0xF0, 0x95, 0x0E, 0xF8, 0x42, 0xB6, - 0x06, 0x62, 0xDA, 0x92, 0x48, 0xC3, 0x37, 0x50, 0x59, 0xDF, 0x59, 0xAF, 0xAF, 0x0E, 0x2E, 0x84, - 0xE5, 0x2F, 0x3C, 0xC9, 0x7E, 0x2A, 0xE5, 0xA9, 0x41, 0xB1, 0x51, 0x82, 0xC6, 0x42, 0xEC, 0x65, - 0xFD, 0xCB, 0x54, 0x29, 0x33, 0xC2, 0xE5, 0x5E, 0x10, 0xFB, 0x9E, 0x19, 0xE2, 0x75, 0x53, 0x43, - 0x50, 0xD5, 0x10, 0x8E, 0xBC, 0xC6, 0x2A, 0x0A, 0x8D, 0x7F, 0x4A, 0xF6, 0x07, 0x28, 0xA1, 0xEB, - 0x14, 0x1C, 0xD3, 0xE9, 0x63, 0x55, 0xC7, 0xD2, 0xE8, 0xB2, 0x3D, 0x17, 0x84, 0x63, 0xF9, 0x11, - 0xA4, 0x11, 0xE0, 0xA1, 0x83, 0x11, 0x11, 0xD2, 0xA0, 0x8C, 0x61, 0x74, 0x36, 0x63, 0xE9, 0xE8, - 0x98, 0x4C, 0x20, 0x38, 0x1F, 0xA5, 0x15, 0x60, 0x3E, 0x5C, 0x1B, 0xE6, 0xDE, 0xC1, 0x70, 0x7F, - 0xCB, 0x92, 0x76, 0x05, 0xD8, 0x63, 0xDF, 0x01, 0x7E, 0xF2, 0xF1, 0x01, 0xBD, 0xCE, 0x9A, 0x1E, - 0x50, 0x7F, 0xB4, 0xF4, 0x49, 0x5D, 0x7F, 0xCA, 0x86, 0x83, 0x2F, 0x63, 0x33, 0xEF, 0x4F, 0x35, - 0xA1, 0xBF, 0xB6, 0xCD, 0x25, 0xBA, 0x0E, 0xB9, 0xA3, 0x96, 0x41, 0xD4, 0x90, 0xFF, 0xEB, 0xF7, - 0x4F, 0x93, 0xC8, 0xD7, 0x04, 0x62, 0x6E, 0x88, 0xD7, 0x71, 0x0E, 0x0E, 0x37, 0x50, 0xCE, 0xFA, - 0x9B, 0xBD, 0x5B, 0xB0, 0xB7, 0x0F, 0x70, 0x75, 0x0A, 0x5D, 0xFC, 0x69, 0xB3, 0x07, 0x11, 0x9B, - 0xE8, 0x13, 0x0D, 0xBF, 0x08, 0x33, 0x59, 0x20, 0x4A, 0xBD, 0x27, 0x76, 0xED, 0xF2, 0x36, 0x0B, - 0xEA, 0xBC, 0x78, 0x17, 0xBD, 0x6E, 0x4F, 0x37, 0xD3, 0x26, 0x86, 0x85, 0xB1, 0x71, 0xEA, 0x55, - 0x73, 0xAA, 0x7C, 0xA2, 0x36, 0x75, 0xD2, 0xCD, 0xE4, 0xFC, 0xE7, 0xCE, 0x5E, 0xB1, 0xE5, 0xF4, - 0x65, 0xD7, 0x8F, 0x34, 0x07, 0x66, 0xA7, 0x4B, 0xCE, 0x55, 0xB0, 0x71, 0xFD, 0x20, 0x03, 0x5C, - 0xBA, 0x28, 0x0B, 0x71, 0x4D, 0x93, 0xB9, 0x77, 0x5E, 0x46, 0x6A, 0xCB, 0xD7, 0x0A, 0x59, 0x2E, - 0x26, 0x49, 0x0A, 0x36, 0x0F, 0x03, 0x6F, 0x32, 0xD7, 0xF0, 0xEC, 0x53, 0xF6, 0x0B, 0x1E, 0x08, - 0x27, 0x37, 0x69, 0xC5, 0x9F, 0x6C, 0x76, 0x27, 0x4C, 0x7A, 0x7C, 0xB7, 0xC8, 0x1B, 0xC4, 0x79, - 0xA1, 0xE3, 0xE0, 0xF3, 0x3B, 0x20, 0x07, 0x0C, 0xE4, 0xAB, 0x10, 0x6F, 0xA4, 0xFA, 0x7F, 0x08, - 0x6F, 0x5C, 0xAE, 0x06, 0xC5, 0x6D, 0x09, 0x1E, 0x2D, 0xDD, 0x80, 0xA7, 0x7B, 0x9E, 0xE6, 0x44, - 0x79, 0x3D, 0x55, 0x12, 0x51, 0x87, 0x4D, 0x4A, 0x66, 0x32, 0x2D, 0x4E, 0x17, 0x30, 0xAF, 0x77, - 0x7A, 0x8B, 0x44, 0x8D, 0xA4, 0xF8, 0x70, 0xC1, 0x99, 0x55, 0x3D, 0x4B, 0x08, 0x40, 0x2F, 0xA2, - 0xEA, 0xAA, 0x94, 0x24, 0xC3, 0xBD, 0x5C, 0x68, 0x35, 0x8D, 0x71, 0xA8, 0x3E, 0xBA, 0x00, 0x70, - 0x28, 0xB8, 0x10, 0x20, 0x8F, 0x5C, 0xE4, 0xC4, 0xBB, 0x22, 0x59, 0xA2, 0x35, 0x5F, 0x7A, 0x3D, - 0xF1, 0x24, 0x70, 0x1C, 0xE3, 0x3E, 0xED, 0x26, 0x07, 0xD7, 0x82, 0x4B, 0x80, 0x3B, 0x0C, 0xE4, - 0xAB, 0xCF, 0x71, 0x97, 0x87, 0x22, 0x2B, 0x53, 0x27, 0x99, 0x29, 0x10, 0x41, 0x30, 0xE8, 0x28, - 0xD2, 0x48, 0xAC, 0x25, 0x40, 0xBF, 0xDB, 0xED, 0x3A, 0xF4, 0x5D, 0x6E, 0x66, 0x1A, 0x08, 0xFF, - 0xEE, 0x49, 0x36, 0xD7, 0x68, 0x1E, 0xD7, 0xAB, 0xEC, 0xD6, 0x84, 0x1C, 0x8D, 0x35, 0x2D, 0x10, - 0x3C, 0x9C, 0x77, 0x12, 0xB3, 0x09, 0x5F, 0x0B, 0x2A, 0xB3, 0xCF, 0x8E, 0xE0, 0xF1, 0xAA, 0x71, - 0xB1, 0xE3, 0x58, 0x5C, 0xFF, 0xD1, 0x34, 0xE0, 0xBF, 0x20, 0x6D, 0x42, 0x86, 0xCA, 0x97, 0x1B, - 0x76, 0x2F, 0x08, 0x29, 0xEC, 0xD5, 0xDD, 0x04, 0x36, 0xFC, 0xCA, 0x39, 0xBE, 0x28, 0x8C, 0x1F, - 0x0D, 0x56, 0x77, 0xB7, 0xE0, 0x23, 0x41, 0x1E, 0xB4, 0x29, 0x17, 0x7A, 0xAF, 0xF9, 0x30, 0xCF, - 0xF1, 0xFE, 0xF4, 0x62, 0x32, 0xD9, 0xDB, 0x56, 0x9A, 0x2B, 0x31, 0xBF, 0xA5, 0x15, 0x19, 0x1E, - 0xEA, 0xCB, 0x5D, 0x6B, 0x65, 0x9A, 0x06, 0x1F, 0x9C, 0x0E, 0xC0, 0x5D, 0x8C, 0xFB, 0xD5, 0xCF, - 0xA4, 0x18, 0xA1, 0x0C, 0xAD, 0xD3, 0x98, 0x09, 0x3A, 0x86, 0x7F, 0x1C, 0x60, 0xC9, 0xFB, 0x42, - 0xF2, 0x37, 0x4E, 0xF0, 0x91, 0x02, 0x33, 0x41, 0xDE, 0xDB, 0xF8, 0x8E, 0x44, 0x00, 0xC5, 0x94, - 0x21, 0x39, 0x91, 0x0A, 0xB5, 0xC4, 0x44, 0xAC, 0x04, 0xF8, 0xB7, 0xA1, 0x13, 0x70, 0xA7, 0xEF, - 0x23, 0xBD, 0xF6, 0x12, 0x34, 0x30, 0x3A, 0x70, 0x81, 0x21, 0xE7, 0x66, 0xB8, 0x55, 0x00, 0xAF, - 0xC1, 0xC3, 0x56, 0x3D, 0xAB, 0x3D, 0xCA, 0x16, 0x4F, 0x6B, 0x3E, 0x69, 0xEF, 0xF8, 0xCA, 0x7B, - 0x65, 0x1C, 0xF3, 0xD9, 0xE8, 0xB0, 0xF6, 0xF3, 0x18, 0x9E, 0xDF, 0x45, 0xC7, 0xAF, 0xCE, 0xC8, - 0x5E, 0x51, 0x94, 0x76, 0x23, 0x80, 0xF8, 0x49, 0x9B, 0xB9, 0x7C, 0x2F, 0x3C, 0xE6, 0xB5, 0x2F, - 0xAD, 0xCC, 0xE7, 0xE7, 0x1E, 0x08, 0xBF, 0xFA, 0x70, 0x2C, 0xB3, 0xED, 0x0C, 0x29, 0x7D, 0xB0, - 0xBE, 0xE7, 0x91, 0x39, 0x73, 0xC2, 0x80, 0x77, 0x2F, 0x91, 0x1D, 0x2F, 0x45, 0x1E, 0x41, 0xE4, - 0x45, 0x2A, 0x7E, 0x93, 0xCE, 0x6D, 0x65, 0x18, 0x76, 0x61, 0x15, 0x05, 0x24, 0x0E, 0x65, 0xD6, - 0x19, 0x7A, 0xFF, 0x02, 0x94, 0xFB, 0x2D, 0x14, 0xE4, 0xA3, 0x9C, 0xFC, 0x48, 0x29, 0x3A, 0x7F, - 0x36, 0x4F, 0x18, 0xD5, 0x5B, 0x99, 0x4C, 0x97, 0x20, 0x36, 0x77, 0xA6, 0x75, 0xE3, 0x44, 0x92, - 0x47, 0x72, 0xEA, 0x1D, 0x00, 0x5A, 0x1D, 0xAF, 0x12, 0xAC, 0x26, 0xE9, 0x1E, 0x4C, 0x89, 0xCC, - 0x56, 0x01, 0x22, 0x4D, 0x45, 0x44, 0xAC, 0xB6, 0x75, 0xEF, 0x3F, 0x2B, 0x35, 0xC6, 0x06, 0x12, - 0xF6, 0xDB, 0xF1, 0x55, 0xF7, 0x05, 0xB0, 0xC0, 0x16, 0x13, 0x60, 0xAA, 0x01, 0x68, 0x1A, 0xCF, - 0xA3, 0xDE, 0xC2, 0xED, 0x60, 0xB9, 0x38, 0x0A, 0x78, 0x7C, 0x5A, 0x96, 0x70, 0x3E, 0x1E, 0xDC, - 0xCD, 0x80, 0xDE, 0x5B, 0x63, 0x94, 0x01, 0x9D, 0x68, 0x02, 0xB9, 0x64, 0xBC, 0x89, 0xCA, 0xB4, - 0x12, 0xD7, 0x5E, 0x20, 0xC7, 0xBD, 0x39, 0x21, 0xAD, 0x74, 0x3A, 0x04, 0x8F, 0x5F, 0xE2, 0x55, - 0xE2, 0xA4, 0x8F, 0xE0, 0xFB, 0x9D, 0xBD, 0x67, 0xCF, 0xD8, 0x93, 0x6C, 0x84, 0xE7, 0xB6, 0xCE, - 0xBD, 0x7B, 0xDA, 0x93, 0x18, 0x70, 0x6B, 0x48, 0xBA, 0x0E, 0x66, 0x09, 0x2E, 0x91, 0x55, 0x38, - 0x84, 0x02, 0x18, 0x1D, 0x49, 0xDE, 0x25, 0xB3, 0x7E, 0xE8, 0xD0, 0x6E, 0xDD, 0x13, 0x8F, 0xA4, - 0x95, 0x17, 0x01, 0x0D, 0x93, 0xB0, 0xD8, 0xBD, 0x0C, 0xCA, 0x48, 0x62, 0xFA, 0xF5, 0xEA, 0xC5, - 0x71, 0x21, 0x00, 0xEC, 0x3A, 0x88, 0x26, 0xA1, 0x52, 0xBA, 0xBF, 0x2A, 0x70, 0xEB, 0xF7, 0x2B, - 0x43, 0xF4, 0xF6, 0xE3, 0xD0, 0x63, 0x1A, 0xA1, 0x0C, 0x00, 0xFE, 0xF9, 0x12, 0xE1, 0xED, 0x2A, - 0xFD, 0x19, 0x4E, 0x51, 0x22, 0xA0, 0x4C, 0x09, 0x2F, 0x0B, 0x8A, 0x57, 0xFA, 0x3E, 0xF3, 0x02, - 0xE3, 0xF0, 0x8F, 0x17, 0x6E, 0xC1, 0x45, 0x34, 0x95, 0x61, 0x22, 0x9E, 0x72, 0xA9, 0x50, 0x77, - 0x07, 0x64, 0xEE, 0x52, 0x03, 0x10, 0xBA, 0x09, 0xF9, 0x45, 0x29, 0x58, 0x46, 0x24, 0xE7, 0x0F, - 0x21, 0xE0, 0xC8, 0xC8, 0x69, 0xCB, 0x4C, 0xD8, 0x39, 0x0E, 0x0C, 0x24, 0x68, 0x46, 0x1E, 0xD9, - 0x7A, 0x8C, 0xB2, 0x91, 0xF4, 0x1B, 0x96, 0xDE, 0x63, 0xFF, 0xE7, 0xCB, 0x86, 0x9F, 0xCD, 0xFB, - 0xBF, 0x67, 0xBE, 0x46, 0xF7, 0x0E, 0x1F, 0x1D, 0x77, 0x4F, 0x66, 0x4F, 0x4F, 0x09, 0x4E, 0x79, - 0x33, 0x80, 0x66, 0xA5, 0xD0, 0x47, 0xAD, 0x50, 0x3D, 0x45, 0xE5, 0x15, 0xCB, 0x05, 0xA9, 0xC8, - 0xFB, 0x0F, 0x00, 0xB6, 0x9F, 0xF7, 0xC2, 0x1B, 0x15, 0x2B, 0xD1, 0x01, 0xA2, 0x5A, 0xFB, 0x26, - 0x3D, 0x9E, 0xAC, 0x37, 0x2C, 0x0B, 0x3A, 0xD3, 0xE8, 0x99, 0xAF, 0xB0, 0x12, 0x17, 0x06, 0x0C, - 0x7B, 0xF1, 0x6D, 0xB5, 0x8D, 0x18, 0xE4, 0x32, 0x3F, 0x51, 0xC2, 0x20, 0x20, 0xC6, 0x47, 0x22, - 0x08, 0x94, 0x32, 0x99, 0x17, 0x4A, 0x50, 0x36, 0x1E, 0xA2, 0x88, 0xCE, 0x01, 0xAF, 0x78, 0xF5, - 0x6B, 0xF2, 0xA2, 0x0C, 0x8E, 0xC5, 0xE4, 0x31, 0x9C, 0x28, 0xA4, 0x7F, 0x4E, 0x64, 0x1D, 0xF5, - 0xC1, 0x1A, 0x68, 0xE2, 0xF4, 0x3A, 0x99, 0xBC, 0xD3, 0x31, 0xF9, 0xD8, 0x58, 0x7B, 0xB1, 0xB7, - 0x7D, 0x57, 0x2B, 0x7D, 0xAC, 0x4A, 0x43, 0x9E, 0xB2, 0x50, 0x96, 0x06, 0x99, 0x17, 0x89, 0x6A, - 0xA7, 0x2E, 0xC2, 0xB9, 0xA2, 0xBB, 0x96, 0xD4, 0x03, 0xD5, 0xF2, 0xB4, 0xA7, 0x78, 0xE6, 0x65, - 0x31, 0xD2, 0x43, 0x75, 0x4A, 0xD1, 0xB5, 0xE6, 0x07, 0x98, 0x27, 0xAA, 0xBD, 0xCD, 0x32, 0xF1, - 0x80, 0xCE, 0x9E, 0xCD, 0xF2, 0xA1, 0x50, 0xD0, 0x88, 0x02, 0xF0, 0x1C, 0x10, 0x70, 0xAA, 0xA5, - 0xDF, 0x70, 0x32, 0x7E, 0x89, 0xAE, 0x51, 0x37, 0x84, 0x13, 0x18, 0xCE, 0x7D, 0x4C, 0x8A, 0x16, - 0x99, 0xA2, 0x42, 0x9D, 0x5D, 0x9C, 0x81, 0x86, 0x4D, 0x15, 0x96, 0xF0, 0xE6, 0xE1, 0x38, 0x11, - 0xA6, 0x8A, 0x15, 0x14, 0xF7, 0x13, 0xAD, 0x33, 0x81, 0xB5, 0xF4, 0x65, 0x87, 0x87, 0x6F, 0x97, - 0x2F, 0x5D, 0xED, 0xEC, 0xA7, 0xB6, 0x91, 0xE2, 0xF3, 0x7B, 0xE5, 0xC8, 0x7E, 0x3A, 0x26, 0x54, - 0x9C, 0xC3, 0xD3, 0x6C, 0x4B, 0x6A, 0x78, 0x48, 0xF3, 0x0E, 0xCF, 0xBF, 0x9A, 0xC8, 0x60, 0x46, - 0x0B, 0x6C, 0x92, 0x6B, 0x88, 0x6F, 0x42, 0x39, 0xB0, 0xC2, 0x43, 0x8D, 0xA6, 0x4A, 0xF8, 0xF5, - 0x1E, 0x23, 0x74, 0xF7, 0x15, 0xB2, 0x15, 0xEB, 0x5A, 0x2A, 0xCA, 0xA5, 0x2C, 0xCC, 0x3C, 0x7D, - 0x63, 0x65, 0x7F, 0x3A, 0xA8, 0x35, 0xB0, 0x77, 0x54, 0x1A, 0xCB, 0xA5, 0x07, 0x1E, 0x2C, 0x60, - 0x3C, 0x66, 0x32, 0x55, 0x75, 0xEB, 0x57, 0x35, 0xE2, 0xD3, 0xC2, 0x73, 0x5D, 0xF7, 0xC2, 0xB6, - 0xEE, 0x45, 0x1C, 0x19, 0xE6, 0xF9, 0x23, 0x24, 0x23, 0xBA, 0x77, 0x6B, 0x93, 0x73, 0xA0, 0x9C, - 0xF9, 0xF0, 0x59, 0xE7, 0xB4, 0x60, 0xC3, 0xA6, 0x01, 0xEA, 0xC7, 0x52, 0x2B, 0xDC, 0xDC, 0x96, - 0x0F, 0x3C, 0xB0, 0x19, 0x19, 0xE1, 0x52, 0xB6, 0x17, 0x91, 0x2A, 0x4D, 0xC3, 0xFC, 0x44, 0x33, - 0x5F, 0x9D, 0x36, 0x51, 0x3C, 0x02, 0x6D, 0x68, 0x23, 0x64, 0x1B, 0xA0, 0xA3, 0xD7, 0xEA, 0x64, - 0x60, 0xB9, 0xEB, 0xC5, 0x3F, 0xB5, 0x52, 0xC8, 0xC4, 0xC8, 0x73, 0x36, 0x73, 0x28, 0x67, 0xF1, - 0x2A, 0x3C, 0xA6, 0x8A, 0xDB, 0x99, 0x81, 0x90, 0xDF, 0xD7, 0x4C, 0x1F, 0xD1, 0xD9, 0x0D, 0xCE, - 0x6C, 0xD8, 0x8A, 0x03, 0xB4, 0x70, 0x3A, 0x07, 0x2E, 0x2E, 0x5E, 0xA5, 0x5C, 0xBF, 0x51, 0x36, - 0x97, 0x42, 0xA5, 0x76, 0x2A, 0xCA, 0x0A, 0x51, 0x5D, 0x06, 0x78, 0x0E, 0xCF, 0x9E, 0x93, 0x59, - 0x5C, 0x17, 0x05, 0xB6, 0xF2, 0x0D, 0x02, 0xD6, 0x2D, 0x2E, 0x20, 0x62, 0x8D, 0xF7, 0x38, 0xE0, - 0xC1, 0x5E, 0x17, 0x72, 0x4D, 0xA4, 0x2F, 0x5B, 0xDC, 0xC6, 0x40, 0x82, 0x34, 0x04, 0x39, 0x69, - 0xF8, 0xBC, 0xB1, 0x79, 0x54, 0xD5, 0x1E, 0x2D, 0xD8, 0x8C, 0x90, 0x8D, 0xB4, 0xE3, 0x61, 0xB7, - 0x1D, 0xA2, 0x3C, 0xFB, 0x6A, 0x38, 0x98, 0x06, 0xDA, 0x56, 0x2C, 0xBF, 0x9B, 0x14, 0x76, 0xE6, - 0x3C, 0x01, 0x57, 0xCC, 0xC2, 0x08, 0x0C, 0xBC, 0x10, 0x09, 0x67, 0xAB, 0x01, 0x2A, 0x32, 0x6C, - 0x81, 0x2C, 0xAB, 0xD3, 0xEC, 0x7D, 0x87, 0x48, 0x16, 0x28, 0xAC, 0x1D, 0x61, 0x11, 0x31, 0x87, - 0xD6, 0x2B, 0xB0, 0x36, 0xB1, 0x18, 0xDD, 0xE7, 0xD0, 0x46, 0x57, 0x93, 0xFC, 0xDF, 0xD2, 0x3A, - 0x37, 0x49, 0x42, 0xDB, 0xE6, 0x45, 0x46, 0x22, 0xB0, 0xF2, 0x92, 0xEE, 0x52, 0x94, 0x9F, 0xFE, - 0xB1, 0xD2, 0x33, 0x45, 0xAD, 0xC9, 0x6D, 0x11, 0x79, 0x57, 0xF1, 0x80, 0xF4, 0x07, 0xAE, 0xDF, - 0x11, 0x6C, 0x85, 0x58, 0x49, 0x2F, 0x13, 0x81, 0xB9, 0x66, 0x73, 0xAB, 0x84, 0x94, 0x36, 0xC4, - 0xC6, 0x23, 0x5F, 0xC5, 0x36, 0xC6, 0xBE, 0x8E, 0x6B, 0xE9, 0x97, 0xF0, 0xAC, 0xB4, 0xF1, 0x11, - 0x43, 0xB4, 0xD2, 0xC0, 0x79, 0x5E, 0x88, 0x72, 0xC7, 0x46, 0x6B, 0x22, 0xC7, 0xF2, 0x7B, 0x61, - 0xC8, 0xFA, 0x39, 0x65, 0x45, 0x97, 0xF0, 0xC7, 0xCE, 0x74, 0x09, 0x9F, 0x5D, 0xB7, 0x68, 0xF2, - 0x2E, 0x6E, 0x2D, 0x42, 0x56, 0x9C, 0xED, 0xC5, 0x5A, 0x57, 0xD9, 0x53, 0x5A, 0xB4, 0xE8, 0x15, - 0x07, 0x1B, 0xFB, 0x31, 0x40, 0x14, 0x95, 0x77, 0x33, 0x74, 0x71, 0x73, 0x7B, 0xFA, 0xA7, 0xBF, - 0x51, 0xF8, 0x3D, 0xE6, 0xB1, 0xD0, 0x42, 0x25, 0x52, 0xFC, 0x4F, 0x1A, 0xA6, 0x4D, 0xAF, 0xCD, - 0x13, 0x62, 0x7A, 0xBF, 0x22, 0x98, 0xD6, 0x07, 0x9C, 0xAE, 0x5E, 0xFC, 0x96, 0xEC, 0x0E, 0x79, - 0x84, 0x1F, 0x73, 0x60, 0x6C, 0x02, 0x6C, 0xE5, 0xB7, 0xFD, 0x7A, 0x4B, 0x8D, 0x0D, 0xC0, 0xD7, - 0x0A, 0x70, 0x6E, 0xE1, 0x51, 0x0E, 0x8C, 0xAA, 0x02, 0x6A, 0xCF, 0x61, 0x04, 0xBD, 0x53, 0x9D, - 0xE0, 0xB5, 0x28, 0x1E, 0x24, 0xBA, 0x97, 0x13, 0x0C, 0x6E, 0x93, 0x71, 0xE2, 0x68, 0xEC, 0x73, - 0x2C, 0xEC, 0x80, 0xB2, 0x16, 0xD5, 0x38, 0xC6, 0x3B, 0xCE, 0xEB, 0xB9, 0x42, 0xBE, 0x37, 0xB5, - 0x39, 0x31, 0x00, 0x5F, 0xB6, 0xD1, 0xB6, 0xD9, 0x57, 0x34, 0x82, 0x12, 0x07, 0x05, 0x04, 0x4B, - 0x5E, 0xB8, 0xC7, 0x6F, 0xA3, 0x01, 0xB9, 0x1D, 0xFF, 0x5F, 0x52, 0xBF, 0x6E, 0x7B, 0xA8, 0xC3, - 0x6E, 0xAC, 0x00, 0xCD, 0x0A, 0xAB, 0x7D, 0x4E, 0x63, 0x43, 0xCE, 0x10, 0x21, 0x38, 0x42, 0x88, - 0x8D, 0xA7, 0x46, 0x7F, 0x74, 0x1F, 0x1D, 0x5F, 0x25, 0xD2, 0xC0, 0x18, 0x7D, 0x40, 0x61, 0x36, - 0x06, 0xB5, 0x09, 0xCA, 0xC6, 0xAD, 0xD6, 0x9E, 0xED, 0x45, 0xF6, 0x95, 0x32, 0x07, 0x84, 0x71, - 0xC8, 0x35, 0xB0, 0x81, 0x97, 0xC9, 0x60, 0xDE, 0xFD, 0x8E, 0x90, 0x67, 0xD7, 0x23, 0x51, 0x28, - 0x90, 0xA5, 0x6E, 0xB6, 0x59, 0x88, 0xD1, 0x8D, 0xCD, 0x17, 0xA3, 0x48, 0xE3, 0x3F, 0x00, 0x4E, - 0x9B, 0x21, 0xD5, 0xA4, 0x5A, 0xF0, 0xA0, 0xBA, 0x40, 0xB7, 0xBB, 0xE1, 0x3D, 0x16, 0x9E, 0xEE, - 0xBB, 0x9E, 0xB2, 0x91, 0xBD, 0x39, 0x77, 0xD6, 0xB5, 0x9C, 0xB5, 0xE8, 0xCF, 0x7D, 0x8C, 0x83, - 0x82, 0x1A, 0xBA, 0x11, 0xDA, 0xF3, 0x96, 0xDD, 0x09, 0x20, 0x9F, 0xEB, 0xAE, 0x39, 0xAC, 0x7C, - 0xF2, 0x41, 0x98, 0x21, 0x6B, 0x8D, 0x19, 0xFF, 0x36, 0x5E, 0x82, 0xAC, 0xEE, 0x1E, 0x0E, 0x77, - 0x63, 0x14, 0x4E, 0x87, 0xE8, 0x22, 0x01, 0xD4, 0xC4, 0xF3, 0xE6, 0x49, 0xE6, 0x25, 0x64, 0x5C, - 0x54, 0x4B, 0x10, 0xE7, 0xCD, 0x17, 0x8F, 0xFA, 0xA3, 0x4D, 0xCA, 0x49, 0xCA, 0x4D, 0x33, 0xBC, - 0x29, 0x71, 0x4D, 0xF9, 0x0D, 0x74, 0x01, 0xAC, 0x79, 0xA7, 0xD7, 0x75, 0xD3, 0x9B, 0x04, 0xEE, - 0xCB, 0xCD, 0x51, 0xCC, 0xAA, 0x68, 0xFB, 0x41, 0xD3, 0x2D, 0xC1, 0xC8, 0x72, 0xDC, 0x69, 0xBE, - 0x0A, 0x74, 0xFF, 0xA8, 0x0C, 0xB4, 0xE1, 0x1A, 0xD3, 0x30, 0x21, 0xA9, 0x34, 0xCC, 0xB5, 0xE9, - 0xCF, 0x38, 0x48, 0x3B, 0xFC, 0xD6, 0x88, 0xD8, 0xB7, 0x3D, 0x71, 0xE4, 0x36, 0xA2, 0xE6, 0x03, - 0x02, 0xE3, 0xFB, 0x68, 0x0F, 0x07, 0x3B, 0x80, 0x30, 0x1C, 0xF4, 0x88, 0x0D, 0x86, 0x1F, 0x83, - 0x4D, 0x93, 0xD4, 0x10, 0xB1, 0xFF, 0x2C, 0xCB, 0xBE, 0x8E, 0xA8, 0xDB, 0x09, 0xE5, 0xF7, 0x9C, - 0x82, 0x48, 0xE0, 0xC8, 0x2C, 0x7B, 0xA1, 0x46, 0x89, 0xE9, 0x0D, 0x82, 0x6F, 0xC1, 0xEA, 0xA5, - 0x84, 0x82, 0x33, 0x26, 0x4A, 0xB6, 0x84, 0x60, 0x21, 0x00, 0x89, 0x20, 0x84, 0x14, 0x7A, 0xDF, - 0x7B, 0xEB, 0x45, 0x6B, 0x76, 0xE6, 0xDB, 0x53, 0xBE, 0x6A, 0x95, 0xE1, 0xFE, 0x6A, 0x79, 0x07, - 0xBC, 0x9D, 0xB3, 0x37, 0x67, 0xAF, 0xC2, 0x1E, 0x2B, 0xFF, 0x9F, 0xC5, 0xF5, 0x54, 0xE0, 0x29, - 0x44, 0xA4, 0x2A, 0x6F, 0xB7, 0x52, 0x17, 0x2C, 0xB1, 0x72, 0x6E, 0x9F, 0x30, 0x9D, 0x42, 0x41, - 0xF6, 0xD5, 0x14, 0x3E, 0x32, 0x59, 0x42, 0xAD, 0x7A, 0x68, 0x53, 0xF9, 0x99, 0xFD, 0x30, 0xC0, - 0x68, 0xB6, 0x97, 0xD9, 0x1B, 0x9A, 0xF6, 0xB9, 0x06, 0xE2, 0x2E, 0x27, 0x60, 0xE9, 0x1A, 0xBD, - 0x88, 0xCD, 0xAD, 0xE0, 0xCB, 0xED, 0x76, 0x2B, 0x46, 0x24, 0xB0, 0x48, 0xBA, 0x55, 0x9B, 0xBD, - 0x6D, 0xF2, 0xF7, 0x8C, 0x59, 0x4E, 0xB6, 0xE4, 0x89, 0xE1, 0xD4, 0x97, 0x85, 0x15, 0x27, 0xAE, - 0xD0, 0x9A, 0x72, 0x98, 0xB0, 0x6F, 0x06, 0xB9, 0xFC, 0xFD, 0x0D, 0x51, 0x11, 0x7E, 0x02, 0x66, - 0xD2, 0xE7, 0x25, 0xD4, 0x4D, 0xAE, 0x78, 0x9F, 0x8E, 0x69, 0xDD, 0x43, 0x80, 0x2F, 0xE6, 0x6E, - 0x46, 0xD7, 0x1A, 0x05, 0x8F, 0x4B, 0x5E, 0xF7, 0x4E, 0x09, 0x9B, 0xAF, 0x4E, 0x2B, 0x14, 0x91, - 0x59, 0x67, 0xFF, 0xFF, 0xAA, 0x08, 0xE7, 0x25, 0x42, 0x4E, 0x17, 0xD6, 0xDF, 0xD8, 0x23, 0x45, - 0xB4, 0xE2, 0x15, 0xE8, 0xDB, 0xA8, 0x55, 0x81, 0x9B, 0xE3, 0x3F, 0x09, 0x0C, 0x16, 0x19, 0xE6, - 0xE3, 0x7F, 0x1D, 0xB6, 0xBB, 0x14, 0x3C, 0x58, 0xBB, 0x69, 0x5F, 0x7A, 0x1A, 0x51, 0x45, 0xEE, - 0xDB, 0xA5, 0x7F, 0x53, 0x27, 0x04, 0xA0, 0x60, 0x76, 0x7A, 0xAD, 0x29, 0x7A, 0x8B, 0x49, 0x4C, - 0x6D, 0x26, 0x01, 0x45, 0x9B, 0x2F, 0xC8, 0x6B, 0xE0, 0x11, 0x1E, 0xCE, 0x35, 0x18, 0xDA, 0x6A, - 0x7E, 0x14, 0x56, 0xFB, 0x19, 0xE2, 0xBC, 0xAF, 0xE9, 0x62, 0xF9, 0xD4, 0xB7, 0x21, 0x1D, 0x45, - 0x10, 0xB7, 0xF3, 0x10, 0x80, 0xD0, 0xA9, 0x20, 0x12, 0xFB, 0xFA, 0xB9, 0xF6, 0x9B, 0x32, 0xA9, - 0x68, 0x58, 0xD9, 0x97, 0xDD, 0x4D, 0xDB, 0x67, 0x95, 0x35, 0xFE, 0xFA, 0x9A, 0xB2, 0x8D, 0x39, - 0x32, 0xD0, 0x5F, 0x6E, 0x74, 0x62, 0x3F, 0xC0, 0xC9, 0x24, 0x49, 0xC9, 0x65, 0x27, 0x88, 0x52, - 0x60, 0xBB, 0x6B, 0x52, 0xAC, 0x35, 0x90, 0x47, 0xF8, 0x34, 0xF4, 0x8E, 0x9E, 0x43, 0xE6, 0x28, - 0xA5, 0x04, 0xA9, 0x10, 0x09, 0x4F, 0xE0, 0x2E, 0x3E, 0x12, 0xD9, 0xC3, 0xC3, 0xF0, 0xAB, 0x30, - 0x18, 0x13, 0x6C, 0x17, 0x06, 0x2C, 0x03, 0x60, 0x04, 0x5D, 0x0E, 0xC8, 0x7F, 0x80, 0x4B, 0xAD, - 0xAF, 0x34, 0x2B, 0xDC, 0x94, 0x1F, 0x68, 0x0A, 0xAB, 0xA3, 0xD7, 0x19, 0x23, 0x02, 0x8F, 0xBD, - 0xB9, 0x33, 0xD3, 0x93, 0x66, 0xC9, 0x19, 0x18, 0xEF, 0x08, 0x0C, 0xEE, 0xDB, 0xB3, 0x5E, 0x55, - 0xB2, 0xDC, 0xBB, 0x90, 0x02, 0x2B, 0x90, 0x67, 0x41, 0x3E, 0x65, 0xA0, 0x9B, 0xC4, 0x5D, 0x81, - 0xDC, 0x64, 0x82, 0xA9, 0x86, 0xA7, 0xB1, 0x1C, 0x6C, 0x7B, 0xA2, 0x07, 0xF1, 0xE0, 0x8E, 0x4F, - 0xBF, 0x07, 0x20, 0x48, 0x05, 0xE5, 0x1D, 0xB6, 0xD8, 0x83, 0x45, 0x7C, 0xAD, 0x84, 0x32, 0x94, - 0xCA, 0x88, 0x96, 0xAA, 0x07, 0xE8, 0x7B, 0x0A, 0x89, 0x46, 0x98, 0x2F, 0x93, 0x65, 0xEB, 0x7B, - 0x79, 0x50, 0x8C, 0x8D, 0x01, 0x6D, 0xCE, 0xB4, 0x5E, 0x1E, 0x74, 0x6D, 0xC3, 0x29, 0x0B, 0x34, - 0xB6, 0xB8, 0xE7, 0x9C, 0x2D, 0x71, 0x49, 0x65, 0x07, 0x1A, 0x7D, 0x04, 0x74, 0x42, 0xD7, 0x0D, - 0x96, 0x80, 0x85, 0xFC, 0x5D, 0x29, 0x79, 0x54, 0x8F, 0x08, 0x2A, 0x7F, 0xF2, 0xB8, 0x87, 0x13, - 0x29, 0x6E, 0xC4, 0xB7, 0x99, 0xBB, 0xC5, 0x6C, 0x4D, 0x01, 0x38, 0xB5, 0xFF, 0x93, 0xEC, 0x0F, - 0x96, 0xA5, 0x47, 0x78, 0xD1, 0xC0, 0x63, 0x61, 0xE0, 0x2D, 0xE4, 0x56, 0x7C, 0xAC, 0x77, 0x30, - 0x21, 0x55, 0x32, 0xFD, 0x4E, 0xC0, 0x31, 0x9B, 0x7C, 0x37, 0x04, 0x8B, 0xAB, 0x95, 0x03, 0xAC, - 0x22, 0x9E, 0x1F, 0x86, 0x2A, 0xB5, 0xD9, 0x32, 0x56, 0xCC, 0x4E, 0xE5, 0x1A, 0x70, 0x65, 0x5B, - 0x32, 0xC7, 0x1D, 0x96, 0x73, 0x62, 0x49, 0xB3, 0xC5, 0xA1, 0x83, 0xEB, 0x32, 0x6B, 0x6E, 0x17, - 0xC2, 0xD2, 0xBA, 0x90, 0x3B, 0xB5, 0x99, 0x18, 0x34, 0x4D, 0x15, 0x57, 0x19, 0xCD, 0x3C, 0xE1, - 0xCF, 0x55, 0x4A, 0x44, 0xD0, 0xFD, 0xD1, 0x29, 0xB5, 0x86, 0xA1, 0xAA, 0xB0, 0x6C, 0x30, 0xEE, - 0x14, 0xC2, 0x9E, 0x02, 0x31, 0xDF, 0x13, 0x0D, 0xC6, 0xFA, 0x9F, 0xC1, 0x17, 0xF1, 0x52, 0x08, - 0x8B, 0xBB, 0x81, 0xB8, 0x92, 0x7B, 0x19, 0x0F, 0x5E, 0x7A, 0xDF, 0xEB, 0x86, 0x8C, 0x5F, 0x6C, - 0x7A, 0xE9, 0xF1, 0x26, 0x55, 0x80, 0xFF, 0xBC, 0x6A, 0x0A, 0xBC, 0x23, 0xAB, 0xE8, 0x8E, 0xC3, - 0xA5, 0xD7, 0xFD, 0x52, 0x73, 0x68, 0x4B, 0x56, 0x7F, 0x60, 0x4A, 0x68, 0x84, 0x30, 0xE1, 0x1F, - 0x0C, 0x10, 0x41, 0x71, 0xFC, 0x10, 0xDF, 0x62, 0xCC, 0x4D, 0xD6, 0x2A, 0x7F, 0xB9, 0xAF, 0x46, - 0x94, 0x3A, 0xD7, 0x0F, 0x12, 0x2C, 0xB8, 0x17, 0x1F, 0x56, 0xF3, 0xCD, 0xA0, 0xE7, 0xBF, 0xA4, - 0xFB, 0xC5, 0xE8, 0x17, 0x4B, 0x8A, 0xE5, 0x3E, 0x96, 0x22, 0x17, 0x07, 0xA3, 0x17, 0x0A, 0x77, - 0x98, 0xF8, 0x9B, 0x59, 0x5C, 0x2F, 0xC9, 0x73, 0xA4, 0x5A, 0x17, 0x1F, 0xBD, 0x56, 0x3E, 0xA2, - 0xE6, 0x8F, 0x34, 0xF2, 0xE0, 0x20, 0x37, 0xE4, 0x98, 0xE1, 0xEC, 0xC4, 0x1E, 0x81, 0x13, 0x17, - 0x21, 0x95, 0x88, 0x60, 0x04, 0xDA, 0x91, 0xB9, 0x22, 0xF8, 0x64, 0x87, 0x8D, 0x32, 0x60, 0x37, - 0x33, 0x2E, 0x2B, 0x95, 0x43, 0x0C, 0x10, 0xDF, 0xFC, 0x64, 0x56, 0x89, 0x32, 0x47, 0xA3, 0x8F, - 0xF1, 0x3E, 0x34, 0x63, 0x35, 0xD9, 0x41, 0xD8, 0x1A, 0x23, 0x88, 0x39, 0x6D, 0x23, 0x2A, 0x20, - 0xCE, 0xFB, 0x80, 0x0F, 0x59, 0xB7, 0xFB, 0x1E, 0x24, 0xF5, 0x8A, 0x78, 0x2B, 0xE8, 0x13, 0x52, - 0x34, 0x5B, 0x65, 0x64, 0xAB, 0x78, 0x4D, 0x5C, 0x79, 0x3B, 0xF2, 0x7D, 0x1F, 0x5B, 0xA9, 0x37, - 0xAE, 0x4C, 0x9E, 0x30, 0x6B, 0x39, 0x3D, 0x75, 0x06, 0xCE, 0xFE, 0x87, 0xB7, 0x1B, 0x9C, 0x9F, - 0x44, 0x7E, 0x98, 0xFF, 0x3B, 0xA6, 0x71, 0x48, 0xE3, 0x07, 0x8C, 0x5E, 0x95, 0x96, 0x04, 0xC1, - 0xBF, 0x7A, 0x18, 0x06, 0xC2, 0xD2, 0x24, 0xD6, 0xC9, 0x4D, 0x65, 0xCE, 0x18, 0x8F, 0x8B, 0x0D, - 0xFC, 0x66, 0x40, 0xB1, 0xE6, 0xE5, 0xC5, 0xDE, 0xAE, 0x2E, 0x84, 0x3F, 0xBA, 0x16, 0x5A, 0x63, - 0x72, 0x0F, 0x3C, 0x82, 0x4A, 0xD7, 0x54, 0x54, 0x60, 0x1B, 0x6A, 0x16, 0x2D, 0xDA, 0x0F, 0xF9, - 0x61, 0xD2, 0x53, 0x2B, 0xE4, 0x22, 0x0E, 0x1D, 0x08, 0x69, 0x5D, 0x4D, 0x4D, 0x3E, 0x99, 0xBE, - 0x8A, 0x83, 0xA2, 0x5A, 0x68, 0x8B, 0xBB, 0x6A, 0xA5, 0x31, 0xB9, 0x65, 0xA6, 0x55, 0xD1, 0x09, - 0x8D, 0x6B, 0xAB, 0xD8, 0xF1, 0x06, 0x62, 0xA8, 0x1A, 0xDA, 0xA4, 0x4B, 0x68, 0xA9, 0xB8, 0xA5, - 0x9D, 0xD1, 0xAA, 0x42, 0x8E, 0x67, 0xA8, 0xC6, 0x29, 0x94, 0x69, 0x38, 0xA0, 0x66, 0x84, 0xBB, - 0x73, 0x3B, 0xFC, 0x7D, 0x6B, 0xCD, 0x39, 0x8F, 0x1C, 0x6C, 0xE0, 0x58, 0x97, 0x75, 0xB7, 0x09, - 0x40, 0x68, 0x45, 0xCD, 0x97, 0x78, 0x1A, 0x81, 0xA9, 0x6D, 0x6C, 0x59, 0xB8, 0x0C, 0x7D, 0x94, - 0x46, 0x23, 0xCC, 0xD4, 0x2D, 0x71, 0x95, 0x7F, 0x9F, 0x08, 0xE0, 0xE5, 0xF9, 0xC0, 0x2C, 0xC4, - 0x09, 0x27, 0x7C, 0x62, 0x5E, 0xF4, 0xB6, 0xAA, 0x9D, 0x18, 0x10, 0xCE, 0xCB, 0xCA, 0xFC, 0xC2, - 0x12, 0x5A, 0xC2, 0xC7, 0xFA, 0x47, 0x3B, 0x4A, 0x5C, 0xC7, 0x52, 0xCA, 0x97, 0xD4, 0xC3, 0x90, - 0x1D, 0x04, 0x50, 0x92, 0xFF, 0xCC, 0xA9, 0x85, 0x4D, 0x1F, 0x73, 0xE3, 0x5B, 0x4D, 0x20, 0xCA, - 0x46, 0x89, 0xD5, 0x26, 0x2B, 0xF5, 0x6B, 0x2A, 0x0B, 0x9C, 0x36, 0x15, 0x9A, 0xB2, 0x15, 0xC1, - 0xAF, 0x38, 0x3D, 0xA5, 0x4B, 0x47, 0x56, 0x32, 0x90, 0x60, 0x93, 0x5D, 0x8C, 0xE4, 0x3D, 0x3A, - 0x00, 0xB2, 0x84, 0x92, 0xE7, 0x9C, 0x09, 0xD4, 0x55, 0x01, 0xFC, 0xFC, 0x3C, 0x0B, 0x6B, 0x0B, - 0xD4, 0x39, 0x7B, 0x88, 0x40, 0x08, 0xDE, 0x2D, 0xFC, 0x9E, 0xEF, 0xFE, 0xCA, 0x45, 0xB6, 0x8F, - 0xDD, 0x59, 0x49, 0x16, 0x9B, 0x26, 0x88, 0x7F, 0x83, 0xA0, 0x29, 0x14, 0xA6, 0x96, 0x51, 0x1D, - 0x36, 0xCF, 0x7D, 0x01, 0x2E, 0xC3, 0xC5, 0xC2, 0x49, 0xAB, 0x70, 0xAC, 0x66, 0x08, 0xA4, 0xB7, - 0xB5, 0x37, 0x34, 0xEB, 0xD1, 0xA1, 0x52, 0xB1, 0xF8, 0x1C, 0x88, 0x36, 0x32, 0x00, 0xA4, 0x5B, - 0x3B, 0x93, 0x34, 0x20, 0x5F, 0xA9, 0x9B, 0x1E, 0xA6, 0xF9, 0xFC, 0xC5, 0x34, 0x2E, 0x64, 0xCE, - 0x97, 0x44, 0x71, 0x0D, 0x09, 0x89, 0xF2, 0x68, 0x41, 0xF9, 0x64, 0xA0, 0xFC, 0xE2, 0x43, 0x14, - 0x77, 0xB1, 0x68, 0x2C, 0xE6, 0xCB, 0xD4, 0x82, 0xE0, 0xF1, 0x93, 0x00, 0x50, 0x9F, 0x14, 0x6F, - 0x78, 0xDC, 0x7B, 0xC2, 0xD6, 0x31, 0x29, 0x85, 0xA6, 0xEB, 0x50, 0xEC, 0xA6, 0xDD, 0xAA, 0x50, - 0x65, 0x94, 0xEE, 0x68, 0xC3, 0x11, 0xAA, 0xB7, 0xA7, 0xEE, 0xBB, 0x39, 0x08, 0xA6, 0xE8, 0xC5, - 0x4E, 0x52, 0x84, 0xDD, 0xE6, 0x16, 0xF5, 0xC3, 0xAC, 0xB0, 0xBE, 0x3F, 0xA0, 0xC9, 0x1F, 0x17, - 0xC0, 0x8D, 0x7C, 0x80, 0x27, 0xAE, 0xBB, 0x47, 0x32, 0x94, 0x01, 0xCB, 0x72, 0x12, 0xCB, 0x74, - 0x56, 0x58, 0x17, 0x30, 0x57, 0x6C, 0x94, 0x08, 0xD4, 0x60, 0x50, 0x41, 0x35, 0xAB, 0xBD, 0x0B, - 0xA7, 0x43, 0x1B, 0x53, 0x19, 0xBA, 0x05, 0x67, 0xAF, 0x4C, 0xAD, 0x76, 0xBA, 0x7D, 0x75, 0x8E, - 0x64, 0x0C, 0xDD, 0xFB, 0xD9, 0x84, 0x3F, 0xB0, 0x57, 0x4D, 0x8C, 0xA0, 0x0F, 0xD9, 0xE0, 0x53, - 0xB9, 0x1D, 0xAE, 0xE1, 0xCC, 0x9E, 0xD5, 0x79, 0xDA, 0xB4, 0x0C, 0x0B, 0xDD, 0x95, 0x28, 0xDD, - 0x7F, 0x73, 0x43, 0x83, 0xC5, 0x45, 0x14, 0x00, 0xBA, 0x00, 0x9C, 0xC0, 0xC8, 0x62, 0x34, 0x66, - 0xF9, 0x78, 0x57, 0x0B, 0x9F, 0x85, 0xEE, 0x49, 0xF6, 0xA9, 0x86, 0x05, 0x6B, 0x0E, 0x1F, 0x26, - 0xD0, 0xD9, 0xEB, 0xA8, 0x5B, 0x9B, 0xCD, 0x4E, 0x25, 0x07, 0xE1, 0xE0, 0x60, 0xA0, 0xFB, 0x17, - 0x7C, 0x41, 0xAA, 0x20, 0xFE, 0x83, 0x25, 0x3A, 0x9A, 0x02, 0x87, 0x0A, 0x71, 0x87, 0xE5, 0xD3, - 0xC1, 0xDC, 0x85, 0xC8, 0xFA, 0x71, 0x2A, 0xCF, 0xA1, 0xF7, 0x44, 0x13, 0x9C, 0x03, 0x56, 0xC3, - 0x7A, 0xEE, 0x51, 0x35, 0x3C, 0x27, 0x30, 0xF3, 0x3E, 0x31, 0x5F, 0x00, 0x51, 0xA7, 0x1C, 0x92, - 0xA4, 0xE1, 0xC3, 0x43, 0x12, 0x03, 0x3C, 0xEE, 0xD3, 0xFA, 0x1C, 0x6A, 0x0F, 0xE0, 0x45, 0xBB, - 0x3B, 0x81, 0xF1, 0x37, 0x46, 0x9C, 0x6E, 0x21, 0x74, 0xFA, 0x93, 0x52, 0xF4, 0x57, 0x95, 0x81, - 0xD3, 0x57, 0x44, 0x5E, 0xF0, 0x54, 0x18, 0x3C, 0xFB, 0x3A, 0xE7, 0x10, 0x67, 0xF2, 0x20, 0x24, - 0x09, 0xD2, 0x6D, 0xAB, 0xC2, 0xBA, 0x3C, 0x30, 0xE9, 0x65, 0xF1, 0x50, 0xFB, 0x11, 0xB6, 0xCF, - 0x85, 0x7B, 0x6A, 0x4A, 0x56, 0x59, 0x59, 0xB7, 0xDE, 0xFB, 0xC8, 0x39, 0x6A, 0x52, 0x6D, 0xE6, - 0xB7, 0xC7, 0x7A, 0x62, 0x01, 0x25, 0x3D, 0x54, 0x54, 0xB4, 0xF2, 0xBA, 0xF9, 0xEE, 0xE3, 0x59, - 0xD0, 0x74, 0xB5, 0xBF, 0xDF, 0x3E, 0x3F, 0x87, 0x64, 0x82, 0xD9, 0xD5, 0xF9, 0xE8, 0xBB, 0xC5, - 0xA5, 0x61, 0x91, 0x9C, 0x2C, 0x99, 0xC0, 0x39, 0xB3, 0xEF, 0x33, 0x5E, 0x3E, 0x1E, 0x00, 0xC6, - 0x5A, 0x90, 0x1C, 0x50, 0x43, 0x3D, 0x4B, 0xA1, 0x3F, 0x46, 0xEB, 0xBA, 0x86, 0xA4, 0xEA, 0xE1, - 0xA9, 0x40, 0x97, 0x5A, 0x80, 0x97, 0x36, 0x1C, 0xA8, 0x19, 0x4E, 0x0D, 0xF8, 0xCB, 0x1C, 0xC7, - 0xD4, 0x1C, 0xB1, 0x4C, 0x2E, 0xDB, 0x2D, 0x96, 0x1E, 0xBA, 0xEB, 0x3D, 0xDE, 0x7D, 0xC7, 0x2E, - 0xF8, 0x36, 0x54, 0x5C, 0x94, 0xD0, 0x5A, 0x0E, 0x5D, 0xF6, 0x4D, 0x35, 0xD2, 0xC1, 0x52, 0xC7, - 0x3B, 0x58, 0x43, 0xEB, 0xB6, 0x54, 0xBA, 0xA5, 0xF1, 0x86, 0xDB, 0x23, 0xAB, 0x6A, 0x42, 0x00, - 0x90, 0xD2, 0x0C, 0x76, 0x32, 0xA0, 0xC2, 0xE3, 0x10, 0x0E, 0x0C, 0x8A, 0x7C, 0xA5, 0x5F, 0xC9, - 0x4E, 0x79, 0x6E, 0x38, 0x0D, 0xA1, 0xD8, 0x7E, 0x90, 0xDD, 0xA4, 0x35, 0x33, 0xBF, 0xCE, 0x69, - 0x8F, 0x93, 0xBC, 0xB4, 0xC8, 0xD2, 0xD1, 0xD8, 0x2F, 0x31, 0xF8, 0x0B, 0x12, 0x8B, 0xA2, 0xAA, - 0x7B, 0x36, 0x5F, 0x66, 0x0D, 0xF6, 0x34, 0x0F, 0xA7, 0x6A, 0xF3, 0x52, 0x4A, 0xB3, 0xCE, 0x83, - 0xB5, 0x57, 0x11, 0x74, 0xBF, 0x1D, 0x5E, 0xA4, 0x18, 0x84, 0xC6, 0xE4, 0xAC, 0x42, 0x93, 0x82, - 0x99, 0xF1, 0x4B, 0xE2, 0x07, 0x0E, 0x0C, 0xAD, 0xC4, 0x7E, 0x24, 0xC7, 0xF9, 0x22, 0x34, 0x31, - 0x0B, 0xC9, 0xBF, 0xA8, 0x74, 0xE9, 0xDE, 0xE8, 0x61, 0xDC, 0xC2, 0x49, 0x95, 0x78, 0x6F, 0x2D, - 0x46, 0x76, 0xD8, 0x2F, 0xA9, 0x56, 0x00, 0x38, 0x74, 0x54, 0xBB, 0x66, 0xE5, 0x9B, 0xA1, 0xAB, - 0xE4, 0x1E, 0x46, 0x71, 0x90, 0xC1, 0xF8, 0x16, 0x8A, 0x8F, 0x76, 0xE6, 0x4F, 0x06, 0xE8, 0xE8, - 0xAA, 0x25, 0xF2, 0x75, 0x3A, 0x0D, 0xBD, 0xF6, 0x40, 0xEE, 0x64, 0xE0, 0xF4, 0xD5, 0xBB, 0x76, - 0x7A, 0x8B, 0x43, 0xD8, 0x75, 0xD3, 0xAF, 0x1A, 0xE7, 0x59, 0x5E, 0x8E, 0xC8, 0xE4, 0xD9, 0x7C, - 0x3E, 0x02, 0x4D, 0xBE, 0x00, 0xD9, 0x6F, 0x46, 0xF1, 0x4A, 0x5B, 0x33, 0x97, 0x6E, 0x54, 0x5A, - 0x3A, 0x41, 0x6F, 0xC0, 0xB7, 0x3E, 0x78, 0xE5, 0xCF, 0x75, 0x1C, 0xEE, 0xD8, 0xA1, 0xEE, 0xD0, - 0x37, 0x94, 0xFE, 0x63, 0x1B, 0x2F, 0x63, 0x7A, 0xFE, 0x22, 0xCD, 0x32, 0xE1, 0xB6, 0xF8, 0x21, - 0x33, 0xDA, 0xCE, 0xB4, 0x91, 0x25, 0x21, 0x67, 0xA2, 0x6D, 0x5D, 0x49, 0xBD, 0x77, 0x92, 0x60, - 0xA3, 0x56, 0xBF, 0x1E, 0x1B, 0xF8, 0xE9, 0x40, 0xC5, 0xBF, 0x06, 0xFC, 0x14, 0xBC, 0xBC, 0x62, - 0xC0, 0xCB, 0x8D, 0x67, 0x7E, 0xDD, 0xB9, 0xCE, 0x66, 0xE2, 0x52, 0xC1, 0x21, 0x68, 0x93, 0xB4, - 0x6F, 0xFC, 0x81, 0x1F, 0x41, 0xD7, 0x7F, 0x10, 0xCF, 0x35, 0x9B, 0x72, 0xC6, 0xBC, 0x05, 0x5D, - 0x7D, 0x63, 0x09, 0xB4, 0xA8, 0x62, 0xAA, 0x42, 0x51, 0xC1, 0xC0, 0xF0, 0x2D, 0xE2, 0xBE, 0x6D, - 0x54, 0x53, 0x55, 0x7B, 0x39, 0x0A, 0xB0, 0x2A, 0xE0, 0x45, 0x0A, 0xEF, 0xD7, 0x7E, 0xB9, 0xAF, - 0xB9, 0xDA, 0x22, 0x5D, 0x65, 0xD5, 0x39, 0x0F, 0xE4, 0x2B, 0x8E, 0xAA, 0x79, 0xC9, 0xFB, 0xF0, - 0x00, 0x51, 0xE6, 0x59, 0x3F, 0x12, 0x54, 0x4A, 0x29, 0x23, 0xD3, 0x6A, 0x9F, 0xB9, 0x0D, 0x99, - 0x1E, 0x8A, 0xF6, 0x55, 0xD3, 0xDC, 0x8A, 0x48, 0xC3, 0xE5, 0x16, 0xDA, 0xFF, 0xB0, 0x3B, 0x92, - 0x49, 0xD6, 0x00, 0xB1, 0x13, 0x8E, 0xC2, 0x3F, 0x7C, 0xF9, 0x48, 0x55, 0xD5, 0xAC, 0xEA, 0x8A, - 0xC1, 0x5C, 0xA9, 0x48, 0xEA, 0x71, 0xDA, 0x99, 0xE9, 0x49, 0xBA, 0xD8, 0x1F, 0xF2, 0xB2, 0x51, - 0x5D, 0x13, 0xC7, 0x6A, 0x82, 0x8E, 0x64, 0x3A, 0x11, 0x56, 0x66, 0x24, 0x2D, 0xC1, 0x7D, 0x3A, - 0xB2, 0x45, 0xB6, 0xAE, 0x10, 0x8F, 0xBD, 0xD6, 0x9F, 0xAB, 0x44, 0xA7, 0x4A, 0x5D, 0x92, 0x7D, - 0x8F, 0xE5, 0x59, 0x4A, 0x10, 0x85, 0xFD, 0x3C, 0x40, 0x3B, 0xBF, 0xDF, 0xA7, 0x3A, 0x1D, 0xB5, - 0x67, 0x23, 0xF9, 0xAC, 0x59, 0x31, 0x2F, 0xD9, 0xD6, 0xF5, 0xEA, 0xD1, 0xDE, 0xAE, 0xFA, 0x44, - 0xFD, 0xE0, 0xBE, 0xE3, 0xF7, 0xEA, 0xD5, 0xF0, 0x26, 0x41, 0xE5, 0x3D, 0xBE, 0xAA, 0xFC, 0x57, - 0x49, 0xAE, 0x3E, 0x70, 0x8F, 0x9D, 0xF1, 0xB6, 0x32, 0x7D, 0xE7, 0x21, 0x4A, 0x7E, 0x99, 0xD7, - 0x90, 0xFE, 0xC5, 0xB2, 0xE8, 0xAC, 0x6D, 0xF7, 0x3C, 0xD3, 0x1E, 0x61, 0xF4, 0xFF, 0x8C, 0x13, - 0x5A, 0x7F, 0x87, 0x66, 0x47, 0x84, 0xF8, 0x3B, 0x0B, 0x70, 0xCF, 0xBA, 0x0C, 0x87, 0x93, 0x62, - 0x65, 0x1E, 0x47, 0xFC, 0x96, 0x25, 0x46, 0x01, 0xE0, 0xCE, 0xE2, 0x41, 0xC6, 0x38, 0x90, 0x0D, - 0xE3, 0xC7, 0x60, 0x4E, 0x08, 0x0F, 0x02, 0xF5, 0xB8, 0x70, 0x27, 0x89, 0x29, 0x6E, 0x79, 0x85, - 0x12, 0xA4, 0xCA, 0x6C, 0x69, 0xBE, 0x52, 0xFF, 0xBD, 0xCF, 0x3E, 0x07, 0xA8, 0x7B, 0x00, 0x44, - 0xE0, 0x3B, 0xA6, 0x50, 0xFF, 0xF9, 0xDA, 0x0D, 0xEB, 0xCC, 0x70, 0x21, 0x20, 0x5F, 0xF4, 0xAF, - 0x1B, 0x2C, 0xF8, 0x63, 0x9C, 0xB9, 0x8F, 0x0B, 0xBF, 0x1C, 0xA5, 0x85, 0xA6, 0x9A, 0x0A, 0x93, - 0x1E, 0x8B, 0xA3, 0x80, 0x63, 0x30, 0x24, 0xE1, 0xF0, 0xB6, 0x7B, 0x93, 0xC5, 0x72, 0xE9, 0x49, - 0x91, 0x1D, 0xB0, 0x77, 0xC0, 0xA2, 0x1D, 0xC9, 0x66, 0x90, 0xF7, 0x58, 0x92, 0x87, 0x4F, 0xB0, - 0x0D, 0x0A, 0x48, 0x16, 0x5F, 0x7D, 0xF4, 0xA6, 0xC9, 0x80, 0xD2, 0x38, 0xD6, 0xC7, 0xEE, 0x73, - 0xA6, 0xA8, 0x57, 0xC9, 0xAA, 0x32, 0x6A, 0x3C, 0xA7, 0x9F, 0x89, 0x79, 0x8B, 0xD9, 0x6B, 0x8C, - 0xB1, 0x26, 0x5D, 0x4B, 0xE9, 0xF0, 0x9D, 0xFA, 0xC0, 0xD3, 0xEA, 0x82, 0xDA, 0x7C, 0xCB, 0x43, - 0x90, 0x74, 0x24, 0xC6, 0xBD, 0x5B, 0x87, 0x29, 0xCA, 0xEC, 0x6E, 0xBA, 0x7C, 0x41, 0xF9, 0x99, - 0x0A, 0x92, 0xFA, 0x43, 0xAE, 0xE7, 0xF9, 0xFB, 0x55, 0x5B, 0x3A, 0xCC, 0x1C, 0xC5, 0x20, 0x37, - 0x53, 0x4A, 0x83, 0xC6, 0x79, 0x5A, 0x42, 0xF9, 0x23, 0x62, 0xA1, 0x3A, 0x42, 0xCE, 0x51, 0xC5, - 0x5D, 0xC9, 0x99, 0x1F, 0x82, 0xE7, 0x43, 0x72, 0x46, 0x70, 0x80, 0x25, 0x65, 0x98, 0x78, 0xC2, - 0xF9, 0xD4, 0x07, 0x2D, 0xAB, 0x79, 0x7D, 0x45, 0xC3, 0x0B, 0xEE, 0x18, 0xBB, 0x3C, 0x33, 0xE5, - 0x8B, 0xE5, 0x2A, 0x04, 0x53, 0x7C, 0x92, 0x92, 0x3E, 0x77, 0xE6, 0xB5, 0x8A, 0x7C, 0xAC, 0x3F, - 0xEA, 0xFC, 0x19, 0x64, 0xFD, 0xB4, 0xA3, 0x33, 0xCC, 0xBB, 0xE3, 0x5F, 0xBA, 0xAB, 0x9F, 0x2A, - 0x4E, 0x71, 0x96, 0x4D, 0x8D, 0x33, 0x39, 0x02, 0x0F, 0x6B, 0xFB, 0xC7, 0x76, 0x0D, 0xC4, 0x9D, - 0xB0, 0x6C, 0xA3, 0x91, 0x32, 0x23, 0x60, 0xF9, 0x53, 0x3C, 0x48, 0xCF, 0x54, 0x4A, 0x34, 0x6A, - 0x90, 0xB8, 0xDB, 0xB6, 0xFD, 0xD8, 0xB9, 0x79, 0xF1, 0x5D, 0x64, 0xFC, 0x2C, 0x6E, 0xA2, 0xD2, - 0x4D, 0x37, 0x56, 0xCB, 0x8D, 0xE9, 0xC9, 0x02, 0x3A, 0x7F, 0x53, 0x75, 0x98, 0x46, 0xF9, 0x8E, - 0xE2, 0x00, 0x05, 0x20, 0x8E, 0xAD, 0xAA, 0x38, 0x5F, 0x6A, 0x34, 0x16, 0x2E, 0x25, 0xFF, 0x7F, - 0xE2, 0x10, 0x2D, 0x49, 0x2C, 0xEF, 0xB5, 0xE5, 0x8A, 0x2A, 0x1F, 0x6F, 0x6C, 0x49, 0xF7, 0x78, - 0x80, 0xCA, 0xFA, 0x14, 0x5D, 0xAE, 0xA9, 0xCD, 0xC5, 0xB8, 0xA8, 0xDC, 0xFF, 0x84, 0xC5, 0x80, - 0x8E, 0x98, 0x5F, 0x7E, 0xF6, 0x26, 0xBB, 0x35, 0xF7, 0xA7, 0x40, 0x46, 0x83, 0x26, 0xDF, 0x3B, - 0x64, 0xE0, 0x67, 0x7A, 0xBE, 0x08, 0xF4, 0xE6, 0x1A, 0xF8, 0xFD, 0xBA, 0x0E, 0xBE, 0xB2, 0x28, - 0x6C, 0x45, 0xEA, 0xB1, 0x6C, 0xA8, 0x8E, 0x4F, 0xB8, 0xBC, 0x82, 0x0A, 0xD1, 0x84, 0xAB, 0x03, - 0x6C, 0x30, 0x85, 0xA1, 0x2C, 0x72, 0xA3, 0x08, 0x25, 0x4C, 0x97, 0x32, 0xEB, 0xAD, 0x0E, 0x3E, - 0xE8, 0x8E, 0x2B, 0xF0, 0xCF, 0x13, 0xCA, 0xD1, 0x53, 0xC6, 0xCD, 0x58, 0x98, 0xDE, 0xB0, 0x7E, - 0x0D, 0xBF, 0x94, 0x3E, 0xA7, 0x1C, 0x84, 0xBC, 0xB3, 0x9B, 0x6D, 0x54, 0x32, 0x39, 0x89, 0xF8, - 0x02, 0xAF, 0xBC, 0xB2, 0x53, 0x3B, 0x43, 0xF2, 0xCC, 0xC9, 0x05, 0xF2, 0xC4, 0x88, 0x37, 0x6E, - 0xE1, 0xA1, 0x55, 0x82, 0x7E, 0xBE, 0x83, 0xE0, 0x0B, 0xF8, 0x96, 0x45, 0x61, 0xC1, 0x96, 0x28, - 0x6D, 0x64, 0xCF, 0xF9, 0xC1, 0xC7, 0x3A, 0x18, 0xF3, 0x9A, 0x69, 0x2B, 0x07, 0x57, 0x55, 0xE8, - 0x09, 0xCB, 0x33, 0xC5, 0x4F, 0xBF, 0x0F, 0x9A, 0x22, 0xB1, 0xB3, 0x50, 0x15, 0xA3, 0xCB, 0x8D, - 0x6E, 0x29, 0x56, 0x89, 0x64, 0xAF, 0x5B, 0x0D, 0xD4, 0xE2, 0x6F, 0x6A, 0x38, 0xBD, 0xD8, 0xA1, - 0x7D, 0x0A, 0x6F, 0x7B, 0x07, 0x89, 0x5B, 0xD2, 0xFB, 0x34, 0x5F, 0xA9, 0x0F, 0x41, 0x18, 0xD3, - 0x99, 0xFD, 0xA8, 0x88, 0xFD, 0x4B, 0x9B, 0xCA, 0xAE, 0x5A, 0xB0, 0xEE, 0x23, 0x0F, 0x4B, 0x5C, - 0x99, 0xEA, 0x29, 0xF3, 0xF6, 0x97, 0x5F, 0xF9, 0xAF, 0x28, 0x4F, 0xEC, 0xD6, 0x01, 0x69, 0x8B, - 0x65, 0x08, 0x55, 0xCA, 0x05, 0xC0, 0xB4, 0xB2, 0x64, 0x2A, 0xF5, 0x3E, 0xDA, 0xA2, 0xD2, 0xBB, - 0xDF, 0x17, 0xFF, 0xCF, 0x9E, 0xDE, 0x8A, 0x1E, 0x5F, 0xFD, 0xEA, 0x12, 0x0F, 0xFF, 0x96, 0x20, - 0x0A, 0x15, 0xE6, 0x9B, 0x4F, 0x12, 0x0B, 0xCC, 0x39, 0x4D, 0xFD, 0xD4, 0x7A, 0xDA, 0x24, 0x11, - 0x2D, 0x93, 0x92, 0x9F, 0x3E, 0x3F, 0xA2, 0x9B, 0xAD, 0x98, 0x13, 0xE2, 0x5F, 0xF2, 0x7E, 0x84, - 0xA1, 0x43, 0xAB, 0x76, 0xB8, 0xFC, 0xA0, 0x01, 0x17, 0x38, 0xB3, 0x33, 0x13, 0x4A, 0xF5, 0x15, - 0xA5, 0x56, 0x66, 0xC5, 0x44, 0x0C, 0x88, 0x75, 0x76, 0xA5, 0x7E, 0x57, 0xD4, 0x22, 0xE5, 0x32, - 0x99, 0x60, 0x99, 0x7C, 0x65, 0x29, 0xBA, 0xB0, 0x5B, 0x1F, 0x84, 0x98, 0x0C, 0x06, 0x8A, 0xAE, - 0x96, 0x63, 0x91, 0xB1, 0x75, 0xE6, 0xE6, 0x7A, 0xBF, 0x1E, 0xB5, 0xB6, 0x76, 0x1B, 0xE2, 0xBF, - 0xB4, 0x1F, 0x4D, 0x33, 0xF9, 0x9D, 0x9C, 0x79, 0xE6, 0xF5, 0xA3, 0x8C, 0x72, 0xFE, 0xAE, 0xB1, - 0x13, 0x09, 0x20, 0x91, 0x7C, 0x11, 0x99, 0x68, 0x1A, 0xA7, 0x6B, 0x3F, 0x88, 0xC7, 0xF5, 0x94, - 0x0D, 0xBC, 0x3B, 0xA5, 0x14, 0xD7, 0x8B, 0xA0, 0xA0, 0x70, 0xB4, 0xC2, 0x4E, 0x2F, 0xA8, 0xB1, - 0x0D, 0x7B, 0x8C, 0xD4, 0x96, 0xC1, 0xD1, 0xC5, 0x13, 0x67, 0x24, 0x16, 0x3C, 0xC0, 0xFD, 0x79, - 0x3C, 0x11, 0x69, 0x03, 0xF6, 0x55, 0xF7, 0xF2, 0x09, 0x8B, 0x49, 0x5B, 0xDA, 0x05, 0x3C, 0xDB, - 0x1C, 0x01, 0x1F, 0xDC, 0x4D, 0xE2, 0x09, 0xB6, 0x1F, 0x5F, 0xE2, 0xB0, 0xDF, 0x77, 0xF8, 0x83, - 0x59, 0xCF, 0xEE, 0x8B, 0x14, 0x12, 0xEB, 0xBC, 0x9B, 0xB4, 0x38, 0xFD, 0x38, 0x53, 0xC9, 0xA1, - 0x4E, 0xF6, 0x80, 0xA8, 0xE5, 0x25, 0x89, 0x97, 0xCF, 0x94, 0x06, 0xE4, 0x25, 0xDF, 0x86, 0x46, - 0xA2, 0x54, 0xA7, 0x04, 0xB5, 0xCA, 0x67, 0xF1, 0x95, 0x65, 0x57, 0xE1, 0x38, 0x61, 0xCB, 0x20, - 0xE5, 0x98, 0xF4, 0x07, 0x95, 0x25, 0xBD, 0xBE, 0x9F, 0x87, 0x76, 0x4D, 0x52, 0x96, 0xAE, 0x82, - 0xAE, 0x2C, 0x3C, 0xB6, 0x7C, 0x1A, 0x36, 0xE5, 0x34, 0x13, 0x1B, 0x72, 0x52, 0x8F, 0xFF, 0xE7, - 0x6B, 0x83, 0xDB, 0x88, 0x4A, 0xDB, 0x95, 0x37, 0xFA, 0x9D, 0xA2, 0x49, 0xDB, 0x5A, 0xE3, 0x5C, - 0x95, 0xC7, 0xF8, 0xE0, 0x14, 0x38, 0xB2, 0xCD, 0x09, 0xF4, 0x2A, 0x2A, 0xF7, 0x1A, 0xA1, 0x8E, - 0xB8, 0xBC, 0x3B, 0x51, 0x9A, 0xE4, 0xD1, 0xCF, 0xA7, 0xD1, 0xF9, 0x63, 0x0F, 0x98, 0x3D, 0x61, - 0x51, 0xEC, 0x1B, 0x67, 0x68, 0x88, 0x25, 0x65, 0x0B, 0xA6, 0x32, 0xA2, 0xCD, 0x93, 0xE1, 0x16, - 0x01, 0x12, 0xB2, 0xDA, 0x35, 0xBA, 0x52, 0x66, 0x46, 0x44, 0x8D, 0xB3, 0x19, 0x33, 0xC1, 0x1F, - 0x47, 0x6C, 0x48, 0x7B, 0x5C, 0x8C, 0xA8, 0x68, 0x74, 0xDE, 0x7C, 0xB4, 0xDF, 0x05, 0x54, 0x35, - 0x8A, 0xFE, 0x78, 0xB5, 0x05, 0x78, 0xC3, 0xB4, 0x85, 0x12, 0x88, 0xBB, 0x49, 0x17, 0x46, 0x5D, - 0x7D, 0x1F, 0xF4, 0xB5, 0xD9, 0xEF, 0x62, 0xBA, 0xC4, 0x86, 0x61, 0x0B, 0xE0, 0xC5, 0xEE, 0x69, - 0xEC, 0xF9, 0x52, 0x93, 0x3F, 0xC7, 0x69, 0xE4, 0xD2, 0x9C, 0xE0, 0xEB, 0xB5, 0x5A, 0x55, 0xCE, - 0x87, 0xA3, 0x1C, 0x52, 0x2E, 0xC5, 0x99, 0x92, 0x7F, 0x10, 0x06, 0xC4, 0xA2, 0x5B, 0x77, 0x3D, - 0x53, 0xE8, 0xCA, 0xB5, 0x3B, 0x18, 0x58, 0x54, 0xC6, 0x63, 0xDB, 0x1D, 0xB6, 0x75, 0xD2, 0x69, - 0x64, 0x8A, 0x69, 0x0E, 0xF9, 0x57, 0x41, 0x4C, 0xC2, 0xF3, 0x59, 0x0A, 0x60, 0x76, 0x67, 0x4A, - 0xE6, 0xE8, 0x63, 0xB5, 0x0A, 0x39, 0xDE, 0x95, 0xD6, 0xFB, 0xD4, 0xEC, 0xA3, 0xBD, 0x1A, 0xB1, - 0x8F, 0x54, 0x1C, 0xD7, 0x39, 0x50, 0x8F, 0x92, 0x0D, 0x33, 0x9F, 0x49, 0x10, 0xB2, 0x73, 0x87, - 0x83, 0xF0, 0x72, 0x9D, 0xE7, 0xEA, 0x14, 0xC7, 0x5A, 0x23, 0x6F, 0x54, 0x3E, 0xB5, 0x86, 0x6D, - 0xD6, 0xE2, 0x3E, 0x97, 0x96, 0x5F, 0xF4, 0x1A, 0xFD, 0x8B, 0x96, 0x9B, 0x14, 0xD7, 0x25, 0x3A, - 0x96, 0x25, 0x7B, 0xBE, 0x32, 0x46, 0xC3, 0x20, 0x4E, 0x01, 0x98, 0x0A, 0x27, 0x53, 0x58, 0xFA, - 0xAF, 0x14, 0xE6, 0x6B, 0x99, 0x32, 0x85, 0x87, 0x8F, 0xDA, 0x09, 0x7C, 0x92, 0x9D, 0x4C, 0x87, - 0xF6, 0xB3, 0x67, 0x61, 0xA2, 0x7C, 0x25, 0x5D, 0x4E, 0xA7, 0x6F, 0xF0, 0xCB, 0x6C, 0x6A, 0xC3, - 0xE2, 0x19, 0x33, 0xBE, 0x73, 0x95, 0xE1, 0xBA, 0x39, 0x09, 0x7F, 0xAE, 0x72, 0x8A, 0x4E, 0x74, - 0xA1, 0xBF, 0x5B, 0x1D, 0x34, 0x89, 0xF0, 0x94, 0xE6, 0x84, 0x3C, 0x64, 0x29, 0x04, 0x07, 0x34, - 0xC3, 0x32, 0xEF, 0xF6, 0xE5, 0x24, 0x54, 0x09, 0xFA, 0x81, 0xDB, 0xF1, 0xCF, 0xE5, 0xDB, 0x98, - 0x27, 0xC0, 0xEB, 0xDA, 0x10, 0x73, 0x74, 0x76, 0xCA, 0xD7, 0xFE, 0xDF, 0x82, 0x63, 0x0F, 0x31, - 0x03, 0xBE, 0x10, 0xF4, 0xF6, 0x76, 0xDD, 0x27, 0xAD, 0xE4, 0xC1, 0xFA, 0xC5, 0x5A, 0x71, 0x8D, - 0x59, 0x39, 0x41, 0x6C, 0xDD, 0xFB, 0x4C, 0x5C, 0xB0, 0xB8, 0xF9, 0x67, 0x9C, 0xD7, 0x90, 0x44, - 0xE2, 0xF3, 0x39, 0x4C, 0x84, 0x1A, 0x13, 0x3F, 0xF2, 0xDF, 0x77, 0xA5, 0xF6, 0xAB, 0x69, 0x37, - 0x18, 0x56, 0x03, 0x86, 0xE9, 0xB7, 0xC8, 0xD8, 0x5A, 0xA1, 0x87, 0x00, 0xBC, 0x14, 0x44, 0xFF, - 0x21, 0xDD, 0xAC, 0x99, 0xD2, 0x78, 0xDF, 0x0C, 0xF3, 0xAC, 0x5F, 0xF4, 0x56, 0xE4, 0xAB, 0xCF, - 0x5F, 0x1C, 0x60, 0x7E, 0xFA, 0xDA, 0x36, 0x8A, 0xF2, 0xD4, 0x80, 0x64, 0xC5, 0x54, 0x53, 0xCA, - 0xF3, 0x80, 0x9A, 0x3C, 0x7C, 0x7B, 0x32, 0x30, 0x14, 0xB7, 0x17, 0x9B, 0x42, 0x7C, 0x94, 0x0D, - 0xC4, 0x43, 0x5B, 0xB0, 0x86, 0xE9, 0x1F, 0x80, 0xCD, 0x45, 0x97, 0x3D, 0x8A, 0xD0, 0x22, 0x91, - 0xA0, 0x14, 0xA5, 0xD7, 0x71, 0x07, 0x8D, 0xAB, 0x69, 0xE8, 0x38, 0x98, 0xEE, 0x70, 0x3D, 0x7B, - 0x86, 0x13, 0xDE, 0xAF, 0xE5, 0x89, 0x5A, 0x5F, 0x1F, 0xF9, 0xA5, 0x3F, 0xED, 0x62, 0xE6, 0x65, - 0x3B, 0x86, 0xF9, 0x76, 0xD6, 0x5A, 0x57, 0x54, 0x8B, 0x0D, 0x39, 0xEC, 0x9F, 0x00, 0xBF, 0x4E, - 0xF8, 0x62, 0x51, 0x83, 0x74, 0x16, 0x00, 0x3A, 0x4F, 0x71, 0x18, 0x73, 0xF0, 0x41, 0x71, 0xB4, - 0xDC, 0x79, 0xFC, 0x32, 0xDB, 0x38, 0x0C, 0x3F, 0x1B, 0x66, 0xA4, 0x27, 0xED, 0xA7, 0xE2, 0xE6, - 0xB0, 0x51, 0xF6, 0xBD, 0xEF, 0x2E, 0x0E, 0x10, 0x8F, 0x1D, 0x40, 0xDF, 0x85, 0x67, 0xC7, 0x25, - 0x11, 0x7F, 0x50, 0x99, 0xC8, 0xAE, 0xDF, 0x6A, 0xAF, 0x70, 0x8C, 0xD4, 0xB5, 0x6A, 0xA5, 0x21, - 0x1C, 0xBF, 0x0C, 0x75, 0xA2, 0x40, 0x03, 0x17, 0x58, 0x8C, 0x84, 0x4D, 0x82, 0x29, 0xE5, 0x7C, - 0x05, 0xA1, 0xAF, 0x48, 0x07, 0xD1, 0xF7, 0x53, 0xBC, 0x02, 0xF7, 0xCD, 0x60, 0x35, 0xEE, 0x04, - 0x03, 0xE1, 0x3A, 0xAA, 0x71, 0x54, 0x5B, 0xDD, 0x86, 0x68, 0xFB, 0xC6, 0xBC, 0xCF, 0xCD, 0x55, - 0xBC, 0x0E, 0x0D, 0x8D, 0x7B, 0x70, 0x1F, 0xE4, 0xEC, 0x2C, 0x91, 0x22, 0xF6, 0x55, 0xC9, 0x07, - 0x0F, 0x26, 0x60, 0x4F, 0xB0, 0x27, 0xFA, 0xAB, 0xBF, 0x3B, 0xF1, 0x3F, 0x52, 0xB8, 0xC7, 0x7B, - 0x52, 0xBF, 0x6E, 0xA4, 0x87, 0xCD, 0x40, 0x62, 0x4D, 0xDA, 0xD1, 0x37, 0x77, 0x44, 0xB3, 0x1D, - 0xD6, 0x2F, 0x9A, 0xA8, 0x61, 0x54, 0x6A, 0x1E, 0x2E, 0xE2, 0xC0, 0xBF, 0x7D, 0xAD, 0xB9, 0xDB, - 0x52, 0x5C, 0x0F, 0x15, 0x7F, 0x40, 0x8B, 0xC3, 0x4E, 0xC5, 0xC3, 0x59, 0x5A, 0x19, 0x3F, 0xA1, - 0xB3, 0x58, 0x3A, 0xC2, 0x06, 0x5B, 0x16, 0xF8, 0xEA, 0xFA, 0xB6, 0x8D, 0x93, 0xFF, 0xC4, 0x96, - 0x2C, 0x9F, 0xD0, 0xAB, 0x5A, 0x2B, 0x81, 0x17, 0xA9, 0x71, 0x38, 0x0F, 0x01, 0xEF, 0x5A, 0xC0, - 0xE9, 0x9F, 0x8B, 0x63, 0x47, 0x89, 0x50, 0xC2, 0xFB, 0x8A, 0x8B, 0x9F, 0xEE, 0xC4, 0xC4, 0x7A, - 0xDC, 0xAD, 0xC3, 0x6A, 0x70, 0xA4, 0x71, 0x53, 0xFD, 0xA9, 0x0D, 0xC0, 0x62, 0x23, 0xB8, 0x9D, - 0xAE, 0xA2, 0x12, 0x0B, 0x18, 0x42, 0xB6, 0x93, 0x2A, 0x85, 0x60, 0x09, 0x59, 0x69, 0x52, 0x1F, - 0x1E, 0xBA, 0xBF, 0x0F, 0xA6, 0x8E, 0xB0, 0x8A, 0x03, 0xCA, 0xC5, 0x1C, 0x8E, 0x89, 0xF2, 0x50, - 0xD7, 0x1A, 0xA9, 0x63, 0x83, 0x0F, 0x6D, 0x06, 0x27, 0x1F, 0x40, 0xDA, 0x0B, 0x9E, 0xEB, 0x1F, - 0x7E, 0x4F, 0x8A, 0xF0, 0x38, 0x86, 0x08, 0xC6, 0x3A, 0xFF, 0x29, 0xCC, 0xA7, 0x10, 0x27, 0xF3, - 0x99, 0x3E, 0x52, 0xF3, 0x0F, 0x83, 0x93, 0x9F, 0x63, 0xE8, 0x23, 0x41, 0x71, 0x98, 0x25, 0x1B, - 0xC9, 0x89, 0x15, 0x8F, 0xC8, 0x72, 0x35, 0x72, 0x7D, 0xF2, 0x36, 0x31, 0x64, 0xF5, 0x3A, 0x4C, - 0x15, 0x9B, 0x30, 0x77, 0x36, 0x03, 0xB9, 0xEE, 0xCA, 0x61, 0x22, 0x7C, 0xCF, 0xEE, 0x6C, 0xE4, - 0xEC, 0x83, 0x67, 0x10, 0x07, 0x7A, 0x21, 0x97, 0xDF, 0xC3, 0x2A, 0x27, 0x47, 0xDB, 0x1A, 0x76, - 0x2D, 0xA5, 0x9D, 0xD7, 0x39, 0x54, 0x4F, 0x62, 0x9C, 0xFD, 0x77, 0x0E, 0xB0, 0x4A, 0x0A, 0xD9, - 0x46, 0xC2, 0x28, 0x49, 0xB0, 0x53, 0x99, 0x2A, 0xC2, 0x81, 0xF9, 0x8A, 0xE1, 0x01, 0xDA, 0xCC, - 0x31, 0x60, 0x9B, 0x32, 0x4B, 0x69, 0x2B, 0x89, 0x00, 0xDA, 0xCD, 0x41, 0x0B, 0x13, 0xC0, 0x3C, - 0x4A, 0xD0, 0x32, 0x0A, 0x45, 0x31, 0x54, 0x38, 0x9E, 0x74, 0x56, 0x60, 0x8A, 0xFA, 0x0C, 0x0C, - 0xC8, 0xDC, 0x4E, 0x12, 0x9A, 0xD0, 0x2B, 0xAC, 0xF3, 0x16, 0xD3, 0xE4, 0x5C, 0xA8, 0x3B, 0x8A, - 0x8E, 0x04, 0x4B, 0x09, 0xDE, 0x91, 0x1C, 0xF2, 0x3D, 0xB5, 0x27, 0x23, 0x9A, 0x5F, 0xCA, 0xCE, - 0x1D, 0x81, 0x25, 0xD3, 0x0B, 0x07, 0x3B, 0xA2, 0xED, 0xC1, 0x68, 0xA3, 0x10, 0x1E, 0x49, 0xED, - 0x2B, 0x02, 0xD4, 0x65, 0x6B, 0xDE, 0xF7, 0xE8, 0x3D, 0xC3, 0x41, 0x1E, 0x75, 0xDB, 0xD0, 0xE4, - 0xA7, 0xFF, 0xFC, 0xB3, 0x0D, 0xAE, 0x72, 0x6D, 0xF2, 0x16, 0xF9, 0x4C, 0x9B, 0x2C, 0x83, 0x55, - 0x53, 0x32, 0xB1, 0x4E, 0xE7, 0x7E, 0x7F, 0xF6, 0xBE, 0xE4, 0x7A, 0xF3, 0xDB, 0x73, 0xA5, 0xDC, - 0xB3, 0x1F, 0x1B, 0x9E, 0x93, 0x58, 0x58, 0x4C, 0xDB, 0xED, 0x8C, 0x02, 0xB7, 0x43, 0x10, 0x7F, - 0x32, 0xF0, 0xFC, 0xD2, 0xDA, 0x18, 0xA6, 0x74, 0x80, 0x12, 0x9C, 0xBB, 0xB9, 0xA9, 0x03, 0x76, - 0xC9, 0x4E, 0xE0, 0xE3, 0x63, 0x96, 0xC8, 0x32, 0x04, 0x06, 0x15, 0x52, 0xD1, 0xB6, 0x03, 0x1B, - 0x5D, 0xF2, 0x40, 0x43, 0x37, 0xCF, 0x7C, 0xF5, 0xC4, 0xAB, 0x8B, 0x83, 0x63, 0x5D, 0xE3, 0x3B, - 0x3B, 0x66, 0xE6, 0x19, 0xEF, 0x51, 0x6B, 0x60, 0x6F, 0x3E, 0x71, 0x3D, 0x8E, 0x5A, 0x77, 0xD2, - 0x57, 0x9A, 0x06, 0xE9, 0xBB, 0x8A, 0x50, 0x58, 0x90, 0xF1, 0x17, 0xD7, 0x18, 0x9C, 0x24, 0x65, - 0x3D, 0x40, 0xA5, 0xA1, 0xD8, 0x24, 0x4B, 0xAA, 0x8A, 0x47, 0x3F, 0x0D, 0xB6, 0x60, 0xE6, 0x75, - 0xCD, 0x45, 0x6D, 0x54, 0xD9, 0x67, 0x65, 0xE0, 0x04, 0xCC, 0xBE, 0xCC, 0xAA, 0x8E, 0x3D, 0xB9, - 0x1E, 0x03, 0x25, 0x25, 0x31, 0x88, 0x36, 0xF6, 0x52, 0xD7, 0x4E, 0x75, 0xB5, 0xEA, 0x05, 0x83, - 0x59, 0xAD, 0xAF, 0xF4, 0x13, 0xCE, 0x5D, 0xF4, 0x52, 0x98, 0xBC, 0x63, 0xFE, 0xB0, 0xC5, 0x55, - 0xBD, 0x5A, 0x65, 0x3E, 0xAF, 0x24, 0x4C, 0x5E, 0xEA, 0x9A, 0x44, 0x32, 0x0E, 0x39, 0xCA, 0x60, - 0xB2, 0xBF, 0x62, 0x40, 0x19, 0x57, 0xDE, 0x7C, 0x70, 0xD7, 0xC3, 0x0E, 0x9A, 0x98, 0x6F, 0x26, - 0x22, 0x45, 0xC4, 0xD1, 0x8E, 0x6B, 0xC9, 0x3F, 0x1E, 0x71, 0x4F, 0x2E, 0x86, 0x42, 0x73, 0x00, - 0xEB, 0x98, 0x22, 0x03, 0x1F, 0x6F, 0xC3, 0xAF, 0xD0, 0x55, 0x8F, 0x95, 0x6F, 0x8E, 0x4B, 0xF0, - 0x21, 0x1D, 0xA7, 0xB1, 0xE8, 0x6B, 0xC7, 0x8A, 0xAD, 0x69, 0xD7, 0x6A, 0x7F, 0x09, 0x3A, 0x9F, - 0xBF, 0x30, 0x27, 0x18, 0x00, 0x11, 0xF2, 0x96, 0xAB, 0x57, 0xD3, 0x67, 0x5D, 0x2A, 0x36, 0xCF, - 0xE2, 0x05, 0xBB, 0x01, 0x83, 0x0B, 0xC7, 0x6D, 0xE9, 0xFD, 0x5A, 0xC8, 0x0D, 0x9C, 0xC0, 0xA2, - 0x41, 0x8D, 0x0E, 0x53, 0xB2, 0xD2, 0x2B, 0xD8, 0xE5, 0x4C, 0xEE, 0x81, 0x52, 0xED, 0xE8, 0xEA, - 0xF1, 0xF3, 0x2A, 0x5D, 0xEC, 0x2D, 0x0E, 0xFD, 0x76, 0x26, 0x4C, 0x25, 0x78, 0x26, 0x6F, 0x2F, - 0xF7, 0x31, 0xAB, 0xC0, 0x6C, 0x80, 0x1F, 0x2B, 0x8B, 0x1E, 0xC1, 0x09, 0x46, 0x5E, 0x94, 0x19, - 0xED, 0x07, 0x94, 0xEC, 0xCF, 0x3B, 0xC6, 0x51, 0x29, 0xC2, 0x87, 0xD4, 0x55, 0xD0, 0xAD, 0x82, - 0x66, 0x27, 0x61, 0x18, 0xDD, 0xB8, 0xBD, 0xF9, 0xE1, 0xCA, 0xAA, 0xBA, 0x49, 0x39, 0xD6, 0x43, - 0xA9, 0x10, 0x12, 0x7C, 0xA6, 0x82, 0xD8, 0xDB, 0x11, 0x76, 0x9D, 0xF0, 0x92, 0xFB, 0x31, 0xC1, - 0x9C, 0x31, 0x78, 0x1C, 0x11, 0xD6, 0xF3, 0x1F, 0x14, 0x39, 0xC6, 0x33, 0x46, 0x58, 0x8C, 0xE9, - 0x2B, 0x87, 0x94, 0xA6, 0xFA, 0x55, 0x5A, 0x3C, 0x39, 0x60, 0xD0, 0x26, 0x0F, 0xB3, 0x56, 0x18, - 0x77, 0x9C, 0x1B, 0x01, 0xBA, 0xE6, 0xB2, 0x1E, 0x8B, 0xA0, 0x63, 0x2D, 0x7E, 0xA2, 0x30, 0xFC, - 0xDF, 0x31, 0x99, 0xB2, 0xD6, 0x1E, 0xD3, 0xAB, 0xB7, 0xFA, 0x72, 0xB0, 0x6F, 0xE5, 0x6B, 0x9F, - 0xAF, 0xB4, 0xF0, 0x53, 0x06, 0x9C, 0xB0, 0x98, 0x6B, 0xF4, 0x5A, 0x52, 0xDB, 0xD0, 0x13, 0xED, - 0x73, 0x70, 0x11, 0xBB, 0xD0, 0x98, 0x58, 0xCA, 0x29, 0x44, 0xCB, 0x7C, 0x2D, 0x43, 0xDE, 0x4F, - 0xBF, 0x13, 0x06, 0xDD, 0x3C, 0x69, 0x49, 0xD2, 0xD7, 0xA7, 0x24, 0x9E, 0x0D, 0x3C, 0x8C, 0x73, - 0x0F, 0xB2, 0x4F, 0x16, 0x83, 0x7E, 0x7B, 0x3A, 0xD4, 0x49, 0x42, 0x26, 0x9C, 0x6F, 0xAF, 0xD6, - 0x73, 0xEF, 0x29, 0x3D, 0x1A, 0x21, 0x58, 0x48, 0xF7, 0xEE, 0xD2, 0xC8, 0x06, 0x4D, 0xB2, 0x3D, - 0x1E, 0xD6, 0xF6, 0xF3, 0x25, 0xC8, 0xD5, 0xF4, 0xB6, 0x07, 0x2C, 0xB0, 0x03, 0xDE, 0x83, 0xE0, - 0x1C, 0x68, 0x2E, 0x78, 0xB6, 0xDA, 0x99, 0xA6, 0xBD, 0xE8, 0x1D, 0x47, 0x6E, 0x7A, 0x4C, 0xC5, - 0xE4, 0x54, 0xEA, 0xDB, 0xB1, 0x6F, 0x9F, 0x53, 0xA6, 0x41, 0xE2, 0x24, 0x6C, 0x9C, 0x88, 0xF7, - 0x88, 0xA8, 0x90, 0x0D, 0x34, 0x61, 0xAA, 0x7D, 0x52, 0x5F, 0x8D, 0x81, 0xBE, 0xC9, 0x3E, 0x36, - 0x8D, 0x69, 0x81, 0x0D, 0x24, 0x7D, 0xCE, 0x03, 0xB8, 0x4E, 0x9C, 0xFD, 0x5A, 0x4A, 0x45, 0xAF, - 0x45, 0xB5, 0xFF, 0x49, 0xEA, 0x6C, 0xF7, 0xB9, 0xE5, 0xC1, 0xA6, 0x57, 0xF3, 0xCA, 0xCC, 0x46, - 0xD2, 0x20, 0xB3, 0xB1, 0xC0, 0x18, 0xEE, 0x82, 0xE4, 0x00, 0x3C, 0xA7, 0x8B, 0xA6, 0x3A, 0xDA, - 0x82, 0x53, 0x3C, 0x42, 0x4C, 0x3B, 0x16, 0xD0, 0x3E, 0x0E, 0xBA, 0x36, 0xA6, 0xEA, 0x36, 0x16, - 0x80, 0xA3, 0x51, 0xFD, 0xF8, 0xFA, 0xE5, 0x75, 0x64, 0x17, 0x0C, 0xE5, 0xAE, 0xB2, 0xE5, 0x14, - 0xC1, 0xA9, 0xAE, 0x3A, 0x7E, 0x4D, 0x0E, 0x5C, 0x67, 0x31, 0x02, 0xD2, 0x4D, 0xB3, 0xD6, 0xC6, - 0xE6, 0x86, 0xC2, 0x62, 0xE6, 0xB6, 0x53, 0x2C, 0x29, 0x72, 0x90, 0x55, 0xAC, 0x1C, 0xE7, 0x7F, - 0x7F, 0xA3, 0xE8, 0x21, 0xF0, 0x2D, 0x3E, 0x8A, 0xA3, 0xA2, 0xA2, 0x29, 0xEC, 0x36, 0x4B, 0x89, - 0x1C, 0xB6, 0xC1, 0xB9, 0x4A, 0x8F, 0x65, 0xDF, 0x97, 0x29, 0x0F, 0x0B, 0xB1, 0x61, 0x24, 0xA2, - 0xD2, 0x57, 0x7A, 0x99, 0xF7, 0x1D, 0xC8, 0xB4, 0xDD, 0xEE, 0x7A, 0xBE, 0x2E, 0x46, 0x9A, 0xF6, - 0x92, 0x13, 0xAC, 0x98, 0x64, 0x4C, 0xDD, 0x6B, 0x03, 0xD3, 0xF4, 0x14, 0xC9, 0x7D, 0xCE, 0x9B, - 0xF7, 0xD4, 0x80, 0xB1, 0x2A, 0x66, 0x33, 0xA4, 0xE2, 0x45, 0x99, 0x95, 0x77, 0xE1, 0x3E, 0x8A, - 0x43, 0x85, 0xD9, 0x79, 0x69, 0x0D, 0x55, 0xCF, 0x09, 0xF4, 0xFC, 0x07, 0x39, 0x20, 0x26, 0xB4, - 0x8B, 0xD0, 0x60, 0xFB, 0x42, 0x41, 0xEF, 0x02, 0x5F, 0x0D, 0xC7, 0x7F, 0x09, 0xFA, 0x26, 0x94, - 0x7A, 0xCD, 0xDE, 0x43, 0x86, 0x44, 0xD6, 0xC6, 0xB1, 0x77, 0x13, 0xB1, 0x08, 0xC9, 0xDD, 0x99, - 0xF0, 0xED, 0x7B, 0xB0, 0xAB, 0x31, 0x6D, 0x5B, 0x66, 0xA3, 0x53, 0xE2, 0x3B, 0x0F, 0x31, 0xA2, - 0x63, 0x6E, 0x05, 0xAD, 0xC6, 0x74, 0xC5, 0x2D, 0xB3, 0x79, 0xEB, 0x66, 0xF3, 0x6B, 0x79, 0x02, - 0x7A, 0x7D, 0x49, 0x59, 0x30, 0x04, 0x29, 0xD8, 0x5E, 0xF7, 0xF3, 0x6C, 0x5E, 0xC2, 0xA6, 0xFF, - 0x1B, 0x5A, 0xFE, 0x01, 0x54, 0x40, 0xEF, 0xA0, 0xD5, 0xDB, 0x47, 0xED, 0x2A, 0x9B, 0x85, 0x12, - 0x9F, 0x74, 0x5D, 0xB7, 0xA6, 0x80, 0x22, 0x34, 0x87, 0x81, 0x7E, 0x15, 0x87, 0x62, 0x03, 0x87, - 0x62, 0x6B, 0x85, 0xF1, 0x37, 0x55, 0x55, 0x31, 0x18, 0xBD, 0xEF, 0x57, 0x1D, 0x21, 0x5E, 0x87, - 0x37, 0x53, 0x61, 0x7B, 0xA5, 0x80, 0x71, 0x2C, 0x72, 0x83, 0x64, 0x73, 0xF2, 0x4C, 0xA0, 0x3F, - 0x4C, 0x3E, 0x21, 0xF3, 0x96, 0xBB, 0x9C, 0x05, 0xE1, 0x12, 0x47, 0xA2, 0x6E, 0xF6, 0x67, 0xFE, - 0x1B, 0x3F, 0x74, 0xA5, 0x6B, 0x2E, 0xB3, 0x77, 0x02, 0x64, 0x30, 0xAF, 0x6C, 0x64, 0x2E, 0x69, - 0x92, 0xA5, 0xD3, 0xA8, 0xEE, 0xEF, 0xB7, 0x89, 0xD9, 0x31, 0x1B, 0x61, 0xC8, 0x91, 0xF1, 0xC5, - 0x59, 0x7D, 0xCE, 0xDF, 0xFB, 0xF2, 0x10, 0xF7, 0x42, 0x02, 0xEC, 0x70, 0x2F, 0xE4, 0x02, 0xB4, - 0xFB, 0xA0, 0xFC, 0x83, 0x58, 0x68, 0xA2, 0x8E, 0x01, 0x8B, 0x10, 0xF6, 0x30, 0x86, 0xAA, 0x5A, - 0xC4, 0x95, 0x61, 0x02, 0x8E, 0xF2, 0xB7, 0x6B, 0x6C, 0x80, 0x5C, 0xCB, 0x11, 0x66, 0x97, 0x60, - 0x70, 0xD4, 0x06, 0xA9, 0xC7, 0x80, 0xE3, 0x2C, 0xA4, 0xE1, 0xAA, 0x34, 0x92, 0x13, 0x57, 0x05, - 0xF9, 0x70, 0xF3, 0xF4, 0x80, 0x73, 0xF2, 0x16, 0xDA, 0xBD, 0x39, 0x51, 0xD1, 0x40, 0xC1, 0x59, - 0x04, 0xCD, 0xE4, 0x79, 0x63, 0x24, 0x69, 0xC6, 0x99, 0x2F, 0x4D, 0x0D, 0x1C, 0x9C, 0x15, 0xED, - 0x41, 0x47, 0x12, 0x78, 0x6F, 0x8E, 0xFF, 0xA7, 0x34, 0xB8, 0x8B, 0x0C, 0x70, 0x96, 0x07, 0x0B, - 0x49, 0x42, 0x59, 0xFE, 0x5A, 0x08, 0x76, 0x36, 0x3D, 0x7D, 0xBA, 0x10, 0x1B, 0x11, 0xB4, 0x6B, - 0x1C, 0x59, 0x60, 0x02, 0x36, 0x30, 0xD9, 0xEC, 0xBA, 0xEE, 0x22, 0xFD, 0x0F, 0x2E, 0xA2, 0xE2, - 0x70, 0x9C, 0x0D, 0x18, 0x58, 0x88, 0x4A, 0x0D, 0xE7, 0x0E, 0xEF, 0xD8, 0x6F, 0xA7, 0x70, 0x12, - 0x9D, 0x06, 0x4C, 0x8C, 0xAD, 0x1A, 0x28, 0x01, 0xB6, 0x23, 0x53, 0x76, 0xDD, 0x3F, 0x17, 0x87, - 0x0B, 0xC1, 0xEB, 0x9C, 0x44, 0x67, 0x1B, 0x79, 0xE0, 0x67, 0xB2, 0x2A, 0x99, 0x72, 0xEB, 0x4C, - 0xB4, 0x17, 0x2E, 0xB5, 0xE8, 0x52, 0x1E, 0xCB, 0x3A, 0x3D, 0xF7, 0xF2, 0x21, 0xC7, 0xF1, 0x29, - 0x97, 0x22, 0x31, 0x2C, 0x39, 0x8A, 0xAF, 0x47, 0xF9, 0x3B, 0xA9, 0x8B, 0x2B, 0xEF, 0xE2, 0xF0, - 0x11, 0x59, 0xFC, 0xE4, 0x56, 0xFF, 0x4E, 0xA7, 0x92, 0xE5, 0xE5, 0x26, 0x16, 0xC8, 0x2C, 0x35, - 0xD2, 0x70, 0x9F, 0xAE, 0xA7, 0x08, 0x16, 0x2B, 0x64, 0xA1, 0xF6, 0xF3, 0xC1, 0x43, 0x27, 0x92, - 0x46, 0x4E, 0xA2, 0x01, 0x72, 0x18, 0x08, 0xAB, 0x22, 0x42, 0x1B, 0x9E, 0x35, 0xAE, 0xB3, 0xE6, - 0x42, 0x1B, 0x49, 0x31, 0xBB, 0xA4, 0xD0, 0xD6, 0x7A, 0xEB, 0xFE, 0x32, 0x37, 0x7F, 0xE6, 0x2F, - 0x75, 0x54, 0x1D, 0x88, 0x9F, 0x81, 0xEE, 0xF0, 0x97, 0xC9, 0x12, 0x80, 0x47, 0x5C, 0xCA, 0x3B, - 0x45, 0xF4, 0x63, 0xC3, 0x16, 0x2D, 0x7E, 0xCD, 0x80, 0xC2, 0xBA, 0x50, 0x1D, 0xC2, 0x31, 0x72, - 0xF0, 0x27, 0x97, 0xB0, 0xF4, 0x69, 0x43, 0x2B, 0x26, 0x89, 0x28, 0xFC, 0xBD, 0x03, 0x6A, 0x4A, - 0x22, 0x5D, 0xD3, 0x7D, 0xEC, 0xC8, 0xEC, 0x7B, 0x15, 0xFA, 0x05, 0x5D, 0x73, 0x6B, 0x5B, 0x1B, - 0xC9, 0x83, 0xD0, 0xFA, 0x24, 0xBA, 0x97, 0x11, 0x30, 0x04, 0xD3, 0x11, 0xCE, 0x24, 0xBD, 0x71, - 0xB7, 0xAA, 0xB2, 0xC2, 0x43, 0xC2, 0x67, 0x3B, 0x9C, 0x28, 0x62, 0x52, 0xF0, 0xFA, 0xCB, 0xFA, - 0xDF, 0x4F, 0xC9, 0x23, 0xD1, 0x94, 0xE1, 0x5F, 0x2A, 0xF2, 0xC7, 0x5F, 0x76, 0x6B, 0x86, 0x28, - 0x29, 0xF1, 0x54, 0x4F, 0x7A, 0x4D, 0xFD, 0xD0, 0x51, 0xFA, 0xBC, 0x6F, 0x7B, 0x44, 0xE5, 0xB0, - 0xF3, 0xC0, 0x34, 0x80, 0x6D, 0xE6, 0xDD, 0xCD, 0x7F, 0x67, 0x7B, 0x15, 0xC5, 0xE5, 0x14, 0x64, - 0x80, 0x81, 0xD9, 0x47, 0xCE, 0x71, 0x62, 0x94, 0xCE, 0x41, 0x61, 0xFA, 0xDD, 0x5A, 0x6D, 0xC1, - 0x28, 0x87, 0x39, 0xC4, 0xBC, 0x89, 0x3A, 0x99, 0x18, 0x80, 0xDC, 0x50, 0x72, 0xCF, 0x67, 0x4D, - 0x77, 0x6D, 0x6A, 0xB4, 0x17, 0x85, 0xD6, 0x2B, 0xC3, 0x4A, 0x7C, 0xD1, 0xF3, 0x0E, 0xA4, 0x8F, - 0x3B, 0xDA, 0x8A, 0x7B, 0x0A, 0x37, 0x7D, 0x36, 0xEC, 0x89, 0x87, 0xD9, 0x88, 0xB7, 0xC9, 0x1F, - 0xEB, 0xEE, 0x25, 0x46, 0xA9, 0x3B, 0x19, 0x16, 0x17, 0x2D, 0x0F, 0x8C, 0xEB, 0x19, 0xF3, 0x47, - 0xC7, 0x21, 0xA8, 0x1E, 0x7F, 0xC4, 0xE3, 0x6B, 0x96, 0x1D, 0x63, 0xDD, 0xC2, 0xEF, 0xB2, 0x65, - 0x60, 0x07, 0xE5, 0xD3, 0x48, 0x49, 0x9A, 0xF2, 0xB0, 0x76, 0x2D, 0xFB, 0x68, 0xF8, 0xAD, 0xE9, - 0x3C, 0x52, 0x37, 0x9A, 0xD1, 0xAE, 0x16, 0x37, 0x2E, 0xB3, 0x63, 0xE0, 0x66, 0xB1, 0x4D, 0x49, - 0x83, 0xD2, 0xEA, 0x20, 0xFD, 0x43, 0x84, 0x5B, 0x22, 0xBC, 0x0C, 0xA1, 0x85, 0x28, 0xF7, 0x45, - 0xF1, 0x2A, 0xC2, 0xFE, 0x87, 0x4C, 0xFC, 0x0A, 0x5B, 0xD9, 0x84, 0x7A, 0xAC, 0x8C, 0xBD, 0xDF, - 0xDC, 0xA5, 0xFC, 0xD0, 0x85, 0x65, 0xA2, 0x73, 0x1C, 0x7C, 0xFD, 0xF9, 0xBA, 0x1E, 0xBD, 0x5F, - 0x06, 0xE8, 0xFC, 0x62, 0xD1, 0xF7, 0x13, 0x52, 0xE3, 0xC2, 0xEB, 0xEE, 0x0E, 0x7E, 0x9D, 0x8A, - 0x19, 0x3E, 0xA2, 0x62, 0x06, 0xC5, 0xA1, 0xDC, 0x6B, 0x4A, 0x59, 0xA6, 0x57, 0x73, 0xCB, 0x57, - 0x16, 0x99, 0xFB, 0x93, 0x36, 0xDF, 0x0E, 0x1A, 0x38, 0xD4, 0x89, 0x02, 0x79, 0xB6, 0xA8, 0x52, - 0xCB, 0x2E, 0x96, 0xD4, 0xD8, 0x52, 0xA9, 0x7C, 0xE3, 0x97, 0x47, 0x6F, 0x6E, 0x82, 0x6D, 0x3A, - 0x01, 0x8F, 0x2F, 0x59, 0xDF, 0x93, 0xBA, 0x52, 0xC4, 0x46, 0xDA, 0xC5, 0x0C, 0x2E, 0x40, 0xB8, - 0x37, 0x55, 0x40, 0xB8, 0x13, 0xCD, 0x51, 0x96, 0xCE, 0x4A, 0x6C, 0x0D, 0xF9, 0x5A, 0xE6, 0x34, - 0x95, 0xF0, 0xFF, 0x54, 0x93, 0x05, 0x9D, 0x56, 0x94, 0xF7, 0x23, 0x90, 0x00, 0x44, 0xA7, 0xD9, - 0x86, 0x71, 0xB2, 0xFD, 0x58, 0x19, 0xBB, 0xEC, 0x6B, 0x90, 0x07, 0x2B, 0x7A, 0x20, 0x4B, 0xFD, - 0x0E, 0xB8, 0xF8, 0x00, 0x13, 0xC2, 0xF2, 0x32, 0x39, 0xED, 0x71, 0x59, 0x71, 0xC4, 0xDC, 0xE5, - 0xC2, 0xA9, 0x2B, 0x7B, 0x52, 0x00, 0xCB, 0x49, 0xB4, 0x00, 0xE6, 0x98, 0x13, 0xC1, 0x2F, 0x3A, - 0x19, 0x86, 0xD5, 0x74, 0xCD, 0xBC, 0xBA, 0x4C, 0x48, 0x00, 0x8E, 0x22, 0xD5, 0xAC, 0x11, 0xEF, - 0xC8, 0xCD, 0x99, 0xBA, 0xBC, 0x0F, 0xD4, 0xC0, 0xAE, 0x15, 0x2F, 0x82, 0x6D, 0x4D, 0x44, 0x10, - 0xF1, 0xF5, 0x55, 0xF0, 0x00, 0xAF, 0xEA, 0x96, 0x1F, 0xE6, 0xA6, 0x9A, 0x78, 0xDD, 0x6D, 0xD5, - 0xDF, 0xA4, 0x4D, 0xAE, 0x05, 0xEE, 0x12, 0x9F, 0x9B, 0x99, 0xAC, 0xE4, 0xBE, 0x9E, 0x56, 0xCC, - 0x4B, 0x6D, 0x26, 0xB9, 0x56, 0x9B, 0x9B, 0x52, 0x6D, 0x14, 0x28, 0x7D, 0xE8, 0x75, 0xCB, 0x59, - 0xC0, 0x50, 0x69, 0x6B, 0xD7, 0x68, 0x06, 0xA8, 0x38, 0xD1, 0xBB, 0xD9, 0xA3, 0x3D, 0xA1, 0xBD, - 0x7D, 0x9E, 0xD2, 0xB9, 0x5D, 0x35, 0x02, 0xE0, 0xD4, 0xAF, 0x66, 0x56, 0x7D, 0xF4, 0x88, 0x74, - 0x3C, 0x28, 0x2C, 0xBA, 0x20, 0xC1, 0x2A, 0x93, 0xA9, 0xBA, 0x90, 0xE8, 0xC2, 0xE9, 0x15, 0xC8, - 0x8F, 0xBD, 0x27, 0xDE, 0x21, 0xBF, 0x56, 0x69, 0x93, 0x72, 0x7E, 0xE4, 0xE7, 0x7D, 0xE8, 0x4D, - 0xBF, 0x24, 0xA2, 0x77, 0xC0, 0xE0, 0x30, 0xD9, 0xEE, 0x82, 0xCD, 0x21, 0x60, 0xFC, 0xD1, 0x6F, - 0xB4, 0x40, 0x01, 0xFE, 0xF4, 0x73, 0xAF, 0xBB, 0xF6, 0x2B, 0x41, 0xFC, 0xDE, 0x74, 0x78, 0xE5, - 0x7E, 0xAB, 0xC9, 0xED, 0x63, 0x4B, 0x3E, 0x1A, 0x27, 0xCD, 0xBF, 0x85, 0xA4, 0x70, 0x92, 0x36, - 0x56, 0x70, 0x4A, 0xEE, 0x45, 0xAB, 0x33, 0x0A, 0x76, 0xB8, 0x0B, 0xEA, 0x55, 0xC7, 0x4E, 0xD7, - 0xD9, 0xC7, 0x10, 0x8D, 0x09, 0xFA, 0x10, 0x30, 0x62, 0x20, 0xE5, 0xBC, 0xFB, 0x74, 0x72, 0xA6, - 0x77, 0xB5, 0xBB, 0xD7, 0xD6, 0x60, 0x3A, 0x6B, 0x5D, 0xF5, 0x35, 0xF4, 0x84, 0xA0, 0x19, 0x49, - 0x36, 0x00, 0xC9, 0x35, 0xCC, 0xF7, 0xFE, 0x92, 0xF9, 0x4B, 0x8B, 0xB3, 0xBE, 0x98, 0xBF, 0xF4, - 0x25, 0xB1, 0x62, 0x4D, 0x41, 0xA0, 0xF7, 0x36, 0x6C, 0x86, 0x3C, 0x4F, 0xC4, 0xF8, 0xF2, 0xFC, - 0xE6, 0x34, 0x30, 0x95, 0x32, 0x9D, 0xE5, 0x85, 0x70, 0xD8, 0xB8, 0xD6, 0xD9, 0x42, 0xB9, 0x05, - 0x6E, 0x4B, 0x6F, 0x29, 0x33, 0x8E, 0xE4, 0x31, 0x3C, 0x21, 0x7B, 0x19, 0x31, 0x97, 0xD5, 0x62, - 0x6B, 0xF6, 0x98, 0x3C, 0xA5, 0x54, 0x18, 0x16, 0x03, 0x49, 0x51, 0x1F, 0x13, 0x37, 0xFB, 0x18, - 0x9D, 0xCF, 0x16, 0x43, 0x34, 0x7D, 0xB6, 0x5C, 0x9E, 0x74, 0x4D, 0x66, 0x23, 0x99, 0xDE, 0x6E, - 0x57, 0xFE, 0x47, 0x0D, 0x3B, 0x59, 0x3F, 0x01, 0x79, 0x75, 0x0D, 0x78, 0x62, 0x4A, 0xA5, 0xF2, - 0xF8, 0xD6, 0xAE, 0x11, 0x85, 0x88, 0x13, 0x98, 0x07, 0x0B, 0x92, 0x99, 0xC6, 0x9F, 0x85, 0x24, - 0xB1, 0x48, 0xEF, 0x59, 0x11, 0xCB, 0xAB, 0x92, 0xE4, 0x58, 0x50, 0xAA, 0xE8, 0x97, 0xD5, 0xCD, - 0x63, 0x57, 0x61, 0x62, 0x06, 0xBD, 0x26, 0x08, 0x0E, 0xC6, 0x42, 0x98, 0x8E, 0x82, 0x13, 0xD7, - 0xB8, 0x18, 0x7B, 0xAA, 0xFD, 0x42, 0x51, 0x07, 0xDE, 0x6F, 0xCF, 0xE7, 0x87, 0xF6, 0xBF, 0x15, - 0x8D, 0x8E, 0xFD, 0xA9, 0x4A, 0x45, 0x81, 0x57, 0x8F, 0x22, 0x4D, 0x63, 0x21, 0x4E, 0x41, 0x3C, - 0xCD, 0x77, 0xF5, 0xEC, 0xB8, 0x15, 0x8A, 0xBC, 0x69, 0x22, 0x98, 0xE5, 0xA4, 0x66, 0x47, 0xC5, - 0x9F, 0xE9, 0x9D, 0x06, 0xD8, 0xD2, 0x37, 0xA0, 0x4C, 0xDC, 0x33, 0xD4, 0xE7, 0xED, 0x77, 0x7D, - 0xA2, 0x20, 0x81, 0xB2, 0x46, 0xC5, 0xF6, 0xF5, 0x2A, 0x76, 0x50, 0xAF, 0xC2, 0x5A, 0xC7, 0x8F, - 0xD8, 0x3C, 0x4F, 0x2F, 0xE3, 0x56, 0x04, 0xB2, 0x6C, 0x8C, 0x0D, 0x84, 0xD7, 0xE0, 0xB5, 0x45, - 0xB2, 0x93, 0x34, 0xA0, 0xC2, 0xF4, 0x3A, 0x28, 0xDC, 0x50, 0xE8, 0xF3, 0xF0, 0x7C, 0x67, 0x1A, - 0x11, 0xD7, 0x8D, 0xB2, 0x71, 0x3D, 0xB3, 0x68, 0x49, 0x19, 0x29, 0x54, 0xDF, 0x44, 0xB9, 0x48, - 0xDD, 0x9E, 0xCE, 0xCD, 0x2D, 0x69, 0xB6, 0x18, 0xAD, 0xBC, 0xDC, 0xDF, 0x1F, 0x48, 0x04, 0x16, - 0xD6, 0x3A, 0x39, 0x7E, 0x30, 0xDB, 0x9D, 0xE1, 0x14, 0xF2, 0x5F, 0xDB, 0x1D, 0xBB, 0x7F, 0x4F, - 0x49, 0xBF, 0x4D, 0x2B, 0x9B, 0x5C, 0x7E, 0xA8, 0x1B, 0x79, 0x4F, 0x29, 0xA2, 0xF8, 0xBA, 0x36, - 0x86, 0x10, 0xFA, 0x7C, 0x45, 0x99, 0xE9, 0xD1, 0xDB, 0x93, 0xDB, 0x2A, 0xD5, 0xA8, 0x61, 0x48, - 0xBA, 0xD9, 0x40, 0xD7, 0xAE, 0xE5, 0x35, 0xAA, 0xF0, 0xA5, 0xFD, 0xC5, 0x64, 0x0B, 0x31, 0xA5, - 0x9D, 0x83, 0x31, 0xF6, 0xB8, 0xB5, 0x18, 0x3E, 0xB4, 0x2A, 0x8E, 0x70, 0x7A, 0xB8, 0xAC, 0xB5, - 0x92, 0xDD, 0x12, 0xA7, 0x9D, 0x41, 0xB1, 0x16, 0xE8, 0x45, 0x63, 0x1B, 0xB9, 0x73, 0xF1, 0x19, - 0xF6, 0xAE, 0x0F, 0xF3, 0xF7, 0x60, 0xED, 0x27, 0x70, 0x12, 0x8C, 0x12, 0x3A, 0xCF, 0xA6, 0xDC, - 0xBD, 0x17, 0x82, 0x05, 0x6E, 0x10, 0x04, 0xD4, 0xE7, 0x10, 0x9B, 0x83, 0x55, 0xB0, 0xED, 0x1B, - 0xF9, 0x7D, 0x75, 0x8E, 0xB2, 0x26, 0xA7, 0xBD, 0xE2, 0x0F, 0x29, 0x25, 0x6C, 0xFD, 0xC9, 0xC4, - 0x72, 0xE1, 0x1C, 0xDC, 0x9E, 0xBE, 0x69, 0xB5, 0xE8, 0x31, 0x83, 0x03, 0x5A, 0xEA, 0xA3, 0x52, - 0xD7, 0x51, 0x8A, 0x76, 0xB8, 0x83, 0xF0, 0x5E, 0xDC, 0xFC, 0xED, 0x80, 0x36, 0x7A, 0x39, 0xC6, - 0xFC, 0xF3, 0xC3, 0xE1, 0x5D, 0x15, 0x05, 0x30, 0xF6, 0x74, 0x93, 0x45, 0xB5, 0x2B, 0x0B, 0x63, - 0x2E, 0xF1, 0x24, 0x4B, 0x16, 0xD9, 0x61, 0xDB, 0x97, 0x9A, 0xC8, 0xFF, 0xCE, 0x74, 0xE9, 0x39, - 0x93, 0x00, 0xF8, 0xE0, 0x50, 0x62, 0x07, 0x0A, 0x6B, 0xB4, 0xBA, 0x2B, 0x61, 0x09, 0x25, 0x58, - 0x18, 0x0A, 0xB8, 0xDA, 0x8D, 0xFA, 0x8C, 0x4A, 0x41, 0xBE, 0xA4, 0x51, 0x9B, 0x83, 0x14, 0xC4, - 0xB5, 0x81, 0xB0, 0xA1, 0x35, 0x48, 0x34, 0xEB, 0xAF, 0x74, 0xF4, 0x61, 0xC5, 0x00, 0x39, 0x7D, - 0xAD, 0xF1, 0x07, 0x9C, 0x43, 0x20, 0x8F, 0x4B, 0x3D, 0xD3, 0x7C, 0x91, 0x1D, 0xC3, 0x3B, 0x06, - 0x50, 0x59, 0xA9, 0xC9, 0xA3, 0x23, 0xC9, 0xA6, 0x8A, 0x29, 0x84, 0x0D, 0x7D, 0xEE, 0x56, 0x5D, - 0xA1, 0xB6, 0xA3, 0xE7, 0x1F, 0x2A, 0xFB, 0x95, 0x7B, 0xFC, 0x9F, 0x9A, 0x18, 0xEA, 0xFF, 0xFD, - 0x61, 0x75, 0x3A, 0xF2, 0x22, 0xFF, 0xEB, 0xA2, 0x7C, 0x5A, 0x16, 0xB1, 0xE9, 0x93, 0xB0, 0x4D, - 0xA7, 0xA4, 0xB0, 0xAF, 0x70, 0x8C, 0x7E, 0x7D, 0xE8, 0x4F, 0xAA, 0x9D, 0x81, 0xD6, 0xF8, 0xB5, - 0xB6, 0x32, 0xA5, 0x31, 0xA1, 0x55, 0x11, 0x3A, 0x01, 0x13, 0x38, 0x3A, 0x41, 0x7A, 0x79, 0x31, - 0x3C, 0x13, 0xF5, 0x2C, 0x97, 0x28, 0xBD, 0x1F, 0x2E, 0x68, 0xAB, 0xA1, 0x52, 0x5F, 0xBB, 0x2A, - 0xCB, 0x11, 0xFE, 0x4A, 0x34, 0x30, 0xCD, 0xDD, 0x38, 0xAC, 0xED, 0xD0, 0x53, 0xC6, 0xC4, 0x33, - 0xE5, 0x17, 0x41, 0xC8, 0x7D, 0x14, 0x9C, 0x8C, 0x2D, 0x59, 0x61, 0xB1, 0xEC, 0x6A, 0x48, 0xAD, - 0xC7, 0x42, 0x79, 0x9B, 0x63, 0xDB, 0xB0, 0xAD, 0xAF, 0x44, 0x85, 0x2E, 0x24, 0x11, 0xE6, 0x1E, - 0x56, 0xB2, 0x1B, 0x2E, 0x98, 0x7E, 0x64, 0x3D, 0x98, 0x69, 0x51, 0x05, 0x3D, 0x5C, 0x0A, 0x85, - 0xCA, 0x58, 0x0E, 0x11, 0x86, 0xA7, 0xD6, 0xAC, 0xFF, 0x21, 0x12, 0x9F, 0xA1, 0x52, 0xE4, 0xD9, - 0xD5, 0xAC, 0x9B, 0xE2, 0x4B, 0xF0, 0x57, 0xFA, 0xFC, 0x05, 0x84, 0xB6, 0xD9, 0xB0, 0xCE, 0x5E, - 0xA0, 0x73, 0x32, 0xCE, 0x15, 0x29, 0xE8, 0x8F, 0xC4, 0xD9, 0x22, 0x3A, 0x9D, 0x71, 0xC5, 0x37, - 0x2B, 0x33, 0x76, 0x63, 0x49, 0x52, 0x8A, 0x2E, 0x89, 0x6D, 0x5A, 0x04, 0x83, 0xC1, 0xD9, 0x46, - 0xC3, 0x5C, 0x93, 0x6C, 0x3B, 0xDB, 0xFC, 0x1C, 0xC1, 0x65, 0x3B, 0x2C, 0xAD, 0xD5, 0x78, 0x9A, - 0x3A, 0xE4, 0xC3, 0x04, 0x11, 0xD8, 0xBD, 0x63, 0xA9, 0x93, 0x01, 0xF1, 0x42, 0x89, 0x5E, 0x66, - 0x95, 0xF2, 0x75, 0x38, 0x30, 0x4B, 0x39, 0x41, 0x49, 0x54, 0x8E, 0x12, 0x36, 0xFB, 0x9A, 0xA0, - 0x61, 0x13, 0x1C, 0xC2, 0xB2, 0x30, 0x7E, 0xD5, 0x22, 0xEB, 0xA3, 0xB6, 0x69, 0x2E, 0x0F, 0x0B, - 0xB0, 0x29, 0xF3, 0x24, 0x5A, 0x29, 0xA6, 0x3F, 0xC9, 0xC1, 0x56, 0xC5, 0x8E, 0xAA, 0x0B, 0x17, - 0x44, 0xBC, 0xFF, 0xE3, 0x12, 0xB8, 0x3E, 0xA9, 0x16, 0xF9, 0x7F, 0x57, 0x92, 0x7C, 0x0C, 0xFD, - 0x87, 0x9D, 0x70, 0xED, 0x81, 0xD0, 0x77, 0x01, 0x77, 0x71, 0xF5, 0x6C, 0x7F, 0xCC, 0xE4, 0xF0, - 0xAD, 0x27, 0x66, 0x2D, 0x16, 0x7B, 0x4E, 0x95, 0xF9, 0x59, 0xAA, 0x8A, 0x83, 0xE3, 0x1E, 0xD9, - 0x6E, 0x9C, 0x84, 0xEB, 0xBD, 0x5B, 0x33, 0x68, 0xA9, 0x3F, 0xDA, 0x69, 0xCB, 0xF1, 0xC7, 0x64, - 0x99, 0x27, 0xEF, 0xFF, 0xE2, 0x37, 0x34, 0x2D, 0x3C, 0x92, 0xAF, 0x7B, 0xE6, 0x6D, 0x7E, 0xF9, - 0xD2, 0x95, 0x14, 0xF1, 0x01, 0x93, 0xF2, 0xBD, 0xDF, 0x59, 0x67, 0xF6, 0x2D, 0x36, 0xBB, 0x8E, - 0x16, 0xCA, 0x07, 0xEC, 0x34, 0xA0, 0xE2, 0x16, 0x6C, 0xEC, 0x23, 0x41, 0x87, 0x7A, 0x66, 0x82, - 0x09, 0x6A, 0xFE, 0x21, 0xB3, 0x9A, 0xC7, 0x12, 0x0D, 0x07, 0xEB, 0xCF, 0xCB, 0x44, 0x9B, 0xA3, - 0xA1, 0xD9, 0x07, 0x76, 0x1D, 0x93, 0x96, 0x1B, 0x6D, 0xA1, 0x65, 0x6D, 0xB2, 0x62, 0x81, 0x55, - 0xFD, 0xE1, 0x76, 0xF2, 0x6F, 0x9A, 0x71, 0x9F, 0xFC, 0x48, 0x8D, 0x58, 0x1D, 0x3E, 0xFE, 0xBC, - 0x02, 0xB5, 0x36, 0xEE, 0x58, 0x35, 0x82, 0xF3, 0x51, 0x93, 0x35, 0x7E, 0xFA, 0xAF, 0x7E, 0x56, - 0x7E, 0xE8, 0x59, 0x7E, 0x90, 0x73, 0x9B, 0x0E, 0x4D, 0x0D, 0x84, 0x75, 0x30, 0x29, 0xCA, 0xE7, - 0x2C, 0xB3, 0xAC, 0x53, 0x3C, 0xC3, 0x7D, 0x55, 0xCD, 0xE0, 0xB9, 0xF8, 0x44, 0x02, 0xF2, 0x2B, - 0xB7, 0xD1, 0x83, 0x75, 0xDC, 0x96, 0xE7, 0x62, 0x5A, 0x58, 0x63, 0x2D, 0xC1, 0x33, 0xD2, 0x74, - 0x27, 0x05, 0xFD, 0xB7, 0x69, 0x63, 0x34, 0x81, 0xDB, 0xC1, 0x24, 0x10, 0x3A, 0xC2, 0xE2, 0xE9, - 0x75, 0xF8, 0x90, 0x50, 0x3A, 0x3C, 0xAF, 0xCD, 0x4E, 0x78, 0xB0, 0xFA, 0x5F, 0x2C, 0x09, 0x90, - 0xFE, 0xDA, 0xE4, 0x99, 0x8E, 0x3E, 0x63, 0x74, 0x3C, 0x6C, 0xD6, 0xC5, 0x2A, 0x1A, 0xBD, 0x95, - 0xA3, 0xAB, 0xF3, 0xEF, 0x1E, 0x95, 0x02, 0x8E, 0xCB, 0x23, 0xED, 0x11, 0xDB, 0x42, 0x45, 0xD5, - 0x5D, 0xDF, 0xF6, 0xE5, 0x98, 0xB4, 0x46, 0x49, 0x1A, 0xC6, 0x87, 0xFC, 0xA1, 0x79, 0x15, 0xD8, - 0x84, 0x99, 0xFE, 0x0B, 0x33, 0x30, 0x21, 0xA7, 0x59, 0x0A, 0x35, 0xE6, 0x68, 0x62, 0x55, 0x58, - 0xB4, 0x74, 0xDC, 0x80, 0xA4, 0xAD, 0x97, 0x57, 0x08, 0x9D, 0xC9, 0x9C, 0x1C, 0x0E, 0xD6, 0xE5, - 0xE3, 0xC8, 0x13, 0x02, 0xA8, 0xB9, 0x06, 0x27, 0x55, 0x89, 0xE7, 0xA3, 0xBF, 0xB0, 0xA6, 0xD0, - 0x92, 0xAD, 0xDA, 0xFE, 0x9E, 0x38, 0x2B, 0x88, 0x18, 0x7E, 0x3E, 0x90, 0xC3, 0xC0, 0x90, 0xAB, - 0x10, 0x21, 0x49, 0x47, 0xD1, 0x9D, 0x0A, 0xE9, 0x9F, 0xF9, 0xBB, 0x44, 0x83, 0x43, 0xBE, 0xBB, - 0x72, 0xD3, 0x06, 0xB4, 0x1B, 0x11, 0x03, 0xB8, 0xF5, 0xE5, 0x85, 0x1C, 0x4D, 0x7B, 0x0E, 0x65, - 0x33, 0xB0, 0x06, 0xD4, 0x58, 0x1F, 0xC9, 0x52, 0x27, 0xAD, 0xC9, 0xDE, 0x33, 0x4D, 0xC5, 0x45, - 0x6F, 0x11, 0xE1, 0x1D, 0xB9, 0x26, 0xED, 0x5B, 0x9B, 0xF6, 0xFC, 0x87, 0xF7, 0x96, 0x58, 0x5D, - 0xD7, 0x10, 0x15, 0x59, 0x1E, 0x3C, 0xFC, 0xF2, 0x8C, 0x7B, 0xB8, 0x70, 0x35, 0xD2, 0xB3, 0xA2, - 0xF1, 0xE7, 0x9D, 0xC6, 0xAE, 0x37, 0x71, 0xDA, 0x04, 0x32, 0x09, 0x33, 0xF7, 0x7D, 0x45, 0x33, - 0x9F, 0x5C, 0xD6, 0x66, 0xEC, 0x68, 0xCA, 0xEC, 0xBF, 0x4C, 0xF8, 0xA1, 0x4D, 0x5C, 0x41, 0x0E, - 0x69, 0x1F, 0x96, 0xE8, 0xD9, 0x76, 0xB9, 0xEA, 0x04, 0xEF, 0x91, 0xD4, 0xD7, 0x36, 0xEF, 0xE9, - 0xE6, 0x7B, 0x81, 0x31, 0xFD, 0x4E, 0x15, 0x17, 0xF1, 0x25, 0x86, 0x4C, 0x94, 0x2A, 0xAA, 0x50, - 0xB0, 0x98, 0x19, 0xB4, 0x34, 0x81, 0xE2, 0x61, 0xE6, 0xEE, 0x9C, 0x70, 0x72, 0x38, 0xB8, 0xE8, - 0xA6, 0xE1, 0x9F, 0x24, 0xDC, 0xD2, 0x9D, 0xC3, 0x94, 0x43, 0x65, 0x5B, 0x22, 0x45, 0xF2, 0x75, - 0x33, 0x6D, 0xB9, 0x60, 0xC6, 0x9F, 0x0A, 0xC1, 0x1F, 0xFC, 0x8B, 0x7B, 0xAB, 0x71, 0x61, 0xAE, - 0xD2, 0x1B, 0xF6, 0x79, 0x3D, 0x63, 0x1F, 0x4F, 0x1C, 0xDD, 0x4B, 0x50, 0x02, 0x97, 0xCD, 0xF4, - 0xC7, 0x0B, 0xFC, 0xB3, 0xD1, 0x21, 0xD3, 0x73, 0x1B, 0x4B, 0xE8, 0x9F, 0x3D, 0x16, 0x88, 0x0E, - 0x7F, 0xCC, 0x26, 0xA6, 0xF5, 0x8F, 0x69, 0x7F, 0xAC, 0xE8, 0x3F, 0x7B, 0x29, 0x81, 0xDA, 0x14, - 0x8F, 0x98, 0x78, 0x11, 0x34, 0x46, 0x60, 0xAD, 0x9E, 0xB3, 0x69, 0xFD, 0x74, 0x95, 0x3A, 0x14, - 0x30, 0xBE, 0x34, 0xE2, 0xAC, 0x54, 0x81, 0x70, 0x1F, 0x47, 0xD7, 0x5A, 0xDE, 0x81, 0x29, 0x17, - 0x9B, 0x3F, 0xC7, 0x57, 0x56, 0x26, 0xCD, 0xF8, 0x3B, 0x4E, 0x94, 0x4E, 0xA4, 0x09, 0x46, 0x1A, - 0x6D, 0xA3, 0x44, 0x51, 0xA9, 0x9F, 0x97, 0x88, 0x5E, 0x5E, 0x70, 0xCA, 0xDE, 0xA4, 0xAF, 0x6D, - 0xBC, 0xCE, 0xF6, 0x67, 0x81, 0x10, 0xD3, 0xF5, 0xB8, 0xC9, 0x49, 0xF3, 0x98, 0x71, 0x2D, 0x29, - 0xBD, 0x34, 0x08, 0x25, 0x1B, 0x9A, 0x6F, 0xC3, 0x4D, 0xC3, 0x9F, 0x5E, 0xE2, 0xA2, 0xF3, 0x82, - 0x52, 0xA9, 0xF6, 0x79, 0x14, 0x6F, 0xD0, 0x12, 0xB6, 0x0D, 0x4C, 0xAC, 0x3E, 0x2A, 0x8C, 0x86, - 0xE1, 0xFF, 0x1C, 0x49, 0x43, 0xF2, 0x1D, 0x34, 0xA3, 0x0F, 0xA3, 0x9B, 0x2C, 0xF3, 0x9C, 0xFC, - 0x23, 0x4B, 0xE0, 0xCB, 0xE6, 0xBE, 0x7E, 0x8B, 0x51, 0x2D, 0x32, 0x92, 0xCC, 0xC6, 0xDB, 0x36, - 0x1B, 0x83, 0x80, 0x64, 0xD2, 0x23, 0x1C, 0x60, 0x90, 0x1C, 0x71, 0x06, 0x0F, 0x30, 0xC0, 0xDF, - 0xFE, 0xF7, 0x50, 0x5A, 0xF8, 0x9C, 0x97, 0x29, 0xFB, 0x7B, 0xEB, 0x91, 0x6A, 0x42, 0xE4, 0xAB, - 0x62, 0xB4, 0x1F, 0x14, 0xEC, 0x1A, 0x9F, 0xC4, 0x98, 0x77, 0x85, 0x8B, 0xF1, 0x15, 0x2B, 0x2C, - 0x3F, 0xAB, 0x3A, 0x5E, 0xD3, 0x50, 0x32, 0xDD, 0x23, 0x81, 0x89, 0x3B, 0xB8, 0xFD, 0x49, 0x78, - 0xA9, 0x35, 0x20, 0x2D, 0xBC, 0xFC, 0x10, 0x8A, 0x08, 0xA0, 0x57, 0x24, 0xFA, 0x29, 0xD3, 0x9C, - 0xC0, 0xC5, 0x06, 0xF2, 0x7D, 0xC4, 0x45, 0x38, 0x1F, 0xC6, 0xE4, 0xC8, 0x23, 0x65, 0xD2, 0x5A, - 0xE5, 0xCD, 0x63, 0x14, 0x56, 0x03, 0xAA, 0x29, 0x82, 0xAB, 0x67, 0x92, 0x2C, 0x71, 0x67, 0x6A, - 0x36, 0xF9, 0xE1, 0x89, 0xD2, 0x98, 0x88, 0x97, 0x65, 0x72, 0xE4, 0x3C, 0x5A, 0x1D, 0xB7, 0x34, - 0x4D, 0x01, 0x91, 0x5D, 0xC4, 0xAF, 0x88, 0x2F, 0xD1, 0x27, 0x26, 0x36, 0x16, 0x98, 0x39, 0x9A, - 0xEA, 0xFA, 0xDF, 0x3B, 0x7F, 0xD8, 0x76, 0x95, 0xDB, 0x03, 0x82, 0x86, 0xD0, 0x6D, 0x15, 0xD0, - 0xF0, 0xB9, 0xCC, 0xB9, 0xD6, 0xE1, 0x9C, 0xC7, 0xAE, 0x3C, 0xA8, 0xB9, 0x49, 0xA3, 0xC4, 0xB3, - 0x24, 0x3A, 0xA3, 0x50, 0x7E, 0xDF, 0xBE, 0x5F, 0xAF, 0xC3, 0x7C, 0x3C, 0xC7, 0x39, 0xD9, 0x29, - 0x06, 0xD5, 0x0B, 0xE8, 0xFA, 0x80, 0xC2, 0xCE, 0xA8, 0xD9, 0x20, 0xCE, 0x28, 0x0A, 0xDE, 0x15, - 0xB5, 0x0D, 0x9A, 0xB8, 0xB0, 0x7B, 0x33, 0xB8, 0x35, 0xEB, 0x4E, 0xDE, 0xF5, 0x9F, 0x66, 0x79, - 0x52, 0x44, 0xD2, 0x49, 0x3A, 0x94, 0xE2, 0xCB, 0x83, 0x22, 0x7D, 0xC6, 0x1C, 0xEB, 0x44, 0x28, - 0xE9, 0x38, 0x8F, 0xB7, 0xF6, 0x3D, 0x39, 0x8F, 0x64, 0x9F, 0x86, 0x85, 0x27, 0x7E, 0xBF, 0xD8, - 0xC3, 0x8B, 0x70, 0xF9, 0x7A, 0xE6, 0x19, 0xAF, 0xA8, 0x8F, 0x6C, 0x38, 0xE2, 0xB4, 0x1E, 0xF3, - 0xDD, 0xFD, 0x6C, 0xB4, 0x04, 0xB4, 0xD1, 0x37, 0xF4, 0x59, 0xFF, 0x5A, 0x8B, 0x73, 0x6B, 0x62, - 0x6C, 0x91, 0x23, 0x96, 0x61, 0xEC, 0x9F, 0xF6, 0x83, 0x18, 0xD9, 0xEE, 0xEF, 0x00, 0xB0, 0xEB, - 0x8D, 0xC6, 0x35, 0xCE, 0xB4, 0xE0, 0xBB, 0x84, 0xD3, 0xD7, 0xDB, 0x77, 0x4A, 0x07, 0xE7, 0x3B, - 0xF7, 0x12, 0xF8, 0x9D, 0xF5, 0x0A, 0xDF, 0xF4, 0x1B, 0x00, 0x1A, 0x77, 0xD9, 0x03, 0x21, 0xC2, - 0x46, 0xF7, 0x7E, 0x4B, 0xE2, 0xC1, 0xF1, 0x8D, 0xFE, 0x61, 0xB9, 0xD4, 0x0B, 0xC9, 0x65, 0x82, - 0xCF, 0x7F, 0x3D, 0x24, 0x9E, 0xC9, 0x97, 0x30, 0xE9, 0x81, 0xB4, 0x6B, 0xA5, 0x6A, 0xA7, 0xED, - 0xE3, 0x8F, 0x88, 0x09, 0x78, 0x36, 0x6A, 0x14, 0xB9, 0xBB, 0x93, 0xE6, 0xA2, 0x07, 0x72, 0x81, - 0xD2, 0x41, 0x75, 0x28, 0x50, 0x57, 0xDE, 0x68, 0x04, 0xB1, 0x0F, 0x1F, 0xCF, 0x0F, 0x3E, 0xCB, - 0x44, 0x3D, 0x2A, 0x01, 0xC1, 0x38, 0x61, 0x8E, 0xA1, 0x13, 0xB8, 0x82, 0x3F, 0xAC, 0xA7, 0x31, - 0x7B, 0xF7, 0xA7, 0xCD, 0xBF, 0x15, 0xD3, 0xC2, 0xCC, 0xDC, 0xD0, 0xB2, 0xC1, 0x44, 0xBA, 0x82, - 0x85, 0x2D, 0x59, 0x53, 0xE4, 0xBE, 0x6B, 0x69, 0x8F, 0x5C, 0x20, 0x38, 0x76, 0xE0, 0x49, 0x59, - 0x32, 0x0A, 0x90, 0x42, 0x13, 0x35, 0x24, 0x71, 0xD9, 0x98, 0x9A, 0x0F, 0x0A, 0x83, 0x90, 0x47, - 0xD0, 0x57, 0x29, 0xC8, 0xF5, 0x5B, 0xA8, 0x5D, 0x41, 0xCD, 0x61, 0x98, 0x5C, 0x28, 0x1B, 0xF2, - 0x9B, 0x31, 0x3F, 0x14, 0x79, 0x37, 0xEA, 0xDD, 0x42, 0xD3, 0x59, 0x20, 0x0D, 0x5A, 0x3D, 0x59, - 0x84, 0x1A, 0x48, 0x28, 0x6D, 0x48, 0x3B, 0x0C, 0x87, 0xB0, 0xBB, 0xEF, 0x72, 0x91, 0x85, 0xE0, - 0x9A, 0x2C, 0x78, 0xAF, 0xFE, 0x0D, 0x6D, 0x9A, 0x99, 0x10, 0x16, 0x7D, 0x42, 0x76, 0xA0, 0xAA, - 0xC7, 0xF9, 0x11, 0x5C, 0x04, 0x83, 0x0A, 0xA9, 0x48, 0x65, 0x28, 0x81, 0x65, 0x2E, 0xA7, 0x5A, - 0xFE, 0xDB, 0x10, 0x56, 0xEA, 0x19, 0x67, 0xC2, 0x61, 0xBB, 0x9B, 0x6B, 0x48, 0x4F, 0x22, 0x4C, - 0xB7, 0xEC, 0x15, 0x84, 0x08, 0x1A, 0xFE, 0x08, 0x46, 0xCA, 0x72, 0x10, 0x30, 0x81, 0xAE, 0xE7, - 0x1B, 0xAA, 0x2F, 0x1B, 0x22, 0x6A, 0x89, 0x95, 0x34, 0x9F, 0x53, 0xE4, 0xDA, 0x0B, 0x1B, 0x56, - 0xB4, 0xB7, 0x71, 0x99, 0xB8, 0x77, 0x91, 0xEB, 0x59, 0x61, 0x71, 0x84, 0xAF, 0x55, 0xBD, 0x33, - 0x1C, 0xD9, 0x7A, 0x40, 0xD3, 0x7B, 0x6C, 0xB0, 0xA4, 0x96, 0x07, 0x57, 0x49, 0x9C, 0xC1, 0x0B, - 0x23, 0xF3, 0xE5, 0x36, 0xA4, 0xE8, 0xE1, 0xEC, 0x51, 0xF1, 0xBB, 0x7B, 0x40, 0x4B, 0x05, 0xD1, - 0x3D, 0xD6, 0x6D, 0x22, 0x7C, 0x9D, 0x51, 0x28, 0x70, 0xF6, 0xB3, 0x0C, 0x6F, 0xB2, 0xE1, 0xBC, - 0xFF, 0xB8, 0xA3, 0x92, 0x7C, 0x0A, 0xA3, 0x36, 0x6D, 0xF8, 0xFC, 0x27, 0x45, 0x58, 0x94, 0xE0, - 0x0A, 0x90, 0xF8, 0x2A, 0xF3, 0x02, 0xA4, 0x98, 0xD8, 0xEF, 0x1C, 0x53, 0xE2, 0x47, 0xC7, 0x20, - 0xB2, 0x6F, 0xB7, 0x39, 0x5A, 0xA9, 0x49, 0xC2, 0x65, 0x18, 0x50, 0xBD, 0x7F, 0xB0, 0xDE, 0xBB, - 0x2F, 0x56, 0xDD, 0x62, 0x85, 0xAC, 0x3B, 0x7E, 0xCD, 0x00, 0x88, 0x7A, 0x22, 0xC5, 0x03, 0x03, - 0x26, 0xC4, 0x27, 0x09, 0xE8, 0x16, 0x36, 0xB7, 0x0B, 0xDF, 0xDA, 0x21, 0xEB, 0x59, 0xE8, 0x6D, - 0x96, 0x2D, 0x18, 0x89, 0xD4, 0x4E, 0x5A, 0x66, 0x63, 0x31, 0x15, 0xF0, 0x48, 0x50, 0x7A, 0xF3, - 0xA7, 0x82, 0xE0, 0x91, 0x04, 0xB2, 0x16, 0xAC, 0xA1, 0xD4, 0xC1, 0xE4, 0xBD, 0xC9, 0x43, 0x83, - 0xD9, 0x18, 0x11, 0x50, 0xC0, 0x93, 0x9D, 0x6B, 0x17, 0x63, 0xC8, 0xA3, 0xAF, 0xAC, 0xBF, 0x29, - 0x65, 0xA6, 0x4A, 0xE4, 0xCD, 0xE2, 0x89, 0x59, 0xF8, 0x96, 0xF8, 0x3B, 0x80, 0xCA, 0x68, 0xF2, - 0xBF, 0xBE, 0xFD, 0xD0, 0x84, 0x88, 0xE3, 0x3D, 0x08, 0x8A, 0x08, 0x39, 0xDC, 0x88, 0x71, 0x61, - 0x76, 0xAD, 0xB6, 0xBE, 0xC0, 0xA4, 0x28, 0xEE, 0x38, 0x8F, 0x2E, 0x8D, 0x3A, 0x28, 0xAE, 0xEB, - 0x93, 0x7E, 0xF4, 0x2E, 0x5F, 0x3B, 0xEA, 0x37, 0x9A, 0x53, 0x6C, 0xC5, 0x3A, 0x2F, 0x7F, 0xA9, - 0x80, 0x85, 0x18, 0xFE, 0x14, 0x0C, 0x37, 0xA7, 0xE2, 0x78, 0x90, 0x20, 0x1F, 0x41, 0x1C, 0x03, - 0xD1, 0xD0, 0x8C, 0xB2, 0x2D, 0x4C, 0x32, 0x81, 0x63, 0xF6, 0x6F, 0xD3, 0x7F, 0xB4, 0x6D, 0xA8, - 0xD6, 0xE0, 0x56, 0x84, 0xAD, 0x37, 0x96, 0x44, 0xB4, 0xAE, 0x6F, 0x49, 0x3E, 0x30, 0x0C, 0x79, - 0xE3, 0x93, 0xBA, 0xD2, 0x10, 0x71, 0xAC, 0x7C, 0x06, 0x89, 0x26, 0xCB, 0x72, 0x9E, 0xC4, 0xCC, - 0xBB, 0xA1, 0xDE, 0x9B, 0x66, 0x75, 0x6F, 0xAC, 0x51, 0x93, 0xE8, 0xF4, 0x43, 0xE4, 0x79, 0xF2, - 0x50, 0x67, 0x3D, 0x1B, 0x33, 0xB5, 0xEC, 0x93, 0x10, 0xCE, 0x78, 0x3C, 0x0C, 0x25, 0x44, 0x30, - 0x3C, 0xAB, 0x40, 0x6F, 0x4B, 0x54, 0x0C, 0x38, 0xD4, 0xEF, 0x18, 0xED, 0xA5, 0x75, 0x1E, 0x9C, - 0x06, 0x42, 0x11, 0x9D, 0xEC, 0xE8, 0x81, 0x38, 0xBE, 0xEF, 0x21, 0xB5, 0x0A, 0xC3, 0x38, 0x94, - 0x0C, 0x5A, 0xE2, 0x47, 0xDC, 0x2E, 0x82, 0xC3, 0xA6, 0x9D, 0xA6, 0x54, 0x5E, 0xE6, 0x7C, 0xFE, - 0x7E, 0x7B, 0x86, 0x9A, 0x54, 0xEC, 0xCD, 0xE5, 0x9F, 0xF7, 0x23, 0xDE, 0x06, 0x90, 0x93, 0xB6, - 0xCC, 0xC8, 0x3D, 0x75, 0xA6, 0x43, 0xEA, 0x1F, 0x44, 0xAB, 0xBB, 0x15, 0xC4, 0xAB, 0xB1, 0xDF, - 0xE9, 0x30, 0xB4, 0xB2, 0x3B, 0x5B, 0xA6, 0x57, 0xEE, 0x25, 0x4B, 0x83, 0x26, 0xE4, 0x6B, 0xE3, - 0x35, 0x62, 0xA5, 0xD2, 0xB6, 0xDE, 0xFD, 0x5F, 0x8C, 0x21, 0xF8, 0x15, 0x41, 0x1C, 0x61, 0xCD, - 0x78, 0x0F, 0x61, 0x9E, 0x0C, 0x7E, 0x88, 0xE3, 0x34, 0x7F, 0x0B, 0x00, 0x5D, 0x8A, 0x37, 0x5F, - 0xFB, 0x65, 0xB8, 0xEC, 0x6C, 0x6A, 0x7E, 0x8F, 0x70, 0x6A, 0x17, 0xFB, 0x6B, 0x9D, 0xD8, 0xC3, - 0xD5, 0x13, 0x49, 0xEC, 0xD0, 0xEC, 0x1B, 0xC7, 0x79, 0xBB, 0xD2, 0x89, 0x96, 0x39, 0x1C, 0xF3, - 0x70, 0xEA, 0xF0, 0xEA, 0x6B, 0x45, 0x51, 0xDB, 0x1A, 0x61, 0x60, 0x98, 0x1C, 0x7A, 0xA6, 0x48, - 0x65, 0xDA, 0x85, 0xBE, 0x6B, 0xC4, 0x27, 0x2F, 0x76, 0x6D, 0x5F, 0x4C, 0xDE, 0x92, 0xA1, 0xB3, - 0xD4, 0x11, 0xB4, 0x0B, 0x3A, 0x4C, 0x73, 0xC3, 0xAA, 0x9C, 0x0F, 0x95, 0x9B, 0x2C, 0x67, 0x02, - 0x47, 0xCD, 0xE3, 0x75, 0x84, 0x60, 0x5E, 0x17, 0xAB, 0xF0, 0xBC, 0xBE, 0xB4, 0xAA, 0x4C, 0xEA, - 0x11, 0x52, 0x87, 0xAC, 0x16, 0x56, 0x06, 0x1F, 0xC1, 0x97, 0xF9, 0xAB, 0x26, 0xD9, 0xCC, 0x58, - 0x01, 0xFF, 0x44, 0x21, 0xFE, 0x5D, 0x53, 0x0B, 0xA2, 0xAF, 0xBC, 0x9D, 0x63, 0x25, 0x87, 0x66, - 0xB3, 0x79, 0xB4, 0x9F, 0x49, 0xE6, 0x6E, 0xCB, 0x8B, 0x39, 0x8C, 0x46, 0x60, 0x3D, 0x5B, 0xEC, - 0x08, 0x1B, 0xB2, 0xEC, 0xA2, 0xAA, 0x9A, 0xDA, 0xAA, 0xAD, 0x25, 0xAB, 0x45, 0x99, 0x63, 0x23, - 0x6C, 0x53, 0x87, 0xA0, 0x5A, 0x6C, 0xD6, 0xE3, 0x6C, 0x34, 0x42, 0x0F, 0xF3, 0xA0, 0x23, 0xD3, - 0x16, 0x05, 0xAB, 0x05, 0x14, 0xA8, 0xA9, 0x02, 0x23, 0xFC, 0xC0, 0xED, 0x75, 0xC5, 0x43, 0x7C, - 0x1E, 0xB1, 0x69, 0xB6, 0x01, 0x96, 0x7B, 0x9E, 0x12, 0x1C, 0x72, 0x42, 0x0D, 0xAB, 0x0B, 0x79, - 0x22, 0xF3, 0xF0, 0xEB, 0x71, 0x83, 0x42, 0x3C, 0x11, 0xC7, 0x4F, 0x87, 0xFF, 0x5D, 0x19, 0x0B, - 0xE4, 0x1E, 0xC3, 0xA2, 0xD7, 0x0E, 0x9C, 0x3C, 0x7D, 0xFB, 0x4F, 0xDA, 0x99, 0x9F, 0xF8, 0x3E, - 0xD4, 0xA0, 0xA2, 0xF8, 0x83, 0x33, 0x1E, 0xE2, 0x1C, 0x52, 0x9D, 0xB8, 0x63, 0x8F, 0xA1, 0x4D, - 0x68, 0xAE, 0xCE, 0xD4, 0x12, 0x8E, 0x96, 0xA1, 0x78, 0x27, 0x6A, 0x29, 0x11, 0x19, 0x4C, 0x94, - 0x89, 0x0F, 0xFB, 0x7C, 0xA8, 0xAC, 0x7E, 0x84, 0x44, 0xC8, 0x7A, 0x18, 0xAE, 0x34, 0x0F, 0x6E, - 0x90, 0xDB, 0x1E, 0x79, 0xFA, 0xE8, 0xAF, 0x71, 0xE4, 0x80, 0x24, 0x53, 0x2F, 0xB6, 0xC2, 0x12, - 0x1F, 0xA0, 0x44, 0x98, 0x40, 0xAE, 0x01, 0xD6, 0xFB, 0x86, 0xBB, 0xC6, 0xF7, 0x2F, 0x38, 0x41, - 0xE3, 0x2E, 0x1F, 0x2E, 0x7C, 0x90, 0x1F, 0xD9, 0xD3, 0x34, 0x86, 0xC8, 0xA3, 0x8E, 0xAB, 0x5E, - 0x05, 0x55, 0x71, 0x5B, 0x21, 0xB7, 0x2F, 0x9E, 0x56, 0x32, 0x56, 0xD1, 0xDC, 0xC9, 0xDA, 0xDE, - 0xAC, 0x1D, 0x91, 0x0E, 0x4D, 0x1F, 0x4F, 0xE7, 0x31, 0xFE, 0x9A, 0x3F, 0x18, 0xAD, 0x85, 0x4E, - 0x66, 0x95, 0x76, 0x67, 0x6A, 0xC8, 0x90, 0x6A, 0xB5, 0xB0, 0x7D, 0xB2, 0xB3, 0xD7, 0xD6, 0x42, - 0xF1, 0x63, 0x52, 0xBD, 0x72, 0xE1, 0xD2, 0x63, 0x9A, 0x00, 0x45, 0x8E, 0x77, 0xCF, 0x93, 0xCF, - 0x1A, 0x31, 0xAA, 0x16, 0xA9, 0xCF, 0x45, 0xE3, 0x99, 0x3E, 0x6C, 0x70, 0xE9, 0x93, 0x83, 0x78, - 0x11, 0xB8, 0x80, 0xEA, 0x75, 0x5A, 0x87, 0xCE, 0x1D, 0xCD, 0x12, 0x5F, 0x1F, 0x6F, 0x86, 0x25, - 0x5E, 0x95, 0x22, 0x07, 0xFE, 0x29, 0xDA, 0x93, 0x52, 0x41, 0x62, 0x79, 0x06, 0x06, 0x83, 0xAE, - 0x42, 0x35, 0x5C, 0x9E, 0x01, 0xF8, 0xFA, 0x3F, 0x07, 0x15, 0xCA, 0x02, 0x69, 0x8E, 0xEA, 0x9E, - 0xEF, 0xF4, 0x99, 0x26, 0x73, 0x42, 0xC2, 0xEC, 0x0F, 0xEC, 0x03, 0x8F, 0x66, 0xC1, 0x88, 0x76, - 0xC5, 0xC2, 0x55, 0x46, 0x59, 0xC4, 0x28, 0x55, 0x93, 0xBF, 0x7C, 0x1C, 0x5C, 0xA0, 0xBA, 0x8A, - 0xCA, 0x8A, 0x81, 0x6C, 0xA3, 0xDE, 0x2D, 0x63, 0xC5, 0xCA, 0x0B, 0x8E, 0x99, 0xC9, 0xE4, 0x7E, - 0x32, 0x36, 0xD8, 0xFA, 0x80, 0xA5, 0x93, 0x4F, 0x5C, 0x97, 0x33, 0x74, 0xD2, 0x03, 0xFF, 0xFD, - 0x57, 0x84, 0x26, 0x62, 0x6A, 0x4C, 0x15, 0x45, 0xB9, 0x7C, 0xCD, 0xD8, 0x7B, 0xC5, 0x70, 0xA1, - 0xCB, 0xB4, 0xDE, 0xA6, 0xBD, 0xE0, 0xE9, 0x49, 0xB7, 0xEA, 0x21, 0x17, 0xCD, 0x0C, 0xA7, 0xF2, - 0x9B, 0xB6, 0x26, 0x06, 0xB1, 0x63, 0x3D, 0x0D, 0x1A, 0xAE, 0x57, 0xF1, 0x53, 0xDA, 0x61, 0x47, - 0x7E, 0x66, 0xC0, 0x2A, 0xAC, 0x7E, 0xE8, 0xE9, 0x4F, 0xC2, 0x21, 0x01, 0x0B, 0x9C, 0xA7, 0x98, - 0x05, 0x3A, 0x34, 0x68, 0x19, 0x26, 0x35, 0x57, 0xF7, 0xF8, 0xE0, 0x77, 0x7B, 0x42, 0x8D, 0xE0, - 0xD3, 0x08, 0x49, 0x62, 0x1D, 0x86, 0xBE, 0xC8, 0xDC, 0x2F, 0xE0, 0xFF, 0xC4, 0x6E, 0xBD, 0xEC, - 0x8B, 0x33, 0xF1, 0x61, 0x6E, 0x96, 0xEB, 0xEA, 0x87, 0x4C, 0xA3, 0x5F, 0x97, 0x92, 0x22, 0x0C, - 0x36, 0x05, 0xA5, 0xC1, 0xF6, 0xB8, 0xF5, 0xE0, 0xE4, 0x91, 0x73, 0x73, 0xD0, 0x38, 0x81, 0x24, - 0x13, 0xB4, 0x4B, 0xAB, 0x4C, 0xBB, 0x15, 0x56, 0xC2, 0x66, 0xF9, 0x27, 0xEF, 0xE0, 0x3D, 0x4E, - 0xDB, 0x12, 0xCB, 0xC1, 0xDE, 0x57, 0x1B, 0x7F, 0x69, 0x10, 0xE4, 0x6E, 0xF7, 0xCC, 0x0F, 0x64, - 0x31, 0x6A, 0xBF, 0x49, 0x6C, 0xF8, 0x9E, 0xC9, 0x37, 0xF9, 0x26, 0x32, 0x4A, 0x26, 0x97, 0x99, - 0x30, 0xA6, 0x86, 0x82, 0xCE, 0x04, 0x8B, 0xFB, 0x39, 0x3B, 0xEF, 0x05, 0xAE, 0x3F, 0xFD, 0xEA, - 0x21, 0xA7, 0xF9, 0xD8, 0x2D, 0x34, 0x42, 0xE4, 0xDC, 0x40, 0x1C, 0x82, 0x94, 0x89, 0xC4, 0x74, - 0x0C, 0xF6, 0x76, 0x65, 0x13, 0x29, 0x85, 0xE7, 0xF6, 0x8C, 0x19, 0x3D, 0xC2, 0x69, 0x79, 0x07, - 0x8C, 0x47, 0x24, 0x24, 0x4C, 0xD6, 0x41, 0x93, 0x70, 0x40, 0x08, 0x6D, 0x49, 0x4D, 0x92, 0xAA, - 0x9D, 0x02, 0xAB, 0x53, 0x8D, 0x8C, 0x96, 0x75, 0x54, 0xD0, 0xA2, 0x45, 0xBA, 0x19, 0x81, 0xFE, - 0x20, 0xCC, 0x93, 0x78, 0x4D, 0xBB, 0xA2, 0x21, 0xAB, 0xB5, 0x1B, 0x47, 0x0C, 0xA2, 0x34, 0x24, - 0x1E, 0xF3, 0x40, 0xF3, 0xC8, 0x79, 0xAE, 0x00, 0x40, 0xC3, 0xC4, 0x1B, 0x41, 0x5E, 0xF4, 0x08, - 0x7D, 0x15, 0xF1, 0xDF, 0xE2, 0x34, 0x78, 0xC3, 0x2A, 0x91, 0x8D, 0xC1, 0xA7, 0xF4, 0xD0, 0xF9, - 0xE7, 0x4E, 0x9F, 0xDC, 0x56, 0x16, 0x6C, 0x5B, 0x48, 0x10, 0x7E, 0xE9, 0xA6, 0x3F, 0x3B, 0xD0, - 0xFD, 0x12, 0x46, 0x1B, 0xFF, 0x61, 0x76, 0x61, 0xCC, 0x24, 0x1C, 0x94, 0xDF, 0x77, 0x6F, 0xAE, - 0x8E, 0xEE, 0x96, 0xF6, 0x9B, 0xB4, 0xE9, 0xA5, 0x1E, 0x6D, 0x7C, 0x2C, 0x43, 0xFB, 0x74, 0xF3, - 0x23, 0x86, 0xE6, 0x07, 0xC7, 0x36, 0xE3, 0xED, 0xAF, 0xDD, 0x75, 0x61, 0xCD, 0xFE, 0xEE, 0x4B, - 0x82, 0xF7, 0xC7, 0x66, 0x2B, 0x4C, 0xFF, 0x97, 0x77, 0x1A, 0xF5, 0xA5, 0x55, 0xF2, 0xBD, 0xC0, - 0xD4, 0xD8, 0x07, 0x2A, 0x92, 0xB0, 0x04, 0x56, 0x55, 0x3F, 0x1B, 0xCA, 0x21, 0x25, 0x3F, 0xB9, - 0x81, 0x01, 0x94, 0x43, 0xEE, 0x83, 0xD5, 0x10, 0xB4, 0x13, 0x19, 0xC0, 0x06, 0xBA, 0xEF, 0xA3, - 0xE4, 0xEC, 0xD8, 0x66, 0x30, 0x58, 0xA2, 0xE7, 0x81, 0x65, 0xDA, 0xA1, 0x35, 0x28, 0x4B, 0x47, - 0x17, 0x95, 0xA3, 0x8C, 0x67, 0x44, 0xC8, 0x8B, 0x1B, 0x5F, 0xE9, 0x0E, 0x99, 0xA3, 0x39, 0xAF, - 0x5C, 0xCA, 0x0D, 0x68, 0xAD, 0xE0, 0x91, 0xF3, 0x95, 0x54, 0x02, 0xFF, 0xC4, 0x23, 0xA1, 0x2E, - 0xCE, 0xD2, 0xFC, 0x34, 0x5A, 0xF0, 0x83, 0x82, 0x54, 0x07, 0xDE, 0x21, 0x0D, 0xE3, 0xDF, 0x86, - 0xC1, 0x6E, 0xAB, 0x95, 0x28, 0x90, 0xED, 0x3B, 0x93, 0x95, 0x9E, 0xDE, 0xBA, 0x3E, 0x32, 0x85, - 0x0F, 0xB9, 0x62, 0x68, 0x00, 0x93, 0x38, 0xF9, 0x6B, 0x36, 0x5E, 0xAB, 0x9F, 0xDD, 0x84, 0x97, - 0xB8, 0xAB, 0xDA, 0x29, 0x88, 0xEC, 0x9D, 0xFA, 0xAA, 0x34, 0x2B, 0x1E, 0xC0, 0x6C, 0x53, 0xD4, - 0x55, 0x40, 0x45, 0x9F, 0xEC, 0x0A, 0x90, 0x51, 0xC5, 0x7A, 0x8A, 0xF6, 0xEE, 0x62, 0xC2, 0xE9, - 0x57, 0x2A, 0x1D, 0x8F, 0xB6, 0x83, 0xF9, 0x44, 0x42, 0x33, 0x2A, 0x3D, 0xC7, 0x46, 0xDA, 0xCA, - 0xBC, 0x6B, 0x49, 0x7F, 0x94, 0xB0, 0x6C, 0x80, 0xEC, 0x76, 0x96, 0x12, 0xB9, 0x05, 0x47, 0x96, - 0x84, 0x98, 0xCF, 0x8F, 0x21, 0xF5, 0x6B, 0x86, 0xB8, 0xD4, 0x80, 0xBA, 0xEA, 0x3C, 0xF6, 0x7A, - 0x98, 0xE9, 0x1A, 0x5E, 0x2C, 0x69, 0x1A, 0x2A, 0x31, 0xB9, 0xE6, 0x28, 0xA3, 0xCA, 0xC2, 0x70, - 0xDB, 0xF0, 0x30, 0x28, 0xD3, 0xD6, 0x17, 0xAD, 0x73, 0x8D, 0xB3, 0xF5, 0xFD, 0xA3, 0x6D, 0x8A, - 0xAE, 0x7A, 0x69, 0xD7, 0x6E, 0x4C, 0x29, 0x44, 0xBD, 0x57, 0xBA, 0xC9, 0xFD, 0xA1, 0xEF, 0xA9, - 0xA0, 0x98, 0x39, 0x7A, 0x05, 0x61, 0x46, 0x55, 0x77, 0x5C, 0x1A, 0x39, 0x38, 0x98, 0xFA, 0x79, - 0x9A, 0xBC, 0x68, 0xDB, 0x29, 0x51, 0xDD, 0x2C, 0xEC, 0xFA, 0x61, 0x93, 0x93, 0x44, 0xF2, 0x7E, - 0xD7, 0xA2, 0x79, 0xF1, 0xBD, 0x19, 0x81, 0x36, 0x04, 0x3A, 0x26, 0x20, 0x07, 0x3E, 0x01, 0x8E, - 0x16, 0xE0, 0x6F, 0xF6, 0x29, 0xB8, 0x0B, 0xAC, 0x37, 0x19, 0x39, 0x91, 0x09, 0x23, 0xA6, 0x9C, - 0xAD, 0x08, 0x70, 0xA8, 0x66, 0x0A, 0x22, 0xA2, 0x2E, 0xC5, 0xB9, 0x7F, 0x58, 0xC0, 0x2F, 0x07, - 0x61, 0xB9, 0x2D, 0x3F, 0xA9, 0xB1, 0x67, 0x52, 0xC1, 0x1C, 0x2C, 0xB4, 0xFC, 0x02, 0xA8, 0x4F, - 0x71, 0x87, 0x7F, 0x42, 0x35, 0x93, 0x25, 0xF5, 0x81, 0x07, 0xF9, 0x75, 0x01, 0xBE, 0x08, 0x15, - 0xC5, 0xD1, 0xED, 0x91, 0xB6, 0x0B, 0xC8, 0x8B, 0x4D, 0x62, 0x54, 0xD7, 0x14, 0x9C, 0x3E, 0xEA, - 0x15, 0x3E, 0x91, 0x4F, 0x2F, 0xB5, 0x5C, 0x5A, 0x13, 0x6D, 0x24, 0xE5, 0xB1, 0xA2, 0xFC, 0xAF, - 0x5F, 0x85, 0x13, 0x52, 0x9F, 0x80, 0x19, 0xBB, 0xB7, 0x9A, 0xC6, 0x92, 0x49, 0x2D, 0x28, 0xA7, - 0xA2, 0x28, 0xFA, 0x4A, 0x7B, 0xBA, 0x99, 0x15, 0xA9, 0xF3, 0x51, 0xED, 0xA5, 0xD7, 0x9A, 0xC1, - 0x7A, 0x1E, 0x77, 0x57, 0xBB, 0xA7, 0x25, 0x10, 0xE9, 0x69, 0xAC, 0x50, 0xEF, 0xEC, 0x85, 0x02, - 0x52, 0xC9, 0x29, 0xE9, 0xCB, 0xC8, 0xD0, 0x2D, 0x43, 0xAD, 0x26, 0x93, 0xA8, 0x12, 0xE3, 0xEB, - 0xB1, 0x1E, 0xA2, 0x8D, 0xE4, 0xF7, 0x8F, 0x4B, 0x55, 0xE7, 0xD7, 0x98, 0x3B, 0x7B, 0x85, 0x16, - 0xEE, 0x5A, 0xD8, 0x61, 0x65, 0x57, 0xBC, 0x74, 0x62, 0xD3, 0xDC, 0x7C, 0x6D, 0xCC, 0x56, 0xB0, - 0x3B, 0xA7, 0xE9, 0x10, 0xDE, 0x6A, 0xF4, 0x3A, 0xEC, 0x7E, 0x2E, 0xD0, 0x1E, 0x81, 0x48, 0xD3, - 0xEC, 0xD7, 0xC5, 0xDB, 0x16, 0xBD, 0xD5, 0x5B, 0xAD, 0x8E, 0x13, 0x5A, 0x2A, 0x9E, 0x1A, 0x96, - 0xC3, 0x7E, 0x23, 0xAD, 0xA7, 0x45, 0xE0, 0xCE, 0xA4, 0x52, 0x0C, 0x2A, 0x2E, 0x84, 0x9D, 0xB3, - 0xB4, 0x21, 0x18, 0xA7, 0xCF, 0x57, 0xA3, 0xFE, 0xA1, 0x27, 0x99, 0xCE, 0x48, 0x1E, 0xA7, 0xDB, - 0x62, 0x13, 0x9B, 0x19, 0xE3, 0xBF, 0xAA, 0xA2, 0x9D, 0x29, 0xC9, 0x92, 0xD1, 0x5A, 0x43, 0x4E, - 0xC4, 0xF8, 0xB4, 0xD9, 0xFC, 0xBD, 0x1A, 0xBB, 0x4D, 0x23, 0x99, 0xF3, 0x86, 0xE6, 0xBC, 0xB7, - 0x03, 0xE1, 0xA9, 0xD7, 0xDF, 0x5C, 0x15, 0x56, 0xB4, 0x63, 0xC2, 0x71, 0x6D, 0x15, 0xF1, 0x85, - 0xB6, 0xFF, 0x85, 0x4B, 0x6C, 0x36, 0xDB, 0xA8, 0x07, 0x22, 0x92, 0x4F, 0xD5, 0xA3, 0x2B, 0x40, - 0x8F, 0x6D, 0x89, 0xE3, 0x3E, 0xA2, 0x40, 0xAE, 0x80, 0xA5, 0x3A, 0xD2, 0x5D, 0x7E, 0x74, 0x6A, - 0x94, 0xED, 0xA3, 0xF2, 0x4C, 0x2E, 0x57, 0xF2, 0xBE, 0x8B, 0x25, 0xEF, 0x87, 0x0C, 0x05, 0x99, - 0x27, 0x5E, 0xA5, 0xDE, 0xAE, 0x94, 0x49, 0xFD, 0x7A, 0x62, 0xA7, 0x74, 0x58, 0x8A, 0x1A, 0xED, - 0x15, 0x23, 0x1D, 0x83, 0xD7, 0xA4, 0x6B, 0x4F, 0x3F, 0x9C, 0xBB, 0x5B, 0x27, 0xAD, 0x5C, 0x7E, - 0xA2, 0xE0, 0xBF, 0x39, 0x0C, 0x73, 0xB1, 0x48, 0x07, 0xC1, 0x3B, 0xD5, 0xA6, 0x2D, 0x94, 0x20, - 0x6D, 0xE6, 0x91, 0xAD, 0xCC, 0xDE, 0x4A, 0x3C, 0x4C, 0x02, 0x92, 0xCD, 0x41, 0x46, 0x3C, 0x88, - 0x5A, 0xB6, 0xF6, 0x8F, 0x85, 0x05, 0x7E, 0x75, 0xAC, 0x92, 0x92, 0x99, 0xF4, 0x36, 0x21, 0xE9, - 0x0D, 0x19, 0x02, 0xA1, 0xF0, 0xF1, 0xDB, 0xD8, 0x8F, 0x48, 0x11, 0x5D, 0x84, 0x80, 0x24, 0xD8, - 0xEE, 0x57, 0xB2, 0x3A, 0xE6, 0x0E, 0xC5, 0xA1, 0x26, 0xF9, 0x0C, 0x2E, 0x6C, 0x3A, 0x7A, 0x8B, - 0x0B, 0x9B, 0x3D, 0x2E, 0xAF, 0x26, 0x7D, 0x02, 0x63, 0xC8, 0x0D, 0x24, 0x7D, 0x36, 0x19, 0xAB, - 0xAC, 0xA9, 0x10, 0xA0, 0x53, 0x25, 0x4C, 0xC7, 0x4C, 0x28, 0x4A, 0xC3, 0x38, 0x92, 0xE2, 0x3D, - 0xF3, 0xE1, 0x93, 0xDE, 0x3E, 0x77, 0xAC, 0xEF, 0x6A, 0x08, 0x44, 0xE8, 0x20, 0x18, 0xA3, 0xA0, - 0x90, 0x56, 0xDD, 0xAB, 0x77, 0x7D, 0x36, 0xC2, 0x91, 0xB5, 0x44, 0x8C, 0xD4, 0x57, 0x2C, 0x81, - 0xA1, 0xB9, 0xD9, 0x59, 0x50, 0x8A, 0x76, 0x88, 0x5A, 0x5E, 0x45, 0x99, 0xAC, 0x8C, 0x40, 0x14, - 0x46, 0x28, 0x77, 0xED, 0x1C, 0x7C, 0x59, 0x36, 0x83, 0x4A, 0xA7, 0x0A, 0x71, 0x9C, 0x3B, 0x02, - 0x43, 0x50, 0x74, 0x85, 0xE3, 0xD4, 0x0A, 0x3B, 0x1B, 0xE2, 0xD7, 0x1F, 0x79, 0x78, 0x4B, 0x00, - 0x8E, 0x0A, 0x99, 0xDF, 0x14, 0x17, 0xCD, 0xB8, 0xCF, 0x21, 0xB3, 0x85, 0x38, 0xDE, 0x01, 0xBA, - 0x1B, 0x95, 0x4B, 0x97, 0x2B, 0xB0, 0xC9, 0xED, 0x45, 0xCE, 0x22, 0x5B, 0x8E, 0x04, 0x91, 0x07, - 0x58, 0xC8, 0xB5, 0xA7, 0x06, 0x62, 0x9D, 0xC4, 0xAC, 0x1E, 0x08, 0xFD, 0xEA, 0xB7, 0x4D, 0x0B, - 0xD2, 0x79, 0xA8, 0xEF, 0x4F, 0xBE, 0x80, 0xE6, 0x55, 0x44, 0x7B, 0x59, 0x5E, 0x9C, 0x92, 0x6A, - 0x92, 0xF7, 0xE7, 0x78, 0xFB, 0x46, 0xA1, 0xF4, 0x1E, 0x36, 0x8B, 0xE2, 0x86, 0xA2, 0xE1, 0x19, - 0xB5, 0x29, 0xEA, 0xD2, 0x1D, 0x0B, 0x68, 0xC5, 0x2F, 0x4F, 0x48, 0x6A, 0xC8, 0x92, 0xCE, 0x64, - 0x9D, 0xA5, 0x86, 0xA5, 0x05, 0x40, 0xCE, 0xD7, 0x6C, 0x69, 0x9F, 0x6C, 0xB2, 0xA3, 0x11, 0x08, - 0xEF, 0x9B, 0xCD, 0x10, 0x07, 0x7B, 0x9E, 0x25, 0xF4, 0x1A, 0x2B, 0x21, 0x7E, 0xA5, 0xB9, 0xE1, - 0x33, 0x52, 0xFA, 0x04, 0x09, 0xD4, 0x78, 0xCB, 0x56, 0xE6, 0x55, 0x2C, 0xB4, 0x5D, 0xBB, 0x40, - 0x34, 0xE5, 0x23, 0x30, 0xB8, 0x65, 0x19, 0xF1, 0x5A, 0x08, 0xF2, 0xF4, 0x86, 0x45, 0xB7, 0x87, - 0x17, 0xFA, 0x68, 0x6A, 0x1F, 0x7E, 0x69, 0xDA, 0x89, 0x8E, 0xCA, 0xB6, 0xFF, 0x9F, 0x4E, 0x6F, - 0x25, 0x46, 0x46, 0xF6, 0x7B, 0x1E, 0xB3, 0x3D, 0x2C, 0x8C, 0x01, 0xA9, 0x7B, 0xDA, 0xE9, 0x4D, - 0x6E, 0x89, 0x9D, 0x0F, 0x3F, 0x9F, 0x15, 0x3C, 0xFE, 0x35, 0x61, 0x2A, 0x45, 0xC2, 0xA9, 0xC5, - 0x5C, 0x51, 0xCC, 0x6B, 0xCC, 0x2F, 0xA7, 0x60, 0x03, 0x71, 0xF0, 0xB3, 0xBF, 0x7B, 0x76, 0xCC, - 0x89, 0x2C, 0x31, 0x79, 0xE6, 0xDC, 0x7C, 0x39, 0x24, 0xD8, 0x1A, 0x98, 0x1F, 0x98, 0xCD, 0xD4, - 0x7E, 0x04, 0xF2, 0x92, 0x8D, 0x23, 0x03, 0x5F, 0xF3, 0x05, 0x3B, 0xB0, 0x0A, 0xF0, 0x7A, 0xCA, - 0x76, 0xCB, 0xD0, 0xBA, 0xA0, 0x7F, 0xBA, 0x0D, 0x68, 0x60, 0xC3, 0xEF, 0xDC, 0x44, 0x2E, 0x40, - 0x24, 0x9D, 0xCB, 0x1D, 0x5A, 0x0C, 0x51, 0x66, 0x1A, 0x2A, 0x68, 0xA6, 0x83, 0x20, 0x79, 0x9B, - 0x24, 0xEA, 0x10, 0x5A, 0xB4, 0x39, 0x58, 0xAC, 0xA0, 0x45, 0x3B, 0x16, 0xBE, 0x24, 0x59, 0x1D, - 0x18, 0x5C, 0xD8, 0xCD, 0xFE, 0x16, 0x5C, 0x84, 0x5C, 0x2D, 0x7D, 0x28, 0xC9, 0xCE, 0x9D, 0x38, - 0xF6, 0x2F, 0x9A, 0x8A, 0x93, 0x95, 0xDC, 0x73, 0x48, 0xFD, 0xF5, 0xAB, 0xF4, 0x06, 0xB4, 0x11, - 0x79, 0x7B, 0xF7, 0x75, 0x73, 0xC2, 0x2D, 0x9C, 0x91, 0x7E, 0x51, 0x12, 0x54, 0xAC, 0x55, 0x29, - 0x48, 0x7F, 0x50, 0x15, 0xC2, 0x79, 0x05, 0x3C, 0x8F, 0xB4, 0xAE, 0xDD, 0x28, 0x09, 0xCC, 0x1D, - 0xDE, 0xEF, 0x82, 0xFD, 0x64, 0xD1, 0x5A, 0xFE, 0x06, 0x18, 0x7C, 0xF6, 0x32, 0x67, 0xDB, 0xF1, - 0x55, 0xF4, 0x09, 0x33, 0xB4, 0x91, 0xA7, 0x68, 0xE7, 0xA3, 0x60, 0x93, 0xE6, 0x36, 0xDE, 0x28, - 0xB3, 0xBD, 0x90, 0x46, 0x7F, 0xE5, 0xAF, 0x3C, 0xB6, 0x5E, 0xF2, 0x98, 0xE6, 0x28, 0x07, 0xA9, - 0x21, 0x4C, 0xAA, 0xF7, 0x95, 0xD9, 0x25, 0x51, 0x7F, 0x26, 0x8F, 0xC9, 0xD6, 0x65, 0xCA, 0x07, - 0x82, 0x1F, 0x8E, 0xBF, 0xBA, 0x65, 0xF7, 0xB1, 0x51, 0x85, 0x99, 0x23, 0x4E, 0x48, 0x2E, 0x7B, - 0xC8, 0x09, 0xC4, 0x93, 0xB9, 0xDB, 0x6B, 0xAF, 0xCA, 0xC7, 0x0A, 0xC5, 0x6D, 0xD0, 0xC2, 0xD4, - 0xF5, 0xA1, 0x5E, 0x45, 0x28, 0x54, 0x1D, 0x87, 0xC8, 0x83, 0xAF, 0x9E, 0xB7, 0xC7, 0x4D, 0x48, - 0x3B, 0x49, 0x23, 0x8B, 0x23, 0x6A, 0x2D, 0xD6, 0x30, 0xAD, 0xD3, 0xFA, 0x35, 0x67, 0xF0, 0x0D, - 0x3A, 0xDC, 0x42, 0x57, 0xBE, 0xE6, 0x5B, 0x26, 0x0B, 0x30, 0x45, 0x7E, 0x71, 0x5D, 0x82, 0xE7, - 0x40, 0x45, 0x58, 0xBB, 0xF5, 0x07, 0xEC, 0x36, 0x47, 0xF7, 0x98, 0x05, 0x70, 0x83, 0x17, 0x9D, - 0xDD, 0x4A, 0x4A, 0xB7, 0xB5, 0xBC, 0x8B, 0xF5, 0x08, 0x47, 0x74, 0xF3, 0x0F, 0x3C, 0xB0, 0xC7, - 0x30, 0x88, 0xCF, 0xA2, 0xE1, 0xC3, 0x13, 0x52, 0x20, 0x2D, 0xAD, 0xB3, 0x99, 0x37, 0x71, 0x91, - 0xBB, 0x3F, 0x31, 0xAC, 0xEC, 0xB8, 0x2A, 0x84, 0x12, 0x34, 0x84, 0xE5, 0xBF, 0x47, 0x94, 0xD6, - 0x9A, 0x1F, 0xEB, 0x34, 0xAF, 0xDA, 0x93, 0x5D, 0x22, 0x88, 0x27, 0x1A, 0x04, 0x13, 0xAA, 0x06, - 0x52, 0x8C, 0x44, 0xCB, 0xCC, 0x70, 0x7A, 0xBF, 0xC3, 0x3D, 0x21, 0x71, 0x99, 0x4F, 0x06, 0x42, - 0x8B, 0x7F, 0xDA, 0xBC, 0xAF, 0x7C, 0x24, 0x94, 0x3F, 0xC9, 0xB9, 0xF0, 0xFB, 0x9C, 0xFB, 0x94, - 0xFC, 0x7F, 0xA0, 0x2F, 0x20, 0x4D, 0x57, 0x06, 0xDB, 0xA8, 0xC4, 0xBD, 0x02, 0x6C, 0xDD, 0x00, - 0x8C, 0x84, 0xEF, 0x63, 0xDB, 0x45, 0x34, 0x21, 0x69, 0x73, 0x53, 0x22, 0xD3, 0x61, 0xA6, 0x7A, - 0xDE, 0xC1, 0x66, 0xFD, 0x3B, 0x95, 0x13, 0x76, 0x06, 0xE4, 0x76, 0x0E, 0x63, 0xF2, 0x66, 0x56, - 0xE3, 0x80, 0x55, 0x57, 0xF3, 0x88, 0xA2, 0x5E, 0x84, 0x29, 0xFD, 0x44, 0x78, 0xA9, 0xF0, 0x3A, - 0xF9, 0xE7, 0xDD, 0x66, 0xE1, 0x48, 0xA4, 0xD7, 0x15, 0x06, 0x47, 0xBA, 0x1E, 0x70, 0xA0, 0xA2, - 0xBC, 0x79, 0xCF, 0x9B, 0xA6, 0x61, 0x95, 0x4F, 0xF8, 0x46, 0xA7, 0xD5, 0xB5, 0x5F, 0x66, 0xDD, - 0xE2, 0x5A, 0x8B, 0x29, 0xBA, 0x02, 0xC8, 0x1A, 0x17, 0xFD, 0x72, 0x45, 0xED, 0x63, 0x46, 0x64, - 0x5E, 0xC9, 0x24, 0x8D, 0x91, 0x38, 0xD1, 0xEF, 0xDF, 0x82, 0x09, 0xB0, 0x5B, 0x8C, 0x43, 0x5F, - 0xF9, 0x05, 0x34, 0x1E, 0x2B, 0x4D, 0xA8, 0xC3, 0xE5, 0x9A, 0xD5, 0x95, 0x1B, 0xC0, 0xB9, 0x30, - 0x55, 0xB1, 0xEF, 0x53, 0xD2, 0x86, 0x65, 0x96, 0xD1, 0x3C, 0x75, 0x9E, 0x43, 0xED, 0x72, 0x92, - 0x5F, 0xC3, 0xF8, 0x4C, 0x14, 0xA7, 0x77, 0x22, 0x48, 0x5E, 0xD0, 0x02, 0x32, 0xB4, 0x5F, 0xA9, - 0xCD, 0x9C, 0xF6, 0x46, 0x60, 0xEF, 0x4D, 0x14, 0x84, 0x6E, 0xC5, 0x2C, 0xA6, 0xB2, 0xFB, 0x38, - 0xD1, 0x0C, 0xB2, 0x87, 0xE8, 0x64, 0x1E, 0xFD, 0xC4, 0x28, 0x08, 0x37, 0x61, 0x85, 0x11, 0x44, - 0x76, 0xC9, 0x9F, 0xAD, 0x6D, 0xBC, 0xC0, 0xC8, 0x02, 0xC8, 0xDA, 0x22, 0x1D, 0xB3, 0x54, 0x5F, - 0x38, 0x0D, 0x1D, 0xC0, 0x78, 0x46, 0x7C, 0x46, 0x05, 0xC1, 0x51, 0x9A, 0xF7, 0x7E, 0x51, 0x75, - 0x32, 0xD6, 0xB1, 0x7E, 0x8B, 0x3A, 0xB9, 0xA8, 0x12, 0xAF, 0xF8, 0x20, 0x69, 0xED, 0x37, 0xB4, - 0xD2, 0x7D, 0x7C, 0x08, 0xE4, 0x74, 0xD8, 0x18, 0x2B, 0x6E, 0x65, 0x21, 0xC4, 0x8C, 0xF0, 0xB2, - 0x1A, 0x7D, 0xDD, 0xA5, 0xE9, 0xC3, 0x88, 0xEE, 0x7E, 0x80, 0xE3, 0x4B, 0x3A, 0x56, 0x3D, 0x4B, - 0x75, 0x62, 0xE1, 0xCE, 0xB6, 0xD5, 0xF1, 0xFC, 0x0C, 0x0A, 0x66, 0x10, 0xD2, 0xC0, 0xF3, 0xD3, - 0xCA, 0xFE, 0xD6, 0x73, 0xE4, 0x21, 0xDA, 0xED, 0xE4, 0xE4, 0x5A, 0xAC, 0x31, 0x6D, 0x84, 0x8E, - 0x24, 0x56, 0x6B, 0x09, 0x14, 0x09, 0x81, 0xD6, 0xC6, 0x92, 0x2B, 0xE5, 0x2F, 0x61, 0xCE, 0xD3, - 0xBD, 0x31, 0x10, 0x56, 0x4C, 0x68, 0x18, 0xA2, 0x4E, 0xBF, 0x22, 0x71, 0x77, 0x4A, 0xEC, 0x3F, - 0x8A, 0x10, 0xF9, 0x62, 0x7B, 0x4F, 0x7E, 0xE3, 0x16, 0x23, 0x3C, 0x4A, 0x7B, 0xD9, 0xCC, 0xA1, - 0x13, 0x09, 0x31, 0xD8, 0xD1, 0x23, 0xC4, 0xAD, 0x48, 0xD6, 0xC7, 0xCF, 0xB6, 0xE2, 0x5E, 0x53, - 0xAF, 0x45, 0xF4, 0xE4, 0x82, 0xDC, 0xB3, 0x5D, 0x19, 0x4A, 0x71, 0xBE, 0x75, 0x1D, 0x82, 0x9C, - 0xCD, 0x1F, 0x1E, 0xCE, 0xE1, 0xB6, 0x94, 0xED, 0x9A, 0x3A, 0x1A, 0x66, 0xFF, 0x5C, 0x43, 0x7D, - 0x51, 0x46, 0x09, 0xBB, 0xD0, 0x5D, 0x1A, 0x81, 0x98, 0x9A, 0xAC, 0x74, 0x94, 0xD3, 0x05, 0x55, - 0xE1, 0xE4, 0x2A, 0x43, 0xCC, 0xC8, 0x2C, 0x10, 0xA7, 0xE8, 0xAD, 0x5F, 0x02, 0xDF, 0x3B, 0x10, - 0x33, 0x43, 0x8A, 0x92, 0xF9, 0xCF, 0x12, 0x04, 0x60, 0xCD, 0xA0, 0x30, 0xA9, 0xE8, 0x32, 0x30, - 0x80, 0x8B, 0xF2, 0x09, 0xA4, 0x91, 0xFA, 0x3B, 0xBD, 0x1D, 0x54, 0xFD, 0xF8, 0xCF, 0x74, 0x70, - 0x50, 0x9B, 0x8D, 0x40, 0xBD, 0xC7, 0x3D, 0x4F, 0x03, 0x7B, 0x63, 0x32, 0xCE, 0x8B, 0x5B, 0x7C, - 0x9A, 0xE0, 0x3A, 0x37, 0x38, 0xCA, 0x31, 0x21, 0xDB, 0x4F, 0xF6, 0xF0, 0xDB, 0x4E, 0xE5, 0xDC, - 0x69, 0x4B, 0xAE, 0x28, 0x01, 0xF2, 0x46, 0x38, 0x6A, 0x9A, 0x50, 0x2D, 0xF4, 0x36, 0x5D, 0xEF, - 0x25, 0xB1, 0x31, 0xCA, 0x58, 0x5E, 0x4B, 0xE6, 0xAC, 0xCF, 0x0C, 0x20, 0x84, 0x7F, 0xF5, 0xC1, - 0x1A, 0xE5, 0x94, 0xC3, 0x3D, 0x77, 0x8E, 0xA3, 0x9B, 0xAF, 0x96, 0xBF, 0xD1, 0xEC, 0x35, 0x17, - 0x15, 0xDF, 0x2B, 0x00, 0xCD, 0x2C, 0xDB, 0xD3, 0x31, 0x8A, 0x6D, 0xE0, 0xB3, 0x1F, 0x71, 0xB4, - 0xA4, 0xCA, 0xFA, 0x40, 0xEB, 0x99, 0x4C, 0xFB, 0xFE, 0x9D, 0xBA, 0x26, 0x0F, 0x1B, 0x6D, 0xE6, - 0xB6, 0x2C, 0xAD, 0xF4, 0xD8, 0x12, 0xC0, 0xA3, 0xA4, 0x65, 0x10, 0x1B, 0xCD, 0xFD, 0x0A, 0xB0, - 0x52, 0x71, 0x56, 0xD4, 0x01, 0x49, 0xC9, 0x68, 0x06, 0xA1, 0xD3, 0x61, 0x8A, 0xC1, 0x07, 0x1B, - 0x06, 0x48, 0x78, 0x1B, 0x96, 0xCB, 0x7B, 0xC5, 0xF4, 0x8B, 0x27, 0x93, 0xF1, 0x10, 0x40, 0xB3, - 0x36, 0xA3, 0xA8, 0x19, 0xF3, 0x1B, 0x1B, 0xA4, 0xCD, 0x19, 0x18, 0x25, 0x7C, 0x24, 0xAC, 0x05, - 0xD1, 0xB2, 0xA1, 0x1E, 0x0B, 0xB3, 0xDA, 0x82, 0x3E, 0x78, 0x87, 0x12, 0x8F, 0xE6, 0xB9, 0x59, - 0x02, 0xDC, 0x15, 0x31, 0xA3, 0xAE, 0x22, 0x2F, 0xB7, 0x60, 0x08, 0x42, 0xA0, 0x4B, 0x94, 0xA1, - 0x1A, 0xD9, 0x32, 0x40, 0x2C, 0x33, 0x5A, 0x62, 0xB3, 0xDB, 0x9C, 0x04, 0x3B, 0xCE, 0x40, 0xCD, - 0x3C, 0x29, 0xDB, 0x1C, 0x98, 0xC7, 0x7B, 0x09, 0x65, 0x91, 0xCD, 0xB9, 0x71, 0x80, 0xF2, 0x14, - 0x90, 0x27, 0xA5, 0xC7, 0x16, 0xBB, 0xC8, 0x6D, 0x79, 0x0F, 0xC7, 0x06, 0x4F, 0xFD, 0xEF, 0x3D, - 0x7E, 0xA9, 0x1A, 0x20, 0x4A, 0x94, 0x3F, 0x84, 0xA1, 0x97, 0xE1, 0x99, 0xF5, 0x9E, 0xB2, 0x46, - 0x23, 0xC3, 0x48, 0x46, 0xC0, 0x2C, 0x7D, 0x64, 0x45, 0x7B, 0xA0, 0xBF, 0x5F, 0x14, 0xBC, 0xB2, - 0x17, 0x87, 0x68, 0x5C, 0x17, 0xCE, 0xCA, 0xEA, 0x73, 0x3C, 0xAE, 0x6C, 0x8C, 0x4A, 0x2C, 0xFB, - 0x77, 0x52, 0xE7, 0xA1, 0xFF, 0x6C, 0x23, 0x05, 0x1E, 0x69, 0x22, 0xF1, 0xDA, 0x6B, 0xB6, 0x01, - 0x44, 0xDE, 0xEB, 0x80, 0xB7, 0x84, 0x5B, 0xC7, 0xEA, 0x59, 0x5B, 0x3F, 0x23, 0x7E, 0x10, 0x00, - 0x27, 0x5C, 0x6A, 0x7B, 0xEB, 0xFF, 0xDF, 0x82, 0xEE, 0x85, 0x6C, 0xA5, 0x1A, 0xBF, 0xEB, 0x64, - 0xBB, 0x10, 0x46, 0x40, 0x51, 0x29, 0x2C, 0x6A, 0xD2, 0xF5, 0x58, 0x61, 0x5F, 0x77, 0x31, 0xBD, - 0x59, 0x0A, 0x1B, 0xF5, 0xC2, 0xFA, 0x9A, 0xB4, 0x59, 0xF4, 0x0A, 0xD1, 0x68, 0xCC, 0x21, 0x44, - 0xDC, 0x70, 0x80, 0xD1, 0x67, 0xCC, 0x24, 0x22, 0xC0, 0x77, 0x04, 0xED, 0xA3, 0xB4, 0x23, 0xC8, - 0xAD, 0x5E, 0x18, 0x64, 0x57, 0x89, 0x52, 0xDD, 0x25, 0x6C, 0x38, 0xCE, 0x5D, 0x45, 0x42, 0x18, - 0xA3, 0xE2, 0xD8, 0x6E, 0x21, 0x5F, 0xBB, 0x9D, 0xCA, 0x90, 0x57, 0x85, 0x0C, 0xD5, 0x56, 0xC8, - 0x12, 0x39, 0x27, 0x44, 0x77, 0xE6, 0x59, 0xE7, 0x08, 0xB0, 0x4E, 0x80, 0xBD, 0xE3, 0xE6, 0x8B, - 0xE1, 0x4B, 0x6E, 0xCE, 0xA9, 0x5C, 0x8E, 0xF2, 0xE2, 0xFE, 0x18, 0xFB, 0x74, 0xD6, 0x3C, 0x76, - 0xB8, 0xB0, 0x90, 0x00, 0x3A, 0xF4, 0xE4, 0xB7, 0xFD, 0x05, 0xA3, 0x7A, 0xD9, 0xF7, 0x0E, 0x18, - 0x66, 0xBC, 0x9A, 0x47, 0x18, 0x80, 0x4F, 0x4A, 0x6B, 0x9C, 0xF8, 0x48, 0x16, 0x49, 0x3F, 0x21, - 0xB4, 0x20, 0x59, 0x51, 0xDA, 0xD1, 0x4B, 0xE8, 0x5E, 0x48, 0x95, 0x77, 0x0A, 0x82, 0xA1, 0x8F, - 0xD2, 0x77, 0xC9, 0xC5, 0xE2, 0x79, 0x24, 0x87, 0x34, 0x0C, 0x9E, 0x17, 0x6F, 0x7B, 0xEA, 0x14, - 0x79, 0xF6, 0x0C, 0x95, 0x5F, 0x1C, 0x61, 0x01, 0x61, 0x6D, 0xD1, 0xF2, 0x6A, 0xA8, 0x09, 0xAA, - 0x0A, 0x6E, 0xF9, 0x28, 0x69, 0x49, 0x14, 0x60, 0x6D, 0xA3, 0xCF, 0x5E, 0x4C, 0x34, 0x8E, 0xFC, - 0x7E, 0x3E, 0x72, 0x3E, 0x02, 0x78, 0x3D, 0x1B, 0xA4, 0x93, 0x46, 0x39, 0x46, 0x0E, 0xF0, 0xE3, - 0x46, 0xF0, 0x4C, 0x2F, 0xE2, 0x14, 0x93, 0xF0, 0x2A, 0x5B, 0xE8, 0x05, 0xF7, 0x10, 0x3A, 0x6D, - 0x03, 0xA0, 0x5D, 0xF8, 0x5D, 0xD1, 0x4C, 0x58, 0x7B, 0xBF, 0xAB, 0x52, 0xC1, 0x6E, 0x72, 0x1E, - 0x60, 0x8C, 0x33, 0x4E, 0x22, 0xE7, 0x12, 0x51, 0x0B, 0xFE, 0x22, 0xDA, 0x8A, 0x53, 0xA7, 0xC6, - 0x9A, 0x66, 0x92, 0x76, 0x46, 0x3C, 0xC5, 0x72, 0x55, 0x6C, 0xD2, 0x8D, 0xF1, 0xD5, 0x6C, 0x09, - 0xEA, 0x2D, 0x1A, 0xF9, 0x99, 0x5E, 0x65, 0xCC, 0x6D, 0x55, 0x5F, 0x46, 0x66, 0xC3, 0xBB, 0xBE, - 0x1C, 0x53, 0x40, 0x3B, 0xE9, 0x15, 0x6C, 0xD6, 0x94, 0x8C, 0x5D, 0xB4, 0x4A, 0xDC, 0x2F, 0x2F, - 0xC1, 0xA8, 0xE1, 0xDF, 0x7A, 0xB5, 0x6D, 0xE2, 0xF8, 0xDB, 0xAA, 0x5D, 0x3D, 0x80, 0x5D, 0x33, - 0x6F, 0xCD, 0x5A, 0x84, 0xBC, 0x2D, 0x6E, 0x28, 0x97, 0x07, 0xA6, 0xF1, 0x0B, 0x22, 0x23, 0x58, - 0xDF, 0x50, 0x15, 0x73, 0xD6, 0x75, 0x63, 0xB6, 0x0F, 0xD8, 0x75, 0x9B, 0xF9, 0x9D, 0xBF, 0xE6, - 0xAF, 0xF8, 0xBF, 0xB4, 0x3A, 0xD4, 0x02, 0x3B, 0x8A, 0x4D, 0xF6, 0x44, 0x0E, 0x7F, 0x2B, 0xDB, - 0x9C, 0xAC, 0xD6, 0xB8, 0xC5, 0xB5, 0xEF, 0x1B, 0x67, 0xB0, 0x10, 0xCC, 0x1E, 0x24, 0xD4, 0x05, - 0x06, 0x6D, 0x3A, 0xFE, 0x95, 0x4C, 0x00, 0x8A, 0xD2, 0x53, 0x1B, 0x7A, 0xDE, 0xA0, 0x9F, 0x2D, - 0x10, 0x43, 0x2D, 0xA3, 0x8E, 0x66, 0x36, 0x27, 0x77, 0x05, 0x26, 0x78, 0x21, 0x09, 0x18, 0xD0, - 0x2E, 0x86, 0x1E, 0x56, 0x3B, 0x71, 0x3A, 0x46, 0x24, 0x7C, 0x90, 0x1E, 0x42, 0x36, 0x11, 0xA1, - 0x7C, 0x04, 0x80, 0x42, 0x0F, 0xA8, 0x4E, 0x07, 0xA1, 0x7B, 0x55, 0x5F, 0xA8, 0x8A, 0x1D, 0x36, - 0x9C, 0x16, 0xBD, 0xE0, 0x63, 0x0A, 0xE3, 0xC5, 0xF9, 0x55, 0xA4, 0xE9, 0x75, 0x7D, 0xD5, 0x82, - 0x32, 0x1E, 0x6B, 0x05, 0xE4, 0xF9, 0x8A, 0x8C, 0x18, 0x0E, 0xA0, 0xDF, 0x23, 0x4D, 0xA8, 0x4E, - 0xF0, 0x85, 0xFF, 0x04, 0xC5, 0xFE, 0x1E, 0x8A, 0x3F, 0xBF, 0x54, 0x05, 0x82, 0x8A, 0x0C, 0xDF, - 0xCA, 0x0A, 0xD0, 0x43, 0x76, 0xE5, 0x49, 0x55, 0x36, 0x24, 0x6F, 0x2F, 0x20, 0x58, 0x3A, 0xFE, - 0x62, 0x3A, 0x11, 0xAA, 0x2F, 0xB2, 0x25, 0x6F, 0x0B, 0x9D, 0xD8, 0xCC, 0xC5, 0x26, 0x16, 0x2E, - 0x74, 0x56, 0xBE, 0x99, 0xF4, 0xE7, 0x90, 0x88, 0x65, 0x1E, 0x6C, 0xAA, 0xB4, 0x2C, 0xCF, 0x12, - 0x63, 0x86, 0x8E, 0x9C, 0xF5, 0x75, 0x5A, 0x71, 0xBF, 0xFB, 0x54, 0xF3, 0x86, 0x61, 0xC5, 0x59, - 0xB4, 0xD5, 0x8E, 0x5D, 0x91, 0xA0, 0xB0, 0x9B, 0xB1, 0x95, 0xCE, 0x45, 0x0C, 0x4A, 0xFC, 0xE0, - 0x56, 0x73, 0x96, 0xC1, 0xAA, 0x0A, 0x65, 0x42, 0x42, 0xC1, 0xC7, 0x2D, 0x6E, 0xC8, 0x4A, 0x7F, - 0x40, 0x53, 0x0C, 0x7A, 0x99, 0x96, 0x59, 0xFA, 0xEC, 0xAD, 0xA1, 0xF0, 0xAB, 0xFE, 0xB6, 0x58, - 0x49, 0x65, 0xF4, 0x29, 0x2A, 0x21, 0x42, 0x93, 0x0A, 0xED, 0x38, 0xC0, 0x33, 0xFD, 0xCF, 0x8E, - 0xC1, 0xEC, 0x3A, 0xF9, 0x1F, 0xEA, 0x8F, 0xA2, 0xEA, 0xAE, 0xC4, 0xE7, 0x43, 0xCB, 0x53, 0xF1, - 0x77, 0xC9, 0x6C, 0x61, 0x35, 0xE2, 0xED, 0x25, 0x68, 0xF6, 0x8E, 0x06, 0xD6, 0x41, 0x87, 0x58, - 0x8A, 0xE4, 0x5F, 0x80, 0x59, 0xC7, 0x21, 0xAC, 0xC1, 0x95, 0xC8, 0xBA, 0xF9, 0x84, 0x1F, 0x70, - 0x15, 0x1C, 0xB1, 0xF1, 0x2B, 0xB4, 0xB7, 0xA0, 0x4B, 0xE3, 0xB3, 0xD4, 0x3C, 0x9C, 0x01, 0xB2, - 0x4A, 0xE5, 0x47, 0x39, 0x10, 0x32, 0xE0, 0x0E, 0x1C, 0xE9, 0x3E, 0x2E, 0xDD, 0x12, 0x2C, 0xDF, - 0xB7, 0x47, 0xE8, 0x88, 0x53, 0x28, 0xF2, 0xC6, 0x11, 0x12, 0x15, 0x4A, 0x60, 0x14, 0xA4, 0x78, - 0x54, 0x8E, 0x6A, 0x77, 0xD6, 0x74, 0xC2, 0xCD, 0x4B, 0xF9, 0xC2, 0x84, 0xE8, 0xD6, 0xED, 0x4D, - 0xB3, 0x0C, 0x32, 0x39, 0xCF, 0xB9, 0xF9, 0x0B, 0xC3, 0x52, 0xF5, 0x6E, 0x9A, 0x38, 0x84, 0xED, - 0x0D, 0x83, 0xFA, 0x83, 0x2D, 0xF4, 0xB3, 0xEE, 0x71, 0xE0, 0x47, 0x48, 0xE6, 0x1A, 0x0B, 0xD9, - 0x54, 0x74, 0xB8, 0x39, 0xA1, 0x4C, 0xC7, 0x3C, 0x52, 0x02, 0x07, 0x61, 0x12, 0x1B, 0x49, 0x0B, - 0x7D, 0x08, 0xAA, 0xEA, 0xB0, 0x3A, 0x05, 0x65, 0x9A, 0xEA, 0x68, 0x0C, 0x5B, 0xA6, 0x37, 0xC6, - 0x5F, 0x10, 0x7D, 0xC8, 0xAE, 0xCA, 0x65, 0x1F, 0x16, 0x80, 0x38, 0xF1, 0xB7, 0xB5, 0xDB, 0x1D, - 0x37, 0x5A, 0x1D, 0xEB, 0x7B, 0x2C, 0xA1, 0x7B, 0x72, 0xCE, 0x0D, 0x34, 0xB4, 0x17, 0x23, 0x52, - 0x8B, 0x3A, 0xD6, 0xEC, 0xE5, 0x8D, 0x23, 0x6A, 0xCF, 0x34, 0xDE, 0x02, 0x5A, 0xA4, 0x54, 0xFF, - 0x85, 0x85, 0x3E, 0x33, 0x87, 0xF9, 0x27, 0x59, 0xE2, 0x32, 0xAB, 0x8D, 0xBA, 0x8A, 0x92, 0xEB, - 0x5D, 0xA7, 0xF6, 0x6A, 0xDF, 0x32, 0xAD, 0xAC, 0x70, 0xCF, 0x91, 0xA9, 0x8E, 0x4C, 0x39, 0x71, - 0x4C, 0x1B, 0xBF, 0xD1, 0xD0, 0x68, 0x19, 0x9C, 0x8A, 0x7B, 0x57, 0x52, 0x40, 0xCE, 0xCC, 0x86, - 0xB7, 0x0E, 0x3D, 0x5E, 0xAD, 0xD0, 0x2B, 0xD4, 0x58, 0x5C, 0x5B, 0xD8, 0x00, 0x7F, 0x42, 0x99, - 0x84, 0x5D, 0x2D, 0x86, 0x40, 0x10, 0x35, 0x15, 0x05, 0x67, 0xDE, 0x22, 0x6C, 0xB4, 0x5C, 0x7B, - 0xCA, 0xDF, 0xF4, 0x1D, 0xD2, 0xCB, 0x34, 0x02, 0x6C, 0x22, 0x10, 0x4F, 0x7F, 0xDF, 0x18, 0xFF, - 0x5A, 0x81, 0x4C, 0xAC, 0xF7, 0xF3, 0xF1, 0x5D, 0xBA, 0x72, 0x36, 0x26, 0x88, 0xAE, 0xCA, 0xE0, - 0x79, 0x84, 0x68, 0x86, 0xCE, 0x35, 0xAF, 0x27, 0xB4, 0x21, 0xFD, 0x05, 0xB1, 0x38, 0x17, 0x7D, - 0x9B, 0x5A, 0x12, 0x29, 0x76, 0xE5, 0xA0, 0x39, 0x0B, 0xAD, 0x4C, 0x33, 0xCB, 0x45, 0x59, 0x82, - 0xB7, 0x03, 0xD2, 0x1A, 0xF7, 0x2F, 0x54, 0x43, 0x92, 0xC9, 0x8B, 0x6F, 0x6C, 0x6C, 0x1B, 0x10, - 0xEE, 0x97, 0x38, 0xA5, 0x8B, 0x16, 0xDE, 0xFC, 0xDA, 0x83, 0x4B, 0x39, 0x79, 0x17, 0xB7, 0x5A, - 0x59, 0x01, 0x11, 0xC0, 0xC6, 0x36, 0xD5, 0xBA, 0xB1, 0x46, 0x9E, 0x6B, 0xA1, 0xCB, 0x96, 0x7E, - 0x56, 0x91, 0x87, 0x68, 0x59, 0x8E, 0xCF, 0xB5, 0x58, 0x24, 0x2C, 0xD9, 0x0A, 0x06, 0x25, 0xCB, - 0x8C, 0xE6, 0x02, 0xE3, 0x5A, 0x19, 0x4D, 0x8F, 0x43, 0x5B, 0x40, 0x3F, 0x7D, 0x50, 0x24, 0x90, - 0x71, 0x3E, 0x88, 0x96, 0x3C, 0xCE, 0x2C, 0x80, 0x35, 0x68, 0x3E, 0x21, 0x67, 0x8A, 0x03, 0x68, - 0x49, 0x6B, 0xFA, 0xE2, 0x5A, 0xC7, 0xFF, 0x9C, 0xDF, 0x0D, 0xD9, 0xB5, 0x12, 0x07, 0x35, 0x7B, - 0x35, 0xDC, 0xF7, 0x12, 0x55, 0x71, 0x8A, 0x9F, 0x68, 0x66, 0x2A, 0x72, 0x55, 0x14, 0x82, 0xE2, - 0xBC, 0x3A, 0x39, 0xA7, 0x91, 0xA9, 0x91, 0xC8, 0x2B, 0x5F, 0x0A, 0x09, 0xFD, 0xE0, 0x6B, 0x58, - 0x85, 0x58, 0x1D, 0xCD, 0xEA, 0xAE, 0xBA, 0xA5, 0x49, 0xFF, 0x69, 0x4A, 0x10, 0xDD, 0x5A, 0xE0, - 0x0E, 0xD3, 0x9C, 0x0B, 0xD8, 0x28, 0x2E, 0xCA, 0x8E, 0x9F, 0x29, 0x84, 0xC8, 0xCA, 0x47, 0x79, - 0xB9, 0xCC, 0x71, 0xC6, 0xE1, 0xC1, 0x4D, 0x15, 0xB6, 0x1F, 0x92, 0x13, 0x2C, 0x83, 0xBE, 0x0D, - 0x03, 0x0A, 0x7C, 0x02, 0x7C, 0x2C, 0xFA, 0x8E, 0xC8, 0x23, 0xE1, 0xFD, 0x83, 0xDC, 0x61, 0xDB, - 0x1C, 0xE4, 0x3F, 0xE8, 0xA9, 0x1C, 0x55, 0x1E, 0xB2, 0xF1, 0x47, 0x6C, 0x5A, 0xD8, 0xD9, 0xD4, - 0xA8, 0xBF, 0x4B, 0xF9, 0x0A, 0xD5, 0xBF, 0x1D, 0x88, 0x30, 0x12, 0x80, 0x72, 0x49, 0x6C, 0x91, - 0x70, 0x6A, 0xB7, 0x4D, 0x86, 0x34, 0x8F, 0x57, 0x1A, 0x6A, 0x16, 0x7B, 0xA5, 0x5D, 0x3C, 0x74, - 0x8E, 0x03, 0x1D, 0x53, 0xD6, 0x1C, 0x75, 0x83, 0x2C, 0xF7, 0x5E, 0xF6, 0xE0, 0xC9, 0x25, 0x11, - 0x9F, 0x98, 0x73, 0xD2, 0xBE, 0x50, 0x56, 0xD6, 0x73, 0x38, 0xC8, 0x30, 0x5A, 0xB5, 0xF6, 0x67, - 0x37, 0x75, 0x7E, 0x99, 0x71, 0xC7, 0x30, 0x26, 0x0D, 0x43, 0xA2, 0x0B, 0xF0, 0xC2, 0xCC, 0x38, - 0xDF, 0x0F, 0x37, 0x25, 0xA0, 0x4F, 0x18, 0x5A, 0x40, 0x75, 0x2D, 0xFC, 0x52, 0xFF, 0x37, 0xD5, - 0x38, 0x06, 0xC6, 0x62, 0x13, 0xA0, 0x8E, 0x7A, 0xFA, 0xDD, 0xB9, 0x25, 0xBE, 0xBC, 0x1F, 0x02, - 0x4C, 0x56, 0xA1, 0xBA, 0x08, 0xBB, 0x65, 0xAE, 0xAC, 0x14, 0x4E, 0x65, 0xD7, 0xD1, 0x99, 0xFF, - 0x14, 0x33, 0x9F, 0x18, 0x1D, 0x54, 0x70, 0x6F, 0xBC, 0x85, 0xB4, 0x49, 0x82, 0x4C, 0x0A, 0xA6, - 0xE8, 0x10, 0x61, 0x8F, 0xED, 0xFD, 0x7F, 0x10, 0xAA, 0xAC, 0x13, 0xB5, 0xE2, 0x5D, 0xF3, 0x69, - 0x2B, 0xC3, 0xE1, 0xC2, 0x89, 0x9A, 0x46, 0xF0, 0x97, 0x34, 0xFC, 0x93, 0x31, 0x45, 0xE9, 0x7A, - 0xD4, 0x46, 0x1A, 0x31, 0xFF, 0x65, 0x39, 0xAE, 0xCE, 0xC5, 0x40, 0x2F, 0xD0, 0xCB, 0x1E, 0xC6, - 0x86, 0xDC, 0x2F, 0x72, 0x34, 0x35, 0x28, 0xAD, 0x96, 0xC3, 0xBE, 0xE4, 0xC8, 0xA5, 0xB6, 0x6B, - 0xBD, 0xFB, 0x9B, 0xE5, 0x16, 0x01, 0x4A, 0x55, 0xA2, 0xB0, 0xE8, 0x66, 0x4A, 0xC1, 0xE3, 0xC0, - 0xB9, 0x87, 0xF4, 0xD6, 0x8C, 0xF4, 0x61, 0x42, 0xA4, 0xBF, 0x73, 0x03, 0x67, 0xBD, 0x2F, 0x30, - 0x6E, 0x97, 0x45, 0x0F, 0xC6, 0xBD, 0xCA, 0x2E, 0x69, 0x72, 0x41, 0x07, 0x38, 0x74, 0x18, 0xB1, - 0xCB, 0x5C, 0xD3, 0xC2, 0x1D, 0xB7, 0xF2, 0xAF, 0xEC, 0x00, 0xCD, 0x4F, 0x6F, 0xDE, 0xB2, 0xAC, - 0x44, 0x4C, 0x1A, 0x56, 0xC3, 0x93, 0x21, 0x57, 0x8C, 0x6B, 0x1C, 0xD7, 0xF9, 0xC7, 0xC0, 0xA9, - 0xF7, 0xE4, 0xA3, 0xD8, 0x58, 0x9B, 0x35, 0xE6, 0x00, 0x7C, 0xE2, 0x12, 0xD0, 0x53, 0x61, 0x1F, - 0xC6, 0xA5, 0x81, 0x7A, 0x52, 0xEF, 0x09, 0x36, 0x1A, 0x62, 0x3C, 0x92, 0xD2, 0x65, 0x43, 0xF6, - 0xDF, 0x0B, 0x89, 0x7E, 0xC6, 0xB9, 0x47, 0xF4, 0x52, 0x14, 0x0C, 0x44, 0x4D, 0x23, 0x55, 0x6F, - 0x80, 0xC2, 0xBE, 0xC5, 0x59, 0xF8, 0xB5, 0x27, 0xE6, 0xE8, 0xF0, 0x32, 0x91, 0x3A, 0x59, 0x2B, - 0x1D, 0xF9, 0xAC, 0xF9, 0x2E, 0xF3, 0xB9, 0x36, 0x8C, 0x1A, 0x5D, 0x92, 0x33, 0xEA, 0xA6, 0xAF, - 0x71, 0x24, 0xE2, 0x7F, 0x18, 0xB1, 0x23, 0x3C, 0x53, 0xF3, 0xCC, 0x5D, 0xD4, 0x2D, 0x2B, 0x7A, - 0xF8, 0x94, 0x04, 0xC0, 0x8C, 0x65, 0x4D, 0x3A, 0xFA, 0xCF, 0xF9, 0x07, 0xC2, 0xD7, 0x75, 0x87, - 0x47, 0x9E, 0x6E, 0xA0, 0x79, 0x81, 0x6E, 0x03, 0xC7, 0xD2, 0x75, 0xF6, 0xC3, 0x85, 0x22, 0x28, - 0x1B, 0x39, 0x63, 0xCC, 0x12, 0x7E, 0x4A, 0xC3, 0x2A, 0x45, 0x85, 0xA9, 0x54, 0xDF, 0xB2, 0x33, - 0xEF, 0x76, 0x25, 0x31, 0xC9, 0xCD, 0xDA, 0x14, 0xE7, 0xD8, 0x4D, 0x18, 0xCE, 0xAB, 0xE7, 0x85, - 0xDD, 0x95, 0x8D, 0x36, 0xA1, 0x18, 0x87, 0x5E, 0xB6, 0x75, 0x2F, 0x3B, 0x97, 0x09, 0x18, 0x47, - 0xC8, 0x90, 0x37, 0xA3, 0xB2, 0xD2, 0x09, 0x3C, 0x5E, 0x6C, 0x2E, 0x72, 0x38, 0x08, 0x24, 0x99, - 0x90, 0xD0, 0x86, 0xC7, 0xD3, 0xFB, 0x4E, 0xA2, 0xDF, 0xC7, 0x26, 0x4D, 0x8E, 0x81, 0x98, 0x19, - 0x15, 0xD0, 0x4C, 0xB8, 0x44, 0xF7, 0x53, 0x1C, 0x0F, 0xAF, 0x78, 0x4C, 0x20, 0xB8, 0xCC, 0xBB, - 0x20, 0x60, 0xEC, 0x55, 0x70, 0xBD, 0xE9, 0x02, 0x63, 0x9F, 0x1F, 0xA7, 0xD5, 0x27, 0x18, 0x33, - 0x29, 0xA8, 0x33, 0x6E, 0xCB, 0x80, 0x40, 0x2D, 0x52, 0xDF, 0x6C, 0x78, 0x8F, 0xA6, 0x1D, 0xCF, - 0xE8, 0xB9, 0x54, 0x6B -}; +/* +Seed: 4D808D2C77D905C41A6380EC08586AFE (0x05 packet) +Hash: 568C054C781A972A6037A2290C22B52571A06F4E (0x04 packet) +Module MD5: 79C0768D657977D697E10BAD956CCED1 +New Client Key: 7F 96 EE FD A5 B6 3D 20 A4 DF 8E 00 CB F4 83 04 +New Cerver Key: C2 B7 AD ED FC CC A9 C2 BF B3 F8 56 02 BA 80 9B +*/ -uint8 Module_79C0768D657977D697E10BAD956CCED1_Key[16] = +struct Module_79C0768D657977D697E10BAD956CCED1 +{ + uint8 Module[18756]; + uint8 ModuleKey[16]; + uint8 Seed[16]; + uint8 ServerKeySeed[16]; + uint8 ClientKeySeed[16]; + uint8 ClientKeySeedHash[20]; +} Module = { - 0xAE, 0x25, 0xBC, 0x51, 0x06, 0x3B, 0x77, 0xBD, 0x36, 0x3C, 0x3E, 0xFE, 0x0F, 0xC1, 0x73, 0xF9 + { + 0x21, 0x6C, 0xBB, 0x6A, 0xB9, 0xAF, 0xE8, 0xA1, 0x9A, 0x79, 0x18, 0xF1, 0x27, 0x9A, 0x14, 0xF5, + 0x42, 0x5D, 0x00, 0xBA, 0x74, 0x57, 0x0E, 0xAF, 0xD2, 0xAE, 0x8E, 0x51, 0xA5, 0xC1, 0x17, 0x4E, + 0xEC, 0x7F, 0xAC, 0xBC, 0xDD, 0x42, 0x87, 0xA6, 0xF9, 0xC1, 0x4A, 0xCE, 0xB5, 0xDD, 0xB3, 0xF8, + 0x06, 0x52, 0x9D, 0xF2, 0xAE, 0x2A, 0x49, 0x2B, 0x7B, 0x72, 0x5F, 0x40, 0x01, 0x16, 0xDB, 0x98, + 0x77, 0x1F, 0xE3, 0x61, 0x5A, 0x99, 0x39, 0x66, 0x2F, 0x2F, 0x35, 0xBF, 0x00, 0x20, 0xE4, 0xE0, + 0x8F, 0x98, 0xAD, 0xFC, 0xDB, 0x7D, 0xDD, 0xE8, 0x7A, 0xE9, 0x21, 0x6C, 0x86, 0x80, 0x3A, 0xE7, + 0x75, 0x66, 0x0E, 0xD9, 0xC6, 0xC5, 0xD8, 0xD8, 0xA9, 0x9B, 0x84, 0x09, 0xF0, 0xB3, 0x7C, 0x72, + 0x53, 0xE2, 0x29, 0xF9, 0x64, 0x8C, 0x17, 0xFD, 0x90, 0xAE, 0x48, 0x5A, 0x30, 0xFA, 0x30, 0xB7, + 0x54, 0x58, 0x59, 0x61, 0xA0, 0x24, 0x57, 0xE4, 0xF0, 0x05, 0xA2, 0x3F, 0x7A, 0xA6, 0x51, 0x7E, + 0x4F, 0x35, 0xF4, 0xE5, 0xFF, 0x98, 0xE9, 0x3E, 0x1F, 0xF1, 0x66, 0x48, 0x5B, 0xF8, 0xCF, 0x3B, + 0x37, 0x3B, 0x60, 0x47, 0x1C, 0xF7, 0xBE, 0x59, 0x70, 0x3A, 0x03, 0x4C, 0xE6, 0xBD, 0xB6, 0xED, + 0x46, 0xAF, 0x04, 0x5A, 0xAA, 0xC4, 0x30, 0xCF, 0x0B, 0x05, 0x86, 0xA9, 0x56, 0x5B, 0x09, 0xF0, + 0x92, 0x59, 0xC8, 0x48, 0x58, 0x33, 0xBF, 0x81, 0x70, 0x51, 0x92, 0x98, 0xE9, 0x4F, 0x2B, 0xDD, + 0x5B, 0x0A, 0x42, 0x51, 0x73, 0x97, 0xF6, 0x66, 0x00, 0xF2, 0x04, 0x50, 0x4A, 0x54, 0x62, 0x7A, + 0x00, 0x10, 0x5B, 0xAD, 0x0E, 0xFC, 0xE1, 0x44, 0x55, 0x4E, 0x21, 0x76, 0xC6, 0x4B, 0xD5, 0x2E, + 0xF5, 0xF4, 0x0E, 0xFC, 0x55, 0xE1, 0xDE, 0x32, 0x20, 0x22, 0x03, 0x98, 0xF0, 0xD3, 0x4A, 0xE5, + 0x45, 0x49, 0x0C, 0xE8, 0x76, 0xE1, 0xBF, 0x4A, 0x53, 0xD3, 0xCE, 0x64, 0xCF, 0x82, 0xCF, 0x67, + 0xA9, 0x3F, 0xF1, 0x06, 0x24, 0x33, 0x0A, 0x98, 0x6A, 0x5C, 0xAB, 0xEE, 0x7F, 0x64, 0xE3, 0x65, + 0x1F, 0xF6, 0xBE, 0xAF, 0x9C, 0x63, 0x53, 0x54, 0x06, 0x84, 0x4F, 0xF2, 0x7D, 0xC5, 0xBD, 0x70, + 0xC7, 0x6F, 0x59, 0x93, 0x7C, 0xEE, 0xC0, 0xCA, 0xF5, 0x56, 0x21, 0x58, 0x5B, 0xD8, 0x1D, 0xB4, + 0xB7, 0x60, 0x72, 0x46, 0xA2, 0x60, 0x3F, 0xC3, 0x30, 0xAB, 0xE0, 0x3B, 0xAC, 0x9E, 0xB9, 0x64, + 0xA8, 0xEF, 0xD0, 0xE1, 0xE5, 0xE1, 0x83, 0x48, 0xB8, 0x35, 0xA7, 0x12, 0x11, 0x00, 0xC9, 0x29, + 0x1A, 0x41, 0x1D, 0x3B, 0xFB, 0x33, 0x0B, 0x66, 0x45, 0x86, 0x61, 0x70, 0x35, 0x4C, 0x5F, 0x64, + 0x8E, 0xF5, 0x57, 0xBE, 0xA6, 0xFA, 0x49, 0xC9, 0x89, 0xA4, 0x74, 0x02, 0x9E, 0xE7, 0x67, 0x14, + 0x8B, 0xB9, 0xE7, 0xA8, 0xB0, 0x75, 0x65, 0x22, 0xB7, 0xCD, 0xFA, 0x55, 0x18, 0x00, 0x55, 0xB5, + 0x09, 0x70, 0x7E, 0x05, 0x0B, 0x11, 0x42, 0xF0, 0x80, 0x58, 0x2F, 0xFE, 0x3B, 0x2C, 0x4A, 0xCA, + 0x50, 0x34, 0xD0, 0x6F, 0xF1, 0xCC, 0x7F, 0x35, 0xD7, 0x9B, 0xF2, 0x97, 0x16, 0xFE, 0x5F, 0x6C, + 0x94, 0xDC, 0xAC, 0x63, 0xC8, 0x85, 0x2E, 0x60, 0x41, 0x34, 0x89, 0xD3, 0xDD, 0xBF, 0x2D, 0x69, + 0xC2, 0xF7, 0x74, 0xB2, 0x56, 0xD9, 0x76, 0xA2, 0x35, 0x30, 0x60, 0x35, 0xAB, 0x50, 0x21, 0xAE, + 0xFC, 0xFA, 0x19, 0x06, 0xDE, 0x89, 0x46, 0xFF, 0x34, 0x2F, 0x19, 0x84, 0x85, 0xF5, 0x1E, 0x60, + 0x91, 0x0D, 0x8C, 0x94, 0xDB, 0x2E, 0xEE, 0x4D, 0x0A, 0x29, 0x64, 0x81, 0xAD, 0x4C, 0xBF, 0x41, + 0x51, 0x04, 0xCD, 0x1C, 0x5C, 0x89, 0xD3, 0x3A, 0x91, 0xD9, 0x5C, 0x7E, 0xF3, 0xE9, 0x5B, 0x9E, + 0xC2, 0xD2, 0xE4, 0xD5, 0xEF, 0x47, 0x63, 0xD2, 0xD4, 0x19, 0x3E, 0xDF, 0xCF, 0xA4, 0x10, 0x47, + 0x16, 0x93, 0xC2, 0xF2, 0x22, 0xED, 0x1D, 0x9E, 0x21, 0x63, 0xC4, 0xCB, 0x89, 0xBB, 0x3E, 0xF7, + 0x89, 0x68, 0x6D, 0x2C, 0xDF, 0x2C, 0x6F, 0xB2, 0x8D, 0x75, 0xF8, 0xC6, 0x57, 0x98, 0x47, 0x86, + 0x40, 0x72, 0xBB, 0xD7, 0x32, 0xCD, 0x7A, 0x15, 0x64, 0x83, 0xD9, 0x50, 0x2E, 0xDE, 0x0C, 0x8C, + 0x30, 0xCD, 0xB0, 0x64, 0xD6, 0x7F, 0xE7, 0xAD, 0x6E, 0x01, 0x3E, 0x14, 0x8A, 0x24, 0x86, 0x1F, + 0x92, 0xAB, 0x1A, 0xE5, 0xD6, 0xBF, 0x64, 0xE5, 0xF6, 0x34, 0x62, 0xD5, 0x92, 0x5B, 0x64, 0xC4, + 0xFC, 0x1B, 0x7F, 0xA0, 0x13, 0xC1, 0xD4, 0xEB, 0x92, 0x90, 0xEF, 0x8C, 0x5E, 0x75, 0x4B, 0x78, + 0x56, 0x5F, 0xA2, 0x55, 0x4B, 0x1B, 0xE3, 0xDD, 0x80, 0x7E, 0xCF, 0x69, 0x97, 0x5A, 0x76, 0xD5, + 0xAA, 0x7D, 0x85, 0x73, 0x10, 0x4E, 0x79, 0x9A, 0x10, 0x10, 0x01, 0xD8, 0xD7, 0x85, 0x41, 0x8D, + 0x3D, 0xEA, 0xE3, 0x59, 0xD9, 0x31, 0x4B, 0x23, 0xC6, 0x53, 0x11, 0xA6, 0x35, 0x29, 0x64, 0x7E, + 0x28, 0xD7, 0x8D, 0x03, 0x70, 0x5C, 0x53, 0xA7, 0x6D, 0x81, 0x30, 0x7B, 0xDF, 0x2B, 0xAE, 0xAB, + 0x6F, 0x52, 0x93, 0xCF, 0xDD, 0x00, 0x35, 0xE9, 0x65, 0x4A, 0x04, 0x79, 0x11, 0x30, 0xCA, 0xC7, + 0xD2, 0xF3, 0x34, 0xAC, 0x32, 0x1F, 0xE4, 0xE5, 0x83, 0x12, 0x66, 0xD6, 0xA6, 0xE4, 0xEB, 0x67, + 0x7E, 0xDD, 0x64, 0x3E, 0xF1, 0x0C, 0xE6, 0x1C, 0xB6, 0xE1, 0xB0, 0x2B, 0xE7, 0x83, 0xB4, 0x4A, + 0x82, 0xDD, 0xC1, 0x22, 0x3F, 0x03, 0x38, 0x90, 0xB2, 0xA9, 0x7B, 0x60, 0x57, 0xF9, 0xDD, 0x04, + 0x60, 0x5D, 0x7C, 0x2C, 0xD3, 0xE6, 0xFE, 0x02, 0x5A, 0x7D, 0x2A, 0x48, 0x81, 0x42, 0x20, 0x84, + 0xFF, 0x1D, 0xCC, 0x64, 0x11, 0x70, 0xE5, 0x4F, 0x9F, 0xE0, 0x11, 0xFB, 0xF0, 0xE2, 0xC4, 0x9B, + 0x11, 0x30, 0x7F, 0x2F, 0x7F, 0xA1, 0xB1, 0xBC, 0x5F, 0x29, 0x21, 0xDF, 0xB4, 0xEB, 0xB2, 0x4F, + 0xAA, 0x2D, 0x95, 0x60, 0x47, 0x78, 0x37, 0x67, 0xCD, 0xFA, 0x36, 0x17, 0x8F, 0x64, 0x15, 0xAF, + 0x04, 0xAA, 0x5C, 0x76, 0x23, 0x07, 0x64, 0x96, 0xB2, 0x5A, 0xCF, 0x03, 0xDC, 0xC3, 0x2D, 0xFB, + 0x0D, 0x2D, 0xA8, 0xBD, 0xCE, 0x58, 0xF8, 0x44, 0x75, 0xA1, 0x07, 0xAA, 0xDF, 0x25, 0xDC, 0x25, + 0x32, 0xCF, 0xA8, 0x92, 0xC5, 0xC0, 0xD5, 0x70, 0x21, 0x19, 0x6F, 0x32, 0xCA, 0x16, 0xFA, 0x8C, + 0xB2, 0x86, 0xF6, 0xD5, 0x2E, 0xD9, 0x0A, 0x9C, 0x96, 0xDB, 0x4D, 0xA4, 0x11, 0x02, 0x4C, 0x33, + 0x99, 0xB3, 0x5E, 0x45, 0x5C, 0xF1, 0x99, 0x61, 0x04, 0x20, 0xC9, 0xC8, 0xB3, 0xB4, 0xD3, 0x8B, + 0x24, 0x78, 0x55, 0x2E, 0xB7, 0x48, 0x43, 0x17, 0xBF, 0xB9, 0x2A, 0xCC, 0xD5, 0x4A, 0x49, 0xB2, + 0x4E, 0x1E, 0xC7, 0x45, 0x4E, 0x55, 0xC4, 0xBC, 0xB1, 0xD2, 0xA6, 0x62, 0xE9, 0x95, 0xBB, 0xCD, + 0x87, 0xD2, 0x7C, 0xE5, 0xC6, 0x77, 0x5B, 0xFF, 0xAF, 0xDD, 0x44, 0x9D, 0x3D, 0x10, 0x05, 0x3C, + 0x77, 0x7A, 0xF8, 0x84, 0x0D, 0x04, 0x55, 0xB5, 0x20, 0xEA, 0xD2, 0x3F, 0x04, 0x33, 0xFF, 0xE2, + 0x01, 0x3B, 0x51, 0x46, 0x3E, 0x34, 0xAA, 0x40, 0xCA, 0x7C, 0x85, 0x46, 0x57, 0xD9, 0xB7, 0xE1, + 0xDC, 0x65, 0xEF, 0x11, 0x66, 0x0B, 0xBA, 0xD8, 0x37, 0x66, 0x96, 0x64, 0x54, 0x8B, 0x05, 0x81, + 0x47, 0x87, 0x70, 0xA8, 0x54, 0xC6, 0x02, 0x08, 0xB4, 0xAD, 0x69, 0x3C, 0xC0, 0x03, 0x69, 0x19, + 0xE6, 0xAC, 0x13, 0xD5, 0x3F, 0x2C, 0x9D, 0x61, 0xCC, 0xA8, 0x60, 0xB5, 0x60, 0x85, 0x19, 0x5B, + 0x3E, 0x82, 0xCA, 0x34, 0x70, 0x06, 0xCD, 0x37, 0x3E, 0x91, 0x2F, 0x49, 0x82, 0x0A, 0x87, 0xE8, + 0x09, 0x18, 0xB3, 0xF4, 0x16, 0xA4, 0xA5, 0x46, 0xC5, 0x76, 0x6D, 0x73, 0xB1, 0x93, 0xDC, 0x69, + 0xF4, 0x49, 0xF8, 0x2F, 0x97, 0xB4, 0xAA, 0x19, 0x4A, 0x60, 0xD2, 0xF9, 0x7B, 0x5A, 0xF0, 0x57, + 0x45, 0xC6, 0xA2, 0x64, 0x37, 0x56, 0xED, 0x6B, 0x5E, 0x1D, 0x9E, 0x35, 0x5E, 0xFE, 0xDE, 0x04, + 0x08, 0x3B, 0x62, 0x40, 0x82, 0xD4, 0xF9, 0xF3, 0x54, 0x95, 0x3E, 0x57, 0x49, 0x3A, 0x41, 0x41, + 0xDA, 0xD4, 0x78, 0x80, 0xC7, 0xF1, 0xDE, 0xA7, 0xFF, 0xDC, 0x53, 0xC9, 0x3A, 0x37, 0xA5, 0x83, + 0xDE, 0xE8, 0x51, 0x33, 0x7B, 0xE6, 0xAC, 0xA5, 0xC4, 0x7D, 0x34, 0xB0, 0x99, 0x0D, 0x03, 0x34, + 0x0F, 0x8D, 0xB8, 0x10, 0x4E, 0x30, 0x38, 0x10, 0xFC, 0x62, 0xC3, 0xC0, 0xF5, 0x67, 0x69, 0xF5, + 0x23, 0xB4, 0xF2, 0x6B, 0x79, 0xA8, 0xEE, 0xF0, 0xDD, 0x06, 0xA1, 0x50, 0x41, 0x3E, 0x1D, 0x04, + 0xB0, 0xB7, 0xC8, 0x58, 0x20, 0x72, 0xF6, 0x41, 0x53, 0x58, 0xAA, 0xAB, 0xA1, 0x19, 0xB0, 0x99, + 0xE4, 0x35, 0x44, 0x32, 0xF0, 0x34, 0x52, 0x4E, 0xD0, 0xBC, 0x1D, 0xD2, 0x14, 0x6A, 0x22, 0x46, + 0x93, 0x52, 0xFF, 0xD5, 0xD9, 0xEF, 0x19, 0xAF, 0xFB, 0x9A, 0x0D, 0x4A, 0x14, 0x49, 0xAE, 0xC0, + 0x09, 0x5E, 0x40, 0x36, 0x63, 0xE7, 0xC3, 0xFA, 0x84, 0x1C, 0xBF, 0x65, 0x17, 0xED, 0xED, 0x49, + 0x93, 0xB9, 0xCD, 0x85, 0x3F, 0x95, 0x57, 0xF9, 0xE7, 0x59, 0x55, 0x59, 0xED, 0x3A, 0xA1, 0x90, + 0x24, 0x36, 0xB8, 0x38, 0x91, 0x57, 0x59, 0xDB, 0xDE, 0x8E, 0x8B, 0x3A, 0xBB, 0x31, 0x76, 0x39, + 0x0D, 0x20, 0x84, 0x8A, 0x05, 0x5A, 0xC1, 0x93, 0x04, 0x5E, 0x9E, 0x2E, 0x41, 0x13, 0xC9, 0x7F, + 0xAB, 0x45, 0x86, 0x99, 0xB2, 0x5C, 0x7E, 0x1A, 0x1C, 0x9C, 0x7C, 0xCF, 0x60, 0x38, 0xF7, 0x02, + 0x8A, 0xE6, 0x74, 0x4F, 0x31, 0x67, 0x99, 0x96, 0xC3, 0x79, 0xEB, 0x19, 0x07, 0xAD, 0xBB, 0xD2, + 0xD7, 0x51, 0x75, 0xDD, 0xD5, 0x44, 0xC2, 0x9A, 0xDE, 0x01, 0x68, 0x8C, 0xBF, 0x11, 0xFE, 0x5F, + 0xB9, 0xCF, 0x25, 0x35, 0xD2, 0xF7, 0x29, 0xE0, 0x63, 0x0F, 0x0A, 0xCA, 0xB9, 0x38, 0xB6, 0xDA, + 0xDD, 0x66, 0xD9, 0x5F, 0x67, 0x42, 0x15, 0xD8, 0x1C, 0xD1, 0x1C, 0xCC, 0xD6, 0xB9, 0x29, 0x85, + 0x99, 0xD6, 0xDD, 0xCE, 0x8E, 0x3D, 0x63, 0x1C, 0x31, 0x32, 0x37, 0xCD, 0xE1, 0xF8, 0xEA, 0x4E, + 0x31, 0x25, 0xF7, 0x2D, 0xE1, 0xCA, 0x36, 0x5B, 0xEC, 0xAC, 0x2B, 0xB0, 0xA5, 0x69, 0x3B, 0x4C, + 0xAE, 0xD7, 0x15, 0xF7, 0x7F, 0x5C, 0x5F, 0x82, 0xF0, 0x1D, 0x44, 0x62, 0xA0, 0x72, 0x57, 0xAD, + 0xB3, 0xD7, 0x1B, 0xA9, 0xE2, 0x76, 0xFF, 0x18, 0xA6, 0x3E, 0xF9, 0xF5, 0x6F, 0xB5, 0x13, 0x26, + 0x72, 0x0F, 0xF4, 0xE1, 0x7D, 0x43, 0x86, 0x48, 0x42, 0x0B, 0x94, 0x96, 0xBF, 0x0E, 0x32, 0x1C, + 0xE0, 0x18, 0x69, 0xA9, 0xAE, 0x83, 0x6F, 0x36, 0xE7, 0x04, 0x20, 0xEE, 0x34, 0xFF, 0x21, 0xE9, + 0xBA, 0x3B, 0x38, 0x48, 0x2D, 0x81, 0x38, 0x48, 0x25, 0xE5, 0x4A, 0xAD, 0x81, 0xA9, 0xE8, 0x33, + 0x0A, 0x4C, 0x60, 0xAE, 0xBB, 0xCC, 0x24, 0x96, 0x44, 0xF3, 0x1A, 0x2A, 0x89, 0xCB, 0xD9, 0x5E, + 0x89, 0x4C, 0xFD, 0x62, 0xA8, 0x38, 0x1E, 0x73, 0x63, 0xB3, 0xF1, 0x3E, 0xAC, 0xB1, 0x0B, 0x5D, + 0x10, 0xE5, 0xCC, 0x88, 0x2F, 0x9D, 0x57, 0xF1, 0x33, 0xA6, 0x50, 0x13, 0x2C, 0x54, 0x81, 0x1B, + 0x90, 0xD8, 0x6F, 0x7C, 0x02, 0x86, 0xA8, 0x02, 0x5F, 0xCE, 0x24, 0x22, 0x76, 0x73, 0xE8, 0x66, + 0xDC, 0x7F, 0x8F, 0x69, 0x4E, 0xBB, 0x63, 0xEB, 0xCD, 0x38, 0xE6, 0xEE, 0x84, 0x70, 0x97, 0x2F, + 0xD1, 0x77, 0xEE, 0x63, 0xE4, 0x2D, 0x42, 0xDE, 0x17, 0x95, 0x18, 0xB5, 0xA9, 0x4D, 0xFD, 0x2A, + 0xA8, 0x07, 0x1F, 0xCC, 0x3F, 0x22, 0x3B, 0x03, 0x49, 0xCF, 0x83, 0x83, 0x85, 0xAA, 0x87, 0xA0, + 0xC6, 0x30, 0x8C, 0x8F, 0x91, 0x88, 0x67, 0xA7, 0x1F, 0xE0, 0xE2, 0x40, 0x1E, 0xE9, 0x12, 0x2E, + 0x5C, 0x33, 0x44, 0x29, 0x0D, 0xEA, 0x34, 0x8B, 0x1A, 0x48, 0x80, 0x67, 0x45, 0x2A, 0xF2, 0x82, + 0xD8, 0x78, 0x7E, 0x36, 0x59, 0x6C, 0x32, 0x58, 0x3B, 0x0F, 0x2C, 0x0B, 0xD1, 0xFA, 0x67, 0x2B, + 0x0C, 0xFF, 0x16, 0x57, 0x04, 0x38, 0x51, 0x4F, 0x34, 0xEE, 0x94, 0x8B, 0xBB, 0x7B, 0xBE, 0xEA, + 0x37, 0xB5, 0x9F, 0xBA, 0xDE, 0xC1, 0xC6, 0x34, 0x2D, 0x36, 0xE6, 0xC8, 0x67, 0x6A, 0x74, 0x56, + 0xB5, 0x05, 0x53, 0xAE, 0x5C, 0x94, 0x83, 0xF9, 0xE0, 0xD7, 0x21, 0xC2, 0x71, 0x4B, 0x0F, 0x9C, + 0x64, 0x1C, 0xF4, 0x6A, 0xF8, 0xE3, 0x3C, 0x8F, 0xD2, 0x20, 0xCF, 0x14, 0xAC, 0x21, 0xF5, 0x2A, + 0xE7, 0xEC, 0x5C, 0x49, 0xAB, 0x21, 0xF2, 0x41, 0x2C, 0x3B, 0xA0, 0x49, 0x43, 0xF3, 0x14, 0xFE, + 0x68, 0x7C, 0x83, 0x05, 0xF3, 0x71, 0x77, 0x02, 0x2B, 0xD4, 0x94, 0x2B, 0x28, 0x5E, 0x4A, 0x5E, + 0x6E, 0x81, 0x1A, 0xD3, 0xDA, 0x58, 0x9F, 0xD6, 0x7B, 0x6D, 0xAD, 0x14, 0xBC, 0x60, 0xFC, 0xC4, + 0x83, 0x0A, 0x8E, 0x9B, 0x8D, 0x5B, 0x24, 0x77, 0x10, 0x34, 0x78, 0xC9, 0x8F, 0xA5, 0x2D, 0x0F, + 0x6A, 0x88, 0x7F, 0x24, 0x40, 0x46, 0x25, 0x3A, 0xDE, 0xB9, 0x9E, 0xA2, 0xE7, 0x8D, 0x52, 0xA2, + 0xFF, 0xDE, 0xB4, 0x95, 0xDB, 0x05, 0x2E, 0xDF, 0x29, 0x28, 0xB5, 0x76, 0xD6, 0x1D, 0x09, 0x45, + 0x69, 0x29, 0xF9, 0x95, 0xAA, 0x36, 0x71, 0xD9, 0x3F, 0xFF, 0x6B, 0x04, 0xFE, 0xED, 0x63, 0xC8, + 0x3C, 0x4B, 0x6B, 0x0B, 0xF3, 0xD8, 0x71, 0x15, 0xDA, 0xC0, 0xC9, 0xE2, 0x0D, 0x87, 0x94, 0x61, + 0xBE, 0xEF, 0x79, 0x92, 0x4C, 0x14, 0x92, 0xBF, 0x0C, 0x4E, 0xA0, 0x1B, 0x58, 0x00, 0x30, 0xF6, + 0xD0, 0x09, 0xD6, 0x1E, 0x81, 0xA0, 0xE7, 0xFD, 0xFD, 0xFF, 0x21, 0x47, 0xAB, 0xDE, 0x67, 0xC6, + 0xF4, 0x19, 0x60, 0x0C, 0x49, 0xE5, 0xC4, 0xBD, 0x64, 0x05, 0xED, 0x89, 0xD7, 0xBD, 0x74, 0xF7, + 0xD4, 0xCC, 0x4B, 0x9E, 0xEB, 0x6E, 0xB7, 0x87, 0xB6, 0x31, 0x07, 0xCB, 0x6E, 0x0D, 0xDF, 0x3A, + 0xD8, 0x64, 0x1F, 0xF9, 0x2C, 0xEE, 0xC0, 0x61, 0x22, 0x0E, 0x5A, 0x20, 0x0C, 0xD4, 0x4F, 0xC5, + 0x2D, 0x82, 0x63, 0x39, 0x36, 0x34, 0x07, 0xC6, 0x23, 0xBC, 0xF1, 0x56, 0xC6, 0x8C, 0x39, 0x23, + 0x43, 0xFF, 0xEC, 0xBE, 0x95, 0x7B, 0xC7, 0xFD, 0xA9, 0x99, 0x3D, 0xDF, 0x50, 0x28, 0x39, 0xCA, + 0x80, 0xCF, 0x1C, 0xE7, 0x81, 0x06, 0xB4, 0x43, 0x55, 0xFB, 0xB0, 0xA4, 0x5D, 0x78, 0x39, 0x71, + 0x88, 0xEC, 0xBB, 0x01, 0x69, 0x5E, 0x85, 0x97, 0x1F, 0xEB, 0x6C, 0x82, 0x07, 0xF4, 0x00, 0x1B, + 0x90, 0x03, 0x1B, 0x92, 0x9A, 0x4A, 0x95, 0x9D, 0x45, 0x45, 0x65, 0x6F, 0x8B, 0x70, 0x4C, 0xFE, + 0x48, 0x94, 0x5B, 0x71, 0x86, 0x70, 0x45, 0xB7, 0x85, 0xD9, 0x59, 0x29, 0x94, 0x47, 0x5A, 0x17, + 0x96, 0xA1, 0x0E, 0xFD, 0x72, 0x71, 0xE1, 0x3F, 0x7B, 0xE6, 0x59, 0x2A, 0x91, 0x5A, 0x6B, 0x82, + 0xB1, 0xA1, 0x31, 0xC2, 0xE4, 0xE3, 0xB9, 0x8E, 0x5A, 0x68, 0xC1, 0x18, 0xD4, 0x4B, 0x02, 0x2E, + 0x50, 0x3D, 0x73, 0x53, 0x2B, 0x13, 0x77, 0x19, 0xC7, 0x03, 0x0B, 0xB5, 0xAD, 0x5C, 0x0B, 0x6B, + 0x66, 0x12, 0xF0, 0xE8, 0x67, 0xB7, 0xF7, 0x88, 0x64, 0xA8, 0x2C, 0x51, 0xA7, 0xF8, 0x5E, 0xB3, + 0x39, 0xEC, 0x1B, 0xDF, 0x6C, 0x89, 0x16, 0xFD, 0x51, 0x26, 0x29, 0x8D, 0x0E, 0xBE, 0x1B, 0xCE, + 0x61, 0xE5, 0x22, 0x09, 0xC1, 0x0F, 0xAD, 0x0C, 0xA1, 0x61, 0xF8, 0x49, 0x29, 0x11, 0x7C, 0x93, + 0x0C, 0xBE, 0xD0, 0x11, 0x6F, 0x24, 0x4E, 0x4B, 0xF5, 0xEF, 0x41, 0x3D, 0x0C, 0x69, 0xC6, 0xA6, + 0xBF, 0x87, 0x68, 0xFF, 0x2F, 0x76, 0xD9, 0xFD, 0x1D, 0x8E, 0x9F, 0x80, 0x19, 0x3B, 0x35, 0x8B, + 0x2D, 0xDB, 0x5C, 0x3E, 0x86, 0xE8, 0xBF, 0xF1, 0x30, 0x88, 0xE4, 0x80, 0xD0, 0x49, 0xC3, 0x50, + 0xF8, 0x1E, 0xCE, 0xDA, 0xAC, 0x2E, 0x3F, 0x97, 0x51, 0x12, 0x89, 0x47, 0x5D, 0xF4, 0xD4, 0x77, + 0x93, 0x66, 0x74, 0xE3, 0x4C, 0xCD, 0xB4, 0xC8, 0x00, 0x85, 0x64, 0x8C, 0x04, 0x72, 0x1C, 0x14, + 0xDA, 0x77, 0xD7, 0x1D, 0x39, 0xC3, 0x65, 0xD0, 0x28, 0x51, 0xCA, 0x91, 0xAE, 0x2D, 0xCD, 0x50, + 0x0D, 0x1B, 0xA4, 0xF1, 0x5D, 0x4C, 0x28, 0x1C, 0x57, 0xE5, 0x00, 0xEC, 0xA4, 0x02, 0x3B, 0xCA, + 0x70, 0xF3, 0x8B, 0x3C, 0x4F, 0xEE, 0x9D, 0x08, 0xFF, 0x66, 0x31, 0xCE, 0x37, 0x93, 0x90, 0x3D, + 0x6E, 0xDE, 0xB9, 0xCF, 0x35, 0xAA, 0xF0, 0x43, 0x3E, 0x6B, 0x19, 0xEC, 0x69, 0x7A, 0xF0, 0xC6, + 0xC3, 0x7D, 0x49, 0x89, 0x43, 0xCC, 0x2C, 0x20, 0x2E, 0xB8, 0x5D, 0xCC, 0xDB, 0x39, 0xCB, 0x0B, + 0x76, 0xD8, 0xAC, 0xD6, 0x2A, 0x76, 0x59, 0x7F, 0x6A, 0x1B, 0xCD, 0x4A, 0x93, 0xCA, 0x42, 0x5F, + 0xC7, 0x98, 0xFA, 0xC9, 0x30, 0x2E, 0x9F, 0x8F, 0xE5, 0xB5, 0x37, 0x41, 0x19, 0xF4, 0xA0, 0xE5, + 0xDA, 0x7D, 0x3C, 0xF5, 0x61, 0xCC, 0x98, 0x27, 0xED, 0xE4, 0x5C, 0x0E, 0x7C, 0x1B, 0x33, 0x38, + 0x77, 0x20, 0x92, 0xC9, 0xD3, 0x38, 0xC3, 0x03, 0x2C, 0xAF, 0xE2, 0x77, 0x34, 0x4B, 0xE2, 0x1C, + 0x9F, 0xE4, 0x4D, 0xAB, 0x12, 0xFE, 0xCD, 0xB3, 0x2C, 0xD3, 0xE2, 0x42, 0xB8, 0xE7, 0xE0, 0x14, + 0x88, 0x31, 0xB1, 0xDC, 0x35, 0xDE, 0xCD, 0x3D, 0x3B, 0xDF, 0x6C, 0x00, 0xA3, 0x48, 0xA6, 0x71, + 0x7E, 0xC6, 0x3A, 0xE8, 0x07, 0xCE, 0xC8, 0xE7, 0xDC, 0xB1, 0x98, 0x17, 0xDB, 0x75, 0x20, 0xFE, + 0x38, 0xC7, 0x1F, 0x02, 0x8E, 0xE4, 0x91, 0x79, 0x3D, 0xC0, 0x50, 0x2D, 0xC7, 0x49, 0x33, 0x6C, + 0xDF, 0x3C, 0xE9, 0x42, 0xE9, 0x27, 0xBC, 0x39, 0x38, 0xAA, 0x98, 0x16, 0x6E, 0x1F, 0x71, 0xDF, + 0x3B, 0xBA, 0x15, 0x2F, 0x69, 0xEB, 0x06, 0x5C, 0xFB, 0xF8, 0x4C, 0x83, 0x2C, 0x28, 0xC2, 0x19, + 0xAD, 0x04, 0xA1, 0xB0, 0x7F, 0xF1, 0x9C, 0x84, 0x38, 0x42, 0x45, 0x3E, 0x1E, 0xC7, 0x95, 0xD5, + 0xAF, 0x35, 0x7E, 0x2A, 0xCC, 0x06, 0x9D, 0x9A, 0xCF, 0xC2, 0x56, 0xE6, 0x73, 0x7F, 0x7E, 0x9D, + 0x9B, 0x01, 0x27, 0x76, 0x14, 0x8C, 0x3E, 0x3A, 0xBD, 0x2E, 0x6C, 0x7C, 0xB7, 0xF2, 0x9A, 0x92, + 0x41, 0xBC, 0xD0, 0x48, 0xF6, 0xE6, 0x16, 0x62, 0x01, 0x4D, 0x3D, 0x8E, 0xD2, 0x98, 0x8F, 0x61, + 0x70, 0x7C, 0x41, 0xCC, 0xCA, 0x3D, 0x3E, 0x0B, 0x70, 0xC3, 0x9F, 0x9D, 0x3E, 0x33, 0x50, 0x2B, + 0xB0, 0x47, 0xC8, 0xA3, 0xAA, 0x55, 0xBA, 0x16, 0x3B, 0xF4, 0x07, 0x98, 0x1B, 0x6C, 0x49, 0x6A, + 0xA5, 0xB4, 0x7A, 0xBE, 0x28, 0x37, 0xF2, 0x55, 0x69, 0x09, 0x7A, 0xEC, 0x94, 0x1C, 0x60, 0xE3, + 0xB5, 0x89, 0x07, 0x58, 0x43, 0xA3, 0x3F, 0x1D, 0x94, 0x20, 0x49, 0x5E, 0xC1, 0xB7, 0x4E, 0x2C, + 0x75, 0x95, 0x54, 0x91, 0x4A, 0x01, 0x90, 0xF8, 0xF1, 0x81, 0xC6, 0x4C, 0x9A, 0x63, 0x20, 0x55, + 0x65, 0x8D, 0x30, 0xA2, 0xD4, 0xC7, 0xAF, 0x18, 0xA5, 0x83, 0xB6, 0x68, 0x1B, 0x35, 0x13, 0x6D, + 0xC6, 0x77, 0x5A, 0x04, 0xFB, 0xD5, 0xBD, 0x2B, 0x0D, 0x55, 0x5E, 0xEC, 0x7A, 0x80, 0x17, 0x01, + 0x9C, 0x4F, 0x55, 0x39, 0x57, 0x9F, 0x31, 0x9E, 0xB9, 0xB1, 0x35, 0xD5, 0x2F, 0xB9, 0xF3, 0x6A, + 0x9C, 0x30, 0xEA, 0x1B, 0xE9, 0x34, 0x4A, 0x2F, 0xB1, 0x36, 0x9C, 0xF0, 0x8A, 0xE9, 0x62, 0xDB, + 0x06, 0x32, 0x64, 0x39, 0x58, 0x29, 0xBD, 0xB1, 0x2C, 0x06, 0x56, 0x54, 0xAF, 0x6B, 0x97, 0x5A, + 0x7D, 0x49, 0xB6, 0xDF, 0x06, 0xFC, 0x9F, 0x06, 0x64, 0x89, 0xF5, 0xF4, 0xC4, 0x55, 0x02, 0x19, + 0xAA, 0xC9, 0x1D, 0x8A, 0x5E, 0x3D, 0xA7, 0x13, 0xEC, 0x52, 0x29, 0x8B, 0x6E, 0xC5, 0xA0, 0x62, + 0x9E, 0x89, 0x96, 0xDF, 0x5E, 0x74, 0x69, 0x53, 0x75, 0xCA, 0xF0, 0x95, 0x0E, 0xF8, 0x42, 0xB6, + 0x06, 0x62, 0xDA, 0x92, 0x48, 0xC3, 0x37, 0x50, 0x59, 0xDF, 0x59, 0xAF, 0xAF, 0x0E, 0x2E, 0x84, + 0xE5, 0x2F, 0x3C, 0xC9, 0x7E, 0x2A, 0xE5, 0xA9, 0x41, 0xB1, 0x51, 0x82, 0xC6, 0x42, 0xEC, 0x65, + 0xFD, 0xCB, 0x54, 0x29, 0x33, 0xC2, 0xE5, 0x5E, 0x10, 0xFB, 0x9E, 0x19, 0xE2, 0x75, 0x53, 0x43, + 0x50, 0xD5, 0x10, 0x8E, 0xBC, 0xC6, 0x2A, 0x0A, 0x8D, 0x7F, 0x4A, 0xF6, 0x07, 0x28, 0xA1, 0xEB, + 0x14, 0x1C, 0xD3, 0xE9, 0x63, 0x55, 0xC7, 0xD2, 0xE8, 0xB2, 0x3D, 0x17, 0x84, 0x63, 0xF9, 0x11, + 0xA4, 0x11, 0xE0, 0xA1, 0x83, 0x11, 0x11, 0xD2, 0xA0, 0x8C, 0x61, 0x74, 0x36, 0x63, 0xE9, 0xE8, + 0x98, 0x4C, 0x20, 0x38, 0x1F, 0xA5, 0x15, 0x60, 0x3E, 0x5C, 0x1B, 0xE6, 0xDE, 0xC1, 0x70, 0x7F, + 0xCB, 0x92, 0x76, 0x05, 0xD8, 0x63, 0xDF, 0x01, 0x7E, 0xF2, 0xF1, 0x01, 0xBD, 0xCE, 0x9A, 0x1E, + 0x50, 0x7F, 0xB4, 0xF4, 0x49, 0x5D, 0x7F, 0xCA, 0x86, 0x83, 0x2F, 0x63, 0x33, 0xEF, 0x4F, 0x35, + 0xA1, 0xBF, 0xB6, 0xCD, 0x25, 0xBA, 0x0E, 0xB9, 0xA3, 0x96, 0x41, 0xD4, 0x90, 0xFF, 0xEB, 0xF7, + 0x4F, 0x93, 0xC8, 0xD7, 0x04, 0x62, 0x6E, 0x88, 0xD7, 0x71, 0x0E, 0x0E, 0x37, 0x50, 0xCE, 0xFA, + 0x9B, 0xBD, 0x5B, 0xB0, 0xB7, 0x0F, 0x70, 0x75, 0x0A, 0x5D, 0xFC, 0x69, 0xB3, 0x07, 0x11, 0x9B, + 0xE8, 0x13, 0x0D, 0xBF, 0x08, 0x33, 0x59, 0x20, 0x4A, 0xBD, 0x27, 0x76, 0xED, 0xF2, 0x36, 0x0B, + 0xEA, 0xBC, 0x78, 0x17, 0xBD, 0x6E, 0x4F, 0x37, 0xD3, 0x26, 0x86, 0x85, 0xB1, 0x71, 0xEA, 0x55, + 0x73, 0xAA, 0x7C, 0xA2, 0x36, 0x75, 0xD2, 0xCD, 0xE4, 0xFC, 0xE7, 0xCE, 0x5E, 0xB1, 0xE5, 0xF4, + 0x65, 0xD7, 0x8F, 0x34, 0x07, 0x66, 0xA7, 0x4B, 0xCE, 0x55, 0xB0, 0x71, 0xFD, 0x20, 0x03, 0x5C, + 0xBA, 0x28, 0x0B, 0x71, 0x4D, 0x93, 0xB9, 0x77, 0x5E, 0x46, 0x6A, 0xCB, 0xD7, 0x0A, 0x59, 0x2E, + 0x26, 0x49, 0x0A, 0x36, 0x0F, 0x03, 0x6F, 0x32, 0xD7, 0xF0, 0xEC, 0x53, 0xF6, 0x0B, 0x1E, 0x08, + 0x27, 0x37, 0x69, 0xC5, 0x9F, 0x6C, 0x76, 0x27, 0x4C, 0x7A, 0x7C, 0xB7, 0xC8, 0x1B, 0xC4, 0x79, + 0xA1, 0xE3, 0xE0, 0xF3, 0x3B, 0x20, 0x07, 0x0C, 0xE4, 0xAB, 0x10, 0x6F, 0xA4, 0xFA, 0x7F, 0x08, + 0x6F, 0x5C, 0xAE, 0x06, 0xC5, 0x6D, 0x09, 0x1E, 0x2D, 0xDD, 0x80, 0xA7, 0x7B, 0x9E, 0xE6, 0x44, + 0x79, 0x3D, 0x55, 0x12, 0x51, 0x87, 0x4D, 0x4A, 0x66, 0x32, 0x2D, 0x4E, 0x17, 0x30, 0xAF, 0x77, + 0x7A, 0x8B, 0x44, 0x8D, 0xA4, 0xF8, 0x70, 0xC1, 0x99, 0x55, 0x3D, 0x4B, 0x08, 0x40, 0x2F, 0xA2, + 0xEA, 0xAA, 0x94, 0x24, 0xC3, 0xBD, 0x5C, 0x68, 0x35, 0x8D, 0x71, 0xA8, 0x3E, 0xBA, 0x00, 0x70, + 0x28, 0xB8, 0x10, 0x20, 0x8F, 0x5C, 0xE4, 0xC4, 0xBB, 0x22, 0x59, 0xA2, 0x35, 0x5F, 0x7A, 0x3D, + 0xF1, 0x24, 0x70, 0x1C, 0xE3, 0x3E, 0xED, 0x26, 0x07, 0xD7, 0x82, 0x4B, 0x80, 0x3B, 0x0C, 0xE4, + 0xAB, 0xCF, 0x71, 0x97, 0x87, 0x22, 0x2B, 0x53, 0x27, 0x99, 0x29, 0x10, 0x41, 0x30, 0xE8, 0x28, + 0xD2, 0x48, 0xAC, 0x25, 0x40, 0xBF, 0xDB, 0xED, 0x3A, 0xF4, 0x5D, 0x6E, 0x66, 0x1A, 0x08, 0xFF, + 0xEE, 0x49, 0x36, 0xD7, 0x68, 0x1E, 0xD7, 0xAB, 0xEC, 0xD6, 0x84, 0x1C, 0x8D, 0x35, 0x2D, 0x10, + 0x3C, 0x9C, 0x77, 0x12, 0xB3, 0x09, 0x5F, 0x0B, 0x2A, 0xB3, 0xCF, 0x8E, 0xE0, 0xF1, 0xAA, 0x71, + 0xB1, 0xE3, 0x58, 0x5C, 0xFF, 0xD1, 0x34, 0xE0, 0xBF, 0x20, 0x6D, 0x42, 0x86, 0xCA, 0x97, 0x1B, + 0x76, 0x2F, 0x08, 0x29, 0xEC, 0xD5, 0xDD, 0x04, 0x36, 0xFC, 0xCA, 0x39, 0xBE, 0x28, 0x8C, 0x1F, + 0x0D, 0x56, 0x77, 0xB7, 0xE0, 0x23, 0x41, 0x1E, 0xB4, 0x29, 0x17, 0x7A, 0xAF, 0xF9, 0x30, 0xCF, + 0xF1, 0xFE, 0xF4, 0x62, 0x32, 0xD9, 0xDB, 0x56, 0x9A, 0x2B, 0x31, 0xBF, 0xA5, 0x15, 0x19, 0x1E, + 0xEA, 0xCB, 0x5D, 0x6B, 0x65, 0x9A, 0x06, 0x1F, 0x9C, 0x0E, 0xC0, 0x5D, 0x8C, 0xFB, 0xD5, 0xCF, + 0xA4, 0x18, 0xA1, 0x0C, 0xAD, 0xD3, 0x98, 0x09, 0x3A, 0x86, 0x7F, 0x1C, 0x60, 0xC9, 0xFB, 0x42, + 0xF2, 0x37, 0x4E, 0xF0, 0x91, 0x02, 0x33, 0x41, 0xDE, 0xDB, 0xF8, 0x8E, 0x44, 0x00, 0xC5, 0x94, + 0x21, 0x39, 0x91, 0x0A, 0xB5, 0xC4, 0x44, 0xAC, 0x04, 0xF8, 0xB7, 0xA1, 0x13, 0x70, 0xA7, 0xEF, + 0x23, 0xBD, 0xF6, 0x12, 0x34, 0x30, 0x3A, 0x70, 0x81, 0x21, 0xE7, 0x66, 0xB8, 0x55, 0x00, 0xAF, + 0xC1, 0xC3, 0x56, 0x3D, 0xAB, 0x3D, 0xCA, 0x16, 0x4F, 0x6B, 0x3E, 0x69, 0xEF, 0xF8, 0xCA, 0x7B, + 0x65, 0x1C, 0xF3, 0xD9, 0xE8, 0xB0, 0xF6, 0xF3, 0x18, 0x9E, 0xDF, 0x45, 0xC7, 0xAF, 0xCE, 0xC8, + 0x5E, 0x51, 0x94, 0x76, 0x23, 0x80, 0xF8, 0x49, 0x9B, 0xB9, 0x7C, 0x2F, 0x3C, 0xE6, 0xB5, 0x2F, + 0xAD, 0xCC, 0xE7, 0xE7, 0x1E, 0x08, 0xBF, 0xFA, 0x70, 0x2C, 0xB3, 0xED, 0x0C, 0x29, 0x7D, 0xB0, + 0xBE, 0xE7, 0x91, 0x39, 0x73, 0xC2, 0x80, 0x77, 0x2F, 0x91, 0x1D, 0x2F, 0x45, 0x1E, 0x41, 0xE4, + 0x45, 0x2A, 0x7E, 0x93, 0xCE, 0x6D, 0x65, 0x18, 0x76, 0x61, 0x15, 0x05, 0x24, 0x0E, 0x65, 0xD6, + 0x19, 0x7A, 0xFF, 0x02, 0x94, 0xFB, 0x2D, 0x14, 0xE4, 0xA3, 0x9C, 0xFC, 0x48, 0x29, 0x3A, 0x7F, + 0x36, 0x4F, 0x18, 0xD5, 0x5B, 0x99, 0x4C, 0x97, 0x20, 0x36, 0x77, 0xA6, 0x75, 0xE3, 0x44, 0x92, + 0x47, 0x72, 0xEA, 0x1D, 0x00, 0x5A, 0x1D, 0xAF, 0x12, 0xAC, 0x26, 0xE9, 0x1E, 0x4C, 0x89, 0xCC, + 0x56, 0x01, 0x22, 0x4D, 0x45, 0x44, 0xAC, 0xB6, 0x75, 0xEF, 0x3F, 0x2B, 0x35, 0xC6, 0x06, 0x12, + 0xF6, 0xDB, 0xF1, 0x55, 0xF7, 0x05, 0xB0, 0xC0, 0x16, 0x13, 0x60, 0xAA, 0x01, 0x68, 0x1A, 0xCF, + 0xA3, 0xDE, 0xC2, 0xED, 0x60, 0xB9, 0x38, 0x0A, 0x78, 0x7C, 0x5A, 0x96, 0x70, 0x3E, 0x1E, 0xDC, + 0xCD, 0x80, 0xDE, 0x5B, 0x63, 0x94, 0x01, 0x9D, 0x68, 0x02, 0xB9, 0x64, 0xBC, 0x89, 0xCA, 0xB4, + 0x12, 0xD7, 0x5E, 0x20, 0xC7, 0xBD, 0x39, 0x21, 0xAD, 0x74, 0x3A, 0x04, 0x8F, 0x5F, 0xE2, 0x55, + 0xE2, 0xA4, 0x8F, 0xE0, 0xFB, 0x9D, 0xBD, 0x67, 0xCF, 0xD8, 0x93, 0x6C, 0x84, 0xE7, 0xB6, 0xCE, + 0xBD, 0x7B, 0xDA, 0x93, 0x18, 0x70, 0x6B, 0x48, 0xBA, 0x0E, 0x66, 0x09, 0x2E, 0x91, 0x55, 0x38, + 0x84, 0x02, 0x18, 0x1D, 0x49, 0xDE, 0x25, 0xB3, 0x7E, 0xE8, 0xD0, 0x6E, 0xDD, 0x13, 0x8F, 0xA4, + 0x95, 0x17, 0x01, 0x0D, 0x93, 0xB0, 0xD8, 0xBD, 0x0C, 0xCA, 0x48, 0x62, 0xFA, 0xF5, 0xEA, 0xC5, + 0x71, 0x21, 0x00, 0xEC, 0x3A, 0x88, 0x26, 0xA1, 0x52, 0xBA, 0xBF, 0x2A, 0x70, 0xEB, 0xF7, 0x2B, + 0x43, 0xF4, 0xF6, 0xE3, 0xD0, 0x63, 0x1A, 0xA1, 0x0C, 0x00, 0xFE, 0xF9, 0x12, 0xE1, 0xED, 0x2A, + 0xFD, 0x19, 0x4E, 0x51, 0x22, 0xA0, 0x4C, 0x09, 0x2F, 0x0B, 0x8A, 0x57, 0xFA, 0x3E, 0xF3, 0x02, + 0xE3, 0xF0, 0x8F, 0x17, 0x6E, 0xC1, 0x45, 0x34, 0x95, 0x61, 0x22, 0x9E, 0x72, 0xA9, 0x50, 0x77, + 0x07, 0x64, 0xEE, 0x52, 0x03, 0x10, 0xBA, 0x09, 0xF9, 0x45, 0x29, 0x58, 0x46, 0x24, 0xE7, 0x0F, + 0x21, 0xE0, 0xC8, 0xC8, 0x69, 0xCB, 0x4C, 0xD8, 0x39, 0x0E, 0x0C, 0x24, 0x68, 0x46, 0x1E, 0xD9, + 0x7A, 0x8C, 0xB2, 0x91, 0xF4, 0x1B, 0x96, 0xDE, 0x63, 0xFF, 0xE7, 0xCB, 0x86, 0x9F, 0xCD, 0xFB, + 0xBF, 0x67, 0xBE, 0x46, 0xF7, 0x0E, 0x1F, 0x1D, 0x77, 0x4F, 0x66, 0x4F, 0x4F, 0x09, 0x4E, 0x79, + 0x33, 0x80, 0x66, 0xA5, 0xD0, 0x47, 0xAD, 0x50, 0x3D, 0x45, 0xE5, 0x15, 0xCB, 0x05, 0xA9, 0xC8, + 0xFB, 0x0F, 0x00, 0xB6, 0x9F, 0xF7, 0xC2, 0x1B, 0x15, 0x2B, 0xD1, 0x01, 0xA2, 0x5A, 0xFB, 0x26, + 0x3D, 0x9E, 0xAC, 0x37, 0x2C, 0x0B, 0x3A, 0xD3, 0xE8, 0x99, 0xAF, 0xB0, 0x12, 0x17, 0x06, 0x0C, + 0x7B, 0xF1, 0x6D, 0xB5, 0x8D, 0x18, 0xE4, 0x32, 0x3F, 0x51, 0xC2, 0x20, 0x20, 0xC6, 0x47, 0x22, + 0x08, 0x94, 0x32, 0x99, 0x17, 0x4A, 0x50, 0x36, 0x1E, 0xA2, 0x88, 0xCE, 0x01, 0xAF, 0x78, 0xF5, + 0x6B, 0xF2, 0xA2, 0x0C, 0x8E, 0xC5, 0xE4, 0x31, 0x9C, 0x28, 0xA4, 0x7F, 0x4E, 0x64, 0x1D, 0xF5, + 0xC1, 0x1A, 0x68, 0xE2, 0xF4, 0x3A, 0x99, 0xBC, 0xD3, 0x31, 0xF9, 0xD8, 0x58, 0x7B, 0xB1, 0xB7, + 0x7D, 0x57, 0x2B, 0x7D, 0xAC, 0x4A, 0x43, 0x9E, 0xB2, 0x50, 0x96, 0x06, 0x99, 0x17, 0x89, 0x6A, + 0xA7, 0x2E, 0xC2, 0xB9, 0xA2, 0xBB, 0x96, 0xD4, 0x03, 0xD5, 0xF2, 0xB4, 0xA7, 0x78, 0xE6, 0x65, + 0x31, 0xD2, 0x43, 0x75, 0x4A, 0xD1, 0xB5, 0xE6, 0x07, 0x98, 0x27, 0xAA, 0xBD, 0xCD, 0x32, 0xF1, + 0x80, 0xCE, 0x9E, 0xCD, 0xF2, 0xA1, 0x50, 0xD0, 0x88, 0x02, 0xF0, 0x1C, 0x10, 0x70, 0xAA, 0xA5, + 0xDF, 0x70, 0x32, 0x7E, 0x89, 0xAE, 0x51, 0x37, 0x84, 0x13, 0x18, 0xCE, 0x7D, 0x4C, 0x8A, 0x16, + 0x99, 0xA2, 0x42, 0x9D, 0x5D, 0x9C, 0x81, 0x86, 0x4D, 0x15, 0x96, 0xF0, 0xE6, 0xE1, 0x38, 0x11, + 0xA6, 0x8A, 0x15, 0x14, 0xF7, 0x13, 0xAD, 0x33, 0x81, 0xB5, 0xF4, 0x65, 0x87, 0x87, 0x6F, 0x97, + 0x2F, 0x5D, 0xED, 0xEC, 0xA7, 0xB6, 0x91, 0xE2, 0xF3, 0x7B, 0xE5, 0xC8, 0x7E, 0x3A, 0x26, 0x54, + 0x9C, 0xC3, 0xD3, 0x6C, 0x4B, 0x6A, 0x78, 0x48, 0xF3, 0x0E, 0xCF, 0xBF, 0x9A, 0xC8, 0x60, 0x46, + 0x0B, 0x6C, 0x92, 0x6B, 0x88, 0x6F, 0x42, 0x39, 0xB0, 0xC2, 0x43, 0x8D, 0xA6, 0x4A, 0xF8, 0xF5, + 0x1E, 0x23, 0x74, 0xF7, 0x15, 0xB2, 0x15, 0xEB, 0x5A, 0x2A, 0xCA, 0xA5, 0x2C, 0xCC, 0x3C, 0x7D, + 0x63, 0x65, 0x7F, 0x3A, 0xA8, 0x35, 0xB0, 0x77, 0x54, 0x1A, 0xCB, 0xA5, 0x07, 0x1E, 0x2C, 0x60, + 0x3C, 0x66, 0x32, 0x55, 0x75, 0xEB, 0x57, 0x35, 0xE2, 0xD3, 0xC2, 0x73, 0x5D, 0xF7, 0xC2, 0xB6, + 0xEE, 0x45, 0x1C, 0x19, 0xE6, 0xF9, 0x23, 0x24, 0x23, 0xBA, 0x77, 0x6B, 0x93, 0x73, 0xA0, 0x9C, + 0xF9, 0xF0, 0x59, 0xE7, 0xB4, 0x60, 0xC3, 0xA6, 0x01, 0xEA, 0xC7, 0x52, 0x2B, 0xDC, 0xDC, 0x96, + 0x0F, 0x3C, 0xB0, 0x19, 0x19, 0xE1, 0x52, 0xB6, 0x17, 0x91, 0x2A, 0x4D, 0xC3, 0xFC, 0x44, 0x33, + 0x5F, 0x9D, 0x36, 0x51, 0x3C, 0x02, 0x6D, 0x68, 0x23, 0x64, 0x1B, 0xA0, 0xA3, 0xD7, 0xEA, 0x64, + 0x60, 0xB9, 0xEB, 0xC5, 0x3F, 0xB5, 0x52, 0xC8, 0xC4, 0xC8, 0x73, 0x36, 0x73, 0x28, 0x67, 0xF1, + 0x2A, 0x3C, 0xA6, 0x8A, 0xDB, 0x99, 0x81, 0x90, 0xDF, 0xD7, 0x4C, 0x1F, 0xD1, 0xD9, 0x0D, 0xCE, + 0x6C, 0xD8, 0x8A, 0x03, 0xB4, 0x70, 0x3A, 0x07, 0x2E, 0x2E, 0x5E, 0xA5, 0x5C, 0xBF, 0x51, 0x36, + 0x97, 0x42, 0xA5, 0x76, 0x2A, 0xCA, 0x0A, 0x51, 0x5D, 0x06, 0x78, 0x0E, 0xCF, 0x9E, 0x93, 0x59, + 0x5C, 0x17, 0x05, 0xB6, 0xF2, 0x0D, 0x02, 0xD6, 0x2D, 0x2E, 0x20, 0x62, 0x8D, 0xF7, 0x38, 0xE0, + 0xC1, 0x5E, 0x17, 0x72, 0x4D, 0xA4, 0x2F, 0x5B, 0xDC, 0xC6, 0x40, 0x82, 0x34, 0x04, 0x39, 0x69, + 0xF8, 0xBC, 0xB1, 0x79, 0x54, 0xD5, 0x1E, 0x2D, 0xD8, 0x8C, 0x90, 0x8D, 0xB4, 0xE3, 0x61, 0xB7, + 0x1D, 0xA2, 0x3C, 0xFB, 0x6A, 0x38, 0x98, 0x06, 0xDA, 0x56, 0x2C, 0xBF, 0x9B, 0x14, 0x76, 0xE6, + 0x3C, 0x01, 0x57, 0xCC, 0xC2, 0x08, 0x0C, 0xBC, 0x10, 0x09, 0x67, 0xAB, 0x01, 0x2A, 0x32, 0x6C, + 0x81, 0x2C, 0xAB, 0xD3, 0xEC, 0x7D, 0x87, 0x48, 0x16, 0x28, 0xAC, 0x1D, 0x61, 0x11, 0x31, 0x87, + 0xD6, 0x2B, 0xB0, 0x36, 0xB1, 0x18, 0xDD, 0xE7, 0xD0, 0x46, 0x57, 0x93, 0xFC, 0xDF, 0xD2, 0x3A, + 0x37, 0x49, 0x42, 0xDB, 0xE6, 0x45, 0x46, 0x22, 0xB0, 0xF2, 0x92, 0xEE, 0x52, 0x94, 0x9F, 0xFE, + 0xB1, 0xD2, 0x33, 0x45, 0xAD, 0xC9, 0x6D, 0x11, 0x79, 0x57, 0xF1, 0x80, 0xF4, 0x07, 0xAE, 0xDF, + 0x11, 0x6C, 0x85, 0x58, 0x49, 0x2F, 0x13, 0x81, 0xB9, 0x66, 0x73, 0xAB, 0x84, 0x94, 0x36, 0xC4, + 0xC6, 0x23, 0x5F, 0xC5, 0x36, 0xC6, 0xBE, 0x8E, 0x6B, 0xE9, 0x97, 0xF0, 0xAC, 0xB4, 0xF1, 0x11, + 0x43, 0xB4, 0xD2, 0xC0, 0x79, 0x5E, 0x88, 0x72, 0xC7, 0x46, 0x6B, 0x22, 0xC7, 0xF2, 0x7B, 0x61, + 0xC8, 0xFA, 0x39, 0x65, 0x45, 0x97, 0xF0, 0xC7, 0xCE, 0x74, 0x09, 0x9F, 0x5D, 0xB7, 0x68, 0xF2, + 0x2E, 0x6E, 0x2D, 0x42, 0x56, 0x9C, 0xED, 0xC5, 0x5A, 0x57, 0xD9, 0x53, 0x5A, 0xB4, 0xE8, 0x15, + 0x07, 0x1B, 0xFB, 0x31, 0x40, 0x14, 0x95, 0x77, 0x33, 0x74, 0x71, 0x73, 0x7B, 0xFA, 0xA7, 0xBF, + 0x51, 0xF8, 0x3D, 0xE6, 0xB1, 0xD0, 0x42, 0x25, 0x52, 0xFC, 0x4F, 0x1A, 0xA6, 0x4D, 0xAF, 0xCD, + 0x13, 0x62, 0x7A, 0xBF, 0x22, 0x98, 0xD6, 0x07, 0x9C, 0xAE, 0x5E, 0xFC, 0x96, 0xEC, 0x0E, 0x79, + 0x84, 0x1F, 0x73, 0x60, 0x6C, 0x02, 0x6C, 0xE5, 0xB7, 0xFD, 0x7A, 0x4B, 0x8D, 0x0D, 0xC0, 0xD7, + 0x0A, 0x70, 0x6E, 0xE1, 0x51, 0x0E, 0x8C, 0xAA, 0x02, 0x6A, 0xCF, 0x61, 0x04, 0xBD, 0x53, 0x9D, + 0xE0, 0xB5, 0x28, 0x1E, 0x24, 0xBA, 0x97, 0x13, 0x0C, 0x6E, 0x93, 0x71, 0xE2, 0x68, 0xEC, 0x73, + 0x2C, 0xEC, 0x80, 0xB2, 0x16, 0xD5, 0x38, 0xC6, 0x3B, 0xCE, 0xEB, 0xB9, 0x42, 0xBE, 0x37, 0xB5, + 0x39, 0x31, 0x00, 0x5F, 0xB6, 0xD1, 0xB6, 0xD9, 0x57, 0x34, 0x82, 0x12, 0x07, 0x05, 0x04, 0x4B, + 0x5E, 0xB8, 0xC7, 0x6F, 0xA3, 0x01, 0xB9, 0x1D, 0xFF, 0x5F, 0x52, 0xBF, 0x6E, 0x7B, 0xA8, 0xC3, + 0x6E, 0xAC, 0x00, 0xCD, 0x0A, 0xAB, 0x7D, 0x4E, 0x63, 0x43, 0xCE, 0x10, 0x21, 0x38, 0x42, 0x88, + 0x8D, 0xA7, 0x46, 0x7F, 0x74, 0x1F, 0x1D, 0x5F, 0x25, 0xD2, 0xC0, 0x18, 0x7D, 0x40, 0x61, 0x36, + 0x06, 0xB5, 0x09, 0xCA, 0xC6, 0xAD, 0xD6, 0x9E, 0xED, 0x45, 0xF6, 0x95, 0x32, 0x07, 0x84, 0x71, + 0xC8, 0x35, 0xB0, 0x81, 0x97, 0xC9, 0x60, 0xDE, 0xFD, 0x8E, 0x90, 0x67, 0xD7, 0x23, 0x51, 0x28, + 0x90, 0xA5, 0x6E, 0xB6, 0x59, 0x88, 0xD1, 0x8D, 0xCD, 0x17, 0xA3, 0x48, 0xE3, 0x3F, 0x00, 0x4E, + 0x9B, 0x21, 0xD5, 0xA4, 0x5A, 0xF0, 0xA0, 0xBA, 0x40, 0xB7, 0xBB, 0xE1, 0x3D, 0x16, 0x9E, 0xEE, + 0xBB, 0x9E, 0xB2, 0x91, 0xBD, 0x39, 0x77, 0xD6, 0xB5, 0x9C, 0xB5, 0xE8, 0xCF, 0x7D, 0x8C, 0x83, + 0x82, 0x1A, 0xBA, 0x11, 0xDA, 0xF3, 0x96, 0xDD, 0x09, 0x20, 0x9F, 0xEB, 0xAE, 0x39, 0xAC, 0x7C, + 0xF2, 0x41, 0x98, 0x21, 0x6B, 0x8D, 0x19, 0xFF, 0x36, 0x5E, 0x82, 0xAC, 0xEE, 0x1E, 0x0E, 0x77, + 0x63, 0x14, 0x4E, 0x87, 0xE8, 0x22, 0x01, 0xD4, 0xC4, 0xF3, 0xE6, 0x49, 0xE6, 0x25, 0x64, 0x5C, + 0x54, 0x4B, 0x10, 0xE7, 0xCD, 0x17, 0x8F, 0xFA, 0xA3, 0x4D, 0xCA, 0x49, 0xCA, 0x4D, 0x33, 0xBC, + 0x29, 0x71, 0x4D, 0xF9, 0x0D, 0x74, 0x01, 0xAC, 0x79, 0xA7, 0xD7, 0x75, 0xD3, 0x9B, 0x04, 0xEE, + 0xCB, 0xCD, 0x51, 0xCC, 0xAA, 0x68, 0xFB, 0x41, 0xD3, 0x2D, 0xC1, 0xC8, 0x72, 0xDC, 0x69, 0xBE, + 0x0A, 0x74, 0xFF, 0xA8, 0x0C, 0xB4, 0xE1, 0x1A, 0xD3, 0x30, 0x21, 0xA9, 0x34, 0xCC, 0xB5, 0xE9, + 0xCF, 0x38, 0x48, 0x3B, 0xFC, 0xD6, 0x88, 0xD8, 0xB7, 0x3D, 0x71, 0xE4, 0x36, 0xA2, 0xE6, 0x03, + 0x02, 0xE3, 0xFB, 0x68, 0x0F, 0x07, 0x3B, 0x80, 0x30, 0x1C, 0xF4, 0x88, 0x0D, 0x86, 0x1F, 0x83, + 0x4D, 0x93, 0xD4, 0x10, 0xB1, 0xFF, 0x2C, 0xCB, 0xBE, 0x8E, 0xA8, 0xDB, 0x09, 0xE5, 0xF7, 0x9C, + 0x82, 0x48, 0xE0, 0xC8, 0x2C, 0x7B, 0xA1, 0x46, 0x89, 0xE9, 0x0D, 0x82, 0x6F, 0xC1, 0xEA, 0xA5, + 0x84, 0x82, 0x33, 0x26, 0x4A, 0xB6, 0x84, 0x60, 0x21, 0x00, 0x89, 0x20, 0x84, 0x14, 0x7A, 0xDF, + 0x7B, 0xEB, 0x45, 0x6B, 0x76, 0xE6, 0xDB, 0x53, 0xBE, 0x6A, 0x95, 0xE1, 0xFE, 0x6A, 0x79, 0x07, + 0xBC, 0x9D, 0xB3, 0x37, 0x67, 0xAF, 0xC2, 0x1E, 0x2B, 0xFF, 0x9F, 0xC5, 0xF5, 0x54, 0xE0, 0x29, + 0x44, 0xA4, 0x2A, 0x6F, 0xB7, 0x52, 0x17, 0x2C, 0xB1, 0x72, 0x6E, 0x9F, 0x30, 0x9D, 0x42, 0x41, + 0xF6, 0xD5, 0x14, 0x3E, 0x32, 0x59, 0x42, 0xAD, 0x7A, 0x68, 0x53, 0xF9, 0x99, 0xFD, 0x30, 0xC0, + 0x68, 0xB6, 0x97, 0xD9, 0x1B, 0x9A, 0xF6, 0xB9, 0x06, 0xE2, 0x2E, 0x27, 0x60, 0xE9, 0x1A, 0xBD, + 0x88, 0xCD, 0xAD, 0xE0, 0xCB, 0xED, 0x76, 0x2B, 0x46, 0x24, 0xB0, 0x48, 0xBA, 0x55, 0x9B, 0xBD, + 0x6D, 0xF2, 0xF7, 0x8C, 0x59, 0x4E, 0xB6, 0xE4, 0x89, 0xE1, 0xD4, 0x97, 0x85, 0x15, 0x27, 0xAE, + 0xD0, 0x9A, 0x72, 0x98, 0xB0, 0x6F, 0x06, 0xB9, 0xFC, 0xFD, 0x0D, 0x51, 0x11, 0x7E, 0x02, 0x66, + 0xD2, 0xE7, 0x25, 0xD4, 0x4D, 0xAE, 0x78, 0x9F, 0x8E, 0x69, 0xDD, 0x43, 0x80, 0x2F, 0xE6, 0x6E, + 0x46, 0xD7, 0x1A, 0x05, 0x8F, 0x4B, 0x5E, 0xF7, 0x4E, 0x09, 0x9B, 0xAF, 0x4E, 0x2B, 0x14, 0x91, + 0x59, 0x67, 0xFF, 0xFF, 0xAA, 0x08, 0xE7, 0x25, 0x42, 0x4E, 0x17, 0xD6, 0xDF, 0xD8, 0x23, 0x45, + 0xB4, 0xE2, 0x15, 0xE8, 0xDB, 0xA8, 0x55, 0x81, 0x9B, 0xE3, 0x3F, 0x09, 0x0C, 0x16, 0x19, 0xE6, + 0xE3, 0x7F, 0x1D, 0xB6, 0xBB, 0x14, 0x3C, 0x58, 0xBB, 0x69, 0x5F, 0x7A, 0x1A, 0x51, 0x45, 0xEE, + 0xDB, 0xA5, 0x7F, 0x53, 0x27, 0x04, 0xA0, 0x60, 0x76, 0x7A, 0xAD, 0x29, 0x7A, 0x8B, 0x49, 0x4C, + 0x6D, 0x26, 0x01, 0x45, 0x9B, 0x2F, 0xC8, 0x6B, 0xE0, 0x11, 0x1E, 0xCE, 0x35, 0x18, 0xDA, 0x6A, + 0x7E, 0x14, 0x56, 0xFB, 0x19, 0xE2, 0xBC, 0xAF, 0xE9, 0x62, 0xF9, 0xD4, 0xB7, 0x21, 0x1D, 0x45, + 0x10, 0xB7, 0xF3, 0x10, 0x80, 0xD0, 0xA9, 0x20, 0x12, 0xFB, 0xFA, 0xB9, 0xF6, 0x9B, 0x32, 0xA9, + 0x68, 0x58, 0xD9, 0x97, 0xDD, 0x4D, 0xDB, 0x67, 0x95, 0x35, 0xFE, 0xFA, 0x9A, 0xB2, 0x8D, 0x39, + 0x32, 0xD0, 0x5F, 0x6E, 0x74, 0x62, 0x3F, 0xC0, 0xC9, 0x24, 0x49, 0xC9, 0x65, 0x27, 0x88, 0x52, + 0x60, 0xBB, 0x6B, 0x52, 0xAC, 0x35, 0x90, 0x47, 0xF8, 0x34, 0xF4, 0x8E, 0x9E, 0x43, 0xE6, 0x28, + 0xA5, 0x04, 0xA9, 0x10, 0x09, 0x4F, 0xE0, 0x2E, 0x3E, 0x12, 0xD9, 0xC3, 0xC3, 0xF0, 0xAB, 0x30, + 0x18, 0x13, 0x6C, 0x17, 0x06, 0x2C, 0x03, 0x60, 0x04, 0x5D, 0x0E, 0xC8, 0x7F, 0x80, 0x4B, 0xAD, + 0xAF, 0x34, 0x2B, 0xDC, 0x94, 0x1F, 0x68, 0x0A, 0xAB, 0xA3, 0xD7, 0x19, 0x23, 0x02, 0x8F, 0xBD, + 0xB9, 0x33, 0xD3, 0x93, 0x66, 0xC9, 0x19, 0x18, 0xEF, 0x08, 0x0C, 0xEE, 0xDB, 0xB3, 0x5E, 0x55, + 0xB2, 0xDC, 0xBB, 0x90, 0x02, 0x2B, 0x90, 0x67, 0x41, 0x3E, 0x65, 0xA0, 0x9B, 0xC4, 0x5D, 0x81, + 0xDC, 0x64, 0x82, 0xA9, 0x86, 0xA7, 0xB1, 0x1C, 0x6C, 0x7B, 0xA2, 0x07, 0xF1, 0xE0, 0x8E, 0x4F, + 0xBF, 0x07, 0x20, 0x48, 0x05, 0xE5, 0x1D, 0xB6, 0xD8, 0x83, 0x45, 0x7C, 0xAD, 0x84, 0x32, 0x94, + 0xCA, 0x88, 0x96, 0xAA, 0x07, 0xE8, 0x7B, 0x0A, 0x89, 0x46, 0x98, 0x2F, 0x93, 0x65, 0xEB, 0x7B, + 0x79, 0x50, 0x8C, 0x8D, 0x01, 0x6D, 0xCE, 0xB4, 0x5E, 0x1E, 0x74, 0x6D, 0xC3, 0x29, 0x0B, 0x34, + 0xB6, 0xB8, 0xE7, 0x9C, 0x2D, 0x71, 0x49, 0x65, 0x07, 0x1A, 0x7D, 0x04, 0x74, 0x42, 0xD7, 0x0D, + 0x96, 0x80, 0x85, 0xFC, 0x5D, 0x29, 0x79, 0x54, 0x8F, 0x08, 0x2A, 0x7F, 0xF2, 0xB8, 0x87, 0x13, + 0x29, 0x6E, 0xC4, 0xB7, 0x99, 0xBB, 0xC5, 0x6C, 0x4D, 0x01, 0x38, 0xB5, 0xFF, 0x93, 0xEC, 0x0F, + 0x96, 0xA5, 0x47, 0x78, 0xD1, 0xC0, 0x63, 0x61, 0xE0, 0x2D, 0xE4, 0x56, 0x7C, 0xAC, 0x77, 0x30, + 0x21, 0x55, 0x32, 0xFD, 0x4E, 0xC0, 0x31, 0x9B, 0x7C, 0x37, 0x04, 0x8B, 0xAB, 0x95, 0x03, 0xAC, + 0x22, 0x9E, 0x1F, 0x86, 0x2A, 0xB5, 0xD9, 0x32, 0x56, 0xCC, 0x4E, 0xE5, 0x1A, 0x70, 0x65, 0x5B, + 0x32, 0xC7, 0x1D, 0x96, 0x73, 0x62, 0x49, 0xB3, 0xC5, 0xA1, 0x83, 0xEB, 0x32, 0x6B, 0x6E, 0x17, + 0xC2, 0xD2, 0xBA, 0x90, 0x3B, 0xB5, 0x99, 0x18, 0x34, 0x4D, 0x15, 0x57, 0x19, 0xCD, 0x3C, 0xE1, + 0xCF, 0x55, 0x4A, 0x44, 0xD0, 0xFD, 0xD1, 0x29, 0xB5, 0x86, 0xA1, 0xAA, 0xB0, 0x6C, 0x30, 0xEE, + 0x14, 0xC2, 0x9E, 0x02, 0x31, 0xDF, 0x13, 0x0D, 0xC6, 0xFA, 0x9F, 0xC1, 0x17, 0xF1, 0x52, 0x08, + 0x8B, 0xBB, 0x81, 0xB8, 0x92, 0x7B, 0x19, 0x0F, 0x5E, 0x7A, 0xDF, 0xEB, 0x86, 0x8C, 0x5F, 0x6C, + 0x7A, 0xE9, 0xF1, 0x26, 0x55, 0x80, 0xFF, 0xBC, 0x6A, 0x0A, 0xBC, 0x23, 0xAB, 0xE8, 0x8E, 0xC3, + 0xA5, 0xD7, 0xFD, 0x52, 0x73, 0x68, 0x4B, 0x56, 0x7F, 0x60, 0x4A, 0x68, 0x84, 0x30, 0xE1, 0x1F, + 0x0C, 0x10, 0x41, 0x71, 0xFC, 0x10, 0xDF, 0x62, 0xCC, 0x4D, 0xD6, 0x2A, 0x7F, 0xB9, 0xAF, 0x46, + 0x94, 0x3A, 0xD7, 0x0F, 0x12, 0x2C, 0xB8, 0x17, 0x1F, 0x56, 0xF3, 0xCD, 0xA0, 0xE7, 0xBF, 0xA4, + 0xFB, 0xC5, 0xE8, 0x17, 0x4B, 0x8A, 0xE5, 0x3E, 0x96, 0x22, 0x17, 0x07, 0xA3, 0x17, 0x0A, 0x77, + 0x98, 0xF8, 0x9B, 0x59, 0x5C, 0x2F, 0xC9, 0x73, 0xA4, 0x5A, 0x17, 0x1F, 0xBD, 0x56, 0x3E, 0xA2, + 0xE6, 0x8F, 0x34, 0xF2, 0xE0, 0x20, 0x37, 0xE4, 0x98, 0xE1, 0xEC, 0xC4, 0x1E, 0x81, 0x13, 0x17, + 0x21, 0x95, 0x88, 0x60, 0x04, 0xDA, 0x91, 0xB9, 0x22, 0xF8, 0x64, 0x87, 0x8D, 0x32, 0x60, 0x37, + 0x33, 0x2E, 0x2B, 0x95, 0x43, 0x0C, 0x10, 0xDF, 0xFC, 0x64, 0x56, 0x89, 0x32, 0x47, 0xA3, 0x8F, + 0xF1, 0x3E, 0x34, 0x63, 0x35, 0xD9, 0x41, 0xD8, 0x1A, 0x23, 0x88, 0x39, 0x6D, 0x23, 0x2A, 0x20, + 0xCE, 0xFB, 0x80, 0x0F, 0x59, 0xB7, 0xFB, 0x1E, 0x24, 0xF5, 0x8A, 0x78, 0x2B, 0xE8, 0x13, 0x52, + 0x34, 0x5B, 0x65, 0x64, 0xAB, 0x78, 0x4D, 0x5C, 0x79, 0x3B, 0xF2, 0x7D, 0x1F, 0x5B, 0xA9, 0x37, + 0xAE, 0x4C, 0x9E, 0x30, 0x6B, 0x39, 0x3D, 0x75, 0x06, 0xCE, 0xFE, 0x87, 0xB7, 0x1B, 0x9C, 0x9F, + 0x44, 0x7E, 0x98, 0xFF, 0x3B, 0xA6, 0x71, 0x48, 0xE3, 0x07, 0x8C, 0x5E, 0x95, 0x96, 0x04, 0xC1, + 0xBF, 0x7A, 0x18, 0x06, 0xC2, 0xD2, 0x24, 0xD6, 0xC9, 0x4D, 0x65, 0xCE, 0x18, 0x8F, 0x8B, 0x0D, + 0xFC, 0x66, 0x40, 0xB1, 0xE6, 0xE5, 0xC5, 0xDE, 0xAE, 0x2E, 0x84, 0x3F, 0xBA, 0x16, 0x5A, 0x63, + 0x72, 0x0F, 0x3C, 0x82, 0x4A, 0xD7, 0x54, 0x54, 0x60, 0x1B, 0x6A, 0x16, 0x2D, 0xDA, 0x0F, 0xF9, + 0x61, 0xD2, 0x53, 0x2B, 0xE4, 0x22, 0x0E, 0x1D, 0x08, 0x69, 0x5D, 0x4D, 0x4D, 0x3E, 0x99, 0xBE, + 0x8A, 0x83, 0xA2, 0x5A, 0x68, 0x8B, 0xBB, 0x6A, 0xA5, 0x31, 0xB9, 0x65, 0xA6, 0x55, 0xD1, 0x09, + 0x8D, 0x6B, 0xAB, 0xD8, 0xF1, 0x06, 0x62, 0xA8, 0x1A, 0xDA, 0xA4, 0x4B, 0x68, 0xA9, 0xB8, 0xA5, + 0x9D, 0xD1, 0xAA, 0x42, 0x8E, 0x67, 0xA8, 0xC6, 0x29, 0x94, 0x69, 0x38, 0xA0, 0x66, 0x84, 0xBB, + 0x73, 0x3B, 0xFC, 0x7D, 0x6B, 0xCD, 0x39, 0x8F, 0x1C, 0x6C, 0xE0, 0x58, 0x97, 0x75, 0xB7, 0x09, + 0x40, 0x68, 0x45, 0xCD, 0x97, 0x78, 0x1A, 0x81, 0xA9, 0x6D, 0x6C, 0x59, 0xB8, 0x0C, 0x7D, 0x94, + 0x46, 0x23, 0xCC, 0xD4, 0x2D, 0x71, 0x95, 0x7F, 0x9F, 0x08, 0xE0, 0xE5, 0xF9, 0xC0, 0x2C, 0xC4, + 0x09, 0x27, 0x7C, 0x62, 0x5E, 0xF4, 0xB6, 0xAA, 0x9D, 0x18, 0x10, 0xCE, 0xCB, 0xCA, 0xFC, 0xC2, + 0x12, 0x5A, 0xC2, 0xC7, 0xFA, 0x47, 0x3B, 0x4A, 0x5C, 0xC7, 0x52, 0xCA, 0x97, 0xD4, 0xC3, 0x90, + 0x1D, 0x04, 0x50, 0x92, 0xFF, 0xCC, 0xA9, 0x85, 0x4D, 0x1F, 0x73, 0xE3, 0x5B, 0x4D, 0x20, 0xCA, + 0x46, 0x89, 0xD5, 0x26, 0x2B, 0xF5, 0x6B, 0x2A, 0x0B, 0x9C, 0x36, 0x15, 0x9A, 0xB2, 0x15, 0xC1, + 0xAF, 0x38, 0x3D, 0xA5, 0x4B, 0x47, 0x56, 0x32, 0x90, 0x60, 0x93, 0x5D, 0x8C, 0xE4, 0x3D, 0x3A, + 0x00, 0xB2, 0x84, 0x92, 0xE7, 0x9C, 0x09, 0xD4, 0x55, 0x01, 0xFC, 0xFC, 0x3C, 0x0B, 0x6B, 0x0B, + 0xD4, 0x39, 0x7B, 0x88, 0x40, 0x08, 0xDE, 0x2D, 0xFC, 0x9E, 0xEF, 0xFE, 0xCA, 0x45, 0xB6, 0x8F, + 0xDD, 0x59, 0x49, 0x16, 0x9B, 0x26, 0x88, 0x7F, 0x83, 0xA0, 0x29, 0x14, 0xA6, 0x96, 0x51, 0x1D, + 0x36, 0xCF, 0x7D, 0x01, 0x2E, 0xC3, 0xC5, 0xC2, 0x49, 0xAB, 0x70, 0xAC, 0x66, 0x08, 0xA4, 0xB7, + 0xB5, 0x37, 0x34, 0xEB, 0xD1, 0xA1, 0x52, 0xB1, 0xF8, 0x1C, 0x88, 0x36, 0x32, 0x00, 0xA4, 0x5B, + 0x3B, 0x93, 0x34, 0x20, 0x5F, 0xA9, 0x9B, 0x1E, 0xA6, 0xF9, 0xFC, 0xC5, 0x34, 0x2E, 0x64, 0xCE, + 0x97, 0x44, 0x71, 0x0D, 0x09, 0x89, 0xF2, 0x68, 0x41, 0xF9, 0x64, 0xA0, 0xFC, 0xE2, 0x43, 0x14, + 0x77, 0xB1, 0x68, 0x2C, 0xE6, 0xCB, 0xD4, 0x82, 0xE0, 0xF1, 0x93, 0x00, 0x50, 0x9F, 0x14, 0x6F, + 0x78, 0xDC, 0x7B, 0xC2, 0xD6, 0x31, 0x29, 0x85, 0xA6, 0xEB, 0x50, 0xEC, 0xA6, 0xDD, 0xAA, 0x50, + 0x65, 0x94, 0xEE, 0x68, 0xC3, 0x11, 0xAA, 0xB7, 0xA7, 0xEE, 0xBB, 0x39, 0x08, 0xA6, 0xE8, 0xC5, + 0x4E, 0x52, 0x84, 0xDD, 0xE6, 0x16, 0xF5, 0xC3, 0xAC, 0xB0, 0xBE, 0x3F, 0xA0, 0xC9, 0x1F, 0x17, + 0xC0, 0x8D, 0x7C, 0x80, 0x27, 0xAE, 0xBB, 0x47, 0x32, 0x94, 0x01, 0xCB, 0x72, 0x12, 0xCB, 0x74, + 0x56, 0x58, 0x17, 0x30, 0x57, 0x6C, 0x94, 0x08, 0xD4, 0x60, 0x50, 0x41, 0x35, 0xAB, 0xBD, 0x0B, + 0xA7, 0x43, 0x1B, 0x53, 0x19, 0xBA, 0x05, 0x67, 0xAF, 0x4C, 0xAD, 0x76, 0xBA, 0x7D, 0x75, 0x8E, + 0x64, 0x0C, 0xDD, 0xFB, 0xD9, 0x84, 0x3F, 0xB0, 0x57, 0x4D, 0x8C, 0xA0, 0x0F, 0xD9, 0xE0, 0x53, + 0xB9, 0x1D, 0xAE, 0xE1, 0xCC, 0x9E, 0xD5, 0x79, 0xDA, 0xB4, 0x0C, 0x0B, 0xDD, 0x95, 0x28, 0xDD, + 0x7F, 0x73, 0x43, 0x83, 0xC5, 0x45, 0x14, 0x00, 0xBA, 0x00, 0x9C, 0xC0, 0xC8, 0x62, 0x34, 0x66, + 0xF9, 0x78, 0x57, 0x0B, 0x9F, 0x85, 0xEE, 0x49, 0xF6, 0xA9, 0x86, 0x05, 0x6B, 0x0E, 0x1F, 0x26, + 0xD0, 0xD9, 0xEB, 0xA8, 0x5B, 0x9B, 0xCD, 0x4E, 0x25, 0x07, 0xE1, 0xE0, 0x60, 0xA0, 0xFB, 0x17, + 0x7C, 0x41, 0xAA, 0x20, 0xFE, 0x83, 0x25, 0x3A, 0x9A, 0x02, 0x87, 0x0A, 0x71, 0x87, 0xE5, 0xD3, + 0xC1, 0xDC, 0x85, 0xC8, 0xFA, 0x71, 0x2A, 0xCF, 0xA1, 0xF7, 0x44, 0x13, 0x9C, 0x03, 0x56, 0xC3, + 0x7A, 0xEE, 0x51, 0x35, 0x3C, 0x27, 0x30, 0xF3, 0x3E, 0x31, 0x5F, 0x00, 0x51, 0xA7, 0x1C, 0x92, + 0xA4, 0xE1, 0xC3, 0x43, 0x12, 0x03, 0x3C, 0xEE, 0xD3, 0xFA, 0x1C, 0x6A, 0x0F, 0xE0, 0x45, 0xBB, + 0x3B, 0x81, 0xF1, 0x37, 0x46, 0x9C, 0x6E, 0x21, 0x74, 0xFA, 0x93, 0x52, 0xF4, 0x57, 0x95, 0x81, + 0xD3, 0x57, 0x44, 0x5E, 0xF0, 0x54, 0x18, 0x3C, 0xFB, 0x3A, 0xE7, 0x10, 0x67, 0xF2, 0x20, 0x24, + 0x09, 0xD2, 0x6D, 0xAB, 0xC2, 0xBA, 0x3C, 0x30, 0xE9, 0x65, 0xF1, 0x50, 0xFB, 0x11, 0xB6, 0xCF, + 0x85, 0x7B, 0x6A, 0x4A, 0x56, 0x59, 0x59, 0xB7, 0xDE, 0xFB, 0xC8, 0x39, 0x6A, 0x52, 0x6D, 0xE6, + 0xB7, 0xC7, 0x7A, 0x62, 0x01, 0x25, 0x3D, 0x54, 0x54, 0xB4, 0xF2, 0xBA, 0xF9, 0xEE, 0xE3, 0x59, + 0xD0, 0x74, 0xB5, 0xBF, 0xDF, 0x3E, 0x3F, 0x87, 0x64, 0x82, 0xD9, 0xD5, 0xF9, 0xE8, 0xBB, 0xC5, + 0xA5, 0x61, 0x91, 0x9C, 0x2C, 0x99, 0xC0, 0x39, 0xB3, 0xEF, 0x33, 0x5E, 0x3E, 0x1E, 0x00, 0xC6, + 0x5A, 0x90, 0x1C, 0x50, 0x43, 0x3D, 0x4B, 0xA1, 0x3F, 0x46, 0xEB, 0xBA, 0x86, 0xA4, 0xEA, 0xE1, + 0xA9, 0x40, 0x97, 0x5A, 0x80, 0x97, 0x36, 0x1C, 0xA8, 0x19, 0x4E, 0x0D, 0xF8, 0xCB, 0x1C, 0xC7, + 0xD4, 0x1C, 0xB1, 0x4C, 0x2E, 0xDB, 0x2D, 0x96, 0x1E, 0xBA, 0xEB, 0x3D, 0xDE, 0x7D, 0xC7, 0x2E, + 0xF8, 0x36, 0x54, 0x5C, 0x94, 0xD0, 0x5A, 0x0E, 0x5D, 0xF6, 0x4D, 0x35, 0xD2, 0xC1, 0x52, 0xC7, + 0x3B, 0x58, 0x43, 0xEB, 0xB6, 0x54, 0xBA, 0xA5, 0xF1, 0x86, 0xDB, 0x23, 0xAB, 0x6A, 0x42, 0x00, + 0x90, 0xD2, 0x0C, 0x76, 0x32, 0xA0, 0xC2, 0xE3, 0x10, 0x0E, 0x0C, 0x8A, 0x7C, 0xA5, 0x5F, 0xC9, + 0x4E, 0x79, 0x6E, 0x38, 0x0D, 0xA1, 0xD8, 0x7E, 0x90, 0xDD, 0xA4, 0x35, 0x33, 0xBF, 0xCE, 0x69, + 0x8F, 0x93, 0xBC, 0xB4, 0xC8, 0xD2, 0xD1, 0xD8, 0x2F, 0x31, 0xF8, 0x0B, 0x12, 0x8B, 0xA2, 0xAA, + 0x7B, 0x36, 0x5F, 0x66, 0x0D, 0xF6, 0x34, 0x0F, 0xA7, 0x6A, 0xF3, 0x52, 0x4A, 0xB3, 0xCE, 0x83, + 0xB5, 0x57, 0x11, 0x74, 0xBF, 0x1D, 0x5E, 0xA4, 0x18, 0x84, 0xC6, 0xE4, 0xAC, 0x42, 0x93, 0x82, + 0x99, 0xF1, 0x4B, 0xE2, 0x07, 0x0E, 0x0C, 0xAD, 0xC4, 0x7E, 0x24, 0xC7, 0xF9, 0x22, 0x34, 0x31, + 0x0B, 0xC9, 0xBF, 0xA8, 0x74, 0xE9, 0xDE, 0xE8, 0x61, 0xDC, 0xC2, 0x49, 0x95, 0x78, 0x6F, 0x2D, + 0x46, 0x76, 0xD8, 0x2F, 0xA9, 0x56, 0x00, 0x38, 0x74, 0x54, 0xBB, 0x66, 0xE5, 0x9B, 0xA1, 0xAB, + 0xE4, 0x1E, 0x46, 0x71, 0x90, 0xC1, 0xF8, 0x16, 0x8A, 0x8F, 0x76, 0xE6, 0x4F, 0x06, 0xE8, 0xE8, + 0xAA, 0x25, 0xF2, 0x75, 0x3A, 0x0D, 0xBD, 0xF6, 0x40, 0xEE, 0x64, 0xE0, 0xF4, 0xD5, 0xBB, 0x76, + 0x7A, 0x8B, 0x43, 0xD8, 0x75, 0xD3, 0xAF, 0x1A, 0xE7, 0x59, 0x5E, 0x8E, 0xC8, 0xE4, 0xD9, 0x7C, + 0x3E, 0x02, 0x4D, 0xBE, 0x00, 0xD9, 0x6F, 0x46, 0xF1, 0x4A, 0x5B, 0x33, 0x97, 0x6E, 0x54, 0x5A, + 0x3A, 0x41, 0x6F, 0xC0, 0xB7, 0x3E, 0x78, 0xE5, 0xCF, 0x75, 0x1C, 0xEE, 0xD8, 0xA1, 0xEE, 0xD0, + 0x37, 0x94, 0xFE, 0x63, 0x1B, 0x2F, 0x63, 0x7A, 0xFE, 0x22, 0xCD, 0x32, 0xE1, 0xB6, 0xF8, 0x21, + 0x33, 0xDA, 0xCE, 0xB4, 0x91, 0x25, 0x21, 0x67, 0xA2, 0x6D, 0x5D, 0x49, 0xBD, 0x77, 0x92, 0x60, + 0xA3, 0x56, 0xBF, 0x1E, 0x1B, 0xF8, 0xE9, 0x40, 0xC5, 0xBF, 0x06, 0xFC, 0x14, 0xBC, 0xBC, 0x62, + 0xC0, 0xCB, 0x8D, 0x67, 0x7E, 0xDD, 0xB9, 0xCE, 0x66, 0xE2, 0x52, 0xC1, 0x21, 0x68, 0x93, 0xB4, + 0x6F, 0xFC, 0x81, 0x1F, 0x41, 0xD7, 0x7F, 0x10, 0xCF, 0x35, 0x9B, 0x72, 0xC6, 0xBC, 0x05, 0x5D, + 0x7D, 0x63, 0x09, 0xB4, 0xA8, 0x62, 0xAA, 0x42, 0x51, 0xC1, 0xC0, 0xF0, 0x2D, 0xE2, 0xBE, 0x6D, + 0x54, 0x53, 0x55, 0x7B, 0x39, 0x0A, 0xB0, 0x2A, 0xE0, 0x45, 0x0A, 0xEF, 0xD7, 0x7E, 0xB9, 0xAF, + 0xB9, 0xDA, 0x22, 0x5D, 0x65, 0xD5, 0x39, 0x0F, 0xE4, 0x2B, 0x8E, 0xAA, 0x79, 0xC9, 0xFB, 0xF0, + 0x00, 0x51, 0xE6, 0x59, 0x3F, 0x12, 0x54, 0x4A, 0x29, 0x23, 0xD3, 0x6A, 0x9F, 0xB9, 0x0D, 0x99, + 0x1E, 0x8A, 0xF6, 0x55, 0xD3, 0xDC, 0x8A, 0x48, 0xC3, 0xE5, 0x16, 0xDA, 0xFF, 0xB0, 0x3B, 0x92, + 0x49, 0xD6, 0x00, 0xB1, 0x13, 0x8E, 0xC2, 0x3F, 0x7C, 0xF9, 0x48, 0x55, 0xD5, 0xAC, 0xEA, 0x8A, + 0xC1, 0x5C, 0xA9, 0x48, 0xEA, 0x71, 0xDA, 0x99, 0xE9, 0x49, 0xBA, 0xD8, 0x1F, 0xF2, 0xB2, 0x51, + 0x5D, 0x13, 0xC7, 0x6A, 0x82, 0x8E, 0x64, 0x3A, 0x11, 0x56, 0x66, 0x24, 0x2D, 0xC1, 0x7D, 0x3A, + 0xB2, 0x45, 0xB6, 0xAE, 0x10, 0x8F, 0xBD, 0xD6, 0x9F, 0xAB, 0x44, 0xA7, 0x4A, 0x5D, 0x92, 0x7D, + 0x8F, 0xE5, 0x59, 0x4A, 0x10, 0x85, 0xFD, 0x3C, 0x40, 0x3B, 0xBF, 0xDF, 0xA7, 0x3A, 0x1D, 0xB5, + 0x67, 0x23, 0xF9, 0xAC, 0x59, 0x31, 0x2F, 0xD9, 0xD6, 0xF5, 0xEA, 0xD1, 0xDE, 0xAE, 0xFA, 0x44, + 0xFD, 0xE0, 0xBE, 0xE3, 0xF7, 0xEA, 0xD5, 0xF0, 0x26, 0x41, 0xE5, 0x3D, 0xBE, 0xAA, 0xFC, 0x57, + 0x49, 0xAE, 0x3E, 0x70, 0x8F, 0x9D, 0xF1, 0xB6, 0x32, 0x7D, 0xE7, 0x21, 0x4A, 0x7E, 0x99, 0xD7, + 0x90, 0xFE, 0xC5, 0xB2, 0xE8, 0xAC, 0x6D, 0xF7, 0x3C, 0xD3, 0x1E, 0x61, 0xF4, 0xFF, 0x8C, 0x13, + 0x5A, 0x7F, 0x87, 0x66, 0x47, 0x84, 0xF8, 0x3B, 0x0B, 0x70, 0xCF, 0xBA, 0x0C, 0x87, 0x93, 0x62, + 0x65, 0x1E, 0x47, 0xFC, 0x96, 0x25, 0x46, 0x01, 0xE0, 0xCE, 0xE2, 0x41, 0xC6, 0x38, 0x90, 0x0D, + 0xE3, 0xC7, 0x60, 0x4E, 0x08, 0x0F, 0x02, 0xF5, 0xB8, 0x70, 0x27, 0x89, 0x29, 0x6E, 0x79, 0x85, + 0x12, 0xA4, 0xCA, 0x6C, 0x69, 0xBE, 0x52, 0xFF, 0xBD, 0xCF, 0x3E, 0x07, 0xA8, 0x7B, 0x00, 0x44, + 0xE0, 0x3B, 0xA6, 0x50, 0xFF, 0xF9, 0xDA, 0x0D, 0xEB, 0xCC, 0x70, 0x21, 0x20, 0x5F, 0xF4, 0xAF, + 0x1B, 0x2C, 0xF8, 0x63, 0x9C, 0xB9, 0x8F, 0x0B, 0xBF, 0x1C, 0xA5, 0x85, 0xA6, 0x9A, 0x0A, 0x93, + 0x1E, 0x8B, 0xA3, 0x80, 0x63, 0x30, 0x24, 0xE1, 0xF0, 0xB6, 0x7B, 0x93, 0xC5, 0x72, 0xE9, 0x49, + 0x91, 0x1D, 0xB0, 0x77, 0xC0, 0xA2, 0x1D, 0xC9, 0x66, 0x90, 0xF7, 0x58, 0x92, 0x87, 0x4F, 0xB0, + 0x0D, 0x0A, 0x48, 0x16, 0x5F, 0x7D, 0xF4, 0xA6, 0xC9, 0x80, 0xD2, 0x38, 0xD6, 0xC7, 0xEE, 0x73, + 0xA6, 0xA8, 0x57, 0xC9, 0xAA, 0x32, 0x6A, 0x3C, 0xA7, 0x9F, 0x89, 0x79, 0x8B, 0xD9, 0x6B, 0x8C, + 0xB1, 0x26, 0x5D, 0x4B, 0xE9, 0xF0, 0x9D, 0xFA, 0xC0, 0xD3, 0xEA, 0x82, 0xDA, 0x7C, 0xCB, 0x43, + 0x90, 0x74, 0x24, 0xC6, 0xBD, 0x5B, 0x87, 0x29, 0xCA, 0xEC, 0x6E, 0xBA, 0x7C, 0x41, 0xF9, 0x99, + 0x0A, 0x92, 0xFA, 0x43, 0xAE, 0xE7, 0xF9, 0xFB, 0x55, 0x5B, 0x3A, 0xCC, 0x1C, 0xC5, 0x20, 0x37, + 0x53, 0x4A, 0x83, 0xC6, 0x79, 0x5A, 0x42, 0xF9, 0x23, 0x62, 0xA1, 0x3A, 0x42, 0xCE, 0x51, 0xC5, + 0x5D, 0xC9, 0x99, 0x1F, 0x82, 0xE7, 0x43, 0x72, 0x46, 0x70, 0x80, 0x25, 0x65, 0x98, 0x78, 0xC2, + 0xF9, 0xD4, 0x07, 0x2D, 0xAB, 0x79, 0x7D, 0x45, 0xC3, 0x0B, 0xEE, 0x18, 0xBB, 0x3C, 0x33, 0xE5, + 0x8B, 0xE5, 0x2A, 0x04, 0x53, 0x7C, 0x92, 0x92, 0x3E, 0x77, 0xE6, 0xB5, 0x8A, 0x7C, 0xAC, 0x3F, + 0xEA, 0xFC, 0x19, 0x64, 0xFD, 0xB4, 0xA3, 0x33, 0xCC, 0xBB, 0xE3, 0x5F, 0xBA, 0xAB, 0x9F, 0x2A, + 0x4E, 0x71, 0x96, 0x4D, 0x8D, 0x33, 0x39, 0x02, 0x0F, 0x6B, 0xFB, 0xC7, 0x76, 0x0D, 0xC4, 0x9D, + 0xB0, 0x6C, 0xA3, 0x91, 0x32, 0x23, 0x60, 0xF9, 0x53, 0x3C, 0x48, 0xCF, 0x54, 0x4A, 0x34, 0x6A, + 0x90, 0xB8, 0xDB, 0xB6, 0xFD, 0xD8, 0xB9, 0x79, 0xF1, 0x5D, 0x64, 0xFC, 0x2C, 0x6E, 0xA2, 0xD2, + 0x4D, 0x37, 0x56, 0xCB, 0x8D, 0xE9, 0xC9, 0x02, 0x3A, 0x7F, 0x53, 0x75, 0x98, 0x46, 0xF9, 0x8E, + 0xE2, 0x00, 0x05, 0x20, 0x8E, 0xAD, 0xAA, 0x38, 0x5F, 0x6A, 0x34, 0x16, 0x2E, 0x25, 0xFF, 0x7F, + 0xE2, 0x10, 0x2D, 0x49, 0x2C, 0xEF, 0xB5, 0xE5, 0x8A, 0x2A, 0x1F, 0x6F, 0x6C, 0x49, 0xF7, 0x78, + 0x80, 0xCA, 0xFA, 0x14, 0x5D, 0xAE, 0xA9, 0xCD, 0xC5, 0xB8, 0xA8, 0xDC, 0xFF, 0x84, 0xC5, 0x80, + 0x8E, 0x98, 0x5F, 0x7E, 0xF6, 0x26, 0xBB, 0x35, 0xF7, 0xA7, 0x40, 0x46, 0x83, 0x26, 0xDF, 0x3B, + 0x64, 0xE0, 0x67, 0x7A, 0xBE, 0x08, 0xF4, 0xE6, 0x1A, 0xF8, 0xFD, 0xBA, 0x0E, 0xBE, 0xB2, 0x28, + 0x6C, 0x45, 0xEA, 0xB1, 0x6C, 0xA8, 0x8E, 0x4F, 0xB8, 0xBC, 0x82, 0x0A, 0xD1, 0x84, 0xAB, 0x03, + 0x6C, 0x30, 0x85, 0xA1, 0x2C, 0x72, 0xA3, 0x08, 0x25, 0x4C, 0x97, 0x32, 0xEB, 0xAD, 0x0E, 0x3E, + 0xE8, 0x8E, 0x2B, 0xF0, 0xCF, 0x13, 0xCA, 0xD1, 0x53, 0xC6, 0xCD, 0x58, 0x98, 0xDE, 0xB0, 0x7E, + 0x0D, 0xBF, 0x94, 0x3E, 0xA7, 0x1C, 0x84, 0xBC, 0xB3, 0x9B, 0x6D, 0x54, 0x32, 0x39, 0x89, 0xF8, + 0x02, 0xAF, 0xBC, 0xB2, 0x53, 0x3B, 0x43, 0xF2, 0xCC, 0xC9, 0x05, 0xF2, 0xC4, 0x88, 0x37, 0x6E, + 0xE1, 0xA1, 0x55, 0x82, 0x7E, 0xBE, 0x83, 0xE0, 0x0B, 0xF8, 0x96, 0x45, 0x61, 0xC1, 0x96, 0x28, + 0x6D, 0x64, 0xCF, 0xF9, 0xC1, 0xC7, 0x3A, 0x18, 0xF3, 0x9A, 0x69, 0x2B, 0x07, 0x57, 0x55, 0xE8, + 0x09, 0xCB, 0x33, 0xC5, 0x4F, 0xBF, 0x0F, 0x9A, 0x22, 0xB1, 0xB3, 0x50, 0x15, 0xA3, 0xCB, 0x8D, + 0x6E, 0x29, 0x56, 0x89, 0x64, 0xAF, 0x5B, 0x0D, 0xD4, 0xE2, 0x6F, 0x6A, 0x38, 0xBD, 0xD8, 0xA1, + 0x7D, 0x0A, 0x6F, 0x7B, 0x07, 0x89, 0x5B, 0xD2, 0xFB, 0x34, 0x5F, 0xA9, 0x0F, 0x41, 0x18, 0xD3, + 0x99, 0xFD, 0xA8, 0x88, 0xFD, 0x4B, 0x9B, 0xCA, 0xAE, 0x5A, 0xB0, 0xEE, 0x23, 0x0F, 0x4B, 0x5C, + 0x99, 0xEA, 0x29, 0xF3, 0xF6, 0x97, 0x5F, 0xF9, 0xAF, 0x28, 0x4F, 0xEC, 0xD6, 0x01, 0x69, 0x8B, + 0x65, 0x08, 0x55, 0xCA, 0x05, 0xC0, 0xB4, 0xB2, 0x64, 0x2A, 0xF5, 0x3E, 0xDA, 0xA2, 0xD2, 0xBB, + 0xDF, 0x17, 0xFF, 0xCF, 0x9E, 0xDE, 0x8A, 0x1E, 0x5F, 0xFD, 0xEA, 0x12, 0x0F, 0xFF, 0x96, 0x20, + 0x0A, 0x15, 0xE6, 0x9B, 0x4F, 0x12, 0x0B, 0xCC, 0x39, 0x4D, 0xFD, 0xD4, 0x7A, 0xDA, 0x24, 0x11, + 0x2D, 0x93, 0x92, 0x9F, 0x3E, 0x3F, 0xA2, 0x9B, 0xAD, 0x98, 0x13, 0xE2, 0x5F, 0xF2, 0x7E, 0x84, + 0xA1, 0x43, 0xAB, 0x76, 0xB8, 0xFC, 0xA0, 0x01, 0x17, 0x38, 0xB3, 0x33, 0x13, 0x4A, 0xF5, 0x15, + 0xA5, 0x56, 0x66, 0xC5, 0x44, 0x0C, 0x88, 0x75, 0x76, 0xA5, 0x7E, 0x57, 0xD4, 0x22, 0xE5, 0x32, + 0x99, 0x60, 0x99, 0x7C, 0x65, 0x29, 0xBA, 0xB0, 0x5B, 0x1F, 0x84, 0x98, 0x0C, 0x06, 0x8A, 0xAE, + 0x96, 0x63, 0x91, 0xB1, 0x75, 0xE6, 0xE6, 0x7A, 0xBF, 0x1E, 0xB5, 0xB6, 0x76, 0x1B, 0xE2, 0xBF, + 0xB4, 0x1F, 0x4D, 0x33, 0xF9, 0x9D, 0x9C, 0x79, 0xE6, 0xF5, 0xA3, 0x8C, 0x72, 0xFE, 0xAE, 0xB1, + 0x13, 0x09, 0x20, 0x91, 0x7C, 0x11, 0x99, 0x68, 0x1A, 0xA7, 0x6B, 0x3F, 0x88, 0xC7, 0xF5, 0x94, + 0x0D, 0xBC, 0x3B, 0xA5, 0x14, 0xD7, 0x8B, 0xA0, 0xA0, 0x70, 0xB4, 0xC2, 0x4E, 0x2F, 0xA8, 0xB1, + 0x0D, 0x7B, 0x8C, 0xD4, 0x96, 0xC1, 0xD1, 0xC5, 0x13, 0x67, 0x24, 0x16, 0x3C, 0xC0, 0xFD, 0x79, + 0x3C, 0x11, 0x69, 0x03, 0xF6, 0x55, 0xF7, 0xF2, 0x09, 0x8B, 0x49, 0x5B, 0xDA, 0x05, 0x3C, 0xDB, + 0x1C, 0x01, 0x1F, 0xDC, 0x4D, 0xE2, 0x09, 0xB6, 0x1F, 0x5F, 0xE2, 0xB0, 0xDF, 0x77, 0xF8, 0x83, + 0x59, 0xCF, 0xEE, 0x8B, 0x14, 0x12, 0xEB, 0xBC, 0x9B, 0xB4, 0x38, 0xFD, 0x38, 0x53, 0xC9, 0xA1, + 0x4E, 0xF6, 0x80, 0xA8, 0xE5, 0x25, 0x89, 0x97, 0xCF, 0x94, 0x06, 0xE4, 0x25, 0xDF, 0x86, 0x46, + 0xA2, 0x54, 0xA7, 0x04, 0xB5, 0xCA, 0x67, 0xF1, 0x95, 0x65, 0x57, 0xE1, 0x38, 0x61, 0xCB, 0x20, + 0xE5, 0x98, 0xF4, 0x07, 0x95, 0x25, 0xBD, 0xBE, 0x9F, 0x87, 0x76, 0x4D, 0x52, 0x96, 0xAE, 0x82, + 0xAE, 0x2C, 0x3C, 0xB6, 0x7C, 0x1A, 0x36, 0xE5, 0x34, 0x13, 0x1B, 0x72, 0x52, 0x8F, 0xFF, 0xE7, + 0x6B, 0x83, 0xDB, 0x88, 0x4A, 0xDB, 0x95, 0x37, 0xFA, 0x9D, 0xA2, 0x49, 0xDB, 0x5A, 0xE3, 0x5C, + 0x95, 0xC7, 0xF8, 0xE0, 0x14, 0x38, 0xB2, 0xCD, 0x09, 0xF4, 0x2A, 0x2A, 0xF7, 0x1A, 0xA1, 0x8E, + 0xB8, 0xBC, 0x3B, 0x51, 0x9A, 0xE4, 0xD1, 0xCF, 0xA7, 0xD1, 0xF9, 0x63, 0x0F, 0x98, 0x3D, 0x61, + 0x51, 0xEC, 0x1B, 0x67, 0x68, 0x88, 0x25, 0x65, 0x0B, 0xA6, 0x32, 0xA2, 0xCD, 0x93, 0xE1, 0x16, + 0x01, 0x12, 0xB2, 0xDA, 0x35, 0xBA, 0x52, 0x66, 0x46, 0x44, 0x8D, 0xB3, 0x19, 0x33, 0xC1, 0x1F, + 0x47, 0x6C, 0x48, 0x7B, 0x5C, 0x8C, 0xA8, 0x68, 0x74, 0xDE, 0x7C, 0xB4, 0xDF, 0x05, 0x54, 0x35, + 0x8A, 0xFE, 0x78, 0xB5, 0x05, 0x78, 0xC3, 0xB4, 0x85, 0x12, 0x88, 0xBB, 0x49, 0x17, 0x46, 0x5D, + 0x7D, 0x1F, 0xF4, 0xB5, 0xD9, 0xEF, 0x62, 0xBA, 0xC4, 0x86, 0x61, 0x0B, 0xE0, 0xC5, 0xEE, 0x69, + 0xEC, 0xF9, 0x52, 0x93, 0x3F, 0xC7, 0x69, 0xE4, 0xD2, 0x9C, 0xE0, 0xEB, 0xB5, 0x5A, 0x55, 0xCE, + 0x87, 0xA3, 0x1C, 0x52, 0x2E, 0xC5, 0x99, 0x92, 0x7F, 0x10, 0x06, 0xC4, 0xA2, 0x5B, 0x77, 0x3D, + 0x53, 0xE8, 0xCA, 0xB5, 0x3B, 0x18, 0x58, 0x54, 0xC6, 0x63, 0xDB, 0x1D, 0xB6, 0x75, 0xD2, 0x69, + 0x64, 0x8A, 0x69, 0x0E, 0xF9, 0x57, 0x41, 0x4C, 0xC2, 0xF3, 0x59, 0x0A, 0x60, 0x76, 0x67, 0x4A, + 0xE6, 0xE8, 0x63, 0xB5, 0x0A, 0x39, 0xDE, 0x95, 0xD6, 0xFB, 0xD4, 0xEC, 0xA3, 0xBD, 0x1A, 0xB1, + 0x8F, 0x54, 0x1C, 0xD7, 0x39, 0x50, 0x8F, 0x92, 0x0D, 0x33, 0x9F, 0x49, 0x10, 0xB2, 0x73, 0x87, + 0x83, 0xF0, 0x72, 0x9D, 0xE7, 0xEA, 0x14, 0xC7, 0x5A, 0x23, 0x6F, 0x54, 0x3E, 0xB5, 0x86, 0x6D, + 0xD6, 0xE2, 0x3E, 0x97, 0x96, 0x5F, 0xF4, 0x1A, 0xFD, 0x8B, 0x96, 0x9B, 0x14, 0xD7, 0x25, 0x3A, + 0x96, 0x25, 0x7B, 0xBE, 0x32, 0x46, 0xC3, 0x20, 0x4E, 0x01, 0x98, 0x0A, 0x27, 0x53, 0x58, 0xFA, + 0xAF, 0x14, 0xE6, 0x6B, 0x99, 0x32, 0x85, 0x87, 0x8F, 0xDA, 0x09, 0x7C, 0x92, 0x9D, 0x4C, 0x87, + 0xF6, 0xB3, 0x67, 0x61, 0xA2, 0x7C, 0x25, 0x5D, 0x4E, 0xA7, 0x6F, 0xF0, 0xCB, 0x6C, 0x6A, 0xC3, + 0xE2, 0x19, 0x33, 0xBE, 0x73, 0x95, 0xE1, 0xBA, 0x39, 0x09, 0x7F, 0xAE, 0x72, 0x8A, 0x4E, 0x74, + 0xA1, 0xBF, 0x5B, 0x1D, 0x34, 0x89, 0xF0, 0x94, 0xE6, 0x84, 0x3C, 0x64, 0x29, 0x04, 0x07, 0x34, + 0xC3, 0x32, 0xEF, 0xF6, 0xE5, 0x24, 0x54, 0x09, 0xFA, 0x81, 0xDB, 0xF1, 0xCF, 0xE5, 0xDB, 0x98, + 0x27, 0xC0, 0xEB, 0xDA, 0x10, 0x73, 0x74, 0x76, 0xCA, 0xD7, 0xFE, 0xDF, 0x82, 0x63, 0x0F, 0x31, + 0x03, 0xBE, 0x10, 0xF4, 0xF6, 0x76, 0xDD, 0x27, 0xAD, 0xE4, 0xC1, 0xFA, 0xC5, 0x5A, 0x71, 0x8D, + 0x59, 0x39, 0x41, 0x6C, 0xDD, 0xFB, 0x4C, 0x5C, 0xB0, 0xB8, 0xF9, 0x67, 0x9C, 0xD7, 0x90, 0x44, + 0xE2, 0xF3, 0x39, 0x4C, 0x84, 0x1A, 0x13, 0x3F, 0xF2, 0xDF, 0x77, 0xA5, 0xF6, 0xAB, 0x69, 0x37, + 0x18, 0x56, 0x03, 0x86, 0xE9, 0xB7, 0xC8, 0xD8, 0x5A, 0xA1, 0x87, 0x00, 0xBC, 0x14, 0x44, 0xFF, + 0x21, 0xDD, 0xAC, 0x99, 0xD2, 0x78, 0xDF, 0x0C, 0xF3, 0xAC, 0x5F, 0xF4, 0x56, 0xE4, 0xAB, 0xCF, + 0x5F, 0x1C, 0x60, 0x7E, 0xFA, 0xDA, 0x36, 0x8A, 0xF2, 0xD4, 0x80, 0x64, 0xC5, 0x54, 0x53, 0xCA, + 0xF3, 0x80, 0x9A, 0x3C, 0x7C, 0x7B, 0x32, 0x30, 0x14, 0xB7, 0x17, 0x9B, 0x42, 0x7C, 0x94, 0x0D, + 0xC4, 0x43, 0x5B, 0xB0, 0x86, 0xE9, 0x1F, 0x80, 0xCD, 0x45, 0x97, 0x3D, 0x8A, 0xD0, 0x22, 0x91, + 0xA0, 0x14, 0xA5, 0xD7, 0x71, 0x07, 0x8D, 0xAB, 0x69, 0xE8, 0x38, 0x98, 0xEE, 0x70, 0x3D, 0x7B, + 0x86, 0x13, 0xDE, 0xAF, 0xE5, 0x89, 0x5A, 0x5F, 0x1F, 0xF9, 0xA5, 0x3F, 0xED, 0x62, 0xE6, 0x65, + 0x3B, 0x86, 0xF9, 0x76, 0xD6, 0x5A, 0x57, 0x54, 0x8B, 0x0D, 0x39, 0xEC, 0x9F, 0x00, 0xBF, 0x4E, + 0xF8, 0x62, 0x51, 0x83, 0x74, 0x16, 0x00, 0x3A, 0x4F, 0x71, 0x18, 0x73, 0xF0, 0x41, 0x71, 0xB4, + 0xDC, 0x79, 0xFC, 0x32, 0xDB, 0x38, 0x0C, 0x3F, 0x1B, 0x66, 0xA4, 0x27, 0xED, 0xA7, 0xE2, 0xE6, + 0xB0, 0x51, 0xF6, 0xBD, 0xEF, 0x2E, 0x0E, 0x10, 0x8F, 0x1D, 0x40, 0xDF, 0x85, 0x67, 0xC7, 0x25, + 0x11, 0x7F, 0x50, 0x99, 0xC8, 0xAE, 0xDF, 0x6A, 0xAF, 0x70, 0x8C, 0xD4, 0xB5, 0x6A, 0xA5, 0x21, + 0x1C, 0xBF, 0x0C, 0x75, 0xA2, 0x40, 0x03, 0x17, 0x58, 0x8C, 0x84, 0x4D, 0x82, 0x29, 0xE5, 0x7C, + 0x05, 0xA1, 0xAF, 0x48, 0x07, 0xD1, 0xF7, 0x53, 0xBC, 0x02, 0xF7, 0xCD, 0x60, 0x35, 0xEE, 0x04, + 0x03, 0xE1, 0x3A, 0xAA, 0x71, 0x54, 0x5B, 0xDD, 0x86, 0x68, 0xFB, 0xC6, 0xBC, 0xCF, 0xCD, 0x55, + 0xBC, 0x0E, 0x0D, 0x8D, 0x7B, 0x70, 0x1F, 0xE4, 0xEC, 0x2C, 0x91, 0x22, 0xF6, 0x55, 0xC9, 0x07, + 0x0F, 0x26, 0x60, 0x4F, 0xB0, 0x27, 0xFA, 0xAB, 0xBF, 0x3B, 0xF1, 0x3F, 0x52, 0xB8, 0xC7, 0x7B, + 0x52, 0xBF, 0x6E, 0xA4, 0x87, 0xCD, 0x40, 0x62, 0x4D, 0xDA, 0xD1, 0x37, 0x77, 0x44, 0xB3, 0x1D, + 0xD6, 0x2F, 0x9A, 0xA8, 0x61, 0x54, 0x6A, 0x1E, 0x2E, 0xE2, 0xC0, 0xBF, 0x7D, 0xAD, 0xB9, 0xDB, + 0x52, 0x5C, 0x0F, 0x15, 0x7F, 0x40, 0x8B, 0xC3, 0x4E, 0xC5, 0xC3, 0x59, 0x5A, 0x19, 0x3F, 0xA1, + 0xB3, 0x58, 0x3A, 0xC2, 0x06, 0x5B, 0x16, 0xF8, 0xEA, 0xFA, 0xB6, 0x8D, 0x93, 0xFF, 0xC4, 0x96, + 0x2C, 0x9F, 0xD0, 0xAB, 0x5A, 0x2B, 0x81, 0x17, 0xA9, 0x71, 0x38, 0x0F, 0x01, 0xEF, 0x5A, 0xC0, + 0xE9, 0x9F, 0x8B, 0x63, 0x47, 0x89, 0x50, 0xC2, 0xFB, 0x8A, 0x8B, 0x9F, 0xEE, 0xC4, 0xC4, 0x7A, + 0xDC, 0xAD, 0xC3, 0x6A, 0x70, 0xA4, 0x71, 0x53, 0xFD, 0xA9, 0x0D, 0xC0, 0x62, 0x23, 0xB8, 0x9D, + 0xAE, 0xA2, 0x12, 0x0B, 0x18, 0x42, 0xB6, 0x93, 0x2A, 0x85, 0x60, 0x09, 0x59, 0x69, 0x52, 0x1F, + 0x1E, 0xBA, 0xBF, 0x0F, 0xA6, 0x8E, 0xB0, 0x8A, 0x03, 0xCA, 0xC5, 0x1C, 0x8E, 0x89, 0xF2, 0x50, + 0xD7, 0x1A, 0xA9, 0x63, 0x83, 0x0F, 0x6D, 0x06, 0x27, 0x1F, 0x40, 0xDA, 0x0B, 0x9E, 0xEB, 0x1F, + 0x7E, 0x4F, 0x8A, 0xF0, 0x38, 0x86, 0x08, 0xC6, 0x3A, 0xFF, 0x29, 0xCC, 0xA7, 0x10, 0x27, 0xF3, + 0x99, 0x3E, 0x52, 0xF3, 0x0F, 0x83, 0x93, 0x9F, 0x63, 0xE8, 0x23, 0x41, 0x71, 0x98, 0x25, 0x1B, + 0xC9, 0x89, 0x15, 0x8F, 0xC8, 0x72, 0x35, 0x72, 0x7D, 0xF2, 0x36, 0x31, 0x64, 0xF5, 0x3A, 0x4C, + 0x15, 0x9B, 0x30, 0x77, 0x36, 0x03, 0xB9, 0xEE, 0xCA, 0x61, 0x22, 0x7C, 0xCF, 0xEE, 0x6C, 0xE4, + 0xEC, 0x83, 0x67, 0x10, 0x07, 0x7A, 0x21, 0x97, 0xDF, 0xC3, 0x2A, 0x27, 0x47, 0xDB, 0x1A, 0x76, + 0x2D, 0xA5, 0x9D, 0xD7, 0x39, 0x54, 0x4F, 0x62, 0x9C, 0xFD, 0x77, 0x0E, 0xB0, 0x4A, 0x0A, 0xD9, + 0x46, 0xC2, 0x28, 0x49, 0xB0, 0x53, 0x99, 0x2A, 0xC2, 0x81, 0xF9, 0x8A, 0xE1, 0x01, 0xDA, 0xCC, + 0x31, 0x60, 0x9B, 0x32, 0x4B, 0x69, 0x2B, 0x89, 0x00, 0xDA, 0xCD, 0x41, 0x0B, 0x13, 0xC0, 0x3C, + 0x4A, 0xD0, 0x32, 0x0A, 0x45, 0x31, 0x54, 0x38, 0x9E, 0x74, 0x56, 0x60, 0x8A, 0xFA, 0x0C, 0x0C, + 0xC8, 0xDC, 0x4E, 0x12, 0x9A, 0xD0, 0x2B, 0xAC, 0xF3, 0x16, 0xD3, 0xE4, 0x5C, 0xA8, 0x3B, 0x8A, + 0x8E, 0x04, 0x4B, 0x09, 0xDE, 0x91, 0x1C, 0xF2, 0x3D, 0xB5, 0x27, 0x23, 0x9A, 0x5F, 0xCA, 0xCE, + 0x1D, 0x81, 0x25, 0xD3, 0x0B, 0x07, 0x3B, 0xA2, 0xED, 0xC1, 0x68, 0xA3, 0x10, 0x1E, 0x49, 0xED, + 0x2B, 0x02, 0xD4, 0x65, 0x6B, 0xDE, 0xF7, 0xE8, 0x3D, 0xC3, 0x41, 0x1E, 0x75, 0xDB, 0xD0, 0xE4, + 0xA7, 0xFF, 0xFC, 0xB3, 0x0D, 0xAE, 0x72, 0x6D, 0xF2, 0x16, 0xF9, 0x4C, 0x9B, 0x2C, 0x83, 0x55, + 0x53, 0x32, 0xB1, 0x4E, 0xE7, 0x7E, 0x7F, 0xF6, 0xBE, 0xE4, 0x7A, 0xF3, 0xDB, 0x73, 0xA5, 0xDC, + 0xB3, 0x1F, 0x1B, 0x9E, 0x93, 0x58, 0x58, 0x4C, 0xDB, 0xED, 0x8C, 0x02, 0xB7, 0x43, 0x10, 0x7F, + 0x32, 0xF0, 0xFC, 0xD2, 0xDA, 0x18, 0xA6, 0x74, 0x80, 0x12, 0x9C, 0xBB, 0xB9, 0xA9, 0x03, 0x76, + 0xC9, 0x4E, 0xE0, 0xE3, 0x63, 0x96, 0xC8, 0x32, 0x04, 0x06, 0x15, 0x52, 0xD1, 0xB6, 0x03, 0x1B, + 0x5D, 0xF2, 0x40, 0x43, 0x37, 0xCF, 0x7C, 0xF5, 0xC4, 0xAB, 0x8B, 0x83, 0x63, 0x5D, 0xE3, 0x3B, + 0x3B, 0x66, 0xE6, 0x19, 0xEF, 0x51, 0x6B, 0x60, 0x6F, 0x3E, 0x71, 0x3D, 0x8E, 0x5A, 0x77, 0xD2, + 0x57, 0x9A, 0x06, 0xE9, 0xBB, 0x8A, 0x50, 0x58, 0x90, 0xF1, 0x17, 0xD7, 0x18, 0x9C, 0x24, 0x65, + 0x3D, 0x40, 0xA5, 0xA1, 0xD8, 0x24, 0x4B, 0xAA, 0x8A, 0x47, 0x3F, 0x0D, 0xB6, 0x60, 0xE6, 0x75, + 0xCD, 0x45, 0x6D, 0x54, 0xD9, 0x67, 0x65, 0xE0, 0x04, 0xCC, 0xBE, 0xCC, 0xAA, 0x8E, 0x3D, 0xB9, + 0x1E, 0x03, 0x25, 0x25, 0x31, 0x88, 0x36, 0xF6, 0x52, 0xD7, 0x4E, 0x75, 0xB5, 0xEA, 0x05, 0x83, + 0x59, 0xAD, 0xAF, 0xF4, 0x13, 0xCE, 0x5D, 0xF4, 0x52, 0x98, 0xBC, 0x63, 0xFE, 0xB0, 0xC5, 0x55, + 0xBD, 0x5A, 0x65, 0x3E, 0xAF, 0x24, 0x4C, 0x5E, 0xEA, 0x9A, 0x44, 0x32, 0x0E, 0x39, 0xCA, 0x60, + 0xB2, 0xBF, 0x62, 0x40, 0x19, 0x57, 0xDE, 0x7C, 0x70, 0xD7, 0xC3, 0x0E, 0x9A, 0x98, 0x6F, 0x26, + 0x22, 0x45, 0xC4, 0xD1, 0x8E, 0x6B, 0xC9, 0x3F, 0x1E, 0x71, 0x4F, 0x2E, 0x86, 0x42, 0x73, 0x00, + 0xEB, 0x98, 0x22, 0x03, 0x1F, 0x6F, 0xC3, 0xAF, 0xD0, 0x55, 0x8F, 0x95, 0x6F, 0x8E, 0x4B, 0xF0, + 0x21, 0x1D, 0xA7, 0xB1, 0xE8, 0x6B, 0xC7, 0x8A, 0xAD, 0x69, 0xD7, 0x6A, 0x7F, 0x09, 0x3A, 0x9F, + 0xBF, 0x30, 0x27, 0x18, 0x00, 0x11, 0xF2, 0x96, 0xAB, 0x57, 0xD3, 0x67, 0x5D, 0x2A, 0x36, 0xCF, + 0xE2, 0x05, 0xBB, 0x01, 0x83, 0x0B, 0xC7, 0x6D, 0xE9, 0xFD, 0x5A, 0xC8, 0x0D, 0x9C, 0xC0, 0xA2, + 0x41, 0x8D, 0x0E, 0x53, 0xB2, 0xD2, 0x2B, 0xD8, 0xE5, 0x4C, 0xEE, 0x81, 0x52, 0xED, 0xE8, 0xEA, + 0xF1, 0xF3, 0x2A, 0x5D, 0xEC, 0x2D, 0x0E, 0xFD, 0x76, 0x26, 0x4C, 0x25, 0x78, 0x26, 0x6F, 0x2F, + 0xF7, 0x31, 0xAB, 0xC0, 0x6C, 0x80, 0x1F, 0x2B, 0x8B, 0x1E, 0xC1, 0x09, 0x46, 0x5E, 0x94, 0x19, + 0xED, 0x07, 0x94, 0xEC, 0xCF, 0x3B, 0xC6, 0x51, 0x29, 0xC2, 0x87, 0xD4, 0x55, 0xD0, 0xAD, 0x82, + 0x66, 0x27, 0x61, 0x18, 0xDD, 0xB8, 0xBD, 0xF9, 0xE1, 0xCA, 0xAA, 0xBA, 0x49, 0x39, 0xD6, 0x43, + 0xA9, 0x10, 0x12, 0x7C, 0xA6, 0x82, 0xD8, 0xDB, 0x11, 0x76, 0x9D, 0xF0, 0x92, 0xFB, 0x31, 0xC1, + 0x9C, 0x31, 0x78, 0x1C, 0x11, 0xD6, 0xF3, 0x1F, 0x14, 0x39, 0xC6, 0x33, 0x46, 0x58, 0x8C, 0xE9, + 0x2B, 0x87, 0x94, 0xA6, 0xFA, 0x55, 0x5A, 0x3C, 0x39, 0x60, 0xD0, 0x26, 0x0F, 0xB3, 0x56, 0x18, + 0x77, 0x9C, 0x1B, 0x01, 0xBA, 0xE6, 0xB2, 0x1E, 0x8B, 0xA0, 0x63, 0x2D, 0x7E, 0xA2, 0x30, 0xFC, + 0xDF, 0x31, 0x99, 0xB2, 0xD6, 0x1E, 0xD3, 0xAB, 0xB7, 0xFA, 0x72, 0xB0, 0x6F, 0xE5, 0x6B, 0x9F, + 0xAF, 0xB4, 0xF0, 0x53, 0x06, 0x9C, 0xB0, 0x98, 0x6B, 0xF4, 0x5A, 0x52, 0xDB, 0xD0, 0x13, 0xED, + 0x73, 0x70, 0x11, 0xBB, 0xD0, 0x98, 0x58, 0xCA, 0x29, 0x44, 0xCB, 0x7C, 0x2D, 0x43, 0xDE, 0x4F, + 0xBF, 0x13, 0x06, 0xDD, 0x3C, 0x69, 0x49, 0xD2, 0xD7, 0xA7, 0x24, 0x9E, 0x0D, 0x3C, 0x8C, 0x73, + 0x0F, 0xB2, 0x4F, 0x16, 0x83, 0x7E, 0x7B, 0x3A, 0xD4, 0x49, 0x42, 0x26, 0x9C, 0x6F, 0xAF, 0xD6, + 0x73, 0xEF, 0x29, 0x3D, 0x1A, 0x21, 0x58, 0x48, 0xF7, 0xEE, 0xD2, 0xC8, 0x06, 0x4D, 0xB2, 0x3D, + 0x1E, 0xD6, 0xF6, 0xF3, 0x25, 0xC8, 0xD5, 0xF4, 0xB6, 0x07, 0x2C, 0xB0, 0x03, 0xDE, 0x83, 0xE0, + 0x1C, 0x68, 0x2E, 0x78, 0xB6, 0xDA, 0x99, 0xA6, 0xBD, 0xE8, 0x1D, 0x47, 0x6E, 0x7A, 0x4C, 0xC5, + 0xE4, 0x54, 0xEA, 0xDB, 0xB1, 0x6F, 0x9F, 0x53, 0xA6, 0x41, 0xE2, 0x24, 0x6C, 0x9C, 0x88, 0xF7, + 0x88, 0xA8, 0x90, 0x0D, 0x34, 0x61, 0xAA, 0x7D, 0x52, 0x5F, 0x8D, 0x81, 0xBE, 0xC9, 0x3E, 0x36, + 0x8D, 0x69, 0x81, 0x0D, 0x24, 0x7D, 0xCE, 0x03, 0xB8, 0x4E, 0x9C, 0xFD, 0x5A, 0x4A, 0x45, 0xAF, + 0x45, 0xB5, 0xFF, 0x49, 0xEA, 0x6C, 0xF7, 0xB9, 0xE5, 0xC1, 0xA6, 0x57, 0xF3, 0xCA, 0xCC, 0x46, + 0xD2, 0x20, 0xB3, 0xB1, 0xC0, 0x18, 0xEE, 0x82, 0xE4, 0x00, 0x3C, 0xA7, 0x8B, 0xA6, 0x3A, 0xDA, + 0x82, 0x53, 0x3C, 0x42, 0x4C, 0x3B, 0x16, 0xD0, 0x3E, 0x0E, 0xBA, 0x36, 0xA6, 0xEA, 0x36, 0x16, + 0x80, 0xA3, 0x51, 0xFD, 0xF8, 0xFA, 0xE5, 0x75, 0x64, 0x17, 0x0C, 0xE5, 0xAE, 0xB2, 0xE5, 0x14, + 0xC1, 0xA9, 0xAE, 0x3A, 0x7E, 0x4D, 0x0E, 0x5C, 0x67, 0x31, 0x02, 0xD2, 0x4D, 0xB3, 0xD6, 0xC6, + 0xE6, 0x86, 0xC2, 0x62, 0xE6, 0xB6, 0x53, 0x2C, 0x29, 0x72, 0x90, 0x55, 0xAC, 0x1C, 0xE7, 0x7F, + 0x7F, 0xA3, 0xE8, 0x21, 0xF0, 0x2D, 0x3E, 0x8A, 0xA3, 0xA2, 0xA2, 0x29, 0xEC, 0x36, 0x4B, 0x89, + 0x1C, 0xB6, 0xC1, 0xB9, 0x4A, 0x8F, 0x65, 0xDF, 0x97, 0x29, 0x0F, 0x0B, 0xB1, 0x61, 0x24, 0xA2, + 0xD2, 0x57, 0x7A, 0x99, 0xF7, 0x1D, 0xC8, 0xB4, 0xDD, 0xEE, 0x7A, 0xBE, 0x2E, 0x46, 0x9A, 0xF6, + 0x92, 0x13, 0xAC, 0x98, 0x64, 0x4C, 0xDD, 0x6B, 0x03, 0xD3, 0xF4, 0x14, 0xC9, 0x7D, 0xCE, 0x9B, + 0xF7, 0xD4, 0x80, 0xB1, 0x2A, 0x66, 0x33, 0xA4, 0xE2, 0x45, 0x99, 0x95, 0x77, 0xE1, 0x3E, 0x8A, + 0x43, 0x85, 0xD9, 0x79, 0x69, 0x0D, 0x55, 0xCF, 0x09, 0xF4, 0xFC, 0x07, 0x39, 0x20, 0x26, 0xB4, + 0x8B, 0xD0, 0x60, 0xFB, 0x42, 0x41, 0xEF, 0x02, 0x5F, 0x0D, 0xC7, 0x7F, 0x09, 0xFA, 0x26, 0x94, + 0x7A, 0xCD, 0xDE, 0x43, 0x86, 0x44, 0xD6, 0xC6, 0xB1, 0x77, 0x13, 0xB1, 0x08, 0xC9, 0xDD, 0x99, + 0xF0, 0xED, 0x7B, 0xB0, 0xAB, 0x31, 0x6D, 0x5B, 0x66, 0xA3, 0x53, 0xE2, 0x3B, 0x0F, 0x31, 0xA2, + 0x63, 0x6E, 0x05, 0xAD, 0xC6, 0x74, 0xC5, 0x2D, 0xB3, 0x79, 0xEB, 0x66, 0xF3, 0x6B, 0x79, 0x02, + 0x7A, 0x7D, 0x49, 0x59, 0x30, 0x04, 0x29, 0xD8, 0x5E, 0xF7, 0xF3, 0x6C, 0x5E, 0xC2, 0xA6, 0xFF, + 0x1B, 0x5A, 0xFE, 0x01, 0x54, 0x40, 0xEF, 0xA0, 0xD5, 0xDB, 0x47, 0xED, 0x2A, 0x9B, 0x85, 0x12, + 0x9F, 0x74, 0x5D, 0xB7, 0xA6, 0x80, 0x22, 0x34, 0x87, 0x81, 0x7E, 0x15, 0x87, 0x62, 0x03, 0x87, + 0x62, 0x6B, 0x85, 0xF1, 0x37, 0x55, 0x55, 0x31, 0x18, 0xBD, 0xEF, 0x57, 0x1D, 0x21, 0x5E, 0x87, + 0x37, 0x53, 0x61, 0x7B, 0xA5, 0x80, 0x71, 0x2C, 0x72, 0x83, 0x64, 0x73, 0xF2, 0x4C, 0xA0, 0x3F, + 0x4C, 0x3E, 0x21, 0xF3, 0x96, 0xBB, 0x9C, 0x05, 0xE1, 0x12, 0x47, 0xA2, 0x6E, 0xF6, 0x67, 0xFE, + 0x1B, 0x3F, 0x74, 0xA5, 0x6B, 0x2E, 0xB3, 0x77, 0x02, 0x64, 0x30, 0xAF, 0x6C, 0x64, 0x2E, 0x69, + 0x92, 0xA5, 0xD3, 0xA8, 0xEE, 0xEF, 0xB7, 0x89, 0xD9, 0x31, 0x1B, 0x61, 0xC8, 0x91, 0xF1, 0xC5, + 0x59, 0x7D, 0xCE, 0xDF, 0xFB, 0xF2, 0x10, 0xF7, 0x42, 0x02, 0xEC, 0x70, 0x2F, 0xE4, 0x02, 0xB4, + 0xFB, 0xA0, 0xFC, 0x83, 0x58, 0x68, 0xA2, 0x8E, 0x01, 0x8B, 0x10, 0xF6, 0x30, 0x86, 0xAA, 0x5A, + 0xC4, 0x95, 0x61, 0x02, 0x8E, 0xF2, 0xB7, 0x6B, 0x6C, 0x80, 0x5C, 0xCB, 0x11, 0x66, 0x97, 0x60, + 0x70, 0xD4, 0x06, 0xA9, 0xC7, 0x80, 0xE3, 0x2C, 0xA4, 0xE1, 0xAA, 0x34, 0x92, 0x13, 0x57, 0x05, + 0xF9, 0x70, 0xF3, 0xF4, 0x80, 0x73, 0xF2, 0x16, 0xDA, 0xBD, 0x39, 0x51, 0xD1, 0x40, 0xC1, 0x59, + 0x04, 0xCD, 0xE4, 0x79, 0x63, 0x24, 0x69, 0xC6, 0x99, 0x2F, 0x4D, 0x0D, 0x1C, 0x9C, 0x15, 0xED, + 0x41, 0x47, 0x12, 0x78, 0x6F, 0x8E, 0xFF, 0xA7, 0x34, 0xB8, 0x8B, 0x0C, 0x70, 0x96, 0x07, 0x0B, + 0x49, 0x42, 0x59, 0xFE, 0x5A, 0x08, 0x76, 0x36, 0x3D, 0x7D, 0xBA, 0x10, 0x1B, 0x11, 0xB4, 0x6B, + 0x1C, 0x59, 0x60, 0x02, 0x36, 0x30, 0xD9, 0xEC, 0xBA, 0xEE, 0x22, 0xFD, 0x0F, 0x2E, 0xA2, 0xE2, + 0x70, 0x9C, 0x0D, 0x18, 0x58, 0x88, 0x4A, 0x0D, 0xE7, 0x0E, 0xEF, 0xD8, 0x6F, 0xA7, 0x70, 0x12, + 0x9D, 0x06, 0x4C, 0x8C, 0xAD, 0x1A, 0x28, 0x01, 0xB6, 0x23, 0x53, 0x76, 0xDD, 0x3F, 0x17, 0x87, + 0x0B, 0xC1, 0xEB, 0x9C, 0x44, 0x67, 0x1B, 0x79, 0xE0, 0x67, 0xB2, 0x2A, 0x99, 0x72, 0xEB, 0x4C, + 0xB4, 0x17, 0x2E, 0xB5, 0xE8, 0x52, 0x1E, 0xCB, 0x3A, 0x3D, 0xF7, 0xF2, 0x21, 0xC7, 0xF1, 0x29, + 0x97, 0x22, 0x31, 0x2C, 0x39, 0x8A, 0xAF, 0x47, 0xF9, 0x3B, 0xA9, 0x8B, 0x2B, 0xEF, 0xE2, 0xF0, + 0x11, 0x59, 0xFC, 0xE4, 0x56, 0xFF, 0x4E, 0xA7, 0x92, 0xE5, 0xE5, 0x26, 0x16, 0xC8, 0x2C, 0x35, + 0xD2, 0x70, 0x9F, 0xAE, 0xA7, 0x08, 0x16, 0x2B, 0x64, 0xA1, 0xF6, 0xF3, 0xC1, 0x43, 0x27, 0x92, + 0x46, 0x4E, 0xA2, 0x01, 0x72, 0x18, 0x08, 0xAB, 0x22, 0x42, 0x1B, 0x9E, 0x35, 0xAE, 0xB3, 0xE6, + 0x42, 0x1B, 0x49, 0x31, 0xBB, 0xA4, 0xD0, 0xD6, 0x7A, 0xEB, 0xFE, 0x32, 0x37, 0x7F, 0xE6, 0x2F, + 0x75, 0x54, 0x1D, 0x88, 0x9F, 0x81, 0xEE, 0xF0, 0x97, 0xC9, 0x12, 0x80, 0x47, 0x5C, 0xCA, 0x3B, + 0x45, 0xF4, 0x63, 0xC3, 0x16, 0x2D, 0x7E, 0xCD, 0x80, 0xC2, 0xBA, 0x50, 0x1D, 0xC2, 0x31, 0x72, + 0xF0, 0x27, 0x97, 0xB0, 0xF4, 0x69, 0x43, 0x2B, 0x26, 0x89, 0x28, 0xFC, 0xBD, 0x03, 0x6A, 0x4A, + 0x22, 0x5D, 0xD3, 0x7D, 0xEC, 0xC8, 0xEC, 0x7B, 0x15, 0xFA, 0x05, 0x5D, 0x73, 0x6B, 0x5B, 0x1B, + 0xC9, 0x83, 0xD0, 0xFA, 0x24, 0xBA, 0x97, 0x11, 0x30, 0x04, 0xD3, 0x11, 0xCE, 0x24, 0xBD, 0x71, + 0xB7, 0xAA, 0xB2, 0xC2, 0x43, 0xC2, 0x67, 0x3B, 0x9C, 0x28, 0x62, 0x52, 0xF0, 0xFA, 0xCB, 0xFA, + 0xDF, 0x4F, 0xC9, 0x23, 0xD1, 0x94, 0xE1, 0x5F, 0x2A, 0xF2, 0xC7, 0x5F, 0x76, 0x6B, 0x86, 0x28, + 0x29, 0xF1, 0x54, 0x4F, 0x7A, 0x4D, 0xFD, 0xD0, 0x51, 0xFA, 0xBC, 0x6F, 0x7B, 0x44, 0xE5, 0xB0, + 0xF3, 0xC0, 0x34, 0x80, 0x6D, 0xE6, 0xDD, 0xCD, 0x7F, 0x67, 0x7B, 0x15, 0xC5, 0xE5, 0x14, 0x64, + 0x80, 0x81, 0xD9, 0x47, 0xCE, 0x71, 0x62, 0x94, 0xCE, 0x41, 0x61, 0xFA, 0xDD, 0x5A, 0x6D, 0xC1, + 0x28, 0x87, 0x39, 0xC4, 0xBC, 0x89, 0x3A, 0x99, 0x18, 0x80, 0xDC, 0x50, 0x72, 0xCF, 0x67, 0x4D, + 0x77, 0x6D, 0x6A, 0xB4, 0x17, 0x85, 0xD6, 0x2B, 0xC3, 0x4A, 0x7C, 0xD1, 0xF3, 0x0E, 0xA4, 0x8F, + 0x3B, 0xDA, 0x8A, 0x7B, 0x0A, 0x37, 0x7D, 0x36, 0xEC, 0x89, 0x87, 0xD9, 0x88, 0xB7, 0xC9, 0x1F, + 0xEB, 0xEE, 0x25, 0x46, 0xA9, 0x3B, 0x19, 0x16, 0x17, 0x2D, 0x0F, 0x8C, 0xEB, 0x19, 0xF3, 0x47, + 0xC7, 0x21, 0xA8, 0x1E, 0x7F, 0xC4, 0xE3, 0x6B, 0x96, 0x1D, 0x63, 0xDD, 0xC2, 0xEF, 0xB2, 0x65, + 0x60, 0x07, 0xE5, 0xD3, 0x48, 0x49, 0x9A, 0xF2, 0xB0, 0x76, 0x2D, 0xFB, 0x68, 0xF8, 0xAD, 0xE9, + 0x3C, 0x52, 0x37, 0x9A, 0xD1, 0xAE, 0x16, 0x37, 0x2E, 0xB3, 0x63, 0xE0, 0x66, 0xB1, 0x4D, 0x49, + 0x83, 0xD2, 0xEA, 0x20, 0xFD, 0x43, 0x84, 0x5B, 0x22, 0xBC, 0x0C, 0xA1, 0x85, 0x28, 0xF7, 0x45, + 0xF1, 0x2A, 0xC2, 0xFE, 0x87, 0x4C, 0xFC, 0x0A, 0x5B, 0xD9, 0x84, 0x7A, 0xAC, 0x8C, 0xBD, 0xDF, + 0xDC, 0xA5, 0xFC, 0xD0, 0x85, 0x65, 0xA2, 0x73, 0x1C, 0x7C, 0xFD, 0xF9, 0xBA, 0x1E, 0xBD, 0x5F, + 0x06, 0xE8, 0xFC, 0x62, 0xD1, 0xF7, 0x13, 0x52, 0xE3, 0xC2, 0xEB, 0xEE, 0x0E, 0x7E, 0x9D, 0x8A, + 0x19, 0x3E, 0xA2, 0x62, 0x06, 0xC5, 0xA1, 0xDC, 0x6B, 0x4A, 0x59, 0xA6, 0x57, 0x73, 0xCB, 0x57, + 0x16, 0x99, 0xFB, 0x93, 0x36, 0xDF, 0x0E, 0x1A, 0x38, 0xD4, 0x89, 0x02, 0x79, 0xB6, 0xA8, 0x52, + 0xCB, 0x2E, 0x96, 0xD4, 0xD8, 0x52, 0xA9, 0x7C, 0xE3, 0x97, 0x47, 0x6F, 0x6E, 0x82, 0x6D, 0x3A, + 0x01, 0x8F, 0x2F, 0x59, 0xDF, 0x93, 0xBA, 0x52, 0xC4, 0x46, 0xDA, 0xC5, 0x0C, 0x2E, 0x40, 0xB8, + 0x37, 0x55, 0x40, 0xB8, 0x13, 0xCD, 0x51, 0x96, 0xCE, 0x4A, 0x6C, 0x0D, 0xF9, 0x5A, 0xE6, 0x34, + 0x95, 0xF0, 0xFF, 0x54, 0x93, 0x05, 0x9D, 0x56, 0x94, 0xF7, 0x23, 0x90, 0x00, 0x44, 0xA7, 0xD9, + 0x86, 0x71, 0xB2, 0xFD, 0x58, 0x19, 0xBB, 0xEC, 0x6B, 0x90, 0x07, 0x2B, 0x7A, 0x20, 0x4B, 0xFD, + 0x0E, 0xB8, 0xF8, 0x00, 0x13, 0xC2, 0xF2, 0x32, 0x39, 0xED, 0x71, 0x59, 0x71, 0xC4, 0xDC, 0xE5, + 0xC2, 0xA9, 0x2B, 0x7B, 0x52, 0x00, 0xCB, 0x49, 0xB4, 0x00, 0xE6, 0x98, 0x13, 0xC1, 0x2F, 0x3A, + 0x19, 0x86, 0xD5, 0x74, 0xCD, 0xBC, 0xBA, 0x4C, 0x48, 0x00, 0x8E, 0x22, 0xD5, 0xAC, 0x11, 0xEF, + 0xC8, 0xCD, 0x99, 0xBA, 0xBC, 0x0F, 0xD4, 0xC0, 0xAE, 0x15, 0x2F, 0x82, 0x6D, 0x4D, 0x44, 0x10, + 0xF1, 0xF5, 0x55, 0xF0, 0x00, 0xAF, 0xEA, 0x96, 0x1F, 0xE6, 0xA6, 0x9A, 0x78, 0xDD, 0x6D, 0xD5, + 0xDF, 0xA4, 0x4D, 0xAE, 0x05, 0xEE, 0x12, 0x9F, 0x9B, 0x99, 0xAC, 0xE4, 0xBE, 0x9E, 0x56, 0xCC, + 0x4B, 0x6D, 0x26, 0xB9, 0x56, 0x9B, 0x9B, 0x52, 0x6D, 0x14, 0x28, 0x7D, 0xE8, 0x75, 0xCB, 0x59, + 0xC0, 0x50, 0x69, 0x6B, 0xD7, 0x68, 0x06, 0xA8, 0x38, 0xD1, 0xBB, 0xD9, 0xA3, 0x3D, 0xA1, 0xBD, + 0x7D, 0x9E, 0xD2, 0xB9, 0x5D, 0x35, 0x02, 0xE0, 0xD4, 0xAF, 0x66, 0x56, 0x7D, 0xF4, 0x88, 0x74, + 0x3C, 0x28, 0x2C, 0xBA, 0x20, 0xC1, 0x2A, 0x93, 0xA9, 0xBA, 0x90, 0xE8, 0xC2, 0xE9, 0x15, 0xC8, + 0x8F, 0xBD, 0x27, 0xDE, 0x21, 0xBF, 0x56, 0x69, 0x93, 0x72, 0x7E, 0xE4, 0xE7, 0x7D, 0xE8, 0x4D, + 0xBF, 0x24, 0xA2, 0x77, 0xC0, 0xE0, 0x30, 0xD9, 0xEE, 0x82, 0xCD, 0x21, 0x60, 0xFC, 0xD1, 0x6F, + 0xB4, 0x40, 0x01, 0xFE, 0xF4, 0x73, 0xAF, 0xBB, 0xF6, 0x2B, 0x41, 0xFC, 0xDE, 0x74, 0x78, 0xE5, + 0x7E, 0xAB, 0xC9, 0xED, 0x63, 0x4B, 0x3E, 0x1A, 0x27, 0xCD, 0xBF, 0x85, 0xA4, 0x70, 0x92, 0x36, + 0x56, 0x70, 0x4A, 0xEE, 0x45, 0xAB, 0x33, 0x0A, 0x76, 0xB8, 0x0B, 0xEA, 0x55, 0xC7, 0x4E, 0xD7, + 0xD9, 0xC7, 0x10, 0x8D, 0x09, 0xFA, 0x10, 0x30, 0x62, 0x20, 0xE5, 0xBC, 0xFB, 0x74, 0x72, 0xA6, + 0x77, 0xB5, 0xBB, 0xD7, 0xD6, 0x60, 0x3A, 0x6B, 0x5D, 0xF5, 0x35, 0xF4, 0x84, 0xA0, 0x19, 0x49, + 0x36, 0x00, 0xC9, 0x35, 0xCC, 0xF7, 0xFE, 0x92, 0xF9, 0x4B, 0x8B, 0xB3, 0xBE, 0x98, 0xBF, 0xF4, + 0x25, 0xB1, 0x62, 0x4D, 0x41, 0xA0, 0xF7, 0x36, 0x6C, 0x86, 0x3C, 0x4F, 0xC4, 0xF8, 0xF2, 0xFC, + 0xE6, 0x34, 0x30, 0x95, 0x32, 0x9D, 0xE5, 0x85, 0x70, 0xD8, 0xB8, 0xD6, 0xD9, 0x42, 0xB9, 0x05, + 0x6E, 0x4B, 0x6F, 0x29, 0x33, 0x8E, 0xE4, 0x31, 0x3C, 0x21, 0x7B, 0x19, 0x31, 0x97, 0xD5, 0x62, + 0x6B, 0xF6, 0x98, 0x3C, 0xA5, 0x54, 0x18, 0x16, 0x03, 0x49, 0x51, 0x1F, 0x13, 0x37, 0xFB, 0x18, + 0x9D, 0xCF, 0x16, 0x43, 0x34, 0x7D, 0xB6, 0x5C, 0x9E, 0x74, 0x4D, 0x66, 0x23, 0x99, 0xDE, 0x6E, + 0x57, 0xFE, 0x47, 0x0D, 0x3B, 0x59, 0x3F, 0x01, 0x79, 0x75, 0x0D, 0x78, 0x62, 0x4A, 0xA5, 0xF2, + 0xF8, 0xD6, 0xAE, 0x11, 0x85, 0x88, 0x13, 0x98, 0x07, 0x0B, 0x92, 0x99, 0xC6, 0x9F, 0x85, 0x24, + 0xB1, 0x48, 0xEF, 0x59, 0x11, 0xCB, 0xAB, 0x92, 0xE4, 0x58, 0x50, 0xAA, 0xE8, 0x97, 0xD5, 0xCD, + 0x63, 0x57, 0x61, 0x62, 0x06, 0xBD, 0x26, 0x08, 0x0E, 0xC6, 0x42, 0x98, 0x8E, 0x82, 0x13, 0xD7, + 0xB8, 0x18, 0x7B, 0xAA, 0xFD, 0x42, 0x51, 0x07, 0xDE, 0x6F, 0xCF, 0xE7, 0x87, 0xF6, 0xBF, 0x15, + 0x8D, 0x8E, 0xFD, 0xA9, 0x4A, 0x45, 0x81, 0x57, 0x8F, 0x22, 0x4D, 0x63, 0x21, 0x4E, 0x41, 0x3C, + 0xCD, 0x77, 0xF5, 0xEC, 0xB8, 0x15, 0x8A, 0xBC, 0x69, 0x22, 0x98, 0xE5, 0xA4, 0x66, 0x47, 0xC5, + 0x9F, 0xE9, 0x9D, 0x06, 0xD8, 0xD2, 0x37, 0xA0, 0x4C, 0xDC, 0x33, 0xD4, 0xE7, 0xED, 0x77, 0x7D, + 0xA2, 0x20, 0x81, 0xB2, 0x46, 0xC5, 0xF6, 0xF5, 0x2A, 0x76, 0x50, 0xAF, 0xC2, 0x5A, 0xC7, 0x8F, + 0xD8, 0x3C, 0x4F, 0x2F, 0xE3, 0x56, 0x04, 0xB2, 0x6C, 0x8C, 0x0D, 0x84, 0xD7, 0xE0, 0xB5, 0x45, + 0xB2, 0x93, 0x34, 0xA0, 0xC2, 0xF4, 0x3A, 0x28, 0xDC, 0x50, 0xE8, 0xF3, 0xF0, 0x7C, 0x67, 0x1A, + 0x11, 0xD7, 0x8D, 0xB2, 0x71, 0x3D, 0xB3, 0x68, 0x49, 0x19, 0x29, 0x54, 0xDF, 0x44, 0xB9, 0x48, + 0xDD, 0x9E, 0xCE, 0xCD, 0x2D, 0x69, 0xB6, 0x18, 0xAD, 0xBC, 0xDC, 0xDF, 0x1F, 0x48, 0x04, 0x16, + 0xD6, 0x3A, 0x39, 0x7E, 0x30, 0xDB, 0x9D, 0xE1, 0x14, 0xF2, 0x5F, 0xDB, 0x1D, 0xBB, 0x7F, 0x4F, + 0x49, 0xBF, 0x4D, 0x2B, 0x9B, 0x5C, 0x7E, 0xA8, 0x1B, 0x79, 0x4F, 0x29, 0xA2, 0xF8, 0xBA, 0x36, + 0x86, 0x10, 0xFA, 0x7C, 0x45, 0x99, 0xE9, 0xD1, 0xDB, 0x93, 0xDB, 0x2A, 0xD5, 0xA8, 0x61, 0x48, + 0xBA, 0xD9, 0x40, 0xD7, 0xAE, 0xE5, 0x35, 0xAA, 0xF0, 0xA5, 0xFD, 0xC5, 0x64, 0x0B, 0x31, 0xA5, + 0x9D, 0x83, 0x31, 0xF6, 0xB8, 0xB5, 0x18, 0x3E, 0xB4, 0x2A, 0x8E, 0x70, 0x7A, 0xB8, 0xAC, 0xB5, + 0x92, 0xDD, 0x12, 0xA7, 0x9D, 0x41, 0xB1, 0x16, 0xE8, 0x45, 0x63, 0x1B, 0xB9, 0x73, 0xF1, 0x19, + 0xF6, 0xAE, 0x0F, 0xF3, 0xF7, 0x60, 0xED, 0x27, 0x70, 0x12, 0x8C, 0x12, 0x3A, 0xCF, 0xA6, 0xDC, + 0xBD, 0x17, 0x82, 0x05, 0x6E, 0x10, 0x04, 0xD4, 0xE7, 0x10, 0x9B, 0x83, 0x55, 0xB0, 0xED, 0x1B, + 0xF9, 0x7D, 0x75, 0x8E, 0xB2, 0x26, 0xA7, 0xBD, 0xE2, 0x0F, 0x29, 0x25, 0x6C, 0xFD, 0xC9, 0xC4, + 0x72, 0xE1, 0x1C, 0xDC, 0x9E, 0xBE, 0x69, 0xB5, 0xE8, 0x31, 0x83, 0x03, 0x5A, 0xEA, 0xA3, 0x52, + 0xD7, 0x51, 0x8A, 0x76, 0xB8, 0x83, 0xF0, 0x5E, 0xDC, 0xFC, 0xED, 0x80, 0x36, 0x7A, 0x39, 0xC6, + 0xFC, 0xF3, 0xC3, 0xE1, 0x5D, 0x15, 0x05, 0x30, 0xF6, 0x74, 0x93, 0x45, 0xB5, 0x2B, 0x0B, 0x63, + 0x2E, 0xF1, 0x24, 0x4B, 0x16, 0xD9, 0x61, 0xDB, 0x97, 0x9A, 0xC8, 0xFF, 0xCE, 0x74, 0xE9, 0x39, + 0x93, 0x00, 0xF8, 0xE0, 0x50, 0x62, 0x07, 0x0A, 0x6B, 0xB4, 0xBA, 0x2B, 0x61, 0x09, 0x25, 0x58, + 0x18, 0x0A, 0xB8, 0xDA, 0x8D, 0xFA, 0x8C, 0x4A, 0x41, 0xBE, 0xA4, 0x51, 0x9B, 0x83, 0x14, 0xC4, + 0xB5, 0x81, 0xB0, 0xA1, 0x35, 0x48, 0x34, 0xEB, 0xAF, 0x74, 0xF4, 0x61, 0xC5, 0x00, 0x39, 0x7D, + 0xAD, 0xF1, 0x07, 0x9C, 0x43, 0x20, 0x8F, 0x4B, 0x3D, 0xD3, 0x7C, 0x91, 0x1D, 0xC3, 0x3B, 0x06, + 0x50, 0x59, 0xA9, 0xC9, 0xA3, 0x23, 0xC9, 0xA6, 0x8A, 0x29, 0x84, 0x0D, 0x7D, 0xEE, 0x56, 0x5D, + 0xA1, 0xB6, 0xA3, 0xE7, 0x1F, 0x2A, 0xFB, 0x95, 0x7B, 0xFC, 0x9F, 0x9A, 0x18, 0xEA, 0xFF, 0xFD, + 0x61, 0x75, 0x3A, 0xF2, 0x22, 0xFF, 0xEB, 0xA2, 0x7C, 0x5A, 0x16, 0xB1, 0xE9, 0x93, 0xB0, 0x4D, + 0xA7, 0xA4, 0xB0, 0xAF, 0x70, 0x8C, 0x7E, 0x7D, 0xE8, 0x4F, 0xAA, 0x9D, 0x81, 0xD6, 0xF8, 0xB5, + 0xB6, 0x32, 0xA5, 0x31, 0xA1, 0x55, 0x11, 0x3A, 0x01, 0x13, 0x38, 0x3A, 0x41, 0x7A, 0x79, 0x31, + 0x3C, 0x13, 0xF5, 0x2C, 0x97, 0x28, 0xBD, 0x1F, 0x2E, 0x68, 0xAB, 0xA1, 0x52, 0x5F, 0xBB, 0x2A, + 0xCB, 0x11, 0xFE, 0x4A, 0x34, 0x30, 0xCD, 0xDD, 0x38, 0xAC, 0xED, 0xD0, 0x53, 0xC6, 0xC4, 0x33, + 0xE5, 0x17, 0x41, 0xC8, 0x7D, 0x14, 0x9C, 0x8C, 0x2D, 0x59, 0x61, 0xB1, 0xEC, 0x6A, 0x48, 0xAD, + 0xC7, 0x42, 0x79, 0x9B, 0x63, 0xDB, 0xB0, 0xAD, 0xAF, 0x44, 0x85, 0x2E, 0x24, 0x11, 0xE6, 0x1E, + 0x56, 0xB2, 0x1B, 0x2E, 0x98, 0x7E, 0x64, 0x3D, 0x98, 0x69, 0x51, 0x05, 0x3D, 0x5C, 0x0A, 0x85, + 0xCA, 0x58, 0x0E, 0x11, 0x86, 0xA7, 0xD6, 0xAC, 0xFF, 0x21, 0x12, 0x9F, 0xA1, 0x52, 0xE4, 0xD9, + 0xD5, 0xAC, 0x9B, 0xE2, 0x4B, 0xF0, 0x57, 0xFA, 0xFC, 0x05, 0x84, 0xB6, 0xD9, 0xB0, 0xCE, 0x5E, + 0xA0, 0x73, 0x32, 0xCE, 0x15, 0x29, 0xE8, 0x8F, 0xC4, 0xD9, 0x22, 0x3A, 0x9D, 0x71, 0xC5, 0x37, + 0x2B, 0x33, 0x76, 0x63, 0x49, 0x52, 0x8A, 0x2E, 0x89, 0x6D, 0x5A, 0x04, 0x83, 0xC1, 0xD9, 0x46, + 0xC3, 0x5C, 0x93, 0x6C, 0x3B, 0xDB, 0xFC, 0x1C, 0xC1, 0x65, 0x3B, 0x2C, 0xAD, 0xD5, 0x78, 0x9A, + 0x3A, 0xE4, 0xC3, 0x04, 0x11, 0xD8, 0xBD, 0x63, 0xA9, 0x93, 0x01, 0xF1, 0x42, 0x89, 0x5E, 0x66, + 0x95, 0xF2, 0x75, 0x38, 0x30, 0x4B, 0x39, 0x41, 0x49, 0x54, 0x8E, 0x12, 0x36, 0xFB, 0x9A, 0xA0, + 0x61, 0x13, 0x1C, 0xC2, 0xB2, 0x30, 0x7E, 0xD5, 0x22, 0xEB, 0xA3, 0xB6, 0x69, 0x2E, 0x0F, 0x0B, + 0xB0, 0x29, 0xF3, 0x24, 0x5A, 0x29, 0xA6, 0x3F, 0xC9, 0xC1, 0x56, 0xC5, 0x8E, 0xAA, 0x0B, 0x17, + 0x44, 0xBC, 0xFF, 0xE3, 0x12, 0xB8, 0x3E, 0xA9, 0x16, 0xF9, 0x7F, 0x57, 0x92, 0x7C, 0x0C, 0xFD, + 0x87, 0x9D, 0x70, 0xED, 0x81, 0xD0, 0x77, 0x01, 0x77, 0x71, 0xF5, 0x6C, 0x7F, 0xCC, 0xE4, 0xF0, + 0xAD, 0x27, 0x66, 0x2D, 0x16, 0x7B, 0x4E, 0x95, 0xF9, 0x59, 0xAA, 0x8A, 0x83, 0xE3, 0x1E, 0xD9, + 0x6E, 0x9C, 0x84, 0xEB, 0xBD, 0x5B, 0x33, 0x68, 0xA9, 0x3F, 0xDA, 0x69, 0xCB, 0xF1, 0xC7, 0x64, + 0x99, 0x27, 0xEF, 0xFF, 0xE2, 0x37, 0x34, 0x2D, 0x3C, 0x92, 0xAF, 0x7B, 0xE6, 0x6D, 0x7E, 0xF9, + 0xD2, 0x95, 0x14, 0xF1, 0x01, 0x93, 0xF2, 0xBD, 0xDF, 0x59, 0x67, 0xF6, 0x2D, 0x36, 0xBB, 0x8E, + 0x16, 0xCA, 0x07, 0xEC, 0x34, 0xA0, 0xE2, 0x16, 0x6C, 0xEC, 0x23, 0x41, 0x87, 0x7A, 0x66, 0x82, + 0x09, 0x6A, 0xFE, 0x21, 0xB3, 0x9A, 0xC7, 0x12, 0x0D, 0x07, 0xEB, 0xCF, 0xCB, 0x44, 0x9B, 0xA3, + 0xA1, 0xD9, 0x07, 0x76, 0x1D, 0x93, 0x96, 0x1B, 0x6D, 0xA1, 0x65, 0x6D, 0xB2, 0x62, 0x81, 0x55, + 0xFD, 0xE1, 0x76, 0xF2, 0x6F, 0x9A, 0x71, 0x9F, 0xFC, 0x48, 0x8D, 0x58, 0x1D, 0x3E, 0xFE, 0xBC, + 0x02, 0xB5, 0x36, 0xEE, 0x58, 0x35, 0x82, 0xF3, 0x51, 0x93, 0x35, 0x7E, 0xFA, 0xAF, 0x7E, 0x56, + 0x7E, 0xE8, 0x59, 0x7E, 0x90, 0x73, 0x9B, 0x0E, 0x4D, 0x0D, 0x84, 0x75, 0x30, 0x29, 0xCA, 0xE7, + 0x2C, 0xB3, 0xAC, 0x53, 0x3C, 0xC3, 0x7D, 0x55, 0xCD, 0xE0, 0xB9, 0xF8, 0x44, 0x02, 0xF2, 0x2B, + 0xB7, 0xD1, 0x83, 0x75, 0xDC, 0x96, 0xE7, 0x62, 0x5A, 0x58, 0x63, 0x2D, 0xC1, 0x33, 0xD2, 0x74, + 0x27, 0x05, 0xFD, 0xB7, 0x69, 0x63, 0x34, 0x81, 0xDB, 0xC1, 0x24, 0x10, 0x3A, 0xC2, 0xE2, 0xE9, + 0x75, 0xF8, 0x90, 0x50, 0x3A, 0x3C, 0xAF, 0xCD, 0x4E, 0x78, 0xB0, 0xFA, 0x5F, 0x2C, 0x09, 0x90, + 0xFE, 0xDA, 0xE4, 0x99, 0x8E, 0x3E, 0x63, 0x74, 0x3C, 0x6C, 0xD6, 0xC5, 0x2A, 0x1A, 0xBD, 0x95, + 0xA3, 0xAB, 0xF3, 0xEF, 0x1E, 0x95, 0x02, 0x8E, 0xCB, 0x23, 0xED, 0x11, 0xDB, 0x42, 0x45, 0xD5, + 0x5D, 0xDF, 0xF6, 0xE5, 0x98, 0xB4, 0x46, 0x49, 0x1A, 0xC6, 0x87, 0xFC, 0xA1, 0x79, 0x15, 0xD8, + 0x84, 0x99, 0xFE, 0x0B, 0x33, 0x30, 0x21, 0xA7, 0x59, 0x0A, 0x35, 0xE6, 0x68, 0x62, 0x55, 0x58, + 0xB4, 0x74, 0xDC, 0x80, 0xA4, 0xAD, 0x97, 0x57, 0x08, 0x9D, 0xC9, 0x9C, 0x1C, 0x0E, 0xD6, 0xE5, + 0xE3, 0xC8, 0x13, 0x02, 0xA8, 0xB9, 0x06, 0x27, 0x55, 0x89, 0xE7, 0xA3, 0xBF, 0xB0, 0xA6, 0xD0, + 0x92, 0xAD, 0xDA, 0xFE, 0x9E, 0x38, 0x2B, 0x88, 0x18, 0x7E, 0x3E, 0x90, 0xC3, 0xC0, 0x90, 0xAB, + 0x10, 0x21, 0x49, 0x47, 0xD1, 0x9D, 0x0A, 0xE9, 0x9F, 0xF9, 0xBB, 0x44, 0x83, 0x43, 0xBE, 0xBB, + 0x72, 0xD3, 0x06, 0xB4, 0x1B, 0x11, 0x03, 0xB8, 0xF5, 0xE5, 0x85, 0x1C, 0x4D, 0x7B, 0x0E, 0x65, + 0x33, 0xB0, 0x06, 0xD4, 0x58, 0x1F, 0xC9, 0x52, 0x27, 0xAD, 0xC9, 0xDE, 0x33, 0x4D, 0xC5, 0x45, + 0x6F, 0x11, 0xE1, 0x1D, 0xB9, 0x26, 0xED, 0x5B, 0x9B, 0xF6, 0xFC, 0x87, 0xF7, 0x96, 0x58, 0x5D, + 0xD7, 0x10, 0x15, 0x59, 0x1E, 0x3C, 0xFC, 0xF2, 0x8C, 0x7B, 0xB8, 0x70, 0x35, 0xD2, 0xB3, 0xA2, + 0xF1, 0xE7, 0x9D, 0xC6, 0xAE, 0x37, 0x71, 0xDA, 0x04, 0x32, 0x09, 0x33, 0xF7, 0x7D, 0x45, 0x33, + 0x9F, 0x5C, 0xD6, 0x66, 0xEC, 0x68, 0xCA, 0xEC, 0xBF, 0x4C, 0xF8, 0xA1, 0x4D, 0x5C, 0x41, 0x0E, + 0x69, 0x1F, 0x96, 0xE8, 0xD9, 0x76, 0xB9, 0xEA, 0x04, 0xEF, 0x91, 0xD4, 0xD7, 0x36, 0xEF, 0xE9, + 0xE6, 0x7B, 0x81, 0x31, 0xFD, 0x4E, 0x15, 0x17, 0xF1, 0x25, 0x86, 0x4C, 0x94, 0x2A, 0xAA, 0x50, + 0xB0, 0x98, 0x19, 0xB4, 0x34, 0x81, 0xE2, 0x61, 0xE6, 0xEE, 0x9C, 0x70, 0x72, 0x38, 0xB8, 0xE8, + 0xA6, 0xE1, 0x9F, 0x24, 0xDC, 0xD2, 0x9D, 0xC3, 0x94, 0x43, 0x65, 0x5B, 0x22, 0x45, 0xF2, 0x75, + 0x33, 0x6D, 0xB9, 0x60, 0xC6, 0x9F, 0x0A, 0xC1, 0x1F, 0xFC, 0x8B, 0x7B, 0xAB, 0x71, 0x61, 0xAE, + 0xD2, 0x1B, 0xF6, 0x79, 0x3D, 0x63, 0x1F, 0x4F, 0x1C, 0xDD, 0x4B, 0x50, 0x02, 0x97, 0xCD, 0xF4, + 0xC7, 0x0B, 0xFC, 0xB3, 0xD1, 0x21, 0xD3, 0x73, 0x1B, 0x4B, 0xE8, 0x9F, 0x3D, 0x16, 0x88, 0x0E, + 0x7F, 0xCC, 0x26, 0xA6, 0xF5, 0x8F, 0x69, 0x7F, 0xAC, 0xE8, 0x3F, 0x7B, 0x29, 0x81, 0xDA, 0x14, + 0x8F, 0x98, 0x78, 0x11, 0x34, 0x46, 0x60, 0xAD, 0x9E, 0xB3, 0x69, 0xFD, 0x74, 0x95, 0x3A, 0x14, + 0x30, 0xBE, 0x34, 0xE2, 0xAC, 0x54, 0x81, 0x70, 0x1F, 0x47, 0xD7, 0x5A, 0xDE, 0x81, 0x29, 0x17, + 0x9B, 0x3F, 0xC7, 0x57, 0x56, 0x26, 0xCD, 0xF8, 0x3B, 0x4E, 0x94, 0x4E, 0xA4, 0x09, 0x46, 0x1A, + 0x6D, 0xA3, 0x44, 0x51, 0xA9, 0x9F, 0x97, 0x88, 0x5E, 0x5E, 0x70, 0xCA, 0xDE, 0xA4, 0xAF, 0x6D, + 0xBC, 0xCE, 0xF6, 0x67, 0x81, 0x10, 0xD3, 0xF5, 0xB8, 0xC9, 0x49, 0xF3, 0x98, 0x71, 0x2D, 0x29, + 0xBD, 0x34, 0x08, 0x25, 0x1B, 0x9A, 0x6F, 0xC3, 0x4D, 0xC3, 0x9F, 0x5E, 0xE2, 0xA2, 0xF3, 0x82, + 0x52, 0xA9, 0xF6, 0x79, 0x14, 0x6F, 0xD0, 0x12, 0xB6, 0x0D, 0x4C, 0xAC, 0x3E, 0x2A, 0x8C, 0x86, + 0xE1, 0xFF, 0x1C, 0x49, 0x43, 0xF2, 0x1D, 0x34, 0xA3, 0x0F, 0xA3, 0x9B, 0x2C, 0xF3, 0x9C, 0xFC, + 0x23, 0x4B, 0xE0, 0xCB, 0xE6, 0xBE, 0x7E, 0x8B, 0x51, 0x2D, 0x32, 0x92, 0xCC, 0xC6, 0xDB, 0x36, + 0x1B, 0x83, 0x80, 0x64, 0xD2, 0x23, 0x1C, 0x60, 0x90, 0x1C, 0x71, 0x06, 0x0F, 0x30, 0xC0, 0xDF, + 0xFE, 0xF7, 0x50, 0x5A, 0xF8, 0x9C, 0x97, 0x29, 0xFB, 0x7B, 0xEB, 0x91, 0x6A, 0x42, 0xE4, 0xAB, + 0x62, 0xB4, 0x1F, 0x14, 0xEC, 0x1A, 0x9F, 0xC4, 0x98, 0x77, 0x85, 0x8B, 0xF1, 0x15, 0x2B, 0x2C, + 0x3F, 0xAB, 0x3A, 0x5E, 0xD3, 0x50, 0x32, 0xDD, 0x23, 0x81, 0x89, 0x3B, 0xB8, 0xFD, 0x49, 0x78, + 0xA9, 0x35, 0x20, 0x2D, 0xBC, 0xFC, 0x10, 0x8A, 0x08, 0xA0, 0x57, 0x24, 0xFA, 0x29, 0xD3, 0x9C, + 0xC0, 0xC5, 0x06, 0xF2, 0x7D, 0xC4, 0x45, 0x38, 0x1F, 0xC6, 0xE4, 0xC8, 0x23, 0x65, 0xD2, 0x5A, + 0xE5, 0xCD, 0x63, 0x14, 0x56, 0x03, 0xAA, 0x29, 0x82, 0xAB, 0x67, 0x92, 0x2C, 0x71, 0x67, 0x6A, + 0x36, 0xF9, 0xE1, 0x89, 0xD2, 0x98, 0x88, 0x97, 0x65, 0x72, 0xE4, 0x3C, 0x5A, 0x1D, 0xB7, 0x34, + 0x4D, 0x01, 0x91, 0x5D, 0xC4, 0xAF, 0x88, 0x2F, 0xD1, 0x27, 0x26, 0x36, 0x16, 0x98, 0x39, 0x9A, + 0xEA, 0xFA, 0xDF, 0x3B, 0x7F, 0xD8, 0x76, 0x95, 0xDB, 0x03, 0x82, 0x86, 0xD0, 0x6D, 0x15, 0xD0, + 0xF0, 0xB9, 0xCC, 0xB9, 0xD6, 0xE1, 0x9C, 0xC7, 0xAE, 0x3C, 0xA8, 0xB9, 0x49, 0xA3, 0xC4, 0xB3, + 0x24, 0x3A, 0xA3, 0x50, 0x7E, 0xDF, 0xBE, 0x5F, 0xAF, 0xC3, 0x7C, 0x3C, 0xC7, 0x39, 0xD9, 0x29, + 0x06, 0xD5, 0x0B, 0xE8, 0xFA, 0x80, 0xC2, 0xCE, 0xA8, 0xD9, 0x20, 0xCE, 0x28, 0x0A, 0xDE, 0x15, + 0xB5, 0x0D, 0x9A, 0xB8, 0xB0, 0x7B, 0x33, 0xB8, 0x35, 0xEB, 0x4E, 0xDE, 0xF5, 0x9F, 0x66, 0x79, + 0x52, 0x44, 0xD2, 0x49, 0x3A, 0x94, 0xE2, 0xCB, 0x83, 0x22, 0x7D, 0xC6, 0x1C, 0xEB, 0x44, 0x28, + 0xE9, 0x38, 0x8F, 0xB7, 0xF6, 0x3D, 0x39, 0x8F, 0x64, 0x9F, 0x86, 0x85, 0x27, 0x7E, 0xBF, 0xD8, + 0xC3, 0x8B, 0x70, 0xF9, 0x7A, 0xE6, 0x19, 0xAF, 0xA8, 0x8F, 0x6C, 0x38, 0xE2, 0xB4, 0x1E, 0xF3, + 0xDD, 0xFD, 0x6C, 0xB4, 0x04, 0xB4, 0xD1, 0x37, 0xF4, 0x59, 0xFF, 0x5A, 0x8B, 0x73, 0x6B, 0x62, + 0x6C, 0x91, 0x23, 0x96, 0x61, 0xEC, 0x9F, 0xF6, 0x83, 0x18, 0xD9, 0xEE, 0xEF, 0x00, 0xB0, 0xEB, + 0x8D, 0xC6, 0x35, 0xCE, 0xB4, 0xE0, 0xBB, 0x84, 0xD3, 0xD7, 0xDB, 0x77, 0x4A, 0x07, 0xE7, 0x3B, + 0xF7, 0x12, 0xF8, 0x9D, 0xF5, 0x0A, 0xDF, 0xF4, 0x1B, 0x00, 0x1A, 0x77, 0xD9, 0x03, 0x21, 0xC2, + 0x46, 0xF7, 0x7E, 0x4B, 0xE2, 0xC1, 0xF1, 0x8D, 0xFE, 0x61, 0xB9, 0xD4, 0x0B, 0xC9, 0x65, 0x82, + 0xCF, 0x7F, 0x3D, 0x24, 0x9E, 0xC9, 0x97, 0x30, 0xE9, 0x81, 0xB4, 0x6B, 0xA5, 0x6A, 0xA7, 0xED, + 0xE3, 0x8F, 0x88, 0x09, 0x78, 0x36, 0x6A, 0x14, 0xB9, 0xBB, 0x93, 0xE6, 0xA2, 0x07, 0x72, 0x81, + 0xD2, 0x41, 0x75, 0x28, 0x50, 0x57, 0xDE, 0x68, 0x04, 0xB1, 0x0F, 0x1F, 0xCF, 0x0F, 0x3E, 0xCB, + 0x44, 0x3D, 0x2A, 0x01, 0xC1, 0x38, 0x61, 0x8E, 0xA1, 0x13, 0xB8, 0x82, 0x3F, 0xAC, 0xA7, 0x31, + 0x7B, 0xF7, 0xA7, 0xCD, 0xBF, 0x15, 0xD3, 0xC2, 0xCC, 0xDC, 0xD0, 0xB2, 0xC1, 0x44, 0xBA, 0x82, + 0x85, 0x2D, 0x59, 0x53, 0xE4, 0xBE, 0x6B, 0x69, 0x8F, 0x5C, 0x20, 0x38, 0x76, 0xE0, 0x49, 0x59, + 0x32, 0x0A, 0x90, 0x42, 0x13, 0x35, 0x24, 0x71, 0xD9, 0x98, 0x9A, 0x0F, 0x0A, 0x83, 0x90, 0x47, + 0xD0, 0x57, 0x29, 0xC8, 0xF5, 0x5B, 0xA8, 0x5D, 0x41, 0xCD, 0x61, 0x98, 0x5C, 0x28, 0x1B, 0xF2, + 0x9B, 0x31, 0x3F, 0x14, 0x79, 0x37, 0xEA, 0xDD, 0x42, 0xD3, 0x59, 0x20, 0x0D, 0x5A, 0x3D, 0x59, + 0x84, 0x1A, 0x48, 0x28, 0x6D, 0x48, 0x3B, 0x0C, 0x87, 0xB0, 0xBB, 0xEF, 0x72, 0x91, 0x85, 0xE0, + 0x9A, 0x2C, 0x78, 0xAF, 0xFE, 0x0D, 0x6D, 0x9A, 0x99, 0x10, 0x16, 0x7D, 0x42, 0x76, 0xA0, 0xAA, + 0xC7, 0xF9, 0x11, 0x5C, 0x04, 0x83, 0x0A, 0xA9, 0x48, 0x65, 0x28, 0x81, 0x65, 0x2E, 0xA7, 0x5A, + 0xFE, 0xDB, 0x10, 0x56, 0xEA, 0x19, 0x67, 0xC2, 0x61, 0xBB, 0x9B, 0x6B, 0x48, 0x4F, 0x22, 0x4C, + 0xB7, 0xEC, 0x15, 0x84, 0x08, 0x1A, 0xFE, 0x08, 0x46, 0xCA, 0x72, 0x10, 0x30, 0x81, 0xAE, 0xE7, + 0x1B, 0xAA, 0x2F, 0x1B, 0x22, 0x6A, 0x89, 0x95, 0x34, 0x9F, 0x53, 0xE4, 0xDA, 0x0B, 0x1B, 0x56, + 0xB4, 0xB7, 0x71, 0x99, 0xB8, 0x77, 0x91, 0xEB, 0x59, 0x61, 0x71, 0x84, 0xAF, 0x55, 0xBD, 0x33, + 0x1C, 0xD9, 0x7A, 0x40, 0xD3, 0x7B, 0x6C, 0xB0, 0xA4, 0x96, 0x07, 0x57, 0x49, 0x9C, 0xC1, 0x0B, + 0x23, 0xF3, 0xE5, 0x36, 0xA4, 0xE8, 0xE1, 0xEC, 0x51, 0xF1, 0xBB, 0x7B, 0x40, 0x4B, 0x05, 0xD1, + 0x3D, 0xD6, 0x6D, 0x22, 0x7C, 0x9D, 0x51, 0x28, 0x70, 0xF6, 0xB3, 0x0C, 0x6F, 0xB2, 0xE1, 0xBC, + 0xFF, 0xB8, 0xA3, 0x92, 0x7C, 0x0A, 0xA3, 0x36, 0x6D, 0xF8, 0xFC, 0x27, 0x45, 0x58, 0x94, 0xE0, + 0x0A, 0x90, 0xF8, 0x2A, 0xF3, 0x02, 0xA4, 0x98, 0xD8, 0xEF, 0x1C, 0x53, 0xE2, 0x47, 0xC7, 0x20, + 0xB2, 0x6F, 0xB7, 0x39, 0x5A, 0xA9, 0x49, 0xC2, 0x65, 0x18, 0x50, 0xBD, 0x7F, 0xB0, 0xDE, 0xBB, + 0x2F, 0x56, 0xDD, 0x62, 0x85, 0xAC, 0x3B, 0x7E, 0xCD, 0x00, 0x88, 0x7A, 0x22, 0xC5, 0x03, 0x03, + 0x26, 0xC4, 0x27, 0x09, 0xE8, 0x16, 0x36, 0xB7, 0x0B, 0xDF, 0xDA, 0x21, 0xEB, 0x59, 0xE8, 0x6D, + 0x96, 0x2D, 0x18, 0x89, 0xD4, 0x4E, 0x5A, 0x66, 0x63, 0x31, 0x15, 0xF0, 0x48, 0x50, 0x7A, 0xF3, + 0xA7, 0x82, 0xE0, 0x91, 0x04, 0xB2, 0x16, 0xAC, 0xA1, 0xD4, 0xC1, 0xE4, 0xBD, 0xC9, 0x43, 0x83, + 0xD9, 0x18, 0x11, 0x50, 0xC0, 0x93, 0x9D, 0x6B, 0x17, 0x63, 0xC8, 0xA3, 0xAF, 0xAC, 0xBF, 0x29, + 0x65, 0xA6, 0x4A, 0xE4, 0xCD, 0xE2, 0x89, 0x59, 0xF8, 0x96, 0xF8, 0x3B, 0x80, 0xCA, 0x68, 0xF2, + 0xBF, 0xBE, 0xFD, 0xD0, 0x84, 0x88, 0xE3, 0x3D, 0x08, 0x8A, 0x08, 0x39, 0xDC, 0x88, 0x71, 0x61, + 0x76, 0xAD, 0xB6, 0xBE, 0xC0, 0xA4, 0x28, 0xEE, 0x38, 0x8F, 0x2E, 0x8D, 0x3A, 0x28, 0xAE, 0xEB, + 0x93, 0x7E, 0xF4, 0x2E, 0x5F, 0x3B, 0xEA, 0x37, 0x9A, 0x53, 0x6C, 0xC5, 0x3A, 0x2F, 0x7F, 0xA9, + 0x80, 0x85, 0x18, 0xFE, 0x14, 0x0C, 0x37, 0xA7, 0xE2, 0x78, 0x90, 0x20, 0x1F, 0x41, 0x1C, 0x03, + 0xD1, 0xD0, 0x8C, 0xB2, 0x2D, 0x4C, 0x32, 0x81, 0x63, 0xF6, 0x6F, 0xD3, 0x7F, 0xB4, 0x6D, 0xA8, + 0xD6, 0xE0, 0x56, 0x84, 0xAD, 0x37, 0x96, 0x44, 0xB4, 0xAE, 0x6F, 0x49, 0x3E, 0x30, 0x0C, 0x79, + 0xE3, 0x93, 0xBA, 0xD2, 0x10, 0x71, 0xAC, 0x7C, 0x06, 0x89, 0x26, 0xCB, 0x72, 0x9E, 0xC4, 0xCC, + 0xBB, 0xA1, 0xDE, 0x9B, 0x66, 0x75, 0x6F, 0xAC, 0x51, 0x93, 0xE8, 0xF4, 0x43, 0xE4, 0x79, 0xF2, + 0x50, 0x67, 0x3D, 0x1B, 0x33, 0xB5, 0xEC, 0x93, 0x10, 0xCE, 0x78, 0x3C, 0x0C, 0x25, 0x44, 0x30, + 0x3C, 0xAB, 0x40, 0x6F, 0x4B, 0x54, 0x0C, 0x38, 0xD4, 0xEF, 0x18, 0xED, 0xA5, 0x75, 0x1E, 0x9C, + 0x06, 0x42, 0x11, 0x9D, 0xEC, 0xE8, 0x81, 0x38, 0xBE, 0xEF, 0x21, 0xB5, 0x0A, 0xC3, 0x38, 0x94, + 0x0C, 0x5A, 0xE2, 0x47, 0xDC, 0x2E, 0x82, 0xC3, 0xA6, 0x9D, 0xA6, 0x54, 0x5E, 0xE6, 0x7C, 0xFE, + 0x7E, 0x7B, 0x86, 0x9A, 0x54, 0xEC, 0xCD, 0xE5, 0x9F, 0xF7, 0x23, 0xDE, 0x06, 0x90, 0x93, 0xB6, + 0xCC, 0xC8, 0x3D, 0x75, 0xA6, 0x43, 0xEA, 0x1F, 0x44, 0xAB, 0xBB, 0x15, 0xC4, 0xAB, 0xB1, 0xDF, + 0xE9, 0x30, 0xB4, 0xB2, 0x3B, 0x5B, 0xA6, 0x57, 0xEE, 0x25, 0x4B, 0x83, 0x26, 0xE4, 0x6B, 0xE3, + 0x35, 0x62, 0xA5, 0xD2, 0xB6, 0xDE, 0xFD, 0x5F, 0x8C, 0x21, 0xF8, 0x15, 0x41, 0x1C, 0x61, 0xCD, + 0x78, 0x0F, 0x61, 0x9E, 0x0C, 0x7E, 0x88, 0xE3, 0x34, 0x7F, 0x0B, 0x00, 0x5D, 0x8A, 0x37, 0x5F, + 0xFB, 0x65, 0xB8, 0xEC, 0x6C, 0x6A, 0x7E, 0x8F, 0x70, 0x6A, 0x17, 0xFB, 0x6B, 0x9D, 0xD8, 0xC3, + 0xD5, 0x13, 0x49, 0xEC, 0xD0, 0xEC, 0x1B, 0xC7, 0x79, 0xBB, 0xD2, 0x89, 0x96, 0x39, 0x1C, 0xF3, + 0x70, 0xEA, 0xF0, 0xEA, 0x6B, 0x45, 0x51, 0xDB, 0x1A, 0x61, 0x60, 0x98, 0x1C, 0x7A, 0xA6, 0x48, + 0x65, 0xDA, 0x85, 0xBE, 0x6B, 0xC4, 0x27, 0x2F, 0x76, 0x6D, 0x5F, 0x4C, 0xDE, 0x92, 0xA1, 0xB3, + 0xD4, 0x11, 0xB4, 0x0B, 0x3A, 0x4C, 0x73, 0xC3, 0xAA, 0x9C, 0x0F, 0x95, 0x9B, 0x2C, 0x67, 0x02, + 0x47, 0xCD, 0xE3, 0x75, 0x84, 0x60, 0x5E, 0x17, 0xAB, 0xF0, 0xBC, 0xBE, 0xB4, 0xAA, 0x4C, 0xEA, + 0x11, 0x52, 0x87, 0xAC, 0x16, 0x56, 0x06, 0x1F, 0xC1, 0x97, 0xF9, 0xAB, 0x26, 0xD9, 0xCC, 0x58, + 0x01, 0xFF, 0x44, 0x21, 0xFE, 0x5D, 0x53, 0x0B, 0xA2, 0xAF, 0xBC, 0x9D, 0x63, 0x25, 0x87, 0x66, + 0xB3, 0x79, 0xB4, 0x9F, 0x49, 0xE6, 0x6E, 0xCB, 0x8B, 0x39, 0x8C, 0x46, 0x60, 0x3D, 0x5B, 0xEC, + 0x08, 0x1B, 0xB2, 0xEC, 0xA2, 0xAA, 0x9A, 0xDA, 0xAA, 0xAD, 0x25, 0xAB, 0x45, 0x99, 0x63, 0x23, + 0x6C, 0x53, 0x87, 0xA0, 0x5A, 0x6C, 0xD6, 0xE3, 0x6C, 0x34, 0x42, 0x0F, 0xF3, 0xA0, 0x23, 0xD3, + 0x16, 0x05, 0xAB, 0x05, 0x14, 0xA8, 0xA9, 0x02, 0x23, 0xFC, 0xC0, 0xED, 0x75, 0xC5, 0x43, 0x7C, + 0x1E, 0xB1, 0x69, 0xB6, 0x01, 0x96, 0x7B, 0x9E, 0x12, 0x1C, 0x72, 0x42, 0x0D, 0xAB, 0x0B, 0x79, + 0x22, 0xF3, 0xF0, 0xEB, 0x71, 0x83, 0x42, 0x3C, 0x11, 0xC7, 0x4F, 0x87, 0xFF, 0x5D, 0x19, 0x0B, + 0xE4, 0x1E, 0xC3, 0xA2, 0xD7, 0x0E, 0x9C, 0x3C, 0x7D, 0xFB, 0x4F, 0xDA, 0x99, 0x9F, 0xF8, 0x3E, + 0xD4, 0xA0, 0xA2, 0xF8, 0x83, 0x33, 0x1E, 0xE2, 0x1C, 0x52, 0x9D, 0xB8, 0x63, 0x8F, 0xA1, 0x4D, + 0x68, 0xAE, 0xCE, 0xD4, 0x12, 0x8E, 0x96, 0xA1, 0x78, 0x27, 0x6A, 0x29, 0x11, 0x19, 0x4C, 0x94, + 0x89, 0x0F, 0xFB, 0x7C, 0xA8, 0xAC, 0x7E, 0x84, 0x44, 0xC8, 0x7A, 0x18, 0xAE, 0x34, 0x0F, 0x6E, + 0x90, 0xDB, 0x1E, 0x79, 0xFA, 0xE8, 0xAF, 0x71, 0xE4, 0x80, 0x24, 0x53, 0x2F, 0xB6, 0xC2, 0x12, + 0x1F, 0xA0, 0x44, 0x98, 0x40, 0xAE, 0x01, 0xD6, 0xFB, 0x86, 0xBB, 0xC6, 0xF7, 0x2F, 0x38, 0x41, + 0xE3, 0x2E, 0x1F, 0x2E, 0x7C, 0x90, 0x1F, 0xD9, 0xD3, 0x34, 0x86, 0xC8, 0xA3, 0x8E, 0xAB, 0x5E, + 0x05, 0x55, 0x71, 0x5B, 0x21, 0xB7, 0x2F, 0x9E, 0x56, 0x32, 0x56, 0xD1, 0xDC, 0xC9, 0xDA, 0xDE, + 0xAC, 0x1D, 0x91, 0x0E, 0x4D, 0x1F, 0x4F, 0xE7, 0x31, 0xFE, 0x9A, 0x3F, 0x18, 0xAD, 0x85, 0x4E, + 0x66, 0x95, 0x76, 0x67, 0x6A, 0xC8, 0x90, 0x6A, 0xB5, 0xB0, 0x7D, 0xB2, 0xB3, 0xD7, 0xD6, 0x42, + 0xF1, 0x63, 0x52, 0xBD, 0x72, 0xE1, 0xD2, 0x63, 0x9A, 0x00, 0x45, 0x8E, 0x77, 0xCF, 0x93, 0xCF, + 0x1A, 0x31, 0xAA, 0x16, 0xA9, 0xCF, 0x45, 0xE3, 0x99, 0x3E, 0x6C, 0x70, 0xE9, 0x93, 0x83, 0x78, + 0x11, 0xB8, 0x80, 0xEA, 0x75, 0x5A, 0x87, 0xCE, 0x1D, 0xCD, 0x12, 0x5F, 0x1F, 0x6F, 0x86, 0x25, + 0x5E, 0x95, 0x22, 0x07, 0xFE, 0x29, 0xDA, 0x93, 0x52, 0x41, 0x62, 0x79, 0x06, 0x06, 0x83, 0xAE, + 0x42, 0x35, 0x5C, 0x9E, 0x01, 0xF8, 0xFA, 0x3F, 0x07, 0x15, 0xCA, 0x02, 0x69, 0x8E, 0xEA, 0x9E, + 0xEF, 0xF4, 0x99, 0x26, 0x73, 0x42, 0xC2, 0xEC, 0x0F, 0xEC, 0x03, 0x8F, 0x66, 0xC1, 0x88, 0x76, + 0xC5, 0xC2, 0x55, 0x46, 0x59, 0xC4, 0x28, 0x55, 0x93, 0xBF, 0x7C, 0x1C, 0x5C, 0xA0, 0xBA, 0x8A, + 0xCA, 0x8A, 0x81, 0x6C, 0xA3, 0xDE, 0x2D, 0x63, 0xC5, 0xCA, 0x0B, 0x8E, 0x99, 0xC9, 0xE4, 0x7E, + 0x32, 0x36, 0xD8, 0xFA, 0x80, 0xA5, 0x93, 0x4F, 0x5C, 0x97, 0x33, 0x74, 0xD2, 0x03, 0xFF, 0xFD, + 0x57, 0x84, 0x26, 0x62, 0x6A, 0x4C, 0x15, 0x45, 0xB9, 0x7C, 0xCD, 0xD8, 0x7B, 0xC5, 0x70, 0xA1, + 0xCB, 0xB4, 0xDE, 0xA6, 0xBD, 0xE0, 0xE9, 0x49, 0xB7, 0xEA, 0x21, 0x17, 0xCD, 0x0C, 0xA7, 0xF2, + 0x9B, 0xB6, 0x26, 0x06, 0xB1, 0x63, 0x3D, 0x0D, 0x1A, 0xAE, 0x57, 0xF1, 0x53, 0xDA, 0x61, 0x47, + 0x7E, 0x66, 0xC0, 0x2A, 0xAC, 0x7E, 0xE8, 0xE9, 0x4F, 0xC2, 0x21, 0x01, 0x0B, 0x9C, 0xA7, 0x98, + 0x05, 0x3A, 0x34, 0x68, 0x19, 0x26, 0x35, 0x57, 0xF7, 0xF8, 0xE0, 0x77, 0x7B, 0x42, 0x8D, 0xE0, + 0xD3, 0x08, 0x49, 0x62, 0x1D, 0x86, 0xBE, 0xC8, 0xDC, 0x2F, 0xE0, 0xFF, 0xC4, 0x6E, 0xBD, 0xEC, + 0x8B, 0x33, 0xF1, 0x61, 0x6E, 0x96, 0xEB, 0xEA, 0x87, 0x4C, 0xA3, 0x5F, 0x97, 0x92, 0x22, 0x0C, + 0x36, 0x05, 0xA5, 0xC1, 0xF6, 0xB8, 0xF5, 0xE0, 0xE4, 0x91, 0x73, 0x73, 0xD0, 0x38, 0x81, 0x24, + 0x13, 0xB4, 0x4B, 0xAB, 0x4C, 0xBB, 0x15, 0x56, 0xC2, 0x66, 0xF9, 0x27, 0xEF, 0xE0, 0x3D, 0x4E, + 0xDB, 0x12, 0xCB, 0xC1, 0xDE, 0x57, 0x1B, 0x7F, 0x69, 0x10, 0xE4, 0x6E, 0xF7, 0xCC, 0x0F, 0x64, + 0x31, 0x6A, 0xBF, 0x49, 0x6C, 0xF8, 0x9E, 0xC9, 0x37, 0xF9, 0x26, 0x32, 0x4A, 0x26, 0x97, 0x99, + 0x30, 0xA6, 0x86, 0x82, 0xCE, 0x04, 0x8B, 0xFB, 0x39, 0x3B, 0xEF, 0x05, 0xAE, 0x3F, 0xFD, 0xEA, + 0x21, 0xA7, 0xF9, 0xD8, 0x2D, 0x34, 0x42, 0xE4, 0xDC, 0x40, 0x1C, 0x82, 0x94, 0x89, 0xC4, 0x74, + 0x0C, 0xF6, 0x76, 0x65, 0x13, 0x29, 0x85, 0xE7, 0xF6, 0x8C, 0x19, 0x3D, 0xC2, 0x69, 0x79, 0x07, + 0x8C, 0x47, 0x24, 0x24, 0x4C, 0xD6, 0x41, 0x93, 0x70, 0x40, 0x08, 0x6D, 0x49, 0x4D, 0x92, 0xAA, + 0x9D, 0x02, 0xAB, 0x53, 0x8D, 0x8C, 0x96, 0x75, 0x54, 0xD0, 0xA2, 0x45, 0xBA, 0x19, 0x81, 0xFE, + 0x20, 0xCC, 0x93, 0x78, 0x4D, 0xBB, 0xA2, 0x21, 0xAB, 0xB5, 0x1B, 0x47, 0x0C, 0xA2, 0x34, 0x24, + 0x1E, 0xF3, 0x40, 0xF3, 0xC8, 0x79, 0xAE, 0x00, 0x40, 0xC3, 0xC4, 0x1B, 0x41, 0x5E, 0xF4, 0x08, + 0x7D, 0x15, 0xF1, 0xDF, 0xE2, 0x34, 0x78, 0xC3, 0x2A, 0x91, 0x8D, 0xC1, 0xA7, 0xF4, 0xD0, 0xF9, + 0xE7, 0x4E, 0x9F, 0xDC, 0x56, 0x16, 0x6C, 0x5B, 0x48, 0x10, 0x7E, 0xE9, 0xA6, 0x3F, 0x3B, 0xD0, + 0xFD, 0x12, 0x46, 0x1B, 0xFF, 0x61, 0x76, 0x61, 0xCC, 0x24, 0x1C, 0x94, 0xDF, 0x77, 0x6F, 0xAE, + 0x8E, 0xEE, 0x96, 0xF6, 0x9B, 0xB4, 0xE9, 0xA5, 0x1E, 0x6D, 0x7C, 0x2C, 0x43, 0xFB, 0x74, 0xF3, + 0x23, 0x86, 0xE6, 0x07, 0xC7, 0x36, 0xE3, 0xED, 0xAF, 0xDD, 0x75, 0x61, 0xCD, 0xFE, 0xEE, 0x4B, + 0x82, 0xF7, 0xC7, 0x66, 0x2B, 0x4C, 0xFF, 0x97, 0x77, 0x1A, 0xF5, 0xA5, 0x55, 0xF2, 0xBD, 0xC0, + 0xD4, 0xD8, 0x07, 0x2A, 0x92, 0xB0, 0x04, 0x56, 0x55, 0x3F, 0x1B, 0xCA, 0x21, 0x25, 0x3F, 0xB9, + 0x81, 0x01, 0x94, 0x43, 0xEE, 0x83, 0xD5, 0x10, 0xB4, 0x13, 0x19, 0xC0, 0x06, 0xBA, 0xEF, 0xA3, + 0xE4, 0xEC, 0xD8, 0x66, 0x30, 0x58, 0xA2, 0xE7, 0x81, 0x65, 0xDA, 0xA1, 0x35, 0x28, 0x4B, 0x47, + 0x17, 0x95, 0xA3, 0x8C, 0x67, 0x44, 0xC8, 0x8B, 0x1B, 0x5F, 0xE9, 0x0E, 0x99, 0xA3, 0x39, 0xAF, + 0x5C, 0xCA, 0x0D, 0x68, 0xAD, 0xE0, 0x91, 0xF3, 0x95, 0x54, 0x02, 0xFF, 0xC4, 0x23, 0xA1, 0x2E, + 0xCE, 0xD2, 0xFC, 0x34, 0x5A, 0xF0, 0x83, 0x82, 0x54, 0x07, 0xDE, 0x21, 0x0D, 0xE3, 0xDF, 0x86, + 0xC1, 0x6E, 0xAB, 0x95, 0x28, 0x90, 0xED, 0x3B, 0x93, 0x95, 0x9E, 0xDE, 0xBA, 0x3E, 0x32, 0x85, + 0x0F, 0xB9, 0x62, 0x68, 0x00, 0x93, 0x38, 0xF9, 0x6B, 0x36, 0x5E, 0xAB, 0x9F, 0xDD, 0x84, 0x97, + 0xB8, 0xAB, 0xDA, 0x29, 0x88, 0xEC, 0x9D, 0xFA, 0xAA, 0x34, 0x2B, 0x1E, 0xC0, 0x6C, 0x53, 0xD4, + 0x55, 0x40, 0x45, 0x9F, 0xEC, 0x0A, 0x90, 0x51, 0xC5, 0x7A, 0x8A, 0xF6, 0xEE, 0x62, 0xC2, 0xE9, + 0x57, 0x2A, 0x1D, 0x8F, 0xB6, 0x83, 0xF9, 0x44, 0x42, 0x33, 0x2A, 0x3D, 0xC7, 0x46, 0xDA, 0xCA, + 0xBC, 0x6B, 0x49, 0x7F, 0x94, 0xB0, 0x6C, 0x80, 0xEC, 0x76, 0x96, 0x12, 0xB9, 0x05, 0x47, 0x96, + 0x84, 0x98, 0xCF, 0x8F, 0x21, 0xF5, 0x6B, 0x86, 0xB8, 0xD4, 0x80, 0xBA, 0xEA, 0x3C, 0xF6, 0x7A, + 0x98, 0xE9, 0x1A, 0x5E, 0x2C, 0x69, 0x1A, 0x2A, 0x31, 0xB9, 0xE6, 0x28, 0xA3, 0xCA, 0xC2, 0x70, + 0xDB, 0xF0, 0x30, 0x28, 0xD3, 0xD6, 0x17, 0xAD, 0x73, 0x8D, 0xB3, 0xF5, 0xFD, 0xA3, 0x6D, 0x8A, + 0xAE, 0x7A, 0x69, 0xD7, 0x6E, 0x4C, 0x29, 0x44, 0xBD, 0x57, 0xBA, 0xC9, 0xFD, 0xA1, 0xEF, 0xA9, + 0xA0, 0x98, 0x39, 0x7A, 0x05, 0x61, 0x46, 0x55, 0x77, 0x5C, 0x1A, 0x39, 0x38, 0x98, 0xFA, 0x79, + 0x9A, 0xBC, 0x68, 0xDB, 0x29, 0x51, 0xDD, 0x2C, 0xEC, 0xFA, 0x61, 0x93, 0x93, 0x44, 0xF2, 0x7E, + 0xD7, 0xA2, 0x79, 0xF1, 0xBD, 0x19, 0x81, 0x36, 0x04, 0x3A, 0x26, 0x20, 0x07, 0x3E, 0x01, 0x8E, + 0x16, 0xE0, 0x6F, 0xF6, 0x29, 0xB8, 0x0B, 0xAC, 0x37, 0x19, 0x39, 0x91, 0x09, 0x23, 0xA6, 0x9C, + 0xAD, 0x08, 0x70, 0xA8, 0x66, 0x0A, 0x22, 0xA2, 0x2E, 0xC5, 0xB9, 0x7F, 0x58, 0xC0, 0x2F, 0x07, + 0x61, 0xB9, 0x2D, 0x3F, 0xA9, 0xB1, 0x67, 0x52, 0xC1, 0x1C, 0x2C, 0xB4, 0xFC, 0x02, 0xA8, 0x4F, + 0x71, 0x87, 0x7F, 0x42, 0x35, 0x93, 0x25, 0xF5, 0x81, 0x07, 0xF9, 0x75, 0x01, 0xBE, 0x08, 0x15, + 0xC5, 0xD1, 0xED, 0x91, 0xB6, 0x0B, 0xC8, 0x8B, 0x4D, 0x62, 0x54, 0xD7, 0x14, 0x9C, 0x3E, 0xEA, + 0x15, 0x3E, 0x91, 0x4F, 0x2F, 0xB5, 0x5C, 0x5A, 0x13, 0x6D, 0x24, 0xE5, 0xB1, 0xA2, 0xFC, 0xAF, + 0x5F, 0x85, 0x13, 0x52, 0x9F, 0x80, 0x19, 0xBB, 0xB7, 0x9A, 0xC6, 0x92, 0x49, 0x2D, 0x28, 0xA7, + 0xA2, 0x28, 0xFA, 0x4A, 0x7B, 0xBA, 0x99, 0x15, 0xA9, 0xF3, 0x51, 0xED, 0xA5, 0xD7, 0x9A, 0xC1, + 0x7A, 0x1E, 0x77, 0x57, 0xBB, 0xA7, 0x25, 0x10, 0xE9, 0x69, 0xAC, 0x50, 0xEF, 0xEC, 0x85, 0x02, + 0x52, 0xC9, 0x29, 0xE9, 0xCB, 0xC8, 0xD0, 0x2D, 0x43, 0xAD, 0x26, 0x93, 0xA8, 0x12, 0xE3, 0xEB, + 0xB1, 0x1E, 0xA2, 0x8D, 0xE4, 0xF7, 0x8F, 0x4B, 0x55, 0xE7, 0xD7, 0x98, 0x3B, 0x7B, 0x85, 0x16, + 0xEE, 0x5A, 0xD8, 0x61, 0x65, 0x57, 0xBC, 0x74, 0x62, 0xD3, 0xDC, 0x7C, 0x6D, 0xCC, 0x56, 0xB0, + 0x3B, 0xA7, 0xE9, 0x10, 0xDE, 0x6A, 0xF4, 0x3A, 0xEC, 0x7E, 0x2E, 0xD0, 0x1E, 0x81, 0x48, 0xD3, + 0xEC, 0xD7, 0xC5, 0xDB, 0x16, 0xBD, 0xD5, 0x5B, 0xAD, 0x8E, 0x13, 0x5A, 0x2A, 0x9E, 0x1A, 0x96, + 0xC3, 0x7E, 0x23, 0xAD, 0xA7, 0x45, 0xE0, 0xCE, 0xA4, 0x52, 0x0C, 0x2A, 0x2E, 0x84, 0x9D, 0xB3, + 0xB4, 0x21, 0x18, 0xA7, 0xCF, 0x57, 0xA3, 0xFE, 0xA1, 0x27, 0x99, 0xCE, 0x48, 0x1E, 0xA7, 0xDB, + 0x62, 0x13, 0x9B, 0x19, 0xE3, 0xBF, 0xAA, 0xA2, 0x9D, 0x29, 0xC9, 0x92, 0xD1, 0x5A, 0x43, 0x4E, + 0xC4, 0xF8, 0xB4, 0xD9, 0xFC, 0xBD, 0x1A, 0xBB, 0x4D, 0x23, 0x99, 0xF3, 0x86, 0xE6, 0xBC, 0xB7, + 0x03, 0xE1, 0xA9, 0xD7, 0xDF, 0x5C, 0x15, 0x56, 0xB4, 0x63, 0xC2, 0x71, 0x6D, 0x15, 0xF1, 0x85, + 0xB6, 0xFF, 0x85, 0x4B, 0x6C, 0x36, 0xDB, 0xA8, 0x07, 0x22, 0x92, 0x4F, 0xD5, 0xA3, 0x2B, 0x40, + 0x8F, 0x6D, 0x89, 0xE3, 0x3E, 0xA2, 0x40, 0xAE, 0x80, 0xA5, 0x3A, 0xD2, 0x5D, 0x7E, 0x74, 0x6A, + 0x94, 0xED, 0xA3, 0xF2, 0x4C, 0x2E, 0x57, 0xF2, 0xBE, 0x8B, 0x25, 0xEF, 0x87, 0x0C, 0x05, 0x99, + 0x27, 0x5E, 0xA5, 0xDE, 0xAE, 0x94, 0x49, 0xFD, 0x7A, 0x62, 0xA7, 0x74, 0x58, 0x8A, 0x1A, 0xED, + 0x15, 0x23, 0x1D, 0x83, 0xD7, 0xA4, 0x6B, 0x4F, 0x3F, 0x9C, 0xBB, 0x5B, 0x27, 0xAD, 0x5C, 0x7E, + 0xA2, 0xE0, 0xBF, 0x39, 0x0C, 0x73, 0xB1, 0x48, 0x07, 0xC1, 0x3B, 0xD5, 0xA6, 0x2D, 0x94, 0x20, + 0x6D, 0xE6, 0x91, 0xAD, 0xCC, 0xDE, 0x4A, 0x3C, 0x4C, 0x02, 0x92, 0xCD, 0x41, 0x46, 0x3C, 0x88, + 0x5A, 0xB6, 0xF6, 0x8F, 0x85, 0x05, 0x7E, 0x75, 0xAC, 0x92, 0x92, 0x99, 0xF4, 0x36, 0x21, 0xE9, + 0x0D, 0x19, 0x02, 0xA1, 0xF0, 0xF1, 0xDB, 0xD8, 0x8F, 0x48, 0x11, 0x5D, 0x84, 0x80, 0x24, 0xD8, + 0xEE, 0x57, 0xB2, 0x3A, 0xE6, 0x0E, 0xC5, 0xA1, 0x26, 0xF9, 0x0C, 0x2E, 0x6C, 0x3A, 0x7A, 0x8B, + 0x0B, 0x9B, 0x3D, 0x2E, 0xAF, 0x26, 0x7D, 0x02, 0x63, 0xC8, 0x0D, 0x24, 0x7D, 0x36, 0x19, 0xAB, + 0xAC, 0xA9, 0x10, 0xA0, 0x53, 0x25, 0x4C, 0xC7, 0x4C, 0x28, 0x4A, 0xC3, 0x38, 0x92, 0xE2, 0x3D, + 0xF3, 0xE1, 0x93, 0xDE, 0x3E, 0x77, 0xAC, 0xEF, 0x6A, 0x08, 0x44, 0xE8, 0x20, 0x18, 0xA3, 0xA0, + 0x90, 0x56, 0xDD, 0xAB, 0x77, 0x7D, 0x36, 0xC2, 0x91, 0xB5, 0x44, 0x8C, 0xD4, 0x57, 0x2C, 0x81, + 0xA1, 0xB9, 0xD9, 0x59, 0x50, 0x8A, 0x76, 0x88, 0x5A, 0x5E, 0x45, 0x99, 0xAC, 0x8C, 0x40, 0x14, + 0x46, 0x28, 0x77, 0xED, 0x1C, 0x7C, 0x59, 0x36, 0x83, 0x4A, 0xA7, 0x0A, 0x71, 0x9C, 0x3B, 0x02, + 0x43, 0x50, 0x74, 0x85, 0xE3, 0xD4, 0x0A, 0x3B, 0x1B, 0xE2, 0xD7, 0x1F, 0x79, 0x78, 0x4B, 0x00, + 0x8E, 0x0A, 0x99, 0xDF, 0x14, 0x17, 0xCD, 0xB8, 0xCF, 0x21, 0xB3, 0x85, 0x38, 0xDE, 0x01, 0xBA, + 0x1B, 0x95, 0x4B, 0x97, 0x2B, 0xB0, 0xC9, 0xED, 0x45, 0xCE, 0x22, 0x5B, 0x8E, 0x04, 0x91, 0x07, + 0x58, 0xC8, 0xB5, 0xA7, 0x06, 0x62, 0x9D, 0xC4, 0xAC, 0x1E, 0x08, 0xFD, 0xEA, 0xB7, 0x4D, 0x0B, + 0xD2, 0x79, 0xA8, 0xEF, 0x4F, 0xBE, 0x80, 0xE6, 0x55, 0x44, 0x7B, 0x59, 0x5E, 0x9C, 0x92, 0x6A, + 0x92, 0xF7, 0xE7, 0x78, 0xFB, 0x46, 0xA1, 0xF4, 0x1E, 0x36, 0x8B, 0xE2, 0x86, 0xA2, 0xE1, 0x19, + 0xB5, 0x29, 0xEA, 0xD2, 0x1D, 0x0B, 0x68, 0xC5, 0x2F, 0x4F, 0x48, 0x6A, 0xC8, 0x92, 0xCE, 0x64, + 0x9D, 0xA5, 0x86, 0xA5, 0x05, 0x40, 0xCE, 0xD7, 0x6C, 0x69, 0x9F, 0x6C, 0xB2, 0xA3, 0x11, 0x08, + 0xEF, 0x9B, 0xCD, 0x10, 0x07, 0x7B, 0x9E, 0x25, 0xF4, 0x1A, 0x2B, 0x21, 0x7E, 0xA5, 0xB9, 0xE1, + 0x33, 0x52, 0xFA, 0x04, 0x09, 0xD4, 0x78, 0xCB, 0x56, 0xE6, 0x55, 0x2C, 0xB4, 0x5D, 0xBB, 0x40, + 0x34, 0xE5, 0x23, 0x30, 0xB8, 0x65, 0x19, 0xF1, 0x5A, 0x08, 0xF2, 0xF4, 0x86, 0x45, 0xB7, 0x87, + 0x17, 0xFA, 0x68, 0x6A, 0x1F, 0x7E, 0x69, 0xDA, 0x89, 0x8E, 0xCA, 0xB6, 0xFF, 0x9F, 0x4E, 0x6F, + 0x25, 0x46, 0x46, 0xF6, 0x7B, 0x1E, 0xB3, 0x3D, 0x2C, 0x8C, 0x01, 0xA9, 0x7B, 0xDA, 0xE9, 0x4D, + 0x6E, 0x89, 0x9D, 0x0F, 0x3F, 0x9F, 0x15, 0x3C, 0xFE, 0x35, 0x61, 0x2A, 0x45, 0xC2, 0xA9, 0xC5, + 0x5C, 0x51, 0xCC, 0x6B, 0xCC, 0x2F, 0xA7, 0x60, 0x03, 0x71, 0xF0, 0xB3, 0xBF, 0x7B, 0x76, 0xCC, + 0x89, 0x2C, 0x31, 0x79, 0xE6, 0xDC, 0x7C, 0x39, 0x24, 0xD8, 0x1A, 0x98, 0x1F, 0x98, 0xCD, 0xD4, + 0x7E, 0x04, 0xF2, 0x92, 0x8D, 0x23, 0x03, 0x5F, 0xF3, 0x05, 0x3B, 0xB0, 0x0A, 0xF0, 0x7A, 0xCA, + 0x76, 0xCB, 0xD0, 0xBA, 0xA0, 0x7F, 0xBA, 0x0D, 0x68, 0x60, 0xC3, 0xEF, 0xDC, 0x44, 0x2E, 0x40, + 0x24, 0x9D, 0xCB, 0x1D, 0x5A, 0x0C, 0x51, 0x66, 0x1A, 0x2A, 0x68, 0xA6, 0x83, 0x20, 0x79, 0x9B, + 0x24, 0xEA, 0x10, 0x5A, 0xB4, 0x39, 0x58, 0xAC, 0xA0, 0x45, 0x3B, 0x16, 0xBE, 0x24, 0x59, 0x1D, + 0x18, 0x5C, 0xD8, 0xCD, 0xFE, 0x16, 0x5C, 0x84, 0x5C, 0x2D, 0x7D, 0x28, 0xC9, 0xCE, 0x9D, 0x38, + 0xF6, 0x2F, 0x9A, 0x8A, 0x93, 0x95, 0xDC, 0x73, 0x48, 0xFD, 0xF5, 0xAB, 0xF4, 0x06, 0xB4, 0x11, + 0x79, 0x7B, 0xF7, 0x75, 0x73, 0xC2, 0x2D, 0x9C, 0x91, 0x7E, 0x51, 0x12, 0x54, 0xAC, 0x55, 0x29, + 0x48, 0x7F, 0x50, 0x15, 0xC2, 0x79, 0x05, 0x3C, 0x8F, 0xB4, 0xAE, 0xDD, 0x28, 0x09, 0xCC, 0x1D, + 0xDE, 0xEF, 0x82, 0xFD, 0x64, 0xD1, 0x5A, 0xFE, 0x06, 0x18, 0x7C, 0xF6, 0x32, 0x67, 0xDB, 0xF1, + 0x55, 0xF4, 0x09, 0x33, 0xB4, 0x91, 0xA7, 0x68, 0xE7, 0xA3, 0x60, 0x93, 0xE6, 0x36, 0xDE, 0x28, + 0xB3, 0xBD, 0x90, 0x46, 0x7F, 0xE5, 0xAF, 0x3C, 0xB6, 0x5E, 0xF2, 0x98, 0xE6, 0x28, 0x07, 0xA9, + 0x21, 0x4C, 0xAA, 0xF7, 0x95, 0xD9, 0x25, 0x51, 0x7F, 0x26, 0x8F, 0xC9, 0xD6, 0x65, 0xCA, 0x07, + 0x82, 0x1F, 0x8E, 0xBF, 0xBA, 0x65, 0xF7, 0xB1, 0x51, 0x85, 0x99, 0x23, 0x4E, 0x48, 0x2E, 0x7B, + 0xC8, 0x09, 0xC4, 0x93, 0xB9, 0xDB, 0x6B, 0xAF, 0xCA, 0xC7, 0x0A, 0xC5, 0x6D, 0xD0, 0xC2, 0xD4, + 0xF5, 0xA1, 0x5E, 0x45, 0x28, 0x54, 0x1D, 0x87, 0xC8, 0x83, 0xAF, 0x9E, 0xB7, 0xC7, 0x4D, 0x48, + 0x3B, 0x49, 0x23, 0x8B, 0x23, 0x6A, 0x2D, 0xD6, 0x30, 0xAD, 0xD3, 0xFA, 0x35, 0x67, 0xF0, 0x0D, + 0x3A, 0xDC, 0x42, 0x57, 0xBE, 0xE6, 0x5B, 0x26, 0x0B, 0x30, 0x45, 0x7E, 0x71, 0x5D, 0x82, 0xE7, + 0x40, 0x45, 0x58, 0xBB, 0xF5, 0x07, 0xEC, 0x36, 0x47, 0xF7, 0x98, 0x05, 0x70, 0x83, 0x17, 0x9D, + 0xDD, 0x4A, 0x4A, 0xB7, 0xB5, 0xBC, 0x8B, 0xF5, 0x08, 0x47, 0x74, 0xF3, 0x0F, 0x3C, 0xB0, 0xC7, + 0x30, 0x88, 0xCF, 0xA2, 0xE1, 0xC3, 0x13, 0x52, 0x20, 0x2D, 0xAD, 0xB3, 0x99, 0x37, 0x71, 0x91, + 0xBB, 0x3F, 0x31, 0xAC, 0xEC, 0xB8, 0x2A, 0x84, 0x12, 0x34, 0x84, 0xE5, 0xBF, 0x47, 0x94, 0xD6, + 0x9A, 0x1F, 0xEB, 0x34, 0xAF, 0xDA, 0x93, 0x5D, 0x22, 0x88, 0x27, 0x1A, 0x04, 0x13, 0xAA, 0x06, + 0x52, 0x8C, 0x44, 0xCB, 0xCC, 0x70, 0x7A, 0xBF, 0xC3, 0x3D, 0x21, 0x71, 0x99, 0x4F, 0x06, 0x42, + 0x8B, 0x7F, 0xDA, 0xBC, 0xAF, 0x7C, 0x24, 0x94, 0x3F, 0xC9, 0xB9, 0xF0, 0xFB, 0x9C, 0xFB, 0x94, + 0xFC, 0x7F, 0xA0, 0x2F, 0x20, 0x4D, 0x57, 0x06, 0xDB, 0xA8, 0xC4, 0xBD, 0x02, 0x6C, 0xDD, 0x00, + 0x8C, 0x84, 0xEF, 0x63, 0xDB, 0x45, 0x34, 0x21, 0x69, 0x73, 0x53, 0x22, 0xD3, 0x61, 0xA6, 0x7A, + 0xDE, 0xC1, 0x66, 0xFD, 0x3B, 0x95, 0x13, 0x76, 0x06, 0xE4, 0x76, 0x0E, 0x63, 0xF2, 0x66, 0x56, + 0xE3, 0x80, 0x55, 0x57, 0xF3, 0x88, 0xA2, 0x5E, 0x84, 0x29, 0xFD, 0x44, 0x78, 0xA9, 0xF0, 0x3A, + 0xF9, 0xE7, 0xDD, 0x66, 0xE1, 0x48, 0xA4, 0xD7, 0x15, 0x06, 0x47, 0xBA, 0x1E, 0x70, 0xA0, 0xA2, + 0xBC, 0x79, 0xCF, 0x9B, 0xA6, 0x61, 0x95, 0x4F, 0xF8, 0x46, 0xA7, 0xD5, 0xB5, 0x5F, 0x66, 0xDD, + 0xE2, 0x5A, 0x8B, 0x29, 0xBA, 0x02, 0xC8, 0x1A, 0x17, 0xFD, 0x72, 0x45, 0xED, 0x63, 0x46, 0x64, + 0x5E, 0xC9, 0x24, 0x8D, 0x91, 0x38, 0xD1, 0xEF, 0xDF, 0x82, 0x09, 0xB0, 0x5B, 0x8C, 0x43, 0x5F, + 0xF9, 0x05, 0x34, 0x1E, 0x2B, 0x4D, 0xA8, 0xC3, 0xE5, 0x9A, 0xD5, 0x95, 0x1B, 0xC0, 0xB9, 0x30, + 0x55, 0xB1, 0xEF, 0x53, 0xD2, 0x86, 0x65, 0x96, 0xD1, 0x3C, 0x75, 0x9E, 0x43, 0xED, 0x72, 0x92, + 0x5F, 0xC3, 0xF8, 0x4C, 0x14, 0xA7, 0x77, 0x22, 0x48, 0x5E, 0xD0, 0x02, 0x32, 0xB4, 0x5F, 0xA9, + 0xCD, 0x9C, 0xF6, 0x46, 0x60, 0xEF, 0x4D, 0x14, 0x84, 0x6E, 0xC5, 0x2C, 0xA6, 0xB2, 0xFB, 0x38, + 0xD1, 0x0C, 0xB2, 0x87, 0xE8, 0x64, 0x1E, 0xFD, 0xC4, 0x28, 0x08, 0x37, 0x61, 0x85, 0x11, 0x44, + 0x76, 0xC9, 0x9F, 0xAD, 0x6D, 0xBC, 0xC0, 0xC8, 0x02, 0xC8, 0xDA, 0x22, 0x1D, 0xB3, 0x54, 0x5F, + 0x38, 0x0D, 0x1D, 0xC0, 0x78, 0x46, 0x7C, 0x46, 0x05, 0xC1, 0x51, 0x9A, 0xF7, 0x7E, 0x51, 0x75, + 0x32, 0xD6, 0xB1, 0x7E, 0x8B, 0x3A, 0xB9, 0xA8, 0x12, 0xAF, 0xF8, 0x20, 0x69, 0xED, 0x37, 0xB4, + 0xD2, 0x7D, 0x7C, 0x08, 0xE4, 0x74, 0xD8, 0x18, 0x2B, 0x6E, 0x65, 0x21, 0xC4, 0x8C, 0xF0, 0xB2, + 0x1A, 0x7D, 0xDD, 0xA5, 0xE9, 0xC3, 0x88, 0xEE, 0x7E, 0x80, 0xE3, 0x4B, 0x3A, 0x56, 0x3D, 0x4B, + 0x75, 0x62, 0xE1, 0xCE, 0xB6, 0xD5, 0xF1, 0xFC, 0x0C, 0x0A, 0x66, 0x10, 0xD2, 0xC0, 0xF3, 0xD3, + 0xCA, 0xFE, 0xD6, 0x73, 0xE4, 0x21, 0xDA, 0xED, 0xE4, 0xE4, 0x5A, 0xAC, 0x31, 0x6D, 0x84, 0x8E, + 0x24, 0x56, 0x6B, 0x09, 0x14, 0x09, 0x81, 0xD6, 0xC6, 0x92, 0x2B, 0xE5, 0x2F, 0x61, 0xCE, 0xD3, + 0xBD, 0x31, 0x10, 0x56, 0x4C, 0x68, 0x18, 0xA2, 0x4E, 0xBF, 0x22, 0x71, 0x77, 0x4A, 0xEC, 0x3F, + 0x8A, 0x10, 0xF9, 0x62, 0x7B, 0x4F, 0x7E, 0xE3, 0x16, 0x23, 0x3C, 0x4A, 0x7B, 0xD9, 0xCC, 0xA1, + 0x13, 0x09, 0x31, 0xD8, 0xD1, 0x23, 0xC4, 0xAD, 0x48, 0xD6, 0xC7, 0xCF, 0xB6, 0xE2, 0x5E, 0x53, + 0xAF, 0x45, 0xF4, 0xE4, 0x82, 0xDC, 0xB3, 0x5D, 0x19, 0x4A, 0x71, 0xBE, 0x75, 0x1D, 0x82, 0x9C, + 0xCD, 0x1F, 0x1E, 0xCE, 0xE1, 0xB6, 0x94, 0xED, 0x9A, 0x3A, 0x1A, 0x66, 0xFF, 0x5C, 0x43, 0x7D, + 0x51, 0x46, 0x09, 0xBB, 0xD0, 0x5D, 0x1A, 0x81, 0x98, 0x9A, 0xAC, 0x74, 0x94, 0xD3, 0x05, 0x55, + 0xE1, 0xE4, 0x2A, 0x43, 0xCC, 0xC8, 0x2C, 0x10, 0xA7, 0xE8, 0xAD, 0x5F, 0x02, 0xDF, 0x3B, 0x10, + 0x33, 0x43, 0x8A, 0x92, 0xF9, 0xCF, 0x12, 0x04, 0x60, 0xCD, 0xA0, 0x30, 0xA9, 0xE8, 0x32, 0x30, + 0x80, 0x8B, 0xF2, 0x09, 0xA4, 0x91, 0xFA, 0x3B, 0xBD, 0x1D, 0x54, 0xFD, 0xF8, 0xCF, 0x74, 0x70, + 0x50, 0x9B, 0x8D, 0x40, 0xBD, 0xC7, 0x3D, 0x4F, 0x03, 0x7B, 0x63, 0x32, 0xCE, 0x8B, 0x5B, 0x7C, + 0x9A, 0xE0, 0x3A, 0x37, 0x38, 0xCA, 0x31, 0x21, 0xDB, 0x4F, 0xF6, 0xF0, 0xDB, 0x4E, 0xE5, 0xDC, + 0x69, 0x4B, 0xAE, 0x28, 0x01, 0xF2, 0x46, 0x38, 0x6A, 0x9A, 0x50, 0x2D, 0xF4, 0x36, 0x5D, 0xEF, + 0x25, 0xB1, 0x31, 0xCA, 0x58, 0x5E, 0x4B, 0xE6, 0xAC, 0xCF, 0x0C, 0x20, 0x84, 0x7F, 0xF5, 0xC1, + 0x1A, 0xE5, 0x94, 0xC3, 0x3D, 0x77, 0x8E, 0xA3, 0x9B, 0xAF, 0x96, 0xBF, 0xD1, 0xEC, 0x35, 0x17, + 0x15, 0xDF, 0x2B, 0x00, 0xCD, 0x2C, 0xDB, 0xD3, 0x31, 0x8A, 0x6D, 0xE0, 0xB3, 0x1F, 0x71, 0xB4, + 0xA4, 0xCA, 0xFA, 0x40, 0xEB, 0x99, 0x4C, 0xFB, 0xFE, 0x9D, 0xBA, 0x26, 0x0F, 0x1B, 0x6D, 0xE6, + 0xB6, 0x2C, 0xAD, 0xF4, 0xD8, 0x12, 0xC0, 0xA3, 0xA4, 0x65, 0x10, 0x1B, 0xCD, 0xFD, 0x0A, 0xB0, + 0x52, 0x71, 0x56, 0xD4, 0x01, 0x49, 0xC9, 0x68, 0x06, 0xA1, 0xD3, 0x61, 0x8A, 0xC1, 0x07, 0x1B, + 0x06, 0x48, 0x78, 0x1B, 0x96, 0xCB, 0x7B, 0xC5, 0xF4, 0x8B, 0x27, 0x93, 0xF1, 0x10, 0x40, 0xB3, + 0x36, 0xA3, 0xA8, 0x19, 0xF3, 0x1B, 0x1B, 0xA4, 0xCD, 0x19, 0x18, 0x25, 0x7C, 0x24, 0xAC, 0x05, + 0xD1, 0xB2, 0xA1, 0x1E, 0x0B, 0xB3, 0xDA, 0x82, 0x3E, 0x78, 0x87, 0x12, 0x8F, 0xE6, 0xB9, 0x59, + 0x02, 0xDC, 0x15, 0x31, 0xA3, 0xAE, 0x22, 0x2F, 0xB7, 0x60, 0x08, 0x42, 0xA0, 0x4B, 0x94, 0xA1, + 0x1A, 0xD9, 0x32, 0x40, 0x2C, 0x33, 0x5A, 0x62, 0xB3, 0xDB, 0x9C, 0x04, 0x3B, 0xCE, 0x40, 0xCD, + 0x3C, 0x29, 0xDB, 0x1C, 0x98, 0xC7, 0x7B, 0x09, 0x65, 0x91, 0xCD, 0xB9, 0x71, 0x80, 0xF2, 0x14, + 0x90, 0x27, 0xA5, 0xC7, 0x16, 0xBB, 0xC8, 0x6D, 0x79, 0x0F, 0xC7, 0x06, 0x4F, 0xFD, 0xEF, 0x3D, + 0x7E, 0xA9, 0x1A, 0x20, 0x4A, 0x94, 0x3F, 0x84, 0xA1, 0x97, 0xE1, 0x99, 0xF5, 0x9E, 0xB2, 0x46, + 0x23, 0xC3, 0x48, 0x46, 0xC0, 0x2C, 0x7D, 0x64, 0x45, 0x7B, 0xA0, 0xBF, 0x5F, 0x14, 0xBC, 0xB2, + 0x17, 0x87, 0x68, 0x5C, 0x17, 0xCE, 0xCA, 0xEA, 0x73, 0x3C, 0xAE, 0x6C, 0x8C, 0x4A, 0x2C, 0xFB, + 0x77, 0x52, 0xE7, 0xA1, 0xFF, 0x6C, 0x23, 0x05, 0x1E, 0x69, 0x22, 0xF1, 0xDA, 0x6B, 0xB6, 0x01, + 0x44, 0xDE, 0xEB, 0x80, 0xB7, 0x84, 0x5B, 0xC7, 0xEA, 0x59, 0x5B, 0x3F, 0x23, 0x7E, 0x10, 0x00, + 0x27, 0x5C, 0x6A, 0x7B, 0xEB, 0xFF, 0xDF, 0x82, 0xEE, 0x85, 0x6C, 0xA5, 0x1A, 0xBF, 0xEB, 0x64, + 0xBB, 0x10, 0x46, 0x40, 0x51, 0x29, 0x2C, 0x6A, 0xD2, 0xF5, 0x58, 0x61, 0x5F, 0x77, 0x31, 0xBD, + 0x59, 0x0A, 0x1B, 0xF5, 0xC2, 0xFA, 0x9A, 0xB4, 0x59, 0xF4, 0x0A, 0xD1, 0x68, 0xCC, 0x21, 0x44, + 0xDC, 0x70, 0x80, 0xD1, 0x67, 0xCC, 0x24, 0x22, 0xC0, 0x77, 0x04, 0xED, 0xA3, 0xB4, 0x23, 0xC8, + 0xAD, 0x5E, 0x18, 0x64, 0x57, 0x89, 0x52, 0xDD, 0x25, 0x6C, 0x38, 0xCE, 0x5D, 0x45, 0x42, 0x18, + 0xA3, 0xE2, 0xD8, 0x6E, 0x21, 0x5F, 0xBB, 0x9D, 0xCA, 0x90, 0x57, 0x85, 0x0C, 0xD5, 0x56, 0xC8, + 0x12, 0x39, 0x27, 0x44, 0x77, 0xE6, 0x59, 0xE7, 0x08, 0xB0, 0x4E, 0x80, 0xBD, 0xE3, 0xE6, 0x8B, + 0xE1, 0x4B, 0x6E, 0xCE, 0xA9, 0x5C, 0x8E, 0xF2, 0xE2, 0xFE, 0x18, 0xFB, 0x74, 0xD6, 0x3C, 0x76, + 0xB8, 0xB0, 0x90, 0x00, 0x3A, 0xF4, 0xE4, 0xB7, 0xFD, 0x05, 0xA3, 0x7A, 0xD9, 0xF7, 0x0E, 0x18, + 0x66, 0xBC, 0x9A, 0x47, 0x18, 0x80, 0x4F, 0x4A, 0x6B, 0x9C, 0xF8, 0x48, 0x16, 0x49, 0x3F, 0x21, + 0xB4, 0x20, 0x59, 0x51, 0xDA, 0xD1, 0x4B, 0xE8, 0x5E, 0x48, 0x95, 0x77, 0x0A, 0x82, 0xA1, 0x8F, + 0xD2, 0x77, 0xC9, 0xC5, 0xE2, 0x79, 0x24, 0x87, 0x34, 0x0C, 0x9E, 0x17, 0x6F, 0x7B, 0xEA, 0x14, + 0x79, 0xF6, 0x0C, 0x95, 0x5F, 0x1C, 0x61, 0x01, 0x61, 0x6D, 0xD1, 0xF2, 0x6A, 0xA8, 0x09, 0xAA, + 0x0A, 0x6E, 0xF9, 0x28, 0x69, 0x49, 0x14, 0x60, 0x6D, 0xA3, 0xCF, 0x5E, 0x4C, 0x34, 0x8E, 0xFC, + 0x7E, 0x3E, 0x72, 0x3E, 0x02, 0x78, 0x3D, 0x1B, 0xA4, 0x93, 0x46, 0x39, 0x46, 0x0E, 0xF0, 0xE3, + 0x46, 0xF0, 0x4C, 0x2F, 0xE2, 0x14, 0x93, 0xF0, 0x2A, 0x5B, 0xE8, 0x05, 0xF7, 0x10, 0x3A, 0x6D, + 0x03, 0xA0, 0x5D, 0xF8, 0x5D, 0xD1, 0x4C, 0x58, 0x7B, 0xBF, 0xAB, 0x52, 0xC1, 0x6E, 0x72, 0x1E, + 0x60, 0x8C, 0x33, 0x4E, 0x22, 0xE7, 0x12, 0x51, 0x0B, 0xFE, 0x22, 0xDA, 0x8A, 0x53, 0xA7, 0xC6, + 0x9A, 0x66, 0x92, 0x76, 0x46, 0x3C, 0xC5, 0x72, 0x55, 0x6C, 0xD2, 0x8D, 0xF1, 0xD5, 0x6C, 0x09, + 0xEA, 0x2D, 0x1A, 0xF9, 0x99, 0x5E, 0x65, 0xCC, 0x6D, 0x55, 0x5F, 0x46, 0x66, 0xC3, 0xBB, 0xBE, + 0x1C, 0x53, 0x40, 0x3B, 0xE9, 0x15, 0x6C, 0xD6, 0x94, 0x8C, 0x5D, 0xB4, 0x4A, 0xDC, 0x2F, 0x2F, + 0xC1, 0xA8, 0xE1, 0xDF, 0x7A, 0xB5, 0x6D, 0xE2, 0xF8, 0xDB, 0xAA, 0x5D, 0x3D, 0x80, 0x5D, 0x33, + 0x6F, 0xCD, 0x5A, 0x84, 0xBC, 0x2D, 0x6E, 0x28, 0x97, 0x07, 0xA6, 0xF1, 0x0B, 0x22, 0x23, 0x58, + 0xDF, 0x50, 0x15, 0x73, 0xD6, 0x75, 0x63, 0xB6, 0x0F, 0xD8, 0x75, 0x9B, 0xF9, 0x9D, 0xBF, 0xE6, + 0xAF, 0xF8, 0xBF, 0xB4, 0x3A, 0xD4, 0x02, 0x3B, 0x8A, 0x4D, 0xF6, 0x44, 0x0E, 0x7F, 0x2B, 0xDB, + 0x9C, 0xAC, 0xD6, 0xB8, 0xC5, 0xB5, 0xEF, 0x1B, 0x67, 0xB0, 0x10, 0xCC, 0x1E, 0x24, 0xD4, 0x05, + 0x06, 0x6D, 0x3A, 0xFE, 0x95, 0x4C, 0x00, 0x8A, 0xD2, 0x53, 0x1B, 0x7A, 0xDE, 0xA0, 0x9F, 0x2D, + 0x10, 0x43, 0x2D, 0xA3, 0x8E, 0x66, 0x36, 0x27, 0x77, 0x05, 0x26, 0x78, 0x21, 0x09, 0x18, 0xD0, + 0x2E, 0x86, 0x1E, 0x56, 0x3B, 0x71, 0x3A, 0x46, 0x24, 0x7C, 0x90, 0x1E, 0x42, 0x36, 0x11, 0xA1, + 0x7C, 0x04, 0x80, 0x42, 0x0F, 0xA8, 0x4E, 0x07, 0xA1, 0x7B, 0x55, 0x5F, 0xA8, 0x8A, 0x1D, 0x36, + 0x9C, 0x16, 0xBD, 0xE0, 0x63, 0x0A, 0xE3, 0xC5, 0xF9, 0x55, 0xA4, 0xE9, 0x75, 0x7D, 0xD5, 0x82, + 0x32, 0x1E, 0x6B, 0x05, 0xE4, 0xF9, 0x8A, 0x8C, 0x18, 0x0E, 0xA0, 0xDF, 0x23, 0x4D, 0xA8, 0x4E, + 0xF0, 0x85, 0xFF, 0x04, 0xC5, 0xFE, 0x1E, 0x8A, 0x3F, 0xBF, 0x54, 0x05, 0x82, 0x8A, 0x0C, 0xDF, + 0xCA, 0x0A, 0xD0, 0x43, 0x76, 0xE5, 0x49, 0x55, 0x36, 0x24, 0x6F, 0x2F, 0x20, 0x58, 0x3A, 0xFE, + 0x62, 0x3A, 0x11, 0xAA, 0x2F, 0xB2, 0x25, 0x6F, 0x0B, 0x9D, 0xD8, 0xCC, 0xC5, 0x26, 0x16, 0x2E, + 0x74, 0x56, 0xBE, 0x99, 0xF4, 0xE7, 0x90, 0x88, 0x65, 0x1E, 0x6C, 0xAA, 0xB4, 0x2C, 0xCF, 0x12, + 0x63, 0x86, 0x8E, 0x9C, 0xF5, 0x75, 0x5A, 0x71, 0xBF, 0xFB, 0x54, 0xF3, 0x86, 0x61, 0xC5, 0x59, + 0xB4, 0xD5, 0x8E, 0x5D, 0x91, 0xA0, 0xB0, 0x9B, 0xB1, 0x95, 0xCE, 0x45, 0x0C, 0x4A, 0xFC, 0xE0, + 0x56, 0x73, 0x96, 0xC1, 0xAA, 0x0A, 0x65, 0x42, 0x42, 0xC1, 0xC7, 0x2D, 0x6E, 0xC8, 0x4A, 0x7F, + 0x40, 0x53, 0x0C, 0x7A, 0x99, 0x96, 0x59, 0xFA, 0xEC, 0xAD, 0xA1, 0xF0, 0xAB, 0xFE, 0xB6, 0x58, + 0x49, 0x65, 0xF4, 0x29, 0x2A, 0x21, 0x42, 0x93, 0x0A, 0xED, 0x38, 0xC0, 0x33, 0xFD, 0xCF, 0x8E, + 0xC1, 0xEC, 0x3A, 0xF9, 0x1F, 0xEA, 0x8F, 0xA2, 0xEA, 0xAE, 0xC4, 0xE7, 0x43, 0xCB, 0x53, 0xF1, + 0x77, 0xC9, 0x6C, 0x61, 0x35, 0xE2, 0xED, 0x25, 0x68, 0xF6, 0x8E, 0x06, 0xD6, 0x41, 0x87, 0x58, + 0x8A, 0xE4, 0x5F, 0x80, 0x59, 0xC7, 0x21, 0xAC, 0xC1, 0x95, 0xC8, 0xBA, 0xF9, 0x84, 0x1F, 0x70, + 0x15, 0x1C, 0xB1, 0xF1, 0x2B, 0xB4, 0xB7, 0xA0, 0x4B, 0xE3, 0xB3, 0xD4, 0x3C, 0x9C, 0x01, 0xB2, + 0x4A, 0xE5, 0x47, 0x39, 0x10, 0x32, 0xE0, 0x0E, 0x1C, 0xE9, 0x3E, 0x2E, 0xDD, 0x12, 0x2C, 0xDF, + 0xB7, 0x47, 0xE8, 0x88, 0x53, 0x28, 0xF2, 0xC6, 0x11, 0x12, 0x15, 0x4A, 0x60, 0x14, 0xA4, 0x78, + 0x54, 0x8E, 0x6A, 0x77, 0xD6, 0x74, 0xC2, 0xCD, 0x4B, 0xF9, 0xC2, 0x84, 0xE8, 0xD6, 0xED, 0x4D, + 0xB3, 0x0C, 0x32, 0x39, 0xCF, 0xB9, 0xF9, 0x0B, 0xC3, 0x52, 0xF5, 0x6E, 0x9A, 0x38, 0x84, 0xED, + 0x0D, 0x83, 0xFA, 0x83, 0x2D, 0xF4, 0xB3, 0xEE, 0x71, 0xE0, 0x47, 0x48, 0xE6, 0x1A, 0x0B, 0xD9, + 0x54, 0x74, 0xB8, 0x39, 0xA1, 0x4C, 0xC7, 0x3C, 0x52, 0x02, 0x07, 0x61, 0x12, 0x1B, 0x49, 0x0B, + 0x7D, 0x08, 0xAA, 0xEA, 0xB0, 0x3A, 0x05, 0x65, 0x9A, 0xEA, 0x68, 0x0C, 0x5B, 0xA6, 0x37, 0xC6, + 0x5F, 0x10, 0x7D, 0xC8, 0xAE, 0xCA, 0x65, 0x1F, 0x16, 0x80, 0x38, 0xF1, 0xB7, 0xB5, 0xDB, 0x1D, + 0x37, 0x5A, 0x1D, 0xEB, 0x7B, 0x2C, 0xA1, 0x7B, 0x72, 0xCE, 0x0D, 0x34, 0xB4, 0x17, 0x23, 0x52, + 0x8B, 0x3A, 0xD6, 0xEC, 0xE5, 0x8D, 0x23, 0x6A, 0xCF, 0x34, 0xDE, 0x02, 0x5A, 0xA4, 0x54, 0xFF, + 0x85, 0x85, 0x3E, 0x33, 0x87, 0xF9, 0x27, 0x59, 0xE2, 0x32, 0xAB, 0x8D, 0xBA, 0x8A, 0x92, 0xEB, + 0x5D, 0xA7, 0xF6, 0x6A, 0xDF, 0x32, 0xAD, 0xAC, 0x70, 0xCF, 0x91, 0xA9, 0x8E, 0x4C, 0x39, 0x71, + 0x4C, 0x1B, 0xBF, 0xD1, 0xD0, 0x68, 0x19, 0x9C, 0x8A, 0x7B, 0x57, 0x52, 0x40, 0xCE, 0xCC, 0x86, + 0xB7, 0x0E, 0x3D, 0x5E, 0xAD, 0xD0, 0x2B, 0xD4, 0x58, 0x5C, 0x5B, 0xD8, 0x00, 0x7F, 0x42, 0x99, + 0x84, 0x5D, 0x2D, 0x86, 0x40, 0x10, 0x35, 0x15, 0x05, 0x67, 0xDE, 0x22, 0x6C, 0xB4, 0x5C, 0x7B, + 0xCA, 0xDF, 0xF4, 0x1D, 0xD2, 0xCB, 0x34, 0x02, 0x6C, 0x22, 0x10, 0x4F, 0x7F, 0xDF, 0x18, 0xFF, + 0x5A, 0x81, 0x4C, 0xAC, 0xF7, 0xF3, 0xF1, 0x5D, 0xBA, 0x72, 0x36, 0x26, 0x88, 0xAE, 0xCA, 0xE0, + 0x79, 0x84, 0x68, 0x86, 0xCE, 0x35, 0xAF, 0x27, 0xB4, 0x21, 0xFD, 0x05, 0xB1, 0x38, 0x17, 0x7D, + 0x9B, 0x5A, 0x12, 0x29, 0x76, 0xE5, 0xA0, 0x39, 0x0B, 0xAD, 0x4C, 0x33, 0xCB, 0x45, 0x59, 0x82, + 0xB7, 0x03, 0xD2, 0x1A, 0xF7, 0x2F, 0x54, 0x43, 0x92, 0xC9, 0x8B, 0x6F, 0x6C, 0x6C, 0x1B, 0x10, + 0xEE, 0x97, 0x38, 0xA5, 0x8B, 0x16, 0xDE, 0xFC, 0xDA, 0x83, 0x4B, 0x39, 0x79, 0x17, 0xB7, 0x5A, + 0x59, 0x01, 0x11, 0xC0, 0xC6, 0x36, 0xD5, 0xBA, 0xB1, 0x46, 0x9E, 0x6B, 0xA1, 0xCB, 0x96, 0x7E, + 0x56, 0x91, 0x87, 0x68, 0x59, 0x8E, 0xCF, 0xB5, 0x58, 0x24, 0x2C, 0xD9, 0x0A, 0x06, 0x25, 0xCB, + 0x8C, 0xE6, 0x02, 0xE3, 0x5A, 0x19, 0x4D, 0x8F, 0x43, 0x5B, 0x40, 0x3F, 0x7D, 0x50, 0x24, 0x90, + 0x71, 0x3E, 0x88, 0x96, 0x3C, 0xCE, 0x2C, 0x80, 0x35, 0x68, 0x3E, 0x21, 0x67, 0x8A, 0x03, 0x68, + 0x49, 0x6B, 0xFA, 0xE2, 0x5A, 0xC7, 0xFF, 0x9C, 0xDF, 0x0D, 0xD9, 0xB5, 0x12, 0x07, 0x35, 0x7B, + 0x35, 0xDC, 0xF7, 0x12, 0x55, 0x71, 0x8A, 0x9F, 0x68, 0x66, 0x2A, 0x72, 0x55, 0x14, 0x82, 0xE2, + 0xBC, 0x3A, 0x39, 0xA7, 0x91, 0xA9, 0x91, 0xC8, 0x2B, 0x5F, 0x0A, 0x09, 0xFD, 0xE0, 0x6B, 0x58, + 0x85, 0x58, 0x1D, 0xCD, 0xEA, 0xAE, 0xBA, 0xA5, 0x49, 0xFF, 0x69, 0x4A, 0x10, 0xDD, 0x5A, 0xE0, + 0x0E, 0xD3, 0x9C, 0x0B, 0xD8, 0x28, 0x2E, 0xCA, 0x8E, 0x9F, 0x29, 0x84, 0xC8, 0xCA, 0x47, 0x79, + 0xB9, 0xCC, 0x71, 0xC6, 0xE1, 0xC1, 0x4D, 0x15, 0xB6, 0x1F, 0x92, 0x13, 0x2C, 0x83, 0xBE, 0x0D, + 0x03, 0x0A, 0x7C, 0x02, 0x7C, 0x2C, 0xFA, 0x8E, 0xC8, 0x23, 0xE1, 0xFD, 0x83, 0xDC, 0x61, 0xDB, + 0x1C, 0xE4, 0x3F, 0xE8, 0xA9, 0x1C, 0x55, 0x1E, 0xB2, 0xF1, 0x47, 0x6C, 0x5A, 0xD8, 0xD9, 0xD4, + 0xA8, 0xBF, 0x4B, 0xF9, 0x0A, 0xD5, 0xBF, 0x1D, 0x88, 0x30, 0x12, 0x80, 0x72, 0x49, 0x6C, 0x91, + 0x70, 0x6A, 0xB7, 0x4D, 0x86, 0x34, 0x8F, 0x57, 0x1A, 0x6A, 0x16, 0x7B, 0xA5, 0x5D, 0x3C, 0x74, + 0x8E, 0x03, 0x1D, 0x53, 0xD6, 0x1C, 0x75, 0x83, 0x2C, 0xF7, 0x5E, 0xF6, 0xE0, 0xC9, 0x25, 0x11, + 0x9F, 0x98, 0x73, 0xD2, 0xBE, 0x50, 0x56, 0xD6, 0x73, 0x38, 0xC8, 0x30, 0x5A, 0xB5, 0xF6, 0x67, + 0x37, 0x75, 0x7E, 0x99, 0x71, 0xC7, 0x30, 0x26, 0x0D, 0x43, 0xA2, 0x0B, 0xF0, 0xC2, 0xCC, 0x38, + 0xDF, 0x0F, 0x37, 0x25, 0xA0, 0x4F, 0x18, 0x5A, 0x40, 0x75, 0x2D, 0xFC, 0x52, 0xFF, 0x37, 0xD5, + 0x38, 0x06, 0xC6, 0x62, 0x13, 0xA0, 0x8E, 0x7A, 0xFA, 0xDD, 0xB9, 0x25, 0xBE, 0xBC, 0x1F, 0x02, + 0x4C, 0x56, 0xA1, 0xBA, 0x08, 0xBB, 0x65, 0xAE, 0xAC, 0x14, 0x4E, 0x65, 0xD7, 0xD1, 0x99, 0xFF, + 0x14, 0x33, 0x9F, 0x18, 0x1D, 0x54, 0x70, 0x6F, 0xBC, 0x85, 0xB4, 0x49, 0x82, 0x4C, 0x0A, 0xA6, + 0xE8, 0x10, 0x61, 0x8F, 0xED, 0xFD, 0x7F, 0x10, 0xAA, 0xAC, 0x13, 0xB5, 0xE2, 0x5D, 0xF3, 0x69, + 0x2B, 0xC3, 0xE1, 0xC2, 0x89, 0x9A, 0x46, 0xF0, 0x97, 0x34, 0xFC, 0x93, 0x31, 0x45, 0xE9, 0x7A, + 0xD4, 0x46, 0x1A, 0x31, 0xFF, 0x65, 0x39, 0xAE, 0xCE, 0xC5, 0x40, 0x2F, 0xD0, 0xCB, 0x1E, 0xC6, + 0x86, 0xDC, 0x2F, 0x72, 0x34, 0x35, 0x28, 0xAD, 0x96, 0xC3, 0xBE, 0xE4, 0xC8, 0xA5, 0xB6, 0x6B, + 0xBD, 0xFB, 0x9B, 0xE5, 0x16, 0x01, 0x4A, 0x55, 0xA2, 0xB0, 0xE8, 0x66, 0x4A, 0xC1, 0xE3, 0xC0, + 0xB9, 0x87, 0xF4, 0xD6, 0x8C, 0xF4, 0x61, 0x42, 0xA4, 0xBF, 0x73, 0x03, 0x67, 0xBD, 0x2F, 0x30, + 0x6E, 0x97, 0x45, 0x0F, 0xC6, 0xBD, 0xCA, 0x2E, 0x69, 0x72, 0x41, 0x07, 0x38, 0x74, 0x18, 0xB1, + 0xCB, 0x5C, 0xD3, 0xC2, 0x1D, 0xB7, 0xF2, 0xAF, 0xEC, 0x00, 0xCD, 0x4F, 0x6F, 0xDE, 0xB2, 0xAC, + 0x44, 0x4C, 0x1A, 0x56, 0xC3, 0x93, 0x21, 0x57, 0x8C, 0x6B, 0x1C, 0xD7, 0xF9, 0xC7, 0xC0, 0xA9, + 0xF7, 0xE4, 0xA3, 0xD8, 0x58, 0x9B, 0x35, 0xE6, 0x00, 0x7C, 0xE2, 0x12, 0xD0, 0x53, 0x61, 0x1F, + 0xC6, 0xA5, 0x81, 0x7A, 0x52, 0xEF, 0x09, 0x36, 0x1A, 0x62, 0x3C, 0x92, 0xD2, 0x65, 0x43, 0xF6, + 0xDF, 0x0B, 0x89, 0x7E, 0xC6, 0xB9, 0x47, 0xF4, 0x52, 0x14, 0x0C, 0x44, 0x4D, 0x23, 0x55, 0x6F, + 0x80, 0xC2, 0xBE, 0xC5, 0x59, 0xF8, 0xB5, 0x27, 0xE6, 0xE8, 0xF0, 0x32, 0x91, 0x3A, 0x59, 0x2B, + 0x1D, 0xF9, 0xAC, 0xF9, 0x2E, 0xF3, 0xB9, 0x36, 0x8C, 0x1A, 0x5D, 0x92, 0x33, 0xEA, 0xA6, 0xAF, + 0x71, 0x24, 0xE2, 0x7F, 0x18, 0xB1, 0x23, 0x3C, 0x53, 0xF3, 0xCC, 0x5D, 0xD4, 0x2D, 0x2B, 0x7A, + 0xF8, 0x94, 0x04, 0xC0, 0x8C, 0x65, 0x4D, 0x3A, 0xFA, 0xCF, 0xF9, 0x07, 0xC2, 0xD7, 0x75, 0x87, + 0x47, 0x9E, 0x6E, 0xA0, 0x79, 0x81, 0x6E, 0x03, 0xC7, 0xD2, 0x75, 0xF6, 0xC3, 0x85, 0x22, 0x28, + 0x1B, 0x39, 0x63, 0xCC, 0x12, 0x7E, 0x4A, 0xC3, 0x2A, 0x45, 0x85, 0xA9, 0x54, 0xDF, 0xB2, 0x33, + 0xEF, 0x76, 0x25, 0x31, 0xC9, 0xCD, 0xDA, 0x14, 0xE7, 0xD8, 0x4D, 0x18, 0xCE, 0xAB, 0xE7, 0x85, + 0xDD, 0x95, 0x8D, 0x36, 0xA1, 0x18, 0x87, 0x5E, 0xB6, 0x75, 0x2F, 0x3B, 0x97, 0x09, 0x18, 0x47, + 0xC8, 0x90, 0x37, 0xA3, 0xB2, 0xD2, 0x09, 0x3C, 0x5E, 0x6C, 0x2E, 0x72, 0x38, 0x08, 0x24, 0x99, + 0x90, 0xD0, 0x86, 0xC7, 0xD3, 0xFB, 0x4E, 0xA2, 0xDF, 0xC7, 0x26, 0x4D, 0x8E, 0x81, 0x98, 0x19, + 0x15, 0xD0, 0x4C, 0xB8, 0x44, 0xF7, 0x53, 0x1C, 0x0F, 0xAF, 0x78, 0x4C, 0x20, 0xB8, 0xCC, 0xBB, + 0x20, 0x60, 0xEC, 0x55, 0x70, 0xBD, 0xE9, 0x02, 0x63, 0x9F, 0x1F, 0xA7, 0xD5, 0x27, 0x18, 0x33, + 0x29, 0xA8, 0x33, 0x6E, 0xCB, 0x80, 0x40, 0x2D, 0x52, 0xDF, 0x6C, 0x78, 0x8F, 0xA6, 0x1D, 0xCF, + 0xE8, 0xB9, 0x54, 0x6B + }, + // ModuleKey + { + 0xAE, 0x25, 0xBC, 0x51, 0x06, 0x3B, 0x77, 0xBD, 0x36, 0x3C, 0x3E, 0xFE, 0x0F, 0xC1, 0x73, 0xF9 + }, + // Seed + { + 0x4D, 0x80, 0x8D, 0x2C, 0x77, 0xD9, 0x05, 0xC4, 0x1A, 0x63, 0x80, 0xEC, 0x08, 0x58, 0x6A, 0xFE + }, + // ServerKeySeed + { + 0xC2, 0xB7, 0xAD, 0xED, 0xFC, 0xCC, 0xA9, 0xC2, 0xBF, 0xB3, 0xF8, 0x56, 0x02, 0xBA, 0x80, 0x9B + }, + // ClientKeySeed + { + 0x7F, 0x96, 0xEE, 0xFD, 0xA5, 0xB6, 0x3D, 0x20, 0xA4, 0xDF, 0x8E, 0x00, 0xCB, 0xF4, 0x83, 0x04 + }, + // ClientKeySeedHash (SHA1(ClientKeySeed)) + { + 0x56, 0x8C, 0x05, 0x4C, 0x78, 0x1A, 0x97, 0x2A, 0x60, 0x37, 0xA2, 0x29, 0x0C, 0x22, 0xB5, 0x25, 0x71, 0xA0, 0x6F, 0x4E + } }; #endif diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 3d625df63d0..0734e0a0f63 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -187,15 +187,17 @@ std::string Warden::Penalty(WardenCheck* check /*= NULL*/) duration << sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_BAN_DURATION) << "s"; std::string accountName; AccountMgr::GetName(_session->GetAccountId(), accountName); - sWorld->BanAccount(BAN_ACCOUNT, accountName, duration.str(), "Warden Anticheat violation","Server"); + std::stringstream banReason; + banReason << "Warden Anticheat Violation: " << check->Comment << " (CheckId: " << check->CheckId << ")"; + sWorld->BanAccount(BAN_ACCOUNT, accountName, duration.str(), banReason.str(),"Server"); return "Ban"; break; } default: - return "Undefined"; break; } + return "Undefined"; } void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData) @@ -203,7 +205,7 @@ void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData) _warden->DecryptData(const_cast(recvData.contents()), recvData.size()); uint8 opcode; recvData >> opcode; - sLog->outDebug(LOG_FILTER_WARDEN, "Got packet, opcode %02X, size %u", opcode, recvData.size()); + sLog->outDebug(LOG_FILTER_WARDEN, "Got packet, opcode %02X, size %u", opcode, uint32(recvData.size())); recvData.hexlike(); switch(opcode) @@ -228,7 +230,7 @@ void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData) sLog->outDebug(LOG_FILTER_WARDEN, "NYI WARDEN_CMSG_MODULE_FAILED received!"); break; default: - sLog->outDebug(LOG_FILTER_WARDEN, "Got unknown warden opcode %02X of size %u.", opcode, recvData.size() - 1); + sLog->outDebug(LOG_FILTER_WARDEN, "Got unknown warden opcode %02X of size %u.", opcode, uint32(recvData.size() - 1)); break; } } diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h index e06ea7dca25..d16890b31b9 100644 --- a/src/server/game/Warden/Warden.h +++ b/src/server/game/Warden/Warden.h @@ -107,7 +107,7 @@ class Warden public: Warden(); - ~Warden(); + virtual ~Warden(); virtual void Init(WorldSession* session, BigNumber* k) = 0; virtual ClientWardenModule* GetModuleForClient() = 0; diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp index 77332bd30a8..f4c7a5069cf 100644 --- a/src/server/game/Warden/WardenCheckMgr.cpp +++ b/src/server/game/Warden/WardenCheckMgr.cpp @@ -25,10 +25,8 @@ #include "WardenCheckMgr.h" #include "Warden.h" - WardenCheckMgr::WardenCheckMgr() { - InternalDataID = 1; } WardenCheckMgr::~WardenCheckMgr() @@ -50,17 +48,6 @@ void WardenCheckMgr::LoadWardenChecks() return; } - // For reload case - for (uint16 i = 0; i < CheckStore.size(); ++i) - delete CheckStore[i]; - - CheckStore.clear(); - - for (CheckResultContainer::iterator itr = CheckResultStore.begin(); itr != CheckResultStore.end(); ++itr) - delete itr->second; - CheckResultStore.clear(); - - QueryResult result = WorldDatabase.Query("SELECT MAX(id) FROM warden_checks"); if (!result) @@ -72,17 +59,17 @@ void WardenCheckMgr::LoadWardenChecks() Field* fields = result->Fetch(); - uint32 maxCheckId = fields[0].GetUInt32(); + uint16 maxCheckId = fields[0].GetUInt16(); CheckStore.resize(maxCheckId + 1); - // 0 1 2 3 4 5 6 - result = WorldDatabase.Query("SELECT id, type, data, result, address, length, str FROM warden_checks ORDER BY id ASC"); + // 0 1 2 3 4 5 6 7 + result = WorldDatabase.Query("SELECT id, type, data, result, address, length, str, comment FROM warden_checks ORDER BY id ASC"); uint32 count = 0; do { - Field* fields = result->Fetch(); + fields = result->Fetch(); uint16 id = fields[0].GetUInt16(); uint8 checkType = fields[1].GetUInt8(); @@ -91,9 +78,11 @@ void WardenCheckMgr::LoadWardenChecks() uint32 address = fields[4].GetUInt32(); uint8 length = fields[5].GetUInt8(); std::string str = fields[6].GetString(); + std::string comment = fields[7].GetString(); WardenCheck* wardenCheck = new WardenCheck(); wardenCheck->Type = checkType; + wardenCheck->CheckId = id; // Initialize action with default action from config wardenCheck->Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION)); @@ -147,35 +136,57 @@ void WardenCheckMgr::LoadWardenChecks() CheckResultStore[id] = wr; } + if (comment.empty()) + wardenCheck->Comment = "Undocumented Check"; + else + wardenCheck->Comment = comment; + ++count; } while (result->NextRow()); - // Fetch overrides from char db and overwrite default action in CheckStore - QueryResult overrideResult = CharacterDatabase.Query("SELECT wardenId, action FROM warden_action"); + sLog->outString(">> Loaded %u warden checks.", count); + sLog->outString(); +} - uint32 overrideCount = 0; +void WardenCheckMgr::LoadWardenOverrides() +{ + // 0 1 + QueryResult result = CharacterDatabase.Query("SELECT wardenId, action FROM warden_action"); - if(overrideResult) + if (!result) { - do - { - Field * fields = overrideResult->Fetch(); + sLog->outString(">> Loaded 0 Warden action overrides. DB table `warden_action` is empty!"); + sLog->outString(); + return; + } + + uint32 count = 0; - uint16 checkId = fields[0].GetUInt16(); + ACE_WRITE_GUARD(ACE_RW_Mutex, g, _checkStoreLock); - // Check if override check ID actually exists in current Warden checks - if (checkId > maxCheckId) - sLog->outError("Warden check action override for invalid check (ID: %u, action: %u), skipped", checkId, fields[1].GetUInt8()); - else - CheckStore[fields[0].GetUInt16()]->Action = WardenActions(fields[1].GetUInt8()); + do + { + Field* fields = result->Fetch(); + + uint16 checkId = fields[0].GetUInt16(); + uint8 action = fields[1].GetUInt8(); - ++overrideCount; + // Check if action value is in range (0-2, see WardenActions enum) + if (action > WARDEN_ACTION_BAN) + sLog->outError("Warden check override action out of range (ID: %u, action: %u)", checkId, action); + // Check if check actually exists before accessing the CheckStore vector + else if (checkId > CheckStore.size()) + sLog->outError("Warden check action override for non-existing check (ID: %u, action: %u), skipped", checkId, action); + else + { + CheckStore[checkId]->Action = WardenActions(action); + ++count; } - while (overrideResult->NextRow()); } + while (result->NextRow()); - sLog->outString(">> Loaded %u warden checks and %u action overrides.", count, overrideCount); + sLog->outString(">> Loaded %u warden action overrides.", count); sLog->outString(); } diff --git a/src/server/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h index cbe8460db3b..7a83d8f0c6d 100644 --- a/src/server/game/Warden/WardenCheckMgr.h +++ b/src/server/game/Warden/WardenCheckMgr.h @@ -36,6 +36,8 @@ struct WardenCheck uint32 Address; // PROC_CHECK, MEM_CHECK, PAGE_CHECK uint8 Length; // PROC_CHECK, MEM_CHECK, PAGE_CHECK std::string Str; // LUA, MPQ, DRIVER + std::string Comment; + uint16 CheckId; enum WardenActions Action; }; @@ -58,11 +60,13 @@ class WardenCheckMgr WardenCheck* GetWardenDataById(uint16 Id); WardenCheckResult* GetWardenResultById(uint16 Id); - uint32 InternalDataID; std::vector MemChecksIdPool; std::vector OtherChecksIdPool; void LoadWardenChecks(); + void LoadWardenOverrides(); + + ACE_RW_Mutex _checkStoreLock; private: CheckContainer CheckStore; diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp index f62aa11a339..a60ae765013 100644 --- a/src/server/game/Warden/WardenMac.cpp +++ b/src/server/game/Warden/WardenMac.cpp @@ -122,7 +122,7 @@ void WardenMac::HandleHashResult(ByteBuffer &buff) uint8 mod_seed[16] = { 0x4D, 0x80, 0x8D, 0x2C, 0x77, 0xD9, 0x05, 0xC4, 0x1A, 0x63, 0x80, 0xEC, 0x08, 0x58, 0x6A, 0xFE }; - for(int i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { keyIn[i] = *(int*)(&mod_seed[0] + i * 4); } diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index a77c77a3261..a7485d7da51 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -49,16 +49,8 @@ void WardenWin::Init(WorldSession* session, BigNumber *k) SHA1Randx WK(k->AsByteArray(), k->GetNumBytes()); WK.generate(_inputKey, 16); WK.generate(_outputKey, 16); - /* - Seed: 4D808D2C77D905C41A6380EC08586AFE (0x05 packet) - Hash: 568C054C781A972A6037A2290C22B52571A06F4E (0x04 packet) - Module MD5: 79C0768D657977D697E10BAD956CCED1 - New Client Key: 7F 96 EE FD A5 B6 3D 20 A4 DF 8E 00 CB F4 83 04 - New Cerver Key: C2 B7 AD ED FC CC A9 C2 BF B3 F8 56 02 BA 80 9B - */ - uint8 mod_seed[16] = { 0x4D, 0x80, 0x8D, 0x2C, 0x77, 0xD9, 0x05, 0xC4, 0x1A, 0x63, 0x80, 0xEC, 0x08, 0x58, 0x6A, 0xFE }; - memcpy(_seed, mod_seed, 16); + memcpy(_seed, Module.Seed, 16); _inputCrypto.Init(_inputKey); _outputCrypto.Init(_outputKey); @@ -79,13 +71,13 @@ ClientWardenModule* WardenWin::GetModuleForClient() { ClientWardenModule *mod = new ClientWardenModule; - uint32 length = sizeof(Module_79C0768D657977D697E10BAD956CCED1_Data); + uint32 length = sizeof(Module.Module); // data assign mod->CompressedSize = length; mod->CompressedData = new uint8[length]; - memcpy(mod->CompressedData, Module_79C0768D657977D697E10BAD956CCED1_Data, length); - memcpy(mod->Key, Module_79C0768D657977D697E10BAD956CCED1_Key, 16); + memcpy(mod->CompressedData, Module.Module, length); + memcpy(mod->Key, Module.ModuleKey, 16); // md5 hash MD5_CTX ctx; @@ -104,7 +96,6 @@ void WardenWin::InitializeModule() WardenInitModuleRequest Request; Request.Command1 = WARDEN_SMSG_MODULE_INITIALIZE; Request.Size1 = 20; - Request.CheckSumm1 = BuildChecksum(&Request.Unk1, 20); Request.Unk1 = 1; Request.Unk2 = 0; Request.Type = 1; @@ -113,24 +104,25 @@ void WardenWin::InitializeModule() Request.Function1[1] = 0x000218C0; // 0x00400000 + 0x000218C0 SFileGetFileSize Request.Function1[2] = 0x00022530; // 0x00400000 + 0x00022530 SFileReadFile Request.Function1[3] = 0x00022910; // 0x00400000 + 0x00022910 SFileCloseFile + Request.CheckSumm1 = BuildChecksum(&Request.Unk1, 20); Request.Command2 = WARDEN_SMSG_MODULE_INITIALIZE; Request.Size2 = 8; - Request.CheckSumm2 = BuildChecksum(&Request.Unk2, 8); Request.Unk3 = 4; Request.Unk4 = 0; Request.String_library2 = 0; Request.Function2 = 0x00419D40; // 0x00400000 + 0x00419D40 FrameScript::GetText Request.Function2_set = 1; + Request.CheckSumm2 = BuildChecksum(&Request.Unk2, 8); Request.Command3 = WARDEN_SMSG_MODULE_INITIALIZE; Request.Size3 = 8; - Request.CheckSumm3 = BuildChecksum(&Request.Unk5, 8); Request.Unk5 = 1; Request.Unk6 = 1; Request.String_library3 = 0; Request.Function3 = 0x0046AE20; // 0x00400000 + 0x0046AE20 PerformanceCounter Request.Function3_set = 1; + Request.CheckSumm3 = BuildChecksum(&Request.Unk5, 8); // Encrypt with warden RC4 key. EncryptData((uint8*)&Request, sizeof(WardenInitModuleRequest)); @@ -161,10 +153,8 @@ void WardenWin::HandleHashResult(ByteBuffer &buff) { buff.rpos(buff.wpos()); - const uint8 validHash[20] = { 0x56, 0x8C, 0x05, 0x4C, 0x78, 0x1A, 0x97, 0x2A, 0x60, 0x37, 0xA2, 0x29, 0x0C, 0x22, 0xB5, 0x25, 0x71, 0xA0, 0x6F, 0x4E }; - // Verify key - if (memcmp(buff.contents() + 1, validHash, sizeof(validHash)) != 0) + if (memcmp(buff.contents() + 1, Module.ClientKeySeedHash, 20) != 0) { sLog->outDebug(LOG_FILTER_WARDEN, "Request hash reply: failed"); sLog->outWarden("WARDEN: Player %s (guid: %u, account: %u) failed hash reply. Action: %s", @@ -174,15 +164,9 @@ void WardenWin::HandleHashResult(ByteBuffer &buff) sLog->outDebug(LOG_FILTER_WARDEN, "Request hash reply: succeed"); - // Client 7F96EEFDA5B63D20A4DF8E00CBF48304 - const uint8 client_key[16] = { 0x7F, 0x96, 0xEE, 0xFD, 0xA5, 0xB6, 0x3D, 0x20, 0xA4, 0xDF, 0x8E, 0x00, 0xCB, 0xF4, 0x83, 0x04 }; - - // Server C2B7ADEDFCCCA9C2BFB3F85602BA809B - const uint8 server_key[16] = { 0xC2, 0xB7, 0xAD, 0xED, 0xFC, 0xCC, 0xA9, 0xC2, 0xBF, 0xB3, 0xF8, 0x56, 0x02, 0xBA, 0x80, 0x9B }; - // Change keys here - memcpy(_inputKey, client_key, 16); - memcpy(_outputKey, server_key, 16); + memcpy(_inputKey, Module.ClientKeySeed, 16); + memcpy(_outputKey, Module.ServerKeySeed, 16); _inputCrypto.Init(_inputKey); _outputCrypto.Init(_outputKey); @@ -228,6 +212,8 @@ void WardenWin::RequestData() ByteBuffer buff; buff << uint8(WARDEN_SMSG_CHEAT_CHECKS_REQUEST); + ACE_READ_GUARD(ACE_RW_Mutex, g, sWardenCheckMgr->_checkStoreLock); + for (uint32 i = 0; i < sWorld->getIntConfig(CONFIG_WARDEN_NUM_OTHER_CHECKS); ++i) { // If todo list is done break loop (will be filled on next Update() run) @@ -339,7 +325,7 @@ void WardenWin::RequestData() for (std::list::iterator itr = _currentChecks.begin(); itr != _currentChecks.end(); ++itr) stream << *itr << " "; - sLog->outWarden("%s", stream.str().c_str()); + sLog->outDebug(LOG_FILTER_WARDEN, "%s", stream.str().c_str()); } void WardenWin::HandleData(ByteBuffer &buff) @@ -393,6 +379,8 @@ void WardenWin::HandleData(ByteBuffer &buff) uint8 type; uint16 checkFailed = 0; + ACE_READ_GUARD(ACE_RW_Mutex, g, sWardenCheckMgr->_checkStoreLock); + for (std::list::iterator itr = _currentChecks.begin(); itr != _currentChecks.end(); ++itr) { rd = sWardenCheckMgr->GetWardenDataById(*itr); diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index 2a48ede4c81..965e6bf3805 100755 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -147,7 +147,7 @@ bool Weather::ReGenerate() } // At this point, only weather that isn't doing anything remains but that have weather data - uint32 chance1 = m_weatherChances->data[season].rainChance; + uint32 chance1 = m_weatherChances->data[season].rainChance; uint32 chance2 = chance1+ m_weatherChances->data[season].snowChance; uint32 chance3 = chance2+ m_weatherChances->data[season].stormChance; diff --git a/src/server/game/Weather/Weather.h b/src/server/game/Weather/Weather.h index 0c17cfd1efe..dadd1151a53 100755 --- a/src/server/game/Weather/Weather.h +++ b/src/server/game/Weather/Weather.h @@ -89,4 +89,3 @@ class Weather WeatherData const* m_weatherChances; }; #endif - diff --git a/src/server/game/Weather/WeatherMgr.cpp b/src/server/game/Weather/WeatherMgr.cpp index 731aba8d197..bb8fadf08bc 100755 --- a/src/server/game/Weather/WeatherMgr.cpp +++ b/src/server/game/Weather/WeatherMgr.cpp @@ -24,14 +24,14 @@ #include "Weather.h" #include "Log.h" #include "ObjectMgr.h" -#include +#include "AutoPtr.h" namespace WeatherMgr { namespace { - typedef UNORDERED_MAP > WeatherMap; + typedef UNORDERED_MAP > WeatherMap; typedef UNORDERED_MAP WeatherZoneMap; WeatherMap m_weathers; @@ -108,9 +108,9 @@ void LoadWeatherData() for (uint8 season = 0; season < WEATHER_SEASONS; ++season) { - wzc.data[season].rainChance = fields[season * (MAX_WEATHER_TYPE-1) + 1].GetUInt32(); - wzc.data[season].snowChance = fields[season * (MAX_WEATHER_TYPE-1) + 2].GetUInt32(); - wzc.data[season].stormChance = fields[season * (MAX_WEATHER_TYPE-1) + 3].GetUInt32(); + wzc.data[season].rainChance = fields[season * (MAX_WEATHER_TYPE-1) + 1].GetUInt8(); + wzc.data[season].snowChance = fields[season * (MAX_WEATHER_TYPE-1) + 2].GetUInt8(); + wzc.data[season].stormChance = fields[season * (MAX_WEATHER_TYPE-1) + 3].GetUInt8(); if (wzc.data[season].rainChance > 100) { diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 45b1c4dac64..b5c0e13c425 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -77,8 +77,9 @@ #include "Channel.h" #include "WardenCheckMgr.h" #include "Warden.h" +#include "CalendarMgr.h" -volatile bool World::m_stopEvent = false; +ACE_Atomic_Op World::m_stopEvent = false; uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE; volatile uint32 World::m_worldLoopCounter = 0; @@ -207,6 +208,7 @@ bool World::RemoveSession(uint32 id) { if (itr->second->PlayerLoading()) return false; + itr->second->KickPlayer(); } @@ -218,8 +220,7 @@ void World::AddSession(WorldSession* s) addSessQueue.add(s); } -void -World::AddSession_(WorldSession* s) +void World::AddSession_(WorldSession* s) { ASSERT (s); @@ -267,16 +268,13 @@ World::AddSession_(WorldSession* s) { AddQueuedPlayer (s); UpdateMaxSessionCounters(); - sLog->outDetail ("PlayerQueue: Account id %u is in Queue Position (%u).", s->GetAccountId(), ++QueueSize); + sLog->outDetail("PlayerQueue: Account id %u is in Queue Position (%u).", s->GetAccountId(), ++QueueSize); return; } s->SendAuthResponse(AUTH_OK, true); - s->SendAddonsInfo(); - s->SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); - s->SendTutorialsData(); UpdateMaxSessionCounters(); @@ -287,7 +285,7 @@ World::AddSession_(WorldSession* s) float popu = (float)GetActiveSessionCount(); // updated number of users on the server popu /= pLimit; popu *= 2; - sLog->outDetail ("Server Population (%f).", popu); + sLog->outDetail("Server Population (%f).", popu); } } @@ -1203,7 +1201,9 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_PDUMP_NO_PATHS] = ConfigMgr::GetBoolDefault("PlayerDump.DisallowPaths", true); m_bool_configs[CONFIG_PDUMP_NO_OVERWRITE] = ConfigMgr::GetBoolDefault("PlayerDump.DisallowOverwrite", true); - sScriptMgr->OnConfigLoad(reload); + // call ScriptMgr if we're reloading the configuration + if (reload) + sScriptMgr->OnConfigLoad(reload); } extern void LoadGameObjectModelList(); @@ -1279,6 +1279,9 @@ void World::SetInitialWorldSettings() sLog->outString("Loading SpellInfo store..."); sSpellMgr->LoadSpellInfoStore(); + sLog->outString("Loading SkillLineAbilityMultiMap Data..."); + sSpellMgr->LoadSkillLineAbilityMap(); + sLog->outString("Loading spell custom attributes..."); sSpellMgr->LoadSpellCustomAttr(); @@ -1291,9 +1294,6 @@ void World::SetInitialWorldSettings() sLog->outString("Loading Instance Template..."); sObjectMgr->LoadInstanceTemplate(); - sLog->outString("Loading SkillLineAbilityMultiMap Data..."); - sSpellMgr->LoadSkillLineAbilityMap(); - // Must be called before `creature_respawn`/`gameobject_respawn` tables sLog->outString("Loading instances..."); sInstanceSaveMgr->LoadInstances(); @@ -1591,7 +1591,7 @@ void World::SetInitialWorldSettings() sSmartWaypointMgr->LoadFromDB(); sLog->outString("Loading Creature Formations..."); - FormationMgr::LoadCreatureFormations(); + sFormationMgr->LoadCreatureFormations(); sLog->outString("Loading World States..."); // must be loaded before battleground, outdoor PvP and conditions LoadWorldStates(); @@ -1653,8 +1653,12 @@ void World::SetInitialWorldSettings() sLog->outString("Loading Creature Texts..."); sCreatureTextMgr->LoadCreatureTexts(); + sLog->outString("Loading Creature Text Locales..."); + sCreatureTextMgr->LoadCreatureTextLocales(); + sLog->outString("Initializing Scripts..."); sScriptMgr->Initialize(); + sScriptMgr->OnConfigLoad(false); // must be done after the ScriptMgr has been properly initialized sLog->outString("Validating spell scripts..."); sObjectMgr->ValidateSpellScripts(); @@ -1662,21 +1666,16 @@ void World::SetInitialWorldSettings() sLog->outString("Loading SmartAI scripts..."); sSmartScriptMgr->LoadSmartAIFromDB(); + sLog->outString("Loading Calendar data..."); + sCalendarMgr->LoadFromDB(); + ///- Initialize game time and timers sLog->outString("Initialize game time and timers"); m_gameTime = time(NULL); - m_startTime=m_gameTime; - - tm local; - time_t curr; - time(&curr); - local=*(localtime(&curr)); // dereference and assign - char isoDate[128]; - sprintf(isoDate, "%04d-%02d-%02d %02d:%02d:%02d", - local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec); + m_startTime = m_gameTime; - LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, startstring, uptime, revision) VALUES('%u', " UI64FMTD ", '%s', 0, '%s')", - realmID, uint64(m_startTime), isoDate, _FULLVERSION); // One-time query + LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES(%u, %u, 0, '%s')", + realmID, uint32(m_startTime), _FULLVERSION); // One-time query m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); @@ -1742,8 +1741,11 @@ void World::SetInitialWorldSettings() sLog->outString("Loading Warden Checks..." ); sWardenCheckMgr->LoadWardenChecks(); + sLog->outString("Loading Warden Action Overrides..." ); + sWardenCheckMgr->LoadWardenOverrides(); + sLog->outString("Deleting expired bans..."); - LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate"); + LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate"); // One-time query sLog->outString("Calculate next daily quest reset time..."); InitDailyQuestResetTime(); @@ -1774,7 +1776,7 @@ void World::SetInitialWorldSettings() uint32 startupDuration = GetMSTimeDiffToNow(startupBegin); sLog->outString(); - sLog->outString("WORLD: World initialized in %u minutes %u seconds", (startupDuration / 60000), ((startupDuration % 60000) / 1000) ); + sLog->outString("WORLD: World initialized in %u minutes %u seconds", (startupDuration / 60000), ((startupDuration % 60000) / 1000)); sLog->outString(); } @@ -1964,10 +1966,10 @@ void World::Update(uint32 diff) PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_UPTIME_PLAYERS); - stmt->setUInt64(0, uint64(tmpDiff)); + stmt->setUInt32(0, tmpDiff); stmt->setUInt16(1, uint16(maxOnlinePlayers)); stmt->setUInt32(2, realmID); - stmt->setUInt64(3, uint64(m_startTime)); + stmt->setUInt32(3, uint32(m_startTime)); LoginDatabase.Execute(stmt); } @@ -2313,7 +2315,7 @@ BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string dura do { Field* fieldsAccount = resultAccounts->Fetch(); - uint32 account = fieldsAccount->GetUInt32(); + uint32 account = fieldsAccount[0].GetUInt32(); if (mode != BAN_IP) { @@ -2449,7 +2451,7 @@ void World::_UpdateGameTime() m_gameTime = thisTime; ///- if there is a shutdown timer - if (!m_stopEvent && m_ShutdownTimer > 0 && elapsed > 0) + if (!IsStopped() && m_ShutdownTimer > 0 && elapsed > 0) { ///- ... and it is overdue, stop the world (set m_stopEvent) if (m_ShutdownTimer <= elapsed) @@ -2473,7 +2475,7 @@ void World::_UpdateGameTime() void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode) { // ignore if server shutdown at next tick - if (m_stopEvent) + if (IsStopped()) return; m_ShutdownMask = options; @@ -2525,7 +2527,7 @@ void World::ShutdownMsg(bool show, Player* player) void World::ShutdownCancel() { // nothing cancel or too later - if (!m_ShutdownTimer || m_stopEvent) + if (!m_ShutdownTimer || m_stopEvent.value()) return; ServerMessageType msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_CANCELLED : SERVER_MSG_SHUTDOWN_CANCELLED; @@ -2609,7 +2611,7 @@ void World::SendAutoBroadcast() std::string msg; - msg = SelectRandomContainerElement(m_Autobroadcasts); + msg = Trinity::Containers::SelectRandomContainerElement(m_Autobroadcasts); uint32 abcenter = sWorld->getIntConfig(CONFIG_AUTOBROADCAST_CENTER); @@ -2649,15 +2651,15 @@ void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount) { Field* fields = resultCharCount->Fetch(); uint32 accountId = fields[0].GetUInt32(); - uint32 charCount = fields[1].GetUInt32(); + uint8 charCount = uint8(fields[1].GetUInt64()); - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM); stmt->setUInt32(0, accountId); stmt->setUInt32(1, realmID); LoginDatabase.Execute(stmt); stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_REALM_CHARACTERS); - stmt->setUInt32(0, charCount); + stmt->setUInt8(0, charCount); stmt->setUInt32(1, accountId); stmt->setUInt32(2, realmID); LoginDatabase.Execute(stmt); @@ -2749,9 +2751,12 @@ void World::ResetDailyQuests() void World::LoadDBAllowedSecurityLevel() { - QueryResult result = LoginDatabase.PQuery("SELECT allowedSecurityLevel from realmlist WHERE id = '%d'", realmID); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL); + stmt->setInt32(0, int32(realmID)); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (result) - SetPlayerSecurityLimit(AccountTypes(result->Fetch()->GetUInt16())); + SetPlayerSecurityLimit(AccountTypes(result->Fetch()->GetUInt8())); } void World::SetPlayerSecurityLimit(AccountTypes _sec) @@ -2930,7 +2935,7 @@ void World::LoadCharacterNameData() { sLog->outString("Loading character name data"); - QueryResult result = CharacterDatabase.Query("SELECT guid, name, race, gender, class FROM characters"); + QueryResult result = CharacterDatabase.Query("SELECT guid, name, race, gender, class FROM characters WHERE deleteDate IS NULL"); if (!result) { sLog->outError("No character name data loaded, empty query"); @@ -2941,7 +2946,7 @@ void World::LoadCharacterNameData() do { - Field *fields = result->Fetch(); + Field* fields = result->Fetch(); AddCharacterNameData(fields[0].GetUInt32(), fields[1].GetString(), fields[3].GetUInt8() /*gender*/, fields[2].GetUInt8() /*race*/, fields[4].GetUInt8() /*class*/); ++count; diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 6304699e7e1..51f384770da 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -26,6 +26,7 @@ #include "Common.h" #include "Timer.h" #include +#include #include "SharedDefines.h" #include "QueryResult.h" #include "Callback.h" @@ -660,7 +661,7 @@ class World void ShutdownMsg(bool show = false, Player* player = NULL); static uint8 GetExitCode() { return m_ExitCode; } static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; } - static bool IsStopped() { return m_stopEvent; } + static bool IsStopped() { return m_stopEvent.value(); } void Update(uint32 diff); @@ -778,7 +779,7 @@ class World void ResetWeeklyQuests(); void ResetRandomBG(); private: - static volatile bool m_stopEvent; + static ACE_Atomic_Op m_stopEvent; static uint8 m_ExitCode; uint32 m_ShutdownTimer; uint32 m_ShutdownMask; diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 62336e95ff6..792fdeb3e7b 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -34,7 +34,6 @@ set(scripts_STAT_SRCS ../game/AI/ScriptedAI/ScriptedEscortAI.cpp ../game/AI/ScriptedAI/ScriptedCreature.cpp ../game/AI/ScriptedAI/ScriptedFollowerAI.cpp - ../game/AI/ScriptedAI/ScriptedSimpleAI.cpp ) if(SCRIPTS) @@ -54,7 +53,6 @@ include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/g3dlite/include ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/mersennetwister ${CMAKE_SOURCE_DIR}/dep/zlib ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration @@ -121,6 +119,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Maps ${CMAKE_SOURCE_DIR}/src/server/game/Movement ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators + ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints ${CMAKE_SOURCE_DIR}/src/server/game/Opcodes ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt index b17350c265d..86fe984e197 100644 --- a/src/server/scripts/Commands/CMakeLists.txt +++ b/src/server/scripts/Commands/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -17,7 +17,6 @@ set(scripts_STAT_SRCS Commands/cs_gm.cpp Commands/cs_go.cpp Commands/cs_gobject.cpp - Commands/cs_gps.cpp Commands/cs_honor.cpp Commands/cs_learn.cpp Commands/cs_misc.cpp diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 7372c92c4dd..b52102479b5 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -194,8 +194,11 @@ public: static bool HandleAccountOnlineListCommand(ChatHandler* handler, char const* /*args*/) { ///- Get the list of accounts ID logged to the realm - QueryResult resultDB = CharacterDatabase.Query("SELECT name, account, map, zone FROM characters WHERE online > 0"); - if (!resultDB) + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_ONLINE); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (!result) { handler->SendSysMessage(LANG_ACCOUNT_LIST_EMPTY); return true; @@ -209,31 +212,28 @@ public: ///- Cycle through accounts do { - Field* fieldsDB = resultDB->Fetch(); + Field* fieldsDB = result->Fetch(); std::string name = fieldsDB[0].GetString(); uint32 account = fieldsDB[1].GetUInt32(); ///- Get the username, last IP and GM level of each account // No SQL injection. account is uint32. - QueryResult resultLogin = - LoginDatabase.PQuery("SELECT a.username, a.last_ip, aa.gmlevel, a.expansion " - "FROM account a " - "LEFT JOIN account_access aa " - "ON (a.id = aa.id) " - "WHERE a.id = '%u'", account); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO); + stmt->setUInt32(0, account); + PreparedQueryResult resultLogin = LoginDatabase.Query(stmt); if (resultLogin) { Field* fieldsLogin = resultLogin->Fetch(); handler->PSendSysMessage(LANG_ACCOUNT_LIST_LINE, fieldsLogin[0].GetCString(), name.c_str(), fieldsLogin[1].GetCString(), - fieldsDB[2].GetUInt16(), fieldsDB[3].GetUInt16(), fieldsLogin[3].GetUInt32(), - fieldsLogin[2].GetUInt32()); + fieldsDB[2].GetUInt16(), fieldsDB[3].GetUInt16(), fieldsLogin[3].GetUInt8(), + fieldsLogin[2].GetUInt8()); } else handler->PSendSysMessage(LANG_ACCOUNT_LIST_ERROR, name.c_str()); - } while (resultDB->NextRow()); + } while (result->NextRow()); handler->SendSysMessage(LANG_ACCOUNT_LIST_BAR); return true; @@ -382,7 +382,7 @@ public: // Let set addon state only for lesser (strong) security level // or to self account - if (handler->GetSession() && handler->GetSession()->GetAccountId () != accountId && + if (handler->GetSession() && handler->GetSession()->GetAccountId() != accountId && handler->HasLowerSecurityAccount(NULL, accountId, true)) return false; @@ -469,7 +469,13 @@ public: // Check and abort if the target gm has a higher rank on one of the realms and the new realm is -1 if (gmRealmID == -1 && !AccountMgr::IsConsoleAccount(playerSecurity)) { - QueryResult result = LoginDatabase.PQuery("SELECT * FROM account_access WHERE id = '%u' AND gmlevel > '%d'", targetAccountId, gm); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST); + + stmt->setUInt32(0, targetAccountId); + stmt->setUInt8(1, uint8(gm)); + + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (result) { handler->SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); @@ -502,11 +508,12 @@ public: stmt->setUInt32(0, targetAccountId); stmt->setUInt32(1, realmID); } + LoginDatabase.Execute(stmt); if (gm != 0) { - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_ACCESS); + stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_ACCESS); stmt->setUInt32(0, targetAccountId); stmt->setUInt8(1, uint8(gm)); diff --git a/src/server/scripts/Commands/cs_achievement.cpp b/src/server/scripts/Commands/cs_achievement.cpp index f136cba46ab..7667e79ece7 100644 --- a/src/server/scripts/Commands/cs_achievement.cpp +++ b/src/server/scripts/Commands/cs_achievement.cpp @@ -67,7 +67,7 @@ public: return false; } - if (AchievementEntry const* achievementEntry = GetAchievementStore()->LookupEntry(achievementId)) + if (AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievementId)) target->CompletedAchievement(achievementEntry); return true; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 4c4869c1c5b..6accc96260b 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -46,7 +46,7 @@ public: { "cinematic", SEC_MODERATOR, false, &HandleDebugPlayCinematicCommand, "", NULL }, { "movie", SEC_MODERATOR, false, &HandleDebugPlayMovieCommand, "", NULL }, { "sound", SEC_MODERATOR, false, &HandleDebugPlaySoundCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { NULL, SEC_PLAYER, false, NULL, "", NULL } }; static ChatCommand debugSendCommandTable[] = { @@ -61,7 +61,7 @@ public: { "sellerror", SEC_ADMINISTRATOR, false, &HandleDebugSendSellErrorCommand, "", NULL }, { "setphaseshift", SEC_ADMINISTRATOR, false, &HandleDebugSendSetPhaseShiftCommand, "", NULL }, { "spellfail", SEC_ADMINISTRATOR, false, &HandleDebugSendSpellFailCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { NULL, SEC_PLAYER, false, NULL, "", NULL } }; static ChatCommand debugCommandTable[] = { @@ -89,12 +89,14 @@ public: { "itemexpire", SEC_ADMINISTRATOR, false, &HandleDebugItemExpireCommand, "", NULL }, { "areatriggers", SEC_ADMINISTRATOR, false, &HandleDebugAreaTriggersCommand, "", NULL }, { "los", SEC_MODERATOR, false, &HandleDebugLoSCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "moveflags", SEC_ADMINISTRATOR, false, &HandleDebugMoveflagsCommand, "", NULL }, + { NULL, SEC_PLAYER, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { { "debug", SEC_MODERATOR, true, NULL, "", debugCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "wpgps", SEC_ADMINISTRATOR, false, &HandleWPGPSCommand, "", NULL }, + { NULL, SEC_PLAYER, false, NULL, "", NULL } }; return commandTable; } @@ -1197,7 +1199,7 @@ public: int currentValue = (int)handler->GetSession()->GetPlayer()->GetUInt32Value(opcode); currentValue += value; - handler->GetSession()->GetPlayer()->SetUInt32Value(opcode , (uint32)currentValue); + handler->GetSession()->GetPlayer()->SetUInt32Value(opcode, (uint32)currentValue); handler->PSendSysMessage(LANG_CHANGE_32BIT_FIELD, opcode, currentValue); @@ -1283,6 +1285,51 @@ public: handler->PSendSysMessage(LANG_SET_32BIT_FIELD, opcode, value); return true; } + + static bool HandleDebugMoveflagsCommand(ChatHandler* handler, char const* args) + { + Unit* target = handler->getSelectedUnit(); + if (!target) + target = handler->GetSession()->GetPlayer(); + + if (!*args) + { + //! Display case + handler->PSendSysMessage(LANG_MOVEFLAGS_GET, target->GetUnitMovementFlags(), target->GetExtraUnitMovementFlags()); + } + else + { + char* mask1 = strtok((char*)args, " "); + if (!mask1) + return false; + + char* mask2 = strtok(NULL, " \n"); + + uint32 moveFlags = (uint32)atoi(mask1); + target->SetUnitMovementFlags(moveFlags); + + if (mask2) + { + uint32 moveFlagsExtra = uint32(atoi(mask2)); + target->SetExtraUnitMovementFlags(moveFlagsExtra); + } + + target->SendMovementFlagUpdate(); + handler->PSendSysMessage(LANG_MOVEFLAGS_SET, target->GetUnitMovementFlags(), target->GetExtraUnitMovementFlags()); + } + + return true; + } + + static bool HandleWPGPSCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + sLog->outSQLDev("(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); + + handler->PSendSysMessage("Waypoint SQL written to SQL Developer log"); + return true; + } }; void AddSC_debug_commandscript() diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 0dcb6995cb1..ba5a7f10d7d 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -153,7 +153,11 @@ public: static bool HandleGMListFullCommand(ChatHandler* handler, char const* /*args*/) { ///- Get the accounts with GM Level >0 - QueryResult result = LoginDatabase.PQuery("SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= %u AND (aa.realmid = -1 OR aa.realmid = %u)", SEC_MODERATOR, realmID); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_GM_ACCOUNTS); + stmt->setUInt8(0, uint8(SEC_MODERATOR)); + stmt->setInt32(1, int32(realmID)); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (result) { handler->SendSysMessage(LANG_GMLIST); diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 74b8272201b..232aad9f21c 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -535,11 +535,17 @@ public: uint32 count = 0; Player* player = handler->GetSession()->GetPlayer(); - QueryResult result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, map, " - "(POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ " - "FROM gameobject WHERE map='%u' AND (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) <= '%f' ORDER BY order_", - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), - player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), distance * distance); + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_GAMEOBJECT_NEAREST); + stmt->setFloat(0, player->GetPositionX()); + stmt->setFloat(1, player->GetPositionY()); + stmt->setFloat(2, player->GetPositionZ()); + stmt->setUInt32(3, player->GetMapId()); + stmt->setFloat(4, player->GetPositionX()); + stmt->setFloat(5, player->GetPositionY()); + stmt->setFloat(6, player->GetPositionZ()); + stmt->setFloat(7, distance * distance); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (result) { diff --git a/src/server/scripts/Commands/cs_gps.cpp b/src/server/scripts/Commands/cs_gps.cpp deleted file mode 100644 index 12a5efddf47..00000000000 --- a/src/server/scripts/Commands/cs_gps.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -Name: gps_commandscript -%Complete: 100 -Comment: GPS/WPGPS commands -Category: commandscripts -EndScriptData */ - -#include "ObjectAccessor.h" -#include "ScriptMgr.h" -#include "Chat.h" -#include "CellImpl.h" - -class gps_commandscript : public CommandScript -{ -public: - gps_commandscript() : CommandScript("gps_commandscript") { } - - ChatCommand* GetCommands() const - { - static ChatCommand commandTable[] = - { - { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL }, - { "wpgps", SEC_ADMINISTRATOR, false, &HandleWPGPSCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - return commandTable; - } - - static bool HandleGPSCommand(ChatHandler* handler, char const* args) - { - WorldObject* object = NULL; - if (*args) - { - uint64 guid = handler->extractGuidFromLink((char*)args); - if (guid) - object = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); - - if (!object) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - } - else - { - object = handler->getSelectedUnit(); - - if (!object) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - } - - CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY()); - Cell cell(cellCoord); - - uint32 zoneId, areaId; - object->GetZoneAndAreaId(zoneId, areaId); - - MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId()); - AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId); - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); - - float zoneX = object->GetPositionX(); - float zoneY = object->GetPositionY(); - - Map2ZoneCoordinates(zoneX, zoneY, zoneId); - - Map const* map = object->GetMap(); - float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT); - float floorZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()); - - GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY()); - - // 63? WHY? - int gridX = 63 - gridCoord.x_coord; - int gridY = 63 - gridCoord.y_coord; - - uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0; - uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0; - - if (haveVMap) - { - if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ())) - handler->PSendSysMessage("You are outdoors"); - else - handler->PSendSysMessage("You are indoors"); - } - else - handler->PSendSysMessage("no VMAP available for area info"); - - handler->PSendSysMessage(LANG_MAP_POSITION, - object->GetMapId(), (mapEntry ? mapEntry->name : ""), - zoneId, (zoneEntry ? zoneEntry->area_name : ""), - areaId, (areaEntry ? areaEntry->area_name : ""), - object->GetPhaseMask(), - object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), - cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), - zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); - - LiquidData liquidStatus; - ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); - - if (status) - handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.type, status); - - return true; - } - - static bool HandleWPGPSCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - - sLog->outSQLDev("(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); - - handler->PSendSysMessage("Waypoint SQL written to SQL Developer log"); - return true; - } -}; - -void AddSC_gps_commandscript() -{ - new gps_commandscript(); -} diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index fcabaaa7e5b..ae573577d7e 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -248,7 +248,7 @@ public: return false; } - CreatureTemplate const* creatureInfo = pet->GetCreatureInfo(); + CreatureTemplate const* creatureInfo = pet->GetCreatureTemplate(); if (!creatureInfo) { handler->SendSysMessage(LANG_WRONG_PET_TYPE); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 5f0434e5c55..7c431566f52 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -17,6 +17,9 @@ #include "ScriptPCH.h" #include "Chat.h" +#include "ObjectAccessor.h" +#include "ScriptMgr.h" +#include "CellImpl.h" class misc_commandscript : public CommandScript { @@ -27,7 +30,8 @@ public: { static ChatCommand commandTable[] = { - { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL }, + { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL }, + { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; return commandTable; @@ -64,6 +68,90 @@ public: handler->SetSentErrorMessage(true); return false; } + + static bool HandleGPSCommand(ChatHandler* handler, char const* args) + { + WorldObject* object = NULL; + if (*args) + { + uint64 guid = handler->extractGuidFromLink((char*)args); + if (guid) + object = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); + + if (!object) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + } + else + { + object = handler->getSelectedUnit(); + + if (!object) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + } + + CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY()); + Cell cell(cellCoord); + + uint32 zoneId, areaId; + object->GetZoneAndAreaId(zoneId, areaId); + + MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId()); + AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId); + AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); + + float zoneX = object->GetPositionX(); + float zoneY = object->GetPositionY(); + + Map2ZoneCoordinates(zoneX, zoneY, zoneId); + + Map const* map = object->GetMap(); + float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT); + float floorZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()); + + GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY()); + + // 63? WHY? + int gridX = 63 - gridCoord.x_coord; + int gridY = 63 - gridCoord.y_coord; + + uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0; + uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0; + + if (haveVMap) + { + if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ())) + handler->PSendSysMessage("You are outdoors"); + else + handler->PSendSysMessage("You are indoors"); + } + else + handler->PSendSysMessage("no VMAP available for area info"); + + handler->PSendSysMessage(LANG_MAP_POSITION, + object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : ""), + zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : ""), + areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : ""), + object->GetPhaseMask(), + object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), + cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), + zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); + + LiquidData liquidStatus; + ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); + + if (status) + handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); + + return true; + } }; void AddSC_misc_commandscript() diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 93aa188c071..0de3637586c 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -33,6 +33,16 @@ public: ChatCommand* GetCommands() const { + static ChatCommand modifyspeedCommandTable[] = + { + { "fly", SEC_MODERATOR, false, &HandleModifyFlyCommand, "", NULL }, + { "all", SEC_MODERATOR, false, &HandleModifyASpeedCommand, "", NULL }, + { "walk", SEC_MODERATOR, false, &HandleModifySpeedCommand, "", NULL }, + { "backwalk", SEC_MODERATOR, false, &HandleModifyBWalkCommand, "", NULL }, + { "swim", SEC_MODERATOR, false, &HandleModifySwimCommand, "", NULL }, + { "", SEC_MODERATOR, false, &HandleModifyASpeedCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; static ChatCommand modifyCommandTable[] = { { "hp", SEC_MODERATOR, false, &HandleModifyHPCommand, "", NULL }, @@ -41,31 +51,28 @@ public: { "runicpower", SEC_MODERATOR, false, &HandleModifyRunicPowerCommand, "", NULL }, { "energy", SEC_MODERATOR, false, &HandleModifyEnergyCommand, "", NULL }, { "money", SEC_MODERATOR, false, &HandleModifyMoneyCommand, "", NULL }, - { "speed", SEC_MODERATOR, false, &HandleModifySpeedCommand, "", NULL }, - { "swim", SEC_MODERATOR, false, &HandleModifySwimCommand, "", NULL }, { "scale", SEC_MODERATOR, false, &HandleModifyScaleCommand, "", NULL }, { "bit", SEC_MODERATOR, false, &HandleModifyBitCommand, "", NULL }, - { "bwalk", SEC_MODERATOR, false, &HandleModifyBWalkCommand, "", NULL }, - { "fly", SEC_MODERATOR, false, &HandleModifyFlyCommand, "", NULL }, - { "aspeed", SEC_MODERATOR, false, &HandleModifyASpeedCommand, "", NULL }, { "faction", SEC_MODERATOR, false, &HandleModifyFactionCommand, "", NULL }, { "spell", SEC_MODERATOR, false, &HandleModifySpellCommand, "", NULL }, - { "tp", SEC_MODERATOR, false, &HandleModifyTalentCommand, "", NULL }, + { "talentpoints", SEC_MODERATOR, false, &HandleModifyTalentCommand, "", NULL }, { "mount", SEC_MODERATOR, false, &HandleModifyMountCommand, "", NULL }, { "honor", SEC_MODERATOR, false, &HandleModifyHonorCommand, "", NULL }, - { "rep", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "", NULL }, - { "arena", SEC_MODERATOR, false, &HandleModifyArenaCommand, "", NULL }, + { "reputation", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "", NULL }, + { "arenapoints", SEC_MODERATOR, false, &HandleModifyArenaCommand, "", NULL }, { "drunk", SEC_MODERATOR, false, &HandleModifyDrunkCommand, "", NULL }, { "standstate", SEC_GAMEMASTER, false, &HandleModifyStandStateCommand, "", NULL }, - { "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL }, { "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL }, { "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL }, { "collision", SEC_GAMEMASTER, false, &HandleModifyCollisionCommand, "", NULL }, + { "speed", SEC_MODERATOR, false, NULL, "", modifyspeedCommandTable }, { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable }, + { "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL }, + { "demorph", SEC_GAMEMASTER, false, &HandleDeMorphCommand, "", NULL }, + { "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable }, { NULL, 0, false, NULL, "", NULL } }; return commandTable; @@ -361,7 +368,9 @@ public: //Edit Player Spell static bool HandleModifySpellCommand(ChatHandler* handler, const char* args) { - if (!*args) return false; + if (!*args) + return false; + char* pspellflatid = strtok((char*)args, " "); if (!pspellflatid) return false; @@ -710,7 +719,7 @@ public: (ChatHandler(player)).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, handler->GetNameLink().c_str(), Scale); } - target->SetFloatValue(OBJECT_FIELD_SCALE_X, Scale); + target->SetObjectScale(Scale); return true; } @@ -1142,10 +1151,10 @@ public: static bool HandleModifyRepCommand(ChatHandler* handler, const char* args) { - if (!*args) return false; + if (!*args) + return false; Player* target = handler->getSelectedPlayer(); - if (!target) { handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -1233,7 +1242,7 @@ public: return false; } - target->GetReputationMgr().SetReputation(factionEntry, amount); + target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false); handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name, factionId, handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); return true; @@ -1375,6 +1384,21 @@ public: return true; } +//demorph player or unit + static bool HandleDeMorphCommand(ChatHandler* handler, const char* /*args*/) + { + Unit* target = handler->getSelectedUnit(); + if (!target) + target = handler->GetSession()->GetPlayer(); + + // check online security + else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0)) + return false; + + target->DeMorph(); + + return true; + } static bool HandleModifyCollisionCommand(ChatHandler* handler, const char* args) { diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 57932ef56c6..832f7958fc8 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "Transport.h" #include "CreatureGroups.h" #include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand +#include "CreatureAI.h" class npc_commandscript : public CommandScript { @@ -73,6 +74,7 @@ public: { "phase", SEC_GAMEMASTER, false, &HandleNpcSetPhaseCommand, "", NULL }, { "spawndist", SEC_GAMEMASTER, false, &HandleNpcSetSpawnDistCommand, "", NULL }, { "spawntime", SEC_GAMEMASTER, false, &HandleNpcSetSpawnTimeCommand, "", NULL }, + { "data", SEC_ADMINISTRATOR, false, &HandleNpcSetDataCommand, "", NULL }, //{ TODO: fix or remove these commands { "name", SEC_GAMEMASTER, false, &HandleNpcSetNameCommand, "", NULL }, { "subname", SEC_GAMEMASTER, false, &HandleNpcSetSubNameCommand, "", NULL }, @@ -108,6 +110,7 @@ public: { if (!*args) return false; + char* charID = handler->extractKeyFromLink((char*)args, "Hcreature_entry"); if (!charID) return false; @@ -130,12 +133,24 @@ public: { uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO()); if (tguid > 0) - WorldDatabase.PExecute("INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (%u, %u, %f, %f, %f, %f, %u)", tguid, id, chr->GetTransport()->GetEntry(), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO()); + { + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_CREATURE_TRANSPORT); + + stmt->setInt32(0, int32(tguid)); + stmt->setInt32(1, int32(id)); + stmt->setInt32(2, int32(chr->GetTransport()->GetEntry())); + stmt->setFloat(3, chr->GetTransOffsetX()); + stmt->setFloat(4, chr->GetTransOffsetY()); + stmt->setFloat(5, chr->GetTransOffsetZ()); + stmt->setFloat(6, chr->GetTransOffsetO()); + + WorldDatabase.Execute(stmt); + } return true; } - Creature* creature = new Creature; + Creature* creature = new Creature(); if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o)) { delete creature; @@ -462,7 +477,7 @@ public: // Faction is set in creature_template - not inside creature // Update in memory.. - if (CreatureTemplate const* cinfo = creature->GetCreatureInfo()) + if (CreatureTemplate const* cinfo = creature->GetCreatureTemplate()) { const_cast(cinfo)->faction_A = factionId; const_cast(cinfo)->faction_H = factionId; @@ -511,6 +526,39 @@ public: return true; } + //set data of creature for testing scripting + static bool HandleNpcSetDataCommand(ChatHandler* handler, const char* args) + { + if (!*args) + return false; + + char* arg1 = strtok((char*)args, " "); + char* arg2 = strtok((char*)NULL, ""); + + if (!arg1 || !arg2) + return false; + + uint32 data_1 = (uint32)atoi(arg1); + uint32 data_2 = (uint32)atoi(arg2); + + if (!data_1 || !data_2) + return false; + + Creature* creature = handler->getSelectedCreature(); + + if (!creature) + { + handler->SendSysMessage(LANG_SELECT_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + creature->AI()->SetData(data_1, data_2); + std::string AIorScript = creature->GetAIName() != "" ? "AI type: " + creature->GetAIName() : (creature->GetScriptName() != "" ? "Script Name: " + creature->GetScriptName() : "No AI or Script Name Set"); + handler->PSendSysMessage(LANG_NPC_SETDATA, creature->GetGUID(), creature->GetEntry(), creature->GetName(), data_1, data_2, AIorScript.c_str()); + return true; + } + //npc follow handling static bool HandleNpcFollowCommand(ChatHandler* handler, const char* /*args*/) { @@ -547,7 +595,7 @@ public: uint32 displayid = target->GetDisplayId(); uint32 nativeid = target->GetNativeDisplayId(); uint32 Entry = target->GetEntry(); - CreatureTemplate const* cInfo = target->GetCreatureInfo(); + CreatureTemplate const* cInfo = target->GetCreatureTemplate(); int64 curRespawnDelay = target->GetRespawnTimeEx()-time(NULL); if (curRespawnDelay < 0) @@ -677,9 +725,16 @@ public: return false; } - if (target->GetTransport()) - if (target->GetGUIDTransport()) - WorldDatabase.PExecute("UPDATE creature_transport SET emote=%u WHERE transport_entry=%u AND guid=%u", emote, target->GetTransport()->GetEntry(), target->GetGUIDTransport()); + if (target->GetTransport() && target->GetGUIDTransport()) + { + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_TRANSPORT_EMOTE); + + stmt->setInt32(0, int32(emote)); + stmt->setInt32(1, target->GetTransport()->GetEntry()); + stmt->setInt32(2, target->GetGUIDTransport()); + + WorldDatabase.Execute(stmt); + } target->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote); @@ -1036,7 +1091,7 @@ public: } if (/*creature->GetMotionMaster()->empty() ||*/ - creature->GetMotionMaster()->GetCurrentMovementGeneratorType () != FOLLOW_MOTION_TYPE) + creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != FOLLOW_MOTION_TYPE) { handler->PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU, creature->GetName()); handler->SetSentErrorMessage(true); @@ -1131,24 +1186,24 @@ public: //npc tame handling static bool HandleNpcTameCommand(ChatHandler* handler, const char* /*args*/) { - Creature* creatureTarget = handler->getSelectedCreature (); - if (!creatureTarget || creatureTarget->isPet ()) + Creature* creatureTarget = handler->getSelectedCreature(); + if (!creatureTarget || creatureTarget->isPet()) { handler->PSendSysMessage (LANG_SELECT_CREATURE); handler->SetSentErrorMessage (true); return false; } - Player* player = handler->GetSession()->GetPlayer (); + Player* player = handler->GetSession()->GetPlayer(); - if (player->GetPetGUID ()) + if (player->GetPetGUID()) { handler->SendSysMessage (LANG_YOU_ALREADY_HAVE_PET); handler->SetSentErrorMessage (true); return false; } - CreatureTemplate const* cInfo = creatureTarget->GetCreatureInfo(); + CreatureTemplate const* cInfo = creatureTarget->GetCreatureTemplate(); if (!cInfo->isTameable (player->CanTameExoticPets())) { @@ -1168,8 +1223,8 @@ public: // place pet before player float x, y, z; - player->GetClosePoint (x, y, z, creatureTarget->GetObjectSize (), CONTACT_DISTANCE); - pet->Relocate (x, y, z, M_PI-player->GetOrientation ()); + player->GetClosePoint (x, y, z, creatureTarget->GetObjectSize(), CONTACT_DISTANCE); + pet->Relocate(x, y, z, M_PI-player->GetOrientation()); // set pet to defensive mode by default (some classes can't control controlled pets in fact). pet->SetReactState(REACT_DEFENSIVE); @@ -1229,7 +1284,7 @@ public: group_member->leaderGUID = leaderGUID; group_member->groupAI = 0; - CreatureGroupMap[lowguid] = group_member; + sFormationMgr->CreatureGroupMap[lowguid] = group_member; creature->SearchFormation(); PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_CREATURE_FORMATION); diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 17c819f2f22..1c119fdef4c 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -37,6 +37,7 @@ EndScriptData */ #include "SkillExtraItems.h" #include "Chat.h" #include "WaypointManager.h" +#include "WardenCheckMgr.h" class reload_commandscript : public CommandScript { @@ -105,6 +106,7 @@ public: { "lfg_dungeon_rewards", SEC_ADMINISTRATOR, true, &HandleReloadLfgRewardsCommand, "", NULL }, { "locales_achievement_reward", SEC_ADMINISTRATOR, true, &HandleReloadLocalesAchievementRewardCommand, "", NULL }, { "locales_creature", SEC_ADMINISTRATOR, true, &HandleReloadLocalesCreatureCommand, "", NULL }, + { "locales_creature_text", SEC_ADMINISTRATOR, true, &HandleReloadLocalesCreatureTextCommand, "", NULL }, { "locales_gameobject", SEC_ADMINISTRATOR, true, &HandleReloadLocalesGameobjectCommand, "", NULL }, { "locales_gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadLocalesGossipMenuOptionCommand, "", NULL }, { "locales_item", SEC_ADMINISTRATOR, true, &HandleReloadLocalesItemCommand, "", NULL }, @@ -151,6 +153,7 @@ public: { "spell_threats", SEC_ADMINISTRATOR, true, &HandleReloadSpellThreatsCommand, "", NULL }, { "spell_group_stack_rules", SEC_ADMINISTRATOR, true, &HandleReloadSpellGroupStackRulesCommand, "", NULL }, { "trinity_string", SEC_ADMINISTRATOR, true, &HandleReloadTrinityStringCommand, "", NULL }, + { "warden_action", SEC_ADMINISTRATOR, true, &HandleReloadWardenactionCommand, "", NULL }, { "waypoint_scripts", SEC_ADMINISTRATOR, true, &HandleReloadWpScriptsCommand, "", NULL }, { "waypoint_data", SEC_ADMINISTRATOR, true, &HandleReloadWpCommand, "", NULL }, { "vehicle_accessory", SEC_ADMINISTRATOR, true, &HandleReloadVehicleAccessoryCommand, "", NULL }, @@ -317,6 +320,7 @@ public: { HandleReloadLocalesAchievementRewardCommand(handler, "a"); HandleReloadLocalesCreatureCommand(handler, "a"); + HandleReloadLocalesCreatureTextCommand(handler, "a"); HandleReloadLocalesGameobjectCommand(handler, "a"); HandleReloadLocalesGossipMenuOptionCommand(handler, "a"); HandleReloadLocalesItemCommand(handler, "a"); @@ -409,14 +413,18 @@ public: for (Tokens::const_iterator itr = entries.begin(); itr != entries.end(); ++itr) { uint32 entry = uint32(atoi(*itr)); - QueryResult result = WorldDatabase.PQuery("SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = %u", entry); + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEMPLATE); + stmt->setUInt32(0, entry); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) { handler->PSendSysMessage(LANG_COMMAND_CREATURETEMPLATE_NOTFOUND, entry); continue; } - CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(entry); + CreatureTemplate* cInfo = const_cast(sObjectMgr->GetCreatureTemplate(entry)); if (!cInfo) { handler->PSendSysMessage(LANG_COMMAND_CREATURESTORAGE_NOTFOUND, entry); @@ -427,89 +435,88 @@ public: Field* fields = result->Fetch(); - const_cast(cInfo)->DifficultyEntry[0] = fields[0].GetUInt32(); - const_cast(cInfo)->DifficultyEntry[1] = fields[1].GetUInt32(); - const_cast(cInfo)->DifficultyEntry[2] = fields[2].GetUInt32(); - const_cast(cInfo)->KillCredit[0] = fields[3].GetUInt32(); - const_cast(cInfo)->KillCredit[1] = fields[4].GetUInt32(); - const_cast(cInfo)->Modelid1 = fields[5].GetUInt32(); - const_cast(cInfo)->Modelid2 = fields[6].GetUInt32(); - const_cast(cInfo)->Modelid3 = fields[7].GetUInt32(); - const_cast(cInfo)->Modelid4 = fields[8].GetUInt32(); - const_cast(cInfo)->Name = fields[9].GetString(); - const_cast(cInfo)->SubName = fields[10].GetString(); - const_cast(cInfo)->IconName = fields[11].GetString(); - const_cast(cInfo)->GossipMenuId = fields[12].GetUInt32(); - const_cast(cInfo)->minlevel = fields[13].GetUInt32(); - const_cast(cInfo)->maxlevel = fields[14].GetUInt32(); - const_cast(cInfo)->expansion = fields[15].GetUInt32(); - const_cast(cInfo)->faction_A = fields[16].GetUInt32(); - const_cast(cInfo)->faction_H = fields[17].GetUInt32(); - const_cast(cInfo)->npcflag = fields[18].GetUInt32(); - const_cast(cInfo)->speed_walk = fields[19].GetFloat(); - const_cast(cInfo)->speed_run = fields[20].GetFloat(); - const_cast(cInfo)->scale = fields[21].GetFloat(); - const_cast(cInfo)->rank = fields[22].GetUInt32(); - const_cast(cInfo)->mindmg = fields[23].GetFloat(); - const_cast(cInfo)->maxdmg = fields[24].GetFloat(); - const_cast(cInfo)->dmgschool = fields[25].GetUInt32(); - const_cast(cInfo)->attackpower = fields[26].GetUInt32(); - const_cast(cInfo)->dmg_multiplier = fields[27].GetFloat(); - const_cast(cInfo)->baseattacktime = fields[28].GetUInt32(); - const_cast(cInfo)->rangeattacktime = fields[29].GetUInt32(); - const_cast(cInfo)->unit_class = fields[30].GetUInt32(); - const_cast(cInfo)->unit_flags = fields[31].GetUInt32(); - const_cast(cInfo)->dynamicflags = fields[32].GetUInt32(); - const_cast(cInfo)->family = fields[33].GetUInt32(); - const_cast(cInfo)->trainer_type = fields[34].GetUInt32(); - const_cast(cInfo)->trainer_spell = fields[35].GetUInt32(); - const_cast(cInfo)->trainer_class = fields[36].GetUInt32(); - const_cast(cInfo)->trainer_race = fields[37].GetUInt32(); - const_cast(cInfo)->minrangedmg = fields[38].GetFloat(); - const_cast(cInfo)->maxrangedmg = fields[39].GetFloat(); - const_cast(cInfo)->rangedattackpower = fields[40].GetUInt32(); - const_cast(cInfo)->type = fields[41].GetUInt32(); - const_cast(cInfo)->type_flags = fields[42].GetUInt32(); - const_cast(cInfo)->lootid = fields[43].GetUInt32(); - const_cast(cInfo)->pickpocketLootId = fields[44].GetUInt32(); - const_cast(cInfo)->SkinLootId = fields[45].GetUInt32(); + cInfo->DifficultyEntry[0] = fields[0].GetUInt32(); + cInfo->DifficultyEntry[1] = fields[1].GetUInt32(); + cInfo->DifficultyEntry[2] = fields[2].GetUInt32(); + cInfo->KillCredit[0] = fields[3].GetUInt32(); + cInfo->KillCredit[1] = fields[4].GetUInt32(); + cInfo->Modelid1 = fields[5].GetUInt32(); + cInfo->Modelid2 = fields[6].GetUInt32(); + cInfo->Modelid3 = fields[7].GetUInt32(); + cInfo->Modelid4 = fields[8].GetUInt32(); + cInfo->Name = fields[9].GetString(); + cInfo->SubName = fields[10].GetString(); + cInfo->IconName = fields[11].GetString(); + cInfo->GossipMenuId = fields[12].GetUInt32(); + cInfo->minlevel = fields[13].GetUInt8(); + cInfo->maxlevel = fields[14].GetUInt8(); + cInfo->expansion = fields[15].GetUInt16(); + cInfo->faction_A = fields[16].GetUInt16(); + cInfo->faction_H = fields[17].GetUInt16(); + cInfo->npcflag = fields[18].GetUInt32(); + cInfo->speed_walk = fields[19].GetFloat(); + cInfo->speed_run = fields[20].GetFloat(); + cInfo->scale = fields[21].GetFloat(); + cInfo->rank = fields[22].GetUInt8(); + cInfo->mindmg = fields[23].GetFloat(); + cInfo->maxdmg = fields[24].GetFloat(); + cInfo->dmgschool = fields[25].GetUInt8(); + cInfo->attackpower = fields[26].GetUInt32(); + cInfo->dmg_multiplier = fields[27].GetFloat(); + cInfo->baseattacktime = fields[28].GetUInt32(); + cInfo->rangeattacktime = fields[29].GetUInt32(); + cInfo->unit_class = fields[30].GetUInt8(); + cInfo->unit_flags = fields[31].GetUInt32(); + cInfo->dynamicflags = fields[32].GetUInt32(); + cInfo->family = fields[33].GetUInt8(); + cInfo->trainer_type = fields[34].GetUInt8(); + cInfo->trainer_spell = fields[35].GetUInt32(); + cInfo->trainer_class = fields[36].GetUInt8(); + cInfo->trainer_race = fields[37].GetUInt8(); + cInfo->minrangedmg = fields[38].GetFloat(); + cInfo->maxrangedmg = fields[39].GetFloat(); + cInfo->rangedattackpower = fields[40].GetUInt16(); + cInfo->type = fields[41].GetUInt8(); + cInfo->type_flags = fields[42].GetUInt32(); + cInfo->lootid = fields[43].GetUInt32(); + cInfo->pickpocketLootId = fields[44].GetUInt32(); + cInfo->SkinLootId = fields[45].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - { - const_cast(cInfo)->resistance[i] = fields[46 + i -1].GetUInt32(); - } - - const_cast(cInfo)->spells[0] = fields[52].GetUInt32(); - const_cast(cInfo)->spells[1] = fields[53].GetUInt32(); - const_cast(cInfo)->spells[2] = fields[54].GetUInt32(); - const_cast(cInfo)->spells[3] = fields[55].GetUInt32(); - const_cast(cInfo)->spells[4] = fields[56].GetUInt32(); - const_cast(cInfo)->spells[5] = fields[57].GetUInt32(); - const_cast(cInfo)->spells[6] = fields[58].GetUInt32(); - const_cast(cInfo)->spells[7] = fields[59].GetUInt32(); - const_cast(cInfo)->PetSpellDataId = fields[60].GetUInt32(); - const_cast(cInfo)->VehicleId = fields[61].GetUInt32(); - const_cast(cInfo)->mingold = fields[62].GetUInt32(); - const_cast(cInfo)->maxgold = fields[63].GetUInt32(); - const_cast(cInfo)->AIName = fields[64].GetString(); - const_cast(cInfo)->MovementType = fields[65].GetUInt32(); - const_cast(cInfo)->InhabitType = fields[66].GetUInt32(); - const_cast(cInfo)->ModHealth = fields[67].GetFloat(); - const_cast(cInfo)->ModMana = fields[68].GetFloat(); - const_cast(cInfo)->ModArmor = fields[69].GetFloat(); - const_cast(cInfo)->RacialLeader = fields[70].GetBool(); - const_cast(cInfo)->questItems[0] = fields[71].GetUInt32(); - const_cast(cInfo)->questItems[1] = fields[72].GetUInt32(); - const_cast(cInfo)->questItems[2] = fields[73].GetUInt32(); - const_cast(cInfo)->questItems[3] = fields[74].GetUInt32(); - const_cast(cInfo)->questItems[4] = fields[75].GetUInt32(); - const_cast(cInfo)->questItems[5] = fields[76].GetUInt32(); - const_cast(cInfo)->movementId = fields[77].GetUInt32(); - const_cast(cInfo)->RegenHealth = fields[78].GetBool(); - const_cast(cInfo)->equipmentId = fields[79].GetUInt32(); - const_cast(cInfo)->MechanicImmuneMask = fields[80].GetUInt32(); - const_cast(cInfo)->flags_extra = fields[81].GetUInt32(); - const_cast(cInfo)->ScriptID = sObjectMgr->GetScriptId(fields[82].GetCString()); + cInfo->resistance[i] = fields[46 + i -1].GetUInt16(); + + cInfo->spells[0] = fields[52].GetUInt32(); + cInfo->spells[1] = fields[53].GetUInt32(); + cInfo->spells[2] = fields[54].GetUInt32(); + cInfo->spells[3] = fields[55].GetUInt32(); + cInfo->spells[4] = fields[56].GetUInt32(); + cInfo->spells[5] = fields[57].GetUInt32(); + cInfo->spells[6] = fields[58].GetUInt32(); + cInfo->spells[7] = fields[59].GetUInt32(); + cInfo->PetSpellDataId = fields[60].GetUInt32(); + cInfo->VehicleId = fields[61].GetUInt32(); + cInfo->mingold = fields[62].GetUInt32(); + cInfo->maxgold = fields[63].GetUInt32(); + cInfo->AIName = fields[64].GetString(); + cInfo->MovementType = fields[65].GetUInt8(); + cInfo->InhabitType = fields[66].GetUInt8(); + cInfo->HoverHeight = fields[67].GetFloat(); + cInfo->ModHealth = fields[68].GetFloat(); + cInfo->ModMana = fields[69].GetFloat(); + cInfo->ModArmor = fields[70].GetFloat(); + cInfo->RacialLeader = fields[71].GetBool(); + cInfo->questItems[0] = fields[72].GetUInt32(); + cInfo->questItems[1] = fields[73].GetUInt32(); + cInfo->questItems[2] = fields[74].GetUInt32(); + cInfo->questItems[3] = fields[75].GetUInt32(); + cInfo->questItems[4] = fields[76].GetUInt32(); + cInfo->questItems[5] = fields[77].GetUInt32(); + cInfo->movementId = fields[78].GetUInt32(); + cInfo->RegenHealth = fields[79].GetBool(); + cInfo->equipmentId = fields[80].GetUInt32(); + cInfo->MechanicImmuneMask = fields[81].GetUInt32(); + cInfo->flags_extra = fields[82].GetUInt32(); + cInfo->ScriptID = sObjectMgr->GetScriptId(fields[83].GetCString()); sObjectMgr->CheckCreatureTemplate(cInfo); } @@ -724,6 +731,21 @@ public: return true; } + static bool HandleReloadWardenactionCommand(ChatHandler* handler, const char* /*args*/) + { + if (!sWorld->getBoolConfig(CONFIG_WARDEN_ENABLED)) + { + handler->SendSysMessage("Warden system disabled by config - reloading warden_action skipped."); + handler->SetSentErrorMessage(true); + return false; + } + + sLog->outString("Re-Loading warden_action Table!"); + sWardenCheckMgr->LoadWardenOverrides(); + handler->SendGlobalGMSysMessage("DB table `warden_action` reloaded."); + return true; + } + static bool HandleReloadNpcTrainerCommand(ChatHandler* handler, const char* /*args*/) { sLog->outString("Re-Loading `npc_trainer` Table!"); @@ -1154,6 +1176,14 @@ public: return true; } + static bool HandleReloadLocalesCreatureTextCommand(ChatHandler* handler, const char* /*args*/) + { + sLog->outString("Re-Loading Locales Creature Texts..."); + sCreatureTextMgr->LoadCreatureTextLocales(); + handler->SendGlobalGMSysMessage("DB table `locales_creature_text` reloaded."); + return true; + } + static bool HandleReloadLocalesGameobjectCommand(ChatHandler* handler, const char* /*args*/) { sLog->outString("Re-Loading Locales Gameobject ... "); diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 5054bd83f32..ca7c3af7fde 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -131,12 +131,15 @@ public: target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation()); else { - QueryResult resultDB = CharacterDatabase.PQuery("SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = %u", target_guid); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND); + stmt->setUInt32(0, target_guid); + PreparedQueryResult resultDB = CharacterDatabase.Query(stmt); + if (resultDB) { Field* fieldsDB = resultDB->Fetch(); - uint32 mapId = fieldsDB[0].GetUInt32(); - uint32 zoneId = fieldsDB[1].GetUInt32(); + uint32 mapId = fieldsDB[0].GetUInt16(); + uint32 zoneId = fieldsDB[1].GetUInt16(); float posX = fieldsDB[2].GetFloat(); float posY = fieldsDB[3].GetFloat(); float posZ = fieldsDB[4].GetFloat(); diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index 8f5e862555c..99ec263b8f9 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -91,7 +91,10 @@ public: pathid = target->GetWaypointPath(); else { - QueryResult result = WorldDatabase.Query("SELECT MAX(id) FROM waypoint_data"); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_MAX_ID); + + PreparedQueryResult result = WorldDatabase.Query(stmt); + uint32 maxpathid = result->Fetch()->GetInt32(); pathid = maxpathid+1; handler->PSendSysMessage("%s%s|r", "|cff00ff00", "New path started."); @@ -109,7 +112,9 @@ public: return true; } - QueryResult result = WorldDatabase.PQuery("SELECT MAX(point) FROM waypoint_data WHERE id = '%u'", pathid); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_MAX_POINT); + stmt->setUInt32(0, pathid); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (result) point = (*result)[0].GetUInt32(); @@ -117,7 +122,7 @@ public: Player* player = handler->GetSession()->GetPlayer(); //Map* map = player->GetMap(); - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_DATA); + stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_DATA); stmt->setUInt32(0, pathid); stmt->setUInt32(1, point + 1); @@ -173,9 +178,12 @@ public: } guidLow = target->GetDBTableGUIDLow(); - QueryResult result = WorldDatabase.PQuery("SELECT guid FROM creature_addon WHERE guid = '%u'", guidLow); - PreparedStatement* stmt; + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_ADDON_BY_GUID); + + stmt->setUInt32(0, guidLow); + + PreparedQueryResult result = WorldDatabase.Query(stmt); if (result) { @@ -223,6 +231,7 @@ public: sWaypointMgr->ReloadPath(id); return true; } + static bool HandleWpUnLoadCommand(ChatHandler* handler, const char* /*args*/) { @@ -276,7 +285,8 @@ public: std::string show = show_str; // Check - if ((show != "add") && (show != "mod") && (show != "del") && (show != "listid")) return false; + if ((show != "add") && (show != "mod") && (show != "del") && (show != "listid")) + return false; char* arg_id = strtok(NULL, " "); uint32 id = 0; @@ -288,7 +298,9 @@ public: if (id) { - QueryResult result = WorldDatabase.PQuery("SELECT id FROM waypoint_scripts WHERE guid = %u", id); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID); + stmt->setUInt32(0, id); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { @@ -305,10 +317,13 @@ public: } else { - QueryResult result = WorldDatabase.Query("SELECT MAX(guid) FROM waypoint_scripts"); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID); + + PreparedQueryResult result = WorldDatabase.Query(stmt); + id = result->Fetch()->GetUInt32(); - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_SCRIPT); + stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_SCRIPT); stmt->setUInt32(0, id + 1); @@ -334,7 +349,9 @@ public: float a8, a9, a10, a11; char const* a7; - QueryResult result = WorldDatabase.PQuery("SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = %u", id); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID); + stmt->setUInt32(0, id); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { @@ -367,7 +384,11 @@ public: { id = atoi(arg_id); - QueryResult result = WorldDatabase.PQuery("SELECT guid FROM waypoint_scripts WHERE guid = %u", id); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID); + + stmt->setUInt32(0, id); + + PreparedQueryResult result = WorldDatabase.Query(stmt); if (result) { @@ -445,7 +466,9 @@ public: } else { - QueryResult result = WorldDatabase.PQuery("SELECT id FROM waypoint_scripts WHERE guid='%u'", id); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID); + stmt->setUInt32(0, id); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { @@ -565,7 +588,9 @@ public: // User did select a visual waypoint? // Check the creature - QueryResult result = WorldDatabase.PQuery("SELECT id, point FROM waypoint_data WHERE wpguid = %u", wpGuid); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID); + stmt->setUInt32(0, wpGuid); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { @@ -576,9 +601,17 @@ public: // Here we search for all waypoints that only differ in one from 1 thousand // (0.001) - There is no other way to compare C++ floats with mySQL floats // See also: http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html - const char* maxDIFF = "0.01"; - result = WorldDatabase.PQuery("SELECT id, point FROM waypoint_data WHERE (abs(position_x - %f) <= %s) and (abs(position_y - %f) <= %s) and (abs(position_z - %f) <= %s)", - target->GetPositionX(), maxDIFF, target->GetPositionY(), maxDIFF, target->GetPositionZ(), maxDIFF); + std::string maxDiff = "0.01"; + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_BY_POS); + stmt->setFloat(0, target->GetPositionX()); + stmt->setString(1, maxDiff); + stmt->setFloat(2, target->GetPositionY()); + stmt->setString(3, maxDiff); + stmt->setFloat(4, target->GetPositionZ()); + stmt->setString(5, maxDiff); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) { handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDDBPROBLEM, wpGuid); @@ -605,7 +638,7 @@ public: return false; } - if (show == "del" && target) + if (show == "del") { handler->PSendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff%u|r", pathid); @@ -615,9 +648,12 @@ public: if (wpGuid != 0) { wpCreature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); - wpCreature->CombatStop(); - wpCreature->DeleteFromDB(); - wpCreature->AddObjectToRemoveList(); + if (wpCreature) + { + wpCreature->CombatStop(); + wpCreature->DeleteFromDB(); + wpCreature->AddObjectToRemoveList(); + } } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_WAYPOINT_DATA); @@ -638,7 +674,7 @@ public: return true; } // del - if (show == "move" && target) + if (show == "move") { handler->PSendSysMessage("|cff00ff00DEBUG: wp move, PathID: |r|cff00ffff%u|r", pathid); @@ -652,16 +688,20 @@ public: // Respawn the owner of the waypoints if (wpGuid != 0) { - wpCreature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); - wpCreature->CombatStop(); - wpCreature->DeleteFromDB(); - wpCreature->AddObjectToRemoveList(); + wpCreature = map->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); + if (wpCreature) + { + wpCreature->CombatStop(); + wpCreature->DeleteFromDB(); + wpCreature->AddObjectToRemoveList(); + } // re-create Creature* wpCreature2 = new Creature; if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); delete wpCreature2; + wpCreature2 = NULL; return false; } @@ -672,6 +712,7 @@ public: { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); delete wpCreature2; + wpCreature2 = NULL; return false; } //sMapMgr->GetMap(npcCreature->GetMapId())->Add(wpCreature2); @@ -755,7 +796,6 @@ public: } std::string show = show_str; - uint32 Maxpoint; //handler->PSendSysMessage("wpshow - show: %s", show); @@ -770,7 +810,11 @@ public: return false; } - QueryResult result = WorldDatabase.PQuery("SELECT id, point, delay, move_flag, action, action_chance FROM waypoint_data WHERE wpguid = %u", target->GetGUIDLow()); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID); + + stmt->setUInt32(0, target->GetGUIDLow()); + + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { @@ -802,7 +846,11 @@ public: if (show == "on") { - QueryResult result = WorldDatabase.PQuery("SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = '%u'", pathid); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID); + + stmt->setUInt32(0, pathid); + + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { @@ -814,7 +862,11 @@ public: handler->PSendSysMessage("|cff00ff00DEBUG: wp on, PathID: |cff00ffff%u|r", pathid); // Delete all visuals for this NPC - QueryResult result2 = WorldDatabase.PQuery("SELECT wpguid FROM waypoint_data WHERE id = '%u' and wpguid <> 0", pathid); + stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID); + + stmt->setUInt32(0, pathid); + + PreparedQueryResult result2 = WorldDatabase.Query(stmt); if (result2) { @@ -897,7 +949,7 @@ public: if (target) { wpCreature->SetDisplayId(target->GetDisplayId()); - wpCreature->SetFloatValue(OBJECT_FIELD_SCALE_X, 0.5f); + wpCreature->SetObjectScale(0.5f); wpCreature->SetLevel(point > STRONG_MAX_LEVEL ? STRONG_MAX_LEVEL : point); } } @@ -911,7 +963,10 @@ public: { handler->PSendSysMessage("|cff00ff00DEBUG: wp first, GUID: %u|r", pathid); - QueryResult result = WorldDatabase.PQuery("SELECT position_x, position_y, position_z FROM waypoint_data WHERE point='1' AND id = '%u'", pathid); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID); + stmt->setUInt32(0, pathid); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) { handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUND, pathid); @@ -948,7 +1003,7 @@ public: if (target) { creature->SetDisplayId(target->GetDisplayId()); - creature->SetFloatValue(OBJECT_FIELD_SCALE_X, 0.5f); + creature->SetObjectScale(0.5f); } return true; @@ -958,13 +1013,10 @@ public: { handler->PSendSysMessage("|cff00ff00DEBUG: wp last, PathID: |r|cff00ffff%u|r", pathid); - QueryResult result = WorldDatabase.PQuery("SELECT MAX(point) FROM waypoint_data WHERE id = '%u'", pathid); - if (result) - Maxpoint = (*result)[0].GetUInt32(); - else - Maxpoint = 0; + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID); + stmt->setUInt32(0, pathid); + PreparedQueryResult result = WorldDatabase.Query(stmt); - result = WorldDatabase.PQuery("SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE point ='%u' AND id = '%u'", Maxpoint, pathid); if (!result) { handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDLAST, pathid); @@ -1000,7 +1052,7 @@ public: if (target) { creature->SetDisplayId(target->GetDisplayId()); - creature->SetFloatValue(OBJECT_FIELD_SCALE_X, 0.5f); + creature->SetObjectScale(0.5f); } return true; @@ -1008,7 +1060,10 @@ public: if (show == "off") { - QueryResult result = WorldDatabase.PQuery("SELECT guid FROM creature WHERE id = '%u'", 1); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_BY_ID); + stmt->setUInt32(0, 1); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (!result) { handler->SendSysMessage(LANG_WAYPOINT_VP_NOTFOUND); @@ -1041,7 +1096,7 @@ public: } while (result->NextRow()); // set "wpguid" column to "empty" - no visual waypoint spawned - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_ALL_WAYPOINT_DATA_WPGUID); + stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID); WorldDatabase.Execute(stmt); //WorldDatabase.PExecute("UPDATE creature_movement SET wpguid = '0' WHERE wpguid <> '0'"); diff --git a/src/server/scripts/Custom/CMakeLists.txt b/src/server/scripts/Custom/CMakeLists.txt index 1570ca17312..62abde25905 100644 --- a/src/server/scripts/Custom/CMakeLists.txt +++ b/src/server/scripts/Custom/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 1292cdaee17..93de16fc80b 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -139,7 +139,7 @@ public: summons.Summon(summoned); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { summons.DespawnAll(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp index 7ef11e5256a..9375cc33f27 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp @@ -126,11 +126,11 @@ public: InstanceScript* instance; - uint8 EventPhase; + uint8 EventPhase; uint32 Event_Timer; - uint8 MobSpawnId; - uint8 MobCount; + uint8 MobSpawnId; + uint8 MobCount; uint32 MobDeath_Timer; uint64 RingMobGUID[4]; @@ -142,16 +142,16 @@ public: { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - EventPhase = 0; - Event_Timer = 1000; + EventPhase = 0; + Event_Timer = 1000; - MobCount = 0; - MobDeath_Timer = 0; + MobCount = 0; + MobDeath_Timer = 0; for (uint8 i = 0; i < MAX_MOB_AMOUNT; ++i) RingMobGUID[i] = 0; - RingBossGUID = 0; + RingBossGUID = 0; CanWalk = false; } @@ -177,39 +177,39 @@ public: MobDeath_Timer = 2500; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { - case 0: - DoScriptText(SCRIPT_TEXT1, me);//2 - CanWalk = false; - Event_Timer = 5000; - break; - case 1: - DoScriptText(SCRIPT_TEXT2, me);//4 - CanWalk = false; - Event_Timer = 5000; - break; - case 2: - CanWalk = false; - break; - case 3: - DoScriptText(SCRIPT_TEXT3, me);//5 - break; - case 4: - DoScriptText(SCRIPT_TEXT4, me);//6 - CanWalk = false; - Event_Timer = 5000; - break; - case 5: - if (instance) - { - instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_GRIMSTONE, me); - instance->SetData(TYPE_RING_OF_LAW, DONE); - sLog->outDebug(LOG_FILTER_TSCR, "TSCR: npc_grimstone: event reached end and set complete."); - } - break; + case 0: + DoScriptText(SCRIPT_TEXT1, me);//2 + CanWalk = false; + Event_Timer = 5000; + break; + case 1: + DoScriptText(SCRIPT_TEXT2, me);//4 + CanWalk = false; + Event_Timer = 5000; + break; + case 2: + CanWalk = false; + break; + case 3: + DoScriptText(SCRIPT_TEXT3, me);//5 + break; + case 4: + DoScriptText(SCRIPT_TEXT4, me);//6 + CanWalk = false; + Event_Timer = 5000; + break; + case 5: + if (instance) + { + instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_GRIMSTONE, me); + instance->SetData(TYPE_RING_OF_LAW, DONE); + sLog->outDebug(LOG_FILTER_TSCR, "TSCR: npc_grimstone: event reached end and set complete."); + } + break; } } @@ -227,16 +227,16 @@ public: { if (MobDeath_Timer <= diff) { - MobDeath_Timer = 2500; + MobDeath_Timer = 2500; if (RingBossGUID) { Creature* boss = Unit::GetCreature(*me, RingBossGUID); if (boss && !boss->isAlive() && boss->isDead()) { - RingBossGUID = 0; - Event_Timer = 5000; - MobDeath_Timer = 0; + RingBossGUID = 0; + Event_Timer = 5000; + MobDeath_Timer = 0; return; } return; @@ -247,7 +247,7 @@ public: Creature* mob = Unit::GetCreature(*me, RingMobGUID[i]); if (mob && !mob->isAlive() && mob->isDead()) { - RingMobGUID[i] = 0; + RingMobGUID[i] = 0; --MobCount; //seems all are gone, so set timer to continue and discontinue this @@ -355,7 +355,7 @@ public: struct mob_phalanxAI : public ScriptedAI { - mob_phalanxAI(Creature* c) : ScriptedAI(c) {} + mob_phalanxAI(Creature* creature) : ScriptedAI(creature) {} uint32 ThunderClap_Timer; uint32 FireballVolley_Timer; @@ -363,9 +363,9 @@ public: void Reset() { - ThunderClap_Timer = 12000; - FireballVolley_Timer = 0; - MightyBlow_Timer = 15000; + ThunderClap_Timer = 12000; + FireballVolley_Timer = 0; + MightyBlow_Timer = 15000; } void UpdateAI(const uint32 diff) @@ -426,7 +426,7 @@ class npc_kharan_mighthammer : public CreatureScript public: npc_kharan_mighthammer() : CreatureScript("npc_kharan_mighthammer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*Sender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); switch (action) @@ -520,7 +520,7 @@ class npc_lokhtos_darkbargainer : public CreatureScript public: npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*Sender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF + 1) @@ -564,7 +564,6 @@ enum DughalQuests QUEST_JAIL_BREAK = 4322 }; -// DELETE THIS IF IT IS NOT NEEDED! #define SAY_DUGHAL_FREE "Thank you, $N! I'm free!!!" #define GOSSIP_DUGHAL "You're free, Dughal! Get out of here!" @@ -585,7 +584,7 @@ public: return dughal_stormwingAI; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 Sender, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF + 1) @@ -610,20 +609,24 @@ public: struct npc_dughal_stormwingAI : public npc_escortAI { - npc_dughal_stormwingAI(Creature* c) : npc_escortAI(c) {} + npc_dughal_stormwingAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { - case 0:me->Say(SAY_DUGHAL_FREE, LANG_UNIVERSAL, PlayerGUID); break; - case 1:instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_OBJECTIVE_COMPLETED);break; - case 2: - me->SetVisibility(VISIBILITY_OFF); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); - break; + case 0: + me->Say(SAY_DUGHAL_FREE, LANG_UNIVERSAL, PlayerGUID); + break; + case 1: + instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_OBJECTIVE_COMPLETED); + break; + case 2: + me->SetVisible(false); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); + break; } } @@ -634,7 +637,7 @@ public: { if (IsBeingEscorted && killer == me) { - me->SetVisibility(VISIBILITY_OFF); + me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); @@ -646,13 +649,13 @@ public: if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return; if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_ENDED) { - me->SetVisibility(VISIBILITY_OFF); + me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } else { - me->SetVisibility(VISIBILITY_ON); + me->SetVisible(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -713,78 +716,85 @@ public: bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) { if (quest->GetQuestId() == 4322) - {PlayerStart = player; + { + PlayerStart = player; if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) { - CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_IN_PROGRESS); - creature->setFaction(11); - } + CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_IN_PROGRESS); + creature->setFaction(11); } + } return false; } struct npc_marshal_windsorAI : public npc_escortAI { - npc_marshal_windsorAI(Creature* c) : npc_escortAI(c) + npc_marshal_windsorAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { - case 1: - me->Say(SAY_WINDSOR_1, LANG_UNIVERSAL, PlayerGUID); - break; - case 7: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_WINDSOR_4_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 10: - me->setFaction(534); - break; - case 12: - me->Say(SAY_WINDSOR_6, LANG_UNIVERSAL, PlayerGUID); - instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_IN_PROGRESS); - break; - case 13: - me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK - break; - case 14: - instance->SetData(DATA_GATE_SR, 0); - me->setFaction(11); - break; - case 16: - me->Say(SAY_WINDSOR_9, LANG_UNIVERSAL, PlayerGUID); - break; - case 17: - me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK - break; - case 18: - instance->SetData(DATA_GATE_SC, 0); - break; - case 19: - me->SetVisibility(VISIBILITY_OFF); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SummonCreature(MOB_ENTRY_REGINALD_WINDSOR, 403.61f, -51.71f, -63.92f, 3.600434f, TEMPSUMMON_DEAD_DESPAWN, 0); - instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_ENDED); - break; + case 1: + me->Say(SAY_WINDSOR_1, LANG_UNIVERSAL, PlayerGUID); + break; + case 7: + me->HandleEmoteCommand(EMOTE_STATE_POINT); + me->Say(SAY_WINDSOR_4_1, LANG_UNIVERSAL, PlayerGUID); + IsOnHold = true; + break; + case 10: + me->setFaction(534); + break; + case 12: + me->Say(SAY_WINDSOR_6, LANG_UNIVERSAL, PlayerGUID); + instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_IN_PROGRESS); + break; + case 13: + me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK + break; + case 14: + instance->SetData(DATA_GATE_SR, 0); + me->setFaction(11); + break; + case 16: + me->Say(SAY_WINDSOR_9, LANG_UNIVERSAL, PlayerGUID); + break; + case 17: + me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK + break; + case 18: + instance->SetData(DATA_GATE_SC, 0); + break; + case 19: + me->SetVisible(false); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SummonCreature(MOB_ENTRY_REGINALD_WINDSOR, 403.61f, -51.71f, -63.92f, 3.600434f, TEMPSUMMON_DEAD_DESPAWN, 0); + instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_ENDED); + break; } } void EnterCombat(Unit* who) - { + { switch (urand(0, 2)) { - case 0: me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); break; - case 1: me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); break; - case 2: me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); break; - } + case 0: + me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); + break; + case 1: + me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); + break; + case 2: + me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); + break; } + } void Reset() {} @@ -795,28 +805,31 @@ public: void UpdateAI(const uint32 diff) { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return; + if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) + return; + if (instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) SetEscortPaused(false); + if (!instance->GetData(DATA_GATE_D) && instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_NOT_STARTED) - { + { me->Say(SAY_WINDSOR_4_2, LANG_UNIVERSAL, PlayerGUID); instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_BEFORE_START); - } + } if (instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) - { + { me->Say(SAY_WINDSOR_4_3, LANG_UNIVERSAL, PlayerGUID); instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); - } + } if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_SUPPLY_ROOM) == ENCOUNTER_STATE_ENDED) { - me->SetVisibility(VISIBILITY_OFF); + me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } else { - me->SetVisibility(VISIBILITY_ON); + me->SetVisible(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -897,65 +910,65 @@ public: struct npc_marshal_reginald_windsorAI : public npc_escortAI { - npc_marshal_reginald_windsorAI(Creature* c) : npc_escortAI(c) + npc_marshal_reginald_windsorAI(Creature* creature) : npc_escortAI(creature) { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - wp=i; - switch (i) + wp = waypointId; + switch (waypointId) { - case 0: - me->setFaction(11); - me->Say(SAY_REGINALD_WINDSOR_0_1, LANG_UNIVERSAL, PlayerGUID); - break; - case 1: - me->Say(SAY_REGINALD_WINDSOR_0_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 7: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_5_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 8: - me->Say(SAY_REGINALD_WINDSOR_5_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 11: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_7_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 12: - me->Say(SAY_REGINALD_WINDSOR_7_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 13: - me->Say(SAY_REGINALD_WINDSOR_7_3, LANG_UNIVERSAL, PlayerGUID); - break; - case 20: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_13_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 21: - me->Say(SAY_REGINALD_WINDSOR_13_3, LANG_UNIVERSAL, PlayerGUID); - break; - case 23: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_14_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 24: - me->Say(SAY_REGINALD_WINDSOR_14_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 31: - me->Say(SAY_REGINALD_WINDSOR_20_1, LANG_UNIVERSAL, PlayerGUID); - break; - case 32: - me->Say(SAY_REGINALD_WINDSOR_20_2, LANG_UNIVERSAL, PlayerGUID); - PlayerStart->GroupEventHappens(QUEST_JAIL_BREAK, me); - instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED); - break; + case 0: + me->setFaction(11); + me->Say(SAY_REGINALD_WINDSOR_0_1, LANG_UNIVERSAL, PlayerGUID); + break; + case 1: + me->Say(SAY_REGINALD_WINDSOR_0_2, LANG_UNIVERSAL, PlayerGUID); + break; + case 7: + me->HandleEmoteCommand(EMOTE_STATE_POINT); + me->Say(SAY_REGINALD_WINDSOR_5_1, LANG_UNIVERSAL, PlayerGUID); + IsOnHold=true; + break; + case 8: + me->Say(SAY_REGINALD_WINDSOR_5_2, LANG_UNIVERSAL, PlayerGUID); + break; + case 11: + me->HandleEmoteCommand(EMOTE_STATE_POINT); + me->Say(SAY_REGINALD_WINDSOR_7_1, LANG_UNIVERSAL, PlayerGUID); + IsOnHold=true; + break; + case 12: + me->Say(SAY_REGINALD_WINDSOR_7_2, LANG_UNIVERSAL, PlayerGUID); + break; + case 13: + me->Say(SAY_REGINALD_WINDSOR_7_3, LANG_UNIVERSAL, PlayerGUID); + break; + case 20: + me->HandleEmoteCommand(EMOTE_STATE_POINT); + me->Say(SAY_REGINALD_WINDSOR_13_1, LANG_UNIVERSAL, PlayerGUID); + IsOnHold=true; + break; + case 21: + me->Say(SAY_REGINALD_WINDSOR_13_3, LANG_UNIVERSAL, PlayerGUID); + break; + case 23: + me->HandleEmoteCommand(EMOTE_STATE_POINT); + me->Say(SAY_REGINALD_WINDSOR_14_1, LANG_UNIVERSAL, PlayerGUID); + IsOnHold=true; + break; + case 24: + me->Say(SAY_REGINALD_WINDSOR_14_2, LANG_UNIVERSAL, PlayerGUID); + break; + case 31: + me->Say(SAY_REGINALD_WINDSOR_20_1, LANG_UNIVERSAL, PlayerGUID); + break; + case 32: + me->Say(SAY_REGINALD_WINDSOR_20_2, LANG_UNIVERSAL, PlayerGUID); + PlayerStart->GroupEventHappens(QUEST_JAIL_BREAK, me); + instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED); + break; } } @@ -979,14 +992,20 @@ public: } void EnterCombat(Unit* who) - { + { switch (urand(0, 2)) { - case 0: me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); break; - case 1: me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); break; - case 2: me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); break; - } + case 0: + me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); + break; + case 1: + me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); + break; + case 2: + me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); + break; } + } void Reset() {} void JustDied(Unit* slayer) @@ -996,47 +1015,49 @@ public: void UpdateAI(const uint32 diff) { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return; + if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) + return; + if (wp == 7) - { + { if (!instance->GetData(DATA_GATE_J) && instance->GetData(DATA_JAZ) == ENCOUNTER_STATE_NOT_STARTED) - { - instance->SetData(DATA_CREATURE_JAZ, 1); - instance->SetData(DATA_JAZ, ENCOUNTER_STATE_IN_PROGRESS); - } + { + instance->SetData(DATA_CREATURE_JAZ, 1); + instance->SetData(DATA_JAZ, ENCOUNTER_STATE_IN_PROGRESS); + } if (instance->GetData(DATA_CREATURE_JAZ) && instance->GetData(DATA_CREATURE_OGRABISI) && instance->GetData(DATA_JAZ) == ENCOUNTER_STATE_IN_PROGRESS) - { - SetEscortPaused(false); - instance->SetData(DATA_JAZ, ENCOUNTER_STATE_ENDED); - } + { + SetEscortPaused(false); + instance->SetData(DATA_JAZ, ENCOUNTER_STATE_ENDED); } + } else if (wp == 11) - { + { if (!instance->GetData(DATA_GATE_S) && instance->GetData(DATA_SHILL) == ENCOUNTER_STATE_NOT_STARTED) - { - instance->SetData(DATA_CREATURE_SHILL, 1); - instance->SetData(DATA_SHILL, ENCOUNTER_STATE_IN_PROGRESS); - } + { + instance->SetData(DATA_CREATURE_SHILL, 1); + instance->SetData(DATA_SHILL, ENCOUNTER_STATE_IN_PROGRESS); + } if (instance->GetData(DATA_CREATURE_SHILL) && instance->GetData(DATA_SHILL) == ENCOUNTER_STATE_IN_PROGRESS) - { - instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED); - SetEscortPaused(false); - } + { + instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED); + SetEscortPaused(false); } + } else if (wp == 20) - { + { if (!instance->GetData(DATA_GATE_C) && instance->GetData(DATA_CREST) == ENCOUNTER_STATE_NOT_STARTED) - { - instance->SetData(DATA_CREATURE_CREST, 1); - me->Say(SAY_REGINALD_WINDSOR_13_2, LANG_UNIVERSAL, PlayerGUID); - instance->SetData(DATA_CREST, ENCOUNTER_STATE_IN_PROGRESS); - } + { + instance->SetData(DATA_CREATURE_CREST, 1); + me->Say(SAY_REGINALD_WINDSOR_13_2, LANG_UNIVERSAL, PlayerGUID); + instance->SetData(DATA_CREST, ENCOUNTER_STATE_IN_PROGRESS); + } if (instance->GetData(DATA_CREATURE_CREST) && instance->GetData(DATA_CREST) == ENCOUNTER_STATE_IN_PROGRESS) - { - SetEscortPaused(false); - instance->SetData(DATA_CREST, ENCOUNTER_STATE_ENDED); - } + { + SetEscortPaused(false); + instance->SetData(DATA_CREST, ENCOUNTER_STATE_ENDED); } + } if (instance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) SetEscortPaused(false); npc_escortAI::UpdateAI(diff); } @@ -1046,6 +1067,7 @@ public: // npc_tobias_seecher #define SAY_TOBIAS_FREE "Thank you! I will run for safety immediately!" + /* class npc_tobias_seecher : public CreatureScript { @@ -1065,7 +1087,7 @@ public: return tobias_seecherAI; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 Sender, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF + 1) @@ -1090,7 +1112,7 @@ public: struct npc_tobias_seecherAI : public npc_escortAI { - npc_tobias_seecherAI(Creature* c) :npc_escortAI(c) {} + npc_tobias_seecherAI(Creature* creature) : npc_escortAI(creature) {} void EnterCombat(Unit* who) {} void Reset() {} @@ -1099,41 +1121,46 @@ public: { if (IsBeingEscorted && killer == me) { - me->SetVisibility(VISIBILITY_OFF); + me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED); } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { - case 0:me->Say(SAY_TOBIAS_FREE, LANG_UNIVERSAL, PlayerGUID); break; - case 2: - instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_OBJECTIVE_COMPLETED);break; - case 4: - me->SetVisibility(VISIBILITY_OFF); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED); - break; + case 0: + me->Say(SAY_TOBIAS_FREE, LANG_UNIVERSAL, PlayerGUID); + break; + case 2: + instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_OBJECTIVE_COMPLETED); + break; + case 4: + me->SetVisible(false); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED); + break; } } void UpdateAI(const uint32 diff) { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return; + if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) + return; + if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_ENDED) { - me->SetVisibility(VISIBILITY_OFF); + me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } else { - me->SetVisibility(VISIBILITY_ON); + me->SetVisible(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -1217,8 +1244,8 @@ public: if (HasEscortState(STATE_ESCORT_ESCORTING)) return; - BreakKeg_Timer = 0; - BreakDoor_Timer = 0; + BreakKeg_Timer = 0; + BreakDoor_Timer = 0; } void DoGo(uint32 id, uint32 state) @@ -1227,29 +1254,29 @@ public: go->SetGoState((GOState)state); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { if (!instance) return; - switch (i) + switch (waypointId) { - case 1: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - break; - case 2: - me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); - break; - case 3: - me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); - break; - case 4: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - break; - case 5: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - BreakKeg_Timer = 2000; - break; + case 1: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + break; + case 2: + me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); + break; + case 3: + me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); + break; + case 4: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + break; + case 5: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + BreakKeg_Timer = 2000; + break; } } @@ -1263,8 +1290,8 @@ public: if (BreakKeg_Timer <= diff) { DoGo(DATA_GO_BAR_KEG, 0); - BreakKeg_Timer = 0; - BreakDoor_Timer = 1000; + BreakKeg_Timer = 0; + BreakDoor_Timer = 1000; } else BreakKeg_Timer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp index 2e8dc029d44..ff0f1a4cedd 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp @@ -42,8 +42,8 @@ public: void Reset() { - FireBlast_Timer = 2000; - Spirit_Timer = 24000; + FireBlast_Timer = 2000; + Spirit_Timer = 24000; } void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp index b4a4c416693..2585796e28e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp @@ -49,11 +49,11 @@ public: void Reset() { - ShadowBolt_Timer = 7000; - CurseOfTongues_Timer = 24000; - CurseOfWeakness_Timer = 12000; - DemonArmor_Timer = 3000; - EnvelopingWeb_Timer = 16000; + ShadowBolt_Timer = 7000; + CurseOfTongues_Timer = 24000; + CurseOfWeakness_Timer = 12000; + DemonArmor_Timer = 3000; + EnvelopingWeb_Timer = 16000; } void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp index e894fd35bd1..073c4fde82a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp @@ -55,9 +55,9 @@ public: void Reset() { - HandOfThaurissan_Timer = 4000; - AvatarOfFlame_Timer = 25000; - //Counter = 0; + HandOfThaurissan_Timer = 4000; + AvatarOfFlame_Timer = 25000; + //Counter= 0; } void EnterCombat(Unit* /*who*/) @@ -71,7 +71,7 @@ public: DoScriptText(SAY_SLAY, me); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Moira = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_MOIRA) : 0)) { @@ -100,7 +100,7 @@ public: //else //{ HandOfThaurissan_Timer = 5000; - //Counter = 0; + //Counter = 0; //} } else HandOfThaurissan_Timer -= diff; diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp index 69808386423..703f684cc9f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp @@ -47,11 +47,11 @@ public: void Reset() { - MightyBlow_Timer = 8000; - HamString_Timer = 12000; - Cleave_Timer = 16000; - Adds_Timer = 0; - Medics = false; + MightyBlow_Timer = 8000; + HamString_Timer = 12000; + Cleave_Timer = 16000; + Adds_Timer = 0; + Medics = false; } void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp index 883c601709e..b2c93d949c2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp @@ -43,8 +43,8 @@ public: void Reset() { - WhirlWind_Timer = 12000; - MortalStrike_Timer = 22000; + WhirlWind_Timer = 12000; + MortalStrike_Timer = 22000; } void EnterCombat(Unit* /*who*/) diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp index 7686ece3c2e..63d945ade90 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp @@ -43,8 +43,8 @@ public: void Reset() { - GroundTremor_Timer = 12000; - Frenzy_Timer = 0; + GroundTremor_Timer = 12000; + Frenzy_Timer =0; } void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp index 26e2bc80eb2..f4f245be4be 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp @@ -47,10 +47,10 @@ public: void Reset() { - ShadowWordPain_Timer = 4000; - ManaBurn_Timer = 14000; - PsychicScream_Timer = 32000; - ShadowShield_Timer = 8000; + ShadowWordPain_Timer = 4000; + ManaBurn_Timer = 14000; + PsychicScream_Timer = 32000; + ShadowShield_Timer = 8000; } void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp index 141b8307b7b..3d2cc627145 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp @@ -48,8 +48,8 @@ public: void Reset() { - FieryBurst_Timer = 5000; - WarStomp_Timer = 0; + FieryBurst_Timer = 5000; + WarStomp_Timer =0; } void EnterCombat(Unit* /*who*/) {} @@ -80,9 +80,9 @@ public: DoMeleeAttackIfReady(); } // When he die open door to last chamber - void JustDied(Unit* who) + void JustDied(Unit* killer) { - if (InstanceScript* instance = who->GetInstanceScript()) + if (InstanceScript* instance = killer->GetInstanceScript()) instance->HandleGameObject(instance->GetData64(DATA_THRONE_DOOR), true); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp index 72a60daea2d..e6f65ab4252 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp @@ -49,10 +49,10 @@ public: void Reset() { - Heal_Timer = 12000; // These times are probably wrong - MindBlast_Timer = 16000; - ShadowWordPain_Timer = 2000; - Smite_Timer = 8000; + Heal_Timer = 12000; //These times are probably wrong + MindBlast_Timer = 16000; + ShadowWordPain_Timer = 2000; + Smite_Timer = 8000; } void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp index 3c8d5fc4fa8..211930e4f1a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp @@ -45,7 +45,7 @@ class boss_gloomrel : public CreatureScript public: boss_gloomrel() : CreatureScript("boss_gloomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*Sender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); switch (action) @@ -104,7 +104,7 @@ class boss_doomrel : public CreatureScript public: boss_doomrel() : CreatureScript("boss_doomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*Sender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); switch (action) @@ -156,11 +156,11 @@ public: void Reset() { - ShadowVolley_Timer = 10000; - Immolate_Timer = 18000; - CurseOfWeakness_Timer = 5000; - DemonArmor_Timer = 16000; - Voidwalkers = false; + ShadowVolley_Timer = 10000; + Immolate_Timer = 18000; + CurseOfWeakness_Timer = 5000; + DemonArmor_Timer = 16000; + Voidwalkers = false; me->setFaction(FACTION_FRIEND); @@ -193,7 +193,7 @@ public: instance->SetData64(DATA_EVENSTARTER, 0); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_GHOSTKILL, 1); diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp index 2ef3ef48ecb..03cb077936b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp @@ -115,57 +115,57 @@ public: { memset(&encounter, 0, sizeof(encounter)); - EmperorGUID = 0; - PhalanxGUID = 0; - MagmusGUID = 0; - MoiraGUID = 0; - - GoArena1GUID = 0; - GoArena2GUID = 0; - GoArena3GUID = 0; - GoArena4GUID = 0; - GoShadowLockGUID = 0; - GoShadowMechGUID = 0; - GoShadowGiantGUID = 0; - GoShadowDummyGUID = 0; - GoBarKegGUID = 0; - GoBarKegTrapGUID = 0; - GoBarDoorGUID = 0; - GoTombEnterGUID = 0; - GoTombExitGUID = 0; - GoLyceumGUID = 0; - GoSFSGUID = 0; - GoSFNGUID = 0; - GoGolemNGUID = 0; - GoGolemSGUID = 0; - GoThroneGUID = 0; - GoChestGUID = 0; - GoSpectralChaliceGUID = 0; - - BarAleCount = 0; - GhostKillCount = 0; - TombEventStarterGUID = 0; + EmperorGUID = 0; + PhalanxGUID = 0; + MagmusGUID = 0; + MoiraGUID = 0; + + GoArena1GUID = 0; + GoArena2GUID = 0; + GoArena3GUID = 0; + GoArena4GUID = 0; + GoShadowLockGUID = 0; + GoShadowMechGUID = 0; + GoShadowGiantGUID = 0; + GoShadowDummyGUID = 0; + GoBarKegGUID = 0; + GoBarKegTrapGUID = 0; + GoBarDoorGUID = 0; + GoTombEnterGUID = 0; + GoTombExitGUID = 0; + GoLyceumGUID = 0; + GoSFSGUID = 0; + GoSFNGUID = 0; + GoGolemNGUID = 0; + GoGolemSGUID = 0; + GoThroneGUID = 0; + GoChestGUID = 0; + GoSpectralChaliceGUID = 0; + + BarAleCount = 0; + GhostKillCount = 0; + TombEventStarterGUID = 0; TombTimer = TIMER_TOMBOFTHESEVEN; - TombEventCounter = 0; + TombEventCounter = 0; for (uint8 i = 0; i < 7; ++i) - TombBossGUIDs[i] = 0; + TombBossGUIDs[i] = 0; } void OnCreatureCreate(Creature* creature) { switch (creature->GetEntry()) { - case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break; - case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break; - case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break; - case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break; - case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break; - case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break; - case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break; - case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break; - case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break; - case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break; + case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break; + case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break; + case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break; + case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break; + case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break; + case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break; + case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break; + case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break; + case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break; + case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break; case NPC_MAGMUS: MagmusGUID = creature->GetGUID(); if (!creature->isAlive()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h index e51c6b9130d..0af2af948d3 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h @@ -33,7 +33,8 @@ enum Data DATA_WARCHIEF_REND_BLACKHAND, DATA_GYTH, DATA_THE_BEAST, - DATA_GENERAL_DRAKKISATH + DATA_GENERAL_DRAKKISATH, + DATA_DRAGONSPIRE_ROOM, }; enum Npc { @@ -51,17 +52,51 @@ enum Npc NPC_GYTH = 10339, NPC_THE_BEAST = 10430, NPC_GENERAL_DRAKKISATH = 10363, + NPC_BLACKHAND_DREADWEAVER = 9817, + NPC_BLACKHAND_SUMMONER = 9818, + NPC_BLACKHAND_VETERAN = 9819, }; enum AdditionalData { SPELL_SUMMON_ROOKERY_WHELP = 15745, MAX_ENCOUNTER = 14, + MAX_DRAGONSPIRE_HALL_RUNES = 7, + EVENT_PYROGUARD_EMBERSEER = 4884, + AREATRIGGER_ENTER_UBRS = 2046, + AREATRIGGER_STADIUM = 2026, }; enum GameObjects { - GO_WHELP_SPAWNER = 175622, //trap spawned by go id 175124 + GO_WHELP_SPAWNER = 175622, // trap spawned by go id 175124 + + // Doors + GO_EMBERSEER_IN = 175244, // First door to Pyroguard Emberseer + GO_DOORS = 175705, // Second door to Pyroguard Emberseer + GO_EMBERSEER_OUT = 175153, // Door after Pyroguard Emberseer event + GO_GYTH_ENTRY_DOOR = 164726, + GO_GYTH_COMBAT_DOOR = 175185, + GO_GYTH_EXIT_DOOR = 175186, + GO_DRAKKISATH_DOOR_1 = 175946, + GO_DRAKKISATH_DOOR_2 = 175947, + + // Runes + GO_ROOM_1_RUNE = 175197, + GO_ROOM_2_RUNE = 175199, + GO_ROOM_3_RUNE = 175195, + GO_ROOM_4_RUNE = 175200, + GO_ROOM_5_RUNE = 175198, + GO_ROOM_6_RUNE = 175196, + GO_ROOM_7_RUNE = 175194, + + GO_EMBERSEER_RUNE_1 = 175266, + GO_EMBERSEER_RUNE_2 = 175267, + GO_EMBERSEER_RUNE_3 = 175268, + GO_EMBERSEER_RUNE_4 = 175269, + GO_EMBERSEER_RUNE_5 = 175270, + GO_EMBERSEER_RUNE_6 = 175271, + GO_EMBERSEER_RUNE_7 = 175272, }; #endif diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp index ff17e989cd9..ff40094debd 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp @@ -64,7 +64,7 @@ public: events.ScheduleEvent(EVENT_THUNDERCLAP, 17 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp index 0d8cabcf89c..214ce4e02f3 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp @@ -79,7 +79,7 @@ public: events.ScheduleEvent(EVENT_AGGRO, 60 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } @@ -117,7 +117,7 @@ public: // Interrupt any spell casting me->InterruptNonMeleeSpells(false); // Gyth model - me->SetDisplayId(me->GetCreatureInfo()->Modelid1); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); me->SummonCreature(NPC_WARCHIEF_REND_BLACKHAND, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS); events.ScheduleEvent(EVENT_CORROSIVE_ACID, 8 * IN_MILLISECONDS); events.ScheduleEvent(EVENT_FREEZE, 11 * IN_MILLISECONDS); diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp index a944ee6daf8..c5d566c51cb 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp @@ -63,7 +63,7 @@ public: events.ScheduleEvent(EVENT_MIGHTY_BLOW, 14 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp index bc9de52d91d..027952dc74a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp @@ -73,7 +73,7 @@ public: events.ScheduleEvent(EVENT_SLOW, 24 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp index 973ffe7e53b..c455b1d404d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp @@ -59,7 +59,7 @@ public: events.ScheduleEvent(EVENT_MOTHERS_MILK, 10 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp index b7492998d56..0c23f55bd39 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp @@ -77,7 +77,7 @@ public: events.ScheduleEvent(EVENT_KNOCK_AWAY, 12 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp index d76d0d7f47c..0279f3e2834 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp @@ -20,11 +20,24 @@ #include "ScriptedCreature.h" #include "blackrock_spire.h" +enum Text +{ + EMOTE_ONE_STACK = 0, + EMOTE_TEN_STACK = 1, + EMOTE_FREE_OF_BONDS = 2, + YELL_FREE_OF_BONDS = 3, +}; + enum Spells { - SPELL_FIRENOVA = 23462, - SPELL_FLAMEBUFFET = 23341, - SPELL_PYROBLAST = 17274, + SPELL_ENCAGED_EMBERSEER = 15282, // Self on spawn + SPELL_FIRE_SHIELD_TRIGGER = 13377, // Self on spawn missing from 335 dbc + SPELL_FREEZE_ANIM = 16245, // Self on event start + SPELL_EMBERSEER_GROWING = 16048, // Self on event start + SPELL_EMBERSEER_FULL_STRENGTH = 16047, // Emberseer Full Strength + SPELL_FIRENOVA = 23462, // Combat + SPELL_FLAMEBUFFET = 23341, // Combat + SPELL_PYROBLAST = 17274, // Combat }; enum Events @@ -51,6 +64,12 @@ public: void Reset() { + if(instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS) + OpenDoors(false); + instance->SetBossState(DATA_PYROGAURD_EMBERSEER,NOT_STARTED); + // respawn any dead Blackhand Incarcerators + DoCast(me, SPELL_ENCAGED_EMBERSEER); + //DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); _Reset(); } @@ -62,14 +81,28 @@ public: events.ScheduleEvent(EVENT_PYROBLAST, 14 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { + instance->SetBossState(DATA_PYROGAURD_EMBERSEER,DONE); + OpenDoors(true); _JustDied(); } + void OpenDoors(bool Boss_Killed) + { + if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) + door1->SetGoState(GO_STATE_ACTIVE); + if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) + door2->SetGoState(GO_STATE_ACTIVE); + if (Boss_Killed) + if (GameObject* door3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_OUT))) + door3->SetGoState(GO_STATE_ACTIVE); + } + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) + return; events.Update(diff); diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp index 4fb7e513f5d..d1eb60fbb71 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp @@ -60,7 +60,7 @@ public: events.ScheduleEvent(EVENT_STUN_BOMB, 16 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp index ce19a03571a..1f7e3697a6d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp @@ -61,7 +61,7 @@ public: events.ScheduleEvent(EVENT_THUNDERCLAP, 9 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp index f93466cbece..99e87dc617b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp @@ -62,7 +62,7 @@ public: events.ScheduleEvent(EVENT_CLEAVE, 14 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp index 88a09d57138..843679b460d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp @@ -61,7 +61,7 @@ public: events.ScheduleEvent(EVENT_TERRIFYING_ROAR, 23 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp index 2dc05799e51..a3891ef8590 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp @@ -70,7 +70,7 @@ public: events.ScheduleEvent(EVENT_THROW_AXE, 1 * IN_MILLISECONDS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp index ff97984fa09..fdb73fe1196 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp @@ -49,6 +49,12 @@ public: uint64 Gyth; uint64 TheBeast; uint64 GeneralDrakkisath; + uint64 go_emberseerin; + uint64 go_doors; + uint64 go_emberseerout; + uint64 go_roomrunes[MAX_DRAGONSPIRE_HALL_RUNES]; + uint8 Runemaxprotectors[MAX_DRAGONSPIRE_HALL_RUNES]; + uint8 Runeprotectorsdead[MAX_DRAGONSPIRE_HALL_RUNES]; void Initialize() { @@ -67,6 +73,9 @@ public: Gyth = 0; TheBeast = 0; GeneralDrakkisath = 0; + go_emberseerin = 0; + go_doors = 0; + go_emberseerout = 0; } bool IsEncounterInProgress() const @@ -125,7 +134,11 @@ public: case NPC_GENERAL_DRAKKISATH: GeneralDrakkisath = creature->GetGUID(); break; - } + case NPC_BLACKHAND_DREADWEAVER: + case NPC_BLACKHAND_SUMMONER: + case NPC_BLACKHAND_VETERAN: + break; + } } void OnGameObjectCreate(GameObject* go) @@ -135,6 +148,36 @@ public: case GO_WHELP_SPAWNER: go->CastSpell(NULL, SPELL_SUMMON_ROOKERY_WHELP); break; + case GO_EMBERSEER_IN: + go_emberseerin = go->GetGUID(); + break; + case GO_DOORS: + go_doors = go->GetGUID(); + break; + case GO_EMBERSEER_OUT: + go_emberseerout = go->GetGUID(); + break; + case GO_ROOM_1_RUNE: + go_roomrunes[0] = go->GetGUID(); + break; + case GO_ROOM_2_RUNE: + go_roomrunes[1] = go->GetGUID(); + break; + case GO_ROOM_3_RUNE: + go_roomrunes[2] = go->GetGUID(); + break; + case GO_ROOM_4_RUNE: + go_roomrunes[3] = go->GetGUID(); + break; + case GO_ROOM_5_RUNE: + go_roomrunes[4] = go->GetGUID(); + break; + case GO_ROOM_6_RUNE: + go_roomrunes[5] = go->GetGUID(); + break; + case GO_ROOM_7_RUNE: + go_roomrunes[6] = go->GetGUID(); + break; } } @@ -167,6 +210,18 @@ public: return true; } + void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId) + { + switch (eventId) + { + case EVENT_PYROGUARD_EMBERSEER: + SetBossState(DATA_PYROGAURD_EMBERSEER,IN_PROGRESS); + break; + default: + break; + } + } + uint64 GetData64(uint32 type) { switch (type) @@ -199,6 +254,26 @@ public: return TheBeast; case DATA_GENERAL_DRAKKISATH: return GeneralDrakkisath; + case GO_EMBERSEER_IN: + return go_emberseerin; + case GO_DOORS: + return go_doors; + case GO_EMBERSEER_OUT: + return go_emberseerout; + case GO_ROOM_1_RUNE: + return go_roomrunes[0]; + case GO_ROOM_2_RUNE: + return go_roomrunes[1]; + case GO_ROOM_3_RUNE: + return go_roomrunes[2]; + case GO_ROOM_4_RUNE: + return go_roomrunes[3]; + case GO_ROOM_5_RUNE: + return go_roomrunes[4]; + case GO_ROOM_6_RUNE: + return go_roomrunes[5]; + case GO_ROOM_7_RUNE: + return go_roomrunes[6]; } return 0; diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp index 7a4ba5777d1..af0dfd38ae8 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp @@ -59,10 +59,10 @@ public: void Reset() { - Cleave_Timer = 8000; // These times are probably wrong - BlastWave_Timer = 12000; - MortalStrike_Timer = 20000; - KnockBack_Timer = 30000; + Cleave_Timer = 8000; // These times are probably wrong + BlastWave_Timer = 12000; + MortalStrike_Timer = 20000; + KnockBack_Timer = 30000; } void EnterCombat(Unit* /*who*/) diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp index 818dcace078..a3eb0cea5ad 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp @@ -245,7 +245,7 @@ public: Unit* unit; if ((*i) && (*i)->getSource()) { - unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit) { //Cast affliction diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp index c4e0d6ea715..5d4cc442a49 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp @@ -92,15 +92,15 @@ public: void Reset() { - ShadowFlame_Timer = 12000; // These times are probably wrong - BellowingRoar_Timer = 30000; - VeilOfShadow_Timer = 15000; - Cleave_Timer = 7000; - TailLash_Timer = 10000; - ClassCall_Timer = 35000; // 35-40 seconds + ShadowFlame_Timer = 12000; // These times are probably wrong + BellowingRoar_Timer = 30000; + VeilOfShadow_Timer = 15000; + Cleave_Timer = 7000; + TailLash_Timer = 10000; + ClassCall_Timer = 35000; // 35-40 seconds Phase3 = false; - DespawnTimer = 5000; + DespawnTimer = 5000; } void KilledUnit(Unit* Victim) @@ -111,7 +111,7 @@ public: DoScriptText(SAY_SLAY, me, Victim); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp index a4fb4ad22a3..24fc74cc7cb 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp @@ -75,7 +75,7 @@ public: DoZoneInCombat(); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp index 4a72bd0ca38..eaa8c118f19 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp @@ -51,20 +51,20 @@ class boss_vaelastrasz : public CreatureScript public: boss_vaelastrasz() : CreatureScript("boss_vaelastrasz") { } - void SendDefaultMenu(Player* player, Creature* creature, uint32 Action) + void SendDefaultMenu(Player* player, Creature* creature, uint32 action) { - if (Action == GOSSIP_ACTION_INFO_DEF + 1) //Fight time + if (action == GOSSIP_ACTION_INFO_DEF + 1) //Fight time { player->CLOSE_GOSSIP_MENU(); CAST_AI(boss_vaelastrasz::boss_vaelAI, creature->AI())->BeginSpeech(player); } } - bool OnGossipSelect(Player* player, Creature* creature, uint32 Sender, uint32 Action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (Sender == GOSSIP_SENDER_MAIN) - SendDefaultMenu(player, creature, Action); + if (sender == GOSSIP_SENDER_MAIN) + SendDefaultMenu(player, creature, action); return true; } @@ -108,17 +108,17 @@ public: void Reset() { - PlayerGUID = 0; - SpeechTimer = 0; - SpeechNum = 0; - Cleave_Timer = 8000; //These times are probably wrong - FlameBreath_Timer = 11000; - BurningAdrenalineCaster_Timer = 15000; - BurningAdrenalineTank_Timer = 45000; - FireNova_Timer = 5000; - TailSwipe_Timer = 20000; - HasYelled = false; - DoingSpeech = false; + PlayerGUID = 0; + SpeechTimer = 0; + SpeechNum = 0; + Cleave_Timer = 8000; // These times are probably wrong + FlameBreath_Timer = 11000; + BurningAdrenalineCaster_Timer = 15000; + BurningAdrenalineTank_Timer = 45000; + FireNova_Timer = 5000; + TailSwipe_Timer = 20000; + HasYelled = false; + DoingSpeech = false; } void BeginSpeech(Unit* target) @@ -176,9 +176,9 @@ public: break; case 2: me->setFaction(103); - if (PlayerGUID && Unit::GetUnit((*me), PlayerGUID)) + if (PlayerGUID && Unit::GetUnit(*me, PlayerGUID)) { - AttackStart(Unit::GetUnit((*me), PlayerGUID)); + AttackStart(Unit::GetUnit(*me, PlayerGUID)); DoCast(me, SPELL_ESSENCEOFTHERED); } SpeechTimer = 0; diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp index 2c7cd73c604..668b84d38dd 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp @@ -83,10 +83,10 @@ class boss_victor_nefarius : public CreatureScript public: boss_victor_nefarius() : CreatureScript("boss_victor_nefarius") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*Sender*/, uint32 Action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (Action) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -220,13 +220,13 @@ public: void Reset() { - SpawnedAdds = 0; - AddSpawnTimer = 10000; - ShadowBoltTimer = 5000; - FearTimer = 8000; - ResetTimer = 900000; //On official it takes him 15 minutes(900 seconds) to reset. We are only doing 1 minute to make testing easier - NefarianGUID = 0; - NefCheckTime = 2000; + SpawnedAdds = 0; + AddSpawnTimer = 10000; + ShadowBoltTimer = 5000; + FearTimer = 8000; + ResetTimer = 900000; // On official it takes him 15 minutes(900 seconds) to reset. We are only doing 1 minute to make testing easier + NefarianGUID = 0; + NefCheckTime = 2000; me->SetUInt32Value(UNIT_NPC_FLAGS, 1); me->setFaction(35); diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 5af9dd2f23e..5dc3b52dec1 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -84,7 +84,6 @@ set(scripts_STAT_SRCS EasternKingdoms/MoltenCore/instance_molten_core.cpp EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp EasternKingdoms/MoltenCore/boss_magmadar.cpp - EasternKingdoms/MoltenCore/molten_core.cpp EasternKingdoms/MoltenCore/boss_shazzrah.cpp EasternKingdoms/Stratholme/boss_baroness_anastari.cpp EasternKingdoms/Stratholme/boss_nerubenkan.cpp diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index 9830563ac87..4885d8620b0 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -127,7 +127,7 @@ public: DoCastAOE(SPELL_SMITE_STOMP, false); SetCombatMovement(false); if (instance) - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_SMITE_CHEST))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST))) { me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ()); @@ -158,7 +158,6 @@ public: me->GetMotionMaster()->MoveChase(me->getVictim(), me->m_CombatDistance); uiPhase = 0; break; - } } else uiTimer -= uiDiff; } @@ -174,9 +173,7 @@ public: uiTimer = 1500; uiPhase = 1; } - }; - }; void AddSC_boss_mr_smite() diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp index fffd8d41264..6c6b0647c5f 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp @@ -45,17 +45,16 @@ public: player->GetSession()->SendNotification("Instance script not initialized"); return true; } - if (instance->GetData(EVENT_STATE)!= CANNON_NOT_USED) + + if (instance->GetData(EVENT_STATE) != CANNON_NOT_USED) return false; + if (targets.GetGOTarget() && targets.GetGOTarget()->GetEntry() == GO_DEFIAS_CANNON) - { instance->SetData(EVENT_STATE, CANNON_GUNPOWDER_USED); - } player->DestroyItemCount(item->GetEntry(), 1, true); return true; } - }; void AddSC_deadmines() diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h index 55726fb2a8e..419af40ee36 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h @@ -47,4 +47,3 @@ enum GameObjects GO_MR_SMITE_CHEST = 144111 }; #endif - diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 1b037be8afa..46e84481fee 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -156,7 +156,7 @@ class instance_deadmines : public InstanceMapScript void MoveCreatureInside(Creature* creature) { - creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + creature->SetWalk(false); creature->GetMotionMaster()->MovePoint(0, -102.7f, -655.9f, creature->GetPositionZ()); } diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index cd5566007ee..b5a7984d945 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -95,10 +95,10 @@ public: return new npc_blastmaster_emi_shortfuseAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { if (npc_escortAI* pEscortAI = CAST_AI(npc_blastmaster_emi_shortfuse::npc_blastmaster_emi_shortfuseAI, creature->AI())) pEscortAI->Start(true, false, player->GetGUID()); @@ -189,11 +189,11 @@ public: if (bBool) { if (instance) - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) instance->HandleGameObject(0, false, go); }else if (instance) - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_LEFT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) instance->HandleGameObject(0, false, go); } @@ -204,10 +204,10 @@ public: if (bBool) { - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) me->SetFacingToObject(go); }else - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_LEFT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) me->SetFacingToObject(go); } @@ -216,10 +216,10 @@ public: if (!instance) return; - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) instance->HandleGameObject(0, false, go); - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_LEFT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) instance->HandleGameObject(0, false, go); if (!GoSummonList.empty()) @@ -266,14 +266,14 @@ public: } } - void WaypointReached(uint32 uiPoint) + void WaypointReached(uint32 waypointId) { //just in case if (GetPlayerForEscort()) if (me->getFaction() != GetPlayerForEscort()->getFaction()) me->setFaction(GetPlayerForEscort()->getFaction()); - switch (uiPoint) + switch (waypointId) { case 3: SetEscortPaused(true); @@ -445,7 +445,7 @@ public: DoScriptText(SAY_BLASTMASTER_5, me); Summon(1); if (instance) - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) instance->HandleGameObject(0, true, go); NextStep(3000, true); break; @@ -491,7 +491,7 @@ public: DoScriptText(SAY_BLASTMASTER_23, me); SetInFace(false); if (instance) - if (GameObject* go = GameObject::GetGameObject((*me), instance->GetData64(DATA_GO_CAVE_IN_LEFT))) + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) instance->HandleGameObject(0, true, go); NextStep(2000, true); break; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp index b1fa4d54eb6..96bda019f6a 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp @@ -55,7 +55,7 @@ public: struct boss_curatorAI : public ScriptedAI { - boss_curatorAI(Creature* c) : ScriptedAI(c) {} + boss_curatorAI(Creature* creature) : ScriptedAI(creature) {} uint32 AddTimer; uint32 HatefulBoltTimer; @@ -80,7 +80,7 @@ public: DoScriptText(RAND(SAY_KILL1, SAY_KILL2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 66de84abbc2..e19efc7c4e5 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -51,7 +51,7 @@ public: struct boss_maiden_of_virtueAI : public ScriptedAI { - boss_maiden_of_virtueAI(Creature* c) : ScriptedAI(c) {} + boss_maiden_of_virtueAI(Creature* creature) : ScriptedAI(creature) {} uint32 Repentance_Timer; uint32 Holyfire_Timer; @@ -78,7 +78,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index 65b758b55e7..2bba875ad1f 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -58,7 +58,7 @@ public: struct boss_attumenAI : public ScriptedAI { - boss_attumenAI(Creature* c) : ScriptedAI(c) + boss_attumenAI(Creature* creature) : ScriptedAI(creature) { Phase = 1; @@ -89,7 +89,7 @@ public: DoScriptText(RAND(SAY_KILL1, SAY_KILL2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (Unit* pMidnight = Unit::GetUnit(*me, Midnight)) @@ -119,7 +119,7 @@ public: struct boss_midnightAI : public ScriptedAI { - boss_midnightAI(Creature* c) : ScriptedAI(c) {} + boss_midnightAI(Creature* creature) : ScriptedAI(creature) {} uint64 Attumen; uint8 Phase; @@ -185,7 +185,7 @@ public: pAttumen->GetMotionMaster()->MoveChase(pAttumen->getVictim()); pAttumen->SetTarget(pAttumen->getVictim()->GetGUID()); } - pAttumen->SetFloatValue(OBJECT_FIELD_SCALE_X, 1); + pAttumen->SetObjectScale(1); } } else Mount_Timer -= diff; } @@ -203,16 +203,16 @@ public: pAttumen->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); float angle = me->GetAngle(pAttumen); float distance = me->GetDistance2d(pAttumen); - float newX = me->GetPositionX() + cos(angle)*(distance/2) ; - float newY = me->GetPositionY() + sin(angle)*(distance/2) ; + float newX = me->GetPositionX() + cos(angle)*(distance/2); + float newY = me->GetPositionY() + sin(angle)*(distance/2); float newZ = 50; //me->Relocate(newX, newY, newZ, angle); //me->SendMonsterMove(newX, newY, newZ, 0, true, 1000); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(0, newX, newY, newZ); distance += 10; - newX = me->GetPositionX() + cos(angle)*(distance/2) ; - newY = me->GetPositionY() + sin(angle)*(distance/2) ; + newX = me->GetPositionX() + cos(angle)*(distance/2); + newY = me->GetPositionY() + sin(angle)*(distance/2); pAttumen->GetMotionMaster()->Clear(); pAttumen->GetMotionMaster()->MovePoint(0, newX, newY, newZ); //pAttumen->Relocate(newX, newY, newZ, -angle); @@ -244,8 +244,8 @@ void boss_attumen::boss_attumenAI::UpdateAI(const uint32 diff) Midnight = 0; me->SetVisible(false); me->Kill(me); - } - } else ResetTimer -= diff; + } else ResetTimer -= diff; + } //Return since we have no target if (!UpdateVictim()) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 484515be0f8..f69cecdb4c3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -72,13 +72,12 @@ public: struct boss_moroesAI : public ScriptedAI { - boss_moroesAI(Creature* c) : ScriptedAI(c) + boss_moroesAI(Creature* creature) : ScriptedAI(creature) { for (uint8 i = 0; i < 4; ++i) - { AddId[i] = 0; - } - instance = c->GetInstanceScript(); + + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -136,7 +135,7 @@ public: DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2, SAY_KILL_3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -202,7 +201,7 @@ public: void DeSpawnAdds() { - for (uint8 i = 0; i < 4 ; ++i) + for (uint8 i = 0; i < 4; ++i) { Creature* Temp = NULL; if (AddGUID[i]) @@ -322,12 +321,12 @@ struct boss_moroes_guestAI : public ScriptedAI uint64 GuestGUID[4]; - boss_moroes_guestAI(Creature* c) : ScriptedAI(c) + boss_moroes_guestAI(Creature* creature) : ScriptedAI(creature) { for (uint8 i = 0; i < 4; ++i) GuestGUID[i] = 0; - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Reset() @@ -359,7 +358,7 @@ struct boss_moroes_guestAI : public ScriptedAI uint64 TempGUID = GuestGUID[rand()%4]; if (TempGUID) { - Unit* unit = Unit::GetUnit((*me), TempGUID); + Unit* unit = Unit::GetUnit(*me, TempGUID); if (unit && unit->isAlive()) return unit; } @@ -417,7 +416,7 @@ public: struct boss_baroness_dorothea_millstipeAI : public boss_moroes_guestAI { //Shadow Priest - boss_baroness_dorothea_millstipeAI(Creature* c) : boss_moroes_guestAI(c) {} + boss_baroness_dorothea_millstipeAI(Creature* creature) : boss_moroes_guestAI(creature) {} uint32 ManaBurn_Timer; uint32 MindFlay_Timer; @@ -481,7 +480,7 @@ public: struct boss_baron_rafe_dreugerAI : public boss_moroes_guestAI { //Retr Pally - boss_baron_rafe_dreugerAI(Creature* c) : boss_moroes_guestAI(c){} + boss_baron_rafe_dreugerAI(Creature* creature) : boss_moroes_guestAI(creature){} uint32 HammerOfJustice_Timer; uint32 SealOfCommand_Timer; @@ -539,7 +538,7 @@ public: struct boss_lady_catriona_von_indiAI : public boss_moroes_guestAI { //Holy Priest - boss_lady_catriona_von_indiAI(Creature* c) : boss_moroes_guestAI(c) {} + boss_lady_catriona_von_indiAI(Creature* creature) : boss_moroes_guestAI(creature) {} uint32 DispelMagic_Timer; uint32 GreaterHeal_Timer; @@ -610,7 +609,7 @@ public: struct boss_lady_keira_berrybuckAI : public boss_moroes_guestAI { //Holy Pally - boss_lady_keira_berrybuckAI(Creature* c) : boss_moroes_guestAI(c) {} + boss_lady_keira_berrybuckAI(Creature* creature) : boss_moroes_guestAI(creature) {} uint32 Cleanse_Timer; uint32 GreaterBless_Timer; @@ -685,7 +684,7 @@ public: struct boss_lord_robin_darisAI : public boss_moroes_guestAI { //Arms Warr - boss_lord_robin_darisAI(Creature* c) : boss_moroes_guestAI(c) {} + boss_lord_robin_darisAI(Creature* creature) : boss_moroes_guestAI(creature) {} uint32 Hamstring_Timer; uint32 MortalStrike_Timer; @@ -742,7 +741,7 @@ public: struct boss_lord_crispin_ferenceAI : public boss_moroes_guestAI { //Arms Warr - boss_lord_crispin_ferenceAI(Creature* c) : boss_moroes_guestAI(c) {} + boss_lord_crispin_ferenceAI(Creature* creature) : boss_moroes_guestAI(creature) {} uint32 Disarm_Timer; uint32 HeroicStrike_Timer; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index c1fe9c9c56c..f89abca76cf 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -70,9 +70,9 @@ public: struct boss_netherspiteAI : public ScriptedAI { - boss_netherspiteAI(Creature* c) : ScriptedAI(c) + boss_netherspiteAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); for (int i=0; i<3; ++i) { diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 728446aa833..ded5e6903a5 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -70,9 +70,9 @@ public: struct boss_nightbaneAI : public ScriptedAI { - boss_nightbaneAI(Creature* c) : ScriptedAI(c) + boss_nightbaneAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); Intro = true; } @@ -121,8 +121,8 @@ public: MovePhase = 0; me->SetSpeed(MOVE_RUN, 2.0f); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetDisableGravity(true); + me->SetWalk(false); me->setActive(true); if (instance) @@ -240,7 +240,7 @@ public: me->InterruptSpell(CURRENT_GENERIC_SPELL); me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); (*me).GetMotionMaster()->Clear(false); (*me).GetMotionMaster()->MovePoint(0, IntroWay[2][0], IntroWay[2][1], IntroWay[2][2]); @@ -263,7 +263,7 @@ public: { if (MovePhase >= 7) { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetLevitate(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->GetMotionMaster()->MovePoint(8, IntroWay[7][0], IntroWay[7][1], IntroWay[7][2]); } @@ -277,7 +277,7 @@ public: { if (MovePhase >= 7) { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetLevitate(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->GetMotionMaster()->MovePoint(8, IntroWay[7][0], IntroWay[7][1], IntroWay[7][2]); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 14add92fd16..4700ad71fab 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -108,7 +108,7 @@ public: struct netherspite_infernalAI : public ScriptedAI { - netherspite_infernalAI(Creature* c) : ScriptedAI(c), + netherspite_infernalAI(Creature* creature) : ScriptedAI(creature), HellfireTimer(0), CleanupTimer(0), malchezaar(0), point(NULL) {} uint32 HellfireTimer; @@ -183,9 +183,9 @@ public: struct boss_malchezaarAI : public ScriptedAI { - boss_malchezaarAI(Creature* c) : ScriptedAI(c) + boss_malchezaarAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -243,7 +243,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -297,7 +297,7 @@ public: SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); //damage - const CreatureTemplate* cinfo = me->GetCreatureInfo(); + const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, cinfo->mindmg); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, cinfo->maxdmg); me->UpdateDamagePhysical(BASE_ATTACK); @@ -420,7 +420,7 @@ public: SetEquipmentSlots(false, EQUIP_ID_AXE, EQUIP_ID_AXE, EQUIP_NO_CHANGE); //damage - const CreatureTemplate* cinfo = me->GetCreatureInfo(); + const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 2*cinfo->mindmg); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 2*cinfo->maxdmg); me->UpdateDamagePhysical(BASE_ATTACK); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 119cb7d9de6..d95b4aa3ae1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -24,7 +24,6 @@ SDCategory: Karazhan EndScriptData */ #include "ScriptPCH.h" -#include "ScriptedSimpleAI.h" #include "karazhan.h" #include "GameObject.h" @@ -93,9 +92,9 @@ public: struct boss_aranAI : public ScriptedAI { - boss_aranAI(Creature* c) : ScriptedAI(c) + boss_aranAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -162,7 +161,7 @@ public: DoScriptText(RAND(SAY_KILL1, SAY_KILL2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -523,7 +522,7 @@ public: struct water_elementalAI : public ScriptedAI { - water_elementalAI(Creature* c) : ScriptedAI(c) {} + water_elementalAI(Creature* creature) : ScriptedAI(creature) {} uint32 CastTimer; @@ -549,33 +548,8 @@ public: }; -// CONVERT TO ACID -class mob_shadow_of_aran : public CreatureScript -{ -public: - mob_shadow_of_aran() : CreatureScript("mob_shadow_of_aran") { } - - CreatureAI* GetAI(Creature* creature) const - { - sLog->outString("TSCR: Convert simpleAI script for Creature Entry %u to ACID", creature->GetEntry()); - SimpleAI* ai = new SimpleAI (creature); - - ai->Spell[0].Enabled = true; - ai->Spell[0].Spell_Id = SPELL_SHADOW_PYRO; - ai->Spell[0].Cooldown = 5000; - ai->Spell[0].First_Cast = 1000; - ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_TARGET; - - ai->EnterEvadeMode(); - - return ai; - } - -}; - void AddSC_boss_shade_of_aran() { new boss_shade_of_aran(); - new mob_shadow_of_aran(); new mob_aran_elemental(); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 15750c5b9c5..2f19d2c7fc1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -68,9 +68,9 @@ public: struct mob_kilrekAI : public ScriptedAI { - mob_kilrekAI(Creature* c) : ScriptedAI(c) + mob_kilrekAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -94,14 +94,14 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { uint64 TerestianGUID = instance->GetData64(DATA_TERESTIAN); if (TerestianGUID) { - Unit* Terestian = Unit::GetUnit((*me), TerestianGUID); + Unit* Terestian = Unit::GetUnit(*me, TerestianGUID); if (Terestian && Terestian->isAlive()) DoCast(Terestian, SPELL_BROKEN_PACT, true); } @@ -140,7 +140,7 @@ public: struct mob_demon_chainAI : public ScriptedAI { - mob_demon_chainAI(Creature* c) : ScriptedAI(c) {} + mob_demon_chainAI(Creature* creature) : ScriptedAI(creature) {} uint64 SacrificeGUID; @@ -157,7 +157,7 @@ public: { if (SacrificeGUID) { - Unit* Sacrifice = Unit::GetUnit((*me), SacrificeGUID); + Unit* Sacrifice = Unit::GetUnit(*me, SacrificeGUID); if (Sacrifice) Sacrifice->RemoveAurasDueToSpell(SPELL_SACRIFICE); } @@ -178,7 +178,7 @@ public: struct mob_fiendish_portalAI : public PassiveAI { - mob_fiendish_portalAI(Creature* c) : PassiveAI(c), summons(me){} + mob_fiendish_portalAI(Creature* creature) : PassiveAI(creature), summons(me){} SummonList summons; @@ -215,7 +215,7 @@ public: struct mob_fiendish_impAI : public ScriptedAI { - mob_fiendish_impAI(Creature* c) : ScriptedAI(c) {} + mob_fiendish_impAI(Creature* creature) : ScriptedAI(creature) {} uint32 FireboltTimer; @@ -258,11 +258,11 @@ public: struct boss_terestianAI : public ScriptedAI { - boss_terestianAI(Creature* c) : ScriptedAI(c) + boss_terestianAI(Creature* creature) : ScriptedAI(creature) { for (uint8 i = 0; i < 2; ++i) PortalGUID[i] = 0; - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index b15cb7d3da1..6f8121ef5b6 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -114,9 +114,9 @@ public: struct boss_dorotheeAI : public ScriptedAI { - boss_dorotheeAI(Creature* c) : ScriptedAI(c) + boss_dorotheeAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -229,7 +229,7 @@ public: struct mob_titoAI : public ScriptedAI { - mob_titoAI(Creature* c) : ScriptedAI(c) {} + mob_titoAI(Creature* creature) : ScriptedAI(creature) {} uint64 DorotheeGUID; uint32 YipTimer; @@ -296,9 +296,9 @@ public: struct boss_strawmanAI : public ScriptedAI { - boss_strawmanAI(Creature* c) : ScriptedAI(c) + boss_strawmanAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -411,9 +411,9 @@ public: struct boss_tinheadAI : public ScriptedAI { - boss_tinheadAI(Creature* c) : ScriptedAI(c) + boss_tinheadAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -521,9 +521,9 @@ public: struct boss_roarAI : public ScriptedAI { - boss_roarAI(Creature* c) : ScriptedAI(c) + boss_roarAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -630,9 +630,9 @@ public: struct boss_croneAI : public ScriptedAI { - boss_croneAI(Creature* c) : ScriptedAI(c) + boss_croneAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -712,7 +712,7 @@ public: struct mob_cycloneAI : public ScriptedAI { - mob_cycloneAI(Creature* c) : ScriptedAI(c) {} + mob_cycloneAI(Creature* creature) : ScriptedAI(creature) {} uint32 MoveTimer; @@ -769,10 +769,10 @@ class npc_grandmother : public CreatureScript public: npc_grandmother() : CreatureScript("npc_grandmother") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { if (Creature* pBigBadWolf = creature->SummonCreature(CREATURE_BIG_BAD_WOLF, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) pBigBadWolf->AI()->AttackStart(player); @@ -805,9 +805,9 @@ public: struct boss_bigbadwolfAI : public ScriptedAI { - boss_bigbadwolfAI(Creature* c) : ScriptedAI(c) + boss_bigbadwolfAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -886,7 +886,7 @@ public: { IsChasing = false; - if (Unit* target = Unit::GetUnit((*me), HoodGUID)) + if (Unit* target = Unit::GetUnit(*me, HoodGUID)) { HoodGUID = 0; if (DoGetThreat(target)) @@ -1004,9 +1004,9 @@ public: struct boss_julianneAI : public ScriptedAI { - boss_julianneAI(Creature* c) : ScriptedAI(c) + boss_julianneAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); EntryYellTimer = 1000; AggroYellTimer = 10000; IsFakingDeath = false; @@ -1127,9 +1127,9 @@ public: struct boss_romuloAI : public ScriptedAI { - boss_romuloAI(Creature* c) : ScriptedAI(c) + boss_romuloAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); EntryYellTimer = 8000; AggroYellTimer = 15000; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 056a2e95448..b37f6913b8d 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -109,11 +109,11 @@ public: struct npc_barnesAI : public npc_escortAI { - npc_barnesAI(Creature* c) : npc_escortAI(c) + npc_barnesAI(Creature* creature) : npc_escortAI(creature) { RaidWiped = false; m_uiEventId = 0; - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -158,12 +158,12 @@ public: void EnterCombat(Unit* /*who*/) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { if (!instance) return; - switch (i) + switch (waypointId) { case 0: DoCast(me, SPELL_TUXEDO, false); @@ -324,12 +324,12 @@ public: } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI()); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -414,10 +414,10 @@ class npc_berthold : public CreatureScript public: npc_berthold() : CreatureScript("npc_berthold") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) player->CastSpell(player, SPELL_TELEPORT, true); player->CLOSE_GOSSIP_MENU(); @@ -474,9 +474,9 @@ public: struct npc_image_of_medivhAI : public ScriptedAI { - npc_image_of_medivhAI(Creature* c) : ScriptedAI(c) + npc_image_of_medivhAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -527,7 +527,7 @@ public: if (!Arcanagos) return; ArcanagosGUID = Arcanagos->GetGUID(); - Arcanagos->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + Arcanagos->SetDisableGravity(true); (*Arcanagos).GetMotionMaster()->MovePoint(0, ArcanagosPos[0], ArcanagosPos[1], ArcanagosPos[2]); Arcanagos->SetOrientation(ArcanagosPos[3]); me->SetOrientation(MedivPos[3]); @@ -536,7 +536,7 @@ public: uint32 NextStep(uint32 Step) { - Unit* arca = Unit::GetUnit((*me), ArcanagosGUID); + Unit* arca = Unit::GetUnit(*me, ArcanagosGUID); Map* map = me->GetMap(); switch (Step) { @@ -625,7 +625,7 @@ public: if (Step >= 7 && Step <= 12) { - Unit* arca = Unit::GetUnit((*me), ArcanagosGUID); + Unit* arca = Unit::GetUnit(*me, ArcanagosGUID); if (FireArcanagosTimer <= diff) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index dd37f659eec..c53793b6e30 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -89,9 +89,9 @@ public: struct boss_felblood_kaelthasAI : public ScriptedAI { - boss_felblood_kaelthasAI(Creature* c) : ScriptedAI(c) + boss_felblood_kaelthasAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -154,14 +154,18 @@ public: if (!instance) return; - instance->HandleGameObject(instance->GetData64(DATA_KAEL_DOOR), true); // Open the encounter door + instance->HandleGameObject(instance->GetData64(DATA_KAEL_DOOR), true); + + // Enable the Translocation Orb Exit + if (GameObject* escapeOrb = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ESCAPE_ORB))) + escapeOrb->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } void DamageTaken(Unit* /*done_by*/, uint32 &damage) { if (damage > me->GetHealth()) - RemoveGravityLapse(); // Remove Gravity Lapse so that players fall to ground if they kill him when in air. + RemoveGravityLapse(); // Remove Gravity Lapse so that players fall to ground if they kill him when in air. } void EnterCombat(Unit* /*who*/) @@ -169,8 +173,8 @@ public: if (!instance) return; + //Close the encounter door, open it in JustDied/Reset instance->HandleGameObject(instance->GetData64(DATA_KAEL_DOOR), false); - //Close the encounter door, open it in JustDied/Reset } void MoveInLineOfSight(Unit* who) @@ -193,7 +197,7 @@ public: std::list::const_iterator i = m_threatlist.begin(); for (i = m_threatlist.begin(); i != m_threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && unit->isAlive()) { float threat = me->getThreatManager().getThreat(unit); @@ -211,7 +215,7 @@ public: std::list::const_iterator i = me->getThreatManager().getThreatList().begin(); for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) unit->CastSpell(unit, SPELL_TELEPORT_CENTER, true); } @@ -223,7 +227,7 @@ public: std::list::const_iterator i = me->getThreatManager().getThreatList().begin(); for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) // Knockback into the air unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, me->GetGUID()); @@ -235,7 +239,7 @@ public: std::list::const_iterator i = me->getThreatManager().getThreatList().begin(); for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { // Also needs an exception in spell system. @@ -254,7 +258,7 @@ public: std::list::const_iterator i = me->getThreatManager().getThreatList().begin(); for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { unit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); @@ -439,7 +443,7 @@ public: struct mob_felkael_flamestrikeAI : public ScriptedAI { - mob_felkael_flamestrikeAI(Creature* c) : ScriptedAI(c) + mob_felkael_flamestrikeAI(Creature* creature) : ScriptedAI(creature) { } @@ -481,9 +485,9 @@ public: struct mob_felkael_phoenixAI : public ScriptedAI { - mob_felkael_phoenixAI(Creature* c) : ScriptedAI(c) + mob_felkael_phoenixAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -495,7 +499,7 @@ public: void Reset() { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); DoCast(me, SPELL_PHOENIX_BURN, true); BurnTimer = 2000; Death_Timer = 3000; @@ -542,7 +546,7 @@ public: } - void JustDied(Unit* /*slayer*/) + void JustDied(Unit* /*killer*/) { me->SummonCreature(CREATURE_PHOENIX_EGG, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000); } @@ -601,7 +605,7 @@ public: struct mob_felkael_phoenix_eggAI : public ScriptedAI { - mob_felkael_phoenix_eggAI(Creature* c) : ScriptedAI(c) {} + mob_felkael_phoenix_eggAI(Creature* creature) : ScriptedAI(creature) {} uint32 HatchTimer; @@ -638,7 +642,7 @@ public: struct mob_arcane_sphereAI : public ScriptedAI { - mob_arcane_sphereAI(Creature* c) : ScriptedAI(c) { Reset(); } + mob_arcane_sphereAI(Creature* creature) : ScriptedAI(creature) { Reset(); } uint32 DespawnTimer; uint32 ChangeTargetTimer; @@ -649,7 +653,7 @@ public: ChangeTargetTimer = urand(6000, 12000); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->setFaction(14); DoCast(me, SPELL_ARCANE_SPHERE_PASSIVE, true); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index b9d4f600329..883932fdb9b 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -99,9 +99,9 @@ public: struct boss_priestess_delrissaAI : public ScriptedAI { - boss_priestess_delrissaAI(Creature* c) : ScriptedAI(c) + boss_priestess_delrissaAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); memset(&m_auiLackeyGUID, 0, sizeof(m_auiLackeyGUID)); LackeyEntryList.clear(); } @@ -341,9 +341,9 @@ enum eHealingPotion //all 8 possible lackey use this common struct boss_priestess_lackey_commonAI : public ScriptedAI { - boss_priestess_lackey_commonAI(Creature* c) : ScriptedAI(c) + boss_priestess_lackey_commonAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); memset(&m_auiLackeyGUIDs, 0, sizeof(m_auiLackeyGUIDs)); AcquireGUIDs(); } @@ -495,7 +495,7 @@ public: struct boss_kagani_nightstrikeAI : public boss_priestess_lackey_commonAI { //Rogue - boss_kagani_nightstrikeAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_kagani_nightstrikeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} uint32 Gouge_Timer; uint32 Kick_Timer; @@ -600,7 +600,7 @@ public: struct boss_ellris_duskhallowAI : public boss_priestess_lackey_commonAI { //Warlock - boss_ellris_duskhallowAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_ellris_duskhallowAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} uint32 Immolate_Timer; uint32 Shadow_Bolt_Timer; @@ -692,7 +692,7 @@ public: struct boss_eramas_brightblazeAI : public boss_priestess_lackey_commonAI { //Monk - boss_eramas_brightblazeAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_eramas_brightblazeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} uint32 Knockdown_Timer; uint32 Snap_Kick_Timer; @@ -754,7 +754,7 @@ public: struct boss_yazzaiAI : public boss_priestess_lackey_commonAI { //Mage - boss_yazzaiAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_yazzaiAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} bool HasIceBlocked; @@ -885,7 +885,7 @@ public: struct boss_warlord_salarisAI : public boss_priestess_lackey_commonAI { //Warrior - boss_warlord_salarisAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_warlord_salarisAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} uint32 Intercept_Stun_Timer; uint32 Disarm_Timer; @@ -1006,7 +1006,10 @@ public: struct boss_garaxxasAI : public boss_priestess_lackey_commonAI { //Hunter - boss_garaxxasAI(Creature* c) : boss_priestess_lackey_commonAI(c) { m_uiPetGUID = 0; } + boss_garaxxasAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) + { + m_uiPetGUID = 0; + } uint64 m_uiPetGUID; @@ -1126,7 +1129,7 @@ public: struct boss_apokoAI : public boss_priestess_lackey_commonAI { //Shaman - boss_apokoAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_apokoAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} uint32 Totem_Timer; uint8 Totem_Amount; @@ -1225,7 +1228,7 @@ public: struct boss_zelfanAI : public boss_priestess_lackey_commonAI { //Engineer - boss_zelfanAI(Creature* c) : boss_priestess_lackey_commonAI(c) {} + boss_zelfanAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) {} uint32 Goblin_Dragon_Gun_Timer; uint32 Rocket_Launch_Timer; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index fa97e4eefc0..af7deda4545 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -63,9 +63,9 @@ public: struct boss_selin_fireheartAI : public ScriptedAI { - boss_selin_fireheartAI(Creature* c) : ScriptedAI(c) + boss_selin_fireheartAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); Crystals.clear(); //GUIDs per instance is static, so we only need to load them once. @@ -171,7 +171,7 @@ public: float x, y, z; // coords that we move to, close to the crystal. CrystalChosen->GetClosePoint(x, y, z, me->GetObjectSize(), CONTACT_DISTANCE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->GetMotionMaster()->MovePoint(1, x, y, z); DrainingCrystal = true; } @@ -333,7 +333,7 @@ public: struct mob_fel_crystalAI : public ScriptedAI { - mob_fel_crystalAI(Creature* c) : ScriptedAI(c) {} + mob_fel_crystalAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index 5f3716d9dea..327c611b2d6 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -71,9 +71,9 @@ public: struct boss_vexallusAI : public ScriptedAI { - boss_vexallusAI(Creature* c) : ScriptedAI(c) + boss_vexallusAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -101,7 +101,7 @@ public: DoScriptText(SAY_KILL, me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_VEXALLUS_EVENT, DONE); @@ -206,7 +206,7 @@ public: struct mob_pure_energyAI : public ScriptedAI { - mob_pure_energyAI(Creature* c) : ScriptedAI(c) {} + mob_pure_energyAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index 642f7955b2e..aa43cb3702f 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -35,6 +35,25 @@ EndScriptData */ 3 - Kael'thas Sunstrider */ +enum Creatures +{ + NPC_SELIN = 24723, + NPC_DELRISSA = 24560, + NPC_FELCRYSTALS = 24722 +}; + +enum GameObjects +{ + GO_VEXALLUS_DOOR = 187896, + GO_SELIN_DOOR = 187979, + GO_SELIN_ENCOUNTER_DOOR = 188065, + GO_DELRISSA_DOOR = 187770, + GO_KAEL_DOOR = 188064, + GO_KAEL_STATUE_1 = 188165, + GO_KAEL_STATUE_2 = 188166, + GO_ESCAPE_ORB = 188173 +}; + class instance_magisters_terrace : public InstanceMapScript { public: @@ -49,7 +68,7 @@ public: { instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map) {} - uint32 m_auiEncounter[MAX_ENCOUNTER]; + uint32 Encounter[MAX_ENCOUNTER]; uint32 DelrissaDeathCount; std::list FelCrystals; @@ -63,12 +82,13 @@ public: uint64 DelrissaDoorGUID; uint64 KaelDoorGUID; uint64 KaelStatue[2]; + uint64 EscapeOrbGUID; bool InitializedItr; void Initialize() { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + memset(&Encounter, 0, sizeof(Encounter)); FelCrystals.clear(); @@ -83,6 +103,7 @@ public: KaelDoorGUID = 0; KaelStatue[0] = 0; KaelStatue[1] = 0; + EscapeOrbGUID = 0; InitializedItr = false; } @@ -90,7 +111,7 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) + if (Encounter[i] == IN_PROGRESS) return true; return false; } @@ -99,12 +120,18 @@ public: { switch (identifier) { - case DATA_SELIN_EVENT: return m_auiEncounter[0]; - case DATA_VEXALLUS_EVENT: return m_auiEncounter[1]; - case DATA_DELRISSA_EVENT: return m_auiEncounter[2]; - case DATA_KAELTHAS_EVENT: return m_auiEncounter[3]; - case DATA_DELRISSA_DEATH_COUNT: return DelrissaDeathCount; - case DATA_FEL_CRYSTAL_SIZE: return FelCrystals.size(); + case DATA_SELIN_EVENT: + return Encounter[0]; + case DATA_VEXALLUS_EVENT: + return Encounter[1]; + case DATA_DELRISSA_EVENT: + return Encounter[2]; + case DATA_KAELTHAS_EVENT: + return Encounter[3]; + case DATA_DELRISSA_DEATH_COUNT: + return DelrissaDeathCount; + case DATA_FEL_CRYSTAL_SIZE: + return FelCrystals.size(); } return 0; } @@ -113,21 +140,24 @@ public: { switch (identifier) { - case DATA_SELIN_EVENT: m_auiEncounter[0] = data; break; + case DATA_SELIN_EVENT: + Encounter[0] = data; + break; case DATA_VEXALLUS_EVENT: if (data == DONE) DoUseDoorOrButton(VexallusDoorGUID); - m_auiEncounter[1] = data; + Encounter[1] = data; break; case DATA_DELRISSA_EVENT: if (data == DONE) DoUseDoorOrButton(DelrissaDoorGUID); if (data == IN_PROGRESS) DelrissaDeathCount = 0; - m_auiEncounter[2] = data; + Encounter[2] = data; + break; + case DATA_KAELTHAS_EVENT: + Encounter[3] = data; break; - case DATA_KAELTHAS_EVENT: m_auiEncounter[3] = data; break; - case DATA_DELRISSA_DEATH_COUNT: if (data == SPECIAL) ++DelrissaDeathCount; @@ -141,9 +171,15 @@ public: { switch (creature->GetEntry()) { - case 24723: SelinGUID = creature->GetGUID(); break; - case 24560: DelrissaGUID = creature->GetGUID(); break; - case 24722: FelCrystals.push_back(creature->GetGUID()); break; + case NPC_SELIN: + SelinGUID = creature->GetGUID(); + break; + case NPC_DELRISSA: + DelrissaGUID = creature->GetGUID(); + break; + case NPC_FELCRYSTALS: + FelCrystals.push_back(creature->GetGUID()); + break; } } @@ -151,15 +187,30 @@ public: { switch (go->GetEntry()) { - case 187896: VexallusDoorGUID = go->GetGUID(); break; - //SunwellRaid Gate 02 - case 187979: SelinDoorGUID = go->GetGUID(); break; - //Assembly Chamber Door - case 188065: SelinEncounterDoorGUID = go->GetGUID(); break; - case 187770: DelrissaDoorGUID = go->GetGUID(); break; - case 188064: KaelDoorGUID = go->GetGUID(); break; - case 188165: KaelStatue[0] = go->GetGUID(); break; - case 188166: KaelStatue[1] = go->GetGUID(); break; + case GO_VEXALLUS_DOOR: + VexallusDoorGUID = go->GetGUID(); + break; + case GO_SELIN_DOOR: + SelinDoorGUID = go->GetGUID(); + break; + case GO_SELIN_ENCOUNTER_DOOR: + SelinEncounterDoorGUID = go->GetGUID(); + break; + case GO_DELRISSA_DOOR: + DelrissaDoorGUID = go->GetGUID(); + break; + case GO_KAEL_DOOR: + KaelDoorGUID = go->GetGUID(); + break; + case GO_KAEL_STATUE_1: + KaelStatue[0] = go->GetGUID(); + break; + case GO_KAEL_STATUE_2: + KaelStatue[1] = go->GetGUID(); + break; + case GO_ESCAPE_ORB: + EscapeOrbGUID = go->GetGUID(); + break; } } @@ -167,15 +218,26 @@ public: { switch (identifier) { - case DATA_SELIN: return SelinGUID; - case DATA_DELRISSA: return DelrissaGUID; - case DATA_VEXALLUS_DOOR: return VexallusDoorGUID; - case DATA_SELIN_DOOR: return SelinDoorGUID; - case DATA_SELIN_ENCOUNTER_DOOR: return SelinEncounterDoorGUID; - case DATA_DELRISSA_DOOR: return DelrissaDoorGUID; - case DATA_KAEL_DOOR: return KaelDoorGUID; - case DATA_KAEL_STATUE_LEFT: return KaelStatue[0]; - case DATA_KAEL_STATUE_RIGHT: return KaelStatue[1]; + case DATA_SELIN: + return SelinGUID; + case DATA_DELRISSA: + return DelrissaGUID; + case DATA_VEXALLUS_DOOR: + return VexallusDoorGUID; + case DATA_SELIN_DOOR: + return SelinDoorGUID; + case DATA_SELIN_ENCOUNTER_DOOR: + return SelinEncounterDoorGUID; + case DATA_DELRISSA_DOOR: + return DelrissaDoorGUID; + case DATA_KAEL_DOOR: + return KaelDoorGUID; + case DATA_KAEL_STATUE_LEFT: + return KaelStatue[0]; + case DATA_KAEL_STATUE_RIGHT: + return KaelStatue[1]; + case DATA_ESCAPE_ORB: + return EscapeOrbGUID; case DATA_FEL_CRYSTAL: { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index 679db023b63..ccaaa0ec68d 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -56,10 +56,10 @@ class npc_kalecgos : public CreatureScript public: npc_kalecgos() : CreatureScript("npc_kalecgos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h index dcea4424bf5..78aa14b9102 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h @@ -19,27 +19,31 @@ #ifndef DEF_MAGISTERS_TERRACE_H #define DEF_MAGISTERS_TERRACE_H -#define DATA_SELIN_EVENT 1 -#define DATA_VEXALLUS_EVENT 2 -#define DATA_DELRISSA_EVENT 3 -#define DATA_KAELTHAS_EVENT 4 +#define ERROR_INST_DATA "TSCR Error: Instance Data not set properly for Magister's Terrace instance (map 585). Encounters will be buggy." +#endif -#define DATA_SELIN 5 -#define DATA_FEL_CRYSTAL 6 -#define DATA_FEL_CRYSTAL_SIZE 7 +enum Data +{ + DATA_SELIN_EVENT = 0, + DATA_VEXALLUS_EVENT = 1, + DATA_DELRISSA_EVENT = 2, + DATA_KAELTHAS_EVENT = 3, -#define DATA_VEXALLUS_DOOR 8 -#define DATA_SELIN_DOOR 9 -#define DATA_DELRISSA 10 -#define DATA_DELRISSA_DOOR 11 -#define DATA_SELIN_ENCOUNTER_DOOR 12 + DATA_SELIN = 4, + DATA_FEL_CRYSTAL = 5, + DATA_FEL_CRYSTAL_SIZE = 6, -#define DATA_KAEL_DOOR 13 -#define DATA_KAEL_STATUE_LEFT 14 -#define DATA_KAEL_STATUE_RIGHT 15 + DATA_VEXALLUS_DOOR = 7, + DATA_SELIN_DOOR = 8, + DATA_DELRISSA = 9, + DATA_DELRISSA_DOOR = 10, + DATA_SELIN_ENCOUNTER_DOOR = 11, -#define DATA_DELRISSA_DEATH_COUNT 16 + DATA_KAEL_DOOR = 12, + DATA_KAEL_STATUE_LEFT = 13, + DATA_KAEL_STATUE_RIGHT = 14, -#define ERROR_INST_DATA "TSCR Error: Instance Data not set properly for Magister's Terrace instance (map 585). Encounters will be buggy." -#endif + DATA_DELRISSA_DEATH_COUNT = 15, + DATA_ESCAPE_ORB = 16 +}; diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp index 862a980394a..f085e15fcb7 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp @@ -200,7 +200,7 @@ class boss_majordomo : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 /*uiAction*/) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) { player->CLOSE_GOSSIP_MENU(); creature->AI()->DoAction(ACTION_START_RAGNAROS); diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp index 47d50925d56..0160f35f143 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp @@ -316,12 +316,12 @@ class mob_son_of_flame : public CreatureScript struct mob_son_of_flameAI : public ScriptedAI //didnt work correctly in EAI for me... { - mob_son_of_flameAI(Creature* c) : ScriptedAI(c) + mob_son_of_flameAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_RAGNAROS_ADDS, 1); diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp index 9f511c1394a..343298d29fe 100644 --- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp +++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp @@ -103,7 +103,7 @@ class boss_sulfuron : public CreatureScript { std::list healers = DoFindFriendlyMissingBuff(45.0f, SPELL_INSPIRE); if (!healers.empty()) - DoCast(SelectRandomContainerElement(healers), SPELL_INSPIRE); + DoCast(Trinity::Containers::SelectRandomContainerElement(healers), SPELL_INSPIRE); DoCast(me, SPELL_INSPIRE); events.ScheduleEvent(EVENT_INSPIRE, urand(20000, 26000)); diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/molten_core.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/molten_core.cpp deleted file mode 100644 index 801a11fbfc8..00000000000 --- a/src/server/scripts/EasternKingdoms/MoltenCore/molten_core.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Molten_Core -SD%Complete: 100 -SDComment: -SDCategory: Molten Core -EndScriptData */ - -/* ContentData -mob_ancient_core_hound -EndContentData */ - -#include "ScriptPCH.h" -#include "ScriptedSimpleAI.h" - -enum Spells -{ - SPELL_CONE_OF_FIRE = 19630, - SPELL_BITE = 19771, - - //Random Debuff (each hound has only one of these) - SPELL_GROUND_STOMP = 19364, - SPELL_ANCIENT_DREAD = 19365, - SPELL_CAUTERIZING_FLAMES = 19366, - SPELL_WITHERING_HEAT = 19367, - SPELL_ANCIENT_DESPAIR = 19369, - SPELL_ANCIENT_HYSTERIA = 19372 -}; - -class mob_ancient_core_hound : public CreatureScript -{ -public: - mob_ancient_core_hound() : CreatureScript("mob_ancient_core_hound") { } - - CreatureAI* GetAI(Creature* creature) const - { - SimpleAI* ai = new SimpleAI(creature); - - ai->Spell[0].Enabled = true; - ai->Spell[0].Spell_Id = SPELL_CONE_OF_FIRE; - ai->Spell[0].Cooldown = 7000; - ai->Spell[0].First_Cast = 10000; - ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_TARGET; - - uint32 RandDebuff = RAND(SPELL_GROUND_STOMP, SPELL_ANCIENT_DREAD, SPELL_CAUTERIZING_FLAMES, - SPELL_WITHERING_HEAT, SPELL_ANCIENT_DESPAIR, SPELL_ANCIENT_HYSTERIA); - - ai->Spell[1].Enabled = true; - ai->Spell[1].Spell_Id = RandDebuff; - ai->Spell[1].Cooldown = 24000; - ai->Spell[1].First_Cast = 15000; - ai->Spell[1].Cast_Target_Type = CAST_HOSTILE_TARGET; - - ai->Spell[2].Enabled = true; - ai->Spell[2].Spell_Id = SPELL_BITE; - ai->Spell[2].Cooldown = 6000; - ai->Spell[2].First_Cast = 4000; - ai->Spell[2].Cast_Target_Type = CAST_HOSTILE_TARGET; - - ai->EnterEvadeMode(); - - return ai; - } -}; - -void AddSC_molten_core() -{ - new mob_ancient_core_hound(); -} diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index a2c8a890feb..bf887bec164 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -102,13 +102,13 @@ public: struct npc_unworthy_initiateAI : public ScriptedAI { - npc_unworthy_initiateAI(Creature* c) : ScriptedAI(c) + npc_unworthy_initiateAI(Creature* creature) : ScriptedAI(creature) { me->SetReactState(REACT_PASSIVE); if (!me->GetEquipmentId()) if (const CreatureTemplate* info = sObjectMgr->GetCreatureTemplate(28406)) if (info->equipmentId) - const_cast(me->GetCreatureInfo())->equipmentId = info->equipmentId; + const_cast(me->GetCreatureTemplate())->equipmentId = info->equipmentId; } uint64 playerGUID; @@ -293,7 +293,7 @@ public: struct npc_unworthy_initiate_anchorAI : public PassiveAI { - npc_unworthy_initiate_anchorAI(Creature* c) : PassiveAI(c), prisonerGUID(0) {} + npc_unworthy_initiate_anchorAI(Creature* creature) : PassiveAI(creature), prisonerGUID(0) {} uint64 prisonerGUID; @@ -303,9 +303,11 @@ public: prisonerGUID = guid; } - uint64 GetGUID(int32 /*id*/) { return prisonerGUID; } + uint64 GetGUID(int32 /*id*/) + { + return prisonerGUID; + } }; - }; class go_acherus_soul_prison : public GameObjectScript @@ -362,10 +364,10 @@ class npc_death_knight_initiate : public CreatureScript public: npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->CLOSE_GOSSIP_MENU(); @@ -531,7 +533,7 @@ public: struct npc_dark_rider_of_acherusAI : public ScriptedAI { - npc_dark_rider_of_acherusAI(Creature* c) : ScriptedAI(c) {} + npc_dark_rider_of_acherusAI(Creature* creature) : ScriptedAI(creature) {} uint32 PhaseTimer; uint32 Phase; @@ -587,7 +589,7 @@ public: return; TargetGUID = who->GetGUID(); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->SetSpeed(MOVE_RUN, 0.4f); me->GetMotionMaster()->MoveChase(who); me->SetTarget(TargetGUID); @@ -623,7 +625,7 @@ public: struct npc_salanar_the_horsemanAI : public ScriptedAI { - npc_salanar_the_horsemanAI(Creature* c) : ScriptedAI(c) {} + npc_salanar_the_horsemanAI(Creature* creature) : ScriptedAI(creature) {} void SpellHit(Unit* caster, const SpellInfo* spell) { @@ -662,7 +664,7 @@ public: { CAST_PLR(charmer)->GroupEventHappens(12687, me); charmer->RemoveAurasDueToSpell(SPELL_EFFECT_OVERTAKE); - CAST_CRE(who)->ForcedDespawn(); + CAST_CRE(who)->DespawnOrUnsummon(); //CAST_CRE(who)->Respawn(true); } @@ -692,7 +694,7 @@ public: struct npc_ros_dark_riderAI : public ScriptedAI { - npc_ros_dark_riderAI(Creature* c) : ScriptedAI(c) {} + npc_ros_dark_riderAI(Creature* creature) : ScriptedAI(creature) {} void EnterCombat(Unit* /*who*/) { @@ -702,7 +704,9 @@ public: void Reset() { Creature* deathcharger = me->FindNearestCreature(28782, 30); - if (!deathcharger) return; + if (!deathcharger) + return; + deathcharger->RestoreFaction(); deathcharger->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); deathcharger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -713,7 +717,9 @@ public: void JustDied(Unit* killer) { Creature* deathcharger = me->FindNearestCreature(28782, 30); - if (!deathcharger) return; + if (!deathcharger) + return; + if (killer->GetTypeId() == TYPEID_PLAYER && deathcharger->GetTypeId() == TYPEID_UNIT && deathcharger->IsVehicle()) { deathcharger->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); @@ -743,7 +749,7 @@ public: struct npc_dkc1_gothikAI : public ScriptedAI { - npc_dkc1_gothikAI(Creature* c) : ScriptedAI(c) {} + npc_dkc1_gothikAI(Creature* creature) : ScriptedAI(creature) {} void MoveInLineOfSight(Unit* who) { @@ -761,7 +767,7 @@ public: //Todo: Creatures must not be removed, but, must instead // stand next to Gothik and be commanded into the pit // and dig into the ground. - CAST_CRE(who)->ForcedDespawn(); + CAST_CRE(who)->DespawnOrUnsummon(); if (CAST_PLR(owner)->GetQuestStatus(12698) == QUEST_STATUS_COMPLETE) owner->RemoveAllMinionsByEntry(GHOULS); @@ -785,7 +791,7 @@ public: struct npc_scarlet_ghoulAI : public ScriptedAI { - npc_scarlet_ghoulAI(Creature* c) : ScriptedAI(c) + npc_scarlet_ghoulAI(Creature* creature) : ScriptedAI(creature) { // Ghouls should display their Birth Animation // Crawling out of the ground @@ -803,11 +809,11 @@ public: { for (std::list::const_iterator itr = MinionList.begin(); itr != MinionList.end(); ++itr) { - if (CAST_CRE(*itr)->GetOwner()->GetGUID() == me->GetOwner()->GetGUID()) + if ((*itr)->GetOwner()->GetGUID() == me->GetOwner()->GetGUID()) { - if (CAST_CRE(*itr)->isInCombat() && CAST_CRE(*itr)->getAttackerForHelper()) + if ((*itr)->isInCombat() && (*itr)->getAttackerForHelper()) { - AttackStart(CAST_CRE(*itr)->getAttackerForHelper()); + AttackStart((*itr)->getAttackerForHelper()); } } } @@ -820,16 +826,13 @@ public: { if (Unit* owner = me->GetOwner()) { - if (owner->GetTypeId() == TYPEID_PLAYER && CAST_PLR(owner)->isInCombat()) + Player* plrOwner = owner->ToPlayer(); + if (plrOwner && plrOwner->isInCombat()) { - if (CAST_PLR(owner)->getAttackerForHelper() && CAST_PLR(owner)->getAttackerForHelper()->GetEntry() == GHOSTS) - { - AttackStart(CAST_PLR(owner)->getAttackerForHelper()); - } + if (plrOwner->getAttackerForHelper() && plrOwner->getAttackerForHelper()->GetEntry() == GHOSTS) + AttackStart(plrOwner->getAttackerForHelper()); else - { FindMinions(owner); - } } } } @@ -868,17 +871,17 @@ class npc_scarlet_miner_cart : public CreatureScript public: npc_scarlet_miner_cart() : CreatureScript("npc_scarlet_miner_cart") { } - CreatureAI* GetAI(Creature* _Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new npc_scarlet_miner_cartAI(_Creature); + return new npc_scarlet_miner_cartAI(creature); } struct npc_scarlet_miner_cartAI : public PassiveAI { - npc_scarlet_miner_cartAI(Creature* c) : PassiveAI(c), minerGUID(0) + npc_scarlet_miner_cartAI(Creature* creature) : PassiveAI(creature), minerGUID(0) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->SetDisplayId(me->GetCreatureInfo()->Modelid1); // Modelid2 is a horse. + me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); // Modelid2 is a horse. } uint64 minerGUID; @@ -892,7 +895,7 @@ public: { if (Creature* miner = Unit::GetCreature(*me, minerGUID)) { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); //Not 100% correct, but movement is smooth. Sometimes miner walks faster //than normal, this speed is fast enough to keep up at those times. @@ -924,14 +927,14 @@ class npc_scarlet_miner : public CreatureScript public: npc_scarlet_miner() : CreatureScript("npc_scarlet_miner") { } - CreatureAI* GetAI(Creature* _Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new npc_scarlet_minerAI(_Creature); + return new npc_scarlet_minerAI(creature); } struct npc_scarlet_minerAI : public npc_escortAI { - npc_scarlet_minerAI(Creature* c) : npc_escortAI(c) + npc_scarlet_minerAI(Creature* creature) : npc_escortAI(creature) { me->SetReactState(REACT_PASSIVE); } @@ -988,9 +991,9 @@ public: SetDespawnAtFar(false); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { case 1: if (Unit* car = Unit::GetCreature(*me, carGUID)) @@ -1057,7 +1060,7 @@ class go_inconspicuous_mine_car : public GameObjectScript public: go_inconspicuous_mine_car() : GameObjectScript("go_inconspicuous_mine_car") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->GetQuestStatus(12701) == QUEST_STATUS_INCOMPLETE) { diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 4583a33a196..1c17e6afa9b 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -111,12 +111,33 @@ public: switch (uiSpeech_counter) { - case 1: DoScriptText(SAY_PERSUADED1, me); uiSpeech_timer = 8000; break; - case 2: DoScriptText(SAY_PERSUADED2, me); uiSpeech_timer = 8000; break; - case 3: DoScriptText(SAY_PERSUADED3, me); uiSpeech_timer = 8000; break; - case 4: DoScriptText(SAY_PERSUADED4, me); uiSpeech_timer = 8000; break; - case 5: DoScriptText(SAY_PERSUADED5, player); uiSpeech_timer = 8000; break; - case 6: DoScriptText(SAY_PERSUADED6, me); + case 1: + DoScriptText(SAY_PERSUADED1, me); + uiSpeech_timer = 8000; + break; + + case 2: + DoScriptText(SAY_PERSUADED2, me); + uiSpeech_timer = 8000; + break; + + case 3: + DoScriptText(SAY_PERSUADED3, me); + uiSpeech_timer = 8000; + break; + + case 4: + DoScriptText(SAY_PERSUADED4, me); + uiSpeech_timer = 8000; + break; + + case 5: + DoScriptText(SAY_PERSUADED5, player); + uiSpeech_timer = 8000; + break; + + case 6: + DoScriptText(SAY_PERSUADED6, me); player->Kill(me); //me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -218,9 +239,9 @@ public: } } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 0: DoScriptText(SAY_BREAKOUT1, me); @@ -256,9 +277,7 @@ public: void JustSummoned(Creature* summoned) { if (Player* player = GetPlayerForEscort()) - { summoned->AI()->AttackStart(player); - } if (summoned->GetEntry() == NPC_HIGH_INQUISITOR_VALROTH) m_uiValrothGUID = summoned->GetGUID(); @@ -400,7 +419,7 @@ public: switch (uiStage) { case 1: - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); if (GameObject* tree = me->FindNearestGameObject(GO_INCONSPICUOUS_TREE, 40.0f)) { DoScriptText(SAY_TREE1, me); @@ -608,48 +627,48 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } - bool MeetQuestCondition(Unit* player) + bool MeetQuestCondition(Player* player) { switch (me->GetEntry()) { case 29061: // Ellen Stanbridge - if (CAST_PLR(player)->GetQuestStatus(12742) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12742) == QUEST_STATUS_INCOMPLETE) return true; break; case 29072: // Kug Ironjaw - if (CAST_PLR(player)->GetQuestStatus(12748) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12748) == QUEST_STATUS_INCOMPLETE) return true; break; case 29067: // Donovan Pulfrost - if (CAST_PLR(player)->GetQuestStatus(12744) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12744) == QUEST_STATUS_INCOMPLETE) return true; break; case 29065: // Yazmina Oakenthorn - if (CAST_PLR(player)->GetQuestStatus(12743) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12743) == QUEST_STATUS_INCOMPLETE) return true; break; case 29071: // Antoine Brack - if (CAST_PLR(player)->GetQuestStatus(12750) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12750) == QUEST_STATUS_INCOMPLETE) return true; break; case 29032: // Malar Bravehorn - if (CAST_PLR(player)->GetQuestStatus(12739) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12739) == QUEST_STATUS_INCOMPLETE) return true; break; case 29068: // Goby Blastenheimer - if (CAST_PLR(player)->GetQuestStatus(12745) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12745) == QUEST_STATUS_INCOMPLETE) return true; break; case 29073: // Iggy Darktusk - if (CAST_PLR(player)->GetQuestStatus(12749) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12749) == QUEST_STATUS_INCOMPLETE) return true; break; case 29074: // Lady Eonys - if (CAST_PLR(player)->GetQuestStatus(12747) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12747) == QUEST_STATUS_INCOMPLETE) return true; break; case 29070: // Valok the Righteous - if (CAST_PLR(player)->GetQuestStatus(12746) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(12746) == QUEST_STATUS_INCOMPLETE) return true; break; } @@ -662,7 +681,7 @@ public: if (PlayerGUID || who->GetTypeId() != TYPEID_PLAYER || !who->IsWithinDist(me, INTERACTION_DISTANCE)) return; - if (MeetQuestCondition(who)) + if (MeetQuestCondition(who->ToPlayer())) PlayerGUID = who->GetGUID(); } @@ -704,7 +723,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -732,7 +753,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -760,7 +783,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -788,7 +813,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -816,7 +843,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -844,7 +873,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -872,7 +903,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -900,7 +933,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -928,7 +963,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -956,7 +993,9 @@ public: me->SetStandState(UNIT_STAND_STATE_KNEEL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); break; - case 10: DoScriptText(SAY_EXEC_WAITING, me, player); break; + case 10: + DoScriptText(SAY_EXEC_WAITING, me, player); + break; case 11: DoScriptText(EMOTE_DIES, me); me->setDeathState(JUST_DIED); @@ -978,7 +1017,6 @@ public: } } }; - }; void AddSC_the_scarlet_enclave_c2() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 81c4b1261ef..8cee23fab1c 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -287,10 +287,10 @@ class npc_highlord_darion_mograine : public CreatureScript public: npc_highlord_darion_mograine() : CreatureScript("npc_highlord_darion_mograine") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -497,17 +497,16 @@ public: SetEscortPaused(bOnHold); } - void WaypointReached(uint32 wpId) + void WaypointReached(uint32 waypointId) { - switch (wpId) + switch (waypointId) { case 0: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); SetHoldState(true); break; case 1: SetHoldState(true); - SpawnNPC(); if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) DoScriptText(SAY_LIGHT_OF_DAWN07, temp); @@ -537,7 +536,7 @@ public: bIsBattle = true; break; case 2: - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); DoCast(me, SPELL_THE_LIGHT_OF_DAWN); break; case 3: @@ -551,34 +550,35 @@ public: { if (temp->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0)) temp->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN); - temp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[19].x, LightofDawnLoc[19].y, LightofDawnLoc[19].z); } if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) { if (temp->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0)) temp->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN); - temp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[21].x, LightofDawnLoc[21].y, LightofDawnLoc[21].z); } if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) { - temp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(true); temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[10].x, LightofDawnLoc[10].y, LightofDawnLoc[10].z); } if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) { - temp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[13].x, LightofDawnLoc[13].y, LightofDawnLoc[13].z); } if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) { - temp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[16].x, LightofDawnLoc[16].y, LightofDawnLoc[16].z); } JumpToNextStep(10000); - } break; + } + break; case 4: DoScriptText(SAY_LIGHT_OF_DAWN27, me); me->SetStandState(UNIT_STAND_STATE_KNEEL); @@ -664,7 +664,7 @@ public: if (uiSummon_counter < ENCOUNTER_GHOUL_NUMBER) { Unit* temp = me->SummonCreature(NPC_ACHERUS_GHOUL, (me->GetPositionX()-20)+rand()%40, (me->GetPositionY()-20)+rand()%40, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->setFaction(2084); uiGhoulGUID[uiSummon_counter] = temp->GetGUID(); ++uiSummon_counter; @@ -682,7 +682,7 @@ public: if (uiSummon_counter < ENCOUNTER_ABOMINATION_NUMBER) { Unit* temp = me->SummonCreature(NPC_RAMPAGING_ABOMINATION, (me->GetPositionX()-20)+rand()%40, (me->GetPositionY()-20)+rand()%40, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->setFaction(2084); uiAbominationGUID[uiSummon_counter] = temp->GetGUID(); ++uiSummon_counter; @@ -700,7 +700,7 @@ public: if (uiSummon_counter < ENCOUNTER_WARRIOR_NUMBER) { Unit* temp = me->SummonCreature(NPC_WARRIOR_OF_THE_FROZEN_WASTES, (me->GetPositionX()-20)+rand()%40, (me->GetPositionY()-20)+rand()%40, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->setFaction(2084); uiWarriorGUID[uiSummon_counter] = temp->GetGUID(); ++uiSummon_counter; @@ -718,7 +718,7 @@ public: if (uiSummon_counter < ENCOUNTER_BEHEMOTH_NUMBER) { Unit* temp = me->SummonCreature(NPC_FLESH_BEHEMOTH, (me->GetPositionX()-20)+rand()%40, (me->GetPositionY()-20)+rand()%40, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->setFaction(2084); uiBehemothGUID[uiSummon_counter] = temp->GetGUID(); ++uiSummon_counter; @@ -739,17 +739,17 @@ public: SetHoldState(false); if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) { - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); } if (Creature* temp = Unit::GetCreature(*me, uiOrbazGUID)) { - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); } if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) { - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); } for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) @@ -824,7 +824,7 @@ public: if (Unit* temp = me->SummonCreature(NPC_DARION_MOGRAINE, LightofDawnLoc[24].x, LightofDawnLoc[24].y, LightofDawnLoc[24].z, LightofDawnLoc[24].o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) { DoScriptText(SAY_LIGHT_OF_DAWN35, temp); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); uiDarionGUID = temp->GetGUID(); } JumpToNextStep(4000); @@ -938,9 +938,9 @@ public: case 33: // Darion supports to jump to lich king here if (Unit::GetCreature(*me, uiLichKingGUID)) DoCast(me, SPELL_MOGRAINE_CHARGE); // jumping charge - // doesn't make it looks well, so workarounds, Darion charges, looks better + // doesn't make it looks well, so workarounds, Darion charges, looks better me->SetSpeed(MOVE_RUN, 3.0f); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); SetHoldState(false); JumpToNextStep(0); break; @@ -1010,10 +1010,9 @@ public: if (fLichPositionX && fLichPositionY) { - Unit* temp; - temp = me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, LightofDawnLoc[0].x+rand()%10, LightofDawnLoc[0].y+rand()%10, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + Unit* temp = me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, LightofDawnLoc[0].x+rand()%10, LightofDawnLoc[0].y+rand()%10, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->SetSpeed(MOVE_RUN, 2.0f); temp->setFaction(me->getFaction()); temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); @@ -1021,7 +1020,7 @@ public: temp = me->SummonCreature(NPC_RIMBLAT_EARTHSHATTER, LightofDawnLoc[0].x+rand()%10, LightofDawnLoc[0].y+rand()%10, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->SetSpeed(MOVE_RUN, 2.0f); temp->setFaction(me->getFaction()); temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); @@ -1030,7 +1029,7 @@ public: if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->SetSpeed(MOVE_RUN, 2.0f); temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); DoScriptText(SAY_LIGHT_OF_DAWN50, temp); @@ -1038,7 +1037,7 @@ public: if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->SetSpeed(MOVE_RUN, 2.0f); temp->HandleEmoteCommand(EMOTE_STATE_ATTACK_UNARMED); temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); @@ -1046,7 +1045,7 @@ public: if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->SetSpeed(MOVE_RUN, 2.0f); temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); } @@ -1111,7 +1110,7 @@ public: case 46: // Darion stand up, "not today" me->SetSpeed(MOVE_RUN, 1.0f); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->SetStandState(UNIT_STAND_STATE_STAND); DoScriptText(SAY_LIGHT_OF_DAWN53, me); SetHoldState(false); // Darion throws sword @@ -1171,7 +1170,7 @@ public: temp->CastSpell(temp, SPELL_TIRION_CHARGE, false); // jumping charge temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); temp->SetSpeed(MOVE_RUN, 3.0f); // workarounds, make Tirion still running - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[2].x, LightofDawnLoc[2].y, LightofDawnLoc[2].z); if (Creature* lktemp = Unit::GetCreature(*me, uiLichKingGUID)) lktemp->Relocate(LightofDawnLoc[28].x, LightofDawnLoc[28].y, LightofDawnLoc[28].z); // workarounds, he should kick back by Tirion, but here we relocate him @@ -1189,7 +1188,7 @@ public: if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) { temp->SetSpeed(MOVE_RUN, 1.0f); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[29].x, LightofDawnLoc[29].y, LightofDawnLoc[29].z); // 26 } JumpToNextStep(4000); @@ -1249,7 +1248,7 @@ public: case 62: if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) { - temp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[7].x, LightofDawnLoc[7].y, LightofDawnLoc[7].z); } JumpToNextStep(5500); @@ -1309,7 +1308,6 @@ public: case 71: //if (GameObject* go = me->GetMap()->GetGameObject(uiDawnofLightGUID)) // Turn off dawn of light // go->SetPhaseMask(0, true); - { Map* map = me->GetMap(); // search players with in 50 yards for quest credit Map::PlayerList const &PlayerList = map->GetPlayers(); @@ -1438,7 +1436,7 @@ public: me->DeleteThreatList(); me->CombatStop(true); me->InterruptNonMeleeSpells(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i) DespawnNPC(uiDefenderGUID[i]); @@ -1460,7 +1458,7 @@ public: temp->CombatStop(true); temp->AttackStop(); temp->setFaction(me->getFaction()); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[9].x, LightofDawnLoc[9].y, LightofDawnLoc[9].z); } @@ -1471,7 +1469,7 @@ public: temp->CombatStop(true); temp->AttackStop(); temp->setFaction(me->getFaction()); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[12].x, LightofDawnLoc[12].y, LightofDawnLoc[12].z); } @@ -1482,7 +1480,7 @@ public: temp->CombatStop(true); temp->AttackStop(); temp->setFaction(me->getFaction()); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[15].x, LightofDawnLoc[15].y, LightofDawnLoc[15].z); } DespawnNPC(uiRayneGUID); @@ -1494,7 +1492,7 @@ public: temp->CombatStop(true); temp->AttackStop(); temp->setFaction(me->getFaction()); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[18].x, LightofDawnLoc[18].y, LightofDawnLoc[18].z); temp->CastSpell(temp, SPELL_THE_LIGHT_OF_DAWN, false); } @@ -1509,7 +1507,7 @@ public: temp->CombatStop(true); temp->AttackStop(); temp->setFaction(me->getFaction()); - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[20].x, LightofDawnLoc[20].y, LightofDawnLoc[20].z); temp->CastSpell(temp, SPELL_THE_LIGHT_OF_DAWN, false); } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp index 9512d66b6eb..0ef2dddda8d 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp @@ -35,7 +35,7 @@ public: struct npc_valkyr_battle_maidenAI : public PassiveAI { - npc_valkyr_battle_maidenAI(Creature* c) : PassiveAI(c) {} + npc_valkyr_battle_maidenAI(Creature* creature) : PassiveAI(creature) {} uint32 FlyBackTimer; float x, y, z; @@ -46,7 +46,7 @@ public: me->setActive(true); me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetFlying(true); + me->SetCanFly(true); FlyBackTimer = 500; phase = 0; @@ -74,7 +74,7 @@ public: switch (phase) { case 0: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->HandleEmoteCommand(EMOTE_STATE_FLYGRABCLOSED); FlyBackTimer = 500; break; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 77099f2e2d7..813c43288d0 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -296,8 +296,11 @@ public: if (spell->Id == SPELL_FLYING_HEAD) { - if (Phase < 3) ++Phase; - else Phase = 3; + if (Phase < 3) + ++Phase; + else + Phase = 3; + withbody = false; if (!bodyGUID) bodyGUID = caster->GetGUID(); @@ -319,7 +322,8 @@ public: if (wait <= diff) { wait = 1000; - if (!me->getVictim()) return; + if (!me->getVictim()) + return; me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MoveFleeing(me->getVictim()); } @@ -344,7 +348,7 @@ public: if (wait <= diff) { die = false; - if (Unit* body = Unit::GetUnit((*me), bodyGUID)) + if (Unit* body = Unit::GetUnit(*me, bodyGUID)) body->Kill(body); me->Kill(me); } @@ -429,7 +433,7 @@ public: { me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING); + me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); me->SetSpeed(MOVE_WALK, 5.0f, true); wp_reached = false; count = 0; @@ -462,7 +466,7 @@ public: instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject break; case 19: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); break; case 20: { @@ -471,7 +475,7 @@ public: wp_reached = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SaySound(SAY_ENTRANCE); - if (Unit* player = Unit::GetUnit((*me), PlayerGUID)) + if (Unit* player = Unit::GetUnit(*me, PlayerGUID)) DoStartMovement(player); break; } @@ -485,12 +489,18 @@ public: instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS); DoZoneInCombat(); } - void AttackStart(Unit* who) {ScriptedAI::AttackStart(who);} + + void AttackStart(Unit* who) + { + ScriptedAI::AttackStart(who); + } + void MoveInLineOfSight(Unit* who) { if (withhead && Phase != 0) ScriptedAI::MoveInLineOfSight(who); } + void KilledUnit(Unit* player) { if (player->GetTypeId() == TYPEID_PLAYER) @@ -576,7 +586,7 @@ public: std::list::const_iterator itr; for (itr = caster->getThreatManager().getThreatList().begin(); itr != caster->getThreatManager().getThreatList().end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->isAlive() && unit != caster) me->AddThreat(unit, caster->getThreatManager().getThreat(unit)); } @@ -595,7 +605,8 @@ public: if (!headGUID) headGUID = DoSpawnCreature(HEAD, float(rand()%6), float(rand()%6), 0, 0, TEMPSUMMON_DEAD_DESPAWN, 0)->GetGUID(); - Unit* Head = Unit::GetUnit((*me), headGUID); + + Unit* Head = Unit::GetUnit(*me, headGUID); if (Head && Head->isAlive()) { Head->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -803,14 +814,22 @@ public: void Despawn() { - if (!debuffGUID) return; - Unit* debuff = Unit::GetUnit((*me), debuffGUID); + if (!debuffGUID) + return; + + Unit* debuff = Unit::GetUnit(*me, debuffGUID); if (debuff) + { debuff->SetVisible(false); debuffGUID = 0; + } } - void JustDied(Unit* /*killer*/) { if (!sprouted) Despawn(); } + void JustDied(Unit* /*killer*/) + { + if (!sprouted) + Despawn(); + } void MoveInLineOfSight(Unit* who) { diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp index 16b90f89bb5..58c21d86a2f 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp @@ -152,7 +152,12 @@ public: uint32 Start_Timer; void Reset() {} - void WaypointReached(uint32 /*point*/) {} + + void WaypointReached(uint32 /*waypointId*/) + { + + } + void EnterCombat(Unit* /*who*/) {} void UpdateAI(const uint32 diff) diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp index a64636a4223..1989c318c84 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp @@ -66,9 +66,15 @@ public: Sleep_Timer = 30000; Dispel_Timer = 20000; PowerWordShield = false; + me->SetStandState(UNIT_STAND_STATE_DEAD); + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 7); } - void EnterCombat(Unit* /*who*/) {} + void EnterCombat(Unit* /*who*/) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + } void UpdateAI(const uint32 diff) { diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp index 058c688641f..fd978136339 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp @@ -78,12 +78,12 @@ public: DoScriptText(SAY_KILL, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (!instance) return; - //Any other actions to do with vorrel? setStandState? + //Any other Actions to do with vorrel? setStandState? if (Unit* vorrel = Unit::GetUnit(*me, instance->GetData64(DATA_VORREL))) DoScriptText(SAY_TRIGGER_VORREL, vorrel); } diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp index ec6ac34b0bb..8d813bfe502 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp @@ -132,7 +132,7 @@ public: return; //On first death, fake death and open door, as well as initiate whitemane if exist - if (Unit* Whitemane = Unit::GetUnit((*me), instance->GetData64(DATA_WHITEMANE))) + if (Unit* Whitemane = Unit::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS); @@ -181,7 +181,7 @@ public: if (_bHasDied && !_bHeal && instance && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL) { //On ressurection, stop fake death and heal whitemane and resume fight - if (Unit* Whitemane = Unit::GetUnit((*me), instance->GetData64(DATA_WHITEMANE))) + if (Unit* Whitemane = Unit::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_STAND); @@ -292,7 +292,7 @@ public: //When casting resuruction make sure to delay so on rez when reinstate battle deepsleep runs out if (instance && Wait_Timer <= diff) { - if (Unit* Mograine = Unit::GetUnit((*me), instance->GetData64(DATA_MOGRAINE))) + if (Unit* Mograine = Unit::GetUnit(*me, instance->GetData64(DATA_MOGRAINE))) { DoCast(Mograine, SPELL_SCARLETRESURRECTION); DoScriptText(SAY_WH_RESSURECT, me); diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 4ddc240a03c..2bc0320b81d 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -62,7 +62,7 @@ public: struct boss_darkmaster_gandlingAI : public ScriptedAI { - boss_darkmaster_gandlingAI(Creature* c) : ScriptedAI(c) + boss_darkmaster_gandlingAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp index 693cad06bd5..967f771fe7a 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp @@ -37,7 +37,7 @@ public: struct boss_death_knight_darkreaverAI : public ScriptedAI { - boss_death_knight_darkreaverAI(Creature* c) : ScriptedAI(c) {} + boss_death_knight_darkreaverAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp index 05d662c4fe3..82f4dc85060 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp @@ -45,7 +45,7 @@ public: struct boss_theolenkrastinovAI : public ScriptedAI { - boss_theolenkrastinovAI(Creature* c) : ScriptedAI(c) {} + boss_theolenkrastinovAI(Creature* creature) : ScriptedAI(creature) {} uint32 m_uiRend_Timer; uint32 m_uiBackhand_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp index 92f0fcd25c4..e438ae56a2b 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp @@ -43,7 +43,7 @@ public: struct boss_illuciabarovAI : public ScriptedAI { - boss_illuciabarovAI(Creature* c) : ScriptedAI(c) {} + boss_illuciabarovAI(Creature* creature) : ScriptedAI(creature) {} uint32 CurseOfAgony_Timer; uint32 ShadowShock_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp index 295d9440d2e..498e6596b06 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp @@ -44,7 +44,7 @@ public: struct boss_instructormaliciaAI : public ScriptedAI { - boss_instructormaliciaAI(Creature* c) : ScriptedAI(c) {} + boss_instructormaliciaAI(Creature* creature) : ScriptedAI(creature) {} uint32 CallOfGraves_Timer; uint32 Corruption_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 48bf000745c..064faa5643d 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -43,7 +43,7 @@ public: struct boss_jandicebarovAI : public ScriptedAI { - boss_jandicebarovAI(Creature* c) : ScriptedAI(c) {} + boss_jandicebarovAI(Creature* creature) : ScriptedAI(creature) {} uint32 CurseOfBlood_Timer; uint32 Illusion_Timer; @@ -165,7 +165,7 @@ public: struct mob_illusionofjandicebarovAI : public ScriptedAI { - mob_illusionofjandicebarovAI(Creature* c) : ScriptedAI(c) {} + mob_illusionofjandicebarovAI(Creature* creature) : ScriptedAI(creature) {} uint32 Cleave_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp index 7c279e726a6..5fd5a96d605 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp @@ -40,7 +40,7 @@ public: struct boss_kormokAI : public ScriptedAI { - boss_kormokAI(Creature* c) : ScriptedAI(c) {} + boss_kormokAI(Creature* creature) : ScriptedAI(creature) {} uint32 ShadowVolley_Timer; uint32 BoneShield_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp index 5109e6e1468..327c1df921d 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp @@ -41,7 +41,7 @@ public: struct boss_lordalexeibarovAI : public ScriptedAI { - boss_lordalexeibarovAI(Creature* c) : ScriptedAI(c) {} + boss_lordalexeibarovAI(Creature* creature) : ScriptedAI(creature) {} uint32 Immolate_Timer; uint32 VeilofShadow_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp index 754640bff9e..1919a1ba099 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp @@ -43,7 +43,7 @@ public: struct boss_lorekeeperpolkeltAI : public ScriptedAI { - boss_lorekeeperpolkeltAI(Creature* c) : ScriptedAI(c) {} + boss_lorekeeperpolkeltAI(Creature* creature) : ScriptedAI(creature) {} uint32 VolatileInfection_Timer; uint32 Darkplague_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp index 902838da152..fd10c6374a6 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp @@ -44,7 +44,7 @@ public: struct boss_rasfrostAI : public ScriptedAI { - boss_rasfrostAI(Creature* c) : ScriptedAI(c) {} + boss_rasfrostAI(Creature* creature) : ScriptedAI(creature) {} uint32 IceArmor_Timer; uint32 Frostbolt_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp index 13fa450f5ee..a28cecf3772 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp @@ -43,7 +43,7 @@ public: struct boss_theravenianAI : public ScriptedAI { - boss_theravenianAI(Creature* c) : ScriptedAI(c) {} + boss_theravenianAI(Creature* creature) : ScriptedAI(creature) {} uint32 Trample_Timer; uint32 Cleave_Timer; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index 657b458e148..f5f453c30bd 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp @@ -45,7 +45,7 @@ public: struct boss_vectusAI : public ScriptedAI { - boss_vectusAI(Creature* c) : ScriptedAI(c) {} + boss_vectusAI(Creature* creature) : ScriptedAI(creature) {} uint32 m_uiFireShield_Timer; uint32 m_uiBlastWave_Timer; diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index dded75e193c..63e753a18ba 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -63,10 +63,10 @@ public: return new npc_shadowfang_prisonerAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); @@ -90,18 +90,18 @@ public: struct npc_shadowfang_prisonerAI : public npc_escortAI { - npc_shadowfang_prisonerAI(Creature* c) : npc_escortAI(c) + npc_shadowfang_prisonerAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); - uiNpcEntry = c->GetEntry(); + instance = creature->GetInstanceScript(); + uiNpcEntry = creature->GetEntry(); } InstanceScript* instance; uint32 uiNpcEntry; - void WaypointReached(uint32 uiPoint) + void WaypointReached(uint32 waypointId) { - switch (uiPoint) + switch (waypointId) { case 0: if (uiNpcEntry == NPC_ASH) @@ -175,10 +175,7 @@ public: if (uiDarkOffering <= uiDiff) { if (Creature* pFriend = me->FindNearestCreature(me->GetEntry(), 25.0f, true)) - { - if (pFriend) - DoCast(pFriend, SPELL_DARK_OFFERING); - } + DoCast(pFriend, SPELL_DARK_OFFERING); else DoCast(me, SPELL_DARK_OFFERING); uiDarkOffering = urand(4400, 12500); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp index 0c659117f5d..85faa14900b 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp @@ -89,7 +89,7 @@ public: struct boss_baron_rivendareAI : public ScriptedAI { - boss_baron_rivendareAI(Creature* c) : ScriptedAI(c) + boss_baron_rivendareAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } @@ -126,7 +126,7 @@ public: summoned->AI()->AttackStart(target); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(TYPE_BARON, DONE); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp index a01846cb862..106719d654f 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp @@ -43,7 +43,7 @@ public: struct boss_baroness_anastariAI : public ScriptedAI { - boss_baroness_anastariAI(Creature* c) : ScriptedAI(c) + boss_baroness_anastariAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } @@ -67,7 +67,7 @@ public: { } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(TYPE_BARONESS, IN_PROGRESS); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp index d84bd489dab..01299ae06b6 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp @@ -88,7 +88,7 @@ public: struct boss_cannon_master_willeyAI : public ScriptedAI { - boss_cannon_master_willeyAI(Creature* c) : ScriptedAI(c) {} + boss_cannon_master_willeyAI(Creature* creature) : ScriptedAI(creature) {} uint32 KnockAway_Timer; uint32 Pummel_Timer; @@ -103,7 +103,7 @@ public: SummonRifleman_Timer = 15000; } - void JustDied(Unit* /*Victim*/) + void JustDied(Unit* /*killer*/) { me->SummonCreature(11054, ADD_1X, ADD_1Y, ADD_1Z, ADD_1O, TEMPSUMMON_TIMED_DESPAWN, 240000); me->SummonCreature(11054, ADD_2X, ADD_2Y, ADD_2Z, ADD_2O, TEMPSUMMON_TIMED_DESPAWN, 240000); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp index 8a14f1e2401..21e3e19d890 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp @@ -77,7 +77,7 @@ public: struct boss_dathrohan_balnazzarAI : public ScriptedAI { - boss_dathrohan_balnazzarAI(Creature* c) : ScriptedAI(c) {} + boss_dathrohan_balnazzarAI(Creature* creature) : ScriptedAI(creature) {} uint32 m_uiCrusadersHammer_Timer; uint32 m_uiCrusaderStrike_Timer; @@ -105,7 +105,7 @@ public: me->UpdateEntry(NPC_DATHROHAN); } - void JustDied(Unit* /*Victim*/) + void JustDied(Unit* /*killer*/) { static uint32 uiCount = sizeof(m_aSummonPoint)/sizeof(SummonDef); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp index 48b1fc2acc7..37e0bd5757f 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp @@ -46,7 +46,7 @@ public: struct boss_magistrate_barthilasAI : public ScriptedAI { - boss_magistrate_barthilasAI(Creature* c) : ScriptedAI(c) {} + boss_magistrate_barthilasAI(Creature* creature) : ScriptedAI(creature) {} uint32 DrainingBlow_Timer; uint32 CrowdPummel_Timer; @@ -75,7 +75,7 @@ public: ScriptedAI::MoveInLineOfSight(who); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { me->SetDisplayId(MODEL_HUMAN); } diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp index 1dc22a20d08..f8a10f06155 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp @@ -43,7 +43,7 @@ public: struct boss_maleki_the_pallidAI : public ScriptedAI { - boss_maleki_the_pallidAI(Creature* c) : ScriptedAI(c) + boss_maleki_the_pallidAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } @@ -65,7 +65,7 @@ public: { } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(TYPE_PALLID, IN_PROGRESS); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp index a7c91c3636d..c9a43edb66d 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp @@ -43,7 +43,7 @@ public: struct boss_nerubenkanAI : public ScriptedAI { - boss_nerubenkanAI(Creature* c) : ScriptedAI(c) + boss_nerubenkanAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } @@ -67,7 +67,7 @@ public: { } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(TYPE_NERUB, IN_PROGRESS); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp index 3393b9e5797..ebeda248331 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp @@ -54,9 +54,9 @@ public: struct boss_silver_hand_bossesAI : public ScriptedAI { - boss_silver_hand_bossesAI(Creature* c) : ScriptedAI(c) + boss_silver_hand_bossesAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -96,30 +96,34 @@ public: { } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { - if (instance) + if (!instance) + return; + + switch (me->GetEntry()) { - switch (me->GetEntry()) - { - case SH_AELMAR: - instance->SetData(TYPE_SH_AELMAR, 2); - break; - case SH_CATHELA: - instance->SetData(TYPE_SH_CATHELA, 2); - break; - case SH_GREGOR: - instance->SetData(TYPE_SH_GREGOR, 2); - break; - case SH_NEMAS: - instance->SetData(TYPE_SH_NEMAS, 2); - break; - case SH_VICAR: - instance->SetData(TYPE_SH_VICAR, 2); - break; - } - if (instance->GetData(TYPE_SH_QUEST) && Killer->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(Killer)->KilledMonsterCredit(SH_QUEST_CREDIT, 0); + case SH_AELMAR: + instance->SetData(TYPE_SH_AELMAR, 2); + break; + case SH_CATHELA: + instance->SetData(TYPE_SH_CATHELA, 2); + break; + case SH_GREGOR: + instance->SetData(TYPE_SH_GREGOR, 2); + break; + case SH_NEMAS: + instance->SetData(TYPE_SH_NEMAS, 2); + break; + case SH_VICAR: + instance->SetData(TYPE_SH_VICAR, 2); + break; + } + + if (instance->GetData(TYPE_SH_QUEST)) + { + if (Player* player = killer->ToPlayer()) + player->KilledMonsterCredit(SH_QUEST_CREDIT, 0); } } diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp index 869a82011ad..cf8b10a2ee5 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp @@ -48,7 +48,7 @@ public: struct boss_postmaster_malownAI : public ScriptedAI { - boss_postmaster_malownAI(Creature* c) : ScriptedAI(c) {} + boss_postmaster_malownAI(Creature* creature) : ScriptedAI(creature) {} uint32 WailingDead_Timer; uint32 Backhand_Timer; diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp index f35bcc05ec2..3bb1ce7959d 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp @@ -43,7 +43,7 @@ public: struct boss_ramstein_the_gorgerAI : public ScriptedAI { - boss_ramstein_the_gorgerAI(Creature* c) : ScriptedAI(c) + boss_ramstein_the_gorgerAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } @@ -63,7 +63,7 @@ public: { } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { for (uint8 i = 0; i < 30; ++i) { diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp index 405527ab383..a281c1b59c6 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp @@ -41,7 +41,7 @@ public: struct boss_timmy_the_cruelAI : public ScriptedAI { - boss_timmy_the_cruelAI(Creature* c) : ScriptedAI(c) {} + boss_timmy_the_cruelAI(Creature* creature) : ScriptedAI(creature) {} uint32 RavenousClaw_Timer; bool HasYelled; diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 5b2b2fd46c1..7e167093e07 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -99,7 +99,7 @@ public: struct mob_freed_soulAI : public ScriptedAI { - mob_freed_soulAI(Creature* c) : ScriptedAI(c) {} + mob_freed_soulAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { @@ -133,7 +133,7 @@ public: struct mob_restless_soulAI : public ScriptedAI { - mob_restless_soulAI(Creature* c) : ScriptedAI(c) {} + mob_restless_soulAI(Creature* creature) : ScriptedAI(creature) {} uint64 Tagger; uint32 Die_Timer; @@ -165,7 +165,7 @@ public: summoned->CastSpell(summoned, SPELL_SOUL_FREED, false); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (Tagged) me->SummonCreature(ENTRY_FREED, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 300000); @@ -211,7 +211,7 @@ public: struct mobs_spectral_ghostly_citizenAI : public ScriptedAI { - mobs_spectral_ghostly_citizenAI(Creature* c) : ScriptedAI(c) {} + mobs_spectral_ghostly_citizenAI(Creature* creature) : ScriptedAI(creature) {} uint32 Die_Timer; bool Tagged; @@ -230,7 +230,7 @@ public: Tagged = true; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (Tagged) { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp index 1404fd14e91..43c94f8a57d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp @@ -78,9 +78,9 @@ public: struct boss_brutallusAI : public ScriptedAI { - boss_brutallusAI(Creature* c) : ScriptedAI(c) + boss_brutallusAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); Intro = true; } @@ -132,7 +132,7 @@ public: DoScriptText(RAND(YELL_KILL1, YELL_KILL2, YELL_KILL3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(YELL_DEATH, me); @@ -216,7 +216,7 @@ public: break; case 3: DoCast(me, SPELL_INTRO_FROST_BLAST); - Madrigosa->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + Madrigosa->SetDisableGravity(true); me->AttackStop(); Madrigosa->AttackStop(); IntroFrostBoltTimer = 3000; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 56d7909336c..03486a644a2 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -97,9 +97,9 @@ public: struct boss_sacrolashAI : public ScriptedAI { - boss_sacrolashAI(Creature* c) : ScriptedAI(c) + boss_sacrolashAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -120,7 +120,7 @@ public: if (instance) { - Unit* Temp = Unit::GetUnit((*me), instance->GetData64(DATA_ALYTHESS)); + Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS)); if (Temp) { if (Temp->isDead()) @@ -152,7 +152,7 @@ public: if (instance) { - Unit* Temp = Unit::GetUnit((*me), instance->GetData64(DATA_ALYTHESS)); + Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS)); if (Temp && Temp->isAlive() && !(Temp->getVictim())) CAST_CRE(Temp)->AI()->AttackStart(who); } @@ -167,7 +167,7 @@ public: DoScriptText(RAND(YELL_SAC_KILL_1, YELL_SAC_KILL_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { // only if ALY death if (SisterDeath) @@ -231,7 +231,7 @@ public: if (instance) { Unit* Temp = NULL; - Temp = Unit::GetUnit((*me), instance->GetData64(DATA_ALYTHESS)); + Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS)); if (Temp && Temp->isDead()) { DoScriptText(YELL_SISTER_ALYTHESS_DEAD, me); @@ -355,9 +355,9 @@ public: struct boss_alythessAI : public Scripted_NoMovementAI { - boss_alythessAI(Creature* c) : Scripted_NoMovementAI(c) + boss_alythessAI(Creature* creature) : Scripted_NoMovementAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); IntroStepCounter = 10; } @@ -382,7 +382,7 @@ public: if (instance) { - Unit* Temp = Unit::GetUnit((*me), instance->GetData64(DATA_SACROLASH)); + Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH)); if (Temp) { if (Temp->isDead()) @@ -415,7 +415,7 @@ public: if (instance) { - Unit* Temp = Unit::GetUnit((*me), instance->GetData64(DATA_SACROLASH)); + Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH)); if (Temp && Temp->isAlive() && !(Temp->getVictim())) CAST_CRE(Temp)->AI()->AttackStart(who); } @@ -462,7 +462,7 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (SisterDeath) { @@ -567,7 +567,7 @@ public: if (instance) { Unit* Temp = NULL; - Temp = Unit::GetUnit((*me), instance->GetData64(DATA_SACROLASH)); + Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH)); if (Temp && Temp->isDead()) { DoScriptText(YELL_SISTER_SACROLASH_DEAD, me); @@ -684,7 +684,7 @@ public: struct mob_shadow_imageAI : public ScriptedAI { - mob_shadow_imageAI(Creature* c) : ScriptedAI(c) {} + mob_shadow_imageAI(Creature* creature) : ScriptedAI(creature) {} uint32 ShadowfuryTimer; uint32 KillTimer; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index c65ce2c8f98..72ad1100752 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -115,9 +115,9 @@ public: struct boss_felmystAI : public ScriptedAI { - boss_felmystAI(Creature* c) : ScriptedAI(c) + boss_felmystAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -137,7 +137,7 @@ public: uiFlightCount = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); @@ -184,7 +184,7 @@ public: DoScriptText(YELL_BIRTH, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(YELL_DEATH, me); @@ -254,7 +254,7 @@ public: events.ScheduleEvent(EVENT_FLIGHT, 60000); break; case PHASE_FLIGHT: - me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000); uiFlightCount = 0; uiBreathCount = 0; @@ -391,7 +391,7 @@ public: } break; case 10: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); EnterPhase(PHASE_GROUND); AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO)); @@ -522,7 +522,7 @@ public: struct mob_felmyst_vaporAI : public ScriptedAI { - mob_felmyst_vaporAI(Creature* c) : ScriptedAI(c) + mob_felmyst_vaporAI(Creature* creature) : ScriptedAI(creature) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetSpeed(MOVE_RUN, 0.8f); @@ -555,7 +555,7 @@ public: struct mob_felmyst_trailAI : public ScriptedAI { - mob_felmyst_trailAI(Creature* c) : ScriptedAI(c) + mob_felmyst_trailAI(Creature* creature) : ScriptedAI(creature) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(me, SPELL_TRAIL_TRIGGER, true); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index d7c90732a80..f783fcc1eb5 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -115,9 +115,9 @@ public: struct boss_kalecgosAI : public ScriptedAI { - boss_kalecgosAI(Creature* c) : ScriptedAI(c) + boss_kalecgosAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); SathGUID = 0; DoorGUID = 0; bJustReset = false; @@ -159,7 +159,7 @@ public: if (!bJustReset) //first reset at create { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->SetVisible(true); me->SetStandState(UNIT_STAND_STATE_SLEEP); } @@ -231,7 +231,7 @@ public: if (ResetTimer <= diff) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->SetVisible(true); me->SetStandState(UNIT_STAND_STATE_SLEEP); ResetTimer = 10000; @@ -400,7 +400,7 @@ public: TalkTimer = 10000; break; case 3: - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z); TalkTimer = 600000; break; @@ -418,7 +418,7 @@ public: TalkTimer = 3000; break; case 2: - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z); TalkTimer = 15000; break; @@ -456,9 +456,9 @@ public: bool isEnraged; // if demon is enraged - boss_kalecAI(Creature* c) : ScriptedAI(c) + boss_kalecAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Reset() @@ -575,9 +575,9 @@ public: struct boss_sathrovarrAI : public ScriptedAI { - boss_sathrovarrAI(Creature* c) : ScriptedAI(c) + boss_sathrovarrAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); KalecGUID = 0; KalecgosGUID = 0; } @@ -676,7 +676,9 @@ public: void TeleportAllPlayersBack() { Map* map = me->GetMap(); - if (!map->IsDungeon()) return; + if (!map->IsDungeon()) + return; + Map::PlayerList const &PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 337eea13438..8a64d45abcb 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -251,9 +251,9 @@ public: struct boss_kalecgos_kjAI : public ScriptedAI { - boss_kalecgos_kjAI(Creature* c) : ScriptedAI(c) + boss_kalecgos_kjAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -264,7 +264,7 @@ public: { OrbsEmpowered = 0; EmpowerCount = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING); + me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->setActive(true); @@ -406,9 +406,9 @@ public: struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI { - mob_kiljaeden_controllerAI(Creature* c) : Scripted_NoMovementAI(c), summons(me) + mob_kiljaeden_controllerAI(Creature* creature) : Scripted_NoMovementAI(creature), summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -434,8 +434,9 @@ public: { phase = PHASE_DECEIVERS; - if (Creature* pKalecKJ = Unit::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ))) - CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); + if (instance) + if (Creature* pKalecKJ = Unit::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ))) + CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); deceiverDeathCount = 0; bSummonedDeceivers = false; bKiljaedenDeath = false; @@ -451,7 +452,7 @@ public: summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false); break; case CREATURE_ANVEENA: - summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING); + summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true); summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); break; @@ -506,9 +507,9 @@ public: struct boss_kiljaedenAI : public Scripted_NoMovementAI { - boss_kiljaedenAI(Creature* c) : Scripted_NoMovementAI(c), summons(me) + boss_kiljaedenAI(Creature* creature) : Scripted_NoMovementAI(creature), summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -660,17 +661,9 @@ public: DoScriptText(RAND(SAY_KJ_REFLECTION1, SAY_KJ_REFLECTION2), me); for (uint8 i = 0; i < 4; ++i) { - float x, y, z; - Unit* target = NULL; - for (uint8 i = 0; i < 6; ++i) - { - target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (!target || !target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, 0)) - break; - } - - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true, -SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)) { + float x, y, z; target->GetPosition(x, y, z); if (Creature* pSinisterReflection = me->SummonCreature(CREATURE_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0)) { @@ -922,9 +915,9 @@ public: struct mob_hand_of_the_deceiverAI : public ScriptedAI { - mob_hand_of_the_deceiverAI(Creature* c) : ScriptedAI(c) + mob_hand_of_the_deceiverAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -1023,7 +1016,7 @@ public: struct mob_felfire_portalAI : public Scripted_NoMovementAI { - mob_felfire_portalAI(Creature* c) : Scripted_NoMovementAI(c) {} + mob_felfire_portalAI(Creature* creature) : Scripted_NoMovementAI(creature) {} uint32 uiSpawnFiendTimer; @@ -1068,7 +1061,7 @@ public: struct mob_volatile_felfire_fiendAI : public ScriptedAI { - mob_volatile_felfire_fiendAI(Creature* c) : ScriptedAI(c) {} + mob_volatile_felfire_fiendAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiExplodeTimer; @@ -1126,7 +1119,7 @@ public: struct mob_armageddonAI : public Scripted_NoMovementAI { - mob_armageddonAI(Creature* c) : Scripted_NoMovementAI(c) {} + mob_armageddonAI(Creature* creature) : Scripted_NoMovementAI(creature) {} uint8 spell; uint32 uiTimer; @@ -1181,9 +1174,9 @@ public: struct mob_shield_orbAI : public ScriptedAI { - mob_shield_orbAI(Creature* c) : ScriptedAI(c) + mob_shield_orbAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -1196,7 +1189,7 @@ public: void Reset() { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); bPointReached = true; uiTimer = urand(500, 1000); uiCheckTimer = 1000; @@ -1269,7 +1262,7 @@ public: struct mob_sinster_reflectionAI : public ScriptedAI { - mob_sinster_reflectionAI(Creature* c) : ScriptedAI(c) {} + mob_sinster_reflectionAI(Creature* creature) : ScriptedAI(creature) {} uint8 victimClass; uint32 uiTimer[3]; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 9b5d941589b..66030a1c78c 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -113,9 +113,9 @@ public: struct boss_entropiusAI : public ScriptedAI { - boss_entropiusAI(Creature* c) : ScriptedAI(c), Summons(me) + boss_entropiusAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -213,9 +213,9 @@ public: struct boss_muruAI : public Scripted_NoMovementAI { - boss_muruAI(Creature* c) : Scripted_NoMovementAI(c), Summons(me) + boss_muruAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -378,9 +378,9 @@ public: struct npc_muru_portalAI : public Scripted_NoMovementAI { - npc_muru_portalAI(Creature* c) : Scripted_NoMovementAI(c), Summons(me) + npc_muru_portalAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -462,7 +462,7 @@ public: struct npc_dark_fiendAI : public ScriptedAI { - npc_dark_fiendAI(Creature* c) : ScriptedAI(c) {} + npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature) {} uint32 WaitTimer; bool InAction; @@ -525,7 +525,7 @@ public: struct npc_void_sentinelAI : public ScriptedAI { - npc_void_sentinelAI(Creature* c) : ScriptedAI(c){} + npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature){} uint32 PulseTimer; uint32 VoidBlastTimer; @@ -581,9 +581,9 @@ public: struct npc_blackholeAI : public ScriptedAI { - npc_blackholeAI(Creature* c) : ScriptedAI(c) + npc_blackholeAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index 0872ac9adca..7a946e9d5bf 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -153,7 +153,7 @@ class boss_archaedas : public CreatureScript // wake a wall minion if (uiWallMinionTimer <= uiDiff) { - instance->SetData (DATA_MINIONS, IN_PROGRESS); + instance->SetData(DATA_MINIONS, IN_PROGRESS); uiWallMinionTimer = 10000; } else uiWallMinionTimer -= uiDiff; @@ -232,7 +232,7 @@ class mob_archaedas_minions : public CreatureScript struct mob_archaedas_minionsAI : public ScriptedAI { - mob_archaedas_minionsAI(Creature* c) : ScriptedAI(c) + mob_archaedas_minionsAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } @@ -394,7 +394,7 @@ class go_altar_of_archaedas : public GameObjectScript { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { InstanceScript* instance = player->GetInstanceScript(); if (!instance) diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 60d17a7e5d2..fea64c55377 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -184,8 +184,8 @@ class instance_uldaman : public InstanceMapScript return; // only want the first one we find } // if we get this far than all four are dead so open the door - SetData (DATA_ALTAR_DOORS, DONE); - SetDoor (uiArchaedasTempleDoor, true); //open next the door too + SetData(DATA_ALTAR_DOORS, DONE); + SetDoor(uiArchaedasTempleDoor, true); //open next the door too } void ActivateWallMinions() @@ -320,7 +320,7 @@ class instance_uldaman : public InstanceMapScript uiIronayaSealDoorTimer -= diff; } - void SetData (uint32 type, uint32 data) + void SetData(uint32 type, uint32 data) { switch (type) { @@ -386,7 +386,7 @@ class instance_uldaman : public InstanceMapScript } } - void SetData64 (uint32 type, uint64 data) + void SetData64(uint32 type, uint64 data) { // Archaedas if (type == 0) @@ -425,7 +425,8 @@ class instance_uldaman : public InstanceMapScript void OnCreatureCreate(Creature* creature) { - switch (creature->GetEntry()) { + switch (creature->GetEntry()) + { case 4857: // Stone Keeper SetFrozenState (creature); vStoneKeeper.push_back(creature->GetGUID()); @@ -458,10 +459,10 @@ class instance_uldaman : public InstanceMapScript uiArchaedasGUID = creature->GetGUID(); break; - } // end switch - } // end OnCreatureCreate + } + } - uint64 GetData64 (uint32 identifier) + uint64 GetData64(uint32 identifier) { if (identifier == 0) return uiWhoWokeuiArchaedasGUID; if (identifier == 1) return vVaultWalker[0]; // VaultWalker1 diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index eee6b08d834..a715dbfce9d 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -72,9 +72,9 @@ class boss_akilzon : public CreatureScript struct boss_akilzonAI : public ScriptedAI { - boss_akilzonAI(Creature* c) : ScriptedAI(c) + boss_akilzonAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -131,7 +131,7 @@ class boss_akilzon : public CreatureScript instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { me->MonsterYell(SAY_ONDEATH, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_ONDEATH); @@ -209,9 +209,7 @@ class boss_akilzon : public CreatureScript for (std::list::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if (!Cloud->IsWithinDist(*i, 6, false)) - { Cloud->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, me->GetGUID()); - } } // visual float x, y, z; @@ -311,7 +309,8 @@ class boss_akilzon : public CreatureScript isRaining = true; } - if (ElectricalStorm_Timer <= diff) { + if (ElectricalStorm_Timer <= diff) + { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); if (!target) { @@ -324,16 +323,16 @@ class boss_akilzon : public CreatureScript target->GetPosition(x, y, z); if (target) { - target->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + target->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0); } Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000); if (Cloud) { CloudGUID = Cloud->GetGUID(); - Cloud->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + Cloud->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); Cloud->StopMoving(); - Cloud->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); + Cloud->SetObjectScale(1.0f); Cloud->setFaction(35); Cloud->SetMaxHealth(9999999); Cloud->SetHealth(9999999); @@ -390,15 +389,11 @@ class boss_akilzon : public CreatureScript class mob_akilzon_eagle : public CreatureScript { public: - - mob_akilzon_eagle() - : CreatureScript("mob_akilzon_eagle") - { - } + mob_akilzon_eagle() : CreatureScript("mob_akilzon_eagle") { } struct mob_akilzon_eagleAI : public ScriptedAI { - mob_akilzon_eagleAI(Creature* c) : ScriptedAI(c) {} + mob_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature) { } uint32 EagleSwoop_Timer; bool arrived; @@ -409,10 +404,13 @@ class mob_akilzon_eagle : public CreatureScript EagleSwoop_Timer = urand(5000, 10000); arrived = true; TargetGUID = 0; - me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); } - void EnterCombat(Unit* /*who*/) {DoZoneInCombat();} + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void MoveInLineOfSight(Unit* /*who*/) {} diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp index db0e201298c..3baa6ebdf62 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp @@ -83,9 +83,9 @@ class boss_halazzi : public CreatureScript struct boss_halazziAI : public ScriptedAI { - boss_halazziAI(Creature* c) : ScriptedAI(c) + boss_halazziAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -324,7 +324,7 @@ class boss_halazzi : public CreatureScript } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_HALAZZIEVENT, DONE); @@ -352,7 +352,7 @@ class mob_halazzi_lynx : public CreatureScript struct mob_halazzi_lynxAI : public ScriptedAI { - mob_halazzi_lynxAI(Creature* c) : ScriptedAI(c) {} + mob_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature) {} uint32 FrenzyTimer; uint32 shredder_timer; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 5efd4af55ea..b5698d851f8 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -179,14 +179,17 @@ struct boss_hexlord_addAI : public ScriptedAI { InstanceScript* instance; - boss_hexlord_addAI(Creature* c) : ScriptedAI(c) + boss_hexlord_addAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Reset() {} - void EnterCombat(Unit* /*who*/) {DoZoneInCombat();} + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void UpdateAI(const uint32 /*diff*/) { @@ -211,9 +214,9 @@ class boss_hexlord_malacrass : public CreatureScript struct boss_hex_lord_malacrassAI : public ScriptedAI { - boss_hex_lord_malacrassAI(Creature* c) : ScriptedAI(c) + boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); SelectAddEntry(); for (uint8 i = 0; i < 4; ++i) AddGUID[i] = 0; @@ -264,7 +267,7 @@ class boss_hexlord_malacrass : public CreatureScript for (uint8 i = 0; i < 4; ++i) { - Unit* Temp = Unit::GetUnit((*me), AddGUID[i]); + Unit* Temp = Unit::GetUnit(*me, AddGUID[i]); if (Temp && Temp->isAlive()) CAST_CRE(Temp)->AI()->AttackStart(me->getVictim()); else @@ -290,7 +293,7 @@ class boss_hexlord_malacrass : public CreatureScript } } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_HEXLORDEVENT, DONE); @@ -298,9 +301,9 @@ class boss_hexlord_malacrass : public CreatureScript me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_YELL_DEATH); - for (uint8 i = 0; i < 4 ; ++i) + for (uint8 i = 0; i < 4; ++i) { - Unit* Temp = Unit::GetUnit((*me), AddGUID[i]); + Unit* Temp = Unit::GetUnit(*me, AddGUID[i]); if (Temp && Temp->isAlive()) Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -488,7 +491,7 @@ class boss_thurg : public CreatureScript struct boss_thurgAI : public boss_hexlord_addAI { - boss_thurgAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 bloodlust_timer; uint32 cleave_timer; @@ -548,7 +551,7 @@ class boss_alyson_antille : public CreatureScript struct boss_alyson_antilleAI : public boss_hexlord_addAI { //Holy Priest - boss_alyson_antilleAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_alyson_antilleAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 flashheal_timer; uint32 dispelmagic_timer; @@ -637,7 +640,7 @@ class boss_alyson_antille : public CreatureScript struct boss_gazakrothAI : public boss_hexlord_addAI { - boss_gazakrothAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 firebolt_timer; @@ -691,7 +694,7 @@ class boss_lord_raadan : public CreatureScript struct boss_lord_raadanAI : public boss_hexlord_addAI { - boss_lord_raadanAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 flamebreath_timer; uint32 thunderclap_timer; @@ -744,7 +747,7 @@ class boss_darkheart : public CreatureScript struct boss_darkheartAI : public boss_hexlord_addAI { - boss_darkheartAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 psychicwail_timer; @@ -787,7 +790,7 @@ class boss_slither : public CreatureScript struct boss_slitherAI : public boss_hexlord_addAI { - boss_slitherAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 venomspit_timer; @@ -847,7 +850,7 @@ class boss_fenstalker : public CreatureScript struct boss_fenstalkerAI : public boss_hexlord_addAI { - boss_fenstalkerAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 volatileinf_timer; @@ -894,7 +897,7 @@ class boss_koragg : public CreatureScript struct boss_koraggAI : public boss_hexlord_addAI { - boss_koraggAI(Creature* c) : boss_hexlord_addAI(c) {} + boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature) {} uint32 coldstare_timer; uint32 mightyblow_timer; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 21245209e45..a2125c45689 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -113,9 +113,9 @@ class boss_janalai : public CreatureScript struct boss_janalaiAI : public ScriptedAI { - boss_janalaiAI(Creature* c) : ScriptedAI(c) + boss_janalaiAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -159,7 +159,7 @@ class boss_janalai : public CreatureScript HatchAllEggs(1); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -221,12 +221,13 @@ class boss_janalai : public CreatureScript dy = float(irand(-area_dy/2, area_dy/2)); Creature* bomb = DoSpawnCreature(MOB_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); - if (bomb) FireBombGUIDs[i] = bomb->GetGUID(); + if (bomb) + FireBombGUIDs[i] = bomb->GetGUID(); } BombCount = 0; } - bool HatchAllEggs(uint32 uiAction) //1: reset, 2: isHatching all + bool HatchAllEggs(uint32 action) //1: reset, 2: isHatching all { std::list templist; float x, y, z; @@ -251,9 +252,9 @@ class boss_janalai : public CreatureScript for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) { - if (uiAction == 1) + if (action == 1) (*i)->SetDisplayId(10056); - else if (uiAction == 2 &&(*i)->GetDisplayId() != 11686) + else if (action == 2 &&(*i)->GetDisplayId() != 11686) (*i)->CastSpell(*i, SPELL_HATCH_EGG, false); } return true; @@ -288,7 +289,7 @@ class boss_janalai : public CreatureScript { if (BombCount < 40) { - if (Unit* FireBomb = Unit::GetUnit((*me), FireBombGUIDs[BombCount])) + if (Unit* FireBomb = Unit::GetUnit(*me, FireBombGUIDs[BombCount])) { FireBomb->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(FireBomb, SPELL_FIRE_BOMB_THROW, true); @@ -374,7 +375,9 @@ class boss_janalai : public CreatureScript //Teleport every Player into the middle Map* map = me->GetMap(); - if (!map->IsDungeon()) return; + if (!map->IsDungeon()) + return; + Map::PlayerList const &PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (Player* i_pl = i->getSource()) @@ -448,7 +451,7 @@ class mob_janalai_firebomb : public CreatureScript struct mob_janalai_firebombAI : public ScriptedAI { - mob_janalai_firebombAI(Creature* c) : ScriptedAI(c){} + mob_janalai_firebombAI(Creature* creature) : ScriptedAI(creature){} void Reset() {} @@ -484,9 +487,9 @@ class mob_janalai_hatcher : public CreatureScript struct mob_janalai_hatcherAI : public ScriptedAI { - mob_janalai_hatcherAI(Creature* c) : ScriptedAI(c) + mob_janalai_hatcherAI(Creature* creature) : ScriptedAI(creature) { - instance =c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -501,7 +504,7 @@ class mob_janalai_hatcher : public CreatureScript void Reset() { - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); side =(me->GetPositionY() < 1150); waypoint = 0; isHatching = false; @@ -616,9 +619,9 @@ class mob_janalai_hatchling : public CreatureScript struct mob_janalai_hatchlingAI : public ScriptedAI { - mob_janalai_hatchlingAI(Creature* c) : ScriptedAI(c) + mob_janalai_hatchlingAI(Creature* creature) : ScriptedAI(creature) { - instance =c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -632,7 +635,7 @@ class mob_janalai_hatchling : public CreatureScript else me->GetMotionMaster()->MovePoint(0, hatcherway[1][3][0]+rand()%4-2, 1150.0f+rand()%4-2, hatcherway[1][3][2]); - me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); } void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/} diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 954f232f786..48a406f22a4 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -101,11 +101,11 @@ class boss_nalorakk : public CreatureScript struct boss_nalorakkAI : public ScriptedAI { - boss_nalorakkAI(Creature* c) : ScriptedAI(c) + boss_nalorakkAI(Creature* creature) : ScriptedAI(creature) { MoveEvent = true; MovePhase = 0; - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -136,7 +136,7 @@ class boss_nalorakk : public CreatureScript inMove = false; waitTimer = 0; me->SetSpeed(MOVE_RUN, 2); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); }else { (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]); @@ -276,7 +276,7 @@ class boss_nalorakk : public CreatureScript DoZoneInCombat(); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_NALORAKKEVENT, DONE); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index b5130630d05..2df202af088 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -151,9 +151,9 @@ class boss_zuljin : public CreatureScript struct boss_zuljinAI : public ScriptedAI { - boss_zuljinAI(Creature* c) : ScriptedAI(c), Summons(me) + boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -252,7 +252,7 @@ class boss_zuljin : public CreatureScript } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_ZULJINEVENT, DONE); @@ -604,7 +604,7 @@ class mob_zuljin_vortex : public CreatureScript struct mob_zuljin_vortexAI : public ScriptedAI { - mob_zuljin_vortexAI(Creature* c) : ScriptedAI(c) {} + mob_zuljin_vortexAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index ac1554bd00e..884fe109785 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -109,7 +109,8 @@ class instance_zulaman : public InstanceMapScript bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -188,7 +189,9 @@ class instance_zulaman : public InstanceMapScript void Load(const char* load) { - if (!load) return; + if (!load) + return; + std::istringstream ss(load); //sLog->outError("TSCR: Zul'aman loaded, %s.", ss.str().c_str()); char dataHead; // S diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index bf951dd186c..bfb22483b09 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -49,9 +49,9 @@ class npc_forest_frog : public CreatureScript struct npc_forest_frogAI : public ScriptedAI { - npc_forest_frogAI(Creature* c) : ScriptedAI(c) + npc_forest_frogAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -120,24 +120,29 @@ static uint32 ChestEntry[] = {186648, 187021, 186672, 186667}; class npc_zulaman_hostage : public CreatureScript { public: - - npc_zulaman_hostage() - : CreatureScript("npc_zulaman_hostage") - { - } + npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { } struct npc_zulaman_hostageAI : public ScriptedAI { - npc_zulaman_hostageAI(Creature* c) : ScriptedAI(c) {IsLoot = false;} + npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature) + { + IsLoot = false; + } + bool IsLoot; uint64 PlayerGUID; + void Reset() {} + void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* /*who*/) + + void JustDied(Unit* /*killer*/) { Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (player) player->SendLoot(me->GetGUID(), LOOT_CORPSE); + if (player) + player->SendLoot(me->GetGUID(), LOOT_CORPSE); } + void UpdateAI(const uint32 /*diff*/) { if (IsLoot) @@ -157,14 +162,16 @@ class npc_zulaman_hostage : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + + if (action == GOSSIP_ACTION_INFO_DEF + 1) player->CLOSE_GOSSIP_MENU(); if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) return true; + creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); InstanceScript* instance = creature->GetInstanceScript(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index 27ddc215543..4ba0c187973 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -61,10 +61,10 @@ class boss_arlokk : public CreatureScript { boss_arlokkAI(Creature* creature) : ScriptedAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiShadowWordPain_Timer; uint32 m_uiGouge_Timer; @@ -110,8 +110,8 @@ class boss_arlokk : public CreatureScript void JustReachedHome() { - if (m_instance) - m_instance->SetData(DATA_ARLOKK, NOT_STARTED); + if (instance) + instance->SetData(DATA_ARLOKK, NOT_STARTED); //we should be summoned, so despawn me->DespawnOrUnsummon(); @@ -124,8 +124,8 @@ class boss_arlokk : public CreatureScript me->SetDisplayId(MODEL_ID_NORMAL); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (m_instance) - m_instance->SetData(DATA_ARLOKK, DONE); + if (instance) + instance->SetData(DATA_ARLOKK, DONE); } void DoSummonPhanters() @@ -237,7 +237,7 @@ class boss_arlokk : public CreatureScript me->SetDisplayId(MODEL_ID_PANTHER); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - const CreatureTemplate* cinfo = me->GetCreatureInfo(); + const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); me->UpdateDamagePhysical(BASE_ATTACK); @@ -271,12 +271,12 @@ class go_gong_of_bethekk : public GameObjectScript bool OnGossipHello(Player* /*player*/, GameObject* go) { - if (InstanceScript* m_instance = go->GetInstanceScript()) + if (InstanceScript* instance = go->GetInstanceScript()) { - if (m_instance->GetData(DATA_ARLOKK) == DONE || m_instance->GetData(DATA_ARLOKK) == IN_PROGRESS) + if (instance->GetData(DATA_ARLOKK) == DONE || instance->GetData(DATA_ARLOKK) == IN_PROGRESS) return true; - m_instance->SetData(DATA_ARLOKK, IN_PROGRESS); + instance->SetData(DATA_ARLOKK, IN_PROGRESS); return true; } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp index a944a857f74..ce2fd0848f9 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp @@ -32,15 +32,11 @@ EndScriptData */ class boss_gahzranka : public CreatureScript { public: - - boss_gahzranka() - : CreatureScript("boss_gahzranka") - { - } + boss_gahzranka() : CreatureScript("boss_gahzranka") { } struct boss_gahzrankaAI : public ScriptedAI { - boss_gahzrankaAI(Creature* c) : ScriptedAI(c) {} + boss_gahzrankaAI(Creature* creature) : ScriptedAI(creature) { } uint32 Frostbreath_Timer; uint32 MassiveGeyser_Timer; uint32 Slam_Timer; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index 68ae6dbbf0c..cdd45a3fa0d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -32,15 +32,11 @@ EndScriptData */ class boss_grilek : public CreatureScript { public: - - boss_grilek() - : CreatureScript("boss_grilek") - { - } + boss_grilek() : CreatureScript("boss_grilek") { } struct boss_grilekAI : public ScriptedAI { - boss_grilekAI(Creature* c) : ScriptedAI(c) {} + boss_grilekAI(Creature* creature) : ScriptedAI(creature) { } uint32 Avartar_Timer; uint32 GroundTremor_Timer; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp index 6a1309983c3..9edd82c39b0 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp @@ -55,12 +55,12 @@ class boss_hakkar : public CreatureScript struct boss_hakkarAI : public ScriptedAI { - boss_hakkarAI(Creature* c) : ScriptedAI(c) + boss_hakkarAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 BloodSiphon_Timer; uint32 CorruptedBlood_Timer; @@ -156,9 +156,9 @@ class boss_hakkar : public CreatureScript //Checking if Jeklik is dead. If not we cast her Aspect if (CheckJeklik_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_JEKLIK) != DONE) + if (instance->GetData(DATA_JEKLIK) != DONE) { if (AspectOfJeklik_Timer <= diff) { @@ -173,9 +173,9 @@ class boss_hakkar : public CreatureScript //Checking if Venoxis is dead. If not we cast his Aspect if (CheckVenoxis_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_VENOXIS) != DONE) + if (instance->GetData(DATA_VENOXIS) != DONE) { if (AspectOfVenoxis_Timer <= diff) { @@ -190,9 +190,9 @@ class boss_hakkar : public CreatureScript //Checking if Marli is dead. If not we cast her Aspect if (CheckMarli_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_MARLI) != DONE) + if (instance->GetData(DATA_MARLI) != DONE) { if (AspectOfMarli_Timer <= diff) { @@ -208,9 +208,9 @@ class boss_hakkar : public CreatureScript //Checking if Thekal is dead. If not we cast his Aspect if (CheckThekal_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_THEKAL) != DONE) + if (instance->GetData(DATA_THEKAL) != DONE) { if (AspectOfThekal_Timer <= diff) { @@ -225,9 +225,9 @@ class boss_hakkar : public CreatureScript //Checking if Arlokk is dead. If yes we cast her Aspect if (CheckArlokk_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_ARLOKK) != DONE) + if (instance->GetData(DATA_ARLOKK) != DONE) { if (AspectOfArlokk_Timer <= diff) { diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index 69a4f5dbab5..27c46b8e0f2 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -40,7 +40,7 @@ class boss_hazzarah : public CreatureScript struct boss_hazzarahAI : public ScriptedAI { - boss_hazzarahAI(Creature* c) : ScriptedAI(c) {} + boss_hazzarahAI(Creature* creature) : ScriptedAI(creature) {} uint32 ManaBurn_Timer; uint32 Sleep_Timer; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index d2ac4f3bceb..7d2215f8311 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -54,12 +54,12 @@ class boss_jeklik : public CreatureScript struct boss_jeklikAI : public ScriptedAI { - boss_jeklikAI(Creature* c) : ScriptedAI(c) + boss_jeklikAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 Charge_Timer; uint32 SonicBurst_Timer; @@ -94,12 +94,12 @@ class boss_jeklik : public CreatureScript DoCast(me, SPELL_BAT_FORM); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); - if (m_instance) - m_instance->SetData(DATA_JEKLIK, DONE); + if (instance) + instance->SetData(DATA_JEKLIK, DONE); } void UpdateAI(const uint32 diff) @@ -236,12 +236,12 @@ class mob_batrider : public CreatureScript struct mob_batriderAI : public ScriptedAI { - mob_batriderAI(Creature* c) : ScriptedAI(c) + mob_batriderAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 Bomb_Timer; uint32 Check_Timer; @@ -274,9 +274,9 @@ class mob_batrider : public CreatureScript //Check_Timer if (Check_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_JEKLIK) == DONE) + if (instance->GetData(DATA_JEKLIK) == DONE) { me->setDeathState(JUST_DIED); me->RemoveCorpse(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp index 132812c932a..f4a17da56fb 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp @@ -52,7 +52,7 @@ class boss_jindo : public CreatureScript struct boss_jindoAI : public ScriptedAI { - boss_jindoAI(Creature* c) : ScriptedAI(c) {} + boss_jindoAI(Creature* creature) : ScriptedAI(creature) {} uint32 BrainWashTotem_Timer; uint32 HealingWard_Timer; @@ -187,9 +187,9 @@ class mob_healing_ward : public CreatureScript struct mob_healing_wardAI : public ScriptedAI { - mob_healing_wardAI(Creature* c) : ScriptedAI(c) + mob_healing_wardAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 Heal_Timer; @@ -212,7 +212,7 @@ class mob_healing_ward : public CreatureScript { if (instance) { - Unit* pJindo = Unit::GetUnit((*me), instance->GetData64(DATA_JINDO)); + Unit* pJindo = Unit::GetUnit(*me, instance->GetData64(DATA_JINDO)); if (pJindo) DoCast(pJindo, SPELL_HEAL); } @@ -241,7 +241,7 @@ class mob_shade_of_jindo : public CreatureScript struct mob_shade_of_jindoAI : public ScriptedAI { - mob_shade_of_jindoAI(Creature* c) : ScriptedAI(c) {} + mob_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) {} uint32 ShadowShock_Timer; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 10708cd7f95..cbe1178e6c4 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -55,9 +55,9 @@ class boss_mandokir : public CreatureScript struct boss_mandokirAI : public ScriptedAI { - boss_mandokirAI(Creature* c) : ScriptedAI(c) + boss_mandokirAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 KillCount; @@ -72,7 +72,7 @@ class boss_mandokir : public CreatureScript float targetY; float targetZ; - InstanceScript* m_instance; + InstanceScript* instance; bool endWatch; bool someWatched; @@ -116,9 +116,9 @@ class boss_mandokir : public CreatureScript { DoScriptText(SAY_DING_KILL, me); - if (m_instance) + if (instance) { - uint64 JindoGUID = m_instance->GetData64(DATA_JINDO); + uint64 JindoGUID = instance->GetData64(DATA_JINDO); if (JindoGUID) { if (Unit* jTemp = Unit::GetUnit(*me, JindoGUID)) @@ -256,9 +256,9 @@ class boss_mandokir : public CreatureScript //Checking if Ohgan is dead. If yes Mandokir will enrage. if (Check_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_OHGAN) == DONE) + if (instance->GetData(DATA_OHGAN) == DONE) { if (!RaptorDead) { @@ -294,13 +294,13 @@ class mob_ohgan : public CreatureScript struct mob_ohganAI : public ScriptedAI { - mob_ohganAI(Creature* c) : ScriptedAI(c) + mob_ohganAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 SunderArmor_Timer; - InstanceScript* m_instance; + InstanceScript* instance; void Reset() { @@ -309,10 +309,10 @@ class mob_ohgan : public CreatureScript void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { - if (m_instance) - m_instance->SetData(DATA_OHGAN, DONE); + if (instance) + instance->SetData(DATA_OHGAN, DONE); } void UpdateAI (const uint32 diff) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index 38d9be78f2a..44ab5d851f5 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -51,12 +51,12 @@ class boss_marli : public CreatureScript struct boss_marliAI : public ScriptedAI { - boss_marliAI(Creature* c) : ScriptedAI(c) + boss_marliAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 SpawnStartSpiders_Timer; uint32 PoisonVolley_Timer; @@ -88,11 +88,11 @@ class boss_marli : public CreatureScript DoScriptText(SAY_AGGRO, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); - if (m_instance) - m_instance->SetData(DATA_MARLI, DONE); + if (instance) + instance->SetData(DATA_MARLI, DONE); } void UpdateAI(const uint32 diff) @@ -156,7 +156,7 @@ class boss_marli : public CreatureScript { DoScriptText(SAY_TRANSFORM, me); DoCast(me, SPELL_SPIDER_FORM); - const CreatureTemplate* cinfo = me->GetCreatureInfo(); + const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); me->UpdateDamagePhysical(BASE_ATTACK); @@ -196,7 +196,7 @@ class boss_marli : public CreatureScript if (TransformBack_Timer <= diff) { me->SetDisplayId(15220); - const CreatureTemplate* cinfo = me->GetCreatureInfo(); + const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); me->UpdateDamagePhysical(BASE_ATTACK); @@ -230,7 +230,7 @@ class mob_spawn_of_marli : public CreatureScript struct mob_spawn_of_marliAI : public ScriptedAI { - mob_spawn_of_marliAI(Creature* c) : ScriptedAI(c) {} + mob_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) {} uint32 LevelUp_Timer; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index f988d0df77a..81260c28d73 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -42,7 +42,7 @@ class boss_renataki : public CreatureScript struct boss_renatakiAI : public ScriptedAI { - boss_renatakiAI(Creature* c) : ScriptedAI(c) {} + boss_renatakiAI(Creature* creature) : ScriptedAI(creature) {} uint32 Invisible_Timer; uint32 Ambush_Timer; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp index 4185ba2f3e7..3da74d16dc3 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp @@ -66,9 +66,9 @@ class boss_thekal : public CreatureScript struct boss_thekalAI : public ScriptedAI { - boss_thekalAI(Creature* c) : ScriptedAI(c) + boss_thekalAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 MortalCleave_Timer; @@ -81,7 +81,7 @@ class boss_thekal : public CreatureScript uint32 Check_Timer; uint32 Resurrect_Timer; - InstanceScript* m_instance; + InstanceScript* instance; bool Enraged; bool PhaseTwo; bool WasDead; @@ -108,17 +108,17 @@ class boss_thekal : public CreatureScript DoScriptText(SAY_AGGRO, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); - if (m_instance) - m_instance->SetData(DATA_THEKAL, DONE); + if (instance) + instance->SetData(DATA_THEKAL, DONE); } void JustReachedHome() { - if (m_instance) - m_instance->SetData(DATA_THEKAL, NOT_STARTED); + if (instance) + instance->SetData(DATA_THEKAL, NOT_STARTED); } void UpdateAI(const uint32 diff) @@ -129,26 +129,26 @@ class boss_thekal : public CreatureScript //Check_Timer for the death of LorKhan and Zath. if (!WasDead && Check_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_LORKHAN) == SPECIAL) + if (instance->GetData(DATA_LORKHAN) == SPECIAL) { //Resurrect LorKhan - if (Unit* pLorKhan = Unit::GetUnit((*me), m_instance->GetData64(DATA_LORKHAN))) + if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) { pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pLorKhan->setFaction(14); pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pLorKhan->SetFullHealth(); - m_instance->SetData(DATA_LORKHAN, DONE); + instance->SetData(DATA_LORKHAN, DONE); } } - if (m_instance->GetData(DATA_ZATH) == SPECIAL) + if (instance->GetData(DATA_ZATH) == SPECIAL) { //Resurrect Zath - Unit* pZath = Unit::GetUnit((*me), m_instance->GetData64(DATA_ZATH)); + Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); if (pZath) { pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); @@ -156,7 +156,7 @@ class boss_thekal : public CreatureScript pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pZath->SetFullHealth(); - m_instance->SetData(DATA_ZATH, DONE); + instance->SetData(DATA_ZATH, DONE); } } } @@ -185,8 +185,8 @@ class boss_thekal : public CreatureScript me->SetStandState(UNIT_STAND_STATE_SLEEP); me->AttackStop(); - if (m_instance) - m_instance->SetData(DATA_THEKAL, SPECIAL); + if (instance) + instance->SetData(DATA_THEKAL, SPECIAL); WasDead=true; } @@ -197,11 +197,11 @@ class boss_thekal : public CreatureScript if (Resurrect_Timer <= diff) { DoCast(me, SPELL_TIGER_FORM); - me->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.00f); + me->SetObjectScale(2.00f); me->SetStandState(UNIT_STAND_STATE_STAND); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFullHealth(); - const CreatureTemplate* cinfo = me->GetCreatureInfo(); + const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40))); me->UpdateDamagePhysical(BASE_ATTACK); @@ -277,9 +277,9 @@ class mob_zealot_lorkhan : public CreatureScript struct mob_zealot_lorkhanAI : public ScriptedAI { - mob_zealot_lorkhanAI(Creature* c) : ScriptedAI(c) + mob_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 Shield_Timer; @@ -290,7 +290,7 @@ class mob_zealot_lorkhan : public CreatureScript bool FakeDeath; - InstanceScript* m_instance; + InstanceScript* instance; void Reset() { @@ -302,8 +302,8 @@ class mob_zealot_lorkhan : public CreatureScript FakeDeath = false; - if (m_instance) - m_instance->SetData(DATA_LORKHAN, NOT_STARTED); + if (instance) + instance->SetData(DATA_LORKHAN, NOT_STARTED); me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -335,10 +335,10 @@ class mob_zealot_lorkhan : public CreatureScript //Casting Greaterheal to Thekal or Zath if they are in meele range. if (GreaterHeal_Timer <= diff) { - if (m_instance) + if (instance) { - Unit* pThekal = Unit::GetUnit((*me), m_instance->GetData64(DATA_THEKAL)); - Unit* pZath = Unit::GetUnit((*me), m_instance->GetData64(DATA_ZATH)); + Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)); + Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); if (!pThekal || !pZath) return; @@ -369,12 +369,12 @@ class mob_zealot_lorkhan : public CreatureScript //Check_Timer for the death of LorKhan and Zath. if (!FakeDeath && Check_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_THEKAL) == SPECIAL) + if (instance->GetData(DATA_THEKAL) == SPECIAL) { //Resurrect Thekal - if (Unit* pThekal = Unit::GetUnit((*me), m_instance->GetData64(DATA_THEKAL))) + if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) { pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -383,10 +383,10 @@ class mob_zealot_lorkhan : public CreatureScript } } - if (m_instance->GetData(DATA_ZATH) == SPECIAL) + if (instance->GetData(DATA_ZATH) == SPECIAL) { //Resurrect Zath - if (Unit* pZath = Unit::GetUnit((*me), m_instance->GetData64(DATA_ZATH))) + if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH))) { pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -409,8 +409,8 @@ class mob_zealot_lorkhan : public CreatureScript me->setFaction(35); me->AttackStop(); - if (m_instance) - m_instance->SetData(DATA_LORKHAN, SPECIAL); + if (instance) + instance->SetData(DATA_LORKHAN, SPECIAL); FakeDeath = true; } @@ -437,9 +437,9 @@ class mob_zealot_zath : public CreatureScript struct mob_zealot_zathAI : public ScriptedAI { - mob_zealot_zathAI(Creature* c) : ScriptedAI(c) + mob_zealot_zathAI(Creature* creature) : ScriptedAI(creature) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 SweepingStrikes_Timer; @@ -451,7 +451,7 @@ class mob_zealot_zath : public CreatureScript bool FakeDeath; - InstanceScript* m_instance; + InstanceScript* instance; void Reset() { @@ -464,8 +464,8 @@ class mob_zealot_zath : public CreatureScript FakeDeath = false; - if (m_instance) - m_instance->SetData(DATA_ZATH, NOT_STARTED); + if (instance) + instance->SetData(DATA_ZATH, NOT_STARTED); me->SetStandState(UNIT_STAND_STATE_STAND); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -522,12 +522,12 @@ class mob_zealot_zath : public CreatureScript //Check_Timer for the death of LorKhan and Zath. if (!FakeDeath && Check_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(DATA_LORKHAN) == SPECIAL) + if (instance->GetData(DATA_LORKHAN) == SPECIAL) { //Resurrect LorKhan - if (Unit* pLorKhan = Unit::GetUnit((*me), m_instance->GetData64(DATA_LORKHAN))) + if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) { pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -536,10 +536,10 @@ class mob_zealot_zath : public CreatureScript } } - if (m_instance->GetData(DATA_THEKAL) == SPECIAL) + if (instance->GetData(DATA_THEKAL) == SPECIAL) { //Resurrect Thekal - if (Unit* pThekal = Unit::GetUnit((*me), m_instance->GetData64(DATA_THEKAL))) + if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) { pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -562,8 +562,8 @@ class mob_zealot_zath : public CreatureScript me->setFaction(35); me->AttackStop(); - if (m_instance) - m_instance->SetData(DATA_ZATH, SPECIAL); + if (instance) + instance->SetData(DATA_ZATH, SPECIAL); FakeDeath = true; } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index bd6f6ec4748..06448032dff 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -186,7 +186,7 @@ class boss_venoxis : public CreatureScript events.ScheduleEvent(EVENT_THRASH, urand(10000, 20000)); break; - // troll form spells and actions (first part) + // troll form spells and Actions (first part) case EVENT_DISPEL_MAGIC: DoCast(me, SPELL_DISPEL_MAGIC); events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE); @@ -198,7 +198,7 @@ class boss_venoxis : public CreatureScript case EVENT_HOLY_NOVA: _inMeleeRange = 0; - for (uint8 i = 0; i < 10 ; ++i) + for (uint8 i = 0; i < 10; ++i) { if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i)) // check if target is within melee-distance @@ -224,7 +224,7 @@ class boss_venoxis : public CreatureScript break; // - // snake form spells and actions + // snake form spells and Actions // case EVENT_VENOM_SPIT: diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp index 702a69207ba..b22630f51bb 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -40,7 +40,7 @@ class boss_wushoolay : public CreatureScript struct boss_wushoolayAI : public ScriptedAI { - boss_wushoolayAI(Creature* c) : ScriptedAI(c) {} + boss_wushoolayAI(Creature* creature) : ScriptedAI(creature) {} uint32 LightningCloud_Timer; uint32 LightningWave_Timer; diff --git a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp index 82b09b9dc18..d4d35b107b2 100644 --- a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp @@ -62,38 +62,44 @@ class npc_professor_phizzlethorpe : public CreatureScript struct npc_professor_phizzlethorpeAI : public npc_escortAI { - npc_professor_phizzlethorpeAI(Creature* c) : npc_escortAI(c) {} + npc_professor_phizzlethorpeAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (uiPointId) + switch (waypointId) { - case 4:Talk(SAY_PROGRESS_2, player->GetGUID());break; - case 5:Talk(SAY_PROGRESS_3, player->GetGUID());break; - case 8:Talk(EMOTE_PROGRESS_4);break; - case 9: - { - me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - break; - } - case 10:Talk(SAY_PROGRESS_5, player->GetGUID());break; - case 11: - Talk(SAY_PROGRESS_6, player->GetGUID()); - SetRun(); - break; - case 19:Talk(SAY_PROGRESS_7, player->GetGUID()); break; - case 20: - Talk(EMOTE_PROGRESS_8); - Talk(SAY_PROGRESS_9, player->GetGUID()); - if (player) - CAST_PLR(player)->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); - break; + case 4: + Talk(SAY_PROGRESS_2, player->GetGUID()); + break; + case 5: + Talk(SAY_PROGRESS_3, player->GetGUID()); + break; + case 8: + Talk(EMOTE_PROGRESS_4); + break; + case 9: + me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); + me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); + break; + case 10: + Talk(SAY_PROGRESS_5, player->GetGUID()); + break; + case 11: + Talk(SAY_PROGRESS_6, player->GetGUID()); + SetRun(); + break; + case 19: + Talk(SAY_PROGRESS_7, player->GetGUID()); + break; + case 20: + Talk(EMOTE_PROGRESS_8); + Talk(SAY_PROGRESS_9, player->GetGUID()); + player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); + break; } } diff --git a/src/server/scripts/EasternKingdoms/blasted_lands.cpp b/src/server/scripts/EasternKingdoms/blasted_lands.cpp index 2ad03f8b504..2042e5313c3 100644 --- a/src/server/scripts/EasternKingdoms/blasted_lands.cpp +++ b/src/server/scripts/EasternKingdoms/blasted_lands.cpp @@ -44,10 +44,10 @@ class npc_deathly_usher : public CreatureScript public: npc_deathly_usher() : CreatureScript("npc_deathly_usher") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, SPELL_TELEPORT_SINGLE, true); @@ -65,7 +65,6 @@ public: return true; } - }; void AddSC_blasted_lands() diff --git a/src/server/scripts/EasternKingdoms/boss_kruul.cpp b/src/server/scripts/EasternKingdoms/boss_kruul.cpp index 126f55838b9..8749c943a6f 100644 --- a/src/server/scripts/EasternKingdoms/boss_kruul.cpp +++ b/src/server/scripts/EasternKingdoms/boss_kruul.cpp @@ -45,7 +45,7 @@ public: struct boss_kruulAI : public ScriptedAI { - boss_kruulAI(Creature* c) : ScriptedAI(c) {} + boss_kruulAI(Creature* creature) : ScriptedAI(creature) {} uint32 ShadowVolley_Timer; uint32 Cleave_Timer; @@ -151,7 +151,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_boss_kruul() diff --git a/src/server/scripts/EasternKingdoms/burning_steppes.cpp b/src/server/scripts/EasternKingdoms/burning_steppes.cpp index 1d2725b10ee..b526246f670 100644 --- a/src/server/scripts/EasternKingdoms/burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/burning_steppes.cpp @@ -51,10 +51,10 @@ class npc_ragged_john : public CreatureScript public: npc_ragged_john() : CreatureScript("npc_ragged_john") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -127,7 +127,7 @@ public: struct npc_ragged_johnAI : public ScriptedAI { - npc_ragged_johnAI(Creature* c) : ScriptedAI(c) {} + npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} @@ -147,7 +147,6 @@ public: void EnterCombat(Unit* /*who*/) {} }; - }; void AddSC_burning_steppes() diff --git a/src/server/scripts/EasternKingdoms/duskwood.cpp b/src/server/scripts/EasternKingdoms/duskwood.cpp index 5d04489bbca..10cb5987ce5 100644 --- a/src/server/scripts/EasternKingdoms/duskwood.cpp +++ b/src/server/scripts/EasternKingdoms/duskwood.cpp @@ -60,7 +60,6 @@ public: } return false; }; - }; /*###### @@ -83,7 +82,7 @@ public: struct boss_twilight_corrupterAI : public ScriptedAI { - boss_twilight_corrupterAI(Creature* c) : ScriptedAI(c) {} + boss_twilight_corrupterAI(Creature* creature) : ScriptedAI(creature) {} uint32 SoulCorruption_Timer; uint32 CreatureOfNightmare_Timer; @@ -133,7 +132,6 @@ public: DoMeleeAttackIfReady(); }; }; - }; void AddSC_duskwood() diff --git a/src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp index 2b4bb61c603..0519ce94b32 100644 --- a/src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp @@ -32,35 +32,30 @@ EndContentData */ #include "ScriptPCH.h" -//id8530 - cannibal ghoul -//id8531 - gibbering ghoul -//id8532 - diseased flayer - class mobs_ghoul_flayer : public CreatureScript { public: mobs_ghoul_flayer() : CreatureScript("mobs_ghoul_flayer") { } - CreatureAI* GetAI(Creature* creature) const - { - return new mobs_ghoul_flayerAI (creature); - } - struct mobs_ghoul_flayerAI : public ScriptedAI { - mobs_ghoul_flayerAI(Creature* c) : ScriptedAI(c) {} + mobs_ghoul_flayerAI(Creature* creature) : ScriptedAI(creature) { } void Reset() {} void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { - if (Killer->GetTypeId() == TYPEID_PLAYER) + if (killer->GetTypeId() == TYPEID_PLAYER) me->SummonCreature(11064, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); } }; + CreatureAI* GetAI(Creature* creature) const + { + return new mobs_ghoul_flayerAI (creature); + } }; /*###### @@ -72,10 +67,10 @@ class npc_augustus_the_touched : public CreatureScript public: npc_augustus_the_touched() : CreatureScript("npc_augustus_the_touched") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; } @@ -91,7 +86,6 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -120,7 +114,7 @@ public: struct npc_darrowshire_spiritAI : public ScriptedAI { - npc_darrowshire_spiritAI(Creature* c) : ScriptedAI(c) {} + npc_darrowshire_spiritAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { @@ -129,9 +123,7 @@ public: } void EnterCombat(Unit* /*who*/) {} - }; - }; /*###### @@ -148,10 +140,10 @@ class npc_tirion_fordring : public CreatureScript public: npc_tirion_fordring() : CreatureScript("npc_tirion_fordring") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); @@ -185,7 +177,6 @@ public: return true; } - }; void AddSC_eastern_plaguelands() diff --git a/src/server/scripts/EasternKingdoms/eversong_woods.cpp b/src/server/scripts/EasternKingdoms/eversong_woods.cpp index 4797774ef49..8ae72e142c8 100644 --- a/src/server/scripts/EasternKingdoms/eversong_woods.cpp +++ b/src/server/scripts/EasternKingdoms/eversong_woods.cpp @@ -124,7 +124,6 @@ public: void Reset() { - timer = 2000; questPhase = 0; summonerGuid = 0; @@ -248,7 +247,7 @@ public: CAST_PLR(Killed)->FailQuest(QUEST_SECOND_TRIAL); } - void JustDied(Unit* Killer); + void JustDied(Unit* killer); }; }; @@ -294,7 +293,7 @@ public: struct master_kelerun_bloodmournAI : public ScriptedAI { - master_kelerun_bloodmournAI(Creature* c) : ScriptedAI(c) {} + master_kelerun_bloodmournAI(Creature* creature) : ScriptedAI(creature) {} uint8 questPhase; uint8 paladinPhase; @@ -366,10 +365,8 @@ public: void StartEvent() { - if (questPhase == 1) { // no player check, quest can be finished as group, so no complex PlayerGUID/group search code - for (uint8 i = 0; i < 4; ++i) if (Creature* summoned = DoSpawnCreature(PaladinEntry[i], SpawnPosition[i].x, SpawnPosition[i].y, SpawnPosition[i].z, SpawnPosition[i].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 180000)) paladinGuid[i] = summoned->GetGUID(); @@ -420,15 +417,14 @@ class go_second_trial : public GameObjectScript public: go_second_trial() : GameObjectScript("go_second_trial") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { // find spawn :: master_kelerun_bloodmourn - if (Creature* creature = pGO->FindNearestCreature(MASTER_KELERUN_BLOODMOURN, 30.0f)) + if (Creature* creature = go->FindNearestCreature(MASTER_KELERUN_BLOODMOURN, 30.0f)) CAST_AI(npc_second_trial_controller::master_kelerun_bloodmournAI, creature->AI())->StartEvent(); return true; } - }; /*###### @@ -461,7 +457,7 @@ public: struct npc_apprentice_mirvedaAI : public ScriptedAI { - npc_apprentice_mirvedaAI(Creature* c) : ScriptedAI(c), Summons(me) {} + npc_apprentice_mirvedaAI(Creature* creature) : ScriptedAI(creature), Summons(me) {} uint32 KillCount; uint64 PlayerGUID; @@ -494,14 +490,14 @@ public: { if (PlayerGUID) if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) - CAST_PLR(player)->FailQuest(QUEST_UNEXPECTED_RESULT); + player->FailQuest(QUEST_UNEXPECTED_RESULT); } void UpdateAI(const uint32 /*diff*/) { if (KillCount >= 3 && PlayerGUID) if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) - CAST_PLR(player)->CompleteQuest(QUEST_UNEXPECTED_RESULT); + player->CompleteQuest(QUEST_UNEXPECTED_RESULT); if (Summon) { @@ -512,7 +508,6 @@ public: } } }; - }; /*###### @@ -552,7 +547,7 @@ public: struct npc_infused_crystalAI : public Scripted_NoMovementAI { - npc_infused_crystalAI(Creature* c) : Scripted_NoMovementAI(c) {} + npc_infused_crystalAI(Creature* creature) : Scripted_NoMovementAI(creature) {} uint32 EndTimer; uint32 WaveTimer; @@ -621,7 +616,6 @@ public: } else WaveTimer -= diff; } }; - }; void AddSC_eversong_woods() diff --git a/src/server/scripts/EasternKingdoms/ghostlands.cpp b/src/server/scripts/EasternKingdoms/ghostlands.cpp index 412613572f1..e40a2f785e6 100644 --- a/src/server/scripts/EasternKingdoms/ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/ghostlands.cpp @@ -44,10 +44,10 @@ class npc_budd_nedreck : public CreatureScript public: npc_budd_nedreck() : CreatureScript("npc_budd_nedreck") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, 42540, false); @@ -66,7 +66,6 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -78,10 +77,10 @@ class npc_rathis_tomber : public CreatureScript public: npc_rathis_tomber() : CreatureScript("npc_rathis_tomber") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; } @@ -100,7 +99,6 @@ public: return true; } - }; /*###### @@ -130,61 +128,63 @@ public: struct npc_ranger_lilathaAI : public npc_escortAI { - npc_ranger_lilathaAI(Creature* c) : npc_escortAI(c) {} + npc_ranger_lilathaAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 0: - { - me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) - Cage->SetGoState(GO_STATE_ACTIVE); - DoScriptText(SAY_START, me, player); - break; - } - case 5: - DoScriptText(SAY_PROGRESS1, me, player); - case 11: - DoScriptText(SAY_PROGRESS2, me, player); - me->SetOrientation(4.762841f); - break; - case 18: - { - DoScriptText(SAY_PROGRESS3, me, player); - Creature* Summ1 = me->SummonCreature(16342, 7627.083984f, -7532.538086f, 152.128616f, 1.082733f, TEMPSUMMON_DEAD_DESPAWN, 0); - Creature* Summ2 = me->SummonCreature(16343, 7620.432129f, -7532.550293f, 152.454865f, 0.827478f, TEMPSUMMON_DEAD_DESPAWN, 0); - if (Summ1 && Summ2) - { - Summ1->Attack(me, true); - Summ2->Attack(player, true); - } - me->AI()->AttackStart(Summ1); - break; - } - case 19: me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); break; - case 25: me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); break; - case 30: - if (player && player->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(player)->GroupEventHappens(QUEST_ESCAPE_FROM_THE_CATACOMBS, me); - break; - case 32: - me->SetOrientation(2.978281f); - DoScriptText(SAY_END1, me, player); - break; - case 33: - me->SetOrientation(5.858011f); - DoScriptText(SAY_END2, me, player); - Unit* CaptainHelios = me->FindNearestCreature(NPC_CAPTAIN_HELIOS, 50); - if (CaptainHelios) - DoScriptText(SAY_CAPTAIN_ANSWER, CaptainHelios, player); - break; + case 0: + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) + Cage->SetGoState(GO_STATE_ACTIVE); + DoScriptText(SAY_START, me, player); + break; + case 5: + DoScriptText(SAY_PROGRESS1, me, player); + break; + case 11: + DoScriptText(SAY_PROGRESS2, me, player); + me->SetOrientation(4.762841f); + break; + case 18: + { + DoScriptText(SAY_PROGRESS3, me, player); + Creature* Summ1 = me->SummonCreature(16342, 7627.083984f, -7532.538086f, 152.128616f, 1.082733f, TEMPSUMMON_DEAD_DESPAWN, 0); + Creature* Summ2 = me->SummonCreature(16343, 7620.432129f, -7532.550293f, 152.454865f, 0.827478f, TEMPSUMMON_DEAD_DESPAWN, 0); + if (Summ1 && Summ2) + { + Summ1->Attack(me, true); + Summ2->Attack(player, true); + } + me->AI()->AttackStart(Summ1); + } + break; + case 19: + me->SetWalk(false); + break; + case 25: + me->SetWalk(true); + break; + case 30: + if (player->GetTypeId() == TYPEID_PLAYER) + CAST_PLR(player)->GroupEventHappens(QUEST_ESCAPE_FROM_THE_CATACOMBS, me); + break; + case 32: + me->SetOrientation(2.978281f); + DoScriptText(SAY_END1, me, player); + break; + case 33: + me->SetOrientation(5.858011f); + DoScriptText(SAY_END2, me, player); + Unit* CaptainHelios = me->FindNearestCreature(NPC_CAPTAIN_HELIOS, 50); + if (CaptainHelios) + DoScriptText(SAY_CAPTAIN_ANSWER, CaptainHelios, player); + break; } } diff --git a/src/server/scripts/EasternKingdoms/hinterlands.cpp b/src/server/scripts/EasternKingdoms/hinterlands.cpp index 7021deeae75..8de895cb51f 100644 --- a/src/server/scripts/EasternKingdoms/hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/hinterlands.cpp @@ -87,9 +87,9 @@ public: void Reset() { } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 26: DoScriptText(SAY_OOX_AMBUSH, me); @@ -146,7 +146,6 @@ public: summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); } }; - }; /*###### @@ -273,18 +272,17 @@ public: void JustSummoned(Creature* summoned) { - summoned->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + summoned->SetWalk(false); summoned->GetMotionMaster()->MovePoint(0, m_afAmbushMoveTo[m_iSpawnId].m_fX, m_afAmbushMoveTo[m_iSpawnId].m_fY, m_afAmbushMoveTo[m_iSpawnId].m_fZ); } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (uiPointId) + switch (waypointId) { case 1: DoScriptText(SAY_RIN_FREE, me, player); @@ -315,7 +313,7 @@ public: { m_uiPostEventTimer = 3000; - if (Unit* player = GetPlayerForEscort()) + if (Player* player = GetPlayerForEscort()) { switch (m_uiPostEventCount) { @@ -345,7 +343,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_hinterlands() diff --git a/src/server/scripts/EasternKingdoms/ironforge.cpp b/src/server/scripts/EasternKingdoms/ironforge.cpp index 5a0ee3c5630..93a8d7423c9 100644 --- a/src/server/scripts/EasternKingdoms/ironforge.cpp +++ b/src/server/scripts/EasternKingdoms/ironforge.cpp @@ -44,10 +44,10 @@ class npc_royal_historian_archesonus : public CreatureScript public: npc_royal_historian_archesonus() : CreatureScript("npc_royal_historian_archesonus") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -88,7 +88,6 @@ public: return true; } - }; void AddSC_ironforge() diff --git a/src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp index f2095de49c3..27d8ea3e51c 100644 --- a/src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp +++ b/src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp @@ -51,7 +51,7 @@ public: struct npc_converted_sentryAI : public ScriptedAI { - npc_converted_sentryAI(Creature* c) : ScriptedAI(c) {} + npc_converted_sentryAI(Creature* creature) : ScriptedAI(creature) {} bool Credit; uint32 Timer; @@ -85,7 +85,6 @@ public: } } }; - }; /*###### @@ -109,7 +108,7 @@ public: struct npc_greengill_slaveAI : public ScriptedAI { - npc_greengill_slaveAI(Creature* c) : ScriptedAI(c) {} + npc_greengill_slaveAI(Creature* creature) : ScriptedAI(creature) {} uint64 PlayerGUID; @@ -130,8 +129,8 @@ public: PlayerGUID = caster->GetGUID(); if (PlayerGUID) { - Unit* player = Unit::GetUnit((*me), PlayerGUID); - if (player && CAST_PLR(player)->GetQuestStatus(QUESTG) == QUEST_STATUS_INCOMPLETE) + Player* player = Unit::GetPlayer(*me, PlayerGUID); + if (player && player->GetQuestStatus(QUESTG) == QUEST_STATUS_INCOMPLETE) DoCast(player, 45110, true); } DoCast(me, ENRAGE); @@ -149,7 +148,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_isle_of_queldanas() diff --git a/src/server/scripts/EasternKingdoms/loch_modan.cpp b/src/server/scripts/EasternKingdoms/loch_modan.cpp index 9ce9de4381a..7ea8a62a5bd 100644 --- a/src/server/scripts/EasternKingdoms/loch_modan.cpp +++ b/src/server/scripts/EasternKingdoms/loch_modan.cpp @@ -47,10 +47,10 @@ class npc_mountaineer_pebblebitty : public CreatureScript public: npc_mountaineer_pebblebitty() : CreatureScript("npc_mountaineer_pebblebitty") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); @@ -95,7 +95,6 @@ public: return true; } - }; void AddSC_loch_modan() diff --git a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp index d7b00af33e8..3ade1da4a19 100644 --- a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp @@ -76,17 +76,16 @@ public: uiShieldBashTimer = 8000; } - void WaypointReached(uint32 uiI) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - if (uiI >= 65 && me->GetUnitMovementFlags() == MOVEMENTFLAG_WALKING) - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + if (waypointId >= 65 && me->GetUnitMovementFlags() == MOVEMENTFLAG_WALKING) + me->SetWalk(false); - switch (uiI) + switch (waypointId) { case 39: SetEscortPaused(true); @@ -94,7 +93,7 @@ public: uiPhase = 1; break; case 65: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); break; case 115: player->AreaExploredOrEventHappens(QUEST_MISSING_IN_ACTION); @@ -164,7 +163,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_redridge_mountains() diff --git a/src/server/scripts/EasternKingdoms/silvermoon_city.cpp b/src/server/scripts/EasternKingdoms/silvermoon_city.cpp index 8d04e92b9b8..e6595a83b66 100644 --- a/src/server/scripts/EasternKingdoms/silvermoon_city.cpp +++ b/src/server/scripts/EasternKingdoms/silvermoon_city.cpp @@ -53,7 +53,7 @@ public: struct npc_blood_knight_stillbladeAI : public ScriptedAI { - npc_blood_knight_stillbladeAI(Creature* c) : ScriptedAI(c) {} + npc_blood_knight_stillbladeAI(Creature* creature) : ScriptedAI(creature) {} uint32 lifeTimer; bool spellHit; @@ -100,7 +100,6 @@ public: } } }; - }; void AddSC_silvermoon_city() diff --git a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/silverpine_forest.cpp index 4d897c4f3b8..bc3110878de 100644 --- a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/silverpine_forest.cpp @@ -64,37 +64,46 @@ public: struct npc_deathstalker_erlandAI : public npc_escortAI { - npc_deathstalker_erlandAI(Creature* c) : npc_escortAI(c) {} + npc_deathstalker_erlandAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 1: DoScriptText(SAY_START, me, player);break; - case 13: - DoScriptText(SAY_LAST, me, player); - player->GroupEventHappens(QUEST_ESCORTING, me); break; - case 14: DoScriptText(SAY_THANKS, me, player); break; - case 15: { - Unit* Rane = me->FindNearestCreature(NPC_RANE, 20); - if (Rane) + case 1: + DoScriptText(SAY_START, me, player); + break; + case 13: + DoScriptText(SAY_LAST, me, player); + player->GroupEventHappens(QUEST_ESCORTING, me); + break; + case 14: + DoScriptText(SAY_THANKS, me, player); + break; + case 15: + if (Unit* Rane = me->FindNearestCreature(NPC_RANE, 20)) DoScriptText(SAY_RANE, Rane); - break;} - case 16: DoScriptText(SAY_ANSWER, me); break; - case 17: DoScriptText(SAY_MOVE_QUINN, me); break; - case 24: DoScriptText(SAY_GREETINGS, me); break; - case 25: { - Unit* Quinn = me->FindNearestCreature(NPC_QUINN, 20); - if (Quinn) + break; + case 16: + DoScriptText(SAY_ANSWER, me); + break; + case 17: + DoScriptText(SAY_MOVE_QUINN, me); + break; + case 24: + DoScriptText(SAY_GREETINGS, me); + break; + case 25: + if (Unit* Quinn = me->FindNearestCreature(NPC_QUINN, 20)) DoScriptText(SAY_QUINN, Quinn); - break;} - case 26: DoScriptText(SAY_ON_BYE, me, NULL); break; - + break; + case 26: + DoScriptText(SAY_ON_BYE, me, NULL); + break; } } @@ -123,7 +132,6 @@ public: { return new npc_deathstalker_erlandAI(creature); } - }; /*###### @@ -177,7 +185,7 @@ public: struct pyrewood_ambushAI : public ScriptedAI { - pyrewood_ambushAI(Creature* c) : ScriptedAI(c), Summons(me) + pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me) { QuestInProgress = false; } @@ -309,7 +317,6 @@ public: ++Phase; //prepare next phase } }; - }; /*###### diff --git a/src/server/scripts/EasternKingdoms/stormwind_city.cpp b/src/server/scripts/EasternKingdoms/stormwind_city.cpp index a4eca1950f8..96ad1da725d 100644 --- a/src/server/scripts/EasternKingdoms/stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/stormwind_city.cpp @@ -47,10 +47,10 @@ class npc_archmage_malin : public CreatureScript public: npc_archmage_malin() : CreatureScript("npc_archmage_malin") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, 42711, true); @@ -71,7 +71,6 @@ public: return true; } - }; /*###### @@ -106,9 +105,9 @@ public: struct npc_bartlebyAI : public ScriptedAI { - npc_bartlebyAI(Creature* c) : ScriptedAI(c) + npc_bartlebyAI(Creature* creature) : ScriptedAI(creature) { - m_uiNormalFaction = c->getFaction(); + m_uiNormalFaction = creature->getFaction(); } uint32 m_uiNormalFaction; @@ -143,7 +142,6 @@ public: } } }; - }; /*###### @@ -160,10 +158,10 @@ class npc_lady_katrana_prestor : public CreatureScript public: npc_lady_katrana_prestor() : CreatureScript("npc_lady_katrana_prestor") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -197,7 +195,6 @@ public: return true; } - }; /*###### @@ -271,9 +268,9 @@ public: } } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 14: SetEscortPaused(true); @@ -370,7 +367,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -391,7 +387,7 @@ public: { npc_marzon_silent_bladeAI(Creature* creature) : ScriptedAI(creature) { - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); } void Reset() @@ -407,7 +403,7 @@ public: { if (Unit* summoner = me->ToTempSummon()->GetSummoner()) { - if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->isAlive() && !summoner->isInCombat()) + if (summoner->GetTypeId() == TYPEID_UNIT && summoner->isAlive() && !summoner->isInCombat()) summoner->ToCreature()->AI()->AttackStart(who); } } @@ -421,7 +417,7 @@ public: { if (Unit* summoner = me->ToTempSummon()->GetSummoner()) { - if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->isAlive()) + if (summoner->GetTypeId() == TYPEID_UNIT && summoner->isAlive()) summoner->ToCreature()->DisappearAndDie(); } } @@ -457,7 +453,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -502,9 +497,9 @@ public: uiPhase = 0; } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 1: SetEscortPaused(true); @@ -606,7 +601,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -636,7 +630,6 @@ public: } return false; } - }; void AddSC_stormwind_city() diff --git a/src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp b/src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp index a6effe29ff7..03f92ce6d61 100644 --- a/src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp +++ b/src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp @@ -45,7 +45,7 @@ public: struct mob_yennikuAI : public ScriptedAI { - mob_yennikuAI(Creature* c) : ScriptedAI(c) + mob_yennikuAI(Creature* creature) : ScriptedAI(creature) { bReset = false; } @@ -114,7 +114,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### diff --git a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp index ef6fccd8bde..6507ec911c0 100644 --- a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp +++ b/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp @@ -106,24 +106,24 @@ public: } } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { - case 0: - if (GameObject* pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID)) - pCage->ResetDoorOrButton(); - break; - case 20: - if (Player* player = GetPlayerForEscort()) - { - me->SetFacingToObject(player); - DoScriptText(SAY_QUEST_COMPLETE, me, player); - DoScriptText(EMOTE_WHISPER, me, player); - player->GroupEventHappens(QUEST_GALENS_ESCAPE, me); - } - SetRun(true); - break; + case 0: + if (GameObject* pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID)) + pCage->ResetDoorOrButton(); + break; + case 20: + if (Player* player = GetPlayerForEscort()) + { + me->SetFacingToObject(player); + DoScriptText(SAY_QUEST_COMPLETE, me, player); + DoScriptText(EMOTE_WHISPER, me, player); + player->GroupEventHappens(QUEST_GALENS_ESCAPE, me); + } + SetRun(true); + break; } } diff --git a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp index 0d72ab6fb2f..4687fa3630f 100644 --- a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp @@ -150,7 +150,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -185,7 +184,6 @@ public: return false; } - }; class go_mausoleum_trigger : public GameObjectScript @@ -207,7 +205,6 @@ public: return false; } - }; void AddSC_tirisfal_glades() diff --git a/src/server/scripts/EasternKingdoms/undercity.cpp b/src/server/scripts/EasternKingdoms/undercity.cpp index fe9c40e6dbd..a9b627ded34 100644 --- a/src/server/scripts/EasternKingdoms/undercity.cpp +++ b/src/server/scripts/EasternKingdoms/undercity.cpp @@ -47,7 +47,15 @@ enum Sylvanas SPELL_HIGHBORNE_AURA = 37090, SPELL_SYLVANAS_CAST = 36568, - SPELL_RIBBON_OF_SOULS = 34432, //the real one to use might be 37099 + SPELL_RIBBON_OF_SOULS = 34432, // the real one to use might be 37099 + + // Combat spells + SPELL_BLACK_ARROW = 59712, + SPELL_FADE = 20672, + SPELL_FADE_BLINK = 29211, + SPELL_MULTI_SHOT = 59713, + SPELL_SHOT = 59710, + SPELL_SUMMON_SKELETON = 59711 }; float HighborneLoc[4][3]= @@ -88,17 +96,29 @@ public: struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI { - npc_lady_sylvanas_windrunnerAI(Creature* c) : ScriptedAI(c) {} + npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature) {} - uint32 LamentEvent_Timer; + uint32 LamentEventTimer; bool LamentEvent; uint64 targetGUID; + uint32 FadeTimer; + uint32 SummonSkeletonTimer; + uint32 BlackArrowTimer; + uint32 ShotTimer; + uint32 MultiShotTimer; + void Reset() { - LamentEvent_Timer = 5000; + LamentEventTimer = 5000; LamentEvent = false; targetGUID = 0; + + FadeTimer = 30000; + SummonSkeletonTimer = 20000; + BlackArrowTimer = 15000; + ShotTimer = 8000; + MultiShotTimer = 10000; } void EnterCombat(Unit* /*who*/) {} @@ -114,7 +134,7 @@ public: summoned->CastSpell(target, SPELL_RIBBON_OF_SOULS, false); } - summoned->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + summoned->SetDisableGravity(true); targetGUID = summoned->GetGUID(); } } @@ -123,27 +143,73 @@ public: { if (LamentEvent) { - if (LamentEvent_Timer <= diff) + if (LamentEventTimer <= diff) { DoSummon(ENTRY_HIGHBORNE_BUNNY, me, 10.0f, 3000, TEMPSUMMON_TIMED_DESPAWN); - LamentEvent_Timer = 2000; + LamentEventTimer = 2000; if (!me->HasAura(SPELL_SYLVANAS_CAST)) { DoScriptText(SAY_LAMENT_END, me); DoScriptText(EMOTE_LAMENT_END, me); LamentEvent = false; } - } else LamentEvent_Timer -= diff; + } else LamentEventTimer -= diff; } if (!UpdateVictim()) return; + // Combat spells + + if (FadeTimer <= diff) + { + DoCast(me, SPELL_FADE); + // add a blink to simulate a stealthed movement and reappearing elsewhere + DoCast(me, SPELL_FADE_BLINK); + FadeTimer = 30000 + rand()%5000; + // if the victim is out of melee range she cast multi shot + if (Unit* victim = me->getVictim()) + if (me->GetDistance(victim) > 10.0f) + DoCast(victim, SPELL_MULTI_SHOT); + } else FadeTimer -= diff; + + if (SummonSkeletonTimer <= diff) + { + DoCast(me, SPELL_SUMMON_SKELETON); + SummonSkeletonTimer = 20000 + rand()%10000; + } else SummonSkeletonTimer -= diff; + + if (BlackArrowTimer <= diff) + { + if (Unit* victim = me->getVictim()) + { + DoCast(victim, SPELL_BLACK_ARROW); + BlackArrowTimer = 15000 + rand()%5000; + } + } else BlackArrowTimer -= diff; + + if (ShotTimer <= diff) + { + if (Unit* victim = me->getVictim()) + { + DoCast(victim, SPELL_SHOT); + ShotTimer = 8000 + rand()%2000; + } + } else ShotTimer -= diff; + + if (MultiShotTimer <= diff) + { + if (Unit* victim = me->getVictim()) + { + DoCast(victim, SPELL_MULTI_SHOT); + MultiShotTimer = 10000 + rand()%3000; + } + } else MultiShotTimer -= diff; + DoMeleeAttackIfReady(); } }; - }; /*###### @@ -162,17 +228,17 @@ public: struct npc_highborne_lamenterAI : public ScriptedAI { - npc_highborne_lamenterAI(Creature* c) : ScriptedAI(c) {} + npc_highborne_lamenterAI(Creature* creature) : ScriptedAI(creature) {} - uint32 EventMove_Timer; - uint32 EventCast_Timer; + uint32 EventMoveTimer; + uint32 EventCastTimer; bool EventMove; bool EventCast; void Reset() { - EventMove_Timer = 10000; - EventCast_Timer = 17500; + EventMoveTimer = 10000; + EventCastTimer = 17500; EventMove = true; EventCast = true; } @@ -183,25 +249,24 @@ public: { if (EventMove) { - if (EventMove_Timer <= diff) + if (EventMoveTimer <= diff) { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetDistance(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW) / (5000 * 0.001f)); me->SetPosition(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetOrientation()); EventMove = false; - } else EventMove_Timer -= diff; + } else EventMoveTimer -= diff; } if (EventCast) { - if (EventCast_Timer <= diff) + if (EventCastTimer <= diff) { DoCast(me, SPELL_HIGHBORNE_AURA); EventCast = false; - } else EventCast_Timer -= diff; + } else EventCastTimer -= diff; } } }; - }; /*###### @@ -219,15 +284,15 @@ class npc_parqual_fintallas : public CreatureScript public: npc_parqual_fintallas() : CreatureScript("npc_parqual_fintallas") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, SPELL_MARK_OF_SHAME, false); } - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+2) { player->CLOSE_GOSSIP_MENU(); player->AreaExploredOrEventHappens(6628); @@ -252,7 +317,6 @@ public: return true; } - }; /*###### diff --git a/src/server/scripts/EasternKingdoms/western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/western_plaguelands.cpp index a04a94f73b1..0057c01b882 100644 --- a/src/server/scripts/EasternKingdoms/western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/western_plaguelands.cpp @@ -49,10 +49,10 @@ class npcs_dithers_and_arbington : public CreatureScript public: npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); @@ -85,6 +85,7 @@ public: { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); + if (creature->isVendor()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); @@ -95,12 +96,12 @@ public: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HDA3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HDA4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); player->SEND_GOSSIP_MENU(3985, creature->GetGUID()); - }else + } + else player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -121,10 +122,10 @@ class npc_myranda_the_hag : public CreatureScript public: npc_myranda_the_hag() : CreatureScript("npc_myranda_the_hag") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { player->CLOSE_GOSSIP_MENU(); player->CastSpell(player, SPELL_SCARLET_ILLUSION, false); @@ -149,7 +150,6 @@ public: return true; } - }; /*###### @@ -168,7 +168,7 @@ public: struct npc_the_scourge_cauldronAI : public ScriptedAI { - npc_the_scourge_cauldronAI(Creature* c) : ScriptedAI(c) {} + npc_the_scourge_cauldronAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} @@ -229,7 +229,6 @@ public: } } }; - }; /*###### @@ -253,7 +252,7 @@ public: struct npc_andorhal_towerAI : public Scripted_NoMovementAI { - npc_andorhal_towerAI(Creature* c) : Scripted_NoMovementAI(c) {} + npc_andorhal_towerAI(Creature* creature) : Scripted_NoMovementAI(creature) {} void MoveInLineOfSight(Unit* who) { @@ -264,7 +263,6 @@ public: CAST_PLR(who)->KilledMonsterCredit(me->GetEntry(), me->GetGUID()); } }; - }; /*###### @@ -330,10 +328,11 @@ public: summoned->AI()->AttackStart(me); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - switch (i) + + switch (waypointId) { case 8: DoScriptText(SAY_WP_0, me); @@ -359,7 +358,7 @@ public: break; case 23: Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - Ughost->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + Ughost->SetDisableGravity(true); DoScriptText(SAY_WP_4, Ughost, me); m_uiChatTimer = 4000; break; @@ -382,8 +381,7 @@ public: void JustDied(Unit* /*killer*/) { - Player* player = GetPlayerForEscort(); - if (player) + if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_TOMB_LIGHTBRINGER); } @@ -395,7 +393,6 @@ public: m_uiChatTimer = 6000; } }; - }; /*###### diff --git a/src/server/scripts/EasternKingdoms/westfall.cpp b/src/server/scripts/EasternKingdoms/westfall.cpp index 271e1d99d63..46f1526c5bf 100644 --- a/src/server/scripts/EasternKingdoms/westfall.cpp +++ b/src/server/scripts/EasternKingdoms/westfall.cpp @@ -85,9 +85,15 @@ public: { switch (uiWPHolder) { - case 7: DoScriptText(SAY_DS_DOWN_1, me); break; - case 8: DoScriptText(SAY_DS_DOWN_2, me); break; - case 9: DoScriptText(SAY_DS_DOWN_3, me); break; + case 7: + DoScriptText(SAY_DS_DOWN_1, me); + break; + case 8: + DoScriptText(SAY_DS_DOWN_2, me); + break; + case 9: + DoScriptText(SAY_DS_DOWN_3, me); + break; } } else @@ -96,16 +102,15 @@ public: uiShootTimer = 0; } - void WaypointReached(uint32 uiPoint) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - uiWPHolder = uiPoint; + uiWPHolder = waypointId; - switch (uiPoint) + switch (waypointId) { case 4: SetEquipmentSlots(false, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE, EQUIP_ID_RIFLE); @@ -185,7 +190,6 @@ public: } else uiShootTimer -= diff; } }; - }; /*###### @@ -225,16 +229,15 @@ public: struct npc_defias_traitorAI : public npc_escortAI { - npc_defias_traitorAI(Creature* c) : npc_escortAI(c) { Reset(); } + npc_defias_traitorAI(Creature* creature) : npc_escortAI(creature) { Reset(); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { case 35: SetRun(false); @@ -244,13 +247,11 @@ public: break; case 44: DoScriptText(SAY_END, me, player); - { - if (player) - player->GroupEventHappens(QUEST_DEFIAS_BROTHERHOOD, me); - } + player->GroupEventHappens(QUEST_DEFIAS_BROTHERHOOD, me); break; } } + void EnterCombat(Unit* who) { DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2), me, who); @@ -258,7 +259,6 @@ public: void Reset() {} }; - }; void AddSC_westfall() diff --git a/src/server/scripts/EasternKingdoms/wetlands.cpp b/src/server/scripts/EasternKingdoms/wetlands.cpp index 3b196720242..bf28d9838a4 100644 --- a/src/server/scripts/EasternKingdoms/wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/wetlands.cpp @@ -67,14 +67,13 @@ public: m_bFriendSummoned = false; } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 2: if (me->HasStealthAura()) me->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); - SetRun(); me->setFaction(FACTION_ENEMY); break; @@ -132,7 +131,6 @@ public: } } }; - }; /*###### @@ -161,7 +159,6 @@ public: } return false; } - }; /*###### diff --git a/src/server/scripts/Examples/CMakeLists.txt b/src/server/scripts/Examples/CMakeLists.txt index 14002100713..dde6fe2c37c 100644 --- a/src/server/scripts/Examples/CMakeLists.txt +++ b/src/server/scripts/Examples/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/Examples/example_creature.cpp b/src/server/scripts/Examples/example_creature.cpp index f1b336f07f9..7f75a0fb481 100644 --- a/src/server/scripts/Examples/example_creature.cpp +++ b/src/server/scripts/Examples/example_creature.cpp @@ -90,7 +90,7 @@ class example_creature : public CreatureScript { // *** HANDLED FUNCTION *** //This is the constructor, called only once when the Creature is first created - example_creatureAI(Creature* c) : ScriptedAI(c) {} + example_creatureAI(Creature* creature) : ScriptedAI(creature) {} // *** CUSTOM VARIABLES **** //These variables are for use only by this individual script. @@ -271,10 +271,10 @@ class example_creature : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); //Set our faction to hostile towards all diff --git a/src/server/scripts/Examples/example_escort.cpp b/src/server/scripts/Examples/example_escort.cpp index cae09266b49..851a32538e9 100644 --- a/src/server/scripts/Examples/example_escort.cpp +++ b/src/server/scripts/Examples/example_escort.cpp @@ -75,9 +75,9 @@ class example_escort : public CreatureScript } // Pure Virtual Functions (Have to be implemented) - void WaypointReached(uint32 uiWP) + void WaypointReached(uint32 waypointId) { - switch (uiWP) + switch (waypointId) { case 1: DoScriptText(SAY_WP_1, me); @@ -123,9 +123,7 @@ class example_escort : public CreatureScript { // not a likely case, code here for the sake of example if (killer == me) - { DoScriptText(SAY_DEATH_1, me, player); - } else DoScriptText(SAY_DEATH_2, me, player); } @@ -197,12 +195,12 @@ class example_escort : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); npc_escortAI* pEscortAI = CAST_AI(example_escort::example_escortAI, creature->AI()); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); diff --git a/src/server/scripts/Examples/example_gossip_codebox.cpp b/src/server/scripts/Examples/example_gossip_codebox.cpp index c288123f117..6d57f1ac798 100644 --- a/src/server/scripts/Examples/example_gossip_codebox.cpp +++ b/src/server/scripts/Examples/example_gossip_codebox.cpp @@ -58,10 +58,10 @@ class example_gossip_codebox : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+2) { DoScriptText(SAY_NOT_INTERESTED, creature); player->CLOSE_GOSSIP_MENU(); @@ -70,12 +70,12 @@ class example_gossip_codebox : public CreatureScript return true; } - bool OnGossipSelectCode(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction, const char* code) + bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) { player->PlayerTalkClass->ClearMenus(); - if (uiSender == GOSSIP_SENDER_MAIN) + if (sender == GOSSIP_SENDER_MAIN) { - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: if (std::strcmp(code, player->GetName()) != 0) diff --git a/src/server/scripts/Examples/example_spell.cpp b/src/server/scripts/Examples/example_spell.cpp index 71dbd7f4fb0..70d7f43135c 100644 --- a/src/server/scripts/Examples/example_spell.cpp +++ b/src/server/scripts/Examples/example_spell.cpp @@ -92,7 +92,7 @@ class spell_ex_5581 : public SpellScriptLoader void HandleAfterCast() { - sLog->outString("All immediate actions for the spell are finished now"); + sLog->outString("All immediate Actions for the spell are finished now"); // this is a safe for triggering additional effects for a spell without interfering // with visuals or with other effects of the spell //GetCaster()->CastSpell(target, SPELL_TRIGGERED, true); @@ -102,7 +102,7 @@ class spell_ex_5581 : public SpellScriptLoader { // in this hook you can add additional requirements for spell caster (and throw a client error if reqs're not passed) // in this case we're disallowing to select non-player as a target of the spell - //if (!GetTargetUnit() || GetTargetUnit()->ToPlayer()) + //if (!GetExplTargetUnit() || GetExplTargetUnit()->ToPlayer()) //return SPELL_FAILED_BAD_TARGETS; return SPELL_CAST_OK; } diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index 3bfaa448b85..a86b2b8b17a 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -201,7 +201,7 @@ class npc_morridune : public CreatureScript public: npc_morridune() : CreatureScript("npc_morridune") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*Sender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); switch (action) @@ -236,9 +236,9 @@ public: Start(false, false, 0); } - void WaypointReached(uint32 uiPoint) + void WaypointReached(uint32 waypointId) { - switch (uiPoint) + switch (waypointId) { case 4: SetEscortPaused(true); diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index 9c68451122f..7f63c521594 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 6bc179bba40..85f82c62079 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -64,11 +64,10 @@ public: struct boss_anetheronAI : public hyjal_trashAI { - boss_anetheronAI(Creature* c) : hyjal_trashAI(c) + boss_anetheronAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; } uint32 SwarmTimer; @@ -76,7 +75,6 @@ public: uint32 AuraTimer; uint32 InfernoTimer; bool go; - uint32 pos; void Reset() { @@ -117,20 +115,19 @@ public: } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance) + if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } } - void JustDied(Unit* victim) + void JustDied(Unit* killer) { - hyjal_trashAI::JustDied(victim); + hyjal_trashAI::JustDied(killer); if (instance && IsEvent) instance->SetData(DATA_ANETHERONEVENT, DONE); DoPlaySoundToSet(me, SOUND_ONDEATH); @@ -248,9 +245,9 @@ public: struct mob_towering_infernalAI : public ScriptedAI { - mob_towering_infernalAI(Creature* c) : ScriptedAI(c) + mob_towering_infernalAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (instance) AnetheronGUID = instance->GetData64(DATA_ANETHERON); } @@ -275,7 +272,7 @@ public: { } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index a5239e5a649..f07aaaa1f2a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -86,9 +86,9 @@ public: struct mob_ancient_wispAI : public ScriptedAI { - mob_ancient_wispAI(Creature* c) : ScriptedAI(c) + mob_ancient_wispAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); ArchimondeGUID = 0; } @@ -108,13 +108,16 @@ public: void EnterCombat(Unit* /*who*/) {} - void DamageTaken(Unit* /*done_by*/, uint32 &damage) { damage = 0; } + void DamageTaken(Unit* /*done_by*/, uint32 &damage) + { + damage = 0; + } void UpdateAI(const uint32 diff) { if (CheckTimer <= diff) { - if (Unit* Archimonde = Unit::GetUnit((*me), ArchimondeGUID)) + if (Unit* Archimonde = Unit::GetUnit(*me, ArchimondeGUID)) { if (Archimonde->HealthBelowPct(2) || !Archimonde->isAlive()) DoCast(me, SPELL_DENOUEMENT_WISP); @@ -142,15 +145,18 @@ public: struct mob_doomfireAI : public ScriptedAI { - mob_doomfireAI(Creature* c) : ScriptedAI(c) {} + mob_doomfireAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { } void MoveInLineOfSight(Unit* /*who*/) {} void EnterCombat(Unit* /*who*/) {} - void DamageTaken(Unit* /*done_by*/, uint32 &damage) { damage = 0; } - }; + void DamageTaken(Unit* /*done_by*/, uint32 &damage) + { + damage = 0; + } + }; }; /* This is the script for the Doomfire Spirit Mob. This mob simply follow players or @@ -167,7 +173,7 @@ public: struct mob_doomfire_targettingAI : public ScriptedAI { - mob_doomfire_targettingAI(Creature* c) : ScriptedAI(c) {} + mob_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature) {} uint64 TargetGUID; uint32 ChangeTargetTimer; @@ -188,7 +194,10 @@ public: void EnterCombat(Unit* /*who*/) {} - void DamageTaken(Unit* /*done_by*/, uint32 &damage) { damage = 0; } + void DamageTaken(Unit* /*done_by*/, uint32 &damage) + { + damage = 0; + } void UpdateAI(const uint32 diff) { @@ -233,9 +242,9 @@ public: struct boss_archimondeAI : public hyjal_trashAI { - boss_archimondeAI(Creature* c) : hyjal_trashAI(c) + boss_archimondeAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -334,9 +343,9 @@ public: ++SoulChargeCount; } - void JustDied(Unit* victim) + void JustDied(Unit* killer) { - hyjal_trashAI::JustDied(victim); + hyjal_trashAI::JustDied(killer); DoScriptText(SAY_DEATH, me); if (instance) @@ -358,7 +367,7 @@ public: std::list::const_iterator itr = m_threatlist.begin(); for (; itr != m_threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->isAlive()) targets.push_back(unit); } @@ -635,7 +644,11 @@ public: DoMeleeAttackIfReady(); } - void WaypointReached(uint32 /*i*/){} + + void WaypointReached(uint32 /*waypointId*/) + { + + } }; }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index 2885276f2b6..a9e0c866ab9 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -55,11 +55,10 @@ public: struct boss_azgalorAI : public hyjal_trashAI { - boss_azgalorAI(Creature* c) : hyjal_trashAI(c) + boss_azgalorAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; } uint32 RainTimer; @@ -70,7 +69,6 @@ public: bool enraged; bool go; - uint32 pos; void Reset() { @@ -113,20 +111,19 @@ public: } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance) + if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } } - void JustDied(Unit* victim) + void JustDied(Unit* killer) { - hyjal_trashAI::JustDied(victim); + hyjal_trashAI::JustDied(killer); if (instance && IsEvent) instance->SetData(DATA_AZGALOREVENT, DONE); DoPlaySoundToSet(me, SOUND_ONDEATH); @@ -215,9 +212,9 @@ public: struct mob_lesser_doomguardAI : public hyjal_trashAI { - mob_lesser_doomguardAI(Creature* c) : hyjal_trashAI(c) + mob_lesser_doomguardAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (instance) AzgalorGUID = instance->GetData64(DATA_AZGALOR); } @@ -244,7 +241,7 @@ public: { } - void WaypointReached(uint32 /*i*/) + void WaypointReached(uint32 /*waypointId*/) { } @@ -254,7 +251,7 @@ public: AttackStart(who); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 7d1b292fd12..407faa19eaa 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -52,11 +52,10 @@ public: struct boss_kazrogalAI : public hyjal_trashAI { - boss_kazrogalAI(Creature* c) : hyjal_trashAI(c) + boss_kazrogalAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; } uint32 CleaveTimer; @@ -64,7 +63,6 @@ public: uint32 MarkTimer; uint32 MarkTimerBase; bool go; - uint32 pos; void Reset() { @@ -105,20 +103,19 @@ public: } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance) + if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } } - void JustDied(Unit* victim) + void JustDied(Unit* killer) { - hyjal_trashAI::JustDied(victim); + hyjal_trashAI::JustDied(killer); if (instance && IsEvent) instance->SetData(DATA_KAZROGALEVENT, DONE); DoPlaySoundToSet(me, SOUND_ONDEATH); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp index 3f39b61192a..5d7ee1fe194 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -58,11 +58,10 @@ public: struct boss_rage_winterchillAI : public hyjal_trashAI { - boss_rage_winterchillAI(Creature* c) : hyjal_trashAI(c) + boss_rage_winterchillAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; } uint32 FrostArmorTimer; @@ -70,7 +69,6 @@ public: uint32 NovaTimer; uint32 IceboltTimer; bool go; - uint32 pos; void Reset() { @@ -107,20 +105,19 @@ public: } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance) + if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } } - void JustDied(Unit* victim) + void JustDied(Unit* killer) { - hyjal_trashAI::JustDied(victim); + hyjal_trashAI::JustDied(killer); if (instance && IsEvent) instance->SetData(DATA_RAGEWINTERCHILLEVENT, DONE); DoPlaySoundToSet(me, SOUND_ONDEATH); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index 12485293650..22307468f14 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -50,11 +50,11 @@ class npc_jaina_proudmoore : public CreatureScript public: npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: ai->StartEvent(player); @@ -126,12 +126,12 @@ class npc_thrall : public CreatureScript public: npc_thrall() : CreatureScript("npc_thrall") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); ai->DeSpawnVeins();//despawn the alliance veins - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: ai->StartEvent(player); @@ -212,10 +212,10 @@ public: return ai; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); @@ -226,7 +226,6 @@ public: player->SendNewItem(item, 1, true, false, true); } player->SEND_GOSSIP_MENU(907, creature->GetGUID()); - CAST_AI(hyjalAI, creature->AI()); } return true; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index 107c9e8f2f9..2f6bbb7edb5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -310,9 +310,9 @@ float HordeFirePos[65][8]=//spawn points for the fire visuals (GO) in the horde {5545.43f, -2647.82f, 1483.05f, 5.38848f, 0, 0, 0.432578f, -0.901596f} }; -hyjalAI::hyjalAI(Creature* c) : npc_escortAI(c), Summons(me) +hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); VeinsSpawned[0] = false; VeinsSpawned[1] = false; for (uint8 i=0; i<14; ++i) @@ -492,7 +492,7 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) // Increment Enemy Count to be used in World States and instance script ++EnemyCount; - creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + creature->SetWalk(false); creature->setActive(true); switch (entry) { @@ -855,7 +855,7 @@ void hyjalAI::UpdateAI(const uint32 diff) { if (BossGUID[i]) { - Unit* unit = Unit::GetUnit((*me), BossGUID[i]); + Unit* unit = Unit::GetUnit(*me, BossGUID[i]); if (unit && (!unit->isAlive())) { if (BossGUID[i] == BossGUID[0]) @@ -896,9 +896,17 @@ void hyjalAI::UpdateAI(const uint32 diff) switch (Spells[i].TargetType) { - case TARGETTYPE_SELF: target = me; break; - case TARGETTYPE_RANDOM: target = SelectTarget(SELECT_TARGET_RANDOM, 0); break; - case TARGETTYPE_VICTIM: target = me->getVictim(); break; + case TARGETTYPE_SELF: + target = me; + break; + + case TARGETTYPE_RANDOM: + target = SelectTarget(SELECT_TARGET_RANDOM, 0); + break; + + case TARGETTYPE_VICTIM: + target = me->getVictim(); + break; } if (target && target->isAlive()) @@ -972,9 +980,9 @@ void hyjalAI::RespawnNearPos(float x, float y) cell.Visit(p, obj_worker, *me->GetMap(), *me, me->GetGridActivationRange()); } -void hyjalAI::WaypointReached(uint32 i) +void hyjalAI::WaypointReached(uint32 waypointId) { - if (i == 1 || (i == 0 && me->GetEntry() == THRALL)) + if (waypointId == 1 || (waypointId == 0 && me->GetEntry() == THRALL)) { me->MonsterYell(YELL_HURRY, 0, 0); WaitForTeleport = true; @@ -983,7 +991,7 @@ void hyjalAI::WaypointReached(uint32 i) DoCast(me, SPELL_MASS_TELEPORT, false); if (me->GetEntry() == THRALL && DummyGuid) { - Unit* Dummy = Unit::GetUnit((*me), DummyGuid); + Unit* Dummy = Unit::GetUnit(*me, DummyGuid); if (Dummy) { CAST_AI(hyjalAI, CAST_CRE(Dummy)->AI())->DoMassTeleport = true; @@ -1014,7 +1022,7 @@ void hyjalAI::WaypointReached(uint32 i) if ((*itr) && (*itr)->isAlive() && (*itr) != me && (*itr)->GetEntry() != JAINA) { if (!(*itr)->IsWithinDist(me, 60)) - (*itr)->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + (*itr)->SetWalk(false); float x, y, z; (*itr)->SetDefaultMovementType(IDLE_MOTION_TYPE); (*itr)->GetMotionMaster()->Initialize(); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h index d91c2ead123..b32288ca43a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h @@ -171,7 +171,7 @@ const Yells ThrallQuotes[]= struct hyjalAI : public npc_escortAI { - hyjalAI(Creature* c); + hyjalAI(Creature* creature); void Reset(); // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat @@ -196,7 +196,7 @@ struct hyjalAI : public npc_escortAI void SummonedCreatureDespawn(Creature* summoned); void HideNearPos(float x, float y); void RespawnNearPos(float x, float y); - void WaypointReached(uint32 i); + void WaypointReached(uint32 waypointId); void DoOverrun(uint32 faction, const uint32 diff); void MoveInLineOfSight(Unit* who); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index c94cb874bfa..840aa5de081 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -155,9 +155,9 @@ float HordeOverrunWP[21][3]=//waypoints in the horde base used in the end in the {5429.91f, -2718.44f, 1493.42f}//20 end 2 }; -hyjal_trashAI::hyjal_trashAI(Creature* c) : npc_escortAI(c) +hyjal_trashAI::hyjal_trashAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); IsEvent = false; Delay = 0; LastOverronPos = 0; @@ -377,10 +377,11 @@ void hyjal_trashAI::UpdateAI(const uint32 /*diff*/) } } -void hyjal_trashAI::JustDied(Unit* /*victim*/) +void hyjal_trashAI::JustDied(Unit* /*killer*/) { if (!instance) return; + if (IsEvent && !me->isWorldBoss()) instance->SetData(DATA_TRASH, 0);//signal trash is dead @@ -395,9 +396,9 @@ public: struct mob_giant_infernalAI : public hyjal_trashAI { - mob_giant_infernalAI(Creature* c) : hyjal_trashAI(c) + mob_giant_infernalAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); meteor = false;//call once! CanMove = false; Delay = rand()%30000; @@ -405,7 +406,6 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(MODEL_INVIS); go = false; - pos = 0; Reset(); } @@ -413,7 +413,6 @@ public: bool CanMove; bool WpEnabled; bool go; - uint32 pos; uint32 spawnTimer; uint32 FlameBuffetTimer; bool imol; @@ -427,14 +426,13 @@ public: void EnterCombat(Unit* /*who*/) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 0 && instance && !IsOverrun) + if (waypointId == 0 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } @@ -459,7 +457,7 @@ public: { trigger->SetVisible(false); trigger->setFaction(me->getFaction()); - trigger->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + trigger->SetDisableGravity(true); trigger->CastSpell(me, SPELL_METEOR, true); } me->GetMotionMaster()->Clear(); @@ -475,7 +473,7 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT) && !instance->GetData(DATA_HORDE_RETREAT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } else if (instance->GetData(DATA_ALLIANCE_RETREAT) && instance->GetData(DATA_HORDE_RETREAT)){ @@ -539,39 +537,38 @@ public: struct mob_abominationAI : public hyjal_trashAI { - mob_abominationAI(Creature* c) : hyjal_trashAI(c) + mob_abominationAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } bool go; uint32 KnockDownTimer; - uint32 pos; void Reset() { KnockDownTimer = 10000; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance && !IsOverrun) + if (waypointId == 7 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); - }else{ - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + } + else + { + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } } - if (i == LastOverronPos && IsOverrun) + if (waypointId == LastOverronPos && IsOverrun) { if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21)) { @@ -640,17 +637,15 @@ public: struct mob_ghoulAI : public hyjal_trashAI { - mob_ghoulAI(Creature* c) : hyjal_trashAI(c) + mob_ghoulAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } bool go; uint32 FrenzyTimer; - uint32 pos; uint32 MoveTimer; bool RandomMove; void Reset() @@ -660,23 +655,24 @@ public: RandomMove = false; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance && !IsOverrun) + if (waypointId == 7 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); - }else{ - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + } + else + { + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } } - if (i == LastOverronPos && IsOverrun) + if (waypointId == LastOverronPos && IsOverrun) { me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK_UNARMED); if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21)) @@ -684,7 +680,6 @@ public: me->setDeathState(DEAD); me->RemoveCorpse(); } - } } @@ -749,17 +744,17 @@ public: struct mob_necromancerAI : public hyjal_trashAI { - mob_necromancerAI(Creature* c) : hyjal_trashAI(c), summons(me) + mob_necromancerAI(Creature* creature) : hyjal_trashAI(creature), summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } + SummonList summons; bool go; uint32 ShadowBoltTimer; - uint32 pos; + void Reset() { ShadowBoltTimer = 1000+rand()%5000; @@ -773,19 +768,25 @@ public: summon->Attack(target, false); summons.Summon(summon); } - void SummonedCreatureDespawn(Creature* summon) {summons.Despawn(summon);} - void WaypointReached(uint32 i) + + void SummonedCreatureDespawn(Creature* summon) { - pos = i; - if (i == 7 && instance && !IsOverrun) + summons.Despawn(summon); + } + + void WaypointReached(uint32 waypointId) + { + if (waypointId == 7 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); - }else{ - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + } + else + { + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } @@ -815,8 +816,10 @@ public: void UpdateAI(const uint32 diff) { hyjal_trashAI::UpdateAI(diff); + if (IsEvent || IsOverrun) npc_escortAI::UpdateAI(diff); + if (IsEvent) { if (!go) @@ -840,8 +843,10 @@ public: } } } + if (!UpdateVictim()) return; + if (ShadowBoltTimer <= diff) { DoCast(me->getVictim(), SPELL_SHADOW_BOLT); @@ -870,11 +875,10 @@ public: struct mob_bansheeAI : public hyjal_trashAI { - mob_bansheeAI(Creature* c) : hyjal_trashAI(c) + mob_bansheeAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } @@ -882,7 +886,7 @@ public: uint32 CourseTimer; uint32 WailTimer; uint32 ShellTimer; - uint32 pos; + void Reset() { CourseTimer = 20000+rand()%5000; @@ -890,18 +894,19 @@ public: ShellTimer = 50000+rand()%10000; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance && !IsOverrun) + if (waypointId == 7 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); - }else{ - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + } + else + { + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } @@ -975,34 +980,34 @@ public: struct mob_crypt_fiendAI : public hyjal_trashAI { - mob_crypt_fiendAI(Creature* c) : hyjal_trashAI(c) + mob_crypt_fiendAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } bool go; uint32 WebTimer; - uint32 pos; + void Reset() { WebTimer = 20000+rand()%5000; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance && !IsOverrun) + if (waypointId == 7 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); - }else{ - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + } + else + { + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } @@ -1067,34 +1072,34 @@ public: struct mob_fel_stalkerAI : public hyjal_trashAI { - mob_fel_stalkerAI(Creature* c) : hyjal_trashAI(c) + mob_fel_stalkerAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } bool go; uint32 ManaBurnTimer; - uint32 pos; + void Reset() { ManaBurnTimer = 9000+rand()%5000; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 7 && instance && !IsOverrun) + if (waypointId == 7 && instance && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); - }else{ - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + } + else + { + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->isAlive()) me->AddThreat(target, 0.0f); } @@ -1159,32 +1164,29 @@ public: struct mob_frost_wyrmAI : public hyjal_trashAI { - mob_frost_wyrmAI(Creature* c) : hyjal_trashAI(c) + mob_frost_wyrmAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; Reset(); } bool go; uint32 FrostBreathTimer; - uint32 pos; uint32 MoveTimer; void Reset() { FrostBreathTimer = 5000; MoveTimer = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 2 && instance && !IsOverrun) + if (waypointId == 2 && instance && !IsOverrun) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) { me->AddThreat(target, 0.0f); @@ -1193,7 +1195,7 @@ public: } } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance && IsEvent) instance->SetData(DATA_TRASH, 0);//signal trash is dead @@ -1276,18 +1278,16 @@ public: struct mob_gargoyleAI : public hyjal_trashAI { - mob_gargoyleAI(Creature* c) : hyjal_trashAI(c) + mob_gargoyleAI(Creature* creature) : hyjal_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); go = false; - pos = 0; DummyTarget[0] = 0;DummyTarget[1] = 0;DummyTarget[2] = 0; Reset(); } bool go; uint32 StrikeTimer; - uint32 pos; uint32 MoveTimer; float Zpos; bool forcemove; @@ -1298,15 +1298,14 @@ public: Zpos = 10.0f; StrikeTimer = 2000+rand()%5000; MoveTimer = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - pos = i; - if (i == 2 && instance && !IsOverrun) + if (waypointId == 2 && instance && !IsOverrun) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_THRALL)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->isAlive()) { me->AddThreat(target, 0.0f); @@ -1315,14 +1314,14 @@ public: } } - void JustDied(Unit* victim) + void JustDied(Unit* killer) { float x, y, z; me->GetPosition(x, y, z); z = me->GetMap()->GetHeight(me->GetPhaseMask(), x, y, z); me->GetMotionMaster()->MovePoint(0, x, y, z); me->SetPosition(x, y, z, 0); - hyjal_trashAI::JustDied(victim); + hyjal_trashAI::JustDied(killer); } void UpdateAI(const uint32 diff) @@ -1382,8 +1381,9 @@ public: float x, y, z; me->getVictim()->GetPosition(x, y, z); me->GetMotionMaster()->MovePoint(0, x, y, z+Zpos); - Zpos-=1.0f; - if (Zpos <= 0)Zpos=0; + Zpos -= 1.0f; + if (Zpos <= 0) + Zpos = 0; MoveTimer = 2000; } else MoveTimer-=diff; } @@ -1416,14 +1416,14 @@ public: struct alliance_riflemanAI : public Scripted_NoMovementAI { - alliance_riflemanAI(Creature* c) : Scripted_NoMovementAI(c) + alliance_riflemanAI(Creature* creature) : Scripted_NoMovementAI(creature) { Reset(); } uint32 ExplodeTimer; - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h index 047c0dc308e..cb994167641 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h @@ -25,7 +25,7 @@ struct hyjal_trashAI : public npc_escortAI { - hyjal_trashAI(Creature* c); + hyjal_trashAI(Creature* creature); void UpdateAI(const uint32 diff); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index b87379d599f..ad8ebdb370a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -110,7 +110,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -175,17 +176,23 @@ public: { switch (type) { - case DATA_RAGEWINTERCHILLEVENT: m_auiEncounter[0] = data; break; + case DATA_RAGEWINTERCHILLEVENT: + m_auiEncounter[0] = data; + break; case DATA_ANETHERONEVENT: m_auiEncounter[1] = data; break; - case DATA_KAZROGALEVENT: m_auiEncounter[2] = data; break; + case DATA_KAZROGALEVENT: + m_auiEncounter[2] = data; + break; case DATA_AZGALOREVENT: { m_auiEncounter[3] = data; if (data == DONE) { - if (ArchiYell)break; + if (ArchiYell) + break; + ArchiYell = true; Creature* creature = instance->GetCreature(Azgalor); @@ -219,12 +226,17 @@ public: } } break; - case DATA_ARCHIMONDEEVENT: m_auiEncounter[4] = data; break; - case DATA_RESET_TRASH_COUNT: Trash = 0; break; - + case DATA_ARCHIMONDEEVENT: + m_auiEncounter[4] = data; + break; + case DATA_RESET_TRASH_COUNT: + Trash = 0; + break; case DATA_TRASH: - if (data) Trash = data; - else Trash--; + if (data) + Trash = data; + else + Trash--; DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, Trash); break; case TYPE_RETREAT: diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp index 35c1848456b..b2853f25a33 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp @@ -60,9 +60,9 @@ public: struct boss_epochAI : public ScriptedAI { - boss_epochAI(Creature* c) : ScriptedAI(c) + boss_epochAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint8 uiStep; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp index 7947c9be48d..ccf60f9bd0b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp @@ -43,9 +43,9 @@ public: struct boss_infinite_corruptorAI : public ScriptedAI { - boss_infinite_corruptorAI(Creature* c) : ScriptedAI(c) + boss_infinite_corruptorAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp index b61838a253a..a038a06f815 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -77,9 +77,9 @@ public: struct boss_mal_ganisAI : public ScriptedAI { - boss_mal_ganisAI(Creature* c) : ScriptedAI(c) + boss_mal_ganisAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiCarrionSwarmTimer; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index c36b98ed510..d5dd597960f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -57,9 +57,9 @@ public: struct boss_meathookAI : public ScriptedAI { - boss_meathookAI(Creature* c) : ScriptedAI(c) + boss_meathookAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (instance) DoScriptText(SAY_SPAWN, me); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp index 7a5e0d06158..7828d172e1e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp @@ -66,9 +66,9 @@ public: struct boss_salrammAI : public ScriptedAI { - boss_salrammAI(Creature* c) : ScriptedAI(c) + boss_salrammAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (instance) DoScriptText(SAY_SPAWN, me); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 9518abd1635..6454083e424 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -446,9 +446,9 @@ public: ++uiStep; } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 0: case 1: @@ -591,11 +591,11 @@ public: } //After waypoint 0 case 1: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); if (Unit* pUther = me->SummonCreature(NPC_UTHER, 1794.357f, 1272.183f, 140.558f, 1.37f, TEMPSUMMON_DEAD_DESPAWN, 180000)) { uiUtherGUID = pUther->GetGUID(); - pUther->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + pUther->SetWalk(false); pUther->GetMotionMaster()->MovePoint(0, 1897.018f, 1287.487f, 143.481f); pUther->SetTarget(me->GetGUID()); me->SetTarget(uiUtherGUID); @@ -680,7 +680,7 @@ public: case 17: if (Creature* pUther = Unit::GetCreature(*me, uiUtherGUID)) { - pUther->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pUther->SetWalk(true); pUther->GetMotionMaster()->MovePoint(0, 1794.357f, 1272.183f, 140.558f); } JumpToNextStep(1000); @@ -689,7 +689,7 @@ public: if (Creature* pJaina = Unit::GetCreature(*me, uiJainaGUID)) { me->SetTarget(uiJainaGUID); - pJaina->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pJaina->SetWalk(true); pJaina->GetMotionMaster()->MovePoint(0, 1794.357f, 1272.183f, 140.558f); } JumpToNextStep(1000); @@ -755,7 +755,7 @@ public: if (Creature* pCityman = Unit::GetCreature(*me, uiCitymenGUID[0])) { pCityman->SetTarget(me->GetGUID()); - pCityman->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pCityman->SetWalk(true); pCityman->GetMotionMaster()->MovePoint(0, 2088.625f, 1279.191f, 140.743f); } JumpToNextStep(2000); @@ -929,7 +929,7 @@ public: if (Unit* pBoss = me->SummonCreature(uiBossID, 2232.19f, 1331.933f, 126.662f, 3.15f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000)) { uiBossGUID = pBoss->GetGUID(); - pBoss->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pBoss->SetWalk(true); pBoss->GetMotionMaster()->MovePoint(0, 2194.110f, 1332.00f, 130.00f); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp index 9a91e1e232b..b232cae4657 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp @@ -16,6 +16,7 @@ */ #include "ScriptPCH.h" +#include "CreatureTextMgr.h" #include "culling_of_stratholme.h" #define MAX_ENCOUNTER 5 diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp index b895b56379c..5b47c2ee07d 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp @@ -55,9 +55,9 @@ public: struct boss_aeonusAI : public ScriptedAI { - boss_aeonusAI(Creature* c) : ScriptedAI(c) + boss_aeonusAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -93,7 +93,7 @@ public: ScriptedAI::MoveInLineOfSight(who); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp index 99e43495c96..a4e805b3b75 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp @@ -55,9 +55,9 @@ public: struct boss_chrono_lord_dejaAI : public ScriptedAI { - boss_chrono_lord_dejaAI(Creature* c) : ScriptedAI(c) + boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -100,7 +100,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp index 9b272491717..f59c9f0ef4c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp @@ -54,9 +54,9 @@ public: struct boss_temporusAI : public ScriptedAI { - boss_temporusAI(Creature* c) : ScriptedAI(c) + boss_temporusAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -84,7 +84,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp index 4ff34fc3349..c2a41cb29d1 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp @@ -68,9 +68,9 @@ public: struct npc_medivh_bmAI : public ScriptedAI { - npc_medivh_bmAI(Creature* c) : ScriptedAI(c) + npc_medivh_bmAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -111,7 +111,7 @@ public: instance->SetData(TYPE_MEDIVH, IN_PROGRESS); DoCast(me, SPELL_CHANNEL, false); Check_Timer = 5000; - } + } else if (who->GetTypeId() == TYPEID_UNIT && me->IsWithinDistInMap(who, 15.0f)) { if (instance->GetData(TYPE_MEDIVH) != IN_PROGRESS) @@ -153,9 +153,9 @@ public: SpellCorrupt_Timer = 3000; } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { - if (Killer->GetEntry() == me->GetEntry()) + if (killer->GetEntry() == me->GetEntry()) return; DoScriptText(SAY_DEATH, me); @@ -170,7 +170,7 @@ public: { if (SpellCorrupt_Timer <= diff) { - instance->SetData(TYPE_MEDIVH, SPECIAL); + instance->SetData(TYPE_MEDIVH, SPECIAL); if (me->HasAura(SPELL_CORRUPT_AEONUS)) SpellCorrupt_Timer = 1000; @@ -261,9 +261,9 @@ public: struct npc_time_riftAI : public ScriptedAI { - npc_time_riftAI(Creature* c) : ScriptedAI(c) + npc_time_riftAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -318,11 +318,11 @@ public: void DoSelectSummon() { - uint32 entry = 0; - if ((mRiftWaveCount > 2 && mWaveId < 1) || mRiftWaveCount > 3) mRiftWaveCount = 0; + uint32 entry = 0; + entry = PortalWaves[mWaveId].PortalMob[mRiftWaveCount]; sLog->outDebug(LOG_FILTER_TSCR, "TSCR: npc_time_rift: summoning wave Creature (Wave %u, Entry %u).", mRiftWaveCount, entry); @@ -370,10 +370,10 @@ class npc_saat : public CreatureScript public: npc_saat() : CreatureScript("npc_saat") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, SPELL_CHRONO_BEACON, false); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp index dabf3db13cb..2c8cd096644 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp @@ -116,9 +116,9 @@ public: DoUpdateWorldState(WORLD_STATE_BM_RIFT, 0); } - bool IsEncounterInProgress() + bool IsEncounterInProgress() const { - if (GetData(TYPE_MEDIVH) == IN_PROGRESS) + if (const_cast(this)->GetData(TYPE_MEDIVH) == IN_PROGRESS) return true; return false; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp index 89877f2cc7b..c27507cdcec 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -52,9 +52,9 @@ public: struct boss_captain_skarlocAI : public ScriptedAI { - boss_captain_skarlocAI(Creature* c) : ScriptedAI(c) + boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -88,7 +88,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp index 8307eb44013..82bd0a9e9be 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp @@ -54,9 +54,9 @@ public: struct boss_epoch_hunterAI : public ScriptedAI { - boss_epoch_hunterAI(Creature* c) : ScriptedAI(c) + boss_epoch_hunterAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -84,7 +84,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp index 1f0ba93645f..45825a81eb2 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -36,9 +36,9 @@ class go_barrel_old_hillsbrad : public GameObjectScript public: go_barrel_old_hillsbrad() : GameObjectScript("go_barrel_old_hillsbrad") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - if (InstanceScript* instance = pGO->GetInstanceScript()) + if (InstanceScript* instance = go->GetInstanceScript()) { if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE) return false; @@ -111,7 +111,7 @@ public: struct boss_lieutenant_drakeAI : public ScriptedAI { - boss_lieutenant_drakeAI(Creature* c) : ScriptedAI(c) {} + boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature) {} bool CanPatrol; uint32 wpId; @@ -142,7 +142,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index aa57b3d9499..7d9da6771dc 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -51,10 +51,10 @@ class npc_erozion : public CreatureScript public: npc_erozion() : CreatureScript("npc_erozion") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1); @@ -64,7 +64,7 @@ public: } player->SEND_GOSSIP_MENU(9515, creature->GetGUID()); } - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+2) { player->CLOSE_GOSSIP_MENU(); } @@ -198,11 +198,11 @@ public: return new npc_thrall_old_hillsbradAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); InstanceScript* instance = creature->GetInstanceScript(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -282,9 +282,9 @@ public: struct npc_thrall_old_hillsbradAI : public npc_escortAI { - npc_thrall_old_hillsbradAI(Creature* c) : npc_escortAI(c) + npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); HadMount = false; me->setActive(true); } @@ -296,12 +296,12 @@ public: bool LowHp; bool HadMount; - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { if (!instance) return; - switch (i) + switch (waypointId) { case 8: SetRun(false); @@ -401,7 +401,7 @@ public: SetRun(); break; case 91: - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); SetRun(false); break; case 93: @@ -413,7 +413,7 @@ public: case 94: if (uint64 TarethaGUID = instance->GetData64(DATA_TARETHA)) { - if (Unit* Taretha = Unit::GetUnit((*me), TarethaGUID)) + if (Unit* Taretha = Unit::GetUnit(*me, TarethaGUID)) DoScriptText(SAY_TA_ESCAPED, Taretha, me); } break; @@ -433,7 +433,6 @@ public: //trigger epoch Yell("Thrall! Come outside and face your fate! ....") //from here, thrall should not never be allowed to move to point 106 which he currently does. break; - case 106: { //trigger taretha to run down outside @@ -581,16 +580,16 @@ public: return new npc_tarethaAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); InstanceScript* instance = creature->GetInstanceScript(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); player->SEND_GOSSIP_MENU(GOSSIP_ID_EPOCH2, creature->GetGUID()); } - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+2) { player->CLOSE_GOSSIP_MENU(); @@ -624,16 +623,16 @@ public: struct npc_tarethaAI : public npc_escortAI { - npc_tarethaAI(Creature* c) : npc_escortAI(c) + npc_tarethaAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { case 6: DoScriptText(SAY_TA_FREE, me); @@ -643,6 +642,7 @@ public: break; } } + void Reset() {} void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp index 38d9ce31563..d7043965271 100644 --- a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp +++ b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp @@ -59,7 +59,7 @@ public: void EnterCombat(Unit* /*who*/) { } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { me->SummonCreature(13716, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 600000); } diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 3b42fc3ed7b..6e6e089ba02 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -114,11 +114,11 @@ public: { boss_onyxiaAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); Reset(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; uint32 m_uiPhase; @@ -169,11 +169,11 @@ public: m_uiSummonWhelpCount = 0; m_bIsMoving = false; - if (m_instance) + if (instance) { - m_instance->SetData(DATA_ONYXIA, NOT_STARTED); - m_instance->SetData(DATA_ONYXIA_PHASE, m_uiPhase); - m_instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->SetData(DATA_ONYXIA, NOT_STARTED); + instance->SetData(DATA_ONYXIA_PHASE, m_uiPhase); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } } @@ -182,17 +182,17 @@ public: DoScriptText(SAY_AGGRO, me); me->SetInCombatWithZone(); - if (m_instance) + if (instance) { - m_instance->SetData(DATA_ONYXIA, IN_PROGRESS); - m_instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->SetData(DATA_ONYXIA, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } } void JustDied(Unit* /*killer*/) { - if (m_instance) - m_instance->SetData(DATA_ONYXIA, DONE); + if (instance) + instance->SetData(DATA_ONYXIA, DONE); Summons.DespawnAll(); } @@ -261,12 +261,12 @@ public: m_uiBellowingRoarTimer = 1000; break; case 10: - me->SetFlying(true); + me->SetCanFly(true); me->GetMotionMaster()->MovePoint(11, Phase2Location.GetPositionX(), Phase2Location.GetPositionY(), Phase2Location.GetPositionZ()+25); me->SetSpeed(MOVE_FLIGHT, 1.0f); DoScriptText(SAY_PHASE_2_TRANS, me); - if (m_instance) - m_instance->SetData(DATA_ONYXIA_PHASE, m_uiPhase); + if (instance) + instance->SetData(DATA_ONYXIA_PHASE, m_uiPhase); m_uiWhelpTimer = 5000; m_uiLairGuardTimer = 15000; break; @@ -301,9 +301,9 @@ public: (pSpell->Id >= 22267 && pSpell->Id <= 22268)) && (target->GetTypeId() == TYPEID_PLAYER)) { - if (m_instance) + if (instance) { - m_instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL); + instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL); } } } @@ -362,8 +362,8 @@ public: Trinity::GameObjectInRangeCheck check(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 15); Trinity::GameObjectLastSearcher searcher(me, pFloor, check); me->VisitNearbyGridObject(30, searcher); - if (m_instance && pFloor) - m_instance->SetData64(DATA_FLOOR_ERUPTION_GUID, pFloor->GetGUID()); + if (instance && pFloor) + instance->SetData64(DATA_FLOOR_ERUPTION_GUID, pFloor->GetGUID()); m_uiBellowingRoarTimer = 30000; } else @@ -409,12 +409,12 @@ public: if (HealthBelowPct(40)) { m_uiPhase = PHASE_END; - if (m_instance) - m_instance->SetData(DATA_ONYXIA_PHASE, m_uiPhase); + if (instance) + instance->SetData(DATA_ONYXIA_PHASE, m_uiPhase); DoScriptText(SAY_PHASE_3_TRANS, me); SetCombatMovement(true); - me->SetFlying(false); + me->SetCanFly(false); m_bIsMoving = false; me->GetMotionMaster()->MovePoint(9, me->GetHomePosition()); return; diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp index d0da864809c..bda5267713d 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp @@ -48,7 +48,7 @@ public: struct boss_amnennar_the_coldbringerAI : public ScriptedAI { - boss_amnennar_the_coldbringerAI(Creature* c) : ScriptedAI(c) {} + boss_amnennar_the_coldbringerAI(Creature* creature) : ScriptedAI(creature) {} uint32 AmnenarsWrath_Timer; uint32 FrostBolt_Timer; diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index ac9bf524e7a..b84ecea4de3 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -52,16 +52,16 @@ class npc_henry_stern : public CreatureScript public: npc_henry_stern() : CreatureScript("npc_henry_stern") { } - bool OnGossipSelect (Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { player->CastSpell(player, SPELL_TEACHING_GOLDTHORN_TEA, true); player->SEND_GOSSIP_MENU(GOSSIP_TEXT_TEA_ANSWER, creature->GetGUID()); } - if (uiAction == GOSSIP_ACTION_INFO_DEF + 2) + if (action == GOSSIP_ACTION_INFO_DEF + 2) { player->CastSpell(player, SPELL_TEACHING_MIGHTY_TROLLS_BLOOD_POTION, true); player->SEND_GOSSIP_MENU(GOSSIP_TEXT_POTION_ANSWER, creature->GetGUID()); @@ -70,7 +70,7 @@ public: return true; } - bool OnGossipHello (Player* player, Creature* creature) + bool OnGossipHello(Player* player, Creature* creature) { if (player->GetBaseSkillValue(SKILL_COOKING) >= 175 && !player->HasSpell(SPELL_GOLDTHORN_TEA)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -81,7 +81,6 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -93,10 +92,10 @@ class go_gong : public GameObjectScript public: go_gong() : GameObjectScript("go_gong") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { //basic support, not blizzlike data is missing... - InstanceScript* instance = pGO->GetInstanceScript(); + InstanceScript* instance = go->GetInstanceScript(); if (instance) { diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp index 1bc0a3b7a19..43e3fe6efdd 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -70,57 +70,56 @@ public: struct npc_willixAI : public npc_escortAI { - npc_willixAI(Creature* c) : npc_escortAI(c) {} + npc_willixAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 3: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - DoScriptText(SAY_POINT, me, player); - break; - case 4: - me->SummonCreature(ENTRY_BOAR, 2137.66f, 1843.98f, 48.08f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 8: - DoScriptText(SAY_BLUELEAF, me, player); - break; - case 9: - DoScriptText(SAY_DANGER, me, player); - break; - case 13: - DoScriptText(SAY_BAD, me, player); - break; - case 14: - me->SummonCreature(ENTRY_BOAR, 2078.91f, 1704.54f, 56.77f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 25: - DoScriptText(SAY_THINK, me, player); - break; - case 31: - DoScriptText(SAY_SOON, me, player); - break; - case 42: - DoScriptText(SAY_FINALY, me, player); - break; - case 43: - me->SummonCreature(ENTRY_BOAR, 1956.43f, 1596.97f, 81.75f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 45: - DoScriptText(SAY_WIN, me, player); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - if (player && player->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(player)->GroupEventHappens(QUEST_WILLIX_THE_IMPORTER, me); - break; - case 46: - DoScriptText(SAY_END, me, player); - break; + case 3: + me->HandleEmoteCommand(EMOTE_STATE_POINT); + DoScriptText(SAY_POINT, me, player); + break; + case 4: + me->SummonCreature(ENTRY_BOAR, 2137.66f, 1843.98f, 48.08f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 8: + DoScriptText(SAY_BLUELEAF, me, player); + break; + case 9: + DoScriptText(SAY_DANGER, me, player); + break; + case 13: + DoScriptText(SAY_BAD, me, player); + break; + case 14: + me->SummonCreature(ENTRY_BOAR, 2078.91f, 1704.54f, 56.77f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 25: + DoScriptText(SAY_THINK, me, player); + break; + case 31: + DoScriptText(SAY_SOON, me, player); + break; + case 42: + DoScriptText(SAY_FINALY, me, player); + break; + case 43: + me->SummonCreature(ENTRY_BOAR, 1956.43f, 1596.97f, 81.75f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 45: + DoScriptText(SAY_WIN, me, player); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + if (player->GetTypeId() == TYPEID_PLAYER) + CAST_PLR(player)->GroupEventHappens(QUEST_WILLIX_THE_IMPORTER, me); + break; + case 46: + DoScriptText(SAY_END, me, player); + break; } } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index a290b07e60f..18a77519ba2 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -147,7 +147,7 @@ class boss_moam : public CreatureScript targetList.push_back((*itr)->getTarget()); } - Trinity::RandomResizeList(targetList, 5); + Trinity::Containers::RandomResizeList(targetList, 5); for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) DoCast(*itr, SPELL_DRAIN_MANA); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index eaeec50ef7b..36b1871c96e 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -49,9 +49,9 @@ public: struct boss_kriAI : public ScriptedAI { - boss_kriAI(Creature* c) : ScriptedAI(c) + boss_kriAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -146,9 +146,9 @@ public: struct boss_vemAI : public ScriptedAI { - boss_vemAI(Creature* c) : ScriptedAI(c) + boss_vemAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -168,7 +168,7 @@ public: Enraged = false; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -239,9 +239,9 @@ public: struct boss_yaujAI : public ScriptedAI { - boss_yaujAI(Creature* c) : ScriptedAI(c) + boss_yaujAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -261,7 +261,7 @@ public: VemDead = false; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -303,8 +303,8 @@ public: { if (instance) { - Unit* pKri = Unit::GetUnit((*me), instance->GetData64(DATA_KRI)); - Unit* pVem = Unit::GetUnit((*me), instance->GetData64(DATA_VEM)); + Unit* pKri = Unit::GetUnit(*me, instance->GetData64(DATA_KRI)); + Unit* pVem = Unit::GetUnit(*me, instance->GetData64(DATA_VEM)); switch (urand(0, 2)) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index a6409ca056f..11efccd14b7 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -176,9 +176,9 @@ public: struct eye_of_cthunAI : public Scripted_NoMovementAI { - eye_of_cthunAI(Creature* c) : Scripted_NoMovementAI(c) + eye_of_cthunAI(Creature* creature) : Scripted_NoMovementAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (!instance) sLog->outError("TSCR: No Instance eye_of_cthunAI"); } @@ -480,11 +480,11 @@ public: struct cthunAI : public Scripted_NoMovementAI { - cthunAI(Creature* c) : Scripted_NoMovementAI(c) + cthunAI(Creature* creature) : Scripted_NoMovementAI(creature) { SetCombatMovement(false); - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (!instance) sLog->outError("TSCR: No Instance eye_of_cthunAI"); } @@ -607,7 +607,8 @@ public: if (WisperTimer <= diff) { Map* map = me->GetMap(); - if (!map->IsDungeon()) return; + if (!map->IsDungeon()) + return; //Play random sound to the zone Map::PlayerList const &PlayerList = map->GetPlayers(); @@ -935,7 +936,7 @@ public: struct eye_tentacleAI : public Scripted_NoMovementAI { - eye_tentacleAI(Creature* c) : Scripted_NoMovementAI(c) + eye_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature) { if (Creature* pPortal = me->SummonCreature(MOB_SMALL_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN)) { @@ -948,7 +949,7 @@ public: uint32 KillSelfTimer; uint64 Portal; - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Unit* p = Unit::GetUnit(*me, Portal)) p->Kill(p); @@ -1008,7 +1009,7 @@ public: struct claw_tentacleAI : public Scripted_NoMovementAI { - claw_tentacleAI(Creature* c) : Scripted_NoMovementAI(c) + claw_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature) { SetCombatMovement(false); @@ -1024,7 +1025,7 @@ public: uint32 EvadeTimer; uint64 Portal; - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Unit* p = Unit::GetUnit(*me, Portal)) p->Kill(p); @@ -1118,7 +1119,7 @@ public: struct giant_claw_tentacleAI : public Scripted_NoMovementAI { - giant_claw_tentacleAI(Creature* c) : Scripted_NoMovementAI(c) + giant_claw_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature) { SetCombatMovement(false); @@ -1135,7 +1136,7 @@ public: uint32 EvadeTimer; uint64 Portal; - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Unit* p = Unit::GetUnit(*me, Portal)) p->Kill(p); @@ -1237,7 +1238,7 @@ public: struct giant_eye_tentacleAI : public Scripted_NoMovementAI { - giant_eye_tentacleAI(Creature* c) : Scripted_NoMovementAI(c) + giant_eye_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature) { SetCombatMovement(false); @@ -1251,7 +1252,7 @@ public: uint32 BeamTimer; uint64 Portal; - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Unit* p = Unit::GetUnit(*me, Portal)) p->Kill(p); @@ -1301,7 +1302,7 @@ public: struct flesh_tentacleAI : public Scripted_NoMovementAI { - flesh_tentacleAI(Creature* c) : Scripted_NoMovementAI(c) + flesh_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature) { SetCombatMovement(false); } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp index 9ccff0bff48..613bc91182b 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp @@ -49,7 +49,7 @@ public: struct boss_fankrissAI : public ScriptedAI { - boss_fankrissAI(Creature* c) : ScriptedAI(c) {} + boss_fankrissAI(Creature* creature) : ScriptedAI(creature) {} uint32 MortalWound_Timer; uint32 SpawnHatchlings_Timer; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index c0ccd55f219..53fac3ee3ec 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -47,7 +47,7 @@ public: struct boss_huhuranAI : public ScriptedAI { - boss_huhuranAI(Creature* c) : ScriptedAI(c) {} + boss_huhuranAI(Creature* creature) : ScriptedAI(creature) {} uint32 Frenzy_Timer; uint32 Wyvern_Timer; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index b0e5112aa6b..81205780e7d 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -45,7 +45,7 @@ public: struct boss_ouroAI : public ScriptedAI { - boss_ouroAI(Creature* c) : ScriptedAI(c) {} + boss_ouroAI(Creature* creature) : ScriptedAI(creature) {} uint32 Sweep_Timer; uint32 SandBlast_Timer; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp index 4d5aff16770..8c6c0fa0ad0 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp @@ -49,7 +49,7 @@ public: struct boss_sarturaAI : public ScriptedAI { - boss_sarturaAI(Creature* c) : ScriptedAI(c) {} + boss_sarturaAI(Creature* creature) : ScriptedAI(creature) {} uint32 WhirlWind_Timer; uint32 WhirlWindRandom_Timer; @@ -84,7 +84,7 @@ public: DoScriptText(SAY_AGGRO, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } @@ -192,7 +192,7 @@ public: struct mob_sartura_royal_guardAI : public ScriptedAI { - mob_sartura_royal_guardAI(Creature* c) : ScriptedAI(c) {} + mob_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature) {} uint32 WhirlWind_Timer; uint32 WhirlWindRandom_Timer; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp index 7f3c19ac69c..4df4bf73330 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp @@ -63,7 +63,7 @@ public: struct boss_skeramAI : public ScriptedAI { - boss_skeramAI(Creature* c) : ScriptedAI(c) + boss_skeramAI(Creature* creature) : ScriptedAI(creature) { IsImage = false; } @@ -105,7 +105,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (!IsImage) DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index b03d2dc3a4a..abaab9d830e 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -61,9 +61,9 @@ EndScriptData */ struct boss_twinemperorsAI : public ScriptedAI { - boss_twinemperorsAI(Creature* c): ScriptedAI(c) + boss_twinemperorsAI(Creature* creature): ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -120,7 +120,7 @@ struct boss_twinemperorsAI : public ScriptedAI } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { Creature* pOtherBoss = GetOtherBoss(); if (pOtherBoss) @@ -393,7 +393,7 @@ public: struct boss_veknilashAI : public boss_twinemperorsAI { bool IAmVeklor() {return false;} - boss_veknilashAI(Creature* c) : boss_twinemperorsAI(c) {} + boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature) {} uint32 UpperCut_Timer; uint32 UnbalancingStrike_Timer; @@ -479,7 +479,7 @@ public: struct boss_veklorAI : public boss_twinemperorsAI { bool IAmVeklor() {return true;} - boss_veklorAI(Creature* c) : boss_twinemperorsAI(c) {} + boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature) {} uint32 ShadowBolt_Timer; uint32 Blizzard_Timer; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp index 38ea8e8748b..f1cc0b401c3 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp @@ -117,7 +117,7 @@ public: return 0; } - uint64 GetData64 (uint32 identifier) + uint64 GetData64(uint32 identifier) { switch (identifier) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp index 45e9797328e..556247d85af 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp @@ -86,7 +86,7 @@ public: } } - aqsentinelAI(Creature* c) : ScriptedAI(c) + aqsentinelAI(Creature* creature) : ScriptedAI(creature) { ClearBuddyList(); abselected = 0; // just initialization of variable @@ -242,7 +242,7 @@ public: DoZoneInCombat(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { for (int ni=0; ni<3; ++ni) { diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index 8eb3d20d528..7e93cc7e4c7 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -85,11 +85,11 @@ public: return new npc_disciple_of_naralexAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); InstanceScript* instance = creature->GetInstanceScript(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { player->CLOSE_GOSSIP_MENU(); if (instance) @@ -136,9 +136,9 @@ public: struct npc_disciple_of_naralexAI : public npc_escortAI { - npc_disciple_of_naralexAI(Creature* c) : npc_escortAI(c) + npc_disciple_of_naralexAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); eventTimer = 0; currentEvent = 0; eventProgress = 0; @@ -151,35 +151,35 @@ public: uint32 eventProgress; InstanceScript* instance; - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { if (!instance) return; - switch (i) + switch (waypointId) { case 4: eventProgress = 1; currentEvent = TYPE_NARALEX_PART1; instance->SetData(TYPE_NARALEX_PART1, IN_PROGRESS); - break; + break; case 5: DoScriptText(SAY_MUST_CONTINUE, me); instance->SetData(TYPE_NARALEX_PART1, DONE); - break; + break; case 11: eventProgress = 1; currentEvent = TYPE_NARALEX_PART2; instance->SetData(TYPE_NARALEX_PART2, IN_PROGRESS); - break; + break; case 19: DoScriptText(SAY_BEYOND_THIS_CORRIDOR, me); - break; + break; case 24: eventProgress = 1; currentEvent = TYPE_NARALEX_PART3; instance->SetData(TYPE_NARALEX_PART3, IN_PROGRESS); - break; + break; } } @@ -315,7 +315,7 @@ public: eventTimer = 3000; if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX))) { - AchievementEntry const* AchievWC = GetAchievementStore()->LookupEntry(ACHIEVEMENT_WAILING_CAVERNS); + AchievementEntry const* AchievWC = sAchievementStore.LookupEntry(ACHIEVEMENT_WAILING_CAVERNS); if (AchievWC) { Map* map = me->GetMap(); diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp index 33a2ce73e21..b6c69584358 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp @@ -301,14 +301,15 @@ public: { if (npc->isAlive()) { - npc->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + npc->SetWalk(true); npc->GetMotionMaster()->MovePoint(1, x, y, z); npc->SetHomePosition(x, y, z, o); } } } - void SpawnPyramidWave(uint32 wave){ + void SpawnPyramidWave(uint32 wave) + { for (int i = 0; i < pyramidSpawnTotal; i++) { if (pyramidSpawns[i][0] == (float)wave) @@ -321,7 +322,8 @@ public: } } - bool IsWaveAllDead(){ + bool IsWaveAllDead() + { for (std::list::iterator itr = addsAtBase.begin(); itr != addsAtBase.end(); ++itr) { if (Creature* add = instance->GetCreature((*itr))) diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index 61fe526407c..9e3d9240321 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -61,10 +61,10 @@ class npc_sergeant_bly : public CreatureScript public: npc_sergeant_bly() : CreatureScript("npc_sergeant_bly") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); CAST_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID(); @@ -199,18 +199,6 @@ public: +## go_troll_cage +######*/ -void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) -{ - if (Creature* crew = instance->instance->GetCreature(instance->GetData64(entry))) - { - crew->SetReactState(REACT_AGGRESSIVE); - crew->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - crew->SetHomePosition(x, y, z, 0); - crew->GetMotionMaster()->MovePoint(1, x, y, z); - crew->setFaction(FACTION_FREED); - } -} - class go_troll_cage : public GameObjectScript { public: @@ -231,6 +219,18 @@ public: return false; } +private: + void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) + { + if (Creature* crew = instance->instance->GetCreature(instance->GetData64(entry))) + { + crew->SetReactState(REACT_AGGRESSIVE); + crew->SetWalk(true); + crew->SetHomePosition(x, y, z, 0); + crew->GetMotionMaster()->MovePoint(1, x, y, z); + crew->setFaction(FACTION_FREED); + } + } }; /*###### @@ -258,10 +258,10 @@ class npc_weegli_blastfuse : public CreatureScript public: npc_weegli_blastfuse() : CreatureScript("npc_weegli_blastfuse") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); //here we make him run to door, set the charge and run away off to nowhere @@ -322,7 +322,7 @@ public: AttackStartCaster(victim, 10);//keep back & toss bombs/shoot } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { /*if (instance) instance->SetData(0, DONE);*/ @@ -399,9 +399,9 @@ public: enum { - ZOMBIE = 7286, - DEAD_HERO = 7276, - ZOMBIE_CHANCE = 65, + ZOMBIE = 7286, + DEAD_HERO = 7276, + ZOMBIE_CHANCE = 65, DEAD_HERO_CHANCE = 10 }; @@ -419,13 +419,12 @@ public: if (randomchance < ZOMBIE_CHANCE) go->SummonCreature(ZOMBIE, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); else - if ((randomchance-ZOMBIE_CHANCE) < DEAD_HERO_CHANCE) + if ((randomchance - ZOMBIE_CHANCE) < DEAD_HERO_CHANCE) go->SummonCreature(DEAD_HERO, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); } go->AddUse(); return false; } - }; /*###### diff --git a/src/server/scripts/Kalimdor/ashenvale.cpp b/src/server/scripts/Kalimdor/ashenvale.cpp index 5d26653a1a8..e28665c038e 100644 --- a/src/server/scripts/Kalimdor/ashenvale.cpp +++ b/src/server/scripts/Kalimdor/ashenvale.cpp @@ -28,7 +28,8 @@ npc_torek npc_ruul_snowhoof EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedEscortAI.h" /*#### @@ -76,36 +77,33 @@ class npc_torek : public CreatureScript uint32 Thunderclap_Timer; bool Completed; - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - if (!player) - return; - - switch (i) + if (Player* player = GetPlayerForEscort()) { - case 1: - Talk(SAY_MOVE, player->GetGUID()); - break; - case 8: - Talk(SAY_PREPARE, player->GetGUID()); - break; - case 19: - //TODO: verify location and creatures amount. - me->SummonCreature(ENTRY_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(ENTRY_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(ENTRY_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 20: - DoScriptText(SAY_WIN, me, player); - Completed = true; - if (player) - player->GroupEventHappens(QUEST_TOREK_ASSULT, me); - break; - case 21: - Talk(SAY_END, player->GetGUID()); - break; + switch (waypointId) + { + case 1: + Talk(SAY_MOVE, player->GetGUID()); + break; + case 8: + Talk(SAY_PREPARE, player->GetGUID()); + break; + case 19: + //TODO: verify location and creatures amount. + me->SummonCreature(ENTRY_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(ENTRY_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(ENTRY_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 20: + DoScriptText(SAY_WIN, me, player); + Completed = true; + player->GroupEventHappens(QUEST_TOREK_ASSULT, me); + break; + case 21: + Talk(SAY_END, player->GetGUID()); + break; + } } } @@ -171,53 +169,62 @@ class npc_torek : public CreatureScript # npc_ruul_snowhoof ####*/ -#define QUEST_FREEDOM_TO_RUUL 6482 -#define GO_CAGE 178147 +enum RuulSnowhoof +{ + NPC_THISTLEFUR_URSA = 3921, + NPC_THISTLEFUR_TOTEMIC = 3922, + NPC_THISTLEFUR_PATHFINDER = 3926, + + QUEST_FREEDOM_TO_RUUL = 6482, + + GO_CAGE = 178147 +}; + +Position const RuulSnowhoofSummonsCoord[6] = +{ + {3449.218018f, -587.825073f, 174.978867f, 4.714445f}, + {3446.384521f, -587.830872f, 175.186279f, 4.714445f}, + {3444.218994f, -587.835327f, 175.380600f, 4.714445f}, + {3508.344482f, -492.024261f, 186.929031f, 4.145029f}, + {3506.265625f, -490.531006f, 186.740128f, 4.239277f}, + {3503.682373f, -489.393799f, 186.629684f, 4.349232f} +}; class npc_ruul_snowhoof : public CreatureScript { public: - - npc_ruul_snowhoof() - : CreatureScript("npc_ruul_snowhoof") - { - } + npc_ruul_snowhoof() : CreatureScript("npc_ruul_snowhoof") { } struct npc_ruul_snowhoofAI : public npc_escortAI { - npc_ruul_snowhoofAI(Creature* c) : npc_escortAI(c) {} + npc_ruul_snowhoofAI(Creature* creature) : npc_escortAI(creature) { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 0: { + case 0: me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20); - if (Cage) + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) Cage->SetGoState(GO_STATE_ACTIVE); - break;} - case 13: - me->SummonCreature(3922, 3449.218018f, -587.825073f, 174.978867f, 4.714445f, TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(3921, 3446.384521f, -587.830872f, 175.186279f, 4.714445f, TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(3926, 3444.218994f, -587.835327f, 175.380600f, 4.714445f, TEMPSUMMON_DEAD_DESPAWN, 60000); break; - case 19: - me->SummonCreature(3922, 3508.344482f, -492.024261f, 186.929031f, 4.145029f, TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(3921, 3506.265625f, -490.531006f, 186.740128f, 4.239277f, TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(3926, 3503.682373f, -489.393799f, 186.629684f, 4.349232f, TEMPSUMMON_DEAD_DESPAWN, 60000); + case 13: + me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[0], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[1], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[2], TEMPSUMMON_DEAD_DESPAWN, 60000); + break; + case 19: + me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[3], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[4], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[5], TEMPSUMMON_DEAD_DESPAWN, 60000); + break; + case 21: + player->GroupEventHappens(QUEST_FREEDOM_TO_RUUL, me); break; - - case 21:{ - if (player) - player->GroupEventHappens(QUEST_FREEDOM_TO_RUUL, me); - - break; } } } @@ -225,8 +232,7 @@ class npc_ruul_snowhoof : public CreatureScript void Reset() { - GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20); - if (Cage) + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) Cage->SetGoState(GO_STATE_READY); } @@ -260,7 +266,7 @@ class npc_ruul_snowhoof : public CreatureScript } }; -enum eEnums +enum Muglash { SAY_MUG_START1 = -1800054, SAY_MUG_START2 = -1800055, @@ -289,21 +295,21 @@ enum eEnums NPC_MUGLASH = 12717 }; -static float m_afFirstNagaCoord[3][3]= +Position const FirstNagaCoord[3] = { - {3603.504150f, 1122.631104f, 1.635f}, // rider - {3589.293945f, 1148.664063f, 5.565f}, // sorceress - {3609.925537f, 1168.759521f, -1.168f} // razortail + {3603.504150f, 1122.631104f, 1.635f, 0.0f}, // rider + {3589.293945f, 1148.664063f, 5.565f, 0.0f}, // sorceress + {3609.925537f, 1168.759521f, -1.168f, 0.0f} // razortail }; -static float m_afSecondNagaCoord[3][3]= +Position const SecondNagaCoord[3] = { - {3609.925537f, 1168.759521f, -1.168f}, // witch - {3645.652100f, 1139.425415f, 1.322f}, // priest - {3583.602051f, 1128.405762f, 2.347f} // myrmidon + {3609.925537f, 1168.759521f, -1.168f, 0.0f}, // witch + {3645.652100f, 1139.425415f, 1.322f, 0.0f}, // priest + {3583.602051f, 1128.405762f, 2.347f, 0.0f} // myrmidon }; -static float m_fVorshaCoord[]={3633.056885f, 1172.924072f, -5.388f}; +Position const VorshaCoord = {3633.056885f, 1172.924072f, -5.388f, 0.0f}; class npc_muglash : public CreatureScript { @@ -314,47 +320,44 @@ class npc_muglash : public CreatureScript { npc_muglashAI(Creature* creature) : npc_escortAI(creature) { } - uint32 m_uiWaveId; - uint32 m_uiEventTimer; - bool m_bIsBrazierExtinguished; + uint8 WaveId; + uint32 EventTimer; + bool IsBrazierExtinguished; void JustSummoned(Creature* summoned) { summoned->AI()->AttackStart(me); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - switch (i) + if (Player* player = GetPlayerForEscort()) { - case 0: - if (player) + switch (waypointId) + { + case 0: DoScriptText(SAY_MUG_START2, me, player); - break; - case 24: - if (player) + break; + case 24: DoScriptText(SAY_MUG_BRAZIER, me, player); - if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE*2)) - { - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - SetEscortPaused(true); - } - break; - case 25: - DoScriptText(SAY_MUG_GRATITUDE, me); - - if (player) + if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE*2)) + { + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + SetEscortPaused(true); + } + break; + case 25: + DoScriptText(SAY_MUG_GRATITUDE, me); player->GroupEventHappens(QUEST_VORSHA, me); - break; - case 26: - DoScriptText(SAY_MUG_PATROL, me); - break; - case 27: - DoScriptText(SAY_MUG_RETURN, me); - break; + break; + case 26: + DoScriptText(SAY_MUG_PATROL, me); + break; + case 27: + DoScriptText(SAY_MUG_RETURN, me); + break; + } } } @@ -371,39 +374,34 @@ class npc_muglash : public CreatureScript void Reset() { - m_uiEventTimer = 10000; - m_uiWaveId = 0; - m_bIsBrazierExtinguished = false; + EventTimer = 10000; + WaveId = 0; + IsBrazierExtinguished = false; } void JustDied(Unit* /*killer*/) { - Player* player = GetPlayerForEscort(); if (HasEscortState(STATE_ESCORT_ESCORTING)) - { - if (player) - { + if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_VORSHA); - } - } } void DoWaveSummon() { - switch (m_uiWaveId) + switch (WaveId) { case 1: - me->SummonCreature(NPC_WRATH_RIDER, m_afFirstNagaCoord[0][0], m_afFirstNagaCoord[0][1], m_afFirstNagaCoord[0][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_SORCERESS, m_afFirstNagaCoord[1][0], m_afFirstNagaCoord[1][1], m_afFirstNagaCoord[1][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_RAZORTAIL, m_afFirstNagaCoord[2][0], m_afFirstNagaCoord[2][1], m_afFirstNagaCoord[2][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_RIDER, FirstNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_SORCERESS, FirstNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_RAZORTAIL, FirstNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; case 2: - me->SummonCreature(NPC_WRATH_PRIESTESS, m_afSecondNagaCoord[0][0], m_afSecondNagaCoord[0][1], m_afSecondNagaCoord[0][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_MYRMIDON, m_afSecondNagaCoord[1][0], m_afSecondNagaCoord[1][1], m_afSecondNagaCoord[1][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_SEAWITCH, m_afSecondNagaCoord[2][0], m_afSecondNagaCoord[2][1], m_afSecondNagaCoord[2][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_PRIESTESS, SecondNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_MYRMIDON, SecondNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_SEAWITCH, SecondNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; case 3: - me->SummonCreature(NPC_VORSHA, m_fVorshaCoord[0], m_fVorshaCoord[1], m_fVorshaCoord[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_VORSHA, VorshaCoord, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; case 4: SetEscortPaused(false); @@ -418,16 +416,16 @@ class npc_muglash : public CreatureScript if (!me->getVictim()) { - if (HasEscortState(STATE_ESCORT_PAUSED) && m_bIsBrazierExtinguished) + if (HasEscortState(STATE_ESCORT_PAUSED) && IsBrazierExtinguished) { - if (m_uiEventTimer < uiDiff) + if (EventTimer < uiDiff) { - ++m_uiWaveId; + ++WaveId; DoWaveSummon(); - m_uiEventTimer = 10000; + EventTimer = 10000; } else - m_uiEventTimer -= uiDiff; + EventTimer -= uiDiff; } return; } @@ -459,11 +457,7 @@ class npc_muglash : public CreatureScript class go_naga_brazier : public GameObjectScript { public: - - go_naga_brazier() - : GameObjectScript("go_naga_brazier") - { - } + go_naga_brazier() : GameObjectScript("go_naga_brazier") { } bool OnGossipHello(Player* /*player*/, GameObject* go) { @@ -473,7 +467,7 @@ class go_naga_brazier : public GameObjectScript { DoScriptText(SAY_MUG_BRAZIER_WAIT, creature); - pEscortAI->m_bIsBrazierExtinguished = true; + pEscortAI->IsBrazierExtinguished = true; return false; } } diff --git a/src/server/scripts/Kalimdor/azshara.cpp b/src/server/scripts/Kalimdor/azshara.cpp index 2e621c4a3ba..eae5baa8db2 100644 --- a/src/server/scripts/Kalimdor/azshara.cpp +++ b/src/server/scripts/Kalimdor/azshara.cpp @@ -30,9 +30,9 @@ mob_rizzle_sprysprocket mob_depth_charge EndContentData */ -#include "ScriptPCH.h" -#include "World.h" -#include "WorldPacket.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*###### ## mobs_spitelashes @@ -50,7 +50,7 @@ public: struct mobs_spitelashesAI : public ScriptedAI { - mobs_spitelashesAI(Creature* c) : ScriptedAI(c) {} + mobs_spitelashesAI(Creature* creature) : ScriptedAI(creature) {} uint32 morphtimer; bool spellhit; @@ -120,10 +120,10 @@ class npc_loramus_thalipedes : public CreatureScript public: npc_loramus_thalipedes() : CreatureScript("npc_loramus_thalipedes") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -179,9 +179,12 @@ public: # mob_rizzle_sprysprocket ####*/ -enum eRizzleSprysprocketData +enum RizzleSprysprocketData { + QUEST_CHASING_THE_MOONSTONE = 10994, + MOB_DEPTH_CHARGE = 23025, + SPELL_RIZZLE_BLACKJACK = 39865, SPELL_RIZZLE_ESCAPE = 39871, SPELL_RIZZLE_FROST_GRENADE = 40525, @@ -199,67 +202,66 @@ enum eRizzleSprysprocketData #define GOSSIP_GET_MOONSTONE "Hand over the Southfury moonstone and I'll let you go." -float WPs[58][4] = +Position const WPs[58] = { -//pos_x pos_y pos_z orien -{3691.97f, -3962.41f, 35.9118f, 3.67f}, -{3675.02f, -3960.49f, 35.9118f, 3.67f}, -{3653.19f, -3958.33f, 33.9118f, 3.59f}, -{3621.12f, -3958.51f, 29.9118f, 3.48f}, -{3604.86f, -3963, 29.9118f, 3.48f}, -{3569.94f, -3970.25f, 29.9118f, 3.44f}, -{3541.03f, -3975.64f, 29.9118f, 3.41f}, -{3510.84f, -3978.71f, 29.9118f, 3.41f}, -{3472.7f, -3997.07f, 29.9118f, 3.35f}, -{3439.15f, -4014.55f, 29.9118f, 3.29f}, -{3412.8f, -4025.87f, 29.9118f, 3.25f}, -{3384.95f, -4038.04f, 29.9118f, 3.24f}, -{3346.77f, -4052.93f, 29.9118f, 3.22f}, -{3299.56f, -4071.59f, 29.9118f, 3.20f}, -{3261.22f, -4080.38f, 30.9118f, 3.19f}, -{3220.68f, -4083.09f, 31.9118f, 3.18f}, -{3187.11f, -4070.45f, 33.9118f, 3.16f}, -{3162.78f, -4062.75f, 33.9118f, 3.15f}, -{3136.09f, -4050.32f, 33.9118f, 3.07f}, -{3119.47f, -4044.51f, 36.0363f, 3.07f}, -{3098.95f, -4019.8f, 33.9118f, 3.07f}, -{3073.07f, -4011.42f, 33.9118f, 3.07f}, -{3051.71f, -3993.37f, 33.9118f, 3.02f}, -{3027.52f, -3978.6f, 33.9118f, 3.00f}, -{3003.78f, -3960.14f, 33.9118f, 2.98f}, -{2977.99f, -3941.98f, 31.9118f, 2.96f}, -{2964.57f, -3932.07f, 30.9118f, 2.96f}, -{2947.9f, -3921.31f, 29.9118f, 2.96f}, -{2924.91f, -3910.8f, 29.9118f, 2.94f}, -{2903.04f, -3896.42f, 29.9118f, 2.93f}, -{2884.75f, -3874.03f, 29.9118f, 2.90f}, -{2868.19f, -3851.48f, 29.9118f, 2.82f}, -{2854.62f, -3819.72f, 29.9118f, 2.80f}, -{2825.53f, -3790.4f, 29.9118f, 2.744f}, -{2804.31f, -3773.05f, 29.9118f, 2.71f}, -{2769.78f, -3763.57f, 29.9118f, 2.70f}, -{2727.23f, -3745.92f, 30.9118f, 2.69f}, -{2680.12f, -3737.49f, 30.9118f, 2.67f}, -{2647.62f, -3739.94f, 30.9118f, 2.66f}, -{2616.6f, -3745.75f, 30.9118f, 2.64f}, -{2589.38f, -3731.97f, 30.9118f, 2.61f}, -{2562.94f, -3722.35f, 31.9118f, 2.56f}, -{2521.05f, -3716.6f, 31.9118f, 2.55f}, -{2485.26f, -3706.67f, 31.9118f, 2.51f}, -{2458.93f, -3696.67f, 31.9118f, 2.51f}, -{2432, -3692.03f, 31.9118f, 2.46f}, -{2399.59f, -3681.97f, 31.9118f, 2.45f}, -{2357.75f, -3666.6f, 31.9118f, 2.44f}, -{2311.99f, -3656.88f, 31.9118f, 2.94f}, -{2263.41f, -3649.55f, 31.9118f, 3.02f}, -{2209.05f, -3641.76f, 31.9118f, 2.99f}, -{2164.83f, -3637.64f, 31.9118f, 3.15f}, -{2122.42f, -3639, 31.9118f, 3.21f}, -{2075.73f, -3643.59f, 31.9118f, 3.22f}, -{2033.59f, -3649.52f, 31.9118f, 3.42f}, -{1985.22f, -3662.99f, 31.9118f, 3.42f}, -{1927.09f, -3679.56f, 33.9118f, 3.42f}, -{1873.57f, -3695.32f, 33.9118f, 3.44f} + {3691.97f, -3962.41f, 35.9118f, 3.67f}, + {3675.02f, -3960.49f, 35.9118f, 3.67f}, + {3653.19f, -3958.33f, 33.9118f, 3.59f}, + {3621.12f, -3958.51f, 29.9118f, 3.48f}, + {3604.86f, -3963, 29.9118f, 3.48f}, + {3569.94f, -3970.25f, 29.9118f, 3.44f}, + {3541.03f, -3975.64f, 29.9118f, 3.41f}, + {3510.84f, -3978.71f, 29.9118f, 3.41f}, + {3472.7f, -3997.07f, 29.9118f, 3.35f}, + {3439.15f, -4014.55f, 29.9118f, 3.29f}, + {3412.8f, -4025.87f, 29.9118f, 3.25f}, + {3384.95f, -4038.04f, 29.9118f, 3.24f}, + {3346.77f, -4052.93f, 29.9118f, 3.22f}, + {3299.56f, -4071.59f, 29.9118f, 3.20f}, + {3261.22f, -4080.38f, 30.9118f, 3.19f}, + {3220.68f, -4083.09f, 31.9118f, 3.18f}, + {3187.11f, -4070.45f, 33.9118f, 3.16f}, + {3162.78f, -4062.75f, 33.9118f, 3.15f}, + {3136.09f, -4050.32f, 33.9118f, 3.07f}, + {3119.47f, -4044.51f, 36.0363f, 3.07f}, + {3098.95f, -4019.8f, 33.9118f, 3.07f}, + {3073.07f, -4011.42f, 33.9118f, 3.07f}, + {3051.71f, -3993.37f, 33.9118f, 3.02f}, + {3027.52f, -3978.6f, 33.9118f, 3.00f}, + {3003.78f, -3960.14f, 33.9118f, 2.98f}, + {2977.99f, -3941.98f, 31.9118f, 2.96f}, + {2964.57f, -3932.07f, 30.9118f, 2.96f}, + {2947.9f, -3921.31f, 29.9118f, 2.96f}, + {2924.91f, -3910.8f, 29.9118f, 2.94f}, + {2903.04f, -3896.42f, 29.9118f, 2.93f}, + {2884.75f, -3874.03f, 29.9118f, 2.90f}, + {2868.19f, -3851.48f, 29.9118f, 2.82f}, + {2854.62f, -3819.72f, 29.9118f, 2.80f}, + {2825.53f, -3790.4f, 29.9118f, 2.744f}, + {2804.31f, -3773.05f, 29.9118f, 2.71f}, + {2769.78f, -3763.57f, 29.9118f, 2.70f}, + {2727.23f, -3745.92f, 30.9118f, 2.69f}, + {2680.12f, -3737.49f, 30.9118f, 2.67f}, + {2647.62f, -3739.94f, 30.9118f, 2.66f}, + {2616.6f, -3745.75f, 30.9118f, 2.64f}, + {2589.38f, -3731.97f, 30.9118f, 2.61f}, + {2562.94f, -3722.35f, 31.9118f, 2.56f}, + {2521.05f, -3716.6f, 31.9118f, 2.55f}, + {2485.26f, -3706.67f, 31.9118f, 2.51f}, + {2458.93f, -3696.67f, 31.9118f, 2.51f}, + {2432, -3692.03f, 31.9118f, 2.46f}, + {2399.59f, -3681.97f, 31.9118f, 2.45f}, + {2357.75f, -3666.6f, 31.9118f, 2.44f}, + {2311.99f, -3656.88f, 31.9118f, 2.94f}, + {2263.41f, -3649.55f, 31.9118f, 3.02f}, + {2209.05f, -3641.76f, 31.9118f, 2.99f}, + {2164.83f, -3637.64f, 31.9118f, 3.15f}, + {2122.42f, -3639, 31.9118f, 3.21f}, + {2075.73f, -3643.59f, 31.9118f, 3.22f}, + {2033.59f, -3649.52f, 31.9118f, 3.42f}, + {1985.22f, -3662.99f, 31.9118f, 3.42f}, + {1927.09f, -3679.56f, 33.9118f, 3.42f}, + {1873.57f, -3695.32f, 33.9118f, 3.44f} }; class mob_rizzle_sprysprocket : public CreatureScript @@ -267,22 +269,22 @@ class mob_rizzle_sprysprocket : public CreatureScript public: mob_rizzle_sprysprocket() : CreatureScript("mob_rizzle_sprysprocket") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE) + if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); - CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->Must_Die_Timer = 3000; - CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->Must_Die = true; + CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDieTimer = 3000; + CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDie = true; } return true; } bool OnGossipHello(Player* player, Creature* creature) { - if (player->GetQuestStatus(10994) != QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE) return true; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); player->SEND_GOSSIP_MENU(10811, creature->GetGUID()); @@ -296,34 +298,34 @@ public: struct mob_rizzle_sprysprocketAI : public ScriptedAI { - mob_rizzle_sprysprocketAI(Creature* c) : ScriptedAI(c) {} + mob_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) {} - uint32 spellEscape_Timer; - uint32 Teleport_Timer; - uint32 Check_Timer; - uint32 Grenade_Timer; - uint32 Must_Die_Timer; + uint32 SpellEscapeTimer; + uint32 TeleportTimer; + uint32 CheckTimer; + uint32 GrenadeTimer; + uint32 MustDieTimer; uint32 CurrWP; uint64 PlayerGUID; - bool Must_Die; + bool MustDie; bool Escape; bool ContinueWP; bool Reached; void Reset() { - spellEscape_Timer = 1300; - Teleport_Timer = 3500; - Check_Timer = 10000; - Grenade_Timer = 30000; - Must_Die_Timer = 3000; + SpellEscapeTimer = 1300; + TeleportTimer = 3500; + CheckTimer = 10000; + GrenadeTimer = 30000; + MustDieTimer = 3000; CurrWP = 0; PlayerGUID = 0; - Must_Die = false; + MustDie = false; Escape = false; ContinueWP = false; Reached = false; @@ -331,13 +333,13 @@ public: void UpdateAI(const uint32 diff) { - if (Must_Die) + if (MustDie) { - if (Must_Die_Timer <= diff) + if (MustDieTimer <= diff) { me->DespawnOrUnsummon(); return; - } else Must_Die_Timer -= diff; + } else MustDieTimer -= diff; } if (!Escape) @@ -345,17 +347,16 @@ public: if (!PlayerGUID) return; - if (spellEscape_Timer <= diff) + if (SpellEscapeTimer <= diff) { DoCast(me, SPELL_RIZZLE_ESCAPE, false); - spellEscape_Timer = 10000; - } else spellEscape_Timer -= diff; + SpellEscapeTimer = 10000; + } else SpellEscapeTimer -= diff; - if (Teleport_Timer <= diff) + if (TeleportTimer <= diff) { //temp solution - unit can't be teleported by core using spelleffect 5, only players - Map* map = me->GetMap(); - if (map) + if (me->GetMap()) { me->SetPosition(3706.39f, -3969.15f, 35.9118f, 0); me->AI_SendMoveToPacket(3706.39f, -3969.15f, 35.9118f, 0, 0, 0); @@ -367,20 +368,20 @@ public: me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING); me->SetSpeed(MOVE_RUN, 0.85f, true); me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); + me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); Escape = true; - } else Teleport_Timer -= diff; + } else TeleportTimer -= diff; return; } if (ContinueWP) { - me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); + me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); ContinueWP = false; } - if (Grenade_Timer <= diff) + if (GrenadeTimer <= diff) { Player* player = Unit::GetPlayer(*me, PlayerGUID); if (player) @@ -388,10 +389,10 @@ public: DoScriptText(SAY_RIZZLE_GRENADE, me, player); DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); } - Grenade_Timer = 30000; - } else Grenade_Timer -= diff; + GrenadeTimer = 30000; + } else GrenadeTimer -= diff; - if (Check_Timer <= diff) + if (CheckTimer <= diff) { Player* player = Unit::GetPlayer(*me, PlayerGUID); if (!player) @@ -410,8 +411,8 @@ public: Reached = true; } - Check_Timer = 1000; - } else Check_Timer -= diff; + CheckTimer = 1000; + } else CheckTimer -= diff; } @@ -427,7 +428,7 @@ public: if (!who || PlayerGUID) return; - if (who->GetTypeId() == TYPEID_PLAYER && CAST_PLR(who)->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE) + if (who->GetTypeId() == TYPEID_PLAYER && CAST_PLR(who)->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) { PlayerGUID = who->GetGUID(); DoScriptText(SAY_RIZZLE_START, me); @@ -470,27 +471,27 @@ public: struct mob_depth_chargeAI : public ScriptedAI { - mob_depth_chargeAI(Creature* c) : ScriptedAI(c) {} + mob_depth_chargeAI(Creature* creature) : ScriptedAI(creature) {} - bool we_must_die; - uint32 must_die_timer; + bool WeMustDie; + uint32 WeMustDieTimer; void Reset() { me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - we_must_die = false; - must_die_timer = 1000; + WeMustDie = false; + WeMustDieTimer = 1000; } void UpdateAI(const uint32 diff) { - if (we_must_die) + if (WeMustDie) { - if (must_die_timer <= diff) - { + if (WeMustDieTimer <= diff) me->DespawnOrUnsummon(); - } else must_die_timer -= diff; + else + WeMustDieTimer -= diff; } return; } @@ -503,20 +504,15 @@ public: if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 5)) { DoCast(who, SPELL_DEPTH_CHARGE_TRAP); - we_must_die = true; + WeMustDie = true; return; } } - void AttackStart(Unit* /*who*/) - { - } + void AttackStart(Unit* /*who*/) {} - void EnterCombat(Unit* /*who*/) - { - } + void EnterCombat(Unit* /*who*/) {} }; - }; void AddSC_azshara() diff --git a/src/server/scripts/Kalimdor/azuremyst_isle.cpp b/src/server/scripts/Kalimdor/azuremyst_isle.cpp index 09f4b9415a9..608117ca9af 100644 --- a/src/server/scripts/Kalimdor/azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/azuremyst_isle.cpp @@ -33,15 +33,19 @@ go_ravager_cage npc_death_ravager EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedEscortAI.h" -#include +#include "ScriptedGossip.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" /*###### ## npc_draenei_survivor ######*/ -enum eEnums +enum draeneiSurvivor { SAY_HEAL1 = -1000176, SAY_HEAL2 = -1000177, @@ -69,7 +73,7 @@ public: struct npc_draenei_survivorAI : public ScriptedAI { - npc_draenei_survivorAI(Creature* c) : ScriptedAI(c) {} + npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature) {} uint64 pCaster; @@ -175,7 +179,7 @@ public: ## npc_engineer_spark_overgrind ######*/ -enum eOvergrind +enum Overgrind { SAY_TEXT = -1000184, SAY_EMOTE = -1000185, @@ -195,10 +199,10 @@ class npc_engineer_spark_overgrind : public CreatureScript public: npc_engineer_spark_overgrind() : CreatureScript("npc_engineer_spark_overgrind") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->CLOSE_GOSSIP_MENU(); creature->setFaction(FACTION_HOSTILE); @@ -223,27 +227,27 @@ public: struct npc_engineer_spark_overgrindAI : public ScriptedAI { - npc_engineer_spark_overgrindAI(Creature* c) : ScriptedAI(c) + npc_engineer_spark_overgrindAI(Creature* creature) : ScriptedAI(creature) { - NormFaction = c->getFaction(); - NpcFlags = c->GetUInt32Value(UNIT_NPC_FLAGS); + NormFaction = creature->getFaction(); + NpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); - if (c->GetAreaId() == AREA_COVE || c->GetAreaId() == AREA_ISLE) + if (creature->GetAreaId() == AREA_COVE || creature->GetAreaId() == AREA_ISLE) IsTreeEvent = true; } uint32 NormFaction; uint32 NpcFlags; - uint32 Dynamite_Timer; - uint32 Emote_Timer; + uint32 DynamiteTimer; + uint32 EmoteTimer; bool IsTreeEvent; void Reset() { - Dynamite_Timer = 8000; - Emote_Timer = urand(120000, 150000); + DynamiteTimer = 8000; + EmoteTimer = urand(120000, 150000); me->setFaction(NormFaction); me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags); @@ -260,12 +264,12 @@ public: { if (!me->isInCombat() && !IsTreeEvent) { - if (Emote_Timer <= diff) + if (EmoteTimer <= diff) { DoScriptText(SAY_TEXT, me); DoScriptText(SAY_EMOTE, me); - Emote_Timer = urand(120000, 150000); - } else Emote_Timer -= diff; + EmoteTimer = urand(120000, 150000); + } else EmoteTimer -= diff; } else if (IsTreeEvent) return; @@ -273,11 +277,11 @@ public: if (!UpdateVictim()) return; - if (Dynamite_Timer <= diff) + if (DynamiteTimer <= diff) { DoCast(me->getVictim(), SPELL_DYNAMITE); - Dynamite_Timer = 8000; - } else Dynamite_Timer -= diff; + DynamiteTimer = 8000; + } else DynamiteTimer -= diff; DoMeleeAttackIfReady(); } @@ -301,29 +305,29 @@ public: struct npc_injured_draeneiAI : public ScriptedAI { - npc_injured_draeneiAI(Creature* c) : ScriptedAI(c) {} + npc_injured_draeneiAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); me->SetHealth(me->CountPctFromMaxHealth(15)); - switch (rand()%2) + switch (urand(0, 1)) { - case 0: me->SetStandState(UNIT_STAND_STATE_SIT); break; - case 1: me->SetStandState(UNIT_STAND_STATE_SLEEP); break; + case 0: + me->SetStandState(UNIT_STAND_STATE_SIT); + break; + + case 1: + me->SetStandState(UNIT_STAND_STATE_SLEEP); + break; } } void EnterCombat(Unit* /*who*/) {} - void MoveInLineOfSight(Unit* /*who*/) - { - } - - void UpdateAI(const uint32 /*diff*/) - { - } + void MoveInLineOfSight(Unit* /*who*/) {} + void UpdateAI(const uint32 /*diff*/) {} }; }; @@ -332,7 +336,7 @@ public: ## npc_magwin ######*/ -enum eMagwin +enum Magwin { SAY_START = -1000111, SAY_AGGRO = -1000112, @@ -367,31 +371,29 @@ public: struct npc_magwinAI : public npc_escortAI { - npc_magwinAI(Creature* c) : npc_escortAI(c) {} + npc_magwinAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - if (!player) - return; - - switch (i) + if (Player* player = GetPlayerForEscort()) { - case 0: - DoScriptText(SAY_START, me, player); - break; - case 17: - DoScriptText(SAY_PROGRESS, me, player); - break; - case 28: - DoScriptText(SAY_END1, me, player); - break; - case 29: - DoScriptText(EMOTE_HUG, me, player); - DoScriptText(SAY_END2, me, player); - player->GroupEventHappens(QUEST_A_CRY_FOR_SAY_HELP, me); - break; + switch (waypointId) + { + case 0: + DoScriptText(SAY_START, me, player); + break; + case 17: + DoScriptText(SAY_PROGRESS, me, player); + break; + case 28: + DoScriptText(SAY_END1, me, player); + break; + case 29: + DoScriptText(EMOTE_HUG, me, player); + DoScriptText(SAY_END2, me, player); + player->GroupEventHappens(QUEST_A_CRY_FOR_SAY_HELP, me); + break; + } } } @@ -400,7 +402,7 @@ public: DoScriptText(SAY_AGGRO, me, who); } - void Reset() { } + void Reset() {} }; }; @@ -409,7 +411,7 @@ public: ## npc_geezle ######*/ -enum eGeezle +enum Geezle { QUEST_TREES_COMPANY = 9531, @@ -429,7 +431,7 @@ enum eGeezle GO_NAGA_FLAG = 181694 }; -static float SparkPos[3] = {-5029.91f, -11291.79f, 8.096f}; +Position const SparkPos = {-5029.91f, -11291.79f, 8.096f, 0.0f}; class npc_geezle : public CreatureScript { @@ -443,11 +445,11 @@ public: struct npc_geezleAI : public ScriptedAI { - npc_geezleAI(Creature* c) : ScriptedAI(c) {} + npc_geezleAI(Creature* creature) : ScriptedAI(creature) {} uint64 SparkGUID; - uint32 Step; + uint8 Step; uint32 SayTimer; bool EventStarted; @@ -465,8 +467,7 @@ public: { Step = 0; EventStarted = true; - Creature* Spark = me->SummonCreature(MOB_SPARK, SparkPos[0], SparkPos[1], SparkPos[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); - if (Spark) + if (Creature* Spark = me->SummonCreature(MOB_SPARK, SparkPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000)) { SparkGUID = Spark->GetGUID(); Spark->setActive(true); @@ -475,47 +476,47 @@ public: SayTimer = 8000; } - uint32 NextStep(uint32 Step) + uint32 NextStep(uint8 Step) { Creature* Spark = Unit::GetCreature(*me, SparkGUID); switch (Step) { - case 0: - if (Spark) - Spark->GetMotionMaster()->MovePoint(0, -5080.70f, -11253.61f, 0.56f); - me->GetMotionMaster()->MovePoint(0, -5092.26f, -11252, 0.71f); - return 9000; // NPCs are walking up to fire - case 1: - DespawnNagaFlag(true); - DoScriptText(EMOTE_SPARK, Spark); - return 1000; - case 2: - DoScriptText(GEEZLE_SAY_1, me, Spark); - if (Spark) - { - Spark->SetInFront(me); - me->SetInFront(Spark); - } - return 5000; - case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000; - case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000; - case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000; - case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000; - case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000; - case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000; - case 9: - me->GetMotionMaster()->MoveTargetedHome(); - if (Spark) - Spark->GetMotionMaster()->MovePoint(0, SparkPos[0], SparkPos[1], SparkPos[2]); - CompleteQuest(); - return 9000; - case 10: - if (Spark) - Spark->DisappearAndDie(); - DespawnNagaFlag(false); - me->DisappearAndDie(); - default: return 99999999; + case 0: + if (Spark) + Spark->GetMotionMaster()->MovePoint(0, -5080.70f, -11253.61f, 0.56f); + me->GetMotionMaster()->MovePoint(0, -5092.26f, -11252, 0.71f); + return 9000; // NPCs are walking up to fire + case 1: + DespawnNagaFlag(true); + DoScriptText(EMOTE_SPARK, Spark); + return 1000; + case 2: + DoScriptText(GEEZLE_SAY_1, me, Spark); + if (Spark) + { + Spark->SetInFront(me); + me->SetInFront(Spark); + } + return 5000; + case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000; + case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000; + case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000; + case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000; + case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000; + case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000; + case 9: + me->GetMotionMaster()->MoveTargetedHome(); + if (Spark) + Spark->GetMotionMaster()->MovePoint(0, SparkPos); + CompleteQuest(); + return 9000; + case 10: + if (Spark) + Spark->DisappearAndDie(); + DespawnNagaFlag(false); + me->DisappearAndDie(); + default: return 99999999; } } @@ -529,13 +530,8 @@ public: me->VisitNearbyWorldObject(radius, searcher); for (std::list::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - if ((*itr)->GetQuestStatus(QUEST_TREES_COMPANY) == QUEST_STATUS_INCOMPLETE - &&(*itr)->HasAura(SPELL_TREE_DISGUISE)) - { + if ((*itr)->GetQuestStatus(QUEST_TREES_COMPANY) == QUEST_STATUS_INCOMPLETE && (*itr)->HasAura(SPELL_TREE_DISGUISE)) (*itr)->KilledMonsterCredit(MOB_SPARK, 0); - } - } } void DespawnNagaFlag(bool despawn) @@ -548,13 +544,13 @@ public: for (std::list::const_iterator itr = FlagList.begin(); itr != FlagList.end(); ++itr) { if (despawn) - { (*itr)->SetLootState(GO_JUST_DEACTIVATED); - } else (*itr)->Respawn(); } - } else sLog->outError("SD2 ERROR: FlagList is empty!"); + } + else + sLog->outError("SD2 ERROR: FlagList is empty!"); } void UpdateAI(const uint32 diff) @@ -562,16 +558,16 @@ public: if (SayTimer <= diff) { if (EventStarted) - { SayTimer = NextStep(Step++); - } - } else SayTimer -= diff; + } + else + SayTimer -= diff; } }; }; -enum eRavegerCage +enum RavegerCage { NPC_DEATH_RAVAGER = 17556, @@ -597,7 +593,7 @@ public: ravager->AI()->AttackStart(player); } } - return true ; + return true; } }; @@ -613,7 +609,7 @@ public: struct npc_death_ravagerAI : public ScriptedAI { - npc_death_ravagerAI(Creature* c) : ScriptedAI(c){} + npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature){} uint32 RendTimer; uint32 EnragingBiteTimer; diff --git a/src/server/scripts/Kalimdor/bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/bloodmyst_isle.cpp index c114c02b16d..3883b740d02 100644 --- a/src/server/scripts/Kalimdor/bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/bloodmyst_isle.cpp @@ -28,14 +28,16 @@ mob_webbed_creature npc_captured_sunhawk_agent EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*###### ## mob_webbed_creature ######*/ //possible creatures to be spawned -const uint32 possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17359, 17353, 17336, 17550, 17330, 17701, 17321, 17680, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327}; +uint32 const possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17359, 17353, 17336, 17550, 17330, 17701, 17321, 17680, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327}; class mob_webbed_creature : public CreatureScript { @@ -49,17 +51,13 @@ public: struct mob_webbed_creatureAI : public ScriptedAI { - mob_webbed_creatureAI(Creature* c) : ScriptedAI(c) {} + mob_webbed_creatureAI(Creature* creature) : ScriptedAI(creature) {} - void Reset() - { - } + void Reset() {} - void EnterCombat(Unit* /*who*/) - { - } + void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { uint32 spawnCreatureID = 0; @@ -67,8 +65,8 @@ public: { case 0: spawnCreatureID = 17681; - if (Killer->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(Killer)->KilledMonsterCredit(spawnCreatureID, 0); + if (Player* player = killer->ToPlayer()) + player->KilledMonsterCredit(spawnCreatureID, 0); break; case 1: case 2: @@ -101,10 +99,10 @@ class npc_captured_sunhawk_agent : public CreatureScript public: npc_captured_sunhawk_agent() : CreatureScript("npc_captured_sunhawk_agent") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_CSA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -153,7 +151,7 @@ public: ## Quest 9667: Saving Princess Stillpine ######*/ -enum eStillpine +enum Stillpine { QUEST_SAVING_PRINCESS_STILLPINE = 9667, NPC_PRINCESS_STILLPINE = 17682, @@ -193,7 +191,7 @@ public: if (type == POINT_MOTION_TYPE && id == 1) { DoScriptText(SAY_DIRECTION, me); - me->ForcedDespawn(); + me->DespawnOrUnsummon(); } } }; diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp index 4c415014eef..ec098951c03 100644 --- a/src/server/scripts/Kalimdor/boss_azuregos.cpp +++ b/src/server/scripts/Kalimdor/boss_azuregos.cpp @@ -23,17 +23,24 @@ SDComment: Teleport not included, spell reflect not effecting dots (Core problem SDCategory: Azshara EndScriptData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" -#define SAY_TELEPORT -1000100 +enum Say +{ + SAY_TELEPORT = -1000100 +}; -#define SPELL_MARKOFFROST 23182 -#define SPELL_MANASTORM 21097 -#define SPELL_CHILL 21098 -#define SPELL_FROSTBREATH 21099 -#define SPELL_REFLECT 22067 -#define SPELL_CLEAVE 8255 //Perhaps not right ID -#define SPELL_ENRAGE 23537 +enum Spells +{ + SPELL_MARKOFFROST = 23182, + SPELL_MANASTORM = 21097, + SPELL_CHILL = 21098, + SPELL_FROSTBREATH = 21099, + SPELL_REFLECT = 22067, + SPELL_CLEAVE = 8255, //Perhaps not right ID + SPELL_ENRAGE = 23537 +}; class boss_azuregos : public CreatureScript { @@ -47,28 +54,28 @@ public: struct boss_azuregosAI : public ScriptedAI { - boss_azuregosAI(Creature* c) : ScriptedAI(c) {} - - uint32 MarkOfFrost_Timer; - uint32 ManaStorm_Timer; - uint32 Chill_Timer; - uint32 Breath_Timer; - uint32 Teleport_Timer; - uint32 Reflect_Timer; - uint32 Cleave_Timer; - uint32 Enrage_Timer; + boss_azuregosAI(Creature* creature) : ScriptedAI(creature) {} + + uint32 MarkOfFrostTimer; + uint32 ManaStormTimer; + uint32 ChillTimer; + uint32 BreathTimer; + uint32 TeleportTimer; + uint32 ReflectTimer; + uint32 CleaveTimer; + uint32 EnrageTimer; bool Enraged; void Reset() { - MarkOfFrost_Timer = 35000; - ManaStorm_Timer = urand(5000, 17000); - Chill_Timer = urand(10000, 30000); - Breath_Timer = urand(2000, 8000); - Teleport_Timer = 30000; - Reflect_Timer = urand(15000, 30000); - Cleave_Timer = 7000; - Enrage_Timer = 0; + MarkOfFrostTimer = 35000; + ManaStormTimer = urand(5000, 17000); + ChillTimer = urand(10000, 30000); + BreathTimer = urand(2000, 8000); + TeleportTimer = 30000; + ReflectTimer = urand(15000, 30000); + CleaveTimer = 7000; + EnrageTimer = 0; Enraged = false; } @@ -80,14 +87,14 @@ public: if (!UpdateVictim()) return; - if (Teleport_Timer <= diff) + if (TeleportTimer <= diff) { DoScriptText(SAY_TELEPORT, me); - std::list& m_threatlist = me->getThreatManager().getThreatList(); - std::list::const_iterator i = m_threatlist.begin(); - for (i = m_threatlist.begin(); i!= m_threatlist.end(); ++i) + std::list& threatlist = me->getThreatManager().getThreatList(); + std::list::const_iterator i = threatlist.begin(); + for (i = threatlist.begin(); i!= threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, unit->GetOrientation()); @@ -95,53 +102,53 @@ public: } DoResetThreat(); - Teleport_Timer = 30000; - } else Teleport_Timer -= diff; + TeleportTimer = 30000; + } else TeleportTimer -= diff; - // //MarkOfFrost_Timer - // if (MarkOfFrost_Timer <= diff) + // //MarkOfFrostTimer + // if (MarkOfFrostTimer <= diff) // { // DoCast(me->getVictim(), SPELL_MARKOFFROST); - // MarkOfFrost_Timer = 25000; - // } else MarkOfFrost_Timer -= diff; + // MarkOfFrostTimer = 25000; + // } else MarkOfFrostTimer -= diff; - //Chill_Timer - if (Chill_Timer <= diff) + //ChillTimer + if (ChillTimer <= diff) { DoCast(me->getVictim(), SPELL_CHILL); - Chill_Timer = urand(13000, 25000); - } else Chill_Timer -= diff; + ChillTimer = urand(13000, 25000); + } else ChillTimer -= diff; - //Breath_Timer - if (Breath_Timer <= diff) + //BreathTimer + if (BreathTimer <= diff) { DoCast(me->getVictim(), SPELL_FROSTBREATH); - Breath_Timer = urand(10000, 15000); - } else Breath_Timer -= diff; + BreathTimer = urand(10000, 15000); + } else BreathTimer -= diff; - //ManaStorm_Timer - if (ManaStorm_Timer <= diff) + //ManaStormTimer + if (ManaStormTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_MANASTORM); - ManaStorm_Timer = urand(7500, 12500); - } else ManaStorm_Timer -= diff; + ManaStormTimer = urand(7500, 12500); + } else ManaStormTimer -= diff; - //Reflect_Timer - if (Reflect_Timer <= diff) + //ReflectTimer + if (ReflectTimer <= diff) { DoCast(me, SPELL_REFLECT); - Reflect_Timer = urand(20000, 35000); - } else Reflect_Timer -= diff; + ReflectTimer = urand(20000, 35000); + } else ReflectTimer -= diff; - //Cleave_Timer - if (Cleave_Timer <= diff) + //CleaveTimer + if (CleaveTimer <= diff) { DoCast(me->getVictim(), SPELL_CLEAVE); - Cleave_Timer = 7000; - } else Cleave_Timer -= diff; + CleaveTimer = 7000; + } else CleaveTimer -= diff; - //Enrage_Timer + //EnrageTimer if (HealthBelowPct(26) && !Enraged) { DoCast(me, SPELL_ENRAGE); diff --git a/src/server/scripts/Kalimdor/darkshore.cpp b/src/server/scripts/Kalimdor/darkshore.cpp index a2c10b94ff9..0e02a77169e 100644 --- a/src/server/scripts/Kalimdor/darkshore.cpp +++ b/src/server/scripts/Kalimdor/darkshore.cpp @@ -29,7 +29,9 @@ npc_prospector_remtravel npc_threshwackonator EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptedEscortAI.h" #include "ScriptedFollowerAI.h" @@ -37,7 +39,7 @@ EndContentData */ # npc_kerlonian ####*/ -enum eKerlonian +enum Kerlonian { SAY_KER_START = -1000434, @@ -94,11 +96,11 @@ public: { npc_kerlonianAI(Creature* creature) : FollowerAI(creature) { } - uint32 m_uiFallAsleepTimer; + uint32 FallAsleepTimer; void Reset() { - m_uiFallAsleepTimer = urand(10000, 45000); + FallAsleepTimer = urand(10000, 45000); } void MoveInLineOfSight(Unit* who) @@ -150,7 +152,7 @@ public: SetFollowPaused(false); } - void UpdateFollowerAI(const uint32 uiDiff) + void UpdateFollowerAI(const uint32 Diff) { if (!UpdateVictim()) { @@ -159,13 +161,13 @@ public: if (!HasFollowState(STATE_FOLLOW_PAUSED)) { - if (m_uiFallAsleepTimer <= uiDiff) + if (FallAsleepTimer <= Diff) { SetSleeping(); - m_uiFallAsleepTimer = urand(25000, 90000); + FallAsleepTimer = urand(25000, 90000); } else - m_uiFallAsleepTimer -= uiDiff; + FallAsleepTimer -= Diff; } return; @@ -181,7 +183,7 @@ public: # npc_prospector_remtravel ####*/ -enum eRemtravel +enum Remtravel { SAY_REM_START = -1000327, SAY_REM_AGGRO = -1000328, @@ -231,66 +233,64 @@ public: { npc_prospector_remtravelAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - if (!player) - return; - - switch (i) + if (Player* player = GetPlayerForEscort()) { - case 0: - DoScriptText(SAY_REM_START, me, player); - break; - case 5: - DoScriptText(SAY_REM_RAMP1_1, me, player); - break; - case 6: - DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 9: - DoScriptText(SAY_REM_RAMP1_2, me, player); - break; - case 14: - //depend quest rewarded? - DoScriptText(SAY_REM_BOOK, me, player); - break; - case 15: - DoScriptText(SAY_REM_TENT1_1, me, player); - break; - case 16: - DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 17: - DoScriptText(SAY_REM_TENT1_2, me, player); - break; - case 26: - DoScriptText(SAY_REM_MOSS, me, player); - break; - case 27: - DoScriptText(EMOTE_REM_MOSS, me, player); - break; - case 28: - DoScriptText(SAY_REM_MOSS_PROGRESS, me, player); - break; - case 29: - DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 31: - DoScriptText(SAY_REM_PROGRESS, me, player); - break; - case 41: - DoScriptText(SAY_REM_REMEMBER, me, player); - break; - case 42: - DoScriptText(EMOTE_REM_END, me, player); - player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); - break; + switch (waypointId) + { + case 0: + DoScriptText(SAY_REM_START, me, player); + break; + case 5: + DoScriptText(SAY_REM_RAMP1_1, me, player); + break; + case 6: + DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 9: + DoScriptText(SAY_REM_RAMP1_2, me, player); + break; + case 14: + //depend quest rewarded? + DoScriptText(SAY_REM_BOOK, me, player); + break; + case 15: + DoScriptText(SAY_REM_TENT1_1, me, player); + break; + case 16: + DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 17: + DoScriptText(SAY_REM_TENT1_2, me, player); + break; + case 26: + DoScriptText(SAY_REM_MOSS, me, player); + break; + case 27: + DoScriptText(EMOTE_REM_MOSS, me, player); + break; + case 28: + DoScriptText(SAY_REM_MOSS_PROGRESS, me, player); + break; + case 29: + DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 31: + DoScriptText(SAY_REM_PROGRESS, me, player); + break; + case 41: + DoScriptText(SAY_REM_REMEMBER, me, player); + break; + case 42: + DoScriptText(EMOTE_REM_END, me, player); + player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); + break; + } } } @@ -298,7 +298,7 @@ public: void EnterCombat(Unit* who) { - if (rand()%2) + if (urand(0, 1)) DoScriptText(SAY_REM_AGGRO, me, who); } @@ -315,7 +315,7 @@ public: # npc_threshwackonator ####*/ -enum eThreshwackonator +enum Threshwackonator { EMOTE_START = -1000325, //signed for 4966 SAY_AT_CLOSE = -1000326, //signed for 4966 @@ -331,10 +331,10 @@ class npc_threshwackonator : public CreatureScript public: npc_threshwackonator() : CreatureScript("npc_threshwackonator") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); diff --git a/src/server/scripts/Kalimdor/desolace.cpp b/src/server/scripts/Kalimdor/desolace.cpp index 49a9be21a98..e196c71f681 100644 --- a/src/server/scripts/Kalimdor/desolace.cpp +++ b/src/server/scripts/Kalimdor/desolace.cpp @@ -30,10 +30,12 @@ npc_dalinda_malem go_demon_portal EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -enum eDyingKodo +enum DyingKodo { // signed for 9999 SAY_SMEED_HOME_1 = -1000348, @@ -114,11 +116,11 @@ public: { npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { Reset(); } - uint32 m_uiDespawnTimer; + uint32 DespawnTimer; void Reset() { - m_uiDespawnTimer = 0; + DespawnTimer = 0; } void MoveInLineOfSight(Unit* who) @@ -143,14 +145,14 @@ public: if (pSpell->Id == SPELL_KODO_KOMBO_GOSSIP) { me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - m_uiDespawnTimer = 60000; + DespawnTimer = 60000; } } void UpdateAI(const uint32 diff) { //timer should always be == 0 unless we already updated entry of creature. Then not expect this updated to ever be in combat. - if (m_uiDespawnTimer && m_uiDespawnTimer <= diff) + if (DespawnTimer && DespawnTimer <= diff) { if (!me->getVictim() && me->isAlive()) { @@ -159,7 +161,7 @@ public: me->Respawn(); return; } - } else m_uiDespawnTimer -= diff; + } else DespawnTimer -= diff; if (!UpdateVictim()) return; @@ -175,7 +177,7 @@ public: ## Hand of Iruxos ######*/ -enum +enum Iruxos { QUEST_HAND_IRUXOS = 5381, NPC_DEMON_SPIRIT = 11876, @@ -199,7 +201,10 @@ class go_iruxos : public GameObjectScript ## npc_dalinda_malem. Quest 1440 ######*/ -#define QUEST_RETURN_TO_VAHLARRIEL 1440 +enum Dalinda +{ + QUEST_RETURN_TO_VAHLARRIEL = 1440 +}; class npc_dalinda : public CreatureScript { @@ -228,17 +233,18 @@ public: { npc_dalindaAI(Creature* creature) : npc_escortAI(creature) { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - switch (i) + + switch (waypointId) { case 1: me->IsStandState(); break; case 15: if (player) - player->GroupEventHappens(QUEST_RETURN_TO_VAHLARRIEL, me); + player->GroupEventHappens(QUEST_RETURN_TO_VAHLARRIEL, me); break; } } @@ -249,15 +255,14 @@ public: void JustDied(Unit* /*killer*/) { - Player* player = GetPlayerForEscort(); - if (player) + if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_RETURN_TO_VAHLARRIEL); return; } - void UpdateAI(const uint32 uiDiff) + void UpdateAI(const uint32 Diff) { - npc_escortAI::UpdateAI(uiDiff); + npc_escortAI::UpdateAI(Diff); if (!UpdateVictim()) return; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Kalimdor/durotar.cpp b/src/server/scripts/Kalimdor/durotar.cpp index 6c91c64f981..ec06a542b6f 100644 --- a/src/server/scripts/Kalimdor/durotar.cpp +++ b/src/server/scripts/Kalimdor/durotar.cpp @@ -15,8 +15,10 @@ * with this program. If not, see . */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "Vehicle.h" +#include "SpellScript.h" /*###### ##Quest 5441: Lazy Peons @@ -48,17 +50,17 @@ public: struct npc_lazy_peonAI : public ScriptedAI { - npc_lazy_peonAI(Creature* c) : ScriptedAI(c) {} + npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature) {} - uint64 uiPlayerGUID; + uint64 PlayerGUID; - uint32 m_uiRebuffTimer; + uint32 RebuffTimer; bool work; - void Reset () + void Reset() { - uiPlayerGUID = 0; - m_uiRebuffTimer = 0; + PlayerGUID = 0; + RebuffTimer = 0; work = false; } @@ -81,17 +83,17 @@ public: } } - void UpdateAI(const uint32 uiDiff) + void UpdateAI(const uint32 Diff) { if (work == true) me->HandleEmoteCommand(EMOTE_ONESHOT_WORK_CHOPWOOD); - if (m_uiRebuffTimer <= uiDiff) + if (RebuffTimer <= Diff) { DoCast(me, SPELL_BUFF_SLEEP); - m_uiRebuffTimer = 300000; //Rebuff agian in 5 minutes + RebuffTimer = 300000; //Rebuff agian in 5 minutes } else - m_uiRebuffTimer -= uiDiff; + RebuffTimer -= Diff; if (!UpdateVictim()) return; DoMeleeAttackIfReady(); @@ -170,7 +172,7 @@ enum Points class npc_tiger_matriarch_credit : public CreatureScript { public: - npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit"){} + npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { } struct npc_tiger_matriarch_creditAI : public Scripted_NoMovementAI { @@ -179,7 +181,7 @@ class npc_tiger_matriarch_credit : public CreatureScript events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000); } - void UpdateAI(const uint32 diff) + void UpdateAI(uint32 const diff) { events.Update(diff); @@ -223,27 +225,32 @@ class npc_tiger_matriarch_credit : public CreatureScript class npc_tiger_matriarch : public CreatureScript { public: - npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch"){} + npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") {} struct npc_tiger_matriarchAI : public ScriptedAI { npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature), - _tiger(NULL) + _tigerGuid(0) { } + void EnterCombat(Unit* /*target*/) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_POUNCE, 100); + _events.ScheduleEvent(EVENT_NOSUMMON, 50000); + } + void IsSummonedBy(Unit* summoner) { - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle()) return; - _tiger = summoner->GetVehicle()->GetBase(); - if (_tiger) + _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID(); + if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) { - me->AddThreat(_tiger, 500000.0f); + me->AddThreat(tiger, 500000.0f); DoCast(me, SPELL_FURIOUS_BITE); - events.ScheduleEvent(EVENT_POUNCE, 100); - events.ScheduleEvent(EVENT_NOSUMMON, 50000); } } @@ -259,7 +266,7 @@ class npc_tiger_matriarch : public CreatureScript vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER); vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); } - me->ForcedDespawn(); + me->DespawnOrUnsummon(); } void DamageTaken(Unit* attacker, uint32& damage) @@ -282,7 +289,7 @@ class npc_tiger_matriarch : public CreatureScript vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); } - me->ForcedDespawn(); + me->DespawnOrUnsummon(); } } @@ -291,24 +298,27 @@ class npc_tiger_matriarch : public CreatureScript if (!UpdateVictim()) return; - if (!_tiger) + if (!_tigerGuid) return; - events.Update(diff); + _events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_POUNCE: DoCastVictim(SPELL_POUNCE); - events.ScheduleEvent(EVENT_POUNCE, 30000); + _events.ScheduleEvent(EVENT_POUNCE, 30000); break; case EVENT_NOSUMMON: // Reapply SPELL_NO_SUMMON_AURA - if (_tiger && _tiger->isSummon()) - if (Unit* vehSummoner = _tiger->ToTempSummon()->GetSummoner()) - me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner); - events.ScheduleEvent(EVENT_NOSUMMON, 50000); + if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) + { + if (tiger->isSummon()) + if (Unit* vehSummoner = tiger->ToTempSummon()->GetSummoner()) + me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner); + } + _events.ScheduleEvent(EVENT_NOSUMMON, 50000); break; default: break; @@ -319,8 +329,8 @@ class npc_tiger_matriarch : public CreatureScript } private: - EventMap events; - Unit* _tiger; + EventMap _events; + uint64 _tigerGuid; }; CreatureAI* GetAI(Creature* creature) const @@ -345,26 +355,32 @@ class npc_troll_volunteer : public CreatureScript { npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature) { + } + + void InitializeAI() + { + if (me->isDead() || !me->GetOwner()) + return; + Reset(); - Player* player = me->GetOwner()->ToPlayer(); - switch (urand(1, 4)) + switch (urand(0, 3)) { - case 1: + case 0: _mountModel = 6471; break; - case 2: + case 1: _mountModel = 6473; break; - case 3: + case 2: _mountModel = 6469; break; - case 4: + default: _mountModel = 6472; break; } me->SetDisplayId(trollmodel[urand(0, 39)]); - if (player) + if (Player* player = me->GetOwner()->ToPlayer()) me->GetMotionMaster()->MoveFollow(player, 5.0f, float(rand_norm() + 1.0f) * M_PI / 3.0f * 4.0f); } @@ -417,6 +433,8 @@ class npc_troll_volunteer : public CreatureScript } }; +typedef npc_troll_volunteer::npc_troll_volunteerAI VolunteerAI; + class spell_mount_check : public SpellScriptLoader { public: @@ -442,9 +460,8 @@ class spell_mount_check : public SpellScriptLoader if (owner->IsMounted() && !target->IsMounted()) { - if (Creature* volunteer = target->ToCreature()) - if (uint32 mountid = CAST_AI(npc_troll_volunteer::npc_troll_volunteerAI, volunteer->AI())->GetMountId()) - target->Mount(mountid); + if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI())) + target->Mount(volunteerAI->GetMountId()); } else if (!owner->IsMounted() && target->IsMounted()) target->Dismount(); @@ -493,7 +510,7 @@ class spell_voljin_war_drums : public SpellScriptLoader else if (target->GetEntry() == NPC_CITIZEN_2) motivate = SPELL_MOTIVATE_2; if (motivate) - caster->CastSpell(target, motivate, true, NULL, NULL, caster->GetGUID()); + caster->CastSpell(target, motivate, false); } } @@ -511,13 +528,13 @@ class spell_voljin_war_drums : public SpellScriptLoader enum VoodooSpells { - SPELL_BREW = 16712, // Special Brew - SPELL_GHOSTLY = 16713, // Ghostly - SPELL_HEX1 = 16707, // Hex - SPELL_HEX2 = 16708, // Hex - SPELL_HEX3 = 16709, // Hex - SPELL_GROW = 16711, // Grow - SPELL_LAUNCH = 16716, // Launch (Whee!) + SPELL_BREW = 16712, // Special Brew + SPELL_GHOSTLY = 16713, // Ghostly + SPELL_HEX1 = 16707, // Hex + SPELL_HEX2 = 16708, // Hex + SPELL_HEX3 = 16709, // Hex + SPELL_GROW = 16711, // Grow + SPELL_LAUNCH = 16716, // Launch (Whee!) }; // 17009 @@ -542,13 +559,9 @@ class spell_voodoo : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { - Unit* caster = GetCaster(); + uint32 spellid = RAND(SPELL_BREW, SPELL_GHOSTLY, RAND(SPELL_HEX1, SPELL_HEX2, SPELL_HEX3), SPELL_GROW, SPELL_LAUNCH); if (Unit* target = GetHitUnit()) - { - caster->CastSpell(target, RAND(SPELL_BREW, SPELL_GHOSTLY, - RAND(SPELL_HEX1, SPELL_HEX2, SPELL_HEX3), - SPELL_GROW, SPELL_LAUNCH), false); - } + GetCaster()->CastSpell(target, spellid, false); } void Register() diff --git a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp index eede1aa069a..45e1c1808c1 100644 --- a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp @@ -32,8 +32,11 @@ npc_private_hendel npc_cassa_crimsonwing - handled by npc_taxi EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedEscortAI.h" +#include "ScriptedGossip.h" +#include "SpellScript.h" /*###### ## mobs_risen_husk_spirit @@ -132,7 +135,7 @@ class mobs_risen_husk_spirit : public CreatureScript ## npc_deserter_agitator ######*/ -enum eDeserter +enum Deserter { QUEST_TRAITORS_AMONG_US = 11126, NPC_THERAMORE_DESERTER = 23602, @@ -157,11 +160,11 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_SENDER_INFO) + if (action == GOSSIP_SENDER_INFO) { player->CLOSE_GOSSIP_MENU(); switch (urand(0, 1)) @@ -203,12 +206,12 @@ public: me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } - void MovementInform(uint32 uiType, uint32 uiId) + void MovementInform(uint32 Type, uint32 Id) { - if (uiType != POINT_MOTION_TYPE) + if (Type != POINT_MOTION_TYPE) return; - if (uiId == 1) + if (Id == 1) me->DisappearAndDie(); } }; @@ -218,7 +221,7 @@ public: ## npc_deserter_agitator ######*/ -enum eTheramoreGuard +enum TheramoreGuard { SAY_QUEST1 = -1000641, SAY_QUEST2 = -1000642, @@ -255,18 +258,18 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_SENDER_INFO) + if (action == GOSSIP_SENDER_INFO) { player->CLOSE_GOSSIP_MENU(); player->KilledMonsterCredit(NPC_THERAMORE_GUARD, 0); DoScriptText(SAY_QUEST1, creature); creature->CastSpell(creature, SPELL_DOCTORED_LEAFLET, false); creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->uiYellTimer = 4000; + CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->YellTimer = 4000; CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->bYellTimer = true; } @@ -282,40 +285,40 @@ public: { npc_theramore_guardAI(Creature* creature) : ScriptedAI(creature) { } - uint32 uiYellTimer; - uint32 uiStep; + uint32 YellTimer; + uint32 Step; bool bYellTimer; void Reset() { bYellTimer = false; - uiStep = 0; + Step = 0; } - void UpdateAI(const uint32 uiDiff) + void UpdateAI(const uint32 Diff) { if (!me->HasAura(SPELL_PROPAGANDIZED)) me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - if (bYellTimer && uiYellTimer <= uiDiff) + if (bYellTimer && YellTimer <= Diff) { - switch (uiStep) + switch (Step) { case 0: DoScriptText(RAND(SAY_QUEST2, SAY_QUEST3, SAY_QUEST4, SAY_QUEST5, SAY_QUEST6), me); - uiYellTimer = 3000; - ++uiStep; + YellTimer = 3000; + ++Step; break; case 1: DoScriptText(RAND(SAY_QUEST7, SAY_QUEST8, SAY_QUEST9), me); me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); - uiStep = 0; + Step = 0; bYellTimer = false; break; } } else - uiYellTimer -= uiDiff; + YellTimer -= Diff; } }; }; @@ -324,7 +327,7 @@ public: ## npc_lady_jaina_proudmoore ######*/ -enum eLadyJaina +enum LadyJaina { QUEST_JAINAS_AUTOGRAPH = 558, SPELL_JAINAS_AUTOGRAPH = 23122 @@ -337,10 +340,10 @@ class npc_lady_jaina_proudmoore : public CreatureScript public: npc_lady_jaina_proudmoore() : CreatureScript("npc_lady_jaina_proudmoore") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_SENDER_INFO) + if (action == GOSSIP_SENDER_INFO) { player->SEND_GOSSIP_MENU(7012, creature->GetGUID()); player->CastSpell(player, SPELL_JAINAS_AUTOGRAPH, false); @@ -367,7 +370,7 @@ public: ## npc_nat_pagle ######*/ -enum eNatPagle +enum NatPagle { QUEST_NATS_MEASURING_TAPE = 8227 }; @@ -377,10 +380,10 @@ class npc_nat_pagle : public CreatureScript public: npc_nat_pagle() : CreatureScript("npc_nat_pagle") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -408,7 +411,7 @@ public: ## npc_private_hendel ######*/ -enum eHendel +enum Hendel { // looks like all this text ids are wrong. SAY_PROGRESS_1_TER = -1000411, // signed for 3568 @@ -464,11 +467,11 @@ public: AttackStart(pAttacker); } - void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) + void DamageTaken(Unit* pDoneBy, uint32 &Damage) { - if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(20, uiDamage)) + if (Damage > me->GetHealth() || me->HealthBelowPctDamaged(20, Damage)) { - uiDamage = 0; + Damage = 0; if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself()) player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me); @@ -485,9 +488,9 @@ public: ## npc_zelfrax ######*/ -const Position MovePosition = {-2967.030f, -3872.1799f, 35.620f, 0.0f}; +Position const MovePosition = {-2967.030f, -3872.1799f, 35.620f, 0.0f}; -enum eZelfrax +enum Zelfrax { SAY_ZELFRAX = -1000472, SAY_ZELFRAX_2 = -1000473 @@ -525,9 +528,9 @@ public: } } - void MovementInform(uint32 uiType, uint32 /*uiId*/) + void MovementInform(uint32 Type, uint32 /*Id*/) { - if (uiType != POINT_MOTION_TYPE) + if (Type != POINT_MOTION_TYPE) return; me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); @@ -547,7 +550,7 @@ public: DoScriptText(SAY_ZELFRAX_2, me); } - void UpdateAI(uint32 const /*uiDiff*/) + void UpdateAI(uint32 const /*Diff*/) { if (!UpdateVictim()) return; @@ -562,7 +565,7 @@ public: ## npc_stinky ######*/ -enum eStinky +enum Stinky { QUEST_STINKYS_ESCAPE_H = 1270, QUEST_STINKYS_ESCAPE_A = 1222, @@ -607,49 +610,48 @@ public: { npc_stinkyAI(Creature* creature) : npc_escortAI(creature) { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); if (!player) return; - switch (i) + switch (waypointId) { - case 7: - DoScriptText(SAY_STAY_1, me, player); - break; - case 11: - DoScriptText(SAY_STAY_2, me, player); - break; - case 25: - DoScriptText(SAY_STAY_3, me, player); - break; - case 26: - DoScriptText(SAY_STAY_4, me, player); - break; - case 27: - DoScriptText(SAY_STAY_5, me, player); - break; - case 28: - DoScriptText(SAY_STAY_6, me, player); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - break; - case 29: - me->SetStandState(UNIT_STAND_STATE_STAND); - break; - case 37: - DoScriptText(SAY_QUEST_COMPLETE, me, player); - me->SetSpeed(MOVE_RUN, 1.2f, true); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - if (player && player->GetQuestStatus(QUEST_STINKYS_ESCAPE_H)) - player->GroupEventHappens(QUEST_STINKYS_ESCAPE_H, me); - if (player && player->GetQuestStatus(QUEST_STINKYS_ESCAPE_A)) - player->GroupEventHappens(QUEST_STINKYS_ESCAPE_A, me); - break; - case 39: - DoScriptText(EMOTE_DISAPPEAR, me); - break; - + case 7: + DoScriptText(SAY_STAY_1, me, player); + break; + case 11: + DoScriptText(SAY_STAY_2, me, player); + break; + case 25: + DoScriptText(SAY_STAY_3, me, player); + break; + case 26: + DoScriptText(SAY_STAY_4, me, player); + break; + case 27: + DoScriptText(SAY_STAY_5, me, player); + break; + case 28: + DoScriptText(SAY_STAY_6, me, player); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + break; + case 29: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 37: + DoScriptText(SAY_QUEST_COMPLETE, me, player); + me->SetSpeed(MOVE_RUN, 1.2f, true); + me->SetWalk(false); + if (player->GetQuestStatus(QUEST_STINKYS_ESCAPE_H)) + player->GroupEventHappens(QUEST_STINKYS_ESCAPE_H, me); + if (player->GetQuestStatus(QUEST_STINKYS_ESCAPE_A)) + player->GroupEventHappens(QUEST_STINKYS_ESCAPE_A, me); + break; + case 39: + DoScriptText(EMOTE_DISAPPEAR, me); + break; } } @@ -663,10 +665,11 @@ public: void JustDied(Unit* /*killer*/) { Player* player = GetPlayerForEscort(); - if (HasEscortState(STATE_ESCORT_ESCORTING) && player) + if (player && HasEscortState(STATE_ESCORT_ESCORTING)) { if (player->GetQuestStatus(QUEST_STINKYS_ESCAPE_H)) player->FailQuest(QUEST_STINKYS_ESCAPE_H); + if (player->GetQuestStatus(QUEST_STINKYS_ESCAPE_A)) player->FailQuest(QUEST_STINKYS_ESCAPE_A); } @@ -713,7 +716,7 @@ class spell_ooze_zap : public SpellScriptLoader if (!GetCaster()->HasAura(GetSpellInfo()->Effects[EFFECT_1].CalcValue())) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; // This is actually correct - if (!GetTargetUnit()) + if (!GetExplTargetUnit()) return SPELL_FAILED_BAD_TARGETS; return SPELL_CAST_OK; @@ -847,7 +850,7 @@ public: player->KilledMonsterCredit(NPC_THERAMORE_PRISONER, 0); prisoner->AI()->Talk(SAY_FREE); // We also emote cry here (handled in creature_text.emote) - prisoner->ForcedDespawn(6000); + prisoner->DespawnOrUnsummon(6000); } return true; } diff --git a/src/server/scripts/Kalimdor/felwood.cpp b/src/server/scripts/Kalimdor/felwood.cpp index 91d8a875f17..9243ea0017e 100644 --- a/src/server/scripts/Kalimdor/felwood.cpp +++ b/src/server/scripts/Kalimdor/felwood.cpp @@ -27,7 +27,9 @@ EndScriptData */ npcs_riverbreeze_and_silversky EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*###### ## npcs_riverbreeze_and_silversky @@ -35,32 +37,43 @@ EndContentData */ #define GOSSIP_ITEM_BEACON "Please make me a Cenarion Beacon" +enum RiverbreezeAndSilversky +{ + SPELL_CENARION_BEACON = 15120, + + NPC_ARATHANDRIS_SILVERSKY = 9528, + NPC_MAYBESS_RIVERBREEZE = 9529, + + QUEST_CLEASING_FELWOOD_A = 4101, + QUEST_CLEASING_FELWOOD_H = 4102 +}; + class npcs_riverbreeze_and_silversky : public CreatureScript { public: npcs_riverbreeze_and_silversky() : CreatureScript("npcs_riverbreeze_and_silversky") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, 15120, false); + creature->CastSpell(player, SPELL_CENARION_BEACON, false); } return true; } bool OnGossipHello(Player* player, Creature* creature) { - uint32 eCreature = creature->GetEntry(); - if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); - if (eCreature == 9528) + uint32 creatureId = creature->GetEntry(); + + if (creatureId == NPC_ARATHANDRIS_SILVERSKY) { - if (player->GetQuestRewardStatus(4101)) + if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A)) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(2848, creature->GetGUID()); @@ -70,9 +83,9 @@ public: player->SEND_GOSSIP_MENU(2844, creature->GetGUID()); } - if (eCreature == 9529) + if (creatureId == NPC_MAYBESS_RIVERBREEZE) { - if (player->GetQuestRewardStatus(4102)) + if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H)) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(2849, creature->GetGUID()); @@ -84,7 +97,6 @@ public: return true; } - }; void AddSC_felwood() diff --git a/src/server/scripts/Kalimdor/feralas.cpp b/src/server/scripts/Kalimdor/feralas.cpp index 37a0e4e8f88..4fcd20951c9 100644 --- a/src/server/scripts/Kalimdor/feralas.cpp +++ b/src/server/scripts/Kalimdor/feralas.cpp @@ -23,8 +23,10 @@ SDComment: Quest support: 3520, 2767, Special vendor Gregan Brewspewer SDCategory: Feralas EndScriptData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedEscortAI.h" +#include "ScriptedGossip.h" /*###### ## npc_gregan_brewspewer @@ -37,15 +39,15 @@ class npc_gregan_brewspewer : public CreatureScript public: npc_gregan_brewspewer() : CreatureScript("npc_gregan_brewspewer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); player->SEND_GOSSIP_MENU(2434, creature->GetGUID()); } - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; } @@ -68,7 +70,7 @@ public: ## npc_oox22fe ######*/ -enum eOOX +enum OOX { //signed for 7806 SAY_OOX_START = -1000287, @@ -124,9 +126,9 @@ public: { npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { // First Ambush(3 Yetis) case 11: @@ -154,9 +156,7 @@ public: DoScriptText(SAY_OOX_END, me); // Award quest credit if (Player* player = GetPlayerForEscort()) - { - player->GroupEventHappens(QUEST_RESCUE_OOX22FE, me); - } + player->GroupEventHappens(QUEST_RESCUE_OOX22FE, me); break; } } diff --git a/src/server/scripts/Kalimdor/moonglade.cpp b/src/server/scripts/Kalimdor/moonglade.cpp index 2d6e34ab9ee..9df208d2578 100644 --- a/src/server/scripts/Kalimdor/moonglade.cpp +++ b/src/server/scripts/Kalimdor/moonglade.cpp @@ -31,14 +31,16 @@ npc_clintar_spirit npc_clintar_dreamwalker EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedEscortAI.h" +#include "ScriptedGossip.h" /*###### ## npc_bunthen_plainswind ######*/ -enum eBunthen +enum Bunthen { QUEST_SEA_LION_HORDE = 30, QUEST_SEA_LION_ALLY = 272, @@ -54,10 +56,10 @@ class npc_bunthen_plainswind : public CreatureScript public: npc_bunthen_plainswind() : CreatureScript("npc_bunthen_plainswind") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: player->CLOSE_GOSSIP_MENU(); @@ -113,10 +115,10 @@ class npc_great_bear_spirit : public CreatureScript public: npc_great_bear_spirit() : CreatureScript("npc_great_bear_spirit") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -169,10 +171,10 @@ class npc_silva_filnaveth : public CreatureScript public: npc_silva_filnaveth() : CreatureScript("npc_silva_filnaveth") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: player->CLOSE_GOSSIP_MENU(); @@ -218,70 +220,68 @@ public: ## npc_clintar_spirit ######*/ -float Clintar_spirit_WP[41][5] = +float const Clintar_spirit_WP[41][5] = { - //pos_x pos_y pos_z orien waitTime -{7465.28f, -3115.46f, 439.327f, 0.83f, 4000}, -{7476.49f, -3101, 443.457f, 0.89f, 0}, -{7486.57f, -3085.59f, 439.478f, 1.07f, 0}, -{7472.19f, -3085.06f, 443.142f, 3.07f, 0}, -{7456.92f, -3085.91f, 438.862f, 3.24f, 0}, -{7446.68f, -3083.43f, 438.245f, 2.40f, 0}, -{7446.17f, -3080.21f, 439.826f, 1.10f, 6000}, -{7452.41f, -3085.8f, 438.984f, 5.78f, 0}, -{7469.11f, -3084.94f, 443.048f, 6.25f, 0}, -{7483.79f, -3085.44f, 439.607f, 6.25f, 0}, -{7491.14f, -3090.96f, 439.983f, 5.44f, 0}, -{7497.62f, -3098.22f, 436.854f, 5.44f, 0}, -{7498.72f, -3113.41f, 434.596f, 4.84f, 0}, -{7500.06f, -3122.51f, 434.749f, 5.17f, 0}, -{7504.96f, -3131.53f, 434.475f, 4.74f, 0}, -{7504.31f, -3133.53f, 435.693f, 3.84f, 6000}, -{7504.55f, -3133.27f, 435.476f, 0.68f, 15000}, -{7501.99f, -3126.01f, 434.93f, 1.83f, 0}, -{7490.76f, -3114.97f, 434.431f, 2.51f, 0}, -{7479.64f, -3105.51f, 431.123f, 1.83f, 0}, -{7474.63f, -3086.59f, 428.994f, 1.83f, 2000}, -{7472.96f, -3074.18f, 427.566f, 1.57f, 0}, -{7472.25f, -3063, 428.268f, 1.55f, 0}, -{7473.46f, -3054.22f, 427.588f, 0.36f, 0}, -{7475.08f, -3053.6f, 428.653f, 0.36f, 6000}, -{7474.66f, -3053.56f, 428.433f, 3.19f, 4000}, -{7471.81f, -3058.84f, 427.073f, 4.29f, 0}, -{7472.16f, -3064.91f, 427.772f, 4.95f, 0}, -{7471.56f, -3085.36f, 428.924f, 4.72f, 0}, -{7473.56f, -3093.48f, 429.294f, 5.04f, 0}, -{7478.94f, -3104.29f, 430.638f, 5.23f, 0}, -{7484.46f, -3109.61f, 432.769f, 5.79f, 0}, -{7490.23f, -3111.08f, 434.431f, 0.02f, 0}, -{7496.29f, -3108, 434.783f, 1.15f, 0}, -{7497.46f, -3100.66f, 436.191f, 1.50f, 0}, -{7495.64f, -3093.39f, 438.349f, 2.10f, 0}, -{7492.44f, -3086.01f, 440.267f, 1.38f, 0}, -{7498.26f, -3076.44f, 440.808f, 0.71f, 0}, -{7506.4f, -3067.35f, 443.64f, 0.77f, 0}, -{7518.37f, -3057.42f, 445.584f, 0.74f, 0}, -{7517.51f, -3056.3f, 444.568f, 2.49f, 4500} + //pos_x pos_y pos_z orien waitTime + {7465.28f, -3115.46f, 439.327f, 0.83f, 4000}, + {7476.49f, -3101, 443.457f, 0.89f, 0}, + {7486.57f, -3085.59f, 439.478f, 1.07f, 0}, + {7472.19f, -3085.06f, 443.142f, 3.07f, 0}, + {7456.92f, -3085.91f, 438.862f, 3.24f, 0}, + {7446.68f, -3083.43f, 438.245f, 2.40f, 0}, + {7446.17f, -3080.21f, 439.826f, 1.10f, 6000}, + {7452.41f, -3085.8f, 438.984f, 5.78f, 0}, + {7469.11f, -3084.94f, 443.048f, 6.25f, 0}, + {7483.79f, -3085.44f, 439.607f, 6.25f, 0}, + {7491.14f, -3090.96f, 439.983f, 5.44f, 0}, + {7497.62f, -3098.22f, 436.854f, 5.44f, 0}, + {7498.72f, -3113.41f, 434.596f, 4.84f, 0}, + {7500.06f, -3122.51f, 434.749f, 5.17f, 0}, + {7504.96f, -3131.53f, 434.475f, 4.74f, 0}, + {7504.31f, -3133.53f, 435.693f, 3.84f, 6000}, + {7504.55f, -3133.27f, 435.476f, 0.68f, 15000}, + {7501.99f, -3126.01f, 434.93f, 1.83f, 0}, + {7490.76f, -3114.97f, 434.431f, 2.51f, 0}, + {7479.64f, -3105.51f, 431.123f, 1.83f, 0}, + {7474.63f, -3086.59f, 428.994f, 1.83f, 2000}, + {7472.96f, -3074.18f, 427.566f, 1.57f, 0}, + {7472.25f, -3063, 428.268f, 1.55f, 0}, + {7473.46f, -3054.22f, 427.588f, 0.36f, 0}, + {7475.08f, -3053.6f, 428.653f, 0.36f, 6000}, + {7474.66f, -3053.56f, 428.433f, 3.19f, 4000}, + {7471.81f, -3058.84f, 427.073f, 4.29f, 0}, + {7472.16f, -3064.91f, 427.772f, 4.95f, 0}, + {7471.56f, -3085.36f, 428.924f, 4.72f, 0}, + {7473.56f, -3093.48f, 429.294f, 5.04f, 0}, + {7478.94f, -3104.29f, 430.638f, 5.23f, 0}, + {7484.46f, -3109.61f, 432.769f, 5.79f, 0}, + {7490.23f, -3111.08f, 434.431f, 0.02f, 0}, + {7496.29f, -3108, 434.783f, 1.15f, 0}, + {7497.46f, -3100.66f, 436.191f, 1.50f, 0}, + {7495.64f, -3093.39f, 438.349f, 2.10f, 0}, + {7492.44f, -3086.01f, 440.267f, 1.38f, 0}, + {7498.26f, -3076.44f, 440.808f, 0.71f, 0}, + {7506.4f, -3067.35f, 443.64f, 0.77f, 0}, + {7518.37f, -3057.42f, 445.584f, 0.74f, 0}, + {7517.51f, -3056.3f, 444.568f, 2.49f, 4500} }; -#define ASPECT_RAVEN 22915 - -#define ASPECT_RAVEN_SUMMON_X 7472.96f -#define ASPECT_RAVEN_SUMMON_Y -3074.18f -#define ASPECT_RAVEN_SUMMON_Z 427.566f -#define CLINTAR_SPIRIT_SUMMON_X 7459.2275f -#define CLINTAR_SPIRIT_SUMMON_Y -3122.5632f -#define CLINTAR_SPIRIT_SUMMON_Z 438.9842f -#define CLINTAR_SPIRIT_SUMMON_O 0.8594f - -//from -1000292 to -1000287 are signed for 7806. but all this texts ids wrong. -#define CLINTAR_SPIRIT_SAY_START -1000286 -#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 -1000287 -#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 -1000288 -#define CLINTAR_SPIRIT_SAY_GET_ONE -1000289 -#define CLINTAR_SPIRIT_SAY_GET_TWO -1000290 -#define CLINTAR_SPIRIT_SAY_GET_THREE -1000291 -#define CLINTAR_SPIRIT_SAY_GET_FINAL -1000292 +Position const AspectRavenSummon = {7472.96f, -3074.18f, 427.566f, 0.0f}; +Position const ClintarSpiritSummon = {7459.2275f, -3122.5632f, 438.9842f, 0.8594f}; + +enum ClintarSpirit +{ + ASPECT_RAVEN = 22915, + + //from -1000292 to -1000287 are signed for 7806. but all this texts ids wrong. + CLINTAR_SPIRIT_SAY_START = -1000286, + CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 = -1000287, + CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 = -1000288, + CLINTAR_SPIRIT_SAY_GET_ONE = -1000289, + CLINTAR_SPIRIT_SAY_GET_TWO = -1000290, + CLINTAR_SPIRIT_SAY_GET_THREE = -1000291, + CLINTAR_SPIRIT_SAY_GET_FINAL = -1000292 +}; class npc_clintar_spirit : public CreatureScript { @@ -296,16 +296,16 @@ public: struct npc_clintar_spiritAI : public npc_escortAI { public: - npc_clintar_spiritAI(Creature* c) : npc_escortAI(c) {} + npc_clintar_spiritAI(Creature* creature) : npc_escortAI(creature) {} - uint32 Step; + uint8 Step; uint32 CurrWP; - uint32 Event_Timer; - uint32 checkPlayer_Timer; + uint32 EventTimer; + uint32 checkPlayerTimer; uint64 PlayerGUID; - bool Event_onWait; + bool EventOnWait; void Reset() { @@ -313,10 +313,10 @@ public: { Step = 0; CurrWP = 0; - Event_Timer = 0; + EventTimer = 0; PlayerGUID = 0; - checkPlayer_Timer = 1000; - Event_onWait = false; + checkPlayerTimer = 1000; + EventOnWait = false; } } @@ -347,8 +347,7 @@ public: void EnterCombat(Unit* who) { - uint32 rnd = rand()%2; - switch (rnd) + switch (urand(0, 1)) { case 0: DoScriptText(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1, me, who); break; case 1: DoScriptText(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2, me, who); break; @@ -357,9 +356,7 @@ public: void StartEvent(Player* player) { - if (!player) - return; - if (player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) + if (player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) { for (uint8 i = 0; i < 41; ++i) { @@ -381,18 +378,18 @@ public: return; } - if (!me->isInCombat() && !Event_onWait) + if (!me->isInCombat() && !EventOnWait) { - if (checkPlayer_Timer <= diff) + if (checkPlayerTimer <= diff) { Player* player = Unit::GetPlayer(*me, PlayerGUID); if (player && player->isInCombat() && player->getAttackerForHelper()) AttackStart(player->getAttackerForHelper()); - checkPlayer_Timer = 1000; - } else checkPlayer_Timer -= diff; + checkPlayerTimer = 1000; + } else checkPlayerTimer -= diff; } - if (Event_onWait && Event_Timer <= diff) + if (EventOnWait && EventTimer <= diff) { Player* player = Unit::GetPlayer(*me, PlayerGUID); @@ -409,11 +406,11 @@ public: { case 0: me->Say(CLINTAR_SPIRIT_SAY_START, 0, PlayerGUID); - Event_Timer = 8000; + EventTimer = 8000; Step = 1; break; case 1: - Event_onWait = false; + EventOnWait = false; break; } break; @@ -422,13 +419,13 @@ public: { case 0: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); - Event_Timer = 5000; + EventTimer = 5000; Step = 1; break; case 1: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); DoScriptText(CLINTAR_SPIRIT_SAY_GET_ONE, me, player); - Event_onWait = false; + EventOnWait = false; break; } break; @@ -437,12 +434,12 @@ public: { case 0: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); - Event_Timer = 5000; + EventTimer = 5000; Step = 1; break; case 1: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - Event_onWait = false; + EventOnWait = false; break; } break; @@ -451,11 +448,11 @@ public: { case 0: DoScriptText(CLINTAR_SPIRIT_SAY_GET_TWO, me, player); - Event_Timer = 15000; + EventTimer = 15000; Step = 1; break; case 1: - Event_onWait = false; + EventOnWait = false; break; } break; @@ -463,19 +460,16 @@ public: switch (Step) { case 0: - { - Creature* mob = me->SummonCreature(ASPECT_RAVEN, ASPECT_RAVEN_SUMMON_X, ASPECT_RAVEN_SUMMON_Y, ASPECT_RAVEN_SUMMON_Z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000); - if (mob) + if (Creature* mob = me->SummonCreature(ASPECT_RAVEN, AspectRavenSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { mob->AddThreat(me, 10000.0f); mob->AI()->AttackStart(me); } - Event_Timer = 2000; + EventTimer = 2000; Step = 1; break; - } case 1: - Event_onWait = false; + EventOnWait = false; break; } break; @@ -484,12 +478,12 @@ public: { case 0: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); - Event_Timer = 5000; + EventTimer = 5000; Step = 1; break; case 1: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - Event_onWait = false; + EventOnWait = false; break; } break; @@ -498,11 +492,11 @@ public: { case 0: DoScriptText(CLINTAR_SPIRIT_SAY_GET_THREE, me, player); - Event_Timer = 4000; + EventTimer = 4000; Step = 1; break; case 1: - Event_onWait = false; + EventOnWait = false; break; } break; @@ -513,12 +507,12 @@ public: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2); DoScriptText(CLINTAR_SPIRIT_SAY_GET_FINAL, me, player); player->CompleteQuest(10965); - Event_Timer = 1500; + EventTimer = 1500; Step = 1; break; case 1: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - Event_Timer = 3000; + EventTimer = 3000; Step = 2; break; case 2: @@ -530,19 +524,19 @@ public: } break; default: - Event_onWait = false; + EventOnWait = false; break; } - } else if (Event_onWait) Event_Timer -= diff; + } else if (EventOnWait) EventTimer -= diff; } - void WaypointReached(uint32 id) + void WaypointReached(uint32 waypointId) { - CurrWP = id; - Event_Timer = 0; + CurrWP = waypointId; + EventTimer = 0; Step = 0; - Event_onWait = true; + EventOnWait = true; } }; @@ -552,7 +546,10 @@ public: # npc_clintar_dreamwalker ####*/ -#define CLINTAR_SPIRIT 22916 +enum Clintar +{ + CLINTAR_SPIRIT = 22916 +}; class npc_clintar_dreamwalker : public CreatureScript { @@ -562,11 +559,8 @@ public: bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) { if (quest->GetQuestId() == 10965) - { - Creature* clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, CLINTAR_SPIRIT_SUMMON_X, CLINTAR_SPIRIT_SUMMON_Y, CLINTAR_SPIRIT_SUMMON_Z, CLINTAR_SPIRIT_SUMMON_O, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000); - if (clintar_spirit) + if (Creature* clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, ClintarSpiritSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000)) CAST_AI(npc_clintar_spirit::npc_clintar_spiritAI, clintar_spirit->AI())->StartEvent(player); - } return true; } diff --git a/src/server/scripts/Kalimdor/mulgore.cpp b/src/server/scripts/Kalimdor/mulgore.cpp index c689d6954a4..5b35688c2b8 100644 --- a/src/server/scripts/Kalimdor/mulgore.cpp +++ b/src/server/scripts/Kalimdor/mulgore.cpp @@ -29,8 +29,9 @@ npc_kyle_frenzied npc_plains_vision EndContentData */ -#include "ScriptPCH.h" -#include "ScriptedEscortAI.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*###### # npc_skorn_whitecloud @@ -43,10 +44,10 @@ class npc_skorn_whitecloud : public CreatureScript public: npc_skorn_whitecloud() : CreatureScript("npc_skorn_whitecloud") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) player->SEND_GOSSIP_MENU(523, creature->GetGUID()); return true; @@ -71,7 +72,7 @@ public: # npc_kyle_frenzied ######*/ -enum eKyleFrenzied +enum KyleFrenzied { //emote signed for 7780 but propably thats wrong id. EMOTE_SEE_LUNCH = -1000340, @@ -96,32 +97,32 @@ public: struct npc_kyle_frenziedAI : public ScriptedAI { - npc_kyle_frenziedAI(Creature* c) : ScriptedAI(c) {} + npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) {} - bool bEvent; - bool m_bIsMovingToLunch; - uint64 uiPlayerGUID; - uint32 uiEventTimer; - uint8 uiEventPhase; + bool EventActive; + bool IsMovingToLunch; + uint64 PlayerGUID; + uint32 EventTimer; + uint8 EventPhase; void Reset() { - bEvent = false; - m_bIsMovingToLunch = false; - uiPlayerGUID = 0; - uiEventTimer = 5000; - uiEventPhase = 0; + EventActive = false; + IsMovingToLunch = false; + PlayerGUID = 0; + EventTimer = 5000; + EventPhase = 0; if (me->GetEntry() == NPC_KYLE_FRIENDLY) me->UpdateEntry(NPC_KYLE_FRENZIED); } - void SpellHit(Unit* pCaster, SpellInfo const* pSpell) + void SpellHit(Unit* Caster, SpellInfo const* Spell) { - if (!me->getVictim() && !bEvent && pSpell->Id == SPELL_LUNCH) + if (!me->getVictim() && !EventActive && Spell->Id == SPELL_LUNCH) { - if (pCaster->GetTypeId() == TYPEID_PLAYER) - uiPlayerGUID = pCaster->GetGUID(); + if (Caster->GetTypeId() == TYPEID_PLAYER) + PlayerGUID = Caster->GetGUID(); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { @@ -130,41 +131,41 @@ public: me->StopMoving(); } - bEvent = true; + EventActive = true; DoScriptText(EMOTE_SEE_LUNCH, me); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_CREATURE_SPECIAL); } } - void MovementInform(uint32 uiType, uint32 uiPointId) + void MovementInform(uint32 Type, uint32 PointId) { - if (uiType != POINT_MOTION_TYPE || !bEvent) + if (Type != POINT_MOTION_TYPE || !EventActive) return; - if (uiPointId == POINT_ID) - m_bIsMovingToLunch = false; + if (PointId == POINT_ID) + IsMovingToLunch = false; } void UpdateAI(const uint32 diff) { - if (bEvent) + if (EventActive) { - if (m_bIsMovingToLunch) + if (IsMovingToLunch) return; - if (uiEventTimer <= diff) + if (EventTimer <= diff) { - uiEventTimer = 5000; - ++uiEventPhase; + EventTimer = 5000; + ++EventPhase; - switch (uiEventPhase) + switch (EventPhase) { case 1: - if (Unit* unit = Unit::GetUnit(*me, uiPlayerGUID)) + if (Unit* unit = Unit::GetUnit(*me, PlayerGUID)) { if (GameObject* go = unit->GetGameObject(SPELL_LUNCH)) { - m_bIsMovingToLunch = true; + IsMovingToLunch = true; me->GetMotionMaster()->MovePoint(POINT_ID, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); } } @@ -174,13 +175,13 @@ public: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); break; case 3: - if (Player* unit = Unit::GetPlayer(*me, uiPlayerGUID)) + if (Player* unit = Unit::GetPlayer(*me, PlayerGUID)) unit->TalkedToCreature(me->GetEntry(), me->GetGUID()); me->UpdateEntry(NPC_KYLE_FRIENDLY); break; case 4: - uiEventTimer = 30000; + EventTimer = 30000; DoScriptText(EMOTE_DANCE, me); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCESPECIAL); break; @@ -192,7 +193,7 @@ public: } } else - uiEventTimer -= diff; + EventTimer -= diff; } } }; @@ -203,58 +204,58 @@ public: # npc_plains_vision ######*/ -float wp_plain_vision[50][3] = +Position const wpPlainVision[50] = { - {-2226.32f, -408.095f, -9.36235f}, - {-2203.04f, -437.212f, -5.72498f}, - {-2163.91f, -457.851f, -7.09049f}, - {-2123.87f, -448.137f, -9.29591f}, - {-2104.66f, -427.166f, -6.49513f}, - {-2101.48f, -422.826f, -5.3567f}, - {-2097.56f, -417.083f, -7.16716f}, - {-2084.87f, -398.626f, -9.88973f}, - {-2072.71f, -382.324f, -10.2488f}, - {-2054.05f, -356.728f, -6.22468f}, - {-2051.8f, -353.645f, -5.35791f}, - {-2049.08f, -349.912f, -6.15723f}, - {-2030.6f, -310.724f, -9.59302f}, - {-2002.15f, -249.308f, -10.8124f}, - {-1972.85f, -195.811f, -10.6316f}, - {-1940.93f, -147.652f, -11.7055f}, - {-1888.06f, -81.943f, -11.4404f}, - {-1837.05f, -34.0109f, -12.258f}, - {-1796.12f, -14.6462f, -10.3581f}, - {-1732.61f, -4.27746f, -10.0213f}, - {-1688.94f, -0.829945f, -11.7103f}, - {-1681.32f, 13.0313f, -9.48056f}, - {-1677.04f, 36.8349f, -7.10318f}, - {-1675.2f, 68.559f, -8.95384f}, - {-1676.57f, 89.023f, -9.65104f}, - {-1678.16f, 110.939f, -10.1782f}, - {-1677.86f, 128.681f, -5.73869f}, - {-1675.27f, 144.324f, -3.47916f}, - {-1671.7f, 163.169f, -1.23098f}, - {-1666.61f, 181.584f, 5.26145f}, - {-1661.51f, 196.154f, 8.95252f}, - {-1655.47f, 210.811f, 8.38727f}, - {-1647.07f, 226.947f, 5.27755f}, - {-1621.65f, 232.91f, 2.69579f}, - {-1600.23f, 237.641f, 2.98539f}, - {-1576.07f, 242.546f, 4.66541f}, - {-1554.57f, 248.494f, 6.60377f}, - {-1547.53f, 259.302f, 10.6741f}, - {-1541.7f, 269.847f, 16.4418f}, - {-1539.83f, 278.989f, 21.0597f}, - {-1540.16f, 290.219f, 27.8247f}, - {-1538.99f, 298.983f, 34.0032f}, - {-1540.38f, 307.337f, 41.3557f}, - {-1536.61f, 314.884f, 48.0179f}, - {-1532.42f, 323.277f, 55.6667f}, - {-1528.77f, 329.774f, 61.1525f}, - {-1525.65f, 333.18f, 63.2161f}, - {-1517.01f, 350.713f, 62.4286f}, - {-1511.39f, 362.537f, 62.4539f}, - {-1508.68f, 366.822f, 62.733f} + {-2226.32f, -408.095f, -9.36235f, 0.0f}, + {-2203.04f, -437.212f, -5.72498f, 0.0f}, + {-2163.91f, -457.851f, -7.09049f, 0.0f}, + {-2123.87f, -448.137f, -9.29591f, 0.0f}, + {-2104.66f, -427.166f, -6.49513f, 0.0f}, + {-2101.48f, -422.826f, -5.3567f, 0.0f}, + {-2097.56f, -417.083f, -7.16716f, 0.0f}, + {-2084.87f, -398.626f, -9.88973f, 0.0f}, + {-2072.71f, -382.324f, -10.2488f, 0.0f}, + {-2054.05f, -356.728f, -6.22468f, 0.0f}, + {-2051.8f, -353.645f, -5.35791f, 0.0f}, + {-2049.08f, -349.912f, -6.15723f, 0.0f}, + {-2030.6f, -310.724f, -9.59302f, 0.0f}, + {-2002.15f, -249.308f, -10.8124f, 0.0f}, + {-1972.85f, -195.811f, -10.6316f, 0.0f}, + {-1940.93f, -147.652f, -11.7055f, 0.0f}, + {-1888.06f, -81.943f, -11.4404f, 0.0f}, + {-1837.05f, -34.0109f, -12.258f, 0.0f}, + {-1796.12f, -14.6462f, -10.3581f, 0.0f}, + {-1732.61f, -4.27746f, -10.0213f, 0.0f}, + {-1688.94f, -0.829945f, -11.7103f, 0.0f}, + {-1681.32f, 13.0313f, -9.48056f, 0.0f}, + {-1677.04f, 36.8349f, -7.10318f, 0.0f}, + {-1675.2f, 68.559f, -8.95384f, 0.0f}, + {-1676.57f, 89.023f, -9.65104f, 0.0f}, + {-1678.16f, 110.939f, -10.1782f, 0.0f}, + {-1677.86f, 128.681f, -5.73869f, 0.0f}, + {-1675.27f, 144.324f, -3.47916f, 0.0f}, + {-1671.7f, 163.169f, -1.23098f, 0.0f}, + {-1666.61f, 181.584f, 5.26145f, 0.0f}, + {-1661.51f, 196.154f, 8.95252f, 0.0f}, + {-1655.47f, 210.811f, 8.38727f, 0.0f}, + {-1647.07f, 226.947f, 5.27755f, 0.0f}, + {-1621.65f, 232.91f, 2.69579f, 0.0f}, + {-1600.23f, 237.641f, 2.98539f, 0.0f}, + {-1576.07f, 242.546f, 4.66541f, 0.0f}, + {-1554.57f, 248.494f, 6.60377f, 0.0f}, + {-1547.53f, 259.302f, 10.6741f, 0.0f}, + {-1541.7f, 269.847f, 16.4418f, 0.0f}, + {-1539.83f, 278.989f, 21.0597f, 0.0f}, + {-1540.16f, 290.219f, 27.8247f, 0.0f}, + {-1538.99f, 298.983f, 34.0032f, 0.0f}, + {-1540.38f, 307.337f, 41.3557f, 0.0f}, + {-1536.61f, 314.884f, 48.0179f, 0.0f}, + {-1532.42f, 323.277f, 55.6667f, 0.0f}, + {-1528.77f, 329.774f, 61.1525f, 0.0f}, + {-1525.65f, 333.18f, 63.2161f, 0.0f}, + {-1517.01f, 350.713f, 62.4286f, 0.0f}, + {-1511.39f, 362.537f, 62.4539f, 0.0f}, + {-1508.68f, 366.822f, 62.733f, 0.0f} }; class npc_plains_vision : public CreatureScript @@ -269,7 +270,7 @@ public: struct npc_plains_visionAI : public ScriptedAI { - npc_plains_visionAI(Creature* c) : ScriptedAI(c) {} + npc_plains_visionAI(Creature* creature) : ScriptedAI(creature) {} bool newWaypoint; uint8 WayPointId; @@ -305,7 +306,7 @@ public: { if (newWaypoint) { - me->GetMotionMaster()->MovePoint(WayPointId, wp_plain_vision[WayPointId][0], wp_plain_vision[WayPointId][1], wp_plain_vision[WayPointId][2]); + me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]); newWaypoint = false; } } diff --git a/src/server/scripts/Kalimdor/orgrimmar.cpp b/src/server/scripts/Kalimdor/orgrimmar.cpp index 629abb84fc1..fca8d0f5fc5 100644 --- a/src/server/scripts/Kalimdor/orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/orgrimmar.cpp @@ -28,13 +28,15 @@ npc_shenthul npc_thrall_warchief EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*###### ## npc_shenthul ######*/ -enum eShenthul +enum Shenthul { QUEST_SHATTERED_SALUTE = 2460 }; @@ -61,20 +63,20 @@ public: struct npc_shenthulAI : public ScriptedAI { - npc_shenthulAI(Creature* c) : ScriptedAI(c) {} + npc_shenthulAI(Creature* creature) : ScriptedAI(creature) {} bool CanTalk; bool CanEmote; - uint32 Salute_Timer; - uint32 Reset_Timer; + uint32 SaluteTimer; + uint32 ResetTimer; uint64 PlayerGUID; void Reset() { CanTalk = false; CanEmote = false; - Salute_Timer = 6000; - Reset_Timer = 0; + SaluteTimer = 6000; + ResetTimer = 0; PlayerGUID = 0; } @@ -84,7 +86,7 @@ public: { if (CanEmote) { - if (Reset_Timer <= diff) + if (ResetTimer <= diff) { if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) { @@ -92,17 +94,17 @@ public: player->FailQuest(QUEST_SHATTERED_SALUTE); } Reset(); - } else Reset_Timer -= diff; + } else ResetTimer -= diff; } if (CanTalk && !CanEmote) { - if (Salute_Timer <= diff) + if (SaluteTimer <= diff) { me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); CanEmote = true; - Reset_Timer = 60000; - } else Salute_Timer -= diff; + ResetTimer = 60000; + } else SaluteTimer -= diff; } if (!UpdateVictim()) @@ -130,10 +132,13 @@ public: ## npc_thrall_warchief ######*/ -#define QUEST_6566 6566 +enum ThrallWarchief +{ + QUEST_6566 = 6566, -#define SPELL_CHAIN_LIGHTNING 16033 -#define SPELL_SHOCK 16034 + SPELL_CHAIN_LIGHTNING = 16033, + SPELL_SHOCK = 16034 +}; #define GOSSIP_HTW "Please share your wisdom with me, Warchief." #define GOSSIP_STW1 "What discoveries?" @@ -149,10 +154,10 @@ class npc_thrall_warchief : public CreatureScript public: npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -205,15 +210,15 @@ public: struct npc_thrall_warchiefAI : public ScriptedAI { - npc_thrall_warchiefAI(Creature* c) : ScriptedAI(c) {} + npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) {} - uint32 ChainLightning_Timer; - uint32 Shock_Timer; + uint32 ChainLightningTimer; + uint32 ShockTimer; void Reset() { - ChainLightning_Timer = 2000; - Shock_Timer = 8000; + ChainLightningTimer = 2000; + ShockTimer = 8000; } void EnterCombat(Unit* /*who*/) {} @@ -223,17 +228,17 @@ public: if (!UpdateVictim()) return; - if (ChainLightning_Timer <= diff) + if (ChainLightningTimer <= diff) { DoCast(me->getVictim(), SPELL_CHAIN_LIGHTNING); - ChainLightning_Timer = 9000; - } else ChainLightning_Timer -= diff; + ChainLightningTimer = 9000; + } else ChainLightningTimer -= diff; - if (Shock_Timer <= diff) + if (ShockTimer <= diff) { DoCast(me->getVictim(), SPELL_SHOCK); - Shock_Timer = 15000; - } else Shock_Timer -= diff; + ShockTimer = 15000; + } else ShockTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp index fac56021c3a..639de3dc3b2 100644 --- a/src/server/scripts/Kalimdor/silithus.cpp +++ b/src/server/scripts/Kalimdor/silithus.cpp @@ -29,7 +29,9 @@ npcs_rutgar_and_frankal quest_a_pawn_on_the_eternal_pawn EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "Group.h" /*### @@ -49,10 +51,10 @@ class npc_highlord_demitrian : public CreatureScript public: npc_highlord_demitrian() : CreatureScript("npc_highlord_demitrian") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); @@ -125,19 +127,21 @@ public: #define GOSSIP_ITEM14 "I should ask the monkey about this" #define GOSSIP_ITEM15 "Then what..." -//trigger creatures to kill -#define TRIGGER_RUTGAR 15222 -#define TRIGGER_FRANKAL 15221 +enum RutgarAndFrankal //trigger creatures to kill +{ + TRIGGER_FRANKAL = 15221, + TRIGGER_RUTGAR = 15222 +}; class npcs_rutgar_and_frankal : public CreatureScript { public: npcs_rutgar_and_frankal() : CreatureScript("npcs_rutgar_and_frankal") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -223,7 +227,7 @@ public: /*#### # quest_a_pawn_on_the_eternal_board (Defines) ####*/ -enum eEternalBoard +enum EternalBoard { QUEST_A_PAWN_ON_THE_ETERNAL_BOARD = 8519, @@ -290,7 +294,6 @@ TO DO: get correct spell IDs and timings for spells cast upon dragon transformat TO DO: Dragons should use the HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF) after transformation, but for some unknown reason it doesnt work. EndContentData */ -#define QUEST_A_PAWN_ON_THE_ETERNAL_BOARD 8519 #define EVENT_AREA_RADIUS 65 //65yds #define EVENT_COOLDOWN 500000 //in ms. appear after event completed or failed (should be = Adds despawn time) @@ -374,7 +377,7 @@ static QuestCinematic EventAnim[]= }; //Cordinates for Spawns -static const Position SpawnLocation[]= +Position const SpawnLocation[] = { {-8085.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry {-8080.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry @@ -455,7 +458,7 @@ struct WaveData int32 WaveTextId; }; -static WaveData WavesInfo[] = +static WaveData WavesInfo[5] = { {30, 0, 15423, 0, 0, 24000, 0}, // Kaldorei Soldier { 3, 35, 15424, 0, 0, 24000, 0}, // Anubisath Conqueror @@ -470,7 +473,7 @@ struct SpawnSpells uint32 Timer1, Timer2, SpellId; }; -static SpawnSpells SpawnCast[]=// +static SpawnSpells SpawnCast[4] = { {100000, 2000, 33652}, // Stop Time {38500, 300000, 28528}, // Poison Cloud @@ -485,14 +488,14 @@ class npc_anachronos_the_ancient : public CreatureScript public: npc_anachronos_the_ancient() : CreatureScript("npc_anachronos_the_ancient") { } - CreatureAI* GetAI(Creature* c) const + CreatureAI* GetAI(Creature* creature) const { - return new npc_anachronos_the_ancientAI(c); + return new npc_anachronos_the_ancientAI(creature); } struct npc_anachronos_the_ancientAI : public ScriptedAI { - npc_anachronos_the_ancientAI(Creature* c) : ScriptedAI(c) {} + npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature) {} uint32 AnimationTimer; uint8 AnimationCount; @@ -576,7 +579,7 @@ public: break; case 10: Merithra->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - Merithra->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + Merithra->SetDisableGravity(true); Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 3); break; case 11: @@ -603,7 +606,7 @@ public: break; case 18: Arygos->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - Arygos->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + Arygos->SetDisableGravity(true); Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 42); break; case 19: @@ -630,7 +633,7 @@ public: break; case 26: Caelestrasz->HandleEmoteCommand(254); - Caelestrasz->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + Caelestrasz->SetDisableGravity(true); Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 7.61f, 4); break; case 27: @@ -769,7 +772,7 @@ public: break; case 63: me->HandleEmoteCommand(254); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); break; case 64: me->GetMotionMaster()->MoveCharge(-8000, 1400, 150, 9); @@ -813,14 +816,14 @@ class mob_qiraj_war_spawn : public CreatureScript public: mob_qiraj_war_spawn() : CreatureScript("mob_qiraj_war_spawn") { } - CreatureAI* GetAI(Creature* c) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_qiraj_war_spawnAI(c); + return new mob_qiraj_war_spawnAI(creature); } struct mob_qiraj_war_spawnAI : public ScriptedAI { - mob_qiraj_war_spawnAI(Creature* c) : ScriptedAI(c) {} + mob_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature) {} uint64 MobGUID; uint64 PlayerGUID; @@ -928,14 +931,14 @@ class npc_anachronos_quest_trigger : public CreatureScript public: npc_anachronos_quest_trigger() : CreatureScript("npc_anachronos_quest_trigger") { } - CreatureAI* GetAI(Creature* c) const + CreatureAI* GetAI(Creature* creature) const { - return new npc_anachronos_quest_triggerAI(c); + return new npc_anachronos_quest_triggerAI(creature); } struct npc_anachronos_quest_triggerAI : public ScriptedAI { - npc_anachronos_quest_triggerAI(Creature* c) : ScriptedAI(c) {} + npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature) {} uint64 PlayerGUID; @@ -967,16 +970,15 @@ public: void SummonNextWave() { - //uint8 count = WavesInfo[WaveCount].SpawnCount; uint8 locIndex = WavesInfo[WaveCount].UsedSpawnPoint; - //uint8 KaldoreiSoldierCount = 0; - //uint8 AnubisathConquerorCount = 0; - //uint8 QirajiWaspCount = 0; - for (uint8 i = 0; i < 67; ++i) + uint8 count = locIndex + WavesInfo[WaveCount].SpawnCount; + + for (uint8 i = locIndex; i <= count; ++i) { - if (Creature* spawn = me->SummonCreature(WavesInfo[WaveCount].CreatureId, SpawnLocation[locIndex + i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, WavesInfo[WaveCount].DespTimer)) + uint32 desptimer = WavesInfo[WaveCount].DespTimer; + + if (Creature* spawn = me->SummonCreature(WavesInfo[WaveCount].CreatureId, SpawnLocation[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, desptimer)) { - spawn->LoadCreaturesAddon(); if (spawn->GetEntry() == 15423) spawn->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15427+rand()%4); if (i >= 30) WaveCount = 1; @@ -986,12 +988,15 @@ public: if (WaveCount < 5) //1-4 Wave { - mob_qiraj_war_spawn::mob_qiraj_war_spawnAI* spawnAI = CAST_AI(mob_qiraj_war_spawn::mob_qiraj_war_spawnAI, spawn->AI()); - spawnAI->MobGUID = me->GetGUID(); - spawnAI->PlayerGUID = PlayerGUID; + if (mob_qiraj_war_spawn::mob_qiraj_war_spawnAI* spawnAI = CAST_AI(mob_qiraj_war_spawn::mob_qiraj_war_spawnAI, spawn->AI())) + { + spawnAI->MobGUID = me->GetGUID(); + spawnAI->PlayerGUID = PlayerGUID; + } } } } + WaveTimer = WavesInfo[WaveCount].SpawnTimer; AnnounceTimer = WavesInfo[WaveCount].YellTimer; } @@ -1005,27 +1010,27 @@ public: if (Group* EventGroup = player->GetGroup()) { - Player* GroupMember; + Player* groupMember; uint8 GroupMemberCount = 0; uint8 DeadMemberCount = 0; uint8 FailedMemberCount = 0; - const Group::MemberSlotList members = EventGroup->GetMemberSlots(); + Group::MemberSlotList const members = EventGroup->GetMemberSlots(); for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr) { - GroupMember = (Unit::GetPlayer(*me, itr->guid)); - if (!GroupMember) + groupMember = (Unit::GetPlayer(*me, itr->guid)); + if (!groupMember) continue; - if (!GroupMember->IsWithinDistInMap(me, EVENT_AREA_RADIUS) && GroupMember->GetQuestStatus(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) == QUEST_STATUS_INCOMPLETE) + if (!groupMember->IsWithinDistInMap(me, EVENT_AREA_RADIUS) && groupMember->GetQuestStatus(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) == QUEST_STATUS_INCOMPLETE) { - GroupMember->FailQuest(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD); + groupMember->FailQuest(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD); ++FailedMemberCount; } ++GroupMemberCount; - if (GroupMember->isDead()) + if (groupMember->isDead()) ++DeadMemberCount; } @@ -1069,8 +1074,13 @@ public: void mob_qiraj_war_spawn::mob_qiraj_war_spawnAI::JustDied(Unit* /*slayer*/) { me->RemoveCorpse(); - if (Creature* Mob = (Unit::GetCreature(*me, MobGUID))) - CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, Mob->AI())->LiveCounter(); + + if (!MobGUID) + return; + + if (Creature* mob = Unit::GetCreature(*me, MobGUID)) + if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, mob->AI())) + triggerAI->LiveCounter(); }; @@ -1087,15 +1097,13 @@ public: { if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) { - - if (Unit* Anachronos_Quest_Trigger = go->FindNearestCreature(15454, 100, player)) + if (Creature* trigger = go->FindNearestCreature(15454, 100, player)) { - - Unit* Merithra = Anachronos_Quest_Trigger->SummonCreature(15378, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Caelestrasz = Anachronos_Quest_Trigger->SummonCreature(15379, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Arygos = Anachronos_Quest_Trigger->SummonCreature(15380, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - /* Unit* Fandral = */ Anachronos_Quest_Trigger->SummonCreature(15382, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Creature* Anachronos = Anachronos_Quest_Trigger->SummonCreature(15381, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Merithra = trigger->SummonCreature(15378, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Caelestrasz = trigger->SummonCreature(15379, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Arygos = trigger->SummonCreature(15380, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + /* Unit* Fandral = */ trigger->SummonCreature(15382, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Creature* Anachronos = trigger->SummonCreature(15381, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); if (Merithra) { @@ -1123,11 +1131,16 @@ public: if (Anachronos) { - CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())->PlayerGUID = player->GetGUID(); - CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->Failed=false; - CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->PlayerGUID = player->GetGUID(); - CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->EventStarted=true; - CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->Announced=true; + if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())) + anachronosAI->PlayerGUID = player->GetGUID(); + + if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) + { + triggerAI->Failed = false; + triggerAI->PlayerGUID = player->GetGUID(); + triggerAI->EventStarted = true; + triggerAI->Announced = true; + } } } } diff --git a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/stonetalon_mountains.cpp index c31a7731865..d38395c7b37 100644 --- a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/stonetalon_mountains.cpp @@ -28,7 +28,9 @@ npc_braug_dimspirit npc_kaya_flathoof EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptedEscortAI.h" /*###### @@ -46,16 +48,16 @@ class npc_braug_dimspirit : public CreatureScript public: npc_braug_dimspirit() : CreatureScript("npc_braug_dimspirit") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, 6766, false); } - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+2) { player->CLOSE_GOSSIP_MENU(); player->AreaExploredOrEventHappens(6627); @@ -90,7 +92,7 @@ public: ## npc_kaya_flathoof ######*/ -enum eKaya +enum Kaya { FACTION_ESCORTEE_H = 775, @@ -112,28 +114,27 @@ public: struct npc_kaya_flathoofAI : public npc_escortAI { - npc_kaya_flathoofAI(Creature* c) : npc_escortAI(c) {} + npc_kaya_flathoofAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 16: - DoScriptText(SAY_AMBUSH, me); - me->SummonCreature(NPC_GRIMTOTEM_BRUTE, -48.53f, -503.34f, -46.31f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_GRIMTOTEM_RUFFIAN, -38.85f, -503.77f, -45.90f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_GRIMTOTEM_SORCERER, -36.37f, -496.23f, -45.71f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 18: me->SetInFront(player); - DoScriptText(SAY_END, me, player); - if (player) + case 16: + DoScriptText(SAY_AMBUSH, me); + me->SummonCreature(NPC_GRIMTOTEM_BRUTE, -48.53f, -503.34f, -46.31f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_GRIMTOTEM_RUFFIAN, -38.85f, -503.77f, -45.90f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_GRIMTOTEM_SORCERER, -36.37f, -496.23f, -45.71f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 18: + me->SetInFront(player); + DoScriptText(SAY_END, me, player); player->GroupEventHappens(QUEST_PROTECT_KAYA, me); - break; + break; } } diff --git a/src/server/scripts/Kalimdor/tanaris.cpp b/src/server/scripts/Kalimdor/tanaris.cpp index ff6cdccb66a..9b742b495bb 100644 --- a/src/server/scripts/Kalimdor/tanaris.cpp +++ b/src/server/scripts/Kalimdor/tanaris.cpp @@ -33,7 +33,9 @@ npc_OOX17 npc_tooga EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptedEscortAI.h" #include "ScriptedFollowerAI.h" @@ -41,10 +43,13 @@ EndContentData */ ## mob_aquementas ######*/ -#define AGGRO_YELL_AQUE -1000350 +enum Aquementas +{ + AGGRO_YELL_AQUE = -1000350, -#define SPELL_AQUA_JET 13586 -#define SPELL_FROST_SHOCK 15089 + SPELL_AQUA_JET = 13586, + SPELL_FROST_SHOCK = 15089 +}; class mob_aquementas : public CreatureScript { @@ -58,24 +63,24 @@ public: struct mob_aquementasAI : public ScriptedAI { - mob_aquementasAI(Creature* c) : ScriptedAI(c) {} + mob_aquementasAI(Creature* creature) : ScriptedAI(creature) {} - uint32 SendItem_Timer; - uint32 SwitchFaction_Timer; + uint32 SendItemTimer; + uint32 SwitchFactionTimer; bool isFriendly; - uint32 FrostShock_Timer; - uint32 AquaJet_Timer; + uint32 FrostShockTimer; + uint32 AquaJetTimer; void Reset() { - SendItem_Timer = 0; - SwitchFaction_Timer = 10000; + SendItemTimer = 0; + SwitchFactionTimer = 10000; me->setFaction(35); isFriendly = true; - AquaJet_Timer = 5000; - FrostShock_Timer = 1000; + AquaJetTimer = 5000; + FrostShockTimer = 1000; } void SendItem(Unit* receiver) @@ -101,11 +106,11 @@ public: { if (isFriendly) { - if (SwitchFaction_Timer <= diff) + if (SwitchFactionTimer <= diff) { me->setFaction(91); isFriendly = false; - } else SwitchFaction_Timer -= diff; + } else SwitchFactionTimer -= diff; } if (!UpdateVictim()) @@ -113,25 +118,25 @@ public: if (!isFriendly) { - if (SendItem_Timer <= diff) + if (SendItemTimer <= diff) { if (me->getVictim()->GetTypeId() == TYPEID_PLAYER) SendItem(me->getVictim()); - SendItem_Timer = 5000; - } else SendItem_Timer -= diff; + SendItemTimer = 5000; + } else SendItemTimer -= diff; } - if (FrostShock_Timer <= diff) + if (FrostShockTimer <= diff) { DoCast(me->getVictim(), SPELL_FROST_SHOCK); - FrostShock_Timer = 15000; - } else FrostShock_Timer -= diff; + FrostShockTimer = 15000; + } else FrostShockTimer -= diff; - if (AquaJet_Timer <= diff) + if (AquaJetTimer <= diff) { DoCast(me, SPELL_AQUA_JET); - AquaJet_Timer = 15000; - } else AquaJet_Timer -= diff; + AquaJetTimer = 15000; + } else AquaJetTimer -= diff; DoMeleeAttackIfReady(); } @@ -143,20 +148,23 @@ public: ## npc_custodian_of_time ######*/ -#define WHISPER_CUSTODIAN_1 -1000217 -#define WHISPER_CUSTODIAN_2 -1000218 -#define WHISPER_CUSTODIAN_3 -1000219 -#define WHISPER_CUSTODIAN_4 -1000220 -#define WHISPER_CUSTODIAN_5 -1000221 -#define WHISPER_CUSTODIAN_6 -1000222 -#define WHISPER_CUSTODIAN_7 -1000223 -#define WHISPER_CUSTODIAN_8 -1000224 -#define WHISPER_CUSTODIAN_9 -1000225 -#define WHISPER_CUSTODIAN_10 -1000226 -#define WHISPER_CUSTODIAN_11 -1000227 -#define WHISPER_CUSTODIAN_12 -1000228 -#define WHISPER_CUSTODIAN_13 -1000229 -#define WHISPER_CUSTODIAN_14 -1000230 +enum CustodianOfTime +{ + WHISPER_CUSTODIAN_1 = -1000217, + WHISPER_CUSTODIAN_2 = -1000218, + WHISPER_CUSTODIAN_3 = -1000219, + WHISPER_CUSTODIAN_4 = -1000220, + WHISPER_CUSTODIAN_5 = -1000221, + WHISPER_CUSTODIAN_6 = -1000222, + WHISPER_CUSTODIAN_7 = -1000223, + WHISPER_CUSTODIAN_8 = -1000224, + WHISPER_CUSTODIAN_9 = -1000225, + WHISPER_CUSTODIAN_10 = -1000226, + WHISPER_CUSTODIAN_11 = -1000227, + WHISPER_CUSTODIAN_12 = -1000228, + WHISPER_CUSTODIAN_13 = -1000229, + WHISPER_CUSTODIAN_14 = -1000230 +}; class npc_custodian_of_time : public CreatureScript { @@ -170,39 +178,72 @@ public: struct npc_custodian_of_timeAI : public npc_escortAI { - npc_custodian_of_timeAI(Creature* c) : npc_escortAI(c) {} + npc_custodian_of_timeAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (i) + if (Player* player = GetPlayerForEscort()) { - case 0: DoScriptText(WHISPER_CUSTODIAN_1, me, player); break; - case 1: DoScriptText(WHISPER_CUSTODIAN_2, me, player); break; - case 2: DoScriptText(WHISPER_CUSTODIAN_3, me, player); break; - case 3: DoScriptText(WHISPER_CUSTODIAN_4, me, player); break; - case 5: DoScriptText(WHISPER_CUSTODIAN_5, me, player); break; - case 6: DoScriptText(WHISPER_CUSTODIAN_6, me, player); break; - case 7: DoScriptText(WHISPER_CUSTODIAN_7, me, player); break; - case 8: DoScriptText(WHISPER_CUSTODIAN_8, me, player); break; - case 9: DoScriptText(WHISPER_CUSTODIAN_9, me, player); break; - case 10: DoScriptText(WHISPER_CUSTODIAN_4, me, player); break; - case 13: DoScriptText(WHISPER_CUSTODIAN_10, me, player); break; - case 14: DoScriptText(WHISPER_CUSTODIAN_4, me, player); break; - case 16: DoScriptText(WHISPER_CUSTODIAN_11, me, player); break; - case 17: DoScriptText(WHISPER_CUSTODIAN_12, me, player); break; - case 18: DoScriptText(WHISPER_CUSTODIAN_4, me, player); break; - case 22: DoScriptText(WHISPER_CUSTODIAN_13, me, player); break; - case 23: DoScriptText(WHISPER_CUSTODIAN_4, me, player); break; - case 24: - DoScriptText(WHISPER_CUSTODIAN_14, me, player); - DoCast(player, 34883); - // below here is temporary workaround, to be removed when spell works properly - player->AreaExploredOrEventHappens(10277); - break; + switch (waypointId) + { + case 0: + DoScriptText(WHISPER_CUSTODIAN_1, me, player); + break; + case 1: + DoScriptText(WHISPER_CUSTODIAN_2, me, player); + break; + case 2: + DoScriptText(WHISPER_CUSTODIAN_3, me, player); + break; + case 3: + DoScriptText(WHISPER_CUSTODIAN_4, me, player); + break; + case 5: + DoScriptText(WHISPER_CUSTODIAN_5, me, player); + break; + case 6: + DoScriptText(WHISPER_CUSTODIAN_6, me, player); + break; + case 7: + DoScriptText(WHISPER_CUSTODIAN_7, me, player); + break; + case 8: + DoScriptText(WHISPER_CUSTODIAN_8, me, player); + break; + case 9: + DoScriptText(WHISPER_CUSTODIAN_9, me, player); + break; + case 10: + DoScriptText(WHISPER_CUSTODIAN_4, me, player); + break; + case 13: + DoScriptText(WHISPER_CUSTODIAN_10, me, player); + break; + case 14: + DoScriptText(WHISPER_CUSTODIAN_4, me, player); + break; + case 16: + DoScriptText(WHISPER_CUSTODIAN_11, me, player); + break; + case 17: + DoScriptText(WHISPER_CUSTODIAN_12, me, player); + break; + case 18: + DoScriptText(WHISPER_CUSTODIAN_4, me, player); + break; + case 22: + DoScriptText(WHISPER_CUSTODIAN_13, me, player); + break; + case 23: + DoScriptText(WHISPER_CUSTODIAN_4, me, player); + break; + case 24: + DoScriptText(WHISPER_CUSTODIAN_14, me, player); + DoCast(player, 34883); + // below here is temporary workaround, to be removed when spell works properly + player->AreaExploredOrEventHappens(10277); + break; + } } } @@ -225,7 +266,7 @@ public: } void EnterCombat(Unit* /*who*/) {} - void Reset() { } + void Reset() {} void UpdateAI(const uint32 diff) { @@ -244,10 +285,10 @@ class npc_marin_noggenfogger : public CreatureScript public: npc_marin_noggenfogger() : CreatureScript("npc_marin_noggenfogger") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -287,10 +328,10 @@ public: return false; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) player->CastSpell(player, 34891, true); //(Flight through Caverns) return true; @@ -330,10 +371,10 @@ class npc_stone_watcher_of_norgannon : public CreatureScript public: npc_stone_watcher_of_norgannon() : CreatureScript("npc_stone_watcher_of_norgannon") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); @@ -382,7 +423,7 @@ public: ## npc_OOX17 ######*/ -enum e00X17 +enum Npc00X17 { //texts are signed for 7806 SAY_OOX_START = -1000287, @@ -426,39 +467,33 @@ public: struct npc_OOX17AI : public npc_escortAI { - npc_OOX17AI(Creature* c) : npc_escortAI(c) {} + npc_OOX17AI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - if (!player) - return; - - switch (i) { - case 23: - me->SummonCreature(SPAWN_FIRST, -8350.96f, -4445.79f, 10.10f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_FIRST, -8355.96f, -4447.79f, 10.10f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_FIRST, -8353.96f, -4442.79f, 10.10f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_OOX_AMBUSH, me); - break; - - case 56: - me->SummonCreature(SPAWN_SECOND_1, -7510.07f, -4795.50f, 9.35f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_SECOND_2, -7515.07f, -4797.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_SECOND_2, -7518.07f, -4792.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_OOX_AMBUSH, me); - if (Unit* scoff = me->FindNearestCreature(SPAWN_SECOND_2, 30)) - DoScriptText(SAY_OOX17_AMBUSH_REPLY, scoff); - break; - - case 86: - if (player) - { + if (Player* player = GetPlayerForEscort()) + { + switch (waypointId) + { + case 23: + me->SummonCreature(SPAWN_FIRST, -8350.96f, -4445.79f, 10.10f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_FIRST, -8355.96f, -4447.79f, 10.10f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_FIRST, -8353.96f, -4442.79f, 10.10f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + DoScriptText(SAY_OOX_AMBUSH, me); + break; + case 56: + me->SummonCreature(SPAWN_SECOND_1, -7510.07f, -4795.50f, 9.35f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_SECOND_2, -7515.07f, -4797.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_SECOND_2, -7518.07f, -4792.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + DoScriptText(SAY_OOX_AMBUSH, me); + if (Unit* scoff = me->FindNearestCreature(SPAWN_SECOND_2, 30)) + DoScriptText(SAY_OOX17_AMBUSH_REPLY, scoff); + break; + case 86: DoScriptText(SAY_OOX_END, me); player->GroupEventHappens(Q_OOX17, me); - } - break; + break; + } } } @@ -474,14 +509,13 @@ public: summoned->AI()->AttackStart(me); } }; - }; /*#### # npc_tooga ####*/ -enum eTooga +enum Tooga { SAY_TOOG_THIRST = -1000391, SAY_TOOG_WORRIED = -1000392, @@ -499,7 +533,7 @@ enum eTooga FACTION_TOOG_ESCORTEE = 113 }; -const float m_afToWaterLoc[] = {-7032.664551f, -4906.199219f, -1.606446f}; +Position const ToWaterLoc = {-7032.664551f, -4906.199219f, -1.606446f, 0.0f}; class npc_tooga : public CreatureScript { @@ -526,17 +560,17 @@ public: { npc_toogaAI(Creature* creature) : FollowerAI(creature) { } - uint32 m_uiCheckSpeechTimer; - uint32 m_uiPostEventTimer; - uint32 m_uiPhasePostEvent; + uint32 CheckSpeechTimer; + uint32 PostEventTimer; + uint32 PhasePostEvent; uint64 TortaGUID; void Reset() { - m_uiCheckSpeechTimer = 2500; - m_uiPostEventTimer = 1000; - m_uiPhasePostEvent = 0; + CheckSpeechTimer = 2500; + PostEventTimer = 1000; + PhasePostEvent = 0; TortaGUID = 0; } @@ -549,11 +583,9 @@ public: { if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) { - if (Player* player = GetLeaderForFollower()) - { - if (player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_TOOGA, me); - } + Player* player = GetLeaderForFollower(); + if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) + player->GroupEventHappens(QUEST_TOOGA, me); TortaGUID = who->GetGUID(); SetFollowComplete(true); @@ -561,27 +593,27 @@ public: } } - void MovementInform(uint32 uiMotionType, uint32 uiPointId) + void MovementInform(uint32 MotionType, uint32 PointId) { - FollowerAI::MovementInform(uiMotionType, uiPointId); + FollowerAI::MovementInform(MotionType, PointId); - if (uiMotionType != POINT_MOTION_TYPE) + if (MotionType != POINT_MOTION_TYPE) return; - if (uiPointId == POINT_ID_TO_WATER) + if (PointId == POINT_ID_TO_WATER) SetFollowComplete(); } - void UpdateFollowerAI(const uint32 uiDiff) + void UpdateFollowerAI(const uint32 Diff) { if (!UpdateVictim()) { //we are doing the post-event, or... if (HasFollowState(STATE_FOLLOW_POSTEVENT)) { - if (m_uiPostEventTimer <= uiDiff) + if (PostEventTimer <= Diff) { - m_uiPostEventTimer = 5000; + PostEventTimer = 5000; Unit* pTorta = Unit::GetUnit(*me, TortaGUID); if (!pTorta || !pTorta->isAlive()) @@ -591,7 +623,7 @@ public: return; } - switch (m_uiPhasePostEvent) + switch (PhasePostEvent) { case 1: DoScriptText(SAY_TOOG_POST_1, me); @@ -610,27 +642,27 @@ public: break; case 6: DoScriptText(SAY_TORT_POST_6, pTorta); - me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, m_afToWaterLoc[0], m_afToWaterLoc[1], m_afToWaterLoc[2]); + me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc); break; } - ++m_uiPhasePostEvent; + ++PhasePostEvent; } else - m_uiPostEventTimer -= uiDiff; + PostEventTimer -= Diff; } //...we are doing regular speech check else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) { - if (m_uiCheckSpeechTimer <= uiDiff) + if (CheckSpeechTimer <= Diff) { - m_uiCheckSpeechTimer = 5000; + CheckSpeechTimer = 5000; if (urand(0, 9) > 8) DoScriptText(RAND(SAY_TOOG_THIRST, SAY_TOOG_WORRIED), me); } else - m_uiCheckSpeechTimer -= uiDiff; + CheckSpeechTimer -= Diff; } return; diff --git a/src/server/scripts/Kalimdor/teldrassil.cpp b/src/server/scripts/Kalimdor/teldrassil.cpp index d7cac99c374..7f2b2fc7f05 100644 --- a/src/server/scripts/Kalimdor/teldrassil.cpp +++ b/src/server/scripts/Kalimdor/teldrassil.cpp @@ -27,14 +27,15 @@ EndScriptData */ npc_mist EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedFollowerAI.h" /*#### # npc_mist ####*/ -enum eMist +enum Mist { SAY_AT_HOME = -1000323, EMOTE_AT_HOME = -1000324, @@ -51,10 +52,8 @@ public: bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) { if (quest->GetQuestId() == QUEST_MIST) - { if (npc_mistAI* pMistAI = CAST_AI(npc_mist::npc_mistAI, creature->AI())) pMistAI->StartFollow(player, FACTION_DARNASSUS, quest); - } return true; } @@ -88,18 +87,16 @@ public: { DoScriptText(EMOTE_AT_HOME, me); - if (Player* player = GetLeaderForFollower()) - { - if (player->GetQuestStatus(QUEST_MIST) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_MIST, me); - } + Player* player = GetLeaderForFollower(); + if (player && player->GetQuestStatus(QUEST_MIST) == QUEST_STATUS_INCOMPLETE) + player->GroupEventHappens(QUEST_MIST, me); //The follow is over (and for later development, run off to the woods before really end) SetFollowComplete(); } //call not needed here, no known abilities - /*void UpdateFollowerAI(const uint32 uiDiff) + /*void UpdateFollowerAI(const uint32 Diff) { if (!UpdateVictim()) return; diff --git a/src/server/scripts/Kalimdor/the_barrens.cpp b/src/server/scripts/Kalimdor/the_barrens.cpp index e12897c1def..f4983558b67 100644 --- a/src/server/scripts/Kalimdor/the_barrens.cpp +++ b/src/server/scripts/Kalimdor/the_barrens.cpp @@ -32,7 +32,9 @@ npc_twiggy_flathead npc_wizzlecrank_shredder EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptedEscortAI.h" /*###### @@ -41,7 +43,7 @@ EndContentData */ #define GOSSIP_CORPSE "Examine corpse in detail..." -enum eQuests +enum BeatenCorpse { QUEST_LOST_IN_BATTLE = 4921 }; @@ -51,10 +53,10 @@ class npc_beaten_corpse : public CreatureScript public: npc_beaten_corpse() : CreatureScript("npc_beaten_corpse") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF +1) + if (action == GOSSIP_ACTION_INFO_DEF +1) { player->SEND_GOSSIP_MENU(3558, creature->GetGUID()); player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); @@ -77,7 +79,7 @@ public: # npc_gilthares ######*/ -enum eGilthares +enum Gilthares { SAY_GIL_START = -1000370, SAY_GIL_AT_LAST = -1000371, @@ -127,14 +129,13 @@ public: void Reset() { } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (uiPointId) + switch (waypointId) { case 16: DoScriptText(SAY_GIL_AT_LAST, me, player); @@ -186,10 +187,10 @@ class npc_sputtervalve : public CreatureScript public: npc_sputtervalve() : CreatureScript("npc_sputtervalve") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->SEND_GOSSIP_MENU(2013, creature->GetGUID()); player->AreaExploredOrEventHappens(6981); @@ -215,7 +216,7 @@ public: ## npc_taskmaster_fizzule ######*/ -enum eEnums +enum TaskmasterFizzule { FACTION_FRIENDLY_F = 35, SPELL_FLARE = 10113, @@ -234,20 +235,20 @@ public: struct npc_taskmaster_fizzuleAI : public ScriptedAI { - npc_taskmaster_fizzuleAI(Creature* c) : ScriptedAI(c) + npc_taskmaster_fizzuleAI(Creature* creature) : ScriptedAI(creature) { - factionNorm = c->getFaction(); + factionNorm = creature->getFaction(); } uint32 factionNorm; bool IsFriend; - uint32 Reset_Timer; + uint32 ResetTimer; uint8 FlareCount; void Reset() { IsFriend = false; - Reset_Timer = 120000; + ResetTimer = 120000; FlareCount = 0; me->setFaction(factionNorm); } @@ -282,11 +283,11 @@ public: { if (IsFriend) { - if (Reset_Timer <= diff) + if (ResetTimer <= diff) { EnterEvadeMode(); return; - } else Reset_Timer -= diff; + } else ResetTimer -= diff; } if (!UpdateVictim()) @@ -316,7 +317,7 @@ public: ## npc_twiggy_flathead #####*/ -enum eTwiggyFlathead +enum TwiggyFlathead { NPC_BIG_WILL = 6238, NPC_AFFRAY_CHALLENGER = 6240, @@ -328,7 +329,7 @@ enum eTwiggyFlathead SAY_TWIGGY_FLATHEAD_OVER = -1000127, }; -float AffrayChallengerLoc[6][4]= +Position const AffrayChallengerLoc[6] = { {-1683.0f, -4326.0f, 2.79f, 0.0f}, {-1682.0f, -4329.0f, 2.79f, 0.0f}, @@ -350,15 +351,15 @@ public: struct npc_twiggy_flatheadAI : public ScriptedAI { - npc_twiggy_flatheadAI(Creature* c) : ScriptedAI(c) {} + npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature) {} bool EventInProgress; bool EventGrate; bool EventBigWill; - bool Challenger_down[6]; - uint32 Wave; - uint32 Wave_Timer; - uint32 Challenger_checker; + bool ChallengerDown[6]; + uint8 Wave; + uint32 WaveTimer; + uint32 ChallengerChecker; uint64 PlayerGUID; uint64 AffrayChallenger[6]; uint64 BigWill; @@ -368,15 +369,15 @@ public: EventInProgress = false; EventGrate = false; EventBigWill = false; - Wave_Timer = 600000; - Challenger_checker = 0; + WaveTimer = 600000; + ChallengerChecker = 0; Wave = 0; PlayerGUID = 0; for (uint8 i = 0; i < 6; ++i) { AffrayChallenger[i] = 0; - Challenger_down[i] = false; + ChallengerDown[i] = false; } BigWill = 0; } @@ -385,7 +386,8 @@ public: void MoveInLineOfSight(Unit* who) { - if (!who || (!who->isAlive())) return; + if (!who || (!who->isAlive())) + return; if (me->IsWithinDistInMap(who, 10.0f) && (who->GetTypeId() == TYPEID_PLAYER) && CAST_PLR(who)->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE && !EventInProgress) { @@ -408,40 +410,26 @@ public: return; if (!pWarrior->isAlive() && pWarrior->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) { - EventInProgress = false; DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me); pWarrior->FailQuest(1719); - for (uint8 i = 0; i < 6; ++i) + for (uint8 i = 0; i < 6; ++i) // unsummon challengers { if (AffrayChallenger[i]) { Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]); - if (creature) { - if (creature->isAlive()) - { - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - creature->setDeathState(JUST_DIED); - } - } + if (creature && creature->isAlive()) + creature->DisappearAndDie(); } - AffrayChallenger[i] = 0; - Challenger_down[i] = false; } - if (BigWill) + if (BigWill) // unsummon bigWill { Creature* creature = Unit::GetCreature((*me), BigWill); - if (creature) { - if (creature->isAlive()) { - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - creature->setDeathState(JUST_DIED); - } - } + if (creature && creature->isAlive()) + creature->DisappearAndDie(); } - BigWill = 0; + Reset(); } if (!EventGrate && EventInProgress) @@ -451,11 +439,11 @@ public: if (x >= -1684 && x <= -1674 && y >= -4334 && y <= -4324) { pWarrior->AreaExploredOrEventHappens(1719); - DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, me); + DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, me, pWarrior); for (uint8 i = 0; i < 6; ++i) { - Creature* creature = me->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i][0], AffrayChallengerLoc[i][1], AffrayChallengerLoc[i][2], AffrayChallengerLoc[i][3], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); + Creature* creature = me->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); if (!creature) continue; creature->setFaction(35); @@ -464,31 +452,31 @@ public: creature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); AffrayChallenger[i] = creature->GetGUID(); } - Wave_Timer = 5000; - Challenger_checker = 1000; + WaveTimer = 5000; + ChallengerChecker = 1000; EventGrate = true; } } else if (EventInProgress) { - if (Challenger_checker <= diff) + if (ChallengerChecker <= diff) { for (uint8 i = 0; i < 6; ++i) { if (AffrayChallenger[i]) { Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]); - if ((!creature || (!creature->isAlive())) && !Challenger_down[i]) + if ((!creature || (!creature->isAlive())) && !ChallengerDown[i]) { DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me); - Challenger_down[i] = true; + ChallengerDown[i] = true; } } } - Challenger_checker = 1000; - } else Challenger_checker -= diff; + ChallengerChecker = 1000; + } else ChallengerChecker -= diff; - if (Wave_Timer <= diff) + if (WaveTimer <= diff) { if (Wave < 6 && AffrayChallenger[Wave] && !EventBigWill) { @@ -502,7 +490,7 @@ public: creature->setFaction(14); creature->AI()->AttackStart(pWarrior); ++Wave; - Wave_Timer = 20000; + WaveTimer = 20000; } } else if (Wave >= 6 && !EventBigWill) { @@ -514,7 +502,7 @@ public: creature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79f); creature->HandleEmoteCommand(EMOTE_STATE_READY_UNARMED); EventBigWill = true; - Wave_Timer = 1000; + WaveTimer = 1000; } } else if (Wave >= 6 && EventBigWill && BigWill) @@ -523,14 +511,10 @@ public: if (!creature || !creature->isAlive()) { DoScriptText(SAY_TWIGGY_FLATHEAD_OVER, me); - EventInProgress = false; - EventBigWill = false; - EventGrate = false; - PlayerGUID = 0; - Wave = 0; + Reset(); } } - } else Wave_Timer -= diff; + } else WaveTimer -= diff; } } } @@ -542,7 +526,7 @@ public: ## npc_wizzlecrank_shredder #####*/ -enum eEnums_Wizzlecrank +enum Wizzlecrank { SAY_START = -1000298, SAY_STARTUP1 = -1000299, @@ -568,14 +552,14 @@ public: { npc_wizzlecrank_shredderAI(Creature* creature) : npc_escortAI(creature) { - m_bIsPostEvent = false; - m_uiPostEventTimer = 1000; - m_uiPostEventCount = 0; + IsPostEvent = false; + PostEventTimer = 1000; + PostEventCount = 0; } - bool m_bIsPostEvent; - uint32 m_uiPostEventTimer; - uint32 m_uiPostEventCount; + bool IsPostEvent; + uint32 PostEventTimer; + uint32 PostEventCount; void Reset() { @@ -584,48 +568,43 @@ public: if (me->getStandState() == UNIT_STAND_STATE_DEAD) me->SetStandState(UNIT_STAND_STATE_STAND); - m_bIsPostEvent = false; - m_uiPostEventTimer = 1000; - m_uiPostEventCount = 0; + IsPostEvent = false; + PostEventTimer = 1000; + PostEventCount = 0; } } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - if (!player) - return; - - switch (uiPointId) + switch (waypointId) { - case 0: - DoScriptText(SAY_STARTUP1, me); - break; - case 9: - SetRun(false); - break; - case 17: - if (Creature* temp = me->SummonCreature(NPC_MERCENARY, 1128.489f, -3037.611f, 92.701f, 1.472f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000)) - { - DoScriptText(SAY_MERCENARY, temp); - me->SummonCreature(NPC_MERCENARY, 1160.172f, -2980.168f, 97.313f, 3.690f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); - } - break; - case 24: - m_bIsPostEvent = true; - break; + case 0: + DoScriptText(SAY_STARTUP1, me); + break; + case 9: + SetRun(false); + break; + case 17: + if (Creature* temp = me->SummonCreature(NPC_MERCENARY, 1128.489f, -3037.611f, 92.701f, 1.472f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000)) + { + DoScriptText(SAY_MERCENARY, temp); + me->SummonCreature(NPC_MERCENARY, 1160.172f, -2980.168f, 97.313f, 3.690f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); + } + break; + case 24: + IsPostEvent = true; + break; } } - void WaypointStart(uint32 uiPointId) + void WaypointStart(uint32 PointId) { Player* player = GetPlayerForEscort(); if (!player) return; - switch (uiPointId) + switch (PointId) { case 9: DoScriptText(SAY_STARTUP2, me, player); @@ -646,15 +625,15 @@ public: summoned->AI()->AttackStart(me); } - void UpdateEscortAI(const uint32 uiDiff) + void UpdateEscortAI(const uint32 Diff) { if (!UpdateVictim()) { - if (m_bIsPostEvent) + if (IsPostEvent) { - if (m_uiPostEventTimer <= uiDiff) + if (PostEventTimer <= Diff) { - switch (m_uiPostEventCount) + switch (PostEventCount) { case 0: DoScriptText(SAY_PROGRESS_2, me); @@ -674,11 +653,11 @@ public: break; } - ++m_uiPostEventCount; - m_uiPostEventTimer = 5000; + ++PostEventCount; + PostEventTimer = 5000; } else - m_uiPostEventTimer -= uiDiff; + PostEventTimer -= Diff; } return; diff --git a/src/server/scripts/Kalimdor/thousand_needles.cpp b/src/server/scripts/Kalimdor/thousand_needles.cpp index 2349b4493ce..b9ae356ddf1 100644 --- a/src/server/scripts/Kalimdor/thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/thousand_needles.cpp @@ -32,14 +32,16 @@ npc_enraged_panther go_panther_cage EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptedEscortAI.h" /*##### # npc_kanati ######*/ -enum eKanati +enum Kanati { SAY_KAN_START = -1000410, @@ -47,7 +49,7 @@ enum eKanati NPC_GALAK_ASS = 10720 }; -const float m_afGalakLoc[]= {-4867.387695f, -1357.353760f, -48.226f }; +Position const GalakLoc = {-4867.387695f, -1357.353760f, -48.226f, 0.0f}; class npc_kanati : public CreatureScript { @@ -57,10 +59,9 @@ public: bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) { if (quest->GetQuestId() == QUEST_PROTECT_KANATI) - { if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI())) pEscortAI->Start(false, false, player->GetGUID(), quest, true); - } + return true; } @@ -73,11 +74,11 @@ public: { npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { } - void Reset() { } + void Reset() {} - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 0: DoScriptText(SAY_KAN_START, me); @@ -93,9 +94,7 @@ public: void DoSpawnGalak() { for (int i = 0; i < 3; ++i) - me->SummonCreature(NPC_GALAK_ASS, - m_afGalakLoc[0], m_afGalakLoc[1], m_afGalakLoc[2], 0.0f, - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_GALAK_ASS, GalakLoc, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); } void JustSummoned(Creature* summoned) @@ -110,7 +109,7 @@ public: # npc_lakota_windsong ######*/ -enum eLakota +enum Lakota { SAY_LAKO_START = -1000365, SAY_LAKO_LOOK_OUT = -1000366, @@ -127,14 +126,14 @@ enum eLakota ID_AMBUSH_3 = 4 }; -float m_afBanditLoc[6][6]= +Position const BanditLoc[6] = { - {-4905.479492f, -2062.732666f, 84.352f}, - {-4915.201172f, -2073.528320f, 84.733f}, - {-4878.883301f, -1986.947876f, 91.966f}, - {-4877.503906f, -1966.113403f, 91.859f}, - {-4767.985352f, -1873.169189f, 90.192f}, - {-4788.861328f, -1888.007813f, 89.888f} + {-4905.479492f, -2062.732666f, 84.352f, 0.0f}, + {-4915.201172f, -2073.528320f, 84.733f, 0.0f}, + {-4878.883301f, -1986.947876f, 91.966f, 0.0f}, + {-4877.503906f, -1966.113403f, 91.859f, 0.0f}, + {-4767.985352f, -1873.169189f, 90.192f, 0.0f}, + {-4788.861328f, -1888.007813f, 89.888f, 0.0f} }; class npc_lakota_windsong : public CreatureScript @@ -164,11 +163,11 @@ public: { npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { } - void Reset() { } + void Reset() {} - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 8: DoScriptText(SAY_LAKO_LOOK_OUT, me); @@ -189,12 +188,10 @@ public: } } - void DoSpawnBandits(int uiAmbushId) + void DoSpawnBandits(int AmbushId) { for (int i = 0; i < 2; ++i) - me->SummonCreature(NPC_GRIM_BANDIT, - m_afBanditLoc[i+uiAmbushId][0], m_afBanditLoc[i+uiAmbushId][1], m_afBanditLoc[i+uiAmbushId][2], 0.0f, - TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } }; @@ -204,7 +201,7 @@ public: # npc_paoka_swiftmountain ######*/ -enum ePacka +enum Packa { SAY_START = -1000362, SAY_WYVERN = -1000363, @@ -215,11 +212,11 @@ enum ePacka FACTION_ESCORTEE = 232 //guessed }; -float m_afWyvernLoc[3][3]= +Position const WyvernLoc[3] = { - {-4990.606f, -906.057f, -5.343f}, - {-4970.241f, -927.378f, -4.951f}, - {-4985.364f, -952.528f, -5.199f} + {-4990.606f, -906.057f, -5.343f, 0.0f}, + {-4970.241f, -927.378f, -4.951f, 0.0f}, + {-4985.364f, -952.528f, -5.199f, 0.0f} }; class npc_paoka_swiftmountain : public CreatureScript @@ -249,11 +246,11 @@ public: { npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { } - void Reset() { } + void Reset() {} - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 15: DoScriptText(SAY_WYVERN, me); @@ -272,12 +269,9 @@ public: void DoSpawnWyvern() { for (int i = 0; i < 3; ++i) - me->SummonCreature(NPC_WYVERN, - m_afWyvernLoc[i][0], m_afWyvernLoc[i][1], m_afWyvernLoc[i][2], 0.0f, - TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } }; - }; /*##### @@ -286,7 +280,7 @@ public: #define GOSSIP_P "Please tell me the Phrase.." -enum ePlucky +enum Plucky { FACTION_FRIENDLY = 35, QUEST_SCOOP = 1950, @@ -299,10 +293,10 @@ class npc_plucky : public CreatureScript public: npc_plucky() : CreatureScript("npc_plucky") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -316,6 +310,7 @@ public: { if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_P, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + player->SEND_GOSSIP_MENU(738, creature->GetGUID()); return true; @@ -328,17 +323,17 @@ public: struct npc_pluckyAI : public ScriptedAI { - npc_pluckyAI(Creature* c) : ScriptedAI(c) { m_uiNormFaction = c->getFaction(); } + npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { NormFaction = creature->getFaction(); } - uint32 m_uiNormFaction; - uint32 m_uiResetTimer; + uint32 NormFaction; + uint32 ResetTimer; void Reset() { - m_uiResetTimer = 120000; + ResetTimer = 120000; - if (me->getFaction() != m_uiNormFaction) - me->setFaction(m_uiNormFaction); + if (me->getFaction() != NormFaction) + me->setFaction(NormFaction); if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); @@ -346,11 +341,11 @@ public: DoCast(me, SPELL_PLUCKY_CHICKEN, false); } - void ReceiveEmote(Player* player, uint32 uiTextEmote) + void ReceiveEmote(Player* player, uint32 TextEmote) { if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) { - if (uiTextEmote == TEXT_EMOTE_BECKON) + if (TextEmote == TEXT_EMOTE_BECKON) { me->setFaction(FACTION_FRIENDLY); me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); @@ -358,7 +353,7 @@ public: } } - if (uiTextEmote == TEXT_EMOTE_CHICKEN) + if (TextEmote == TEXT_EMOTE_CHICKEN) { if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) return; @@ -372,11 +367,11 @@ public: } } - void UpdateAI(const uint32 uiDiff) + void UpdateAI(const uint32 Diff) { if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) { - if (m_uiResetTimer <= uiDiff) + if (ResetTimer <= Diff) { if (!me->getVictim()) EnterEvadeMode(); @@ -386,7 +381,7 @@ public: return; } else - m_uiResetTimer -= uiDiff; + ResetTimer -= Diff; } if (!UpdateVictim()) @@ -398,7 +393,7 @@ public: }; -enum ePantherCage +enum PantherCage { ENRAGED_PANTHER = 10992 }; @@ -410,7 +405,6 @@ public: bool OnGossipHello(Player* player, GameObject* go) { - if (player->GetQuestStatus(5151) == QUEST_STATUS_INCOMPLETE) { if (Creature* panther = go->FindNearestCreature(ENRAGED_PANTHER, 5, true)) @@ -421,7 +415,7 @@ public: } } - return true ; + return true; } }; @@ -437,7 +431,7 @@ public: struct npc_enraged_pantherAI : public ScriptedAI { - npc_enraged_pantherAI(Creature* c) : ScriptedAI(c) {} + npc_enraged_pantherAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { diff --git a/src/server/scripts/Kalimdor/thunder_bluff.cpp b/src/server/scripts/Kalimdor/thunder_bluff.cpp index 67a876c40b2..b8b05b9692f 100644 --- a/src/server/scripts/Kalimdor/thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/thunder_bluff.cpp @@ -23,17 +23,22 @@ SDComment: Quest support: 925 SDCategory: Thunder Bluff EndScriptData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*##### # npc_cairne_bloodhoof ######*/ -#define SPELL_BERSERKER_CHARGE 16636 -#define SPELL_CLEAVE 16044 -#define SPELL_MORTAL_STRIKE 16856 -#define SPELL_THUNDERCLAP 23931 -#define SPELL_UPPERCUT 22916 +enum CairneBloodhoof +{ + SPELL_BERSERKER_CHARGE = 16636, + SPELL_CLEAVE = 16044, + SPELL_MORTAL_STRIKE = 16856, + SPELL_THUNDERCLAP = 23931, + SPELL_UPPERCUT = 22916 +}; #define GOSSIP_HCB "I know this is rather silly but a young ward who is a bit shy would like your hoofprint." //TODO: verify abilities/timers @@ -42,10 +47,10 @@ class npc_cairne_bloodhoof : public CreatureScript public: npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_SENDER_INFO) + if (action == GOSSIP_SENDER_INFO) { player->CastSpell(player, 23123, false); player->SEND_GOSSIP_MENU(7014, creature->GetGUID()); @@ -73,21 +78,21 @@ public: struct npc_cairne_bloodhoofAI : public ScriptedAI { - npc_cairne_bloodhoofAI(Creature* c) : ScriptedAI(c) {} + npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) {} - uint32 BerserkerCharge_Timer; - uint32 Cleave_Timer; - uint32 MortalStrike_Timer; - uint32 Thunderclap_Timer; - uint32 Uppercut_Timer; + uint32 BerserkerChargeTimer; + uint32 CleaveTimer; + uint32 MortalStrikeTimer; + uint32 ThunderclapTimer; + uint32 UppercutTimer; void Reset() { - BerserkerCharge_Timer = 30000; - Cleave_Timer = 5000; - MortalStrike_Timer = 10000; - Thunderclap_Timer = 15000; - Uppercut_Timer = 10000; + BerserkerChargeTimer = 30000; + CleaveTimer = 5000; + MortalStrikeTimer = 10000; + ThunderclapTimer = 15000; + UppercutTimer = 10000; } void EnterCombat(Unit* /*who*/) {} @@ -97,37 +102,37 @@ public: if (!UpdateVictim()) return; - if (BerserkerCharge_Timer <= diff) + if (BerserkerChargeTimer <= diff) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (target) DoCast(target, SPELL_BERSERKER_CHARGE); - BerserkerCharge_Timer = 25000; - } else BerserkerCharge_Timer -= diff; + BerserkerChargeTimer = 25000; + } else BerserkerChargeTimer -= diff; - if (Uppercut_Timer <= diff) + if (UppercutTimer <= diff) { DoCast(me->getVictim(), SPELL_UPPERCUT); - Uppercut_Timer = 20000; - } else Uppercut_Timer -= diff; + UppercutTimer = 20000; + } else UppercutTimer -= diff; - if (Thunderclap_Timer <= diff) + if (ThunderclapTimer <= diff) { DoCast(me->getVictim(), SPELL_THUNDERCLAP); - Thunderclap_Timer = 15000; - } else Thunderclap_Timer -= diff; + ThunderclapTimer = 15000; + } else ThunderclapTimer -= diff; - if (MortalStrike_Timer <= diff) + if (MortalStrikeTimer <= diff) { DoCast(me->getVictim(), SPELL_MORTAL_STRIKE); - MortalStrike_Timer = 15000; - } else MortalStrike_Timer -= diff; + MortalStrikeTimer = 15000; + } else MortalStrikeTimer -= diff; - if (Cleave_Timer <= diff) + if (CleaveTimer <= diff) { DoCast(me->getVictim(), SPELL_CLEAVE); - Cleave_Timer = 7000; - } else Cleave_Timer -= diff; + CleaveTimer = 7000; + } else CleaveTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/ungoro_crater.cpp b/src/server/scripts/Kalimdor/ungoro_crater.cpp index 0e2a1b2c4d9..786d2fc0cd3 100644 --- a/src/server/scripts/Kalimdor/ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/ungoro_crater.cpp @@ -28,11 +28,12 @@ npc_a-me npc_ringo EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "ScriptedFollowerAI.h" -enum eAMeData +enum AmeData { SAY_READY = -1000517, SAY_AGGRO1 = -1000518, @@ -74,45 +75,42 @@ public: struct npc_ameAI : public npc_escortAI { - npc_ameAI(Creature* c) : npc_escortAI(c) {} + npc_ameAI(Creature* creature) : npc_escortAI(creature) {} - uint32 DEMORALIZINGSHOUT_Timer; + uint32 DemoralizingShoutTimer; - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - Player* player = GetPlayerForEscort(); - - if (!player) - return; - - switch (i) + if (Player* player = GetPlayerForEscort()) { - case 19: - me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_AGGRO1, me, player); - break; - case 28: - DoScriptText(SAY_SEARCH, me, player); - break; - case 38: - me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_AGGRO2, me, player); - break; - case 49: - me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_AGGRO3, me, player); - break; - case 55: - DoScriptText(SAY_FINISH, me, player); - if (player) + switch (waypointId) + { + case 19: + me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + DoScriptText(SAY_AGGRO1, me, player); + break; + case 28: + DoScriptText(SAY_SEARCH, me, player); + break; + case 38: + me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + DoScriptText(SAY_AGGRO2, me, player); + break; + case 49: + me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + DoScriptText(SAY_AGGRO3, me, player); + break; + case 55: + DoScriptText(SAY_FINISH, me, player); player->GroupEventHappens(QUEST_CHASING_AME, me); - break; + break; + } } } void Reset() { - DEMORALIZINGSHOUT_Timer = 5000; + DemoralizingShoutTimer = 5000; } void JustSummoned(Creature* summoned) @@ -132,11 +130,11 @@ public: if (!UpdateVictim()) return; - if (DEMORALIZINGSHOUT_Timer <= diff) + if (DemoralizingShoutTimer <= diff) { DoCast(me->getVictim(), SPELL_DEMORALIZINGSHOUT); - DEMORALIZINGSHOUT_Timer = 70000; - } else DEMORALIZINGSHOUT_Timer -= diff; + DemoralizingShoutTimer = 70000; + } else DemoralizingShoutTimer -= diff; } }; }; @@ -145,7 +143,7 @@ public: # npc_ringo ####*/ -enum eRingo +enum Ringo { SAY_RIN_START_1 = -1000416, SAY_RIN_START_2 = -1000417, @@ -203,17 +201,17 @@ public: { npc_ringoAI(Creature* creature) : FollowerAI(creature) { } - uint32 m_uiFaintTimer; - uint32 m_uiEndEventProgress; - uint32 m_uiEndEventTimer; + uint32 FaintTimer; + uint32 EndEventProgress; + uint32 EndEventTimer; uint64 SpraggleGUID; void Reset() { - m_uiFaintTimer = urand(30000, 60000); - m_uiEndEventProgress = 0; - m_uiEndEventTimer = 1000; + FaintTimer = urand(30000, 60000); + EndEventProgress = 0; + EndEventTimer = 1000; SpraggleGUID = 0; } @@ -268,13 +266,13 @@ public: SetFollowPaused(false); } - void UpdateFollowerAI(const uint32 uiDiff) + void UpdateFollowerAI(const uint32 Diff) { if (!UpdateVictim()) { if (HasFollowState(STATE_FOLLOW_POSTEVENT)) { - if (m_uiEndEventTimer <= uiDiff) + if (EndEventTimer <= Diff) { Unit* pSpraggle = Unit::GetUnit(*me, SpraggleGUID); if (!pSpraggle || !pSpraggle->isAlive()) @@ -283,64 +281,61 @@ public: return; } - switch (m_uiEndEventProgress) + switch (EndEventProgress) { case 1: DoScriptText(SAY_RIN_END_1, me); - m_uiEndEventTimer = 3000; + EndEventTimer = 3000; break; case 2: DoScriptText(SAY_SPR_END_2, pSpraggle); - m_uiEndEventTimer = 5000; + EndEventTimer = 5000; break; case 3: DoScriptText(SAY_RIN_END_3, me); - m_uiEndEventTimer = 1000; + EndEventTimer = 1000; break; case 4: DoScriptText(EMOTE_RIN_END_4, me); SetFaint(); - m_uiEndEventTimer = 9000; + EndEventTimer = 9000; break; case 5: DoScriptText(EMOTE_RIN_END_5, me); ClearFaint(); - m_uiEndEventTimer = 1000; + EndEventTimer = 1000; break; case 6: DoScriptText(SAY_RIN_END_6, me); - m_uiEndEventTimer = 3000; + EndEventTimer = 3000; break; case 7: DoScriptText(SAY_SPR_END_7, pSpraggle); - m_uiEndEventTimer = 10000; + EndEventTimer = 10000; break; case 8: DoScriptText(EMOTE_RIN_END_8, me); - m_uiEndEventTimer = 5000; + EndEventTimer = 5000; break; case 9: SetFollowComplete(); break; } - ++m_uiEndEventProgress; + ++EndEventProgress; } else - m_uiEndEventTimer -= uiDiff; + EndEventTimer -= Diff; } - else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) + else if (HasFollowState(STATE_FOLLOW_INPROGRESS) && !HasFollowState(STATE_FOLLOW_PAUSED)) { - if (!HasFollowState(STATE_FOLLOW_PAUSED)) + if (FaintTimer <= Diff) { - if (m_uiFaintTimer <= uiDiff) - { - SetFaint(); - m_uiFaintTimer = urand(60000, 120000); - } - else - m_uiFaintTimer -= uiDiff; + SetFaint(); + FaintTimer = urand(60000, 120000); } + else + FaintTimer -= Diff; } return; diff --git a/src/server/scripts/Kalimdor/winterspring.cpp b/src/server/scripts/Kalimdor/winterspring.cpp index 00bb250d64d..a02156ee110 100644 --- a/src/server/scripts/Kalimdor/winterspring.cpp +++ b/src/server/scripts/Kalimdor/winterspring.cpp @@ -29,7 +29,9 @@ npc_rivern_frostwind npc_witch_doctor_mauari EndContentData */ -#include "ScriptPCH.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" /*###### ## npc_lorax @@ -48,10 +50,10 @@ class npc_lorax : public CreatureScript public: npc_lorax() : CreatureScript("npc_lorax") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SL1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -105,10 +107,10 @@ class npc_rivern_frostwind : public CreatureScript public: npc_rivern_frostwind() : CreatureScript("npc_rivern_frostwind") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -140,10 +142,10 @@ class npc_witch_doctor_mauari : public CreatureScript public: npc_witch_doctor_mauari() : CreatureScript("npc_witch_doctor_mauari") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, 16351, false); @@ -161,12 +163,12 @@ public: { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HWDM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(3377, creature->GetGUID()); - }else + } + else player->SEND_GOSSIP_MENU(3375, creature->GetGUID()); return true; } - }; void AddSC_winterspring() diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp index b16ad9934d8..8f34fa56525 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp @@ -48,9 +48,9 @@ public: struct boss_amanitarAI : public ScriptedAI { - boss_amanitarAI(Creature* c) : ScriptedAI(c) + boss_amanitarAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); bFirstTime = true; } @@ -83,7 +83,7 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -167,7 +167,7 @@ public: struct mob_amanitar_mushroomsAI : public Scripted_NoMovementAI { - mob_amanitar_mushroomsAI(Creature* c) : Scripted_NoMovementAI(c) {} + mob_amanitar_mushroomsAI(Creature* creature) : Scripted_NoMovementAI(creature) {} uint32 uiAuraTimer; uint32 uiDeathTimer; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp index 85abaa46a5d..ea757e86f4d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp @@ -105,7 +105,7 @@ class boss_elder_nadox : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_SLAY_3, me); //SAY_SLAY_3 on death? @@ -229,7 +229,7 @@ class mob_ahnkahar_nerubian : public CreatureScript uiSprintTimer = 10000; } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY) if (Creature* Nadox = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ELDER_NADOX))) @@ -278,10 +278,10 @@ public: struct mob_nadox_eggsAI : public Scripted_NoMovementAI { - mob_nadox_eggsAI(Creature* c) : Scripted_NoMovementAI(c) + mob_nadox_eggsAI(Creature* creature) : Scripted_NoMovementAI(creature) { - c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - c->UpdateAllStats(); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + creature->UpdateAllStats(); } void Reset() {} void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index 2789bc48a4c..d6e50097765 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -73,9 +73,9 @@ public: struct boss_jedoga_shadowseekerAI : public ScriptedAI { - boss_jedoga_shadowseekerAI(Creature* c) : ScriptedAI(c) + boss_jedoga_shadowseekerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); bFirstTime = true; bPreDone = false; } @@ -149,7 +149,7 @@ public: DoScriptText(RAND(TEXT_SLAY_1, TEXT_SLAY_2, TEXT_SLAY_3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(TEXT_DEATH, me); if (instance) @@ -355,9 +355,9 @@ public: struct mob_jedoga_initiandAI : public ScriptedAI { - mob_jedoga_initiandAI(Creature* c) : ScriptedAI(c) + mob_jedoga_initiandAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -390,9 +390,9 @@ public: } } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { - if (!Killer || !instance) + if (!killer || !instance) return; if (bWalking) @@ -402,7 +402,7 @@ public: if (!CAST_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok) CAST_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = true; - if (Killer->GetTypeId() == TYPEID_PLAYER) + if (killer->GetTypeId() == TYPEID_PLAYER) boss->AI()->DoAction(ACTION_INITIAND_KILLED); } @@ -410,8 +410,8 @@ public: bWalking = false; } - if (Killer->GetTypeId() == TYPEID_PLAYER) - instance->SetData64(DATA_PL_JEDOGA_TARGET, Killer->GetGUID()); + if (killer->GetTypeId() == TYPEID_PLAYER) + instance->SetData64(DATA_PL_JEDOGA_TARGET, killer->GetGUID()); } void EnterCombat(Unit* who) @@ -531,9 +531,9 @@ public: struct npc_jedogas_aufseher_triggerAI : public Scripted_NoMovementAI { - npc_jedogas_aufseher_triggerAI(Creature* c) : Scripted_NoMovementAI(c) + npc_jedogas_aufseher_triggerAI(Creature* creature) : Scripted_NoMovementAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); bRemoved = false; bRemoved2 = false; bCasted = false; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index 0f4b046f7d5..cf3c4274e48 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -36,7 +36,8 @@ enum Spells SPELL_VANISH = 55964, CREATURE_FLAME_SPHERE = 30106, H_CREATURE_FLAME_SPHERE_1 = 31686, - H_CREATURE_FLAME_SPHERE_2 = 31687 + H_CREATURE_FLAME_SPHERE_2 = 31687, + SPELL_HOVER_FALL = 60425 }; enum Misc { @@ -45,18 +46,17 @@ enum Misc DATA_SPHERE_DISTANCE = 15 }; #define DATA_SPHERE_ANGLE_OFFSET 0.7f -#define DATA_GROUND_POSITION_Z 11.4f +#define DATA_GROUND_POSITION_Z 11.30809f enum Yells { - SAY_AGGRO = -1619021, - SAY_SLAY_1 = -1619022, - SAY_SLAY_2 = -1619023, - SAY_DEATH = -1619024, - SAY_FEED_1 = -1619025, - SAY_FEED_2 = -1619026, - SAY_VANISH_1 = -1619027, - SAY_VANISH_2 = -1619028 + SAY_1 = 0, + SAY_WARNING = 1, + SAY_AGGRO = 2, + SAY_SLAY = 3, + SAY_DEATH = 4, + SAY_FEED = 5, + SAY_VANISH = 6, }; enum CombatPhase { @@ -79,11 +79,10 @@ public: struct boss_taldaramAI : public ScriptedAI { - boss_taldaramAI(Creature* c) : ScriptedAI(c) + boss_taldaramAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + instance = creature->GetInstanceScript(); + me->SetDisableGravity(true); } uint32 uiBloodthirstTimer; @@ -118,7 +117,7 @@ public: { if (instance) instance->SetData(DATA_PRINCE_TALDARAM_EVENT, IN_PROGRESS); - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); } void UpdateAI(const uint32 diff) @@ -180,7 +179,8 @@ public: break; case VANISHED: if (Unit* pEmbraceTarget = GetEmbraceTarget()) - DoCast(pEmbraceTarget, SPELL_EMBRACE_OF_THE_VAMPYR); + DoCast(pEmbraceTarget, DUNGEON_MODE(SPELL_EMBRACE_OF_THE_VAMPYR, H_SPELL_EMBRACE_OF_THE_VAMPYR)); + Talk(SAY_FEED); me->GetMotionMaster()->Clear(); me->SetSpeed(MOVE_WALK, 1.0f, true); me->GetMotionMaster()->MoveChase(me->getVictim()); @@ -201,7 +201,8 @@ public: if (uiFlamesphereTimer <= diff) { - DoCast(me, SPELL_CONJURE_FLAME_SPHERE); + // because TARGET_UNIT_TARGET_ENEMY we need a target selected to cast + DoCastVictim(SPELL_CONJURE_FLAME_SPHERE); Phase = CASTING_FLAME_SPHERES; uiPhaseTimer = 3*IN_MILLISECONDS + diff; uiFlamesphereTimer = 15*IN_MILLISECONDS; @@ -224,7 +225,7 @@ public: //He only vanishes if there are 3 or more alive players if (target_list.size() > 2) { - DoScriptText(RAND(SAY_VANISH_1, SAY_VANISH_2), me); + Talk(SAY_VANISH); DoCast(me, SPELL_VANISH); Phase = JUST_VANISHED; uiPhaseTimer = 500; @@ -260,7 +261,7 @@ public: void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); if (instance) instance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE); @@ -278,7 +279,7 @@ public: uiPhaseTimer = 0; uiEmbraceTarget = 0; } - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); + Talk(SAY_SLAY); } bool CheckSpheres() @@ -314,12 +315,13 @@ public: { if (!instance) return; - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL); - me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING); me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation()); + DoCast(SPELL_HOVER_FALL); + me->SetDisableGravity(false); + me->GetMotionMaster()->MovePoint(0, me->GetHomePosition()); + Talk(SAY_WARNING); uint64 prison_GUID = instance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM); instance->HandleGameObject(prison_GUID, true); } @@ -338,9 +340,9 @@ public: struct mob_taldaram_flamesphereAI : public ScriptedAI { - mob_taldaram_flamesphereAI(Creature* c) : ScriptedAI(c) + mob_taldaram_flamesphereAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiDespawnTimer; @@ -349,9 +351,10 @@ public: void Reset() { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->setFaction(16); - me->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); + me->SetObjectScale(1.0f); DoCast(me, SPELL_FLAME_SPHERE_VISUAL); DoCast(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT); DoCast(me, SPELL_FLAME_SPHERE_PERIODIC); @@ -361,7 +364,7 @@ public: void EnterCombat(Unit* /*who*/) {} void MoveInLineOfSight(Unit* /*who*/) {} - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT); } @@ -386,21 +389,30 @@ class prince_taldaram_sphere : public GameObjectScript public: prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - InstanceScript* instance = pGO->GetInstanceScript(); + InstanceScript* instance = go->GetInstanceScript(); + if (!instance) + return true; - Creature* pPrinceTaldaram = Unit::GetCreature(*pGO, instance ? instance->GetData64(DATA_PRINCE_TALDARAM) : 0); + Creature* pPrinceTaldaram = Unit::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM)); if (pPrinceTaldaram && pPrinceTaldaram->isAlive()) { // maybe these are hacks :( - pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - pGO->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); - switch (pGO->GetEntry()) + switch (go->GetEntry()) { - case GO_SPHERE1: instance->SetData(DATA_SPHERE1_EVENT, IN_PROGRESS); break; - case GO_SPHERE2: instance->SetData(DATA_SPHERE2_EVENT, IN_PROGRESS); break; + case GO_SPHERE1: + instance->SetData(DATA_SPHERE1_EVENT, IN_PROGRESS); + pPrinceTaldaram->AI()->Talk(SAY_1); + break; + + case GO_SPHERE2: + instance->SetData(DATA_SPHERE2_EVENT, IN_PROGRESS); + pPrinceTaldaram->AI()->Talk(SAY_1); + break; } CAST_AI(boss_taldaram::boss_taldaramAI, pPrinceTaldaram->AI())->CheckSpheres(); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp index 3ae78d4053b..74643e58e30 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp @@ -87,7 +87,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -109,26 +110,37 @@ public: { switch (go->GetEntry()) { - case 193564: Prince_TaldaramPlatform = go->GetGUID(); - if (m_auiEncounter[1] == DONE) HandleGameObject(0, true, go); break; - case 193093: Prince_TaldaramSpheres[0] = go->GetGUID(); + case 193564: + Prince_TaldaramPlatform = go->GetGUID(); + if (m_auiEncounter[1] == DONE) + HandleGameObject(0, true, go); + break; + + case 193093: + Prince_TaldaramSpheres[0] = go->GetGUID(); if (spheres[0] == IN_PROGRESS) { go->SetGoState(GO_STATE_ACTIVE); go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } - else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); break; - case 193094: Prince_TaldaramSpheres[1] = go->GetGUID(); + case 193094: + Prince_TaldaramSpheres[1] = go->GetGUID(); if (spheres[1] == IN_PROGRESS) { go->SetGoState(GO_STATE_ACTIVE); go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } - else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case 192236: + Prince_TaldaramGate = go->GetGUID(); // Web gate past Prince Taldaram + if (m_auiEncounter[1] == DONE) + HandleGameObject(0, true, go); break; - case 192236: Prince_TaldaramGate = go->GetGUID(); // Web gate past Prince Taldaram - if (m_auiEncounter[1] == DONE)HandleGameObject(0, true, go);break; } } @@ -136,8 +148,13 @@ public: { switch (idx) { - case DATA_ADD_JEDOGA_OPFER: JedogaSacrifices = guid; break; - case DATA_PL_JEDOGA_TARGET: JedogaTarget = guid; break; + case DATA_ADD_JEDOGA_OPFER: + JedogaSacrifices = guid; + break; + + case DATA_PL_JEDOGA_TARGET: + JedogaTarget = guid; + break; } } @@ -178,7 +195,9 @@ public: { switch (type) { - case DATA_ELDER_NADOX_EVENT: m_auiEncounter[0] = data; break; + case DATA_ELDER_NADOX_EVENT: + m_auiEncounter[0] = data; + break; case DATA_PRINCE_TALDARAM_EVENT: if (data == DONE) HandleGameObject(Prince_TaldaramGate, true); @@ -200,11 +219,21 @@ public: } } break; - case DATA_HERALD_VOLAZJ_EVENT: m_auiEncounter[3] = data; break; - case DATA_AMANITAR_EVENT: m_auiEncounter[4] = data; break; - case DATA_SPHERE1_EVENT: spheres[0] = data; break; - case DATA_SPHERE2_EVENT: spheres[1] = data; break; - case DATA_JEDOGA_TRIGGER_SWITCH: switchtrigger = data; break; + case DATA_HERALD_VOLAZJ_EVENT: + m_auiEncounter[3] = data; + break; + case DATA_AMANITAR_EVENT: + m_auiEncounter[4] = data; + break; + case DATA_SPHERE1_EVENT: + spheres[0] = data; + break; + case DATA_SPHERE2_EVENT: + spheres[1] = data; + break; + case DATA_JEDOGA_TRIGGER_SWITCH: + switchtrigger = data; + break; case DATA_JEDOGA_RESET_INITIANDS: for (std::set::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) { @@ -236,7 +265,8 @@ public: for (std::set::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) { Creature* cr = instance->GetCreature(*itr); - if (!cr || (cr && cr->isAlive())) return 0; + if (!cr || (cr && cr->isAlive())) + return 0; } return 1; case DATA_JEDOGA_TRIGGER_SWITCH: return switchtrigger; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index 79a102c803f..ca71d8c313e 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -267,7 +267,7 @@ public: } } else DatterTimer -= diff; - if(me->HasAura(SPELL_LEECHING_SWARM)) + if (me->HasAura(SPELL_LEECHING_SWARM)) me->RemoveAurasDueToSpell(SPELL_LEECHING_SWARM); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index da629fd45e9..6587631f249 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -51,9 +51,9 @@ public: struct boss_hadronoxAI : public ScriptedAI { - boss_hadronoxAI(Creature* c) : ScriptedAI(c) + boss_hadronoxAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); fMaxDistance = 50.0f; bFirstTime = true; } @@ -99,7 +99,7 @@ public: me->ModifyHealth(int32(me->CountPctFromMaxHealth(10))); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_HADRONOX_EVENT, DONE); @@ -136,7 +136,8 @@ public: void UpdateAI(const uint32 diff) { //Return since we have no target - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; // Without he comes up through the air to players on the bridge after krikthir if players crossing this bridge! CheckDistance(fMaxDistance, diff); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 878e1f7555f..4d83be53c93 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -94,9 +94,9 @@ public: struct boss_krik_thirAI : public ScriptedAI { - boss_krik_thirAI(Creature* c) : ScriptedAI(c) + boss_krik_thirAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -212,7 +212,7 @@ public: struct npc_skittering_infectorAI : public ScriptedAI { - npc_skittering_infectorAI(Creature* c) : ScriptedAI(c) {} + npc_skittering_infectorAI(Creature* creature) : ScriptedAI(creature) {} void JustDied(Unit* /*killer*/) { @@ -234,7 +234,7 @@ public: struct npc_anub_ar_skirmisherAI : public ScriptedAI { - npc_anub_ar_skirmisherAI(Creature* c) : ScriptedAI(c) {} + npc_anub_ar_skirmisherAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiChargeTimer; uint32 uiBackstabTimer; @@ -285,7 +285,7 @@ public: struct npc_anub_ar_shadowcasterAI : public ScriptedAI { - npc_anub_ar_shadowcasterAI(Creature* c) : ScriptedAI(c) {} + npc_anub_ar_shadowcasterAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiShadowBoltTimer; uint32 uiShadowNovaTimer; @@ -331,7 +331,7 @@ public: struct npc_anub_ar_warriorAI : public ScriptedAI { - npc_anub_ar_warriorAI(Creature* c) : ScriptedAI(c){} + npc_anub_ar_warriorAI(Creature* creature) : ScriptedAI(creature){} uint32 uiCleaveTimer; uint32 uiStrikeTimer; @@ -376,7 +376,7 @@ public: struct npc_watcher_gashraAI : public ScriptedAI { - npc_watcher_gashraAI(Creature* c) : ScriptedAI(c) {} + npc_watcher_gashraAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiWebWrapTimer; uint32 uiInfectedBiteTimer; @@ -427,7 +427,7 @@ public: struct npc_watcher_narjilAI : public ScriptedAI { - npc_watcher_narjilAI(Creature* c) : ScriptedAI(c) {} + npc_watcher_narjilAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiWebWrapTimer; uint32 uiInfectedBiteTimer; @@ -481,7 +481,7 @@ public: struct npc_watcher_silthikAI : public ScriptedAI { - npc_watcher_silthikAI(Creature* c) : ScriptedAI(c) {} + npc_watcher_silthikAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiWebWrapTimer; uint32 uiInfectedBiteTimer; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index e00db5d6494..12622174e29 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -64,7 +64,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (auiEncounter[i] == IN_PROGRESS) return true; + if (auiEncounter[i] == IN_PROGRESS) + return true; return false; } diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt index 53b47884e57..3502e7fb104 100644 --- a/src/server/scripts/Northrend/CMakeLists.txt +++ b/src/server/scripts/Northrend/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -22,7 +22,7 @@ set(scripts_STAT_SRCS Northrend/Ulduar/Ulduar/ulduar_teleporter.cpp Northrend/Ulduar/Ulduar/boss_thorim.cpp Northrend/Ulduar/Ulduar/boss_ignis.cpp - Northrend/Ulduar/Ulduar/boss_algalon.cpp + Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp Northrend/Ulduar/Ulduar/instance_ulduar.cpp Northrend/Ulduar/Ulduar/boss_auriaya.cpp Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 3e9d8144c19..b115a4ee827 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -480,7 +480,7 @@ public: if (temp->isAlive() && !temp->getVictim()) { if (temp->HasUnitMovementFlag(MOVEMENTFLAG_WALKING)) - temp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + temp->SetWalk(false); if (temp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -926,9 +926,7 @@ struct dummy_dragonAI : public ScriptedAI if (instance && instance->GetData(TYPE_SARTHARION_EVENT) != IN_PROGRESS) instance->SetData(TYPE_SHADRON_PREKILLED, 1); if (Creature* pAcolyte = me->FindNearestCreature(NPC_ACOLYTE_OF_SHADRON, 100.0f)) - { pAcolyte->Kill(pAcolyte); - } break; case NPC_VESPERON: iTextId = SAY_VESPERON_DEATH; @@ -936,9 +934,7 @@ struct dummy_dragonAI : public ScriptedAI if (instance && instance->GetData(TYPE_SARTHARION_EVENT) != IN_PROGRESS) instance->SetData(TYPE_VESPERON_PREKILLED, 1); if (Creature* pAcolyte = me->FindNearestCreature(NPC_ACOLYTE_OF_VESPERON, 100.0f)) - { pAcolyte->Kill(pAcolyte); - } break; } @@ -955,7 +951,7 @@ struct dummy_dragonAI : public ScriptedAI return; // Twilight Revenge to main boss - if (Unit* pSartharion = Unit::GetUnit((*me), instance->GetData64(DATA_SARTHARION))) + if (Unit* pSartharion = Unit::GetUnit(*me, instance->GetData64(DATA_SARTHARION))) if (pSartharion->isAlive()) { pSartharion->RemoveAurasDueToSpell(uiSpellId); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index f41522f844d..b2cf755c7af 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -227,9 +227,9 @@ class npc_onyx_flamecaller : public CreatureScript zarithrian->AI()->JustSummoned(me); } - void WaypointReached(uint32 pointId) + void WaypointReached(uint32 waypointId) { - if (pointId == MAX_PATH_FLAMECALLER_WAYPOINTS || pointId == MAX_PATH_FLAMECALLER_WAYPOINTS*2) + if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS || waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS*2) { DoZoneInCombat(); SetEscortPaused(true); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp index 78810e27b05..4e5e01cc745 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp @@ -105,8 +105,8 @@ class boss_saviana_ragefire : public CreatureScript Talk(SAY_CONFLAGRATION); break; case POINT_LAND: - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(false); + me->SetDisableGravity(false); me->SetReactState(REACT_AGGRESSIVE); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); @@ -120,8 +120,8 @@ class boss_saviana_ragefire : public CreatureScript void JustReachedHome() { _JustReachedHome(); - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(false); + me->SetDisableGravity(false); } void KilledUnit(Unit* victim) @@ -146,8 +146,8 @@ class boss_saviana_ragefire : public CreatureScript { case EVENT_FLIGHT: { - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(true); + me->SetDisableGravity(true); me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->MovePoint(POINT_FLIGHT, SavianaRagefireFlyPos); events.ScheduleEvent(EVENT_FLIGHT, 50000); @@ -206,7 +206,7 @@ class spell_saviana_conflagration_init : public SpellScriptLoader unitList.remove_if (ConflagrationTargetSelector()); uint8 maxSize = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 6 : 3); if (unitList.size() > maxSize) - Trinity::RandomResizeList(unitList, maxSize); + Trinity::Containers::RandomResizeList(unitList, maxSize); } void HandleDummy(SpellEffIndex effIndex) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp index cfbbb79c5f6..19ae66b6a60 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp @@ -71,7 +71,7 @@ class npc_xerestrasza : public CreatureScript _isIntro = false; Talk(SAY_XERESTRASZA_EVENT); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(0, xerestraszaMovePos); _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 16000); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 19ed96e8885..305266ee628 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -414,8 +414,8 @@ public: void JustDied(Unit* /*killer*/) { - if (me->isSummon()) - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) + if (TempSummon* summ = me->ToTempSummon()) + if (Unit* summoner = summ->GetSummoner()) if (summoner->isAlive()) summoner->GetAI()->SetData(1, 0); } @@ -447,9 +447,9 @@ public: uint8 uiWaypoint; - void WaypointReached(uint32 uiPoint) + void WaypointReached(uint32 waypointId) { - if (uiPoint == 0) + if (waypointId == 0) { switch (uiWaypoint) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index 0848d1e9524..9768b50b214 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -356,7 +356,7 @@ public: Start(false, true, 0, NULL); } - void WaypointReached(uint32 /*i*/) + void WaypointReached(uint32 /*waypointId*/) { } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 9fcfcfa47e5..18c972b966c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -203,17 +203,19 @@ public: Start(false, true, 0, NULL); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + if (!instance) + return; + + switch (waypointId) { case 2: - if ((instance && uiWaypointPath == 3) || uiWaypointPath == 2) + if (uiWaypointPath == 3 || uiWaypointPath == 2) instance->SetData(DATA_MOVEMENT_DONE, instance->GetData(DATA_MOVEMENT_DONE)+1); break; case 3: - if (instance) - instance->SetData(DATA_MOVEMENT_DONE, instance->GetData(DATA_MOVEMENT_DONE)+1); + instance->SetData(DATA_MOVEMENT_DONE, instance->GetData(DATA_MOVEMENT_DONE)+1); break; } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index c17ea7411a0..c8236ace88c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -125,8 +125,8 @@ public: break; case DATA_IN_POSITION: //movement done. me->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f); - if (GameObject* pGO = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE))) - instance->HandleGameObject(pGO->GetGUID(), false); + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE))) + instance->HandleGameObject(go->GetGUID(), false); NextStep(10000, false, 3); break; case DATA_LESSER_CHAMPIONS_DEFEATED: @@ -488,10 +488,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); CAST_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index a9e41d90899..e4dcf978574 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -104,7 +104,7 @@ enum BossSpells SPELL_SPIKE_TELE = 66170, }; -#define SPELL_PERMAFROST_HELPER RAID_MODE(66193, 67856, 67855, 67857) +#define SPELL_PERMAFROST_HELPER RAID_MODE(66193, 67855, 67856, 67857) enum SummonActions { @@ -141,10 +141,10 @@ public: { boss_anubarak_trialAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; std::list m_vBurrowGUID; @@ -195,8 +195,8 @@ public: if (who->GetTypeId() == TYPEID_PLAYER) { DoScriptText(urand(0, 1) ? SAY_KILL1 : SAY_KILL2, me); - if (m_instance) - m_instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); + if (instance) + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); } } @@ -211,8 +211,8 @@ public: void JustReachedHome() { - if (m_instance) - m_instance->SetData(TYPE_ANUBARAK, FAIL); + if (instance) + instance->SetData(TYPE_ANUBARAK, FAIL); //Summon Scarab Swarms neutral at random places for (int i=0; i < 10; i++) if (Creature* temp = me->SummonCreature(NPC_SCARAB, AnubarakLoc[1].GetPositionX()+urand(0, 50)-25, AnubarakLoc[1].GetPositionY()+urand(0, 50)-25, AnubarakLoc[1].GetPositionZ())) @@ -223,8 +223,8 @@ public: { Summons.DespawnAll(); DoScriptText(SAY_DEATH, me); - if (m_instance) - m_instance->SetData(TYPE_ANUBARAK, DONE); + if (instance) + instance->SetData(TYPE_ANUBARAK, DONE); } void JustSummoned(Creature* summoned) @@ -260,10 +260,11 @@ public: DoScriptText(SAY_AGGRO, me); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetInCombatWithZone(); - if (m_instance) - m_instance->SetData(TYPE_ANUBARAK, IN_PROGRESS); + if (instance) + instance->SetData(TYPE_ANUBARAK, IN_PROGRESS); //Despawn Scarab Swarms neutral - Summons.DoAction(NPC_SCARAB, ACTION_SCARAB_SUBMERGE); + EntryCheckPredicate pred(NPC_SCARAB); + Summons.DoAction(ACTION_SCARAB_SUBMERGE, pred); //Spawn Burrow for (int i=0; i < 4; i++) me->SummonCreature(NPC_BURROW, AnubarakLoc[i+2]); @@ -278,6 +279,9 @@ public: if (!UpdateVictim()) return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + switch (m_uiStage) { case 0: @@ -301,7 +305,8 @@ public: if (IsHeroic() && m_uiNerubianShadowStrikeTimer <= uiDiff) { - Summons.DoAction(NPC_BURROWER, ACTION_SHADOW_STRIKE); + EntryCheckPredicate pred(NPC_BURROWER); + Summons.DoAction(ACTION_SHADOW_STRIKE, pred); m_uiNerubianShadowStrikeTimer = 30*IN_MILLISECONDS; } else m_uiNerubianShadowStrikeTimer -= uiDiff; @@ -426,10 +431,10 @@ public: { mob_swarm_scarabAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiDeterminationTimer; @@ -493,10 +498,10 @@ public: { mob_nerubian_burrowerAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiSpiderFrenzyTimer; uint32 m_uiSubmergeTimer; @@ -571,8 +576,11 @@ class mob_frost_sphere : public CreatureScript { _isFalling = false; me->SetReactState(REACT_PASSIVE); - me->SetFlying(true); - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + //! Confirmed sniff 3.3.5.a + me->SetDisableGravity(true); + me->SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + //! end + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); me->SetSpeed(MOVE_RUN, 0.5f, false); me->GetMotionMaster()->MoveRandom(20.0f); DoCast(SPELL_FROST_SPHERE); @@ -604,10 +612,10 @@ class mob_frost_sphere : public CreatureScript { case POINT_FALL_GROUND: me->RemoveAurasDueToSpell(SPELL_FROST_SPHERE); - me->SetDisplayId(me->GetCreatureInfo()->Modelid1); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); DoCast(SPELL_PERMAFROST_VISUAL); DoCast(SPELL_PERMAFROST); - me->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.0f); + me->SetObjectScale(2.0f); break; } } @@ -636,10 +644,10 @@ public: { mob_anubarak_spikeAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiIncreaseSpeedTimer; uint8 m_uiSpeed; uint64 m_uiTargetGUID; @@ -651,6 +659,11 @@ public: m_uiTargetGUID = 0; } + bool CanAIAttack(Unit const* victim) const + { + return victim->GetTypeId() == TYPEID_PLAYER; + } + void EnterCombat(Unit* who) { m_uiTargetGUID = who->GetGUID(); @@ -671,7 +684,7 @@ public: Unit* target = Unit::GetPlayer(*me, m_uiTargetGUID); if (!target || !target->isAlive() || !target->HasAura(SPELL_MARK)) { - if (Creature* pAnubarak = Unit::GetCreature((*me), m_instance->GetData64(NPC_ANUBARAK))) + if (Creature* pAnubarak = Unit::GetCreature((*me), instance->GetData64(NPC_ANUBARAK))) pAnubarak->CastSpell(pAnubarak, SPELL_SPIKE_TELE, false); me->DisappearAndDie(); return; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 2fe0bd3f397..79bbb470edf 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -64,10 +64,10 @@ public: { boss_toc_champion_controllerAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = (InstanceScript*) creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; uint32 m_uiChampionsNotStarted; uint32 m_uiChampionsFailed; @@ -101,7 +101,7 @@ public: vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARRIOR : NPC_ALLIANCE_WARRIOR); uint8 healersSubtracted = 2; - if (m_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || m_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) + if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) healersSubtracted = 1; for (uint8 i = 0; i < healersSubtracted; ++i) { @@ -136,7 +136,7 @@ public: vHealersEntries.erase(vHealersEntries.begin()+pos); } - if (m_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || m_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) + if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) for (uint8 i = 0; i < 4; ++i) vOtherEntries.erase(vOtherEntries.begin()+urand(0, vOtherEntries.size()-1)); @@ -214,7 +214,7 @@ public: m_uiChampionsFailed++; if (m_uiChampionsFailed + m_uiChampionsKilled >= Summons.size()) { - m_instance->SetData(TYPE_CRUSADERS, FAIL); + instance->SetData(TYPE_CRUSADERS, FAIL); Summons.DespawnAll(); me->DespawnOrUnsummon(); } @@ -227,16 +227,16 @@ public: m_uiChampionsKilled = 0; m_bInProgress = true; Summons.DoZoneInCombat(); - m_instance->SetData(TYPE_CRUSADERS, IN_PROGRESS); + instance->SetData(TYPE_CRUSADERS, IN_PROGRESS); } break; case DONE: m_uiChampionsKilled++; if (m_uiChampionsKilled == 1) - m_instance->SetData(TYPE_CRUSADERS, SPECIAL); + instance->SetData(TYPE_CRUSADERS, SPECIAL); else if (m_uiChampionsKilled >= Summons.size()) { - m_instance->SetData(TYPE_CRUSADERS, DONE); + instance->SetData(TYPE_CRUSADERS, DONE); Summons.DespawnAll(); me->DespawnOrUnsummon(); } @@ -253,11 +253,11 @@ struct boss_faction_championsAI : public ScriptedAI { boss_faction_championsAI(Creature* creature, uint32 aitype) : ScriptedAI(creature) { - m_instance = (InstanceScript*) creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); mAIType = aitype; } - InstanceScript* m_instance; + InstanceScript* instance; uint64 championControllerGUID; uint32 mAIType; @@ -273,8 +273,8 @@ struct boss_faction_championsAI : public ScriptedAI void JustReachedHome() { - if (m_instance) - if (Creature* pChampionController = Unit::GetCreature((*me), m_instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (instance) + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(2, FAIL); me->DespawnOrUnsummon(); } @@ -292,7 +292,7 @@ struct boss_faction_championsAI : public ScriptedAI std::list const& tList = me->getThreatManager().getThreatList(); for (std::list::const_iterator itr = tList.begin(); itr != tList.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && me->getThreatManager().getThreat(unit)) { if (unit->GetTypeId()==TYPEID_PLAYER) @@ -326,8 +326,8 @@ struct boss_faction_championsAI : public ScriptedAI void JustDied(Unit* /*killer*/) { if (mAIType != AI_PET) - if (m_instance) - if (Creature* pChampionController = Unit::GetCreature((*me), m_instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (instance) + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(2, DONE); } @@ -335,8 +335,8 @@ struct boss_faction_championsAI : public ScriptedAI { DoCast(me, SPELL_ANTI_AOE, true); me->SetInCombatWithZone(); - if (m_instance) - if (Creature* pChampionController = Unit::GetCreature((*me), m_instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (instance) + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(2, IN_PROGRESS); } @@ -351,18 +351,18 @@ struct boss_faction_championsAI : public ScriptedAI if (Player* player = players.begin()->getSource()) TeamInInstance = player->GetTeam(); - if (m_instance) + if (instance) { if (TeamInInstance == ALLIANCE) { - if (Creature* temp = Unit::GetCreature(*me, m_instance->GetData64(NPC_VARIAN))) + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_VARIAN))) DoScriptText(SAY_VARIAN_KILL_HORDE_PLAYER4+urand(0, 3), temp); // + cause we are on negative } else if (Creature* temp = me->FindNearestCreature(NPC_GARROSH, 300.f)) DoScriptText(SAY_GARROSH_KILL_ALLIANCE_PLAYER4+urand(0, 3), temp); // + cause we are on negative - m_instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); } } } @@ -384,7 +384,7 @@ struct boss_faction_championsAI : public ScriptedAI Unit* target; for (iter = tList.begin(); iter!=tList.end(); ++iter) { - target = Unit::GetUnit((*me), (*iter)->getUnitGuid()); + target = Unit::GetUnit(*me, (*iter)->getUnitGuid()); if (target && target->getPowerType() == POWER_MANA) return target; } @@ -399,7 +399,7 @@ struct boss_faction_championsAI : public ScriptedAI Unit* target; for (iter = tList.begin(); iter!=tList.end(); ++iter) { - target = Unit::GetUnit((*me), (*iter)->getUnitGuid()); + target = Unit::GetUnit(*me, (*iter)->getUnitGuid()); if (target && me->GetDistance2d(target) < distance) ++count; } @@ -408,7 +408,8 @@ struct boss_faction_championsAI : public ScriptedAI void AttackStart(Unit* who) { - if (!who) return; + if (!who) + return; if (me->Attack(who, true)) { @@ -494,7 +495,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiNatureGraspTimer <= uiDiff) { @@ -588,7 +590,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiHeroismOrBloodlustTimer <= uiDiff) { @@ -687,7 +690,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiBubbleTimer <= uiDiff) { @@ -786,7 +790,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiPsychicScreamTimer <= uiDiff) { @@ -879,7 +884,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiPsychicScreamTimer <= uiDiff) { @@ -990,7 +996,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiFearTimer <= uiDiff) { @@ -1093,7 +1100,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiCounterspellTimer <= uiDiff) { @@ -1204,7 +1212,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiDisengageTimer <= uiDiff) { @@ -1312,7 +1321,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiBarkskinTimer <= uiDiff) { @@ -1424,7 +1434,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiBladestormTimer <= uiDiff) { @@ -1534,7 +1545,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiIceboundFortitudeTimer <= uiDiff) { @@ -1636,7 +1648,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiFanOfKnivesTimer <= uiDiff) { @@ -1773,7 +1786,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiHeroismOrBloodlustTimer <= uiDiff) { @@ -1873,7 +1887,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiRepeteanceTimer <= uiDiff) { @@ -1951,7 +1966,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiDevourMagicTimer <= uiDiff) { @@ -2000,7 +2016,8 @@ public: void UpdateAI(const uint32 uiDiff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (m_uiClawTimer <= uiDiff) { @@ -2011,11 +2028,8 @@ public: boss_faction_championsAI::UpdateAI(uiDiff); } }; - }; -/*========================================================*/ - void AddSC_boss_faction_champions() { new boss_toc_champion_controller(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 6cd049967c1..a7328b43826 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -106,11 +106,11 @@ public: { boss_jaraxxusAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); Reset(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; @@ -124,8 +124,8 @@ public: void Reset() { - if (m_instance) - m_instance->SetData(TYPE_JARAXXUS, NOT_STARTED); + if (instance) + instance->SetData(TYPE_JARAXXUS, NOT_STARTED); SetEquipmentSlots(false, EQUIP_MAIN, EQUIP_OFFHAND, EQUIP_RANGED); m_uiFelFireballTimer = 5*IN_MILLISECONDS; m_uiFelLightningTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS); @@ -139,8 +139,8 @@ public: void JustReachedHome() { - if (m_instance) - m_instance->SetData(TYPE_JARAXXUS, FAIL); + if (instance) + instance->SetData(TYPE_JARAXXUS, FAIL); DoCast(me, SPELL_JARAXXUS_CHAINS); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetReactState(REACT_PASSIVE); @@ -150,8 +150,8 @@ public: { if (who->GetTypeId() == TYPEID_PLAYER) { - if (m_instance) - m_instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); + if (instance) + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); } } @@ -159,8 +159,8 @@ public: { Summons.DespawnAll(); DoScriptText(SAY_DEATH, me); - if (m_instance) - m_instance->SetData(TYPE_JARAXXUS, DONE); + if (instance) + instance->SetData(TYPE_JARAXXUS, DONE); } void JustSummoned(Creature* summoned) @@ -171,8 +171,8 @@ public: void EnterCombat(Unit* /*who*/) { me->SetInCombatWithZone(); - if (m_instance) - m_instance->SetData(TYPE_JARAXXUS, IN_PROGRESS); + if (instance) + instance->SetData(TYPE_JARAXXUS, IN_PROGRESS); DoScriptText(SAY_AGGRO, me); } @@ -289,11 +289,11 @@ public: { mob_infernal_volcanoAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); Reset(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; @@ -344,11 +344,11 @@ public: { mob_fel_infernalAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); Reset(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiFelStreakTimer; void Reset() @@ -368,7 +368,7 @@ public: if (!UpdateVictim()) return; - if (m_instance && m_instance->GetData(TYPE_JARAXXUS) != IN_PROGRESS) + if (instance && instance->GetData(TYPE_JARAXXUS) != IN_PROGRESS) me->DespawnOrUnsummon(); if (m_uiFelStreakTimer <= uiDiff) @@ -398,11 +398,11 @@ public: { mob_nether_portalAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); Reset(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; @@ -453,13 +453,13 @@ public: { mob_mistress_of_painAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); - if (m_instance) - m_instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, INCREASE); + instance = creature->GetInstanceScript(); + if (instance) + instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, INCREASE); Reset(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiShivanSlashTimer; uint32 m_uiSpinningStrikeTimer; uint32 m_uiMistressKissTimer; @@ -474,13 +474,13 @@ public: void JustDied(Unit* /*killer*/) { - if (m_instance) - m_instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, DECREASE); + if (instance) + instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, DECREASE); } void UpdateAI(const uint32 uiDiff) { - if (m_instance && m_instance->GetData(TYPE_JARAXXUS) != IN_PROGRESS) + if (instance && instance->GetData(TYPE_JARAXXUS) != IN_PROGRESS) { me->DespawnOrUnsummon(); return; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 1eca7edb590..5bda32941c2 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -123,10 +123,10 @@ public: { boss_gormokAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiImpaleTimer; uint32 m_uiStaggeringStompTimer; @@ -151,7 +151,7 @@ public: void EnterEvadeMode() { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); ScriptedAI::EnterEvadeMode(); } @@ -163,7 +163,7 @@ public: switch (pointId) { case 0: - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); me->SetInCombatWithZone(); @@ -173,16 +173,16 @@ public: void JustDied(Unit* /*killer*/) { - if (m_instance) - m_instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_DONE); + if (instance) + instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_DONE); } void JustReachedHome() { - if (m_instance) + if (instance) { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); - m_instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); } me->DespawnOrUnsummon(); } @@ -190,7 +190,7 @@ public: void EnterCombat(Unit* /*who*/) { me->SetInCombatWithZone(); - m_instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_IN_PROGRESS); + instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_IN_PROGRESS); } void JustSummoned(Creature* summon) @@ -263,12 +263,12 @@ public: { mob_snobold_vassalAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); - if (m_instance) - m_instance->SetData(DATA_SNOBOLD_COUNT, INCREASE); + instance = creature->GetInstanceScript(); + if (instance) + instance->SetData(DATA_SNOBOLD_COUNT, INCREASE); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiFireBombTimer; uint32 m_uiBatterTimer; uint32 m_uiHeadCrackTimer; @@ -284,15 +284,15 @@ public: m_uiTargetGUID = 0; m_bTargetDied = false; - if (m_instance) - m_uiBossGUID = m_instance->GetData64(NPC_GORMOK); + if (instance) + m_uiBossGUID = instance->GetData64(NPC_GORMOK); //Workaround for Snobold me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } void EnterEvadeMode() { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); ScriptedAI::EnterEvadeMode(); } @@ -328,8 +328,8 @@ public: if (Unit* target = Unit::GetPlayer(*me, m_uiTargetGUID)) if (target->isAlive()) target->RemoveAurasDueToSpell(SPELL_SNOBOLLED); - if (m_instance) - m_instance->SetData(DATA_SNOBOLD_COUNT, DECREASE); + if (instance) + instance->SetData(DATA_SNOBOLD_COUNT, DECREASE); } void UpdateAI(uint32 const diff) @@ -341,9 +341,9 @@ public: { if (!target->isAlive()) { - if (m_instance) + if (instance) { - Unit* gormok = ObjectAccessor::GetCreature(*me, m_instance->GetData64(NPC_GORMOK)); + Unit* gormok = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GORMOK)); if (gormok && gormok->isAlive()) { SetCombatMovement(false); @@ -454,7 +454,8 @@ struct boss_jormungarAI : public ScriptedAI void UpdateAI(uint32 const diff) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; if (instanceScript && instanceScript->GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL && !enraged) { @@ -757,10 +758,10 @@ public: { boss_icehowlAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiFerociousButtTimer; uint32 m_uiArticBreathTimer; @@ -794,8 +795,8 @@ public: void JustDied(Unit* /*killer*/) { - if (m_instance) - m_instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_DONE); + if (instance) + instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_DONE); } void MovementInform(uint32 type, uint32 pointId) @@ -826,7 +827,7 @@ public: m_bMovementFinish = true; break; case 2: - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); me->SetInCombatWithZone(); @@ -836,16 +837,16 @@ public: void EnterEvadeMode() { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); ScriptedAI::EnterEvadeMode(); } void JustReachedHome() { - if (m_instance) + if (instance) { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); - m_instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); } me->DespawnOrUnsummon(); } @@ -854,15 +855,15 @@ public: { if (who->GetTypeId() == TYPEID_PLAYER) { - if (m_instance) - m_instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); + if (instance) + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); } } void EnterCombat(Unit* /*who*/) { - if (m_instance) - m_instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_IN_PROGRESS); + if (instance) + instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_IN_PROGRESS); me->SetInCombatWithZone(); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 242b2f2f0ea..cf84abb482f 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -143,10 +143,10 @@ struct boss_twin_baseAI : public ScriptedAI { boss_twin_baseAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; AuraStateType m_uiAuraState; @@ -176,7 +176,7 @@ struct boss_twin_baseAI : public ScriptedAI me->SetReactState(REACT_PASSIVE); me->ModifyAuraState(m_uiAuraState, true); /* Uncomment this once that they are flying above the ground - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetLevitate(true); me->SetFlying(true); */ m_bIsBerserk = false; @@ -190,8 +190,8 @@ struct boss_twin_baseAI : public ScriptedAI void JustReachedHome() { - if (m_instance) - m_instance->SetData(TYPE_VALKIRIES, FAIL); + if (instance) + instance->SetData(TYPE_VALKIRIES, FAIL); Summons.DespawnAll(); me->DespawnOrUnsummon(); @@ -199,12 +199,13 @@ struct boss_twin_baseAI : public ScriptedAI void MovementInform(uint32 uiType, uint32 uiId) { - if (uiType != POINT_MOTION_TYPE) return; + if (uiType != POINT_MOTION_TYPE) + return; switch (uiId) { case 1: - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); break; @@ -216,8 +217,8 @@ struct boss_twin_baseAI : public ScriptedAI if (who->GetTypeId() == TYPEID_PLAYER) { DoScriptText(urand(0, 1) ? SAY_KILL1 : SAY_KILL2, me); - if (m_instance) - m_instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); + if (instance) + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE, 0); } } @@ -231,12 +232,12 @@ struct boss_twin_baseAI : public ScriptedAI switch (summoned->GetEntry()) { case NPC_LIGHT_ESSENCE: - m_instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_LIGHT_ESSENCE_HELPER); - m_instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_LIGHT_ESSENCE_HELPER); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER); break; case NPC_DARK_ESSENCE: - m_instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DARK_ESSENCE_HELPER); - m_instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DARK_ESSENCE_HELPER); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER); break; case NPC_BULLET_CONTROLLER: me->m_Events.AddEvent(new OrbsDespawner(me), me->m_Events.CalculateTime(100)); @@ -248,7 +249,7 @@ struct boss_twin_baseAI : public ScriptedAI void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); - if (m_instance) + if (instance) { if (Creature* pSister = GetSister()) { @@ -257,13 +258,13 @@ struct boss_twin_baseAI : public ScriptedAI me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - m_instance->SetData(TYPE_VALKIRIES, DONE); + instance->SetData(TYPE_VALKIRIES, DONE); Summons.DespawnAll(); } else { me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - m_instance->SetData(TYPE_VALKIRIES, SPECIAL); + instance->SetData(TYPE_VALKIRIES, SPECIAL); } } } @@ -273,20 +274,20 @@ struct boss_twin_baseAI : public ScriptedAI // Called when sister pointer needed Creature* GetSister() { - return Unit::GetCreature((*me), m_instance->GetData64(m_uiSisterNpcId)); + return Unit::GetCreature((*me), instance->GetData64(m_uiSisterNpcId)); } void EnterCombat(Unit* /*who*/) { me->SetInCombatWithZone(); - if (m_instance) + if (instance) { if (Creature* pSister = GetSister()) { me->AddAura(m_uiMyEmphatySpellId, pSister); pSister->SetInCombatWithZone(); } - m_instance->SetData(TYPE_VALKIRIES, IN_PROGRESS); + instance->SetData(TYPE_VALKIRIES, IN_PROGRESS); } DoScriptText(SAY_AGGRO, me); @@ -315,7 +316,7 @@ struct boss_twin_baseAI : public ScriptedAI void UpdateAI(const uint32 uiDiff) { - if (!m_instance || !UpdateVictim()) + if (!instance || !UpdateVictim()) return; switch (m_uiStage) @@ -406,10 +407,10 @@ public: { boss_fjolaAI(Creature* creature) : boss_twin_baseAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; void Reset() { boss_twin_baseAI::Reset(); @@ -429,17 +430,17 @@ public: m_uiTouchSpellId = SPELL_LIGHT_TOUCH; m_uiSpikeSpellId = SPELL_LIGHT_TWIN_SPIKE; - if (m_instance) + if (instance) { - m_instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); } } void EnterCombat(Unit* who) { - if (m_instance) + if (instance) { - m_instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); } me->SummonCreature(NPC_BULLET_CONTROLLER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN); @@ -448,14 +449,14 @@ public: void EnterEvadeMode() { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); boss_twin_baseAI::EnterEvadeMode(); } void JustReachedHome() { - if (m_instance) - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + if (instance) + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); boss_twin_baseAI::JustReachedHome(); } @@ -552,10 +553,10 @@ struct mob_unleashed_ballAI : public ScriptedAI { mob_unleashed_ballAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiRangeCheckTimer; void MoveToNextPoint() @@ -576,8 +577,8 @@ struct mob_unleashed_ballAI : public ScriptedAI { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetFlying(true); + me->SetDisableGravity(true); + me->SetCanFly(true); SetCombatMovement(false); MoveToNextPoint(); m_uiRangeCheckTimer = IN_MILLISECONDS; @@ -585,7 +586,8 @@ struct mob_unleashed_ballAI : public ScriptedAI void MovementInform(uint32 uiType, uint32 uiId) { - if (uiType != POINT_MOTION_TYPE) return; + if (uiType != POINT_MOTION_TYPE) + return; switch (uiId) { @@ -617,8 +619,7 @@ public: { if (m_uiRangeCheckTimer < uiDiff) { - if (Unit* target = me->SelectNearestTarget(2.0f)) - if (target->GetTypeId() == TYPEID_PLAYER && target->isAlive()) + if (me->SelectNearestPlayer(2.0f)) { DoCastAOE(SPELL_UNLEASHED_DARK); me->GetMotionMaster()->MoveIdle(); @@ -659,8 +660,7 @@ public: { if (m_uiRangeCheckTimer < uiDiff) { - if (Unit* target = me->SelectNearestTarget(2.0f)) - if (target->GetTypeId() == TYPEID_PLAYER && target->isAlive()) + if (me->SelectNearestPlayer(2.0f)) { DoCastAOE(SPELL_UNLEASHED_LIGHT); me->GetMotionMaster()->MoveIdle(); @@ -759,7 +759,7 @@ class spell_powering_up : public SpellScriptLoader uint32 spellId; - bool Validate(SpellEntry const* /*spellEntry*/) + bool Load() { spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_SURGE_OF_SPEED, GetCaster()); if (!sSpellMgr->GetSpellInfo(spellId)) @@ -769,7 +769,7 @@ class spell_powering_up : public SpellScriptLoader void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - if (Unit* target = GetTargetUnit()) + if (Unit* target = GetExplTargetUnit()) if (urand(0, 99) < 15) target->CastSpell(target, spellId, true); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 03de3d374ef..1966e26b128 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -105,7 +105,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript bool IsEncounterInProgress() const { - for (uint8 i = 0; i < MAX_ENCOUNTERS ; ++i) + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) if (EncounterStatus[i] == IN_PROGRESS) return true; return false; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 3831e4824ad..2643b8d60c7 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -106,10 +106,10 @@ class npc_announcer_toc10 : public CreatureScript { npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; void Reset() { @@ -239,10 +239,10 @@ class boss_lich_king_toc : public CreatureScript { boss_lich_king_tocAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiUpdateTimer; void Reset() @@ -254,8 +254,8 @@ class boss_lich_king_toc : public CreatureScript summoned->CastSpell(summoned, 51807, false); summoned->SetDisplayId(11686); } - if (m_instance) m_instance->SetData(TYPE_LICH_KING, IN_PROGRESS); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + if (instance) instance->SetData(TYPE_LICH_KING, IN_PROGRESS); + me->SetWalk(true); } void MovementInform(uint32 uiType, uint32 uiId) @@ -265,77 +265,80 @@ class boss_lich_king_toc : public CreatureScript switch (uiId) { case 0: - m_instance->SetData(TYPE_EVENT, 5030); + instance->SetData(TYPE_EVENT, 5030); break; case 1: - m_instance->SetData(TYPE_EVENT, 5050); + instance->SetData(TYPE_EVENT, 5050); break; } } void UpdateAI(const uint32 uiDiff) { - if (!m_instance) return; - if (m_instance->GetData(TYPE_EVENT_NPC) != NPC_LICH_KING_1) return; + if (!instance) + return; + + if (instance->GetData(TYPE_EVENT_NPC) != NPC_LICH_KING_1) + return; - m_uiUpdateTimer = m_instance->GetData(TYPE_EVENT_TIMER); + m_uiUpdateTimer = instance->GetData(TYPE_EVENT_TIMER); if (m_uiUpdateTimer <= uiDiff) { - switch (m_instance->GetData(TYPE_EVENT)) + switch (instance->GetData(TYPE_EVENT)) { case 5010: DoScriptText(SAY_STAGE_4_02, me); m_uiUpdateTimer = 3000; me->GetMotionMaster()->MovePoint(0, LichKingLoc[0]); - m_instance->SetData(TYPE_EVENT, 5020); + instance->SetData(TYPE_EVENT, 5020); break; case 5030: DoScriptText(SAY_STAGE_4_04, me); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK); m_uiUpdateTimer = 10000; - m_instance->SetData(TYPE_EVENT, 5040); + instance->SetData(TYPE_EVENT, 5040); break; case 5040: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->GetMotionMaster()->MovePoint(1, LichKingLoc[1]); m_uiUpdateTimer = 1000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 5050: me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 5060); + instance->SetData(TYPE_EVENT, 5060); break; case 5060: DoScriptText(SAY_STAGE_4_05, me); me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); m_uiUpdateTimer = 2500; - m_instance->SetData(TYPE_EVENT, 5070); + instance->SetData(TYPE_EVENT, 5070); break; case 5070: me->CastSpell(me, 68198, false); m_uiUpdateTimer = 1500; - m_instance->SetData(TYPE_EVENT, 5080); + instance->SetData(TYPE_EVENT, 5080); break; case 5080: - if (GameObject* pGoFloor = m_instance->instance->GetGameObject(m_instance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) - pGoFloor->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED); + if (GameObject* go = instance->instance->GetGameObject(instance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) + go->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED); me->CastSpell(me, 69016, false); - if (m_instance) + if (instance) { - m_instance->SetData(TYPE_LICH_KING, DONE); - Creature* temp = Unit::GetCreature(*me, m_instance->GetData64(NPC_ANUBARAK)); + instance->SetData(TYPE_LICH_KING, DONE); + Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_ANUBARAK)); if (!temp || !temp->isAlive()) temp = me->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); } me->DespawnOrUnsummon(); m_uiUpdateTimer = 20000; break; } } else m_uiUpdateTimer -= uiDiff; - m_instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); + instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); } }; @@ -355,10 +358,10 @@ class npc_fizzlebang_toc : public CreatureScript { npc_fizzlebang_tocAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = (InstanceScript*)me->GetInstanceScript(); + instance = me->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; uint32 m_uiUpdateTimer; uint64 m_uiPortalGUID; @@ -367,8 +370,8 @@ class npc_fizzlebang_toc : public CreatureScript void JustDied(Unit* killer) { DoScriptText(SAY_STAGE_1_06, me, killer); - m_instance->SetData(TYPE_EVENT, 1180); - if (Creature* temp = Unit::GetCreature(*me, m_instance->GetData64(NPC_JARAXXUS))) + instance->SetData(TYPE_EVENT, 1180); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_JARAXXUS))) { temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); temp->SetReactState(REACT_AGGRESSIVE); @@ -378,24 +381,25 @@ class npc_fizzlebang_toc : public CreatureScript void Reset() { - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); m_uiPortalGUID = 0; me->GetMotionMaster()->MovePoint(1, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY()-60, ToCCommonLoc[10].GetPositionZ()); } void MovementInform(uint32 uiType, uint32 uiId) { - if (uiType != POINT_MOTION_TYPE) return; + if (uiType != POINT_MOTION_TYPE) + return; switch (uiId) { case 1: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - if (m_instance) + me->SetWalk(false); + if (instance) { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); - m_instance->SetData(TYPE_EVENT, 1120); - m_instance->SetData(TYPE_EVENT_TIMER, 1000); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->SetData(TYPE_EVENT, 1120); + instance->SetData(TYPE_EVENT_TIMER, 1000); } break; } @@ -408,22 +412,24 @@ class npc_fizzlebang_toc : public CreatureScript void UpdateAI(const uint32 uiDiff) { - if (!m_instance) return; + if (!instance) + return; - if (m_instance->GetData(TYPE_EVENT_NPC) != NPC_FIZZLEBANG) return; + if (instance->GetData(TYPE_EVENT_NPC) != NPC_FIZZLEBANG) + return; - m_uiUpdateTimer = m_instance->GetData(TYPE_EVENT_TIMER); + m_uiUpdateTimer = instance->GetData(TYPE_EVENT_TIMER); if (m_uiUpdateTimer <= uiDiff) { - switch (m_instance->GetData(TYPE_EVENT)) + switch (instance->GetData(TYPE_EVENT)) { case 1110: - m_instance->SetData(TYPE_EVENT, 1120); + instance->SetData(TYPE_EVENT, 1120); m_uiUpdateTimer = 4000; break; case 1120: DoScriptText(SAY_STAGE_1_02, me); - m_instance->SetData(TYPE_EVENT, 1130); + instance->SetData(TYPE_EVENT, 1130); m_uiUpdateTimer = 12000; break; case 1130: @@ -433,16 +439,16 @@ class npc_fizzlebang_toc : public CreatureScript if (Unit* pTrigger = me->SummonCreature(NPC_TRIGGER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 4.69494f, TEMPSUMMON_MANUAL_DESPAWN)) { m_uiTriggerGUID = pTrigger->GetGUID(); - pTrigger->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.0f); + pTrigger->SetObjectScale(2.0f); pTrigger->SetDisplayId(22862); pTrigger->CastSpell(pTrigger, SPELL_WILFRED_PORTAL, false); } - m_instance->SetData(TYPE_EVENT, 1132); + instance->SetData(TYPE_EVENT, 1132); m_uiUpdateTimer = 4000; break; case 1132: me->GetMotionMaster()->MovementExpired(); - m_instance->SetData(TYPE_EVENT, 1134); + instance->SetData(TYPE_EVENT, 1134); m_uiUpdateTimer = 4000; break; case 1134: @@ -450,15 +456,15 @@ class npc_fizzlebang_toc : public CreatureScript if (Creature* pPortal = me->SummonCreature(NPC_WILFRED_PORTAL, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 4.71239f, TEMPSUMMON_MANUAL_DESPAWN)) { pPortal->SetReactState(REACT_PASSIVE); - pPortal->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.0f); + pPortal->SetObjectScale(2.0f); pPortal->CastSpell(pPortal, SPELL_WILFRED_PORTAL, false); m_uiPortalGUID = pPortal->GetGUID(); } m_uiUpdateTimer = 4000; - m_instance->SetData(TYPE_EVENT, 1135); + instance->SetData(TYPE_EVENT, 1135); break; case 1135: - m_instance->SetData(TYPE_EVENT, 1140); + instance->SetData(TYPE_EVENT, 1140); m_uiUpdateTimer = 3000; break; case 1140: @@ -469,27 +475,27 @@ class npc_fizzlebang_toc : public CreatureScript temp->SetReactState(REACT_PASSIVE); temp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY()-10, ToCCommonLoc[1].GetPositionZ()); } - m_instance->SetData(TYPE_EVENT, 1142); + instance->SetData(TYPE_EVENT, 1142); m_uiUpdateTimer = 5000; break; case 1142: - if (Creature* temp = Unit::GetCreature(*me, m_instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_JARAXXUS))) temp->SetTarget(me->GetGUID()); if (Creature* pTrigger = Unit::GetCreature(*me, m_uiTriggerGUID)) pTrigger->DespawnOrUnsummon(); if (Creature* pPortal = Unit::GetCreature(*me, m_uiPortalGUID)) pPortal->DespawnOrUnsummon(); - m_instance->SetData(TYPE_EVENT, 1144); + instance->SetData(TYPE_EVENT, 1144); m_uiUpdateTimer = 10000; break; case 1144: - if (Creature* temp = Unit::GetCreature(*me, m_instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_JARAXXUS))) DoScriptText(SAY_STAGE_1_05, temp); - m_instance->SetData(TYPE_EVENT, 1150); + instance->SetData(TYPE_EVENT, 1150); m_uiUpdateTimer = 5000; break; case 1150: - if (Creature* temp = Unit::GetCreature(*me, m_instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_JARAXXUS))) { //1-shot Fizzlebang temp->CastSpell(me, 67888, false); @@ -497,12 +503,12 @@ class npc_fizzlebang_toc : public CreatureScript temp->AddThreat(me, 1000.0f); temp->AI()->AttackStart(me); } - m_instance->SetData(TYPE_EVENT, 1160); + instance->SetData(TYPE_EVENT, 1160); m_uiUpdateTimer = 3000; break; } } else m_uiUpdateTimer -= uiDiff; - m_instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); + instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); } }; @@ -522,10 +528,10 @@ class npc_tirion_toc : public CreatureScript { npc_tirion_tocAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)me->GetInstanceScript(); + instance = me->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiUpdateTimer; void Reset() {} @@ -534,31 +540,34 @@ class npc_tirion_toc : public CreatureScript void UpdateAI(const uint32 uiDiff) { - if (!m_instance) return; - if (m_instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION) return; + if (!instance) + return; - m_uiUpdateTimer = m_instance->GetData(TYPE_EVENT_TIMER); + if (instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION) + return; + + m_uiUpdateTimer = instance->GetData(TYPE_EVENT_TIMER); if (m_uiUpdateTimer <= uiDiff) { - switch (m_instance->GetData(TYPE_EVENT)) + switch (instance->GetData(TYPE_EVENT)) { case 110: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_TALK); DoScriptText(SAY_STAGE_0_01, me); m_uiUpdateTimer = 22000; - m_instance->SetData(TYPE_EVENT, 120); + instance->SetData(TYPE_EVENT, 120); break; case 140: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_TALK); DoScriptText(SAY_STAGE_0_02, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 150); + instance->SetData(TYPE_EVENT, 150); break; case 150: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); - if (m_instance->GetData(TYPE_BEASTS) != DONE) + if (instance->GetData(TYPE_BEASTS) != DONE) { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); if (Creature* temp = me->SummonCreature(NPC_GORMOK, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS)) { @@ -568,26 +577,26 @@ class npc_tirion_toc : public CreatureScript } } m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 155); + instance->SetData(TYPE_EVENT, 155); break; case 155: - m_instance->SetData(TYPE_BEASTS, IN_PROGRESS); + instance->SetData(TYPE_BEASTS, IN_PROGRESS); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 160); + instance->SetData(TYPE_EVENT, 160); break; case 200: DoScriptText(SAY_STAGE_0_04, me); m_uiUpdateTimer = 8000; - m_instance->SetData(TYPE_EVENT, 205); + instance->SetData(TYPE_EVENT, 205); break; case 205: m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 210); + instance->SetData(TYPE_EVENT, 210); break; case 210: - if (m_instance->GetData(TYPE_BEASTS) != DONE) + if (instance->GetData(TYPE_BEASTS) != DONE) { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); if (Creature* temp = me->SummonCreature(NPC_DREADSCALE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN)) { temp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ()); @@ -602,24 +611,24 @@ class npc_tirion_toc : public CreatureScript } } m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 220); + instance->SetData(TYPE_EVENT, 220); break; case 220: - m_instance->SetData(TYPE_EVENT, 230); + instance->SetData(TYPE_EVENT, 230); break; case 300: DoScriptText(SAY_STAGE_0_05, me); m_uiUpdateTimer = 8000; - m_instance->SetData(TYPE_EVENT, 305); + instance->SetData(TYPE_EVENT, 305); break; case 305: m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 310); + instance->SetData(TYPE_EVENT, 310); break; case 310: - if (m_instance->GetData(TYPE_BEASTS) != DONE) + if (instance->GetData(TYPE_BEASTS) != DONE) { - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); if (Creature* temp = me->SummonCreature(NPC_ICEHOWL, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TEMPSUMMON_DEAD_DESPAWN)) { temp->GetMotionMaster()->MovePoint(2, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ()); @@ -629,92 +638,92 @@ class npc_tirion_toc : public CreatureScript } } m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 315); + instance->SetData(TYPE_EVENT, 315); break; case 315: - m_instance->SetData(TYPE_EVENT, 320); + instance->SetData(TYPE_EVENT, 320); break; case 400: DoScriptText(SAY_STAGE_0_06, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 666: DoScriptText(SAY_STAGE_0_WIPE, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 1010: DoScriptText(SAY_STAGE_1_01, me); m_uiUpdateTimer = 7000; - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); me->SummonCreature(NPC_FIZZLEBANG, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 1180: DoScriptText(SAY_STAGE_1_07, me); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 2000: DoScriptText(SAY_STAGE_1_08, me); m_uiUpdateTimer = 18000; - m_instance->SetData(TYPE_EVENT, 2010); + instance->SetData(TYPE_EVENT, 2010); break; case 2030: DoScriptText(SAY_STAGE_1_11, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 3000: DoScriptText(SAY_STAGE_2_01, me); m_uiUpdateTimer = 12000; - m_instance->SetData(TYPE_EVENT, 3050); + instance->SetData(TYPE_EVENT, 3050); break; case 3001: DoScriptText(SAY_STAGE_2_01, me); m_uiUpdateTimer = 12000; - m_instance->SetData(TYPE_EVENT, 3051); + instance->SetData(TYPE_EVENT, 3051); break; case 3060: DoScriptText(SAY_STAGE_2_03, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 3070); + instance->SetData(TYPE_EVENT, 3070); break; case 3061: DoScriptText(SAY_STAGE_2_03, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 3071); + instance->SetData(TYPE_EVENT, 3071); break; //Summoning crusaders case 3091: if (Creature* pChampionController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1])) pChampionController->AI()->SetData(0, HORDE); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 3092); + instance->SetData(TYPE_EVENT, 3092); break; //Summoning crusaders case 3090: if (Creature* pChampionController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1])) pChampionController->AI()->SetData(0, ALLIANCE); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 3092); + instance->SetData(TYPE_EVENT, 3092); break; case 3092: - if (Creature* pChampionController = Unit::GetCreature((*me), m_instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(1, NOT_STARTED); - m_instance->SetData(TYPE_EVENT, 3095); + instance->SetData(TYPE_EVENT, 3095); break; //Crusaders battle end case 3100: DoScriptText(SAY_STAGE_2_06, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 4000: DoScriptText(SAY_STAGE_3_01, me); m_uiUpdateTimer = 13000; - m_instance->SetData(TYPE_EVENT, 4010); + instance->SetData(TYPE_EVENT, 4010); break; case 4010: DoScriptText(SAY_STAGE_3_02, me); @@ -733,72 +742,72 @@ class npc_tirion_toc : public CreatureScript temp->SummonCreature(NPC_DARK_ESSENCE, TwinValkyrsLoc[3].GetPositionX(), TwinValkyrsLoc[3].GetPositionY(), TwinValkyrsLoc[3].GetPositionZ()); } m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 4015); + instance->SetData(TYPE_EVENT, 4015); break; case 4015: - m_instance->DoUseDoorOrButton(m_instance->GetData64(GO_MAIN_GATE_DOOR)); - if (Creature* temp = Unit::GetCreature((*me), m_instance->GetData64(NPC_LIGHTBANE))) + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + if (Creature* temp = Unit::GetCreature((*me), instance->GetData64(NPC_LIGHTBANE))) { temp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ()); temp->SetVisible(true); } - if (Creature* temp = Unit::GetCreature((*me), m_instance->GetData64(NPC_DARKBANE))) + if (Creature* temp = Unit::GetCreature((*me), instance->GetData64(NPC_DARKBANE))) { temp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ()); temp->SetVisible(true); } m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 4016); + instance->SetData(TYPE_EVENT, 4016); break; case 4016: - m_instance->SetData(TYPE_EVENT, 4017); + instance->SetData(TYPE_EVENT, 4017); break; case 4040: m_uiUpdateTimer = 60000; - m_instance->SetData(TYPE_EVENT, 5000); + instance->SetData(TYPE_EVENT, 5000); break; case 5000: DoScriptText(SAY_STAGE_4_01, me); m_uiUpdateTimer = 10000; - m_instance->SetData(TYPE_EVENT, 5005); + instance->SetData(TYPE_EVENT, 5005); break; case 5005: m_uiUpdateTimer = 8000; - m_instance->SetData(TYPE_EVENT, 5010); + instance->SetData(TYPE_EVENT, 5010); me->SummonCreature(NPC_LICH_KING_1, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5); break; case 5020: DoScriptText(SAY_STAGE_4_03, me); m_uiUpdateTimer = 1000; - m_instance->SetData(TYPE_EVENT, 0); + instance->SetData(TYPE_EVENT, 0); break; case 6000: me->NearTeleportTo(AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 4.0f); m_uiUpdateTimer = 20000; - m_instance->SetData(TYPE_EVENT, 6005); + instance->SetData(TYPE_EVENT, 6005); break; case 6005: DoScriptText(SAY_STAGE_4_06, me); m_uiUpdateTimer = 20000; - m_instance->SetData(TYPE_EVENT, 6010); + instance->SetData(TYPE_EVENT, 6010); break; case 6010: if (IsHeroic()) { DoScriptText(SAY_STAGE_4_07, me); m_uiUpdateTimer = 60000; - m_instance->SetData(TYPE_ANUBARAK, SPECIAL); - m_instance->SetData(TYPE_EVENT, 6020); - } else m_instance->SetData(TYPE_EVENT, 6030); + instance->SetData(TYPE_ANUBARAK, SPECIAL); + instance->SetData(TYPE_EVENT, 6020); + } else instance->SetData(TYPE_EVENT, 6030); break; case 6020: me->DespawnOrUnsummon(); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 6030); + instance->SetData(TYPE_EVENT, 6030); break; } } else m_uiUpdateTimer -= uiDiff; - m_instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); + instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); } }; @@ -818,10 +827,10 @@ class npc_garrosh_toc : public CreatureScript { npc_garrosh_tocAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)me->GetInstanceScript(); + instance = me->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiUpdateTimer; void Reset() {} @@ -830,53 +839,56 @@ class npc_garrosh_toc : public CreatureScript void UpdateAI(const uint32 uiDiff) { - if (!m_instance) return; - if (m_instance->GetData(TYPE_EVENT_NPC) != NPC_GARROSH) return; + if (!instance) + return; + + if (instance->GetData(TYPE_EVENT_NPC) != NPC_GARROSH) + return; - m_uiUpdateTimer = m_instance->GetData(TYPE_EVENT_TIMER); + m_uiUpdateTimer = instance->GetData(TYPE_EVENT_TIMER); if (m_uiUpdateTimer <= uiDiff) { - switch (m_instance->GetData(TYPE_EVENT)) + switch (instance->GetData(TYPE_EVENT)) { case 130: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_TALK); DoScriptText(SAY_STAGE_0_03h, me); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 132); + instance->SetData(TYPE_EVENT, 132); break; case 132: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 140); + instance->SetData(TYPE_EVENT, 140); break; case 2010: DoScriptText(SAY_STAGE_1_09, me); m_uiUpdateTimer = 9000; - m_instance->SetData(TYPE_EVENT, 2020); + instance->SetData(TYPE_EVENT, 2020); break; case 3050: DoScriptText(SAY_STAGE_2_02h, me); m_uiUpdateTimer = 15000; - m_instance->SetData(TYPE_EVENT, 3060); + instance->SetData(TYPE_EVENT, 3060); break; case 3070: DoScriptText(SAY_STAGE_2_04h, me); m_uiUpdateTimer = 6000; - m_instance->SetData(TYPE_EVENT, 3080); + instance->SetData(TYPE_EVENT, 3080); break; case 3081: DoScriptText(SAY_STAGE_2_05h, me); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 3091); + instance->SetData(TYPE_EVENT, 3091); break; case 4030: DoScriptText(SAY_STAGE_3_03h, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 4040); + instance->SetData(TYPE_EVENT, 4040); break; } } else m_uiUpdateTimer -= uiDiff; - m_instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); + instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); } }; @@ -896,10 +908,10 @@ class npc_varian_toc : public CreatureScript { npc_varian_tocAI(Creature* creature) : ScriptedAI(creature) { - m_instance = (InstanceScript*)me->GetInstanceScript(); + instance = me->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiUpdateTimer; void Reset() {} @@ -908,53 +920,56 @@ class npc_varian_toc : public CreatureScript void UpdateAI(const uint32 uiDiff) { - if (!m_instance) return; - if (m_instance->GetData(TYPE_EVENT_NPC) != NPC_VARIAN) return; + if (!instance) + return; + + if (instance->GetData(TYPE_EVENT_NPC) != NPC_VARIAN) + return; - m_uiUpdateTimer = m_instance->GetData(TYPE_EVENT_TIMER); + m_uiUpdateTimer = instance->GetData(TYPE_EVENT_TIMER); if (m_uiUpdateTimer <= uiDiff) { - switch (m_instance->GetData(TYPE_EVENT)) + switch (instance->GetData(TYPE_EVENT)) { case 120: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_TALK); DoScriptText(SAY_STAGE_0_03a, me); m_uiUpdateTimer = 2000; - m_instance->SetData(TYPE_EVENT, 122); + instance->SetData(TYPE_EVENT, 122); break; case 122: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 130); + instance->SetData(TYPE_EVENT, 130); break; case 2020: DoScriptText(SAY_STAGE_1_10, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 2030); + instance->SetData(TYPE_EVENT, 2030); break; case 3051: DoScriptText(SAY_STAGE_2_02a, me); m_uiUpdateTimer = 10000; - m_instance->SetData(TYPE_EVENT, 3061); + instance->SetData(TYPE_EVENT, 3061); break; case 3071: DoScriptText(SAY_STAGE_2_04a, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 3081); + instance->SetData(TYPE_EVENT, 3081); break; case 3080: DoScriptText(SAY_STAGE_2_05a, me); m_uiUpdateTimer = 3000; - m_instance->SetData(TYPE_EVENT, 3090); + instance->SetData(TYPE_EVENT, 3090); break; case 4020: DoScriptText(SAY_STAGE_3_03a, me); m_uiUpdateTimer = 5000; - m_instance->SetData(TYPE_EVENT, 4040); + instance->SetData(TYPE_EVENT, 4040); break; } } else m_uiUpdateTimer -= uiDiff; - m_instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); + instance->SetData(TYPE_EVENT_TIMER, m_uiUpdateTimer); } }; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp index e96ef4ff366..95acc79231d 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp @@ -161,7 +161,7 @@ class boss_dred : public CreatureScript return 0; } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_DRED_EVENT, DONE); @@ -211,7 +211,7 @@ class npc_drakkari_gutripper : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRED))) Dred->AI()->DoAction(ACTION_RAPTOR_KILLED); @@ -261,7 +261,7 @@ class npc_drakkari_scytheclaw : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRED))) Dred->AI()->DoAction(ACTION_RAPTOR_KILLED); diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 5418cf8c4d0..9ff8ee9c9ed 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -72,9 +72,9 @@ public: struct boss_novosAI : public Scripted_NoMovementAI { - boss_novosAI(Creature* c) : Scripted_NoMovementAI(c), lSummons(me) + boss_novosAI(Creature* creature) : Scripted_NoMovementAI(creature), lSummons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiTimer; @@ -260,9 +260,9 @@ public: struct mob_crystal_handlerAI : public ScriptedAI { - mob_crystal_handlerAI(Creature* c) : ScriptedAI(c) + mob_crystal_handlerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiFlashOfDarknessTimer; @@ -317,9 +317,9 @@ public: struct mob_novos_minionAI : public ScriptedAI { - mob_novos_minionAI(Creature* c) : ScriptedAI(c) + mob_novos_minionAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp index 97f2ee4e9a1..b1d588a0d0d 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp @@ -71,9 +71,9 @@ public: struct boss_tharon_jaAI : public ScriptedAI { - boss_tharon_jaAI(Creature* c) : ScriptedAI(c) + boss_tharon_jaAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiPhaseTimer; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index 9fc964000e3..26e4e9db99e 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -61,9 +61,9 @@ public: struct boss_trollgoreAI : public ScriptedAI { - boss_trollgoreAI(Creature* c) : ScriptedAI(c), lSummons(me) + boss_trollgoreAI(Creature* creature) : ScriptedAI(creature), lSummons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiConsumeTimer; diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index 8e5e7c3e185..aff3f1b8e36 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -83,7 +83,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index c8f18dba1d0..1469e26fd20 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -18,53 +18,6 @@ #include "ScriptPCH.h" #include "forge_of_souls.h" -enum Spells -{ - //Spiteful Apparition - SPELL_SPITE = 68895, - H_SPELL_SPITE = 70212, - - //Spectral Warden - SPELL_VEIL_OF_SHADOWS = 69633, - SPELL_WAIL_OF_SOULS = 69148, - H_SPELL_WAIL_OF_SOULS = 70210, - - //Soulguard Watchman - SPELL_SHROUD_OF_RUNES = 69056, - SPELL_UNHOLY_RAGE = 69053, - - //Soulguard Reaper - SPELL_FROST_NOVA = 69060, - H_SPELL_FROST_NOVA = 70209, - SPELL_SHADOW_LANCE = 69058, - - //Soulguard Bonecaster - SPELL_BONE_VOLLEY = 69080, - H_SPELL_BONE_VOLLEY = 70206, - SPELL_RAISE_DEAD = 69562, - SPELL_SHIELD_OF_BONES = 69069, - H_SPELL_SHIELD_OF_BONES = 70207, - - //Soulguard Animator - // Raise dead 69562 - SPELL_SHADOW_BOLT = 69068, - H_SPELL_SHADOW_BOLT = 70208, - SPELL_SOUL_SICKNESS = 69131, - SPELL_SOUL_SIPHON = 69128, - - //Soulguard Adept - //Raise dead 69562 - //Shadow Bolt 69068/70208 - SPELL_DRAIN_LIFE = 69066, - H_SPELL_DRAIN_LIFE = 70213, - SPELL_SHADOW_MEND = 69564, - H_SPELL_SHADOW_MEND = 70205, - - //Soul Horror - SPELL_SOUL_STRIKE = 69088, - H_SPELL_SOUL_STRIKE = 70211, -}; - enum Events { EVENT_NONE, @@ -78,38 +31,6 @@ enum Events EVENT_INTRO_6, EVENT_INTRO_7, EVENT_INTRO_8, - - //Spiteful Apparition - EVENT_SPITE, - - //Spectral Warden - EVENT_VEIL_OF_SHADOWS, - EVENT_WAIL_OF_SOULS, - - //Soulguard Watchman - EVENT_SHROUD_OF_RUNES, - EVENT_UNHOLY_RAGE, - - //Soulguard Reaper - EVENT_FROST_NOVA, - EVENT_SHADOW_LANCE, - - //Soulguard Bonecaster - EVENT_BONE_VOLLEY, - EVENT_RAISE_DEAD, - EVENT_SHIELD_OF_BONES, - - //Soulguard Animator - EVENT_SHADOW_BOLT, - EVENT_SOUL_SICKNESS, - EVENT_SOUL_SIPHON, - - //Soulguard Adept - EVENT_DRAIN_LIFE, - EVENT_SHADOW_MEND, - - //Soul Horror - EVENT_SOUL_STRIKE, }; /****************************************SYLVANAS************************************/ @@ -251,10 +172,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -388,10 +309,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -410,508 +331,8 @@ public: } }; -class mob_spiteful_apparition : public CreatureScript -{ -public: - mob_spiteful_apparition() : CreatureScript("mob_spiteful_apparition") { } - - struct mob_spiteful_apparitionAI: public ScriptedAI - { - mob_spiteful_apparitionAI(Creature* creature) : ScriptedAI(creature) - { - } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_SPITE, 8000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SPITE: - DoCastVictim(SPELL_SPITE); - events.RescheduleEvent(EVENT_SPITE, 8000); - return; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_spiteful_apparitionAI(creature); - } -}; - -class mob_spectral_warden : public CreatureScript -{ -public: - mob_spectral_warden() : CreatureScript("mob_spectral_warden") { } - - struct mob_spectral_wardenAI: public ScriptedAI - { - mob_spectral_wardenAI(Creature* creature) : ScriptedAI(creature) - { - } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_VEIL_OF_SHADOWS, 5000); - events.ScheduleEvent(EVENT_WAIL_OF_SOULS, 10000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_VEIL_OF_SHADOWS: - DoCastVictim(SPELL_VEIL_OF_SHADOWS); - events.RescheduleEvent(EVENT_VEIL_OF_SHADOWS, 10000); - return; - case EVENT_WAIL_OF_SOULS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_WAIL_OF_SOULS); - events.RescheduleEvent(EVENT_WAIL_OF_SOULS, 5000); - return; - } - } - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_spectral_wardenAI(creature); - } -}; - -class mob_soulguard_watchman : public CreatureScript -{ -public: - mob_soulguard_watchman() : CreatureScript("mob_soulguard_watchman") { } - - struct mob_soulguard_watchmanAI: public ScriptedAI - { - mob_soulguard_watchmanAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_SHROUD_OF_RUNES, 1000); - events.ScheduleEvent(EVENT_UNHOLY_RAGE, 1000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHROUD_OF_RUNES: - DoCast(me, SPELL_SHROUD_OF_RUNES); - events.RescheduleEvent(EVENT_SHROUD_OF_RUNES, 5000); - return; - case EVENT_UNHOLY_RAGE: - DoCast(me, SPELL_UNHOLY_RAGE); - events.RescheduleEvent(EVENT_UNHOLY_RAGE, 99999); - return; - } - } - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_soulguard_watchmanAI(creature); - } -}; - -class mob_soulguard_reaper : public CreatureScript -{ -public: - mob_soulguard_reaper() : CreatureScript("mob_soulguard_reaper") { } - - struct mob_soulguard_reaperAI: public ScriptedAI - { - mob_soulguard_reaperAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_FROST_NOVA, 8000); - events.ScheduleEvent(EVENT_SHADOW_LANCE, 5000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FROST_NOVA: - DoCast(me, SPELL_FROST_NOVA); - events.RescheduleEvent(EVENT_FROST_NOVA, 9600); - return; - case EVENT_SHADOW_LANCE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHADOW_LANCE); - events.RescheduleEvent(EVENT_SHADOW_LANCE, 8000); - return; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_soulguard_reaperAI(creature); - } -}; - -class mob_soulguard_bonecaster : public CreatureScript -{ -public: - mob_soulguard_bonecaster() : CreatureScript("mob_soulguard_bonecaster") { } - - struct mob_soulguard_bonecasterAI: public ScriptedAI - { - mob_soulguard_bonecasterAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_BONE_VOLLEY, 6000); - events.ScheduleEvent(EVENT_RAISE_DEAD, 25000); - events.ScheduleEvent(EVENT_SHIELD_OF_BONES, 6000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BONE_VOLLEY: - DoCastAOE(SPELL_BONE_VOLLEY); - events.RescheduleEvent(EVENT_BONE_VOLLEY, 7000); - return; - case EVENT_RAISE_DEAD: - DoCast(me, SPELL_RAISE_DEAD); - events.RescheduleEvent(EVENT_RAISE_DEAD, 25000); - return; - case EVENT_SHIELD_OF_BONES: - DoCast(me, SPELL_SHIELD_OF_BONES); - events.RescheduleEvent(EVENT_SHIELD_OF_BONES, 8000); - return; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_soulguard_bonecasterAI(creature); - } -}; - -class mob_soulguard_animator : public CreatureScript -{ -public: - mob_soulguard_animator() : CreatureScript("mob_soulguard_animator") { } - - struct mob_soulguard_animatorAI : public ScriptedAI - { - mob_soulguard_animatorAI(Creature* creature) : ScriptedAI(creature) - { - } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_RAISE_DEAD, 25000); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 5000); - events.ScheduleEvent(EVENT_SOUL_SICKNESS, 8000); - events.ScheduleEvent(EVENT_SOUL_SIPHON, 10000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_RAISE_DEAD: - DoCast(me, SPELL_RAISE_DEAD); - events.RescheduleEvent(EVENT_RAISE_DEAD, 25000); - return; - case EVENT_SHADOW_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHADOW_BOLT); - events.RescheduleEvent(EVENT_SHADOW_BOLT, 5000); - return; - case EVENT_SOUL_SICKNESS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SOUL_SICKNESS); - events.RescheduleEvent(EVENT_SOUL_SICKNESS, 10000); - return; - case EVENT_SOUL_SIPHON: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SOUL_SIPHON); - events.RescheduleEvent(EVENT_SOUL_SIPHON, 8000); - return; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_soulguard_animatorAI(creature); - } -}; - -class mob_soulguard_adept : public CreatureScript -{ -public: - mob_soulguard_adept() : CreatureScript("mob_soulguard_adept") { } - - struct mob_soulguard_adeptAI: public ScriptedAI - { - mob_soulguard_adeptAI(Creature* creature) : ScriptedAI(creature) - { - } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_RAISE_DEAD, 25000); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 8000); - events.ScheduleEvent(EVENT_DRAIN_LIFE, 7000); - events.ScheduleEvent(EVENT_SHADOW_MEND, 35000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_RAISE_DEAD: - DoCast(me, SPELL_RAISE_DEAD); - events.RescheduleEvent(EVENT_RAISE_DEAD, 25000); - return; - case EVENT_SHADOW_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHADOW_BOLT); - events.RescheduleEvent(EVENT_SHADOW_BOLT, 4000); - return; - case EVENT_DRAIN_LIFE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_DRAIN_LIFE); - events.RescheduleEvent(EVENT_DRAIN_LIFE, 9000); - return; - case EVENT_SHADOW_MEND: - DoCast(me, SPELL_SHADOW_MEND); - events.RescheduleEvent(EVENT_SHADOW_MEND, 20000); - return; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_soulguard_adeptAI(creature); - } -}; - -class mob_soul_horror : public CreatureScript -{ -public: - mob_soul_horror() : CreatureScript("mob_soul_horror") { } - - struct mob_soul_horrorAI : public ScriptedAI - { - mob_soul_horrorAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_SOUL_STRIKE, 6000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SOUL_STRIKE: - DoCast(me->getVictim(), SPELL_SOUL_STRIKE); - events.RescheduleEvent(EVENT_SOUL_STRIKE, 8000); - return; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_soul_horrorAI(creature); - } -}; - void AddSC_forge_of_souls() { new npc_sylvanas_fos(); new npc_jaina_fos(); - new mob_spiteful_apparition(); - new mob_spectral_warden(); - new mob_soulguard_watchman(); - new mob_soulguard_reaper(); - new mob_soulguard_bonecaster(); - new mob_soulguard_animator(); - new mob_soulguard_adept(); - new mob_soul_horror(); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 1583bdbdcd4..2abb60d5de2 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -157,10 +157,10 @@ private: public: npc_jaina_or_sylvanas_hor(bool isSylvana, const char* name) : CreatureScript(name), m_isSylvana(isSylvana) { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -248,7 +248,7 @@ public: { case EVENT_START_INTRO: me->GetMotionMaster()->MovePoint(0, MoveThronePos); - // Begining of intro is differents between factions as the speech sequence and timers are differents. + // Begining of intro is differents between fActions as the speech sequence and timers are differents. if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) events.ScheduleEvent(EVENT_INTRO_A2_1, 0); else @@ -633,7 +633,7 @@ public: struct npc_ghostly_priestAI: public ScriptedAI { - npc_ghostly_priestAI(Creature* c) : ScriptedAI(c) + npc_ghostly_priestAI(Creature* creature) : ScriptedAI(creature) { } @@ -715,7 +715,7 @@ public: struct npc_phantom_mageAI: public ScriptedAI { - npc_phantom_mageAI(Creature* c) : ScriptedAI(c) + npc_phantom_mageAI(Creature* creature) : ScriptedAI(creature) { } @@ -792,11 +792,11 @@ public: struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI { - npc_phantom_hallucinationAI(Creature* c) : npc_phantom_mage::npc_phantom_mageAI(c) + npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoCast(SPELL_HALLUCINATION_2); } @@ -816,7 +816,7 @@ public: struct npc_shadowy_mercenaryAI: public ScriptedAI { - npc_shadowy_mercenaryAI(Creature* c) : ScriptedAI(c) + npc_shadowy_mercenaryAI(Creature* creature) : ScriptedAI(creature) { } @@ -887,7 +887,7 @@ public: struct npc_spectral_footmanAI: public ScriptedAI { - npc_spectral_footmanAI(Creature* c) : ScriptedAI(c) + npc_spectral_footmanAI(Creature* creature) : ScriptedAI(creature) { } @@ -952,7 +952,7 @@ public: struct npc_tortured_riflemanAI : public ScriptedAI { - npc_tortured_riflemanAI(Creature* c) : ScriptedAI(c) + npc_tortured_riflemanAI(Creature* creature) : ScriptedAI(creature) { } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 64609efd7ff..a3b8c5df4e7 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -20,14 +20,15 @@ enum Yells { - SAY_AGGRO = -1658001, - SAY_SLAY_1 = -1658002, - SAY_SLAY_2 = -1658003, - SAY_DEATH = -1658004, - SAY_PHASE2 = -1658005, - SAY_PHASE3 = -1658006, - - SAY_TYRANNUS_DEATH = -1658007, + SAY_AGGRO = 0, + SAY_PHASE2 = 1, + SAY_PHASE3 = 2, + SAY_DEATH = 3, + SAY_SLAY = 4, + SAY_THROW_SARONITE = 5, + SAY_CAST_DEEP_FREEZE = 6, + + SAY_TYRANNUS_DEATH = -1658007, // todo }; enum Spells @@ -107,8 +108,9 @@ class boss_garfrost : public CreatureScript void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); DoCast(me, SPELL_PERMAFROST); + me->CallForHelp(70.0f); events.ScheduleEvent(EVENT_THROW_SARONITE, 7000); instance->SetBossState(DATA_GARFROST, IN_PROGRESS); @@ -117,12 +119,13 @@ class boss_garfrost : public CreatureScript void KilledUnit(Unit* victim) { if (victim->GetTypeId() == TYPEID_PLAYER) - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); + Talk(SAY_SLAY); } void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); + if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS))) DoScriptText(SAY_TYRANNUS_DEATH, tyrannus); @@ -134,6 +137,7 @@ class boss_garfrost : public CreatureScript if (events.GetPhaseMask() & PHASE_ONE_MASK && !HealthAbovePct(66)) { events.SetPhase(PHASE_TWO); + Talk(SAY_PHASE2); events.DelayEvents(8000); DoCast(me, SPELL_THUNDERING_STOMP); events.ScheduleEvent(EVENT_JUMP, 1500); @@ -143,6 +147,7 @@ class boss_garfrost : public CreatureScript if (events.GetPhaseMask() & PHASE_TWO_MASK && !HealthAbovePct(33)) { events.SetPhase(PHASE_THREE); + Talk(SAY_PHASE3); events.DelayEvents(8000); DoCast(me, SPELL_THUNDERING_STOMP); events.ScheduleEvent(EVENT_JUMP, 1500); @@ -199,7 +204,10 @@ class boss_garfrost : public CreatureScript { case EVENT_THROW_SARONITE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + Talk(SAY_THROW_SARONITE); DoCast(target, SPELL_THROW_SARONITE); + } events.ScheduleEvent(EVENT_THROW_SARONITE, urand(12500, 20000)); break; case EVENT_CHILLING_WAVE: @@ -208,7 +216,10 @@ class boss_garfrost : public CreatureScript break; case EVENT_DEEP_FREEZE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + Talk(SAY_CAST_DEEP_FREEZE); DoCast(target, SPELL_DEEP_FREEZE); + } events.ScheduleEvent(EVENT_DEEP_FREEZE, 35000, 0, PHASE_THREE); break; case EVENT_JUMP: diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 8e211cbd2cb..fa260cb298d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -347,7 +347,7 @@ class boss_krick : public CreatureScript else tyrannusPtr = me->SummonCreature(NPC_TYRANNUS_EVENTS, outroPos[1], TEMPSUMMON_MANUAL_DESPAWN); - tyrannusPtr->SetFlying(true); + tyrannusPtr->SetCanFly(true); me->GetMotionMaster()->MovePoint(POINT_KRICK_INTRO, outroPos[0].GetPositionX(), outroPos[0].GetPositionY(), outroPos[0].GetPositionZ()); tyrannusPtr->SetFacingToObject(me); } @@ -439,6 +439,7 @@ class boss_krick : public CreatureScript _events.ScheduleEvent(EVENT_OUTRO_8, 5000); break; case EVENT_OUTRO_8: + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->GetMotionMaster()->MovePoint(0, outroPos[5]); DoCast(me, SPELL_STRANGULATING); @@ -453,8 +454,9 @@ class boss_krick : public CreatureScript _events.ScheduleEvent(EVENT_OUTRO_10, 1000); break; case EVENT_OUTRO_10: + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING me->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); - me->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + me->AddUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR); me->GetMotionMaster()->MovePoint(0, outroPos[6]); _events.ScheduleEvent(EVENT_OUTRO_11, 2000); break; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index d6b2c2e3a97..8d015adf4a4 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -295,7 +295,7 @@ class boss_rimefang : public CreatureScript _events.SetPhase(PHASE_NONE); _currentWaypoint = 0; _hoarfrostTargetGUID = 0; - me->SetFlying(true); + me->SetCanFly(true); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -387,8 +387,7 @@ class player_overlord_brandAI : public PlayerAI void SetGUID(uint64 guid, int32 /*type*/) { tyrannus = ObjectAccessor::GetCreature(*me, guid); - if (!tyrannus) - me->IsAIEnabled = false; + me->IsAIEnabled = tyrannus != NULL; } void DamageDealt(Unit* /*victim*/, uint32& damage, DamageEffectType /*damageType*/) @@ -423,10 +422,9 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader return; oldAI = GetTarget()->GetAI(); + oldAIState = GetTarget()->IsAIEnabled; GetTarget()->SetAI(new player_overlord_brandAI(GetTarget()->ToPlayer())); GetTarget()->GetAI()->SetGUID(GetCasterGUID()); - oldAIState = GetTarget()->IsAIEnabled; - GetTarget()->IsAIEnabled = true; } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp index 24529801564..1301acf4c99 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp @@ -23,6 +23,13 @@ Position const SlaveLeaderPos = {689.7158f, -104.8736f, 513.7360f, 0.0f}; // position for Jaina and Sylvanas Position const EventLeaderPos2 = {1054.368f, 107.14620f, 628.4467f, 0.0f}; +DoorData const Doors[] = +{ + {GO_ICE_WALL, DATA_GARFROST, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, + {GO_ICE_WALL, DATA_ICK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, + {GO_HALLS_OF_REFLECTION_PORTCULLIS, DATA_TYRANNUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, +}; + class instance_pit_of_saron : public InstanceMapScript { public: @@ -33,6 +40,7 @@ class instance_pit_of_saron : public InstanceMapScript instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map) { SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(Doors); _garfrostGUID = 0; _krickGUID = 0; _ickGUID = 0; @@ -154,6 +162,28 @@ class instance_pit_of_saron : public InstanceMapScript } } + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_ICE_WALL: + case GO_HALLS_OF_REFLECTION_PORTCULLIS: + AddDoor(go, true); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_ICE_WALL: + case GO_HALLS_OF_REFLECTION_PORTCULLIS: + AddDoor(go, false); + break; + } + } + bool SetBossState(uint32 type, EncounterState state) { if (!InstanceScript::SetBossState(type, state)) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index a91951ca25e..b6c821ef66a 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -25,9 +25,6 @@ enum eSpells SPELL_HELLFIRE = 69586, SPELL_TACTICAL_BLINK = 69584, SPELL_FROST_BREATH = 69527, //Iceborn Proto-Drake - SPELL_BLINDING_DIRT = 70302, //Wrathbone Laborer - SPELL_PUNCTURE_WOUND = 70278, - SPELL_SHOVELLED = 69572, SPELL_LEAPING_FACE_MAUL = 69504, // Geist Ambusher }; @@ -36,11 +33,6 @@ enum eEvents // Ymirjar Flamebearer EVENT_FIREBALL = 1, EVENT_TACTICAL_BLINK = 2, - - //Wrathbone Laborer - EVENT_BLINDING_DIRT = 3, - EVENT_PUNCTURE_WOUND = 4, - EVENT_SHOVELLED = 5, }; class mob_ymirjar_flamebearer : public CreatureScript @@ -157,73 +149,6 @@ class mob_iceborn_protodrake : public CreatureScript } }; -class mob_wrathbone_laborer : public CreatureScript -{ - public: - mob_wrathbone_laborer() : CreatureScript("mob_wrathbone_laborer") { } - - struct mob_wrathbone_laborerAI: public ScriptedAI - { - mob_wrathbone_laborerAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - _events.ScheduleEvent(EVENT_BLINDING_DIRT, 8000); - _events.ScheduleEvent(EVENT_PUNCTURE_WOUND, 9000); - _events.ScheduleEvent(EVENT_SHOVELLED, 5000); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BLINDING_DIRT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f, true)) - DoCast(target, SPELL_BLINDING_DIRT); - _events.RescheduleEvent(EVENT_BLINDING_DIRT, 10000); - return; - case EVENT_PUNCTURE_WOUND: - DoCastVictim(SPELL_PUNCTURE_WOUND); - _events.RescheduleEvent(EVENT_PUNCTURE_WOUND, 9000); - return; - case EVENT_SHOVELLED: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, -5.0f)) - DoCast(target, SPELL_SHOVELLED); - _events.RescheduleEvent(EVENT_SHOVELLED, 7000); - return; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_wrathbone_laborerAI(creature); - } -}; - class mob_geist_ambusher : public CreatureScript { public: @@ -240,12 +165,13 @@ class mob_geist_ambusher : public CreatureScript _leapingFaceMaulCooldown = 9000; } - void MoveInLineOfSight(Unit* who) + void EnterCombat(Unit* who) { if (who->GetTypeId() != TYPEID_PLAYER) return; - if (me->IsWithinDistInMap(who, 30.0f)) + // the max range is determined by aggro range + if (me->GetDistance(who) > 5.0f) DoCast(who, SPELL_LEAPING_FACE_MAUL); } @@ -309,7 +235,6 @@ class spell_trash_mob_glacial_strike : public SpellScriptLoader void AddSC_pit_of_saron() { new mob_ymirjar_flamebearer(); - new mob_wrathbone_laborer(); new mob_iceborn_protodrake(); new mob_geist_ambusher(); new spell_trash_mob_glacial_strike(); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h index 728e0ccd955..768c3ba40ec 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h @@ -90,6 +90,8 @@ enum CreatureIds enum GameObjectIds { GO_SARONITE_ROCK = 196485, + GO_ICE_WALL = 201885, + GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848, }; #endif diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp index c665d3cdf5a..3e803c24d61 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp @@ -41,9 +41,9 @@ public: struct boss_eckAI : public ScriptedAI { - boss_eckAI(Creature* c) : ScriptedAI(c) + boss_eckAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiBerserkTimer; @@ -145,14 +145,14 @@ public: struct npc_ruins_dwellerAI : public ScriptedAI { - npc_ruins_dwellerAI(Creature* c) : ScriptedAI(c) + npc_ruins_dwellerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (instance) { diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index daa5ee86483..be9b09a1263 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -75,9 +75,9 @@ public: struct boss_gal_darahAI : public ScriptedAI { - boss_gal_darahAI(Creature* c) : ScriptedAI(c) + boss_gal_darahAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiStampedeTimer; diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 5071802f897..b827f43dc99 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -80,9 +80,9 @@ public: struct boss_slad_ranAI : public ScriptedAI { - boss_slad_ranAI(Creature* c) : ScriptedAI(c), lSummons(me) + boss_slad_ranAI(Creature* creature) : ScriptedAI(creature), lSummons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiPoisonNovaTimer; @@ -219,7 +219,7 @@ public: struct mob_slad_ran_constrictorAI : public ScriptedAI { - mob_slad_ran_constrictorAI(Creature* c) : ScriptedAI(c) {} + mob_slad_ran_constrictorAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiGripOfSladRanTimer; @@ -272,7 +272,7 @@ public: struct mob_slad_ran_viperAI : public ScriptedAI { - mob_slad_ran_viperAI(Creature* c) : ScriptedAI(c) {} + mob_slad_ran_viperAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiVenomousBiteTimer; diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index c0fc722385b..c22a0e17cd5 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -131,7 +131,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -519,17 +520,17 @@ class go_gundrak_altar : public GameObjectScript public: go_gundrak_altar() : GameObjectScript("go_gundrak_altar") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - InstanceScript* instance = pGO->GetInstanceScript(); + InstanceScript* instance = go->GetInstanceScript(); uint64 uiStatue = 0; - pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - pGO->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); if (instance) { - switch (pGO->GetEntry()) + switch (go->GetEntry()) { case 192518: uiStatue = instance->GetData64(DATA_SLAD_RAN_STATUE); @@ -545,8 +546,8 @@ public: if (!instance->GetData64(DATA_STATUE_ACTIVATE)) { instance->SetData64(DATA_STATUE_ACTIVATE, uiStatue); - pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - pGO->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); } return true; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 70b07c61e79..d091a87dbfe 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -103,6 +103,7 @@ enum Spells SPELL_UNSTABLE = 72059, SPELL_KINETIC_BOMB_VISUAL = 72054, SPELL_KINETIC_BOMB_EXPLOSION = 72052, + SPELL_KINETIC_BOMB_KNOCKBACK = 72087, // Shock Vortex SPELL_SHOCK_VORTEX_PERIODIC = 71945, @@ -210,19 +211,19 @@ class boss_blood_council_controller : public CreatureScript if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) { - instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, keleseth); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, keleseth); DoZoneInCombat(keleseth); } if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) { - instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, taldaram); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, taldaram); DoZoneInCombat(taldaram); } if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) { - instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, valanar); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, valanar); DoZoneInCombat(valanar); } @@ -412,12 +413,12 @@ class boss_prince_keleseth_icc : public CreatureScript summons.DespawnAll(); Talk(SAY_KELESETH_DEATH); - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } void JustReachedHome() { - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); me->SetHealth(_spawnHealth); _isEmpowered = false; if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) @@ -443,20 +444,12 @@ class boss_prince_keleseth_icc : public CreatureScript { summons.Summon(summon); Position pos; - pos.Relocate(summon); + me->GetPosition(&pos); float maxRange = me->GetDistance2d(summon); float angle = me->GetAngle(summon); - // prevent spawning outside of room - while (!me->IsWithinLOS(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ())) - { - maxRange -= 5.0f; - if (maxRange < 5.0f) - break; - - summon->MovePosition(pos, float(rand_norm() * maxRange), angle); - } - + me->MovePositionToFirstCollision(pos, maxRange, angle); summon->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); + summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN); } void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) @@ -636,12 +629,12 @@ class boss_prince_taldaram_icc : public CreatureScript summons.DespawnAll(); Talk(EMOTE_TALDARAM_DEATH); - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } void JustReachedHome() { - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); me->SetHealth(_spawnHealth); _isEmpowered = false; if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) @@ -859,12 +852,12 @@ class boss_prince_valanar_icc : public CreatureScript summons.DespawnAll(); Talk(SAY_VALANAR_DEATH); - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } void JustReachedHome() { - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); me->SetHealth(me->GetMaxHealth()); _isEmpowered = false; if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) @@ -894,6 +887,7 @@ class boss_prince_valanar_icc : public CreatureScript summon->GetPosition(x, y, z); float ground_Z = summon->GetMap()->GetHeight(summon->GetPhaseMask(), x, y, z, true, 500.0f); summon->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, x, y, ground_Z); + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); break; } case NPC_SHOCK_VORTEX: @@ -1058,7 +1052,7 @@ class npc_blood_queen_lana_thel : public CreatureScript void Reset() { _events.Reset(); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); if (_instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == DONE) { me->SetVisible(false); @@ -1073,7 +1067,7 @@ class npc_blood_queen_lana_thel : public CreatureScript if (_introDone) return; - if (!me->IsWithinDistInMap(who, 35.0f)) + if (!me->IsWithinDistInMap(who, 35.0f, false)) return; _introDone = true; @@ -1232,12 +1226,12 @@ class npc_kinetic_bomb : public CreatureScript void Reset() { _events.Reset(); - me->SetDisplayId(DISPLAY_KINETIC_BOMB); + me->SetWalk(true); me->CastSpell(me, SPELL_UNSTABLE, true); me->CastSpell(me, SPELL_KINETIC_BOMB_VISUAL, true); me->SetReactState(REACT_PASSIVE); - me->SetSpeed(MOVE_FLIGHT, IsHeroic() ? 0.3f : 0.15f, true); me->GetPosition(_x, _y, _groundZ); + me->DespawnOrUnsummon(60000); _groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), _x, _y, _groundZ, true, 500.0f); } @@ -1247,9 +1241,9 @@ class npc_kinetic_bomb : public CreatureScript _events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1000); else if (action == ACTION_KINETIC_BOMB_JUMP) { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveJump(_x, _y, me->GetPositionZ() + 7.0f, 1.0f, 7.0f); - _events.ScheduleEvent(EVENT_CONTINUE_FALLING, 700); + if (!me->HasAura(SPELL_KINETIC_BOMB_KNOCKBACK)) + me->GetMotionMaster()->MoveCharge(_x, _y, me->GetPositionZ() + 100.0f, me->GetSpeed(MOVE_RUN), 0); + _events.RescheduleEvent(EVENT_CONTINUE_FALLING, 3000); } } @@ -1263,10 +1257,10 @@ class npc_kinetic_bomb : public CreatureScript { case EVENT_BOMB_DESPAWN: me->SetVisible(false); + me->DespawnOrUnsummon(5000); break; case EVENT_CONTINUE_FALLING: - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, _x, _y, _groundZ); + me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_WALK), POINT_KINETIC_BOMB_IMPACT); break; default: break; @@ -1329,17 +1323,16 @@ class npc_dark_nucleus : public CreatureScript void DamageTaken(Unit* attacker, uint32& /*damage*/) { - if (attacker == me) + if (attacker == me || attacker == me->getVictim()) return; - if (!_lockedTarget) - if (me->getVictim() == attacker) - _lockedTarget = true; + me->DeleteThreatList(); + me->AddThreat(attacker, 500000000.0f); } - void UpdateAI(const uint32 diff) + void UpdateAI(uint32 const diff) { - if (!me->isInCombat()) + if (!UpdateVictim()) return; if (_targetAuraCheck <= diff) @@ -1355,23 +1348,6 @@ class npc_dark_nucleus : public CreatureScript } else _targetAuraCheck -= diff; - - if (!_lockedTarget) - { - if (Unit* victim = me->SelectVictim()) - { - if (me->getVictim() && me->getVictim() != victim) - { - me->getVictim()->RemoveAurasDueToSpell(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID()); - _lockedTarget = true; - } - - _lockedTarget = true; - AttackStart(victim); - DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST); - me->ClearUnitState(UNIT_STATE_CASTING); - } - } } private: @@ -1521,10 +1497,11 @@ class spell_valanar_kinetic_bomb : public SpellScriptLoader void ChangeSummonPos(SpellEffIndex /*effIndex*/) { - WorldLocation summonPos = *GetTargetDest(); + WorldLocation summonPos = *GetExplTargetDest(); Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; summonPos.RelocateOffset(offset); - SetTargetDest(summonPos); + SetExplTargetDest(summonPos); + GetHitDest()->RelocateOffset(offset); } void Register() @@ -1586,7 +1563,7 @@ class spell_valanar_kinetic_bomb_knockback : public SpellScriptLoader void Register() { - AfterHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir); + BeforeHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir); } }; @@ -1663,7 +1640,7 @@ class spell_blood_council_shadow_prison_damage : public SpellScriptLoader void AddExtraDamage() { if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) - if (AuraEffect const* eff = aur->GetEffect(1)) + if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) SetHitDamage(GetHitDamage() + eff->GetAmount()); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 79a577f6591..ee966256e2b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -149,7 +149,7 @@ class boss_blood_queen_lana_thel : public CreatureScript events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30500, EVENT_GROUP_NORMAL); events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL); events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0)); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY); + CleanAuras(); me->SetSpeed(MOVE_FLIGHT, 0.642857f, true); _offtank = NULL; _vampires.clear(); @@ -170,6 +170,7 @@ class boss_blood_queen_lana_thel : public CreatureScript DoZoneInCombat(); Talk(SAY_AGGRO); instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS); + CleanAuras(); DoCast(me, SPELL_SHROUD_OF_SORROW, true); DoCast(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true); @@ -180,15 +181,7 @@ class boss_blood_queen_lana_thel : public CreatureScript { _JustDied(); Talk(SAY_DEATH); - instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN); - instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR); - instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY); - instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); + CleanAuras(); // Blah, credit the quest if (_creditBloodQuickening) { @@ -198,8 +191,8 @@ class boss_blood_queen_lana_thel : public CreatureScript if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f)) { minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - minchar->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - minchar->SetFlying(false); + minchar->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND); + minchar->SetCanFly(false); minchar->SendMovementFlagUpdate(); minchar->RemoveAllAuras(); minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE/3.0f); @@ -207,6 +200,19 @@ class boss_blood_queen_lana_thel : public CreatureScript } } + void CleanAuras() + { + instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN); + instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR); + instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY); + instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); + } + void DoAction(int32 const action) { if (action != ACTION_KILL_MINCHAR) @@ -216,9 +222,9 @@ class boss_blood_queen_lana_thel : public CreatureScript _killMinchar = true; else { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - me->SetFlying(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND); + me->SetCanFly(true); me->SendMovementFlagUpdate(); me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos); } @@ -227,12 +233,13 @@ class boss_blood_queen_lana_thel : public CreatureScript void EnterEvadeMode() { _EnterEvadeMode(); + CleanAuras(); if (_killMinchar) { _killMinchar = false; - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - me->SetFlying(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND); + me->SetCanFly(true); me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos); } else @@ -244,9 +251,9 @@ class boss_blood_queen_lana_thel : public CreatureScript void JustReachedHome() { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - me->SetFlying(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND); + me->SetCanFly(false); me->SetReactState(REACT_AGGRESSIVE); _JustReachedHome(); Talk(SAY_WIPE); @@ -295,9 +302,9 @@ class boss_blood_queen_lana_thel : public CreatureScript events.ScheduleEvent(EVENT_AIR_FLY_DOWN, 10000); break; case POINT_GROUND: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - me->SetFlying(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND); + me->SetCanFly(false); me->SendMovementFlagUpdate(); me->SetReactState(REACT_AGGRESSIVE); if (Unit* victim = me->SelectVictim()) @@ -372,7 +379,7 @@ class boss_blood_queen_lana_thel : public CreatureScript break; } case EVENT_DELIRIOUS_SLASH: - if (_offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03)) + if (_offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER)) DoCast(_offtank, SPELL_DELIRIOUS_SLASH); events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000), EVENT_GROUP_NORMAL); break; @@ -386,7 +393,7 @@ class boss_blood_queen_lana_thel : public CreatureScript ++targetCount; if (Is25ManRaid()) ++targetCount; - Trinity::RandomResizeList(targets, targetCount); + Trinity::Containers::RandomResizeList(targets, targetCount); if (targets.size() > 1) { Talk(SAY_PACT_OF_THE_DARKFALLEN); @@ -409,7 +416,7 @@ class boss_blood_queen_lana_thel : public CreatureScript { std::list targets; SelectRandomTarget(false, &targets); - Trinity::RandomResizeList(targets, uint32(Is25ManRaid() ? 4 : 2)); + Trinity::Containers::RandomResizeList(targets, uint32(Is25ManRaid() ? 4 : 2)); for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) DoCast(*itr, SPELL_TWILIGHT_BLOODBOLT); DoCast(me, SPELL_TWILIGHT_BLOODBOLT_TARGET); @@ -424,9 +431,9 @@ class boss_blood_queen_lana_thel : public CreatureScript me->GetMotionMaster()->MovePoint(POINT_CENTER, centerPos); break; case EVENT_AIR_START_FLYING: - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); - me->SetFlying(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND); + me->SetCanFly(true); me->SendMovementFlagUpdate(); me->GetMotionMaster()->MovePoint(POINT_AIR, airPos); break; @@ -481,7 +488,7 @@ class boss_blood_queen_lana_thel : public CreatureScript return tempTargets.front(); } - return SelectRandomContainerElement(tempTargets); + return Trinity::Containers::SelectRandomContainerElement(tempTargets); } std::set _vampires; @@ -522,7 +529,7 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader SpellCastResult CheckTarget() { - if (IsVampire(GetTargetUnit())) + if (IsVampire(GetExplTargetUnit())) { SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES); return SPELL_FAILED_CUSTOM_ERROR; @@ -658,7 +665,7 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader { uint32 targetCount = (targets.size() + 2) / 3; targets.remove_if (BloodboltHitCheck(static_cast(GetCaster()->GetAI()))); - Trinity::RandomResizeList(targets, targetCount); + Trinity::Containers::RandomResizeList(targets, targetCount); // mark targets now, effect hook has missile travel time delay (might cast next in that time) for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 3c795187f43..494be259baa 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -39,6 +39,7 @@ enum ScriptTexts SAY_FRENZY = 11, SAY_BERSERK = 12, SAY_DEATH = 13, + EMOTE_SCENT_OF_BLOOD = 14, // High Overlord Saurfang SAY_INTRO_HORDE_1 = 0, @@ -111,6 +112,8 @@ enum Spells SPELL_RIDE_VEHICLE = 70640, // Outro SPELL_ACHIEVEMENT = 72928, + SPELL_REMOVE_MARKS_OF_THE_FALLEN_CHAMPION = 72257, + SPELL_PERMANENT_FEIGN_DEATH = 70628, }; // Helper to get id of the aura on different modes (HasAura(baseId) wont work) @@ -143,6 +146,7 @@ enum EventTypes EVENT_BOILING_BLOOD = 20, EVENT_BLOOD_NOVA = 21, EVENT_RUNE_OF_BLOOD = 22, + EVENT_SCENT_OF_BLOOD = 52, EVENT_OUTRO_ALLIANCE_1 = 23, EVENT_OUTRO_ALLIANCE_2 = 24, @@ -254,6 +258,7 @@ class boss_deathbringer_saurfang : public CreatureScript me->SetReactState(REACT_DEFENSIVE); events.SetPhase(PHASE_COMBAT); _frenzied = false; + _dead = false; me->SetPower(POWER_ENERGY, 0); DoCast(me, SPELL_ZERO_POWER, true); DoCast(me, SPELL_BLOOD_LINK, true); @@ -266,6 +271,9 @@ class boss_deathbringer_saurfang : public CreatureScript void EnterCombat(Unit* who) { + if (_dead) + return; + if (!instance->CheckRequiredBosses(DATA_DEATHBRINGER_SAURFANG, who->ToPlayer())) { EnterEvadeMode(); @@ -291,7 +299,7 @@ class boss_deathbringer_saurfang : public CreatureScript Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT); - events.ScheduleEvent(EVENT_BERSERK, 480000, 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 480000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_BOILING_BLOOD, 15500, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0, PHASE_COMBAT); @@ -303,13 +311,6 @@ class boss_deathbringer_saurfang : public CreatureScript void JustDied(Unit* /*killer*/) { - _JustDied(); - DoCast(me, SPELL_ACHIEVEMENT, true); - Talk(SAY_DEATH); - - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); - if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) - creature->AI()->DoAction(ACTION_START_OUTRO); } void AttackStart(Unit* victim) @@ -340,14 +341,34 @@ class boss_deathbringer_saurfang : public CreatureScript Talk(SAY_KILL); } - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) + void DamageTaken(Unit* /*attacker*/, uint32& damage) { + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + if (!_frenzied && HealthBelowPct(31)) // AT 30%, not below { _frenzied = true; DoCast(me, SPELL_FRENZY); Talk(SAY_FRENZY); } + + if (!_dead && me->GetHealth() < FightWonValue) + { + _dead = true; + _JustDied(); + _EnterEvadeMode(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + + DoCastAOE(SPELL_REMOVE_MARKS_OF_THE_FALLEN_CHAMPION); + DoCast(me, SPELL_ACHIEVEMENT, true); + Talk(SAY_DEATH); + + //instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); + DoCast(me, SPELL_PERMANENT_FEIGN_DEATH); + if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) + creature->AI()->DoAction(ACTION_START_OUTRO); + } } void JustSummoned(Creature* summon) @@ -355,16 +376,13 @@ class boss_deathbringer_saurfang : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) summon->AI()->AttackStart(target); - if (IsHeroic()) - DoCast(summon, SPELL_SCENT_OF_BLOOD); - - summon->AI()->DoCast(summon, SPELL_BLOOD_LINK_BEAST, true); - summon->AI()->DoCast(summon, SPELL_RESISTANT_SKIN, true); + summon->CastSpell(summon, SPELL_BLOOD_LINK_BEAST, true); + summon->CastSpell(summon, SPELL_RESISTANT_SKIN, true); summons.Summon(summon); DoZoneInCombat(summon); } - void SummonedCreatureDespawn(Creature* summon) + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) { summons.Despawn(summon); } @@ -444,18 +462,13 @@ class boss_deathbringer_saurfang : public CreatureScript DoCast(me, SPELL_SUMMON_BLOOD_BEAST_25_MAN+i25); Talk(SAY_BLOOD_BEASTS); events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 40000, 0, PHASE_COMBAT); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SCENT_OF_BLOOD, 10000, 0, PHASE_COMBAT); break; case EVENT_BLOOD_NOVA: - { - // select at range only - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, -10.0f, true); - if (!target) - target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true); // noone? select melee - if (target) - DoCast(target, SPELL_BLOOD_NOVA_TRIGGER); + DoCastAOE(SPELL_BLOOD_NOVA_TRIGGER); events.ScheduleEvent(EVENT_BLOOD_NOVA, urand(20000, 25000), 0, PHASE_COMBAT); break; - } case EVENT_RUNE_OF_BLOOD: DoCastVictim(SPELL_RUNE_OF_BLOOD); events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, urand(20000, 25000), 0, PHASE_COMBAT); @@ -468,6 +481,13 @@ class boss_deathbringer_saurfang : public CreatureScript DoCast(me, SPELL_BERSERK); Talk(SAY_BERSERK); break; + case EVENT_SCENT_OF_BLOOD: + if (!summons.empty()) + { + Talk(EMOTE_SCENT_OF_BLOOD); + DoCastAOE(SPELL_SCENT_OF_BLOOD); + } + break; default: break; } @@ -542,10 +562,13 @@ class boss_deathbringer_saurfang : public CreatureScript } } + static uint32 const FightWonValue; + private: uint32 _fallenChampionCastCount; bool _introDone; bool _frenzied; // faster than iterating all auras to find Frenzy + bool _dead; }; CreatureAI* GetAI(Creature* creature) const @@ -554,6 +577,8 @@ class boss_deathbringer_saurfang : public CreatureScript } }; +uint32 const boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::FightWonValue = 100000; + class npc_high_overlord_saurfang_icc : public CreatureScript { public: @@ -605,10 +630,8 @@ class npc_high_overlord_saurfang_icc : public CreatureScript _events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 18000); // say _events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 24000); // cast _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30000); // move - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SendMovementFlagUpdate(); - me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 0.0f); + me->SetDisableGravity(false); + me->GetMotionMaster()->MoveFall(); for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) (*itr)->AI()->DoAction(ACTION_DESPAWN); break; @@ -629,7 +652,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript { if (spell->Id == SPELL_GRIP_OF_AGONY) { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]); } } @@ -641,7 +664,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript switch (id) { case POINT_FIRST_STEP: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); Talk(SAY_INTRO_HORDE_3); _events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H); _events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H); @@ -655,7 +678,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript { deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs. deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - deathbringer->setDeathState(ALIVE); + deathbringer->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DROWNED); } _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move _events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say @@ -687,7 +710,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript switch (eventId) { case EVENT_INTRO_HORDE_3: - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_FIRST_STEP, firstStepPos.GetPositionX(), firstStepPos.GetPositionY(), firstStepPos.GetPositionZ()); break; case EVENT_INTRO_HORDE_5: @@ -718,7 +741,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript { float x, y, z; deathbringer->GetClosePoint(x, y, z, deathbringer->GetObjectSize()); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_CORPSE, x, y, z); } break; @@ -812,12 +835,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript { me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); Talk(SAY_OUTRO_ALLIANCE_1); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SendMovementFlagUpdate(); - me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 0.0f); + me->SetDisableGravity(false); + me->GetMotionMaster()->MoveFall(); for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) (*itr)->AI()->DoAction(ACTION_DESPAWN); + + // temp until outro fully done - to put deathbringer on respawn timer (until next reset) + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + deathbringer->DespawnOrUnsummon(5000); break; } case ACTION_INTERRUPT_INTRO: @@ -832,7 +857,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript { if (spell->Id == SPELL_GRIP_OF_AGONY) { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]); } } @@ -841,7 +866,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript { if (type == POINT_MOTION_TYPE && id == POINT_FIRST_STEP) { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); Talk(SAY_INTRO_ALLIANCE_4); _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A); if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) @@ -865,7 +890,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript switch (eventId) { case EVENT_INTRO_ALLIANCE_4: - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_FIRST_STEP, firstStepPos.GetPositionX(), firstStepPos.GetPositionY(), firstStepPos.GetPositionZ()); break; case EVENT_INTRO_ALLIANCE_5: @@ -934,7 +959,7 @@ class npc_saurfang_event : public CreatureScript { if (spell->Id == SPELL_GRIP_OF_AGONY) { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[_index]); } } @@ -1175,6 +1200,9 @@ class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader void FilterTargetsInitial(std::list& unitList) { + if (unitList.empty()) + return; + // select one random target, with preference of ranged targets uint32 targetsAtRange = 0; uint32 const minTargets = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 10 : 4); @@ -1189,7 +1217,9 @@ class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader if (targetsAtRange < minTargets) targetsAtRange = std::min(unitList.size() - 1, minTargets); - target = SelectRandomContainerElement(unitList); + std::list::const_iterator itr = unitList.begin(); + std::advance(itr, urand(0, targetsAtRange)); + target = *itr; unitList.clear(); unitList.push_back(target); } @@ -1204,10 +1234,16 @@ class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader unitList.push_back(target); } + void HandleForceCast(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), TRIGGERED_FULL_MASK); + } + void Register() { OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_nova_targeting_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); } Unit* target; @@ -1239,7 +1275,7 @@ class spell_deathbringer_boiling_blood : public SpellScriptLoader if (unitList.empty()) return; - Unit* target = SelectRandomContainerElement(unitList); + Unit* target = Trinity::Containers::SelectRandomContainerElement(unitList); unitList.clear(); unitList.push_back(target); } @@ -1256,6 +1292,33 @@ class spell_deathbringer_boiling_blood : public SpellScriptLoader } }; +class spell_deathbringer_remove_marks : public SpellScriptLoader +{ + public: + spell_deathbringer_remove_marks() : SpellScriptLoader("spell_deathbringer_remove_marks") { } + + class spell_deathbringer_remove_marks_SpellScript : public SpellScript + { + PrepareSpellScript(spell_deathbringer_remove_marks_SpellScript); + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_deathbringer_remove_marks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_deathbringer_remove_marks_SpellScript(); + } +}; + class achievement_ive_gone_and_made_a_mess : public AchievementCriteriaScript { public: @@ -1285,5 +1348,6 @@ void AddSC_boss_deathbringer_saurfang() new spell_deathbringer_blood_nova(); new spell_deathbringer_blood_nova_targeting(); new spell_deathbringer_boiling_blood(); + new spell_deathbringer_remove_marks(); new achievement_ive_gone_and_made_a_mess(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index a97c6f7d138..58856f9fb44 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -328,7 +328,7 @@ class npc_stinky_icc : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* festergut = me->GetCreature(*me, _instance->GetData64(DATA_FESTERGUT))) if (festergut->isAlive()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 6edf3fe300b..0515ba83480 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -605,7 +605,7 @@ class boss_lady_deathwhisper : public CreatureScript return; // select random cultist - Creature* cultist = SelectRandomContainerElement(temp); + Creature* cultist = Trinity::Containers::SelectRandomContainerElement(temp); DoCast(cultist, cultist->GetEntry() == NPC_CULT_FANATIC ? SPELL_DARK_TRANSFORMATION_T : SPELL_DARK_EMPOWERMENT_T, true); Talk(uint8(cultist->GetEntry() == NPC_CULT_FANATIC ? SAY_DARK_TRANSFORMATION : SAY_DARK_EMPOWERMENT)); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 8623fcfde81..a0fca522f61 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -64,6 +64,9 @@ enum Spells SPELL_MALLEABLE_GOO = 70852, SPELL_UNSTABLE_EXPERIMENT = 70351, SPELL_TEAR_GAS = 71617, // phase transition + SPELL_TEAR_GAS_CREATURE = 71618, + SPELL_TEAR_GAS_CANCEL = 71620, + SPELL_TEAR_GAS_PERIODIC_TRIGGER = 73170, SPELL_CREATE_CONCOCTION = 71621, SPELL_GUZZLE_POTIONS = 71893, SPELL_OOZE_TANK_PROTECTION = 71770, // protects the tank @@ -86,6 +89,7 @@ enum Spells SPELL_GASEOUS_BLOAT_PROC = 70215, SPELL_GASEOUS_BLOAT = 70672, SPELL_GASEOUS_BLOAT_PROTECTION = 70812, + SPELL_EXPUNGED_GAS = 70701, // Volatile Ooze SPELL_OOZE_ERUPTION = 70492, @@ -167,6 +171,33 @@ enum PutricideData #define EXPERIMENT_STATE_OOZE false #define EXPERIMENT_STATE_GAS true +class AbominationDespawner +{ + public: + explicit AbominationDespawner(Unit* owner) : _owner(owner) { } + + bool operator()(uint64 guid) + { + if (Unit* summon = ObjectAccessor::GetUnit(*_owner, guid)) + { + if (summon->GetEntry() == NPC_MUTATED_ABOMINATION_10 || summon->GetEntry() == NPC_MUTATED_ABOMINATION_25) + { + if (Vehicle* veh = summon->GetVehicleKit()) + veh->RemoveAllPassengers(); // also despawns the vehicle + + return true; + } + + return false; + } + + return true; + } + + private: + Unit* _owner; +}; + class boss_professor_putricide : public CreatureScript { public: @@ -191,7 +222,7 @@ class boss_professor_putricide : public CreatureScript SetPhase(PHASE_COMBAT_1); _experimentState = EXPERIMENT_STATE_OOZE; me->SetReactState(REACT_DEFENSIVE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); @@ -230,7 +261,7 @@ class boss_professor_putricide : public CreatureScript void JustReachedHome() { _JustReachedHome(); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); if (events.GetPhaseMask() & PHASE_MASK_COMBAT) instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, FAIL); } @@ -477,8 +508,7 @@ class boss_professor_putricide : public CreatureScript SetPhase(PHASE_COMBAT_3); events.ScheduleEvent(EVENT_MUTATED_PLAGUE, 25000); events.CancelEvent(EVENT_UNSTABLE_EXPERIMENT); - summons.DespawnEntry(NPC_MUTATED_ABOMINATION_10); - summons.DespawnEntry(NPC_MUTATED_ABOMINATION_25); + summons.remove_if(AbominationDespawner(me)); break; default: break; @@ -514,7 +544,7 @@ class boss_professor_putricide : public CreatureScript void UpdateAI(uint32 const diff) { - if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_MASK_NOT_SELF)) || !CheckInRoom()) + if ((!(events.GetPhaseMask() & PHASE_MASK_NOT_SELF) && !UpdateVictim()) || !CheckInRoom()) return; events.Update(diff); @@ -569,13 +599,15 @@ class boss_professor_putricide : public CreatureScript break; case EVENT_TEAR_GAS: me->GetMotionMaster()->MovePoint(POINT_TABLE, tablePos); + DoCast(me, SPELL_TEAR_GAS_PERIODIC_TRIGGER, true); break; case EVENT_RESUME_ATTACK: me->SetReactState(REACT_DEFENSIVE); AttackStart(me->getVictim()); // remove Tear Gas + me->RemoveAurasDueToSpell(SPELL_TEAR_GAS_PERIODIC_TRIGGER); instance->DoRemoveAurasDueToSpellOnPlayers(71615); - instance->DoRemoveAurasDueToSpellOnPlayers(71618); + DoCastAOE(SPELL_TEAR_GAS_CANCEL); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); break; @@ -673,27 +705,36 @@ class npc_volatile_ooze : public CreatureScript public: npc_volatile_ooze() : CreatureScript("npc_volatile_ooze") { } - struct npc_volatile_oozeAI : public ScriptedAI + struct npc_putricide_oozeAI : public ScriptedAI { - npc_volatile_oozeAI(Creature* creature) : ScriptedAI(creature) + npc_putricide_oozeAI(Creature* creature) : ScriptedAI(creature) { _newTargetSelectTimer = 0; } void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) { - if (!_newTargetSelectTimer && sSpellMgr->GetSpellDifficultyId(spell->Id) == sSpellMgr->GetSpellDifficultyId(SPELL_OOZE_ERUPTION)) + if (!_newTargetSelectTimer && spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_OOZE_ERUPTION, me)) + _newTargetSelectTimer = 1000; + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_TEAR_GAS_CREATURE) _newTargetSelectTimer = 1000; } void UpdateAI(uint32 const diff) { - if (!UpdateVictim()) + if (!UpdateVictim() && !_newTargetSelectTimer) return; if (!_newTargetSelectTimer) return; + if (me->HasAura(SPELL_TEAR_GAS_CREATURE)) + return; + if (_newTargetSelectTimer <= diff) { _newTargetSelectTimer = 0; @@ -704,13 +745,68 @@ class npc_volatile_ooze : public CreatureScript } private: - // no need to use EventMap for just one event uint32 _newTargetSelectTimer; }; CreatureAI* GetAI(Creature* creature) const { - return GetIcecrownCitadelAI(creature); + return GetIcecrownCitadelAI(creature); + } +}; + +class npc_gas_cloud : public CreatureScript +{ + public: + npc_gas_cloud() : CreatureScript("npc_gas_cloud") { } + + struct npc_gas_cloudAI : public ScriptedAI + { + npc_gas_cloudAI(Creature* creature) : ScriptedAI(creature) + { + _newTargetSelectTimer = 0; + } + + void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) + { + if (!_newTargetSelectTimer && spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_EXPUNGED_GAS, me)) + _newTargetSelectTimer = 1000; + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_TEAR_GAS_CREATURE) + _newTargetSelectTimer = 1000; + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim() && !_newTargetSelectTimer) + return; + + DoMeleeAttackIfReady(); + + if (!_newTargetSelectTimer) + return; + + if (me->HasAura(SPELL_TEAR_GAS_CREATURE)) + return; + + if (_newTargetSelectTimer <= diff) + { + _newTargetSelectTimer = 0; + me->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, me, false); + } + else + _newTargetSelectTimer -= diff; + } + + private: + uint32 _newTargetSelectTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); } }; @@ -729,8 +825,8 @@ class spell_putricide_gaseous_bloat : public SpellScriptLoader if (Unit* caster = GetCaster()) { target->RemoveAuraFromStack(GetSpellInfo()->Id, GetCasterGUID()); - if (!target->HasAura(GetId())&& caster->GetTypeId() == TYPEID_UNIT) - caster->ToCreature()->DespawnOrUnsummon(); + if (!target->HasAura(GetId())) + caster->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, caster, false); } } @@ -781,7 +877,7 @@ class spell_putricide_ooze_channel : public SpellScriptLoader return; } - Unit* target = SelectRandomContainerElement(targetList); + Unit* target = Trinity::Containers::SelectRandomContainerElement(targetList); targetList.clear(); targetList.push_back(target); _target = target; @@ -797,7 +893,19 @@ class spell_putricide_ooze_channel : public SpellScriptLoader void StartAttack() { GetCaster()->ClearUnitState(UNIT_STATE_CASTING); + GetCaster()->DeleteThreatList(); GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); + GetCaster()->AddThreat(GetHitUnit(), 500000000.0f); // value seen in sniff + } + + // temporary, until SelectTarget are not called on empty lists + void CheckTarget() + { + if (_target) + return; + + FinishCast(SPELL_FAILED_NO_VALID_TARGETS); + GetCaster()->ToCreature()->DespawnOrUnsummon(1); // despawn next update } void Register() @@ -806,6 +914,7 @@ class spell_putricide_ooze_channel : public SpellScriptLoader OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); AfterHit += SpellHitFn(spell_putricide_ooze_channel_SpellScript::StartAttack); + OnCast += SpellCastFn(spell_putricide_ooze_channel_SpellScript::CheckTarget); } Unit* _target; @@ -905,13 +1014,13 @@ class spell_putricide_unstable_experiment : public SpellScriptLoader uint32 stage = GetCaster()->ToCreature()->AI()->GetData(DATA_EXPERIMENT_STAGE); Creature* target = NULL; std::list creList; - GetCreatureListWithEntryInGrid(creList, GetCaster(), NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 100.0f); + GetCreatureListWithEntryInGrid(creList, GetCaster(), NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 200.0f); // 2 of them are spawned at green place - weird trick blizz for (std::list::iterator itr = creList.begin(); itr != creList.end(); ++itr) { target = *itr; std::list tmp; - GetCreatureListWithEntryInGrid(tmp, target, NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 1.0f); + GetCreatureListWithEntryInGrid(tmp, target, NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 10.0f); if ((!stage && tmp.size() > 1) || (stage && tmp.size() == 1)) break; } @@ -931,42 +1040,6 @@ class spell_putricide_unstable_experiment : public SpellScriptLoader } }; -class spell_putricide_ooze_summon : public SpellScriptLoader -{ - public: - spell_putricide_ooze_summon() : SpellScriptLoader("spell_putricide_ooze_summon") { } - - class spell_putricide_ooze_summon_AuraScript : public AuraScript - { - PrepareAuraScript(spell_putricide_ooze_summon_AuraScript); - - void HandleTriggerSpell(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - { - uint32 triggerSpellId = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - float x, y, z; - GetTarget()->GetPosition(x, y, z); - z = GetTarget()->GetMap()->GetHeight(GetTarget()->GetPhaseMask(), x, y, z, true, 25.0f); - x += 10.0f * cosf(caster->GetOrientation()); - y += 10.0f * sinf(caster->GetOrientation()); - caster->CastSpell(x, y, z, triggerSpellId, true, NULL, NULL, GetCasterGUID()); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_ooze_summon_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_putricide_ooze_summon_AuraScript(); - } -}; - class spell_putricide_ooze_eruption_searcher : public SpellScriptLoader { public: @@ -1207,11 +1280,11 @@ class spell_putricide_mutation_init : public SpellScriptLoader SpellCastResult CheckRequirementInternal(SpellCustomErrors& extendedError) { - InstanceScript* instance = GetTargetUnit()->GetInstanceScript(); + InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript(); if (!instance) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - Creature* professor = ObjectAccessor::GetCreature(*GetTargetUnit(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); + Creature* professor = ObjectAccessor::GetCreature(*GetExplTargetUnit(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); if (!professor) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; @@ -1232,17 +1305,17 @@ class spell_putricide_mutation_init : public SpellScriptLoader SpellCastResult CheckRequirement() { - if (!GetTargetUnit()) + if (!GetExplTargetUnit()) return SPELL_FAILED_BAD_TARGETS; - if (GetTargetUnit()->GetTypeId() != TYPEID_PLAYER) + if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_TARGET_NOT_PLAYER; SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; SpellCastResult result = CheckRequirementInternal(extension); if (result != SPELL_CAST_OK) { - Spell::SendCastResult(GetTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); + Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); return result; } @@ -1429,14 +1502,15 @@ class spell_putricide_regurgitated_ooze : public SpellScriptLoader } }; -class spell_putricide_clear_mutated_plague : public SpellScriptLoader +// Removes aura with id stored in effect value +class spell_putricide_clear_aura_effect_value : public SpellScriptLoader { public: - spell_putricide_clear_mutated_plague() : SpellScriptLoader("spell_putricide_clear_mutated_plague") { } + spell_putricide_clear_aura_effect_value() : SpellScriptLoader("spell_putricide_clear_aura_effect_value") { } - class spell_putricide_clear_mutated_plague_SpellScript : public SpellScript + class spell_putricide_clear_aura_effect_value_SpellScript : public SpellScript { - PrepareSpellScript(spell_putricide_clear_mutated_plague_SpellScript); + PrepareSpellScript(spell_putricide_clear_aura_effect_value_SpellScript); void HandleScript(SpellEffIndex effIndex) { @@ -1447,13 +1521,13 @@ class spell_putricide_clear_mutated_plague : public SpellScriptLoader void Register() { - OnEffectHitTarget += SpellEffectFn(spell_putricide_clear_mutated_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_putricide_clear_aura_effect_value_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const { - return new spell_putricide_clear_mutated_plague_SpellScript(); + return new spell_putricide_clear_aura_effect_value_SpellScript(); } }; @@ -1492,12 +1566,12 @@ void AddSC_boss_professor_putricide() { new boss_professor_putricide(); new npc_volatile_ooze(); + new npc_gas_cloud(); new spell_putricide_gaseous_bloat(); new spell_putricide_ooze_channel(); new spell_putricide_slime_puddle(); new spell_putricide_slime_puddle_aura(); new spell_putricide_unstable_experiment(); - new spell_putricide_ooze_summon(); new spell_putricide_ooze_eruption_searcher(); new spell_putricide_choking_gas_bomb(); new spell_putricide_unbound_plague(); @@ -1508,6 +1582,6 @@ void AddSC_boss_professor_putricide() new spell_putricide_mutated_transformation(); new spell_putricide_mutated_transformation_dmg(); new spell_putricide_regurgitated_ooze(); - new spell_putricide_clear_mutated_plague(); + new spell_putricide_clear_aura_effect_value(); new spell_stinky_precious_decimate(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 9649b6c8ef8..a4ab13f6ada 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -441,6 +441,10 @@ class spell_rotface_ooze_flood : public SpellScriptLoader std::list triggers; GetHitUnit()->GetCreatureListWithEntryInGrid(triggers, GetHitUnit()->GetEntry(), 12.5f); + + if (triggers.empty()) + return; + triggers.sort(Trinity::ObjectDistanceOrderPred(GetHitUnit())); GetHitUnit()->CastSpell(triggers.back(), uint32(GetEffectValue()), false, NULL, NULL, GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : 0); } @@ -494,7 +498,7 @@ class spell_rotface_mutated_infection : public SpellScriptLoader if (targets.empty()) return; - Unit* target = SelectRandomContainerElement(targets); + Unit* target = Trinity::Containers::SelectRandomContainerElement(targets); targets.clear(); targets.push_back(target); _target = target; @@ -712,13 +716,13 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader void CheckTarget(SpellEffIndex effIndex) { PreventHitDefaultEffect(EFFECT_0); - if (!GetTargetDest()) + if (!GetExplTargetDest()) return; uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; float x, y, z; - GetTargetDest()->GetPosition(x, y, z); + GetExplTargetDest()->GetPosition(x, y, z); // let Rotface handle the cast - caster dies before this executes if (InstanceScript* script = GetCaster()->GetInstanceScript()) if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE))) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 1d9c3c14897..6039ace44ab 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -61,6 +61,7 @@ enum Spells SPELL_ASPHYXIATION = 71665, SPELL_FROST_BOMB_TRIGGER = 69846, SPELL_FROST_BOMB_VISUAL = 70022, + SPELL_BIRTH_NO_VISUAL = 40031, SPELL_FROST_BOMB = 69845, SPELL_MYSTIC_BUFFET = 70128, @@ -98,6 +99,8 @@ enum Events EVENT_LAND = 12, EVENT_AIR_MOVEMENT = 21, EVENT_THIRD_PHASE_CHECK = 22, + EVENT_AIR_MOVEMENT_FAR = 23, + EVENT_LAND_GROUND = 24, // Spinestalker EVENT_BELLOWING_ROAR = 13, @@ -133,6 +136,8 @@ enum MovementPoints POINT_AIR_PHASE = 3, POINT_TAKEOFF = 4, POINT_LAND = 5, + POINT_AIR_PHASE_FAR = 6, + POINT_LAND_GROUND = 7, }; enum Shadowmourne @@ -152,6 +157,8 @@ Position const SindragosaSpawnPos = {4818.700f, 2483.710f, 287.0650f, 3.089233f Position const SindragosaFlyPos = {4475.190f, 2484.570f, 234.8510f, 3.141593f}; Position const SindragosaLandPos = {4419.190f, 2484.570f, 203.3848f, 3.141593f}; Position const SindragosaAirPos = {4475.990f, 2484.430f, 247.9340f, 3.141593f}; +Position const SindragosaAirPosFar = {4525.600f, 2485.150f, 245.0820f, 3.141593f}; +Position const SindragosaFlyInPos = {4419.190f, 2484.360f, 232.5150f, 3.141593f}; class FrostwyrmLandEvent : public BasicEvent { @@ -169,6 +176,23 @@ class FrostwyrmLandEvent : public BasicEvent Position const& _dest; }; +class FrostBombExplosion : public BasicEvent +{ + public: + FrostBombExplosion(Creature* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { } + + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + _owner->CastSpell((Unit*)NULL, SPELL_FROST_BOMB, true, NULL, NULL, _sindragosaGUID); + _owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL); + return true; + } + + private: + Creature* _owner; + uint64 _sindragosaGUID; +}; + class boss_sindragosa : public CreatureScript { public: @@ -198,8 +222,8 @@ class boss_sindragosa : public CreatureScript if (instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) != 255) { - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(true); + me->SetDisableGravity(true); } } @@ -228,8 +252,8 @@ class boss_sindragosa : public CreatureScript { BossAI::JustReachedHome(); instance->SetBossState(DATA_SINDRAGOSA, FAIL); - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(false); + me->SetDisableGravity(false); } void KilledUnit(Unit* victim) @@ -250,6 +274,9 @@ class boss_sindragosa : public CreatureScript return; me->setActive(true); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetSpeed(MOVE_FLIGHT, 4.0f); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); float moveTime = me->GetExactDist(&SindragosaFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f); @@ -275,11 +302,12 @@ class boss_sindragosa : public CreatureScript { case POINT_FROSTWYRM_LAND: me->setActive(false); - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetHomePosition(SindragosaLandPos); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetSpeed(MOVE_FLIGHT, 2.0f); + me->SetSpeed(MOVE_FLIGHT, 2.5f); // Sindragosa enters combat as soon as she lands DoZoneInCombat(); @@ -289,19 +317,31 @@ class boss_sindragosa : public CreatureScript break; case POINT_AIR_PHASE: me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 6), NULL); - events.ScheduleEvent(EVENT_FROST_BOMB, 8000); + me->SetFacingTo(float(M_PI)); + events.ScheduleEvent(EVENT_AIR_MOVEMENT_FAR, 1); + events.ScheduleEvent(EVENT_FROST_BOMB, 9000); + break; + case POINT_AIR_PHASE_FAR: + me->SetFacingTo(float(M_PI)); + events.ScheduleEvent(EVENT_LAND, 30000); break; case POINT_LAND: - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + events.ScheduleEvent(EVENT_LAND_GROUND, 1); + break; + case POINT_LAND_GROUND: + { + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetReactState(REACT_DEFENSIVE); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); - DoStartMovement(me->getVictim()); _isInAirPhase = false; // trigger Asphyxiation - summons.DoAction(NPC_ICE_TOMB, ACTION_TRIGGER_ASPHYXIATION); + EntryCheckPredicate pred(NPC_ICE_TOMB); + summons.DoAction(ACTION_TRIGGER_ASPHYXIATION, pred); break; + } default: break; } @@ -320,6 +360,12 @@ class boss_sindragosa : public CreatureScript void JustSummoned(Creature* summon) { summons.Summon(summon); + if (summon->GetEntry() == NPC_FROST_BOMB) + { + summon->CastSpell(summon, SPELL_FROST_BOMB_VISUAL, true); + summon->CastSpell(summon, SPELL_BIRTH_NO_VISUAL, true); + summon->m_Events.AddEvent(new FrostBombExplosion(summon, me->GetGUID()), summon->m_Events.CalculateTime(5500)); + } } void SummonedCreatureDespawn(Creature* summon) @@ -332,18 +378,25 @@ class boss_sindragosa : public CreatureScript void SpellHitTarget(Unit* target, SpellInfo const* spell) { if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me)) + { if (spellId == spell->Id) + { if (Aura const* mysticBuffet = target->GetAura(spell->Id)) _mysticBuffetStack = std::max(_mysticBuffetStack, mysticBuffet->GetStackAmount()); + return; + } + } + // Frost Infusion if (Player* player = target->ToPlayer()) { if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, me)) { - if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && spellId == spell->Id) + if (spellId == spell->Id) { - if (Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true)) + Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true); + if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && shadowsEdge) { if (!player->HasAura(SPELL_FROST_IMBUED_BLADE) && shadowsEdge->GetEntry() == ITEM_SHADOW_S_EDGE) { @@ -361,15 +414,11 @@ class boss_sindragosa : public CreatureScript player->CastSpell(player, SPELL_FROST_INFUSION, true); } } + + return; } } } - - if (spell->Id == SPELL_FROST_BOMB_TRIGGER) - { - target->CastSpell(target, SPELL_FROST_BOMB, true); - target->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL); - } } void UpdateAI(uint32 const diff) @@ -410,7 +459,6 @@ class boss_sindragosa : public CreatureScript break; case EVENT_ICY_GRIP: DoCast(me, SPELL_ICY_GRIP); - events.ScheduleEvent(EVENT_ICY_GRIP, urand(70000, 75000), EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_BLISTERING_COLD, 1000, EVENT_GROUP_LAND_PHASE); break; case EVENT_BLISTERING_COLD: @@ -425,22 +473,25 @@ class boss_sindragosa : public CreatureScript { _isInAirPhase = true; Talk(SAY_AIR_PHASE); - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetReactState(REACT_PASSIVE); + me->AttackStop(); Position pos; pos.Relocate(me); pos.m_positionZ += 17.0f; me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, pos, 8.30078125f); - events.DelayEvents(45000, EVENT_GROUP_LAND_PHASE); + events.CancelEventGroup(EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_AIR_PHASE, 110000); - events.RescheduleEvent(EVENT_UNCHAINED_MAGIC, urand(55000, 60000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_LAND, 45000); break; } case EVENT_AIR_MOVEMENT: me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos); break; + case EVENT_AIR_MOVEMENT_FAR: + me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar); + break; case EVENT_ICE_TOMB: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_ICE_TOMB_UNTARGETABLE)) { @@ -452,30 +503,28 @@ class boss_sindragosa : public CreatureScript case EVENT_FROST_BOMB: { float destX, destY, destZ; - destX = float(rand_norm()) * 117.25f + 4339.25f; - if (destX > 4371.5f && destX < 4432.0f) - destY = float(rand_norm()) * 111.0f + 2429.0f; - else - destY = float(rand_norm()) * 31.23f + 2454.64f; + destX = float(rand_norm()) * 75.0f + 4350.0f; + destY = float(rand_norm()) * 75.0f + 2450.0f; destZ = 205.0f; // random number close to ground, get exact in next call me->UpdateGroundPositionZ(destX, destY, destZ); - Position pos; - pos.Relocate(destX, destY, destZ, 0.0f); - if (TempSummon* summ = me->SummonCreature(NPC_FROST_BOMB, pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) - { - summ->CastSpell(summ, SPELL_FROST_BOMB_VISUAL, true); - DoCast(summ, SPELL_FROST_BOMB_TRIGGER); - //me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false); - } - events.ScheduleEvent(EVENT_FROST_BOMB, urand(5000, 10000)); + me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false); + events.ScheduleEvent(EVENT_FROST_BOMB, urand(6000, 8000)); break; } case EVENT_LAND: { events.CancelEvent(EVENT_FROST_BOMB); - me->GetMotionMaster()->MovePoint(POINT_LAND, SindragosaLandPos); + me->GetMotionMaster()->MovePoint(POINT_LAND, SindragosaFlyInPos); break; } + case EVENT_LAND_GROUND: + events.ScheduleEvent(EVENT_CLEAVE, urand(13000, 15000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_TAIL_SMASH, urand(19000, 23000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_FROST_BREATH, urand(10000, 15000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(12000, 17000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000), EVENT_GROUP_LAND_PHASE); + me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, SindragosaLandPos, 0.0f); + break; case EVENT_THIRD_PHASE_CHECK: { if (!_isInAirPhase) @@ -617,8 +666,8 @@ class npc_spinestalker : public CreatureScript if (_instance->GetData(DATA_SPINESTALKER) != 255) { - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(true); + me->SetDisableGravity(true); } } @@ -660,9 +709,11 @@ class npc_spinestalker : public CreatureScript return; me->setActive(false); - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetHomePosition(SpinestalkerLandPos); + me->SetFacingTo(SpinestalkerLandPos.GetOrientation()); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -742,8 +793,8 @@ class npc_rimefang : public CreatureScript if (_instance->GetData(DATA_RIMEFANG) != 255) { - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(true); + me->SetDisableGravity(true); } } @@ -785,9 +836,11 @@ class npc_rimefang : public CreatureScript return; me->setActive(false); - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetHomePosition(RimefangLandPos); + me->SetFacingTo(RimefangLandPos.GetOrientation()); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } @@ -819,7 +872,7 @@ class npc_rimefang : public CreatureScript _icyBlastCounter = RAID_MODE(5, 7, 6, 8); me->SetReactState(REACT_PASSIVE); me->AttackStop(); - me->SetFlying(true); + me->SetCanFly(true); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos); float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f); _events.ScheduleEvent(EVENT_ICY_BLAST, uint64(moveTime) + urand(60000, 70000)); @@ -840,7 +893,7 @@ class npc_rimefang : public CreatureScript { me->SetReactState(REACT_DEFENSIVE); AttackStart(victim); - me->SetFlying(false); + me->SetCanFly(false); } break; default: @@ -1046,10 +1099,10 @@ class spell_sindragosa_unchained_magic : public SpellScriptLoader void FilterTargets(std::list& unitList) { - unitList.remove_if (UnchainedMagicTargetSelector()); - uint32 maxSize = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 5 : 2); + unitList.remove_if(UnchainedMagicTargetSelector()); + uint32 maxSize = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 6 : 2); if (unitList.size() > maxSize) - Trinity::RandomResizeList(unitList, maxSize); + Trinity::Containers::RandomResizeList(unitList, maxSize); } void Register() @@ -1198,94 +1251,77 @@ class spell_sindragosa_ice_tomb : public SpellScriptLoader } }; -class FrostBombTargetSelector -{ - public: - FrostBombTargetSelector(Unit* caster, std::list const& collisionList) : _caster(caster), _collisionList(collisionList) { } - - bool operator()(Unit* unit) - { - if (unit->HasAura(SPELL_ICE_TOMB_DAMAGE)) - return true; - - for (std::list::const_iterator itr = _collisionList.begin(); itr != _collisionList.end(); ++itr) - if ((*itr)->IsInBetween(_caster, unit)) - return true; - - return false; - } - - private: - Unit* _caster; - std::list const& _collisionList; -}; - -class spell_sindragosa_collision_filter : public SpellScriptLoader +class spell_sindragosa_icy_grip : public SpellScriptLoader { public: - spell_sindragosa_collision_filter() : SpellScriptLoader("spell_sindragosa_collision_filter") { } + spell_sindragosa_icy_grip() : SpellScriptLoader("spell_sindragosa_icy_grip") { } - class spell_sindragosa_collision_filter_SpellScript : public SpellScript + class spell_sindragosa_icy_grip_SpellScript : public SpellScript { - PrepareSpellScript(spell_sindragosa_collision_filter_SpellScript); + PrepareSpellScript(spell_sindragosa_icy_grip_SpellScript); bool Validate(SpellInfo const* /*spell*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_ICE_TOMB_DAMAGE)) + if (!sSpellMgr->GetSpellInfo(SPELL_ICY_GRIP_JUMP)) return false; return true; } - void FilterTargets(std::list& unitList) + void HandleScript(SpellEffIndex effIndex) { - std::list tombs; - GetCreatureListWithEntryInGrid(tombs, GetCaster(), NPC_ICE_TOMB, 200.0f); - unitList.remove_if (FrostBombTargetSelector(GetCaster(), tombs)); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetCaster(), SPELL_ICY_GRIP_JUMP, true); } void Register() { - OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_collision_filter_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_sindragosa_icy_grip_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const { - return new spell_sindragosa_collision_filter_SpellScript(); + return new spell_sindragosa_icy_grip_SpellScript(); } }; -class spell_sindragosa_icy_grip : public SpellScriptLoader +class MysticBuffetTargetFilter { public: - spell_sindragosa_icy_grip() : SpellScriptLoader("spell_sindragosa_icy_grip") { } + explicit MysticBuffetTargetFilter(Unit* caster) : _caster(caster) { } - class spell_sindragosa_icy_grip_SpellScript : public SpellScript + bool operator()(Unit* unit) { - PrepareSpellScript(spell_sindragosa_icy_grip_SpellScript); + return !unit->IsWithinLOSInMap(_caster); + } - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ICY_GRIP_JUMP)) - return false; - return true; - } + private: + Unit* _caster; +}; - void HandleScript(SpellEffIndex effIndex) +class spell_sindragosa_mystic_buffet : public SpellScriptLoader +{ + public: + spell_sindragosa_mystic_buffet() : SpellScriptLoader("spell_sindragosa_mystic_buffet") { } + + class spell_sindragosa_mystic_buffet_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_mystic_buffet_SpellScript); + + void FilterTargets(std::list& unitList) { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetCaster(), SPELL_ICY_GRIP_JUMP, true); + unitList.remove_if(MysticBuffetTargetFilter(GetCaster())); } void Register() { - OnEffectHitTarget += SpellEffectFn(spell_sindragosa_icy_grip_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_mystic_buffet_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; SpellScript* GetSpellScript() const { - return new spell_sindragosa_icy_grip_SpellScript(); + return new spell_sindragosa_mystic_buffet_SpellScript(); } }; @@ -1308,7 +1344,7 @@ class spell_rimefang_icy_blast : public SpellScriptLoader void HandleTriggerMissile(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - if (Position const* pos = GetTargetDest()) + if (Position const* pos = GetExplTargetDest()) if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true); } @@ -1370,7 +1406,7 @@ class spell_frostwarden_handler_order_whelp : public SpellScriptLoader if (unitList.empty()) return; - Unit* target = SelectRandomContainerElement(unitList); + Unit* target = Trinity::Containers::SelectRandomContainerElement(unitList); unitList.clear(); unitList.push_back(target); } @@ -1387,7 +1423,7 @@ class spell_frostwarden_handler_order_whelp : public SpellScriptLoader if (unitList.empty()) return; - SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + Trinity::Containers::SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); } void Register() @@ -1513,8 +1549,8 @@ void AddSC_boss_sindragosa() new spell_sindragosa_instability(); new spell_sindragosa_frost_beacon(); new spell_sindragosa_ice_tomb(); - new spell_sindragosa_collision_filter(); new spell_sindragosa_icy_grip(); + new spell_sindragosa_mystic_buffet(); new spell_rimefang_icy_blast(); new spell_frostwarden_handler_order_whelp(); new spell_frostwarden_handler_focus_fire(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index fbed870eb19..4dab215d1da 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -26,6 +26,7 @@ #include "CellImpl.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" +#include "CreatureTextMgr.h" #include "icecrown_citadel.h" enum Texts @@ -499,8 +500,8 @@ class boss_the_lich_king : public CreatureScript { _JustDied(); DoCastAOE(SPELL_PLAY_MOVIE, false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->GetMotionMaster()->MoveFall(); } @@ -553,7 +554,8 @@ class boss_the_lich_king : public CreatureScript if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) tirion->AI()->EnterEvadeMode(); DoCastAOE(SPELL_KILL_FROSTMOURNE_PLAYERS); - summons.DoAction(NPC_STRANGULATE_VEHICLE, ACTION_TELEPORT_BACK); + EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); + summons.DoAction(ACTION_TELEPORT_BACK, pred); } void KilledUnit(Unit* victim) @@ -584,8 +586,8 @@ class boss_the_lich_king : public CreatureScript SendLightOverride(0, 5000); break; case ACTION_BREAK_FROSTMOURNE: - DoCastAOE(SPELL_SUMMON_BROKEN_FROSTMOURNE); - DoCastAOE(SPELL_SUMMON_BROKEN_FROSTMOURNE_2); + me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE, TRIGGERED_IGNORE_CAST_IN_PROGRESS); + me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE_2, TRIGGERED_IGNORE_CAST_IN_PROGRESS); SetEquipmentSlots(false, EQUIP_BROKEN_FROSTMOURNE); events.ScheduleEvent(EVENT_OUTRO_TALK_6, 2500, 0, PHASE_OUTRO); break; @@ -594,12 +596,15 @@ class boss_the_lich_king : public CreatureScript events.ScheduleEvent(EVENT_OUTRO_TALK_8, 17000, 0, PHASE_OUTRO); break; case ACTION_TELEPORT_BACK: - summons.DoAction(NPC_STRANGULATE_VEHICLE, ACTION_TELEPORT_BACK); + { + EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); + summons.DoAction(ACTION_TELEPORT_BACK, pred); if (!IsHeroic()) Talk(SAY_LK_FROSTMOURNE_ESCAPE); else DoCastAOE(SPELL_TRIGGER_VILE_SPIRIT_HEROIC); break; + } default: break; } @@ -660,7 +665,7 @@ class boss_the_lich_king : public CreatureScript summons.DespawnAll(); SendMusicToPlayers(MUSIC_FURY_OF_FROSTMOURNE); DoCastAOE(SPELL_FURY_OF_FROSTMOURNE); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); events.ScheduleEvent(EVENT_OUTRO_TALK_1, 2600, 0, PHASE_OUTRO); events.ScheduleEvent(EVENT_OUTRO_EMOTE_TALK, 6600, 0, PHASE_OUTRO); events.ScheduleEvent(EVENT_OUTRO_EMOTE_TALK, 17600, 0, PHASE_OUTRO); @@ -864,7 +869,7 @@ class boss_the_lich_king : public CreatureScript case EVENT_INTRO_MOVE_1: me->SetSheath(SHEATH_STATE_MELEE); me->RemoveAurasDueToSpell(SPELL_EMOTE_SIT_NO_SHEATH); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_LK_INTRO_1, LichKingIntro[0]); break; case EVENT_INTRO_MOVE_2: @@ -894,7 +899,7 @@ class boss_the_lich_king : public CreatureScript events.ScheduleEvent(EVENT_FINISH_INTRO, 1000, 0, PHASE_INTRO); break; case EVENT_FINISH_INTRO: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->SetReactState(REACT_AGGRESSIVE); events.SetPhase(PHASE_ONE); @@ -1064,16 +1069,15 @@ class boss_the_lich_king : public CreatureScript Talk(SAY_LK_OUTRO_6); if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) tirion->SetFacingToObject(me); - me->ClearUnitState(UNIT_STATE_CASTING); - DoCastAOE(SPELL_SUMMON_BROKEN_FROSTMOURNE_3); + me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE_3, TRIGGERED_IGNORE_CAST_IN_PROGRESS); SetEquipmentSlots(false, EQUIP_UNEQUIP); break; case EVENT_OUTRO_SOUL_BARRAGE: - DoCastAOE(SPELL_SOUL_BARRAGE); + me->CastSpell((Unit*)NULL, SPELL_SOUL_BARRAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS); sCreatureTextMgr->SendSound(me, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_OTHER, false); // set flight - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->GetMotionMaster()->MovePoint(POINT_LK_OUTRO_2, OutroFlying); break; case EVENT_OUTRO_TALK_7: @@ -1222,11 +1226,11 @@ class npc_tirion_fordring_tft : public CreatureScript void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) { - if (me->GetCreatureInfo()->GossipMenuId == sender && !action) + if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) { _events.SetPhase(PHASE_INTRO); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro); } } @@ -1264,7 +1268,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); break; case EVENT_INTRO_CHARGE: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->GetMotionMaster()->MovePoint(POINT_TIRION_CHARGE, TirionCharge); break; case EVENT_OUTRO_TALK_1: @@ -2466,7 +2470,7 @@ class spell_the_lich_king_summon_into_air : public SpellScriptLoader void ModDestHeight(SpellEffIndex effIndex) { static Position const offset = {0.0f, 0.0f, 15.0f, 0.0f}; - WorldLocation* dest = const_cast(GetTargetDest()); + WorldLocation* dest = const_cast(GetExplTargetDest()); dest->RelocateOffset(offset); // spirit bombs get higher if (GetSpellInfo()->Effects[effIndex].MiscValue == NPC_SPIRIT_BOMB) @@ -2550,7 +2554,7 @@ class spell_the_lich_king_valkyr_target_search : public SpellScriptLoader if (unitList.empty()) return; - _target = SelectRandomContainerElement(unitList); + _target = Trinity::Containers::SelectRandomContainerElement(unitList); unitList.clear(); unitList.push_back(_target); GetCaster()->GetAI()->SetGUID(_target->GetGUID()); @@ -2723,7 +2727,7 @@ class spell_the_lich_king_vile_spirits_visual : public SpellScriptLoader void ModDestHeight(SpellEffIndex /*effIndex*/) { Position offset = {0.0f, 0.0f, 15.0f, 0.0f}; - const_cast(GetTargetDest())->RelocateOffset(offset); + const_cast(GetExplTargetDest())->RelocateOffset(offset); } void Register() @@ -2758,7 +2762,7 @@ class spell_the_lich_king_vile_spirit_move_target_search : public SpellScriptLoa if (targets.empty()) return; - _target = SelectRandomContainerElement(targets); + _target = Trinity::Containers::SelectRandomContainerElement(targets); } void HandleScript(SpellEffIndex effIndex) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index e0993178890..c40a521c794 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -232,7 +232,7 @@ class ValithriaDespawner : public BasicEvent { case NPC_VALITHRIA_DREAMWALKER: if (InstanceScript* instance = creature->GetInstanceScript()) - instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, creature); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, creature); break; case NPC_BLAZING_SKELETON: case NPC_SUPPRESSER: @@ -262,7 +262,7 @@ class ValithriaDespawner : public BasicEvent if (CreatureData const* data = creature->GetCreatureData()) creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation); - creature->ForcedDespawn(); + creature->DespawnOrUnsummon(); creature->SetCorpseDelay(corpseDelay); creature->SetRespawnDelay(respawnDelay); @@ -304,7 +304,7 @@ class boss_valithria_dreamwalker : public CreatureScript me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true); // Glyph of Dispel Magic - not a percent heal by effect, its cast with custom basepoints me->ApplySpellImmune(0, IMMUNITY_ID, 56131, true); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); _missedPortals = 0; _under25PercentTalkDone = false; _over75PercentTalkDone = false; @@ -322,21 +322,26 @@ class boss_valithria_dreamwalker : public CreatureScript return; DoCast(me, SPELL_COPY_DAMAGE); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, me); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); _events.ScheduleEvent(EVENT_INTRO_TALK, 15000); _events.ScheduleEvent(EVENT_DREAM_PORTAL, urand(45000, 48000)); if (IsHeroic()) _events.ScheduleEvent(EVENT_BERSERK, 420000); } - void HealReceived(Unit* /*healer*/, uint32& heal) + void HealReceived(Unit* healer, uint32& heal) { + if (!me->hasLootRecipient()) + me->SetLootRecipient(healer); + + me->LowerPlayerDamageReq(heal); + // encounter complete if (me->HealthAbovePctHealed(100, heal) && !_done) { _done = true; Talk(SAY_VALITHRIA_SUCCESS); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA); DoCast(me, SPELL_ACHIEVEMENT_CHECK); DoCastAOE(SPELL_DREAMWALKERS_RAGE); @@ -371,7 +376,7 @@ class boss_valithria_dreamwalker : public CreatureScript { _justDied = true; Talk(SAY_VALITHRIA_DEATH); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) trigger->AI()->DoAction(ACTION_DEATH); } @@ -1082,7 +1087,7 @@ class npc_dream_cloud : public CreatureScript me->GetMotionMaster()->MoveIdle(); // must use originalCaster the same for all clouds to allow stacking me->CastSpell(me, EMERALD_VIGOR, false, NULL, NULL, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER)); - me->ForcedDespawn(100); + me->DespawnOrUnsummon(100); break; default: break; @@ -1191,7 +1196,7 @@ class spell_dreamwalker_summoner : public SpellScriptLoader if (targets.empty()) return; - Unit* target = SelectRandomContainerElement(targets); + Unit* target = Trinity::Containers::SelectRandomContainerElement(targets); targets.clear(); targets.push_back(target); } @@ -1237,7 +1242,7 @@ class spell_dreamwalker_summon_suppresser : public SpellScriptLoader std::list summoners; GetCreatureListWithEntryInGrid(summoners, caster, NPC_WORLD_TRIGGER, 100.0f); summoners.remove_if (Trinity::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); - Trinity::RandomResizeList(summoners, 2); + Trinity::Containers::RandomResizeList(summoners, 2); if (summoners.empty()) return; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 60e85165cd5..fab9a5f0740 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -346,7 +346,7 @@ class FrostwingGauntletRespawner if (CreatureData const* data = creature->GetCreatureData()) creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation); - creature->ForcedDespawn(); + creature->DespawnOrUnsummon(); creature->SetCorpseDelay(corpseDelay); creature->SetRespawnDelay(respawnDelay); @@ -796,7 +796,8 @@ class boss_sister_svalna : public CreatureScript { _JustReachedHome(); me->SetReactState(REACT_PASSIVE); - me->SetFlying(false); + me->SetDisableGravity(false); + me->SetHover(false); } void DoAction(int32 const action) @@ -838,13 +839,14 @@ class boss_sister_svalna : public CreatureScript void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE || id != POINT_LAND) + if (type != EFFECT_MOTION_TYPE || id != POINT_LAND) return; _isEventInProgress = false; me->setActive(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->SetFlying(false); + me->SetDisableGravity(false); + me->SetHover(false); } void SpellHitTarget(Unit* target, SpellInfo const* spell) @@ -1204,7 +1206,7 @@ class npc_crok_scourgebane : public CreatureScript struct npc_argent_captainAI : public ScriptedAI { public: - npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), Instance(creature->GetInstanceScript()), _firstDeath(true) + npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()), _firstDeath(true) { FollowAngle = PET_FOLLOW_ANGLE; FollowDist = PET_FOLLOW_DIST; @@ -1232,7 +1234,7 @@ struct npc_argent_captainAI : public ScriptedAI { if (action == ACTION_START_GAUNTLET) { - if (Creature* crok = ObjectAccessor::GetCreature(*me, Instance->GetData64(DATA_CROK_SCOURGEBANE))) + if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) { me->SetReactState(REACT_DEFENSIVE); FollowAngle = me->GetAngle(crok) + me->GetOrientation(); @@ -1276,7 +1278,7 @@ struct npc_argent_captainAI : public ScriptedAI if (!me->GetVehicle()) { me->GetMotionMaster()->Clear(false); - if (Creature* crok = ObjectAccessor::GetCreature(*me, Instance->GetData64(DATA_CROK_SCOURGEBANE))) + if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE); } @@ -1288,7 +1290,7 @@ struct npc_argent_captainAI : public ScriptedAI if (spell->Id == SPELL_REVIVE_CHAMPION && !IsUndead) { IsUndead = true; - me->setDeathState(JUST_ALIVED); + me->setDeathState(JUST_RESPAWNED); uint32 newEntry = 0; switch (me->GetEntry()) { @@ -1309,14 +1311,14 @@ struct npc_argent_captainAI : public ScriptedAI } Talk(SAY_CAPTAIN_RESURRECTED); - me->UpdateEntry(newEntry, Instance->GetData(DATA_TEAM_IN_INSTANCE), me->GetCreatureData()); + me->UpdateEntry(newEntry, instance->GetData(DATA_TEAM_IN_INSTANCE), me->GetCreatureData()); DoCast(me, SPELL_UNDEATH, true); } } protected: EventMap Events; - InstanceScript* Instance; + InstanceScript* instance; float FollowAngle; float FollowDist; bool IsUndead; @@ -1368,7 +1370,7 @@ class npc_captain_arnath : public CreatureScript case EVENT_ARNATH_PW_SHIELD: { std::list targets = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD); - DoCast(SelectRandomContainerElement(targets), SPELL_POWER_WORD_SHIELD); + DoCast(Trinity::Containers::SelectRandomContainerElement(targets), SPELL_POWER_WORD_SHIELD); Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, urand(15000, 20000)); break; } @@ -1822,7 +1824,7 @@ class spell_frost_giant_death_plague : public SpellScriptLoader unitList.remove_if (DeathPlagueTargetSelector(GetCaster())); if (!unitList.empty()) { - Unit* target = SelectRandomContainerElement(unitList); + Unit* target = Trinity::Containers::SelectRandomContainerElement(unitList); unitList.clear(); unitList.push_back(target); } @@ -1909,7 +1911,7 @@ class spell_svalna_revive_champion : public SpellScriptLoader void RemoveAliveTarget(std::list& unitList) { unitList.remove_if(AliveCheck()); - Trinity::RandomResizeList(unitList, 2); + Trinity::Containers::RandomResizeList(unitList, 2); } void Land(SpellEffIndex /*effIndex*/) @@ -1921,10 +1923,10 @@ class spell_svalna_revive_champion : public SpellScriptLoader Position pos; caster->GetPosition(&pos); caster->GetNearPosition(pos, 5.0f, 0.0f); - pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, 20.0f); - pos.m_positionZ += 0.05f; + //pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f); + //pos.m_positionZ += 0.05f; caster->SetHomePosition(pos); - caster->GetMotionMaster()->MovePoint(POINT_LAND, pos); + caster->GetMotionMaster()->MoveLand(POINT_LAND, pos, caster->GetSpeed(MOVE_FLIGHT)); } void Register() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 085aea139a3..224777c3db7 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -331,6 +331,10 @@ enum GameObjectsIds GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02 = 201381, GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03 = 201382, GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04 = 201383, + GO_CACHE_OF_THE_DREAMWALKER_10N = 201959, + GO_CACHE_OF_THE_DREAMWALKER_25N = 202339, + GO_CACHE_OF_THE_DREAMWALKER_10H = 202338, + GO_CACHE_OF_THE_DREAMWALKER_25H = 202340, // Sindragosa GO_SINDRAGOSA_ENTRANCE_DOOR = 201373, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 98f5c04ba42..cb83efc748f 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -452,6 +452,14 @@ class instance_icecrown_citadel : public InstanceMapScript case GO_DRINK_ME: PutricideTableGUID = go->GetGUID(); break; + case GO_CACHE_OF_THE_DREAMWALKER_10N: + case GO_CACHE_OF_THE_DREAMWALKER_25N: + case GO_CACHE_OF_THE_DREAMWALKER_10H: + case GO_CACHE_OF_THE_DREAMWALKER_25H: + if (Creature* valithria = instance->GetCreature(ValithriaDreamwalkerGUID)) + go->SetLootRecipient(valithria->GetLootRecipient()); + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); + break; case GO_ARTHAS_PLATFORM: // this enables movement at The Frozen Throne, when printed this value is 0.000000f // however, when represented as integer client will accept only this value @@ -638,7 +646,13 @@ class instance_icecrown_citadel : public InstanceMapScript switch (state) { case DONE: - DoRespawnGameObject(DeathbringersCacheGUID, 7*DAY); + if (GameObject* loot = instance->GetGameObject(DeathbringersCacheGUID)) + { + if (Creature* deathbringer = instance->GetCreature(DeathbringerSaurfangGUID)) + loot->SetLootRecipient(deathbringer->GetLootRecipient()); + loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); + } + // no break case NOT_STARTED: if (GameObject* teleporter = instance->GetGameObject(SaurfangTeleportGUID)) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 942cfd7c5a8..1671eab0b32 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -63,7 +63,7 @@ public: struct boss_anubrekhanAI : public BossAI { - boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUBREKHAN) {} + boss_anubrekhanAI(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN) {} bool hasTaunted; @@ -99,7 +99,7 @@ public: DoScriptText(SAY_SLAY, me); } - void JustDied(Unit*) + void JustDied(Unit* /*killer*/) { _JustDied(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 47151ef6d80..17ed6a79c76 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -89,7 +89,7 @@ public: struct boss_four_horsemenAI : public BossAI { - boss_four_horsemenAI(Creature* c) : BossAI(c, BOSS_HORSEMEN) + boss_four_horsemenAI(Creature* creature) : BossAI(creature, BOSS_HORSEMEN) { id = Horsemen(0); for (uint8 i = 0; i < 4; ++i) @@ -113,7 +113,7 @@ public: void Reset() { if (!encounterActionReset) - DoEncounterAction(NULL, false, true, false); + DoEncounteraction(NULL, false, true, false); if (instance) instance->SetData(DATA_HORSEMEN0 + id, NOT_STARTED); @@ -131,15 +131,15 @@ public: _Reset(); } - bool DoEncounterAction(Unit* who, bool attack, bool reset, bool checkAllDead) + bool DoEncounteraction(Unit* who, bool attack, bool reset, bool checkAllDead) { if (!instance) return false; - Creature* Thane = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_THANE))); - Creature* Lady = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_LADY))); - Creature* Baron = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_BARON))); - Creature* Sir = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_SIR))); + Creature* Thane = Unit::GetCreature(*me, instance->GetData64(DATA_THANE)); + Creature* Lady = Unit::GetCreature(*me, instance->GetData64(DATA_LADY)); + Creature* Baron = Unit::GetCreature(*me, instance->GetData64(DATA_BARON)); + Creature* Sir = Unit::GetCreature(*me, instance->GetData64(DATA_SIR)); if (Thane && Lady && Baron && Sir) { @@ -194,7 +194,7 @@ public: { movementStarted = true; me->SetReactState(REACT_PASSIVE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN), true); switch (id) @@ -272,7 +272,7 @@ public: BeginFourHorsemenMovement(); if (!encounterActionAttack) - DoEncounterAction(who, true, false, false); + DoEncounteraction(who, true, false, false); } else if (movementCompleted && movementStarted) { @@ -302,7 +302,7 @@ public: if (instance) instance->SetData(DATA_HORSEMEN0 + id, DONE); - if (instance && DoEncounterAction(NULL, false, false, true)) + if (instance && DoEncounteraction(NULL, false, false, true)) { instance->SetBossState(BOSS_HORSEMEN, DONE); instance->SaveToDB(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index 0ef4e3d74c2..47dfaa7f772 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -57,7 +57,7 @@ public: struct boss_gluthAI : public BossAI { - boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH) + boss_gluthAI(Creature* creature) : BossAI(creature, BOSS_GLUTH) { // Do not let Gluth be affected by zombies' debuff me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_INFECTED_WOUND, true); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 8c6afba18fd..8d23de5427c 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -234,7 +234,7 @@ class boss_gothik : public CreatureScript DoScriptText(SAY_KILL, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { LiveTriggerGUID.clear(); DeadTriggerGUID.clear(); @@ -424,7 +424,8 @@ class boss_gothik : public CreatureScript { if (instance) instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); - summons.DoAction(0, 0); + DummyEntryCheckPredicate pred; + summons.DoAction(0, pred); //! Magic numbers fail summons.DoZoneInCombat(); mergedSides = true; } @@ -447,7 +448,8 @@ class boss_gothik : public CreatureScript DoScriptText(SAY_TELEPORT, me); DoTeleportTo(PosGroundLiveSide); me->SetReactState(REACT_AGGRESSIVE); - summons.DoAction(0, 0); + DummyEntryCheckPredicate pred; + summons.DoAction(0, pred); //! Magic numbers fail summons.DoZoneInCombat(); events.ScheduleEvent(EVENT_BOLT, 1000); events.ScheduleEvent(EVENT_HARVEST, urand(3000, 15000)); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index e353a71b0b9..039b9b1e007 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -45,7 +45,7 @@ public: struct boss_grobbulusAI : public BossAI { - boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS) + boss_grobbulusAI(Creature* creature) : BossAI(creature, BOSS_GROBBULUS) { me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_POISON_CLOUD_ADD, true); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 7a2d3ec55ab..d84cfb8949e 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -57,7 +57,7 @@ public: struct boss_heiganAI : public BossAI { - boss_heiganAI(Creature* c) : BossAI(c, BOSS_HEIGAN) {} + boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN) {} uint32 eruptSection; bool eruptDirection; @@ -86,7 +86,7 @@ public: return 0; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 161c9160293..0a4fdec7222 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -266,7 +266,7 @@ public: struct boss_kelthuzadAI : public BossAI { - boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), spawns(c) + boss_kelthuzadAI(Creature* creature) : BossAI(creature, BOSS_KELTHUZAD), spawns(creature) { uiFaction = me->getFaction(); } @@ -299,7 +299,7 @@ public: for (itr = chained.begin(); itr != chained.end(); ++itr) { if (Player* charmed = Unit::GetPlayer(*me, (*itr).first)) - charmed->SetFloatValue(OBJECT_FIELD_SCALE_X, (*itr).second); + charmed->SetObjectScale((*itr).second); } chained.clear(); @@ -338,7 +338,7 @@ public: DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); @@ -347,7 +347,7 @@ public: for (itr = chained.begin(); itr != chained.end(); ++itr) { if (Player* player = Unit::GetPlayer(*me, (*itr).first)) - player->SetFloatValue(OBJECT_FIELD_SCALE_X, (*itr).second); + player->SetObjectScale((*itr).second); } chained.clear(); } @@ -457,7 +457,7 @@ public: { if (HealthBelowPct(45)) { - Phase = 3 ; + Phase = 3; DoScriptText(SAY_REQUEST_AID, me); //here Lich King should respond to KelThuzad but I don't know which Creature to make talk //so for now just make Kelthuzad says it. @@ -512,7 +512,7 @@ public: DoCast(target, SPELL_CHAINS_OF_KELTHUZAD); float scale = target->GetFloatValue(OBJECT_FIELD_SCALE_X); chained.insert(std::make_pair(target->GetGUID(), scale)); - target->SetFloatValue(OBJECT_FIELD_SCALE_X, scale * 2); + target->SetObjectScale(scale * 2); events.ScheduleEvent(EVENT_CHAINED_SPELL, 2000); //core has 2000ms to set unit flag charm } } @@ -530,7 +530,7 @@ public: { if (!player->isCharmed()) { - player->SetFloatValue(OBJECT_FIELD_SCALE_X, (*itr).second); + player->SetObjectScale((*itr).second); std::map::iterator next = itr; ++next; chained.erase(itr); @@ -667,7 +667,7 @@ public: if (!instance || instance->IsEncounterInProgress() || instance->GetBossState(BOSS_KELTHUZAD) == DONE) return false; - Creature* pKelthuzad = CAST_CRE(Unit::GetUnit(*player, instance->GetData64(DATA_KELTHUZAD))); + Creature* pKelthuzad = Unit::GetCreature(*player, instance->GetData64(DATA_KELTHUZAD)); if (!pKelthuzad) return false; @@ -714,7 +714,6 @@ public: return true; } - }; class npc_kelthuzad_abomination : public CreatureScript @@ -726,16 +725,13 @@ class npc_kelthuzad_abomination : public CreatureScript { npc_kelthuzad_abominationAI(Creature* creature) : ScriptedAI(creature) { - instance = me->GetInstanceScript(); + _instance = creature->GetInstanceScript(); } - InstanceScript* instance; - EventMap events; - void Reset() { - events.Reset(); - events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(2000, 5000)); + _events.Reset(); + _events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(2000, 5000)); DoCast(me, SPELL_FRENZY, true); } @@ -744,15 +740,15 @@ class npc_kelthuzad_abomination : public CreatureScript if (!UpdateVictim()) return; - events.Update(diff); + _events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_MORTAL_WOUND: DoCastVictim(SPELL_MORTAL_WOUND, true); - events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 15000)); + _events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 15000)); break; default: break; @@ -760,11 +756,15 @@ class npc_kelthuzad_abomination : public CreatureScript } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { - if (instance) - instance->SetData(DATA_ABOMINATION_KILLED, instance->GetData(DATA_ABOMINATION_KILLED) + 1); + if (_instance) + _instance->SetData(DATA_ABOMINATION_KILLED, _instance->GetData(DATA_ABOMINATION_KILLED) + 1); } + + private: + InstanceScript* _instance; + EventMap _events; }; CreatureAI* GetAI(Creature* creature) const @@ -776,9 +776,7 @@ class npc_kelthuzad_abomination : public CreatureScript class achievement_just_cant_get_enough : public AchievementCriteriaScript { public: - achievement_just_cant_get_enough() : AchievementCriteriaScript("achievement_just_cant_get_enough") - { - } + achievement_just_cant_get_enough() : AchievementCriteriaScript("achievement_just_cant_get_enough") { } bool OnCheck(Player* /*player*/, Unit* target) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index 0163101b8ed..3c258f08030 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -68,7 +68,7 @@ public: struct boss_maexxnaAI : public BossAI { - boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA) {} + boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA) {} bool enraged; @@ -159,7 +159,7 @@ public: struct mob_webwrapAI : public NullCreatureAI { - mob_webwrapAI(Creature* c) : NullCreatureAI(c), victimGUID(0) {} + mob_webwrapAI(Creature* creature) : NullCreatureAI(creature), victimGUID(0) {} uint64 victimGUID; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 7143b940916..75be596fd77 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -75,7 +75,7 @@ public: struct boss_nothAI : public BossAI { - boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH) {} + boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) {} uint32 waveCount, balconyCount; @@ -124,7 +124,7 @@ public: summon->AI()->DoZoneInCombat(); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index a9ed499c5e5..b826a530719 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -62,7 +62,7 @@ public: struct boss_patchwerkAI : public BossAI { - boss_patchwerkAI(Creature* c) : BossAI(c, BOSS_PATCHWERK) {} + boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) {} bool Enraged; @@ -80,7 +80,7 @@ public: DoScriptText(SAY_SLAY, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index b27ab3730da..e06aa6b03c5 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -64,7 +64,7 @@ public: struct boss_razuviousAI : public BossAI { - boss_razuviousAI(Creature* c) : BossAI(c, BOSS_RAZUVIOUS) {} + boss_razuviousAI(Creature* creature) : BossAI(creature, BOSS_RAZUVIOUS) {} void KilledUnit(Unit* /*victim*/) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 16b1e7ac996..37fb5f3f4a9 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -81,7 +81,7 @@ public: struct boss_sapphironAI : public BossAI { - boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON) + boss_sapphironAI(Creature* creature) : BossAI(creature, BOSS_SAPPHIRON) , phase(PHASE_NULL) { map = me->GetMap(); @@ -145,7 +145,7 @@ public: } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); me->CastSpell(me, SPELL_DIES, true); @@ -153,7 +153,7 @@ public: CheckPlayersFrostResist(); if (CanTheHundredClub) { - AchievementEntry const* AchievTheHundredClub = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_HUNDRED_CLUB); + AchievementEntry const* AchievTheHundredClub = sAchievementStore.LookupEntry(ACHIEVEMENT_THE_HUNDRED_CLUB); if (AchievTheHundredClub) { if (map && map->IsDungeon()) @@ -296,7 +296,7 @@ public: { case EVENT_LIFTOFF: me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->SendMovementFlagUpdate(); events.ScheduleEvent(EVENT_ICEBOLT, 1500); iceboltCount = RAID_MODE(2, 3); @@ -340,7 +340,7 @@ public: return; case EVENT_LAND: me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->SendMovementFlagUpdate(); events.ScheduleEvent(EVENT_GROUND, 1500); return; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index e64099da3ac..ccc8e9a5663 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -120,7 +120,7 @@ public: struct boss_thaddiusAI : public BossAI { - boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS) + boss_thaddiusAI(Creature* creature) : BossAI(creature, BOSS_THADDIUS) { // init is a bit tricky because thaddius shall track the life of both adds, but not if there was a wipe // and, in particular, if there was a crash after both adds were killed (should not respawn) @@ -158,7 +158,7 @@ public: DoScriptText(SAY_SLAY, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); @@ -295,9 +295,9 @@ public: struct mob_stalaggAI : public ScriptedAI { - mob_stalaggAI(Creature* c) : ScriptedAI(c) + mob_stalaggAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -381,9 +381,9 @@ public: struct mob_feugenAI : public ScriptedAI { - mob_feugenAI(Creature* c) : ScriptedAI(c) + mob_feugenAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index c05d9a21850..50eb52cc4c2 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -465,7 +465,6 @@ public: playerDied = buff2; } }; - }; void AddSC_instance_naxxramas() diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 437d9980af3..ac5520b025a 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -240,8 +240,8 @@ public: _cannotMove = true; - me->SetFlying(true); - + me->SetCanFly(true); + if (instance) instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } @@ -271,7 +271,7 @@ public: { me->SetHomePosition(_homePosition); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); BossAI::EnterEvadeMode(); @@ -354,15 +354,15 @@ public: { _EnterCombat(); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetFlying(false); + me->SetDisableGravity(false); + me->SetCanFly(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Talk(SAY_AGGRO_P_ONE); DoCast(SPELL_BERSEKER); // periodic aura, first tick in 10 minutes - + if (instance) instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } @@ -412,8 +412,8 @@ public: void PrepareForVortex() { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetFlying(true); + me->SetDisableGravity(true); + me->SetCanFly(true); me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->MovePoint(MOVE_VORTEX, MalygosPositions[1].GetPositionX(), MalygosPositions[1].GetPositionY(), MalygosPositions[1].GetPositionZ()); @@ -461,8 +461,8 @@ public: { SetPhase(PHASE_TWO, true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetFlying(true); + me->SetDisableGravity(true); + me->SetCanFly(true); me->GetMotionMaster()->MoveIdle(); me->GetMotionMaster()->MovePoint(MOVE_DEEP_BREATH_ROTATION, MalygosPhaseTwoWaypoints[0]); @@ -704,8 +704,8 @@ class spell_malygos_vortex_visual : public SpellScriptLoader // Anyway even with this issue, the boss does not enter in evade mode - this prevents iterate an empty list in the next vortex execution. malygos->SetInCombatWithZone(); - malygos->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - malygos->SetFlying(false); + malygos->SetDisableGravity(false); + malygos->SetCanFly(false); malygos->GetMotionMaster()->MoveChase(caster->getVictim()); malygos->RemoveAura(SPELL_VORTEX_1); @@ -963,8 +963,9 @@ public: // we dont do melee damage! } - void WaypointReached(uint32 /*i*/) + void WaypointReached(uint32 /*waypointId*/) { + } private: diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index 5e87ffb8973..7552ba4f389 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp @@ -101,7 +101,7 @@ class boss_anomalus : public CreatureScript instance->SetData(DATA_ANOMALUS_EVENT, IN_PROGRESS); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 44c6c25fa3e..5c1dee1d4e4 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -61,9 +61,9 @@ public: struct boss_keristraszaAI : public ScriptedAI { - boss_keristraszaAI(Creature* c) : ScriptedAI(c) + boss_keristraszaAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -208,16 +208,16 @@ class containment_sphere : public GameObjectScript public: containment_sphere() : GameObjectScript("containment_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - InstanceScript* instance = pGO->GetInstanceScript(); + InstanceScript* instance = go->GetInstanceScript(); - Creature* pKeristrasza = Unit::GetCreature(*pGO, instance ? instance->GetData64(DATA_KERISTRASZA) : 0); + Creature* pKeristrasza = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_KERISTRASZA) : 0); if (pKeristrasza && pKeristrasza->isAlive()) { // maybe these are hacks :( - pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - pGO->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); CAST_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index 03f467ce180..ad188738c12 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -67,9 +67,9 @@ public: struct boss_magus_telestraAI : public ScriptedAI { - boss_magus_telestraAI(Creature* c) : ScriptedAI(c) + boss_magus_telestraAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index 4453ec94494..c70db7d4ebc 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -61,9 +61,9 @@ public: struct boss_ormorokAI : public ScriptedAI { - boss_ormorokAI(Creature* c) : ScriptedAI(c) + boss_ormorokAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -195,7 +195,7 @@ public: std::list::const_iterator i = me->getThreatManager().getThreatList().begin(); for (; i != me->getThreatManager().getThreatList().end(); ++i) { - Unit* temp = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* temp = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (temp && temp->GetTypeId() == TYPEID_PLAYER && temp->getClass() == Healer) { target = temp; @@ -234,7 +234,7 @@ public: struct mob_crystal_spikeAI : public Scripted_NoMovementAI { - mob_crystal_spikeAI(Creature* c) : Scripted_NoMovementAI(c) + mob_crystal_spikeAI(Creature* creature) : Scripted_NoMovementAI(creature) { } @@ -277,7 +277,7 @@ public: struct mob_crystalline_tanglerAI : public ScriptedAI { - mob_crystalline_tanglerAI(Creature* c) : ScriptedAI(c) {} + mob_crystalline_tanglerAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiRootsTimer; diff --git a/src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp index 6d07ac960b5..5ea3eb32c1d 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp @@ -49,7 +49,7 @@ public: struct boss_commander_kolurgAI : public ScriptedAI { - boss_commander_kolurgAI(Creature* c) : ScriptedAI(c) {} + boss_commander_kolurgAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} void EnterCombat(Unit* /*who*/) {} diff --git a/src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp b/src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp index 71a153c802a..da4b49740c1 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp @@ -49,7 +49,7 @@ public: struct boss_commander_stoutbeardAI : public ScriptedAI { - boss_commander_stoutbeardAI(Creature* c) : ScriptedAI(c) {} + boss_commander_stoutbeardAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} void EnterCombat(Unit* /*who*/) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index 9671d59bcec..b96d7c4aa84 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -203,7 +203,7 @@ public: if (!instance || instance->GetData(DATA_UROM_PLATAFORM) > 2) return; - for (uint8 i = 0; i < 4 ; i++) + for (uint8 i = 0; i < 4; i++) { SetPosition(i); me->SummonCreature(Group[group[instance->GetData(DATA_UROM_PLATAFORM)]].entry[i], x, y, me->GetPositionZ(), me->GetOrientation()); @@ -316,7 +316,9 @@ public: LeaveCombat(); break; case SPELL_TELEPORT: - me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); // with out it the npc will fall down while is casting + //! Unconfirmed, previous below + me->SetDisableGravity(true); + //me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); // with out it the npc will fall down while is casting canCast = true; break; default: diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 8852338c362..19a84fdae84 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -169,7 +169,9 @@ class npc_azure_ring_captain : public CreatureScript { targetGUID = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING | MOVEMENTFLAG_FLYING); + me->SetWalk(true); + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING + me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->SetReactState(REACT_AGGRESSIVE); } @@ -214,7 +216,7 @@ class npc_azure_ring_captain : public CreatureScript if (Unit* victim = varos->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0)) { me->SetReactState(REACT_PASSIVE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT, victim->GetPositionX(), victim->GetPositionY(), victim->GetPositionZ() + 20.0f); targetGUID = victim->GetGUID(); } @@ -306,7 +308,7 @@ class spell_varos_energize_core_area_enemy : public SpellScriptLoader float orientation = CAST_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); - for (std::list::iterator itr = targetList.begin() ; itr != targetList.end();) + for (std::list::iterator itr = targetList.begin(); itr != targetList.end();) { Position pos; (*itr)->GetPosition(&pos); @@ -353,7 +355,7 @@ class spell_varos_energize_core_area_entry : public SpellScriptLoader float orientation = CAST_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); - for (std::list::iterator itr = targetList.begin() ; itr != targetList.end();) + for (std::list::iterator itr = targetList.begin(); itr != targetList.end();) { Position pos; (*itr)->GetPosition(&pos); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 11433bfde37..23f55a3033b 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -61,13 +61,13 @@ class npc_oculus_drake : public CreatureScript public: npc_oculus_drake() : CreatureScript("npc_oculus_drake") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); switch (creature->GetEntry()) { case NPC_VERDISA: //Verdisa - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: if (!HAS_ESSENCE(player)) @@ -97,7 +97,7 @@ public: } break; case NPC_BELGARISTRASZ: //Belgaristrasz - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: if (!HAS_ESSENCE(player)) @@ -127,7 +127,7 @@ public: } break; case NPC_ETERNOS: //Eternos - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: if (!HAS_ESSENCE(player)) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index c6f72890d1f..9f39cecbb23 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -29,17 +29,15 @@ EndScriptData */ enum eEnums { //Yell - SAY_AGGRO = -1602000, - SAY_SLAY_1 = -1602001, - SAY_SLAY_2 = -1602002, - SAY_SLAY_3 = -1602003, - SAY_DEATH = -1602004, - SAY_BATTLE_STANCE = -1602005, - EMOTE_BATTLE_STANCE = -1602006, - SAY_BERSEKER_STANCE = -1602007, - EMOTE_BERSEKER_STANCE = -1602008, - SAY_DEFENSIVE_STANCE = -1602009, - EMOTE_DEFENSIVE_STANCE = -1602010, + SAY_AGGRO = 0, + SAY_DEFENSIVE_STANCE = 1, + SAY_BATTLE_STANCE = 2, + SAY_BERSEKER_STANCE = 3, + SAY_SLAY = 4, + SAY_DEATH = 5, + EMOTE_DEFENSIVE_STANCE = 6, + EMOTE_BATTLE_STANCE = 7, + EMOTE_BERSEKER_STANCE = 8, SPELL_DEFENSIVE_STANCE = 53790, //SPELL_DEFENSIVE_AURA = 41105, @@ -95,13 +93,13 @@ public: { boss_bjarngrimAI(Creature* creature) : ScriptedAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); m_uiStance = STANCE_DEFENSIVE; memset(&m_auiStormforgedLieutenantGUID, 0, sizeof(m_auiStormforgedLieutenantGUID)); canBuff = true; } - InstanceScript* m_instance; + InstanceScript* instance; bool m_bIsChangingStance; bool canBuff; @@ -169,8 +167,8 @@ public: SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); - if (m_instance) - m_instance->SetData(TYPE_BJARNGRIM, NOT_STARTED); + if (instance) + instance->SetData(TYPE_BJARNGRIM, NOT_STARTED); } void EnterEvadeMode() @@ -185,26 +183,26 @@ public: void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); //must get both lieutenants here and make sure they are with him me->CallForHelp(30.0f); - if (m_instance) - m_instance->SetData(TYPE_BJARNGRIM, IN_PROGRESS); + if (instance) + instance->SetData(TYPE_BJARNGRIM, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) { - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me); + Talk(SAY_SLAY); } void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); - if (m_instance) - m_instance->SetData(TYPE_BJARNGRIM, DONE); + if (instance) + instance->SetData(TYPE_BJARNGRIM, DONE); } //TODO: remove when removal is done by the core @@ -249,20 +247,20 @@ public: switch (m_uiStance) { case STANCE_DEFENSIVE: - DoScriptText(SAY_DEFENSIVE_STANCE, me); - DoScriptText(EMOTE_DEFENSIVE_STANCE, me); + Talk(SAY_DEFENSIVE_STANCE); + Talk(EMOTE_DEFENSIVE_STANCE); DoCast(me, SPELL_DEFENSIVE_STANCE); SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); break; case STANCE_BERSERKER: - DoScriptText(SAY_BERSEKER_STANCE, me); - DoScriptText(EMOTE_BERSEKER_STANCE, me); + Talk(SAY_BERSEKER_STANCE); + Talk(EMOTE_BERSEKER_STANCE); DoCast(me, SPELL_BERSEKER_STANCE); SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE); break; case STANCE_BATTLE: - DoScriptText(SAY_BATTLE_STANCE, me); - DoScriptText(EMOTE_BATTLE_STANCE, me); + Talk(SAY_BATTLE_STANCE); + Talk(EMOTE_BATTLE_STANCE); DoCast(me, SPELL_BATTLE_STANCE); SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); break; @@ -387,10 +385,10 @@ public: { mob_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 m_uiArcWeld_Timer; uint32 m_uiRenewSteel_Timer; @@ -403,9 +401,9 @@ public: void EnterCombat(Unit* who) { - if (m_instance) + if (instance) { - if (Creature* pBjarngrim = m_instance->instance->GetCreature(m_instance->GetData64(DATA_BJARNGRIM))) + if (Creature* pBjarngrim = instance->instance->GetCreature(instance->GetData64(DATA_BJARNGRIM))) { if (pBjarngrim->isAlive() && !pBjarngrim->getVictim()) pBjarngrim->AI()->AttackStart(who); @@ -429,9 +427,9 @@ public: if (m_uiRenewSteel_Timer <= uiDiff) { - if (m_instance) + if (instance) { - if (Creature* pBjarngrim = m_instance->instance->GetCreature(m_instance->GetData64(DATA_BJARNGRIM))) + if (Creature* pBjarngrim = instance->instance->GetCreature(instance->GetData64(DATA_BJARNGRIM))) { if (pBjarngrim->isAlive()) DoCast(pBjarngrim, SPELL_RENEW_STEEL_N); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index 016c4d27cfa..abdf5ecb1e1 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -41,13 +41,10 @@ enum Spells enum Yells { - SAY_AGGRO = -1602011, - SAY_SLAY_1 = -1602012, - SAY_SLAY_2 = -1602013, - SAY_SLAY_3 = -1602014, - SAY_DEATH = -1602015, - SAY_SPLIT_1 = -1602016, - SAY_SPLIT_2 = -1602017 + SAY_AGGRO = 0, + SAY_SPLIT = 1, + SAY_SLAY = 2, + SAY_DEATH = 3 }; enum Creatures @@ -122,7 +119,7 @@ public: void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); if (instance) instance->SetData(TYPE_IONAR, IN_PROGRESS); @@ -130,7 +127,7 @@ public: void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); lSparkList.DespawnAll(); @@ -140,7 +137,7 @@ public: void KilledUnit(Unit* /*victim*/) { - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me); + Talk(SAY_SLAY); } void SpellHit(Unit* /*caster*/, const SpellInfo* spell) @@ -278,7 +275,7 @@ public: { bHasDispersed = true; - DoScriptText(RAND(SAY_SPLIT_1, SAY_SPLIT_2), me); + Talk(SAY_SPLIT); if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index 171215c605a..2e2744baa3c 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -30,20 +30,16 @@ enum eEnums { ACHIEV_TIMELY_DEATH_START_EVENT = 20384, - SAY_AGGRO = -1602018, - SAY_INTRO_1 = -1602019, - SAY_INTRO_2 = -1602020, - SAY_SLAY_1 = -1602021, - SAY_SLAY_2 = -1602022, - SAY_SLAY_3 = -1602023, - SAY_DEATH = -1602024, - SAY_NOVA_1 = -1602025, - SAY_NOVA_2 = -1602026, - SAY_NOVA_3 = -1602027, - SAY_75HEALTH = -1602028, - SAY_50HEALTH = -1602029, - SAY_25HEALTH = -1602030, - EMOTE_NOVA = -1602031, + SAY_INTRO_1 = 0, + SAY_INTRO_2 = 1, + SAY_AGGRO = 2, + SAY_NOVA = 3, + SAY_SLAY = 4, + SAY_75HEALTH = 5, + SAY_50HEALTH = 6, + SAY_25HEALTH = 7, + SAY_DEATH = 8, + EMOTE_NOVA = 9, SPELL_ARC_LIGHTNING = 52921, SPELL_LIGHTNING_NOVA_N = 52960, @@ -72,10 +68,10 @@ public: { boss_lokenAI(Creature* creature) : ScriptedAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; bool m_bIsAura; @@ -97,35 +93,35 @@ public: m_uiHealthAmountModifier = 1; - if (m_instance) + if (instance) { - m_instance->SetData(TYPE_LOKEN, NOT_STARTED); - m_instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); + instance->SetData(TYPE_LOKEN, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } } void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); - if (m_instance) + if (instance) { - m_instance->SetData(TYPE_LOKEN, IN_PROGRESS); - m_instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); + instance->SetData(TYPE_LOKEN, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } } void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); - if (m_instance) - m_instance->SetData(TYPE_LOKEN, DONE); + if (instance) + instance->SetData(TYPE_LOKEN, DONE); } void KilledUnit(Unit* /*victim*/) { - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me); + Talk(SAY_SLAY); } void UpdateAI(const uint32 uiDiff) @@ -190,8 +186,8 @@ public: if (m_uiLightningNova_Timer <= uiDiff) { - DoScriptText(RAND(SAY_NOVA_1, SAY_NOVA_2, SAY_NOVA_3), me); - DoScriptText(EMOTE_NOVA, me); + Talk(SAY_NOVA); + Talk(EMOTE_NOVA); DoCast(me, SPELL_LIGHTNING_NOVA_N); m_bIsAura = false; @@ -206,9 +202,9 @@ public: { switch (m_uiHealthAmountModifier) { - case 1: DoScriptText(SAY_75HEALTH, me); break; - case 2: DoScriptText(SAY_50HEALTH, me); break; - case 3: DoScriptText(SAY_25HEALTH, me); break; + case 1: Talk(SAY_75HEALTH); break; + case 2: Talk(SAY_50HEALTH); break; + case 3: Talk(SAY_25HEALTH); break; } ++m_uiHealthAmountModifier; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 1fc724c8b6c..5c7bf0d1c1e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -28,17 +28,13 @@ EndScriptData */ enum eEnums { - SAY_AGGRO = -1602032, - SAY_SLAY_1 = -1602033, - SAY_SLAY_2 = -1602034, - SAY_SLAY_3 = -1602035, - SAY_DEATH = -1602036, - SAY_STOMP_1 = -1602037, - SAY_STOMP_2 = -1602038, - SAY_FORGE_1 = -1602039, - SAY_FORGE_2 = -1602040, - EMOTE_TO_ANVIL = -1602041, - EMOTE_SHATTER = -1602042, + SAY_AGGRO = 0, + SAY_FORGE = 1, + SAY_STOMP = 2, + SAY_SLAY = 3, + SAY_DEATH = 4, + EMOTE_TO_ANVIL = 5, + EMOTE_SHATTER = 6, SPELL_HEAT_N = 52387, SPELL_HEAT_H = 59528, @@ -83,10 +79,10 @@ public: { boss_volkhanAI(Creature* creature) : ScriptedAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; std::list m_lGolemGUIDList; @@ -121,16 +117,16 @@ public: DespawnGolem(); m_lGolemGUIDList.clear(); - if (m_instance) - m_instance->SetData(TYPE_VOLKHAN, NOT_STARTED); + if (instance) + instance->SetData(TYPE_VOLKHAN, NOT_STARTED); } void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); - if (m_instance) - m_instance->SetData(TYPE_VOLKHAN, IN_PROGRESS); + if (instance) + instance->SetData(TYPE_VOLKHAN, IN_PROGRESS); } void AttackStart(Unit* who) @@ -148,15 +144,15 @@ public: void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); DespawnGolem(); - if (m_instance) - m_instance->SetData(TYPE_VOLKHAN, DONE); + if (instance) + instance->SetData(TYPE_VOLKHAN, DONE); if (IsHeroic() && GolemsShattered < 5) { - AchievementEntry const* AchievShatterResistant = GetAchievementStore()->LookupEntry(ACHIEVEMENT_SHATTER_RESISTANT); + AchievementEntry const* AchievShatterResistant = sAchievementStore.LookupEntry(ACHIEVEMENT_SHATTER_RESISTANT); if (AchievShatterResistant) { Map* map = me->GetMap(); @@ -172,7 +168,7 @@ public: void KilledUnit(Unit* /*victim*/) { - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me); + Talk(SAY_SLAY); } void DespawnGolem() @@ -263,11 +259,11 @@ public: if (m_uiShatteringStomp_Timer <= uiDiff) { // Should he stomp even if he has no brittle golem to shatter? - DoScriptText(RAND(SAY_STOMP_1, SAY_STOMP_2), me); + Talk(SAY_STOMP); DoCast(me, SPELL_SHATTERING_STOMP_N); - DoScriptText(EMOTE_SHATTER, me); + Talk(EMOTE_SHATTER); m_uiShatteringStomp_Timer = 30000; m_bCanShatterGolem = true; @@ -297,7 +293,7 @@ public: if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); - DoScriptText(RAND(SAY_FORGE_1, SAY_FORGE_2), me); + Talk(SAY_FORGE); m_bHasTemper = true; @@ -308,7 +304,7 @@ public: { case 1: // 1 - Start run to Anvil - DoScriptText(EMOTE_TO_ANVIL, me); + Talk(EMOTE_TO_ANVIL); me->GetMotionMaster()->MoveTargetedHome(); m_uiSummonPhase = 2; // Set Next Phase break; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index d1aba800094..bc57ce21a4d 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -61,9 +61,9 @@ public: struct boss_krystallusAI : public ScriptedAI { - boss_krystallusAI(Creature* c) : ScriptedAI(c) + boss_krystallusAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiBoulderTossTimer; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index cd4d7ae94a1..65711643827 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -65,7 +65,7 @@ public: struct boss_maiden_of_griefAI : public ScriptedAI { - boss_maiden_of_griefAI(Creature* c) : ScriptedAI(c) + boss_maiden_of_griefAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index 2c7026207e5..c2a8e905950 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -90,9 +90,9 @@ public: struct boss_sjonnirAI : public ScriptedAI { - boss_sjonnirAI(Creature* c) : ScriptedAI(c), lSummons(me) + boss_sjonnirAI(Creature* creature) : ScriptedAI(creature), lSummons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } bool bIsFrenzy; @@ -258,7 +258,7 @@ public: struct mob_malformed_oozeAI : public ScriptedAI { - mob_malformed_oozeAI(Creature* c) : ScriptedAI(c) {} + mob_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiMergeTimer; @@ -301,9 +301,9 @@ public: struct mob_iron_sludgeAI : public ScriptedAI { - mob_iron_sludgeAI(Creature* c) : ScriptedAI(c) + mob_iron_sludgeAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 1c8d9380a2b..a608de5fcf3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -142,9 +142,9 @@ public: struct mob_tribuna_controllerAI : public ScriptedAI { - mob_tribuna_controllerAI(Creature* c) : ScriptedAI(c) + mob_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); SetCombatMovement(false); } @@ -268,10 +268,10 @@ class npc_brann_hos : public CreatureScript public: npc_brann_hos() : CreatureScript("npc_brann_hos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1 || uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+1 || action == GOSSIP_ACTION_INFO_DEF+2) { player->CLOSE_GOSSIP_MENU(); CAST_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP(); @@ -298,9 +298,9 @@ public: struct npc_brann_hosAI : public npc_escortAI { - npc_brann_hosAI(Creature* c) : npc_escortAI(c) + npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiStep; @@ -346,9 +346,9 @@ public: lDwarfGUIDList.clear(); } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 7: if (Creature* creature = GetClosestCreatureWithEntry(me, CREATURE_TRIBUNAL_OF_THE_AGES, 100.0f)) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp deleted file mode 100644 index e54d8a898de..00000000000 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ulduar.h" - -#define GAMEOBJECT_GIVE_OF_THE_OBSERVER 194821 - -enum Spells -{ - SPELL_ASCEND = 64487, - SPELL_BERSERK = 47008, - SPELL_BIG_BANG = 64443, - H_SPELL_BIG_BANG = 64584, - SPELL_COSMIC_SMASH = 62301, - H_SPELL_COSMIC_SMASH = 64598, - SPELL_PHASE_PUNCH = 64412, - SPELL_QUANTUM_STRIKE = 64395, - H_SPELL_QUANTUM_STRIKE = 64592, - SPELL_BLACK_HOLE_EXPLOSION = 64122, - SPELL_ARCANE_BARAGE = 64599, - H_SPELL_ARCANE_BARAGE = 64607 -}; - -enum Creatures -{ - CREATURE_COLLAPSING_STAR = 32955, - CREATURE_BLACK_HOLE = 32953, - CREATURE_LIVING_CONSTELLATION = 33052, - CREATURE_DARK_MATTER = 33089 -}; - -enum Yells -{ - SAY_AGGRO = -1603000, - SAY_SLAY_1 = -1603001, - SAY_SLAY_2 = -1603002, - SAY_ENGADED_FOR_FIRTS_TIME = -1603003, - SAY_PHASE_2 = -1603004, - SAY_SUMMON_COLLAPSING_STAR = -1603005, - SAY_DEATH_1 = -1603006, - SAY_DEATH_2 = -1603007, - SAY_DEATH_3 = -1603008, - SAY_DEATH_4 = -1603009, - SAY_DEATH_5 = -1603010, - SAY_BERSERK = -1603011, - SAY_BIG_BANG_1 = -1603012, - SAY_BIG_BANG_2 = -1603013, - SAY_TIMER_1 = -1603014, - SAY_TIMER_2 = -1603015, - SAY_TIMER_3 = -1603016, - SAY_SUMMON_1 = -1603017, - SAY_SUMMON_2 = -1603018, - SAY_SUMMON_3 = -1603019, -}; - -class boss_algalon : public CreatureScript -{ -public: - boss_algalon() : CreatureScript("boss_algalon") { } - - CreatureAI* GetAI(Creature* creature) const - { - return GetUlduarAI(creature); - } - - struct boss_algalonAI : public ScriptedAI - { - boss_algalonAI(Creature* c) : ScriptedAI(c) - { - instance = c->GetInstanceScript(); - Summon = false; // not in reset. intro speech done only once. - } - - InstanceScript* instance; - - std::list m_lCollapsingStarGUIDList; - - uint32 Phase; - uint32 Ascend_Timer; - uint32 Berserk_Timer; - uint32 BigBang_Timer; - uint32 CosmicSmash_Timer; - uint32 PhasePunch_Timer; - uint32 QuantumStrike_Timer; - uint32 CollapsingStar_Timer; - uint32 uiPhase_timer; - uint32 uiStep; - - uint64 BlackHoleGUID; - - bool Enrage; - bool Summon; - - void EnterCombat(Unit* who) - { - if (Summon) - { - DoScriptText(SAY_AGGRO, me); - me->InterruptSpell(CURRENT_CHANNELED_SPELL); - DoZoneInCombat(who->ToCreature()); - } - else - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); - uiStep = 1; - } - - if (instance) - instance->SetData(BOSS_ALGALON, IN_PROGRESS); - } - - void KilledUnit(Unit* /*victim*/) - { - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); - } - - void Reset() - { - Phase = 1; - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (instance) - instance->SetData(BOSS_ALGALON, NOT_STARTED); - - BlackHoleGUID = 0; - - uiPhase_timer = 0; - Ascend_Timer = 480000; //8 minutes - QuantumStrike_Timer = urand(4000, 14000); - Berserk_Timer = 360000; //6 minutes - CollapsingStar_Timer = urand(15000, 20000); //Spawns between 15 to 20 seconds - BigBang_Timer = 90000; - PhasePunch_Timer = 8000; - CosmicSmash_Timer = urand(30000, 60000); - Enrage = false; - } - - void JumpToNextStep(uint32 uiTimer) - { - uiPhase_timer = uiTimer; - ++uiStep; - } - - void DespawnCollapsingStar() - { - if (m_lCollapsingStarGUIDList.empty()) - return; - - for (std::list::const_iterator itr = m_lCollapsingStarGUIDList.begin(); itr != m_lCollapsingStarGUIDList.end(); ++itr) - { - if (Creature* temp = Unit::GetCreature(*me, *itr)) - { - if (temp->isAlive()) - temp->DespawnOrUnsummon(); - } - } - m_lCollapsingStarGUIDList.clear(); - } - - void JustSummoned(Creature* summoned) - { - if (summoned->GetEntry() == CREATURE_COLLAPSING_STAR) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (me->getVictim()) - summoned->AI()->AttackStart(target ? target : me->getVictim()); - m_lCollapsingStarGUIDList.push_back(summoned->GetGUID()); - } - } - - void SummonCollapsingStar(Unit* target) - { - DoScriptText(SAY_SUMMON_COLLAPSING_STAR, me); - me->SummonCreature(CREATURE_COLLAPSING_STAR, target->GetPositionX()+15.0f, target->GetPositionY()+15.0f, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 100000); - me->SummonCreature(CREATURE_BLACK_HOLE, target->GetPositionX()+15.0f, target->GetPositionY()+15.0f, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 27000); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (Phase == 1 && HealthBelowPct(20)) - { - Phase = 2; - DoScriptText(SAY_PHASE_2, me); - } - - if (HealthBelowPct(2)) - { - me->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667f, -295.101166f, 417.321381f, 0, 0, 0, 0, 0, 0); - - // All of them. or random? - DoScriptText(SAY_DEATH_1, me); - DoScriptText(SAY_DEATH_2, me); - DoScriptText(SAY_DEATH_3, me); - DoScriptText(SAY_DEATH_4, me); - DoScriptText(SAY_DEATH_5, me); - - me->DisappearAndDie(); - - if (instance) - instance->SetData(BOSS_ALGALON, DONE); - - return; - } - - if (Phase == 1) - { - if (!Summon) - { - if (uiPhase_timer <= diff) - { - switch (uiStep) - { - case 1: - DoScriptText(SAY_SUMMON_1, me); - JumpToNextStep(3000); - break; - case 2: - DoScriptText(SAY_SUMMON_2, me); - JumpToNextStep(3000); - break; - case 3: - DoScriptText(SAY_SUMMON_3, me); - JumpToNextStep(3000); - break; - case 4: - DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, me); - JumpToNextStep(3000); - break; - case 5: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_AGGRESSIVE); - Summon = true; - break; - } - } else uiPhase_timer -= diff; - - return; - } - - if (QuantumStrike_Timer <= diff) - { - DoCast(me->getVictim(), RAID_MODE(SPELL_QUANTUM_STRIKE, H_SPELL_QUANTUM_STRIKE), true); - - QuantumStrike_Timer = urand(4000, 14000); - } else QuantumStrike_Timer -= diff; - - if (BigBang_Timer <= diff) - { - DoScriptText(RAND(SAY_BIG_BANG_1, SAY_BIG_BANG_2), me); - DoCast(me->getVictim(), RAID_MODE(SPELL_BIG_BANG, H_SPELL_BIG_BANG), true); - - BigBang_Timer = 90000; - } else BigBang_Timer -= diff; - - if (Ascend_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASCEND, true); - - Ascend_Timer = 480000; - } else Ascend_Timer -= diff; - - if (PhasePunch_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_PHASE_PUNCH, true); - - PhasePunch_Timer = 8000; - } else PhasePunch_Timer -= diff; - - if (CosmicSmash_Timer <= diff) - { - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), RAID_MODE(SPELL_COSMIC_SMASH, H_SPELL_COSMIC_SMASH), true); - - CosmicSmash_Timer = urand(30000, 60000); - } else CosmicSmash_Timer -= diff; - - if (Berserk_Timer <= diff) - { - DoScriptText(SAY_BERSERK, me); - DoCast(me->getVictim(), SPELL_BERSERK, true); - - Berserk_Timer = 360000; - } else Berserk_Timer -= diff; - - DoMeleeAttackIfReady(); - - EnterEvadeIfOutOfCombatArea(diff); - } - - if (Phase == 2) - { - if (Enrage) - { - if (Ascend_Timer <= diff) - { - DoCast(me, SPELL_ASCEND); - DoScriptText(SAY_BERSERK, me); - Ascend_Timer = urand(360000, 365000); - Enrage = false; - } else Ascend_Timer -= diff; - } - } - - DoMeleeAttackIfReady(); - } - }; - -}; - -//Collapsing Star -class mob_collapsing_star : public CreatureScript -{ -public: - mob_collapsing_star() : CreatureScript("mob_collapsing_star") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_collapsing_starAI(creature); - } - - struct mob_collapsing_starAI : public ScriptedAI - { - mob_collapsing_starAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 BlackHoleExplosion_Timer; - - void Reset() - { - BlackHoleExplosion_Timer = 0; - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (BlackHoleExplosion_Timer <= diff) - { - me->CastSpell(me, SPELL_BLACK_HOLE_EXPLOSION, false); - BlackHoleExplosion_Timer = 0; - } else BlackHoleExplosion_Timer -= diff; - } - }; - -}; - -void AddSC_boss_Algalon() -{ - new boss_algalon(); - new mob_collapsing_star(); -} diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp new file mode 100644 index 00000000000..2af73389ecb --- /dev/null +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -0,0 +1,1374 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "PassiveAI.h" +#include "GameObjectAI.h" +#include "MapManager.h" +#include "MoveSplineInit.h" +#include "ulduar.h" + +enum Texts +{ + SAY_BRANN_ALGALON_INTRO_1 = 0, + SAY_BRANN_ALGALON_INTRO_2 = 1, + SAY_BRANN_ALGALON_OUTRO = 2, + + SAY_ALGALON_INTRO_1 = 0, + SAY_ALGALON_INTRO_2 = 1, + SAY_ALGALON_INTRO_3 = 2, + SAY_ALGALON_START_TIMER = 3, + SAY_ALGALON_AGGRO = 4, + SAY_ALGALON_COLLAPSING_STAR = 5, + EMOTE_ALGALON_COLLAPSING_STAR = 6, + SAY_ALGALON_BIG_BANG = 7, + EMOTE_ALGALON_BIG_BANG = 8, + SAY_ALGALON_ASCEND = 9, + EMOTE_ALGALON_COSMIC_SMASH = 10, + SAY_ALGALON_PHASE_TWO = 11, + SAY_ALGALON_OUTRO_1 = 12, + SAY_ALGALON_OUTRO_2 = 13, + SAY_ALGALON_OUTRO_3 = 14, + SAY_ALGALON_OUTRO_4 = 15, + SAY_ALGALON_OUTRO_5 = 16, + SAY_ALGALON_DESPAWN_1 = 17, + SAY_ALGALON_DESPAWN_2 = 18, + SAY_ALGALON_DESPAWN_3 = 19, + SAY_ALGALON_KILL = 20, +}; + +enum Spells +{ + // Algalon the Observer + SPELL_ARRIVAL = 64997, + SPELL_RIDE_THE_LIGHTNING = 64986, + SPELL_SUMMON_AZEROTH = 64994, + SPELL_REORIGINATION = 64996, + SPELL_SUPERMASSIVE_FAIL = 65311, + SPELL_QUANTUM_STRIKE = 64395, + SPELL_PHASE_PUNCH = 64412, + SPELL_BIG_BANG = 64443, + SPELL_ASCEND_TO_THE_HEAVENS = 64487, + SPELL_COSMIC_SMASH = 62301, + SPELL_COSMIC_SMASH_TRIGGERED = 62304, + SPELL_COSMIC_SMASH_VISUAL_STATE = 62300, + SPELL_SELF_STUN = 65256, + SPELL_KILL_CREDIT = 65184, + SPELL_TELEPORT = 62940, + + // Algalon Stalker + SPELL_TRIGGER_3_ADDS = 62266, // Triggers Living Constellation + + // Living Constellation + SPELL_ARCANE_BARRAGE = 64599, + + // Collapsing Star + SPELL_COLLAPSE = 62018, + SPELL_BLACK_HOLE_SPAWN_VISUAL = 62003, + SPELL_SUMMON_BLACK_HOLE = 62189, + + // Black Hole + SPELL_BLACK_HOLE_TRIGGER = 62185, + SPELL_CONSTELLATION_PHASE_TRIGGER = 65508, + SPELL_CONSTELLATION_PHASE_EFFECT = 65509, + SPELL_BLACK_HOLE_EXPLOSION = 64122, + SPELL_SUMMON_VOID_ZONE_VISUAL = 64470, + SPELL_VOID_ZONE_VISUAL = 64469, + SPELL_BLACK_HOLE_CREDIT = 65312, + + // Worm Hole + SPELL_WORM_HOLE_TRIGGER = 65251, + SPELL_SUMMON_UNLEASHED_DARK_MATTER = 64450, +}; + +uint32 const PhasePunchAlphaId[5] = {64435, 64434, 64428, 64421, 64417}; + +enum Events +{ + // Celestial Planetarium Access + EVENT_DESPAWN_CONSOLE = 1, + + // Brann Bronzebeard + EVENT_BRANN_MOVE_INTRO = 2, + EVENT_SUMMON_ALGALON = 3, + EVENT_BRANN_OUTRO_1 = 4, + EVENT_BRANN_OUTRO_2 = 5, + + // Algalon the Observer + EVENT_INTRO_1 = 6, + EVENT_INTRO_2 = 7, + EVENT_INTRO_3 = 8, + EVENT_INTRO_FINISH = 9, + EVENT_START_COMBAT = 10, + EVENT_INTRO_TIMER_DONE = 11, + EVENT_QUANTUM_STRIKE = 12, + EVENT_PHASE_PUNCH = 13, + EVENT_SUMMON_COLLAPSING_STAR = 14, + EVENT_BIG_BANG = 15, + EVENT_RESUME_UPDATING = 16, + EVENT_ASCEND_TO_THE_HEAVENS = 17, + EVENT_EVADE = 18, + EVENT_COSMIC_SMASH = 19, + EVENT_UNLOCK_YELL = 20, + EVENT_OUTRO_START = 21, + EVENT_OUTRO_1 = 22, + EVENT_OUTRO_2 = 23, + EVENT_OUTRO_3 = 24, + EVENT_OUTRO_4 = 25, + EVENT_OUTRO_5 = 26, + EVENT_OUTRO_6 = 27, + EVENT_OUTRO_7 = 28, + EVENT_OUTRO_8 = 29, + EVENT_OUTRO_9 = 30, + EVENT_OUTRO_10 = 31, + EVENT_OUTRO_11 = 32, + EVENT_OUTRO_12 = 33, + EVENT_OUTRO_13 = 34, + EVENT_OUTRO_14 = 35, + EVENT_DESPAWN_ALGALON_1 = 36, + EVENT_DESPAWN_ALGALON_2 = 37, + EVENT_DESPAWN_ALGALON_3 = 38, + + // Living Constellation + EVENT_ARCANE_BARRAGE = 39, +}; + +enum Actions +{ + ACTION_START_INTRO = 0, + ACTION_FINISH_INTRO = 1, + ACTION_ACTIVATE_STAR = 2, + ACTION_BIG_BANG = 3, + ACTION_ASCEND = 4, + ACTION_OUTRO = 5, +}; + +enum Points +{ + POINT_BRANN_INTRO = 0, + MAX_BRANN_WAYPOINTS_INTRO = 10, + POINT_BRANN_OUTRO = 10, + POINT_BRANN_OUTRO_END = 11, + + POINT_ALGALON_LAND = 1, + POINT_ALGALON_OUTRO = 2, +}; + +enum EncounterPhases +{ + PHASE_NORMAL = 0, + PHASE_ROLE_PLAY = 1, + PHASE_BIG_BANG = 2, + + PHASE_MASK_NO_UPDATE = (1 << PHASE_ROLE_PLAY) | (1 << PHASE_BIG_BANG), + PHASE_MASK_NO_CAST_CHECK = 1 << PHASE_ROLE_PLAY, +}; + +enum AchievmentInfo +{ + EVENT_ID_SUPERMASSIVE_START = 21697, + DATA_HAS_FED_ON_TEARS = 30043005, +}; + + +Position const BrannIntroSpawnPos = {1676.277f, -162.5308f, 427.3326f, 3.235537f}; +Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO] = +{ + {1642.482f, -164.0812f, 427.2602f, 0.0f}, + {1635.000f, -169.5145f, 427.2523f, 0.0f}, + {1632.814f, -173.9334f, 427.2621f, 0.0f}, + {1632.676f, -190.5927f, 425.8831f, 0.0f}, + {1631.497f, -214.2221f, 418.1152f, 0.0f}, + {1624.717f, -224.6876f, 418.1152f, 0.0f}, + {1631.497f, -214.2221f, 418.1152f, 0.0f}, + {1632.676f, -190.5927f, 425.8831f, 0.0f}, + {1632.814f, -173.9334f, 427.2621f, 0.0f}, + {1635.000f, -169.5145f, 427.2523f, 0.0f}, +}; +Position const AlgalonSummonPos = {1632.531f, -304.8516f, 450.1123f, 1.530165f}; +Position const AlgalonLandPos = {1632.668f, -302.7656f, 417.3211f, 1.530165f}; + +#define LIVING_CONSTELLATION_COUNT 11 +Position const ConstellationPos[LIVING_CONSTELLATION_COUNT] = +{ + {1625.208f, -267.2771f, 446.4296f, 5.044002f}, + {1658.279f, -262.5490f, 441.9073f, 4.188790f}, + {1678.677f, -276.3280f, 427.7531f, 3.979351f}, + {1593.389f, -299.4325f, 432.4636f, 6.073746f}, + {1685.613f, -300.1219f, 443.2366f, 3.385939f}, + {1591.706f, -263.8201f, 441.4153f, 5.253441f}, + {1668.317f, -324.7676f, 457.9394f, 3.211406f}, + {1592.242f, -325.5323f, 446.9508f, 0.226893f}, + {1635.821f, -363.3442f, 424.3459f, 1.466077f}, + {1672.188f, -357.2484f, 436.7337f, 2.338741f}, + {1615.800f, -348.0065f, 442.9586f, 1.134464f}, +}; + +#define COLLAPSING_STAR_COUNT 4 +Position const CollapsingStarPos[COLLAPSING_STAR_COUNT] = +{ + {1649.438f, -319.8127f, 418.3941f, 1.082104f}, + {1647.005f, -288.6790f, 417.3955f, 3.490659f}, + {1622.451f, -321.1563f, 417.6188f, 4.677482f}, + {1615.060f, -291.6816f, 417.7796f, 3.490659f}, +}; +Position const AlgalonOutroPos = {1633.64f, -317.78f, 417.3211f, 0.0f}; +Position const BrannOutroPos[3] = +{ + {1632.023f, -243.7434f, 417.9118f, 0.0f}, + {1631.986f, -297.7831f, 417.3210f, 0.0f}, + {1633.832f, -216.2948f, 417.0463f, 0.0f}, +}; + +class ActivateLivingConstellation : public BasicEvent +{ + public: + ActivateLivingConstellation(Unit* owner) : _owner(owner), _instance(owner->GetInstanceScript()) + { + } + + bool Execute(uint64 execTime, uint32 /*diff*/) + { + if (!_instance || _instance->GetBossState(BOSS_ALGALON) != IN_PROGRESS) + return true; // delete event + + _owner->CastSpell((Unit*)NULL, SPELL_TRIGGER_3_ADDS, TRIGGERED_FULL_MASK); + _owner->m_Events.AddEvent(this, execTime + urand(45000, 50000)); + return false; + } + + private: + Unit* _owner; + InstanceScript* _instance; +}; + +class CosmicSmashDamageEvent : public BasicEvent +{ + public: + CosmicSmashDamageEvent(Unit* caster) : _caster(caster) + { + } + + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _caster->CastSpell((Unit*)NULL, SPELL_COSMIC_SMASH_TRIGGERED, TRIGGERED_FULL_MASK); + return true; + } + + private: + Unit* _caster; +}; + +class SummonUnleashedDarkMatter : public BasicEvent +{ + public: + SummonUnleashedDarkMatter(Unit* caster) : _caster(caster) + { + } + + bool Execute(uint64 execTime, uint32 /*diff*/) + { + _caster->CastSpell((Unit*)NULL, SPELL_SUMMON_UNLEASHED_DARK_MATTER, TRIGGERED_FULL_MASK); + _caster->m_Events.AddEvent(this, execTime + 30000); + return false; + } + + private: + Unit* _caster; +}; + +class boss_algalon_the_observer : public CreatureScript +{ + public: + boss_algalon_the_observer() : CreatureScript("boss_algalon_the_observer") {} + + struct boss_algalon_the_observerAI : public BossAI + { + boss_algalon_the_observerAI(Creature* creature) : BossAI(creature, BOSS_ALGALON) + { + _firstPull = true; + _fedOnTears = false; + } + + void Reset() + { + _Reset(); + me->SetReactState(REACT_PASSIVE); + _phaseTwo = false; + _fightWon = false; + _hasYelled = false; + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_UNIT) + { + _fedOnTears = true; + if (!_hasYelled) + { + _hasYelled = true; + events.ScheduleEvent(EVENT_UNLOCK_YELL, 1000); + Talk(SAY_ALGALON_KILL); + } + } + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_START_INTRO: + { + me->SetFlag(UNIT_FIELD_FLAGS_2, 0x20); + me->SetDisableGravity(true); + DoCast(me, SPELL_ARRIVAL, true); + DoCast(me, SPELL_RIDE_THE_LIGHTNING, true); + me->GetMotionMaster()->MovePoint(POINT_ALGALON_LAND, AlgalonLandPos); + me->SetHomePosition(AlgalonLandPos); + Movement::MoveSplineInit init(*me); + init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ()); + init.SetOrientationFixed(true); + init.Launch(); + events.Reset(); + events.SetPhase(PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_INTRO_1, 5000, 0, PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_INTRO_2, 15000, 0, PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_INTRO_3, 23000, 0, PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_INTRO_FINISH, 36000, 0, PHASE_ROLE_PLAY); + break; + } + case ACTION_ASCEND: + events.SetPhase(PHASE_BIG_BANG); + events.CancelEvent(EVENT_RESUME_UPDATING); + events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 1500); + break; + case EVENT_DESPAWN_ALGALON: + events.Reset(); + events.SetPhase(PHASE_ROLE_PLAY); + if (me->isInCombat()) + events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 1); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_1, 5000); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_2, 17000); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_3, 26000); + me->DespawnOrUnsummon(34000); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); + break; + case ACTION_INIT_ALGALON: + _firstPull = false; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + break;; + } + } + + uint32 GetData(uint32 type) + { + return type == DATA_HAS_FED_ON_TEARS ? _fedOnTears : 1; + } + + void EnterCombat(Unit* /*target*/) + { + uint32 introDelay = 0; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); + events.Reset(); + events.SetPhase(PHASE_ROLE_PLAY); + + if (!_firstPull) + { + Talk(SAY_ALGALON_AGGRO); + _EnterCombat(); + introDelay = 8000; + } + else + { + _firstPull = false; + Talk(SAY_ALGALON_START_TIMER); + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRANN_BRONZEBEARD_ALG))) + brann->AI()->DoAction(ACTION_FINISH_INTRO); + + me->setActive(true); + DoZoneInCombat(); + introDelay = 26000; + summons.DespawnEntry(NPC_AZEROTH); + instance->SetData(EVENT_DESPAWN_ALGALON, 0); + events.ScheduleEvent(EVENT_START_COMBAT, 18000); + } + + events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay); + events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500 + introDelay); + events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500 + introDelay); + events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 18000 + introDelay); + events.ScheduleEvent(EVENT_BIG_BANG, 90000 + introDelay); + events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360000 + introDelay); + events.ScheduleEvent(EVENT_COSMIC_SMASH, 25000 + introDelay); + + std::list stalkers; + me->GetCreatureListWithEntryInGrid(stalkers, NPC_ALGALON_STALKER, 200.0f); + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) + (*itr)->m_Events.KillAllEvents(true); + } + + void MovementInform(uint32 movementType, uint32 pointId) + { + if (movementType != POINT_MOTION_TYPE) + return; + + if (pointId == POINT_ALGALON_LAND) + me->SetDisableGravity(false); + else if (pointId == POINT_ALGALON_OUTRO) + { + me->SetFacingTo(1.605703f); + events.ScheduleEvent(EVENT_OUTRO_3, 1200); + events.ScheduleEvent(EVENT_OUTRO_4, 2400); + events.ScheduleEvent(EVENT_OUTRO_5, 8500); + events.ScheduleEvent(EVENT_OUTRO_6, 15500); + events.ScheduleEvent(EVENT_OUTRO_7, 55500); + events.ScheduleEvent(EVENT_OUTRO_8, 73500); + events.ScheduleEvent(EVENT_OUTRO_9, 85500); + events.ScheduleEvent(EVENT_OUTRO_10, 108500); + events.ScheduleEvent(EVENT_OUTRO_11, 123500); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + switch (summon->GetEntry()) + { + case NPC_AZEROTH: + DoCastAOE(SPELL_REORIGINATION, true); + break; + case NPC_COLLAPSING_STAR: + summon->SetReactState(REACT_PASSIVE); + summon->GetMotionMaster()->MoveRandom(20.0f); + summon->CastSpell(summon, SPELL_COLLAPSE, TRIGGERED_FULL_MASK); + break; + case NPC_BLACK_HOLE: + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_TRIGGER, TRIGGERED_FULL_MASK); + summon->CastSpell(summon, SPELL_CONSTELLATION_PHASE_TRIGGER, TRIGGERED_FULL_MASK); + summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_EXPLOSION); + summon->CastSpell(summon, SPELL_SUMMON_VOID_ZONE_VISUAL, TRIGGERED_FULL_MASK); + break; + case NPC_ALGALON_VOID_ZONE_VISUAL_STALKER: + summon->CastSpell(summon, SPELL_VOID_ZONE_VISUAL, TRIGGERED_FULL_MASK); + break; + case NPC_ALGALON_STALKER_ASTEROID_TARGET_01: + summon->CastSpell(summon, SPELL_COSMIC_SMASH_VISUAL_STATE, TRIGGERED_FULL_MASK); + break; + case NPC_ALGALON_STALKER_ASTEROID_TARGET_02: + summon->m_Events.AddEvent(new CosmicSmashDamageEvent(summon), summon->m_Events.CalculateTime(3250)); + break; + case NPC_WORM_HOLE: + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_WORM_HOLE_TRIGGER, TRIGGERED_FULL_MASK); + summon->CastSpell(summon, SPELL_SUMMON_VOID_ZONE_VISUAL, TRIGGERED_FULL_MASK); + break; + case NPC_UNLEASHED_DARK_MATTER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + if (summon->Attack(target, true)) + summon->GetMotionMaster()->MoveChase(target); + break; + } + } + + void EnterEvadeMode() + { + instance->SetBossState(BOSS_ALGALON, FAIL); + BossAI::EnterEvadeMode(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->SetSheath(SHEATH_STATE_UNARMED); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) + { + if (_fightWon) + { + damage = 0; + return; + } + + if (!_phaseTwo && me->HealthBelowPctDamaged(20, damage)) + { + _phaseTwo = true; + Talk(SAY_ALGALON_PHASE_TWO); + summons.DespawnEntry(NPC_LIVING_CONSTELLATION); + summons.DespawnEntry(NPC_COLLAPSING_STAR); + summons.DespawnEntry(NPC_BLACK_HOLE); + summons.DespawnEntry(NPC_ALGALON_VOID_ZONE_VISUAL_STALKER); + events.CancelEvent(EVENT_SUMMON_COLLAPSING_STAR); + std::list stalkers; + me->GetCreatureListWithEntryInGrid(stalkers, NPC_ALGALON_STALKER, 200.0f); + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) + (*itr)->m_Events.KillAllEvents(true); + for (uint32 i = 0; i < COLLAPSING_STAR_COUNT; ++i) + if (Creature* wormHole = DoSummon(NPC_WORM_HOLE, CollapsingStarPos[i], TEMPSUMMON_MANUAL_DESPAWN)) + wormHole->m_Events.AddEvent(new SummonUnleashedDarkMatter(wormHole), wormHole->m_Events.CalculateTime(i >= 2 ? 8000 : 6000)); + } + else if ((int32(me->GetHealth()) - int32(damage)) < CalculatePctF(int32(me->GetMaxHealth()), 2.5f) && !_fightWon) + { + _fightWon = true; + damage = 0; + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->setFaction(35); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DoCast(me, SPELL_SELF_STUN); + events.Reset(); + summons.DespawnAll(); + events.SetPhase(PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_OUTRO_START, 1500); + events.ScheduleEvent(EVENT_OUTRO_1, 7200); + events.ScheduleEvent(EVENT_OUTRO_2, 8700); + } + } + + void UpdateAI(uint32 const diff) + { + if ((!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) || !CheckInRoom()) + return; + + events.Update(diff); + + if (!(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK)) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_INTRO_1: + me->RemoveAurasDueToSpell(SPELL_RIDE_THE_LIGHTNING); + Talk(SAY_ALGALON_INTRO_1); + break; + case EVENT_INTRO_2: + DoCastAOE(SPELL_SUMMON_AZEROTH, true); + Talk(SAY_ALGALON_INTRO_2); + break; + case EVENT_INTRO_3: + Talk(SAY_ALGALON_INTRO_3); + break; + case EVENT_INTRO_FINISH: + events.Reset(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + break; + case EVENT_START_COMBAT: + instance->SetBossState(BOSS_ALGALON, IN_PROGRESS); + break; + case EVENT_INTRO_TIMER_DONE: + { + events.SetPhase(PHASE_NORMAL); + me->SetSheath(SHEATH_STATE_MELEE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_DEFENSIVE); + DoCastAOE(SPELL_SUPERMASSIVE_FAIL, true); + //! Workaround for Creature::_IsTargetAcceptable returning false + //! for creatures that start combat in REACT_PASSIVE and UNIT_FLAG_NOT_SELECTABLE + //! causing them to immediately evade + if (!me->getThreatManager().isThreatListEmpty()) + AttackStart(me->getThreatManager().getHostilTarget()); + for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i) + if (Creature* summon = DoSummon(NPC_LIVING_CONSTELLATION, ConstellationPos[i], 0, TEMPSUMMON_DEAD_DESPAWN)) + summon->SetReactState(REACT_PASSIVE); + + std::list stalkers; + me->GetCreatureListWithEntryInGrid(stalkers, NPC_ALGALON_STALKER, 200.0f); + if (!stalkers.empty()) + { + Unit* stalker = Trinity::Containers::SelectRandomContainerElement(stalkers); + stalker->m_Events.AddEvent(new ActivateLivingConstellation(stalker), stalker->m_Events.CalculateTime(urand(45000, 50000))); + } + break; + } + case EVENT_QUANTUM_STRIKE: + DoCastVictim(SPELL_QUANTUM_STRIKE); + events.ScheduleEvent(EVENT_QUANTUM_STRIKE, urand(3000, 5000)); + break; + case EVENT_PHASE_PUNCH: + DoCastVictim(SPELL_PHASE_PUNCH); + events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500); + break; + case EVENT_SUMMON_COLLAPSING_STAR: + Talk(SAY_ALGALON_COLLAPSING_STAR); + Talk(EMOTE_ALGALON_COLLAPSING_STAR); + for (uint32 i = 0; i < COLLAPSING_STAR_COUNT; ++i) + me->SummonCreature(NPC_COLLAPSING_STAR, CollapsingStarPos[i], TEMPSUMMON_CORPSE_DESPAWN); + events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 60000); + break; + case EVENT_BIG_BANG: + { + Talk(SAY_ALGALON_BIG_BANG); + Talk(EMOTE_ALGALON_BIG_BANG); + events.SetPhase(PHASE_BIG_BANG); + std::list constellations; + me->GetCreatureListWithEntryInGrid(constellations, NPC_LIVING_CONSTELLATION, 200.0f); + for (std::list::iterator itr = constellations.begin(); itr != constellations.end(); ++itr) + (*itr)->AI()->DoAction(ACTION_BIG_BANG); + DoCastAOE(SPELL_BIG_BANG); + events.ScheduleEvent(EVENT_BIG_BANG, 90500); + events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500); + break; + } + case EVENT_RESUME_UPDATING: + events.SetPhase(0); + break; + case EVENT_ASCEND_TO_THE_HEAVENS: + Talk(SAY_ALGALON_ASCEND); + DoCastAOE(SPELL_ASCEND_TO_THE_HEAVENS); + events.ScheduleEvent(EVENT_EVADE, 2500); + break; + case EVENT_EVADE: + EnterEvadeMode(); + break; + case EVENT_COSMIC_SMASH: + Talk(EMOTE_ALGALON_COSMIC_SMASH); + DoCastAOE(SPELL_COSMIC_SMASH); + events.ScheduleEvent(EVENT_COSMIC_SMASH, 25500); + break; + case EVENT_UNLOCK_YELL: + _hasYelled = false; + break; + case EVENT_OUTRO_START: + instance->SetBossState(BOSS_ALGALON, DONE); + break; + case EVENT_OUTRO_1: + me->RemoveAllAuras(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME); + break; + case EVENT_OUTRO_2: + _EnterEvadeMode(); + me->AddUnitState(UNIT_STATE_EVADE); + me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos); + break; + case EVENT_OUTRO_3: + DoCastAOE(SPELL_KILL_CREDIT); + break; + case EVENT_OUTRO_4: + DoCastAOE(SPELL_SUPERMASSIVE_FAIL); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + break; + case EVENT_OUTRO_5: + if (Creature* brann = DoSummon(NPC_BRANN_BRONZBEARD_ALG, BrannOutroPos[0], 131500, TEMPSUMMON_TIMED_DESPAWN)) + brann->AI()->DoAction(ACTION_OUTRO); + break; + case EVENT_OUTRO_6: + Talk(SAY_ALGALON_OUTRO_1); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + break; + case EVENT_OUTRO_7: + Talk(SAY_ALGALON_OUTRO_2); + break; + case EVENT_OUTRO_8: + Talk(SAY_ALGALON_OUTRO_3); + break; + case EVENT_OUTRO_9: + Talk(SAY_ALGALON_OUTRO_4); + break; + case EVENT_OUTRO_10: + Talk(SAY_ALGALON_OUTRO_5); + break; + case EVENT_OUTRO_11: + me->SetStandState(UNIT_STAND_STATE_STAND); + DoCast(me, SPELL_TELEPORT); + me->DespawnOrUnsummon(1500); + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + bool _firstPull; + bool _fedOnTears; + bool _phaseTwo; + bool _fightWon; + bool _hasYelled; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetUlduarAI(creature); + } +}; + +class npc_living_constellation : public CreatureScript +{ + public: + npc_living_constellation() : CreatureScript("npc_living_constellation") { } + + struct npc_living_constellationAI : public CreatureAI + { + npc_living_constellationAI(Creature* creature) : CreatureAI(creature) + { + } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500); + _isActive = false; + } + + uint32 GetData(uint32 /*type*/) + { + return _isActive ? 1 : 0; + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_ACTIVATE_STAR: + if (Creature* algalon = me->FindNearestCreature(NPC_ALGALON, 200.0f)) + { + if (Unit* target = algalon->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(algalon))) + { + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + AttackStart(target); + DoZoneInCombat(); + _isActive = true; + } + } + break; + case ACTION_BIG_BANG: + _events.SetPhase(PHASE_BIG_BANG); + _events.DelayEvents(9500); + _events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500); + break; + } + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || caster->GetTypeId() != TYPEID_UNIT) + return; + + me->DespawnOrUnsummon(1); + if (InstanceScript* instance = me->GetInstanceScript()) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START); + caster->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK); + caster->ToCreature()->DespawnOrUnsummon(1); + } + + void UpdateAI(uint32 const diff) + { + if (!(_events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ARCANE_BARRAGE: + DoCastAOE(SPELL_ARCANE_BARRAGE); + _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500); + break; + case EVENT_RESUME_UPDATING: + _events.SetPhase(0); + break; + } + } + } + + private: + EventMap _events; + bool _isActive; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetUlduarAI(creature); + } +}; + +class npc_collapsing_star : public CreatureScript +{ + public: + npc_collapsing_star() : CreatureScript("npc_collapsing_star") { } + + struct npc_collapsing_starAI : public PassiveAI + { + npc_collapsing_starAI(Creature* creature) : PassiveAI(creature) + { + _dying = false; + } + + void JustSummoned(Creature* summon) + { + if (summon->GetEntry() != NPC_BLACK_HOLE) + return; + + if (TempSummon* summ = me->ToTempSummon()) + if (Creature* algalon = ObjectAccessor::GetCreature(*me, summ->GetSummonerGUID())) + algalon->AI()->JustSummoned(summon); + + me->DespawnOrUnsummon(1); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) + { + if (_dying) + { + damage = 0; + return; + } + + if (damage >= me->GetHealth()) + { + _dying = true; + damage = 0; + DoCast(me, SPELL_BLACK_HOLE_SPAWN_VISUAL, true); + DoCast(me, SPELL_SUMMON_BLACK_HOLE, true); + } + } + + bool _dying; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetUlduarAI(creature); + } +}; + +class npc_brann_bronzebeard_algalon : public CreatureScript +{ + public: + npc_brann_bronzebeard_algalon() : CreatureScript("npc_brann_bronzebeard_algalon") { } + + struct npc_brann_bronzebeard_algalonAI : public CreatureAI + { + npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature) + { + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_START_INTRO: + _currentPoint = 0; + _events.Reset(); + me->SetWalk(false); + _events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1); + break; + case ACTION_FINISH_INTRO: + Talk(SAY_BRANN_ALGALON_INTRO_2); + _events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1); + break; + case ACTION_OUTRO: + me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO, BrannOutroPos[1]); + _events.ScheduleEvent(EVENT_BRANN_OUTRO_1, 89500); + _events.ScheduleEvent(EVENT_BRANN_OUTRO_2, 116500); + break; + } + } + + void MovementInform(uint32 movementType, uint32 pointId) + { + if (movementType != POINT_MOTION_TYPE) + return; + + uint32 delay = 1; + _currentPoint = pointId + 1; + switch (pointId) + { + case 2: + delay = 8000; + me->SetWalk(true); + break; + case 5: + me->SetWalk(false); + Talk(SAY_BRANN_ALGALON_INTRO_1); + _events.ScheduleEvent(EVENT_SUMMON_ALGALON, 7500); + return; + case 9: + me->DespawnOrUnsummon(1); + return; + case POINT_BRANN_OUTRO: + case POINT_BRANN_OUTRO_END: + return; + } + + _events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay); + } + + void UpdateAI(uint32 const diff) + { + UpdateVictim(); + + if (_events.Empty()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BRANN_MOVE_INTRO: + if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO) + me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]); + break; + case EVENT_SUMMON_ALGALON: + if (Creature* algalon = me->GetMap()->SummonCreature(NPC_ALGALON, AlgalonSummonPos)) + algalon->AI()->DoAction(ACTION_START_INTRO); + break; + case EVENT_BRANN_OUTRO_1: + Talk(SAY_BRANN_ALGALON_OUTRO); + break; + case EVENT_BRANN_OUTRO_2: + me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO_END, BrannOutroPos[2]); + break; + } + } + } + + private: + EventMap _events; + uint32 _currentPoint; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetUlduarAI(creature); + } +}; + +class go_celestial_planetarium_access : public GameObjectScript +{ + public: + go_celestial_planetarium_access() : GameObjectScript("go_celestial_planetarium_access") {} + + struct go_celestial_planetarium_accessAI : public GameObjectAI + { + go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go) + { + } + + bool GossipHello(Player* player) + { + bool hasKey = true; + if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId)) + { + hasKey = false; + for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) + { + if (!lock->Index[i]) + continue; + + if (player->HasItemCount(lock->Index[i], 1)) + { + hasKey = true; + break; + } + } + } + + if (!hasKey) + return false; + + // Start Algalon event + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + _events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000); + if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) + brann->AI()->DoAction(ACTION_START_INTRO); + + if (InstanceScript* instance = go->GetInstanceScript()) + { + instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); + if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(DATA_SIGILDOOR_01))) + sigil->SetGoState(GO_STATE_ACTIVE); + + if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(DATA_SIGILDOOR_02))) + sigil->SetGoState(GO_STATE_ACTIVE); + } + + return false; + } + + void UpdateAI(uint32 diff) + { + if (_events.Empty()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DESPAWN_CONSOLE: + go->Delete(); + break; + } + } + } + + EventMap _events; + }; + + GameObjectAI* GetAI(GameObject* go) const + { + return GetUlduarAI(go); + } +}; + +class spell_algalon_phase_punch : public SpellScriptLoader +{ + public: + spell_algalon_phase_punch() : SpellScriptLoader("spell_algalon_phase_punch") { } + + class spell_algalon_phase_punch_AuraScript : public AuraScript + { + PrepareAuraScript(spell_algalon_phase_punch_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (GetStackAmount() != 1) + GetTarget()->RemoveAurasDueToSpell(PhasePunchAlphaId[GetStackAmount() - 2]); + GetTarget()->CastSpell(GetTarget(), PhasePunchAlphaId[GetStackAmount() - 1], TRIGGERED_FULL_MASK); + if (GetStackAmount() == 5) + Remove(AURA_REMOVE_BY_DEFAULT); + } + + void OnRemove(AuraEffect const*, AuraEffectHandleModes) + { + if (GetStackAmount() != 5) + GetTarget()->RemoveAurasDueToSpell(PhasePunchAlphaId[GetStackAmount() - 1]); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_phase_punch_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectRemove += AuraEffectRemoveFn(spell_algalon_phase_punch_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_algalon_phase_punch_AuraScript(); + } +}; + +class NotVictimFilter +{ + public: + NotVictimFilter(Unit* caster) : _victim(caster->getVictim()) + { + } + + bool operator()(Unit* target) + { + return target != _victim; + } + + private: + Unit* _victim; +}; + +class spell_algalon_arcane_barrage : public SpellScriptLoader +{ + public: + spell_algalon_arcane_barrage() : SpellScriptLoader("spell_algalon_arcane_barrage") { } + + class spell_algalon_arcane_barrage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_arcane_barrage_SpellScript); + + void SelectTarget(std::list& targets) + { + targets.remove_if(NotVictimFilter(GetCaster())); + } + + void Register() + { + OnUnitTargetSelect += SpellUnitTargetFn(spell_algalon_arcane_barrage_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_arcane_barrage_SpellScript(); + } +}; + +class ActiveConstellationFilter +{ + public: + bool operator()(Unit* target) const + { + return target->GetAI()->GetData(0); + } +}; + +class spell_algalon_trigger_3_adds : public SpellScriptLoader +{ + public: + spell_algalon_trigger_3_adds() : SpellScriptLoader("spell_algalon_trigger_3_adds") { } + + class spell_algalon_trigger_3_adds_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_trigger_3_adds_SpellScript); + + void SelectTarget(std::list& targets) + { + targets.remove_if(ActiveConstellationFilter()); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Creature* target = GetHitCreature(); + if (!target) + return; + + target->AI()->DoAction(ACTION_ACTIVATE_STAR); + } + + void Register() + { + OnUnitTargetSelect += SpellUnitTargetFn(spell_algalon_trigger_3_adds_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_trigger_3_adds_SpellScript(); + } +}; + +class spell_algalon_collapse : public SpellScriptLoader +{ + public: + spell_algalon_collapse() : SpellScriptLoader("spell_algalon_collapse") { } + + class spell_algalon_collapse_AuraScript : public AuraScript + { + PrepareAuraScript(spell_algalon_collapse_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetTarget()->DealDamage(GetTarget(), GetTarget()->CountPctFromMaxHealth(1), NULL, NODAMAGE); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_collapse_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_algalon_collapse_AuraScript(); + } +}; + +class spell_algalon_big_bang : public SpellScriptLoader +{ + public: + spell_algalon_big_bang() : SpellScriptLoader("spell_algalon_big_bang") { } + + class spell_algalon_big_bang_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_big_bang_SpellScript); + + bool Load() + { + _targetCount = 0; + return true; + } + + void CountTargets(std::list& targets) + { + _targetCount = targets.size(); + } + + void CheckTargets() + { + if (!_targetCount) + GetCaster()->GetAI()->DoAction(ACTION_ASCEND); + } + + void Register() + { + OnUnitTargetSelect += SpellUnitTargetFn(spell_algalon_big_bang_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + AfterCast += SpellCastFn(spell_algalon_big_bang_SpellScript::CheckTargets); + } + + uint32 _targetCount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_big_bang_SpellScript(); + } +}; + +class spell_algalon_remove_phase : public SpellScriptLoader +{ + public: + spell_algalon_remove_phase() : SpellScriptLoader("spell_algalon_remove_phase") { } + + class spell_algalon_remove_phase_AuraScript : public AuraScript + { + PrepareAuraScript(spell_algalon_remove_phase_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetTarget()->RemoveAurasByType(SPELL_AURA_PHASE); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_remove_phase_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_algalon_remove_phase_AuraScript(); + } +}; + +class spell_algalon_cosmic_smash : public SpellScriptLoader +{ + public: + spell_algalon_cosmic_smash() : SpellScriptLoader("spell_algalon_cosmic_smash") { } + + class spell_algalon_cosmic_smash_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_cosmic_smash_SpellScript); + + void ModDestHeight(SpellEffIndex /*effIndex*/) + { + Position offset = {0.0f, 0.0f, 65.0f, 0.0f}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); + GetHitDest()->RelocateOffset(offset); + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_algalon_cosmic_smash_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_cosmic_smash_SpellScript(); + } +}; + +class spell_algalon_cosmic_smash_damage : public SpellScriptLoader +{ + public: + spell_algalon_cosmic_smash_damage() : SpellScriptLoader("spell_algalon_cosmic_smash_damage") { } + + class spell_algalon_cosmic_smash_damage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_cosmic_smash_damage_SpellScript); + + void RecalculateDamage() + { + if (!GetExplTargetDest() || !GetHitUnit()) + return; + + float distance = GetHitUnit()->GetDistance2d(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY()); + if (distance > 6.0f) + SetHitDamage(int32(float(GetHitDamage()) / distance) * 2); + } + + void Register() + { + OnHit += SpellHitFn(spell_algalon_cosmic_smash_damage_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_cosmic_smash_damage_SpellScript(); + } +}; + +class spell_algalon_supermassive_fail : public SpellScriptLoader +{ + public: + spell_algalon_supermassive_fail() : SpellScriptLoader("spell_algalon_supermassive_fail") { } + + class spell_algalon_supermassive_fail_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_supermassive_fail_SpellScript); + + void RecalculateDamage() + { + if (!GetHitPlayer()) + return; + + GetHitPlayer()->GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT, GetSpellInfo()->Id, true); + } + + void Register() + { + OnHit += SpellHitFn(spell_algalon_supermassive_fail_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_supermassive_fail_SpellScript(); + } +}; + +class achievement_he_feeds_on_your_tears : public AchievementCriteriaScript +{ + public: + achievement_he_feeds_on_your_tears() : AchievementCriteriaScript("achievement_he_feeds_on_your_tears") { } + + bool OnCheck(Player* /*source*/, Unit* target) + { + return !target->GetAI()->GetData(DATA_HAS_FED_ON_TEARS); + } +}; + +void AddSC_boss_algalon_the_observer() +{ + new boss_algalon_the_observer(); + new npc_living_constellation(); + new npc_collapsing_star(); + new npc_brann_bronzebeard_algalon(); + new go_celestial_planetarium_access(); + new spell_algalon_phase_punch(); + new spell_algalon_arcane_barrage(); + new spell_algalon_trigger_3_adds(); + new spell_algalon_collapse(); + new spell_algalon_big_bang(); + new spell_algalon_remove_phase(); + new spell_algalon_cosmic_smash(); + new spell_algalon_cosmic_smash_damage(); + new spell_algalon_supermassive_fail(); + new achievement_he_feeds_on_your_tears(); +} 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 eadc524348b..0967c38c2e7 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 @@ -251,7 +251,7 @@ class boss_steelbreaker : public CreatureScript } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoScriptText(RAND(SAY_STEELBREAKER_DEATH_1, SAY_STEELBREAKER_DEATH_2), me); if (IsEncounterComplete(instance, me)) @@ -375,7 +375,7 @@ class boss_runemaster_molgeim : public CreatureScript } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoScriptText(RAND(SAY_MOLGEIM_DEATH_1, SAY_MOLGEIM_DEATH_2), me); if (IsEncounterComplete(instance, me)) @@ -575,7 +575,7 @@ class boss_stormcaller_brundir : public CreatureScript _Reset(); phase = 0; me->RemoveAllAuras(); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); // Should be interruptable unless overridden by spell (Overload) me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, false); // Reset immumity, Brundir should be stunnable by default RespawnEncounter(instance, me); @@ -616,7 +616,7 @@ class boss_stormcaller_brundir : public CreatureScript } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoScriptText(RAND(SAY_BRUNDIR_DEATH_1, SAY_BRUNDIR_DEATH_2), me); if (IsEncounterComplete(instance, me)) @@ -681,7 +681,7 @@ class boss_stormcaller_brundir : public CreatureScript DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS_10M, SPELL_LIGHTNING_TENDRILS_25M)); DoCast(SPELL_LIGHTNING_TENDRILS_VISUAL); me->AttackStop(); - //me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + //me->SetLevitate(true); me->GetMotionMaster()->Initialize(); me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), FINAL_FLIGHT_Z); events.DelayEvents(35000); @@ -708,7 +708,7 @@ class boss_stormcaller_brundir : public CreatureScript events.ScheduleEvent(EVENT_GROUND, 2500); break; case EVENT_GROUND: - //me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + //me->SetLevitate(false); me->RemoveAurasDueToSpell(RAID_MODE(SPELL_LIGHTNING_TENDRILS_10M, SPELL_LIGHTNING_TENDRILS_25M)); me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_VISUAL); DoStartMovement(me->getVictim()); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 1c478cd83e9..472ff153d73 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -204,7 +204,7 @@ class boss_auriaya : public CreatureScript } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); _JustDied(); @@ -298,14 +298,14 @@ class npc_auriaya_seeping_trigger : public CreatureScript void Reset() { - me->ForcedDespawn(600000); + me->DespawnOrUnsummon(600000); DoCast(me, SPELL_SEEPING_ESSENCE); } void UpdateAI(uint32 const /*diff*/) { if (instance->GetBossState(BOSS_AURIAYA) != IN_PROGRESS) - me->ForcedDespawn(); + me->DespawnOrUnsummon(); } private: @@ -376,7 +376,7 @@ class npc_sanctum_sentry : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Auriaya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_AURIAYA))) Auriaya->AI()->DoAction(ACTION_CRAZY_CAT_LADY); @@ -451,7 +451,7 @@ class npc_feral_defender : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { DoCast(me, SPELL_SUMMON_ESSENCE); if (Creature* Auriaya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_AURIAYA))) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index c4f973726bc..0e453eceaa1 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -26,6 +26,10 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" #include "CombatAI.h" #include "PassiveAI.h" #include "ObjectMgr.h" @@ -167,7 +171,7 @@ enum Yells enum MiscellanousData { - // Other actions are in Ulduar.h + // Other Actions are in Ulduar.h ACTION_START_HARD_MODE = 5, ACTION_SPAWN_VEHICLES = 6, // Amount of seats depending on Raid mode @@ -324,7 +328,7 @@ class boss_flame_leviathan : public CreatureScript DoScriptText(SAY_AGGRO, me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { _JustDied(); // Set Field Flags 67108928 = 64 | 67108864 = UNIT_FLAG_UNK_6 | UNIT_FLAG_SKINNABLE @@ -573,7 +577,7 @@ class boss_flame_leviathan_seat : public CreatureScript { ASSERT(vehicle); me->SetReactState(REACT_PASSIVE); - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); instance = creature->GetInstanceScript(); } @@ -639,7 +643,7 @@ class boss_flame_leviathan_defense_cannon : public CreatureScript uint32 NapalmTimer; - void Reset () + void Reset() { NapalmTimer = 5*IN_MILLISECONDS; DoCast(me, AURA_STEALTH_DETECTION); @@ -883,7 +887,7 @@ class npc_colossus : public CreatureScript InstanceScript* instance; - void JustDied(Unit* /*Who*/) + void JustDied(Unit* /*killer*/) { if (me->GetHomePosition().IsInDist(Center, 50.f)) instance->SetData(DATA_COLOSSUS, instance->GetData(DATA_COLOSSUS)+1); @@ -960,8 +964,9 @@ public: me->SetReactState(REACT_PASSIVE); } - void WaypointReached(uint32 /*i*/) + void WaypointReached(uint32 /*waypointId*/) { + } void Reset() @@ -1151,7 +1156,7 @@ class npc_lorekeeper : public CreatureScript } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); InstanceScript* instance = creature->GetInstanceScript(); @@ -1224,10 +1229,10 @@ class npc_brann_bronzebeard : public CreatureScript public: npc_brann_bronzebeard() : CreatureScript("npc_brann_bronzebeard") { } - //bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction) + //bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) //{ // player->PlayerTalkClass->ClearMenus(); - // switch(uiAction) + // switch(action) // { // case GOSSIP_ACTION_INFO_DEF+1: // if (player) @@ -1268,7 +1273,7 @@ class go_ulduar_tower : public GameObjectScript public: go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { } - void OnDestroyed(GameObject* go, Player* /*player*/, uint32 /*value*/) + void OnDestroyed(GameObject* go, Player* /*player*/) { InstanceScript* instance = go->GetInstanceScript(); if (!instance) @@ -1673,7 +1678,7 @@ class spell_pursue : public SpellScriptLoader else { //! In the end, only one target should be selected - _target = SelectRandomContainerElement(targets); + _target = Trinity::Containers::SelectRandomContainerElement(targets); FilterTargetsSubsequently(targets); } } @@ -1681,7 +1686,7 @@ class spell_pursue : public SpellScriptLoader void FilterTargetsSubsequently(std::list& targets) { targets.clear(); - if(_target) + if (_target) targets.push_back(_target); } @@ -1738,7 +1743,7 @@ class spell_vehicle_throw_passenger : public SpellScriptLoader { // use 99 because it is 3d search std::list targetList; - Trinity::WorldObjectSpellAreaTargetCheck check(99, GetTargetDest(), GetCaster(), GetCaster(), GetSpellInfo(), TARGET_CHECK_DEFAULT, NULL); + Trinity::WorldObjectSpellAreaTargetCheck check(99, GetExplTargetDest(), GetCaster(), GetCaster(), GetSpellInfo(), TARGET_CHECK_DEFAULT, NULL); Trinity::WorldObjectListSearcher searcher(GetCaster(), targetList, check); GetCaster()->GetMap()->VisitAll(GetCaster()->m_positionX, GetCaster()->m_positionY, 99, searcher); float minDist = 99 * 99; @@ -1752,7 +1757,7 @@ class spell_vehicle_throw_passenger : public SpellScriptLoader if (Unit* device = seat->GetPassenger(2)) if (!device->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) { - float dist = unit->GetExactDistSq(targets.GetDst()); + float dist = unit->GetExactDistSq(targets.GetDstPos()); if (dist < minDist) { minDist = dist; @@ -1760,13 +1765,13 @@ class spell_vehicle_throw_passenger : public SpellScriptLoader } } } - if (target && target->IsWithinDist2d(targets.GetDst(), GetSpellInfo()->Effects[effIndex].CalcRadius() * 2)) // now we use *2 because the location of the seat is not correct + if (target && target->IsWithinDist2d(targets.GetDstPos(), GetSpellInfo()->Effects[effIndex].CalcRadius() * 2)) // now we use *2 because the location of the seat is not correct passenger->EnterVehicle(target, 0); else { passenger->ExitVehicle(); float x, y, z; - targets.GetDst()->GetPosition(x, y, z); + targets.GetDstPos()->GetPosition(x, y, z); passenger->GetMotionMaster()->MoveJump(x, y, z, targets.GetSpeedXY(), targets.GetSpeedZ()); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 159e2a9702b..a3c9cb847e5 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -245,7 +245,7 @@ class npc_iron_roots : public CreatureScript me->SetInCombatWith(summoner); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Player* target = ObjectAccessor::GetPlayer(*me, summonerGUID)) { @@ -507,7 +507,7 @@ class boss_freya : public CreatureScript for (uint8 n = 0; n < 3; ++n) { summons.remove(Elemental[n][i]->GetGUID()); - Elemental[n][i]->ForcedDespawn(5000); + Elemental[n][i]->DespawnOrUnsummon(5000); trioDefeated[i] = true; Elemental[n][i]->CastSpell(me, SPELL_REMOVE_10STACK, true); } @@ -590,7 +590,7 @@ class boss_freya : public CreatureScript waveCount++; } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { //! Freya's chest is dynamically spawned on death by different spells. const uint32 summonSpell[2][4] = @@ -664,12 +664,12 @@ class boss_freya : public CreatureScript case NPC_DETONATING_LASHER: summoned->CastSpell(me, SPELL_REMOVE_2STACK, true); summoned->CastSpell(who, SPELL_DETONATE, true); - summoned->ForcedDespawn(5000); + summoned->DespawnOrUnsummon(5000); summons.remove(summoned->GetGUID()); break; case NPC_ANCIENT_CONSERVATOR: summoned->CastSpell(me, SPELL_REMOVE_25STACK, true); - summoned->ForcedDespawn(5000); + summoned->DespawnOrUnsummon(5000); summons.remove(summoned->GetGUID()); break; } @@ -710,12 +710,12 @@ class boss_elder_brightleaf : public CreatureScript DoScriptText(RAND(SAY_BRIGHTLEAF_SLAY_1, SAY_BRIGHTLEAF_SLAY_2), me); } - void JustDied(Unit* who) + void JustDied(Unit* killer) { _JustDied(); DoScriptText(SAY_BRIGHTLEAF_DEATH, me); - if (who && who->GetTypeId() == TYPEID_PLAYER) + if (killer && killer->GetTypeId() == TYPEID_PLAYER) { if (Creature* Ironbranch = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_IRONBRANCH))) Ironbranch->AI()->DoAction(ACTION_ELDER_DEATH); @@ -830,12 +830,12 @@ class boss_elder_stonebark : public CreatureScript DoScriptText(RAND(SAY_STONEBARK_SLAY_1, SAY_STONEBARK_SLAY_2), me); } - void JustDied(Unit* who) + void JustDied(Unit* killer) { _JustDied(); DoScriptText(SAY_STONEBARK_DEATH, me); - if (who && who->GetTypeId() == TYPEID_PLAYER) + if (killer && killer->GetTypeId() == TYPEID_PLAYER) { if (Creature* Ironbranch = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_IRONBRANCH))) Ironbranch->AI()->DoAction(ACTION_ELDER_DEATH); @@ -956,12 +956,12 @@ class boss_elder_ironbranch : public CreatureScript DoScriptText(RAND(SAY_IRONBRANCH_SLAY_1, SAY_IRONBRANCH_SLAY_2), me); } - void JustDied(Unit* who) + void JustDied(Unit* killer) { _JustDied(); DoScriptText(SAY_IRONBRANCH_DEATH, me); - if (who && who->GetTypeId() == TYPEID_PLAYER) + if (killer && killer->GetTypeId() == TYPEID_PLAYER) { if (Creature* Brightleaf = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_BRIGHTLEAF))) Brightleaf->AI()->DoAction(ACTION_ELDER_DEATH); @@ -1138,7 +1138,7 @@ class npc_ancient_water_spirit : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) { @@ -1204,7 +1204,7 @@ class npc_storm_lasher : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) { @@ -1251,7 +1251,7 @@ class npc_snaplasher : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) { @@ -1385,7 +1385,7 @@ class npc_healthy_spore : public CreatureScript if (lifeTimer <= diff) { me->RemoveAurasDueToSpell(SPELL_GROW); - me->ForcedDespawn(2200); + me->DespawnOrUnsummon(2200); lifeTimer = urand(22000, 30000); } else @@ -1423,7 +1423,7 @@ class npc_eonars_gift : public CreatureScript { me->RemoveAurasDueToSpell(SPELL_GROW); DoCast(SPELL_LIFEBINDERS_GIFT); - me->ForcedDespawn(2500); + me->DespawnOrUnsummon(2500); lifeBindersGiftTimer = 12000; } else diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index c7918f85245..3556bf188de 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -211,7 +211,7 @@ class boss_general_vezax : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); @@ -290,7 +290,7 @@ class boss_general_vezax : public CreatureScript if (size < playersMin) return NULL; - return SelectRandomContainerElement(PlayerList); + return Trinity::Containers::SelectRandomContainerElement(PlayerList); } return NULL; @@ -323,7 +323,7 @@ class boss_saronite_animus : public CreatureScript events.ScheduleEvent(EVENT_PROFOUND_OF_DARKNESS, 3000); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Vezax = me->GetCreature(*me, instance->GetData64(BOSS_VEZAX))) Vezax->AI()->DoAction(ACTION_ANIMUS_DIE); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 33f50d0b3de..c9fe1c5b707 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -179,7 +179,7 @@ class npc_flash_freeze : public CreatureScript npc_flash_freezeAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); } @@ -246,7 +246,7 @@ class npc_ice_block : public CreatureScript npc_ice_blockAI(Creature* creature) : ScriptedAI(creature) { instance = me->GetInstanceScript(); - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); targetGUID = 0; } @@ -512,7 +512,7 @@ class npc_icicle : public CreatureScript { npc_icicleAI(Creature* creature) : ScriptedAI(creature) { - me->SetDisplayId(me->GetCreatureInfo()->Modelid1); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); } @@ -560,7 +560,7 @@ class npc_snowpacked_icicle : public CreatureScript { npc_snowpacked_icicleAI(Creature* creature) : ScriptedAI(creature) { - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); me->SetReactState(REACT_PASSIVE); } @@ -651,7 +651,7 @@ class npc_hodir_priest : public CreatureScript DoSpellAttackIfReady(SPELL_SMITE); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); @@ -713,7 +713,7 @@ class npc_hodir_shaman : public CreatureScript DoSpellAttackIfReady(SPELL_LAVA_BURST); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); @@ -774,7 +774,7 @@ class npc_hodir_druid : public CreatureScript DoSpellAttackIfReady(SPELL_WRATH); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); @@ -854,7 +854,7 @@ class npc_hodir_mage : public CreatureScript DoSpellAttackIfReady(SPELL_FIREBALL); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); @@ -881,7 +881,7 @@ class npc_toasty_fire : public CreatureScript { npc_toasty_fireAI(Creature* creature) : ScriptedAI(creature) { - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); } void Reset() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index d8a3ef0b8df..540876f421b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -148,7 +148,7 @@ class boss_ignis : public CreatureScript instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { _JustDied(); DoScriptText(SAY_DEATH, me); @@ -371,15 +371,15 @@ class npc_scorch_ground : public CreatureScript creature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields } - void MoveInLineOfSight(Unit* unit) + void MoveInLineOfSight(Unit* who) { if (!_heat) { - if (unit->GetEntry() == NPC_IRON_CONSTRUCT) + if (who->GetEntry() == NPC_IRON_CONSTRUCT) { - if (!unit->HasAura(SPELL_HEAT) || !unit->HasAura(SPELL_MOLTEN)) + if (!who->HasAura(SPELL_HEAT) || !who->HasAura(SPELL_MOLTEN)) { - _constructGUID = unit->GetGUID(); + _constructGUID = who->GetGUID(); _heat = true; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index d5034e4827e..d89d640b083 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -135,7 +135,7 @@ class boss_kologarn : public CreatureScript eyebeamTarget = 0; } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); DoCast(SPELL_KOLOGARN_PACIFY); @@ -184,11 +184,8 @@ class boss_kologarn : public CreatureScript if (Creature* rubbleStalker = who->FindNearestCreature(NPC_RUBBLE_STALKER, 70.0f)) { - if (rubbleStalker) - { - rubbleStalker->CastSpell(rubbleStalker, SPELL_FALLING_RUBBLE, true); - rubbleStalker->CastSpell(rubbleStalker, SPELL_SUMMON_RUBBLE, true); - } + rubbleStalker->CastSpell(rubbleStalker, SPELL_FALLING_RUBBLE, true); + rubbleStalker->CastSpell(rubbleStalker, SPELL_SUMMON_RUBBLE, true); } if (!right && !left) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 45f9a1fa012..e8e938dc06b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -177,7 +177,7 @@ class boss_razorscale_controller : public CreatureScript { boss_razorscale_controllerAI(Creature* creature) : BossAI(creature, DATA_RAZORSCALE_CONTROL) { - me->SetDisplayId(me->GetCreatureInfo()->Modelid2); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); } void Reset() @@ -211,7 +211,7 @@ class boss_razorscale_controller : public CreatureScript } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); } @@ -330,7 +330,7 @@ class boss_razorscale : public CreatureScript void Reset() { _Reset(); - me->SetFlying(true); + me->SetCanFly(true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); PermaGround = false; @@ -354,7 +354,7 @@ class boss_razorscale : public CreatureScript events.ScheduleEvent(EVENT_FLIGHT, 0, 0, PHASE_GROUND); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { _JustDied(); if (Creature* controller = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_RAZORSCALE_CONTROL) : 0)) @@ -419,7 +419,7 @@ class boss_razorscale : public CreatureScript case EVENT_FLIGHT: phase = PHASE_FLIGHT; events.SetPhase(PHASE_FLIGHT); - me->SetFlying(true); + me->SetCanFly(true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); me->AttackStop(); @@ -430,7 +430,7 @@ class boss_razorscale : public CreatureScript ++FlyCount; return; case EVENT_LAND: - me->SetFlying(false); + me->SetCanFly(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXPEDITION_COMMANDER) : 0)) @@ -524,7 +524,7 @@ class boss_razorscale : public CreatureScript me->MonsterTextEmote(EMOTE_PERMA, 0, true); phase = PHASE_PERMAGROUND; events.SetPhase(PHASE_PERMAGROUND); - me->SetFlying(false); + me->SetCanFly(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); me->RemoveAurasDueToSpell(SPELL_HARPOON_TRIGGER); @@ -647,7 +647,7 @@ class npc_expedition_commander : public CreatureScript for (uint8 n = 0; n < RAID_MODE(2, 4); n++) { Engineer[n] = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - Engineer[n]->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Engineer[n]->SetWalk(false); Engineer[n]->SetSpeed(MOVE_RUN, 0.5f); Engineer[n]->SetHomePosition(PosEngRepair[n]); Engineer[n]->GetMotionMaster()->MoveTargetedHome(); @@ -660,7 +660,7 @@ class npc_expedition_commander : public CreatureScript for (uint8 n = 0; n < 4; n++) { Defender[n] = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - Defender[n]->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Defender[n]->SetWalk(false); Defender[n]->SetHomePosition(PosDefCombat[n]); Defender[n]->GetMotionMaster()->MoveTargetedHome(); } @@ -1006,7 +1006,7 @@ class spell_razorscale_devouring_flame : public SpellScriptLoader PreventHitDefaultEffect(effIndex); Unit* caster = GetCaster(); uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); - WorldLocation const* summonLocation = GetTargetDest(); + WorldLocation const* summonLocation = GetExplTargetDest(); if (!caster || !summonLocation) return; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index 72741ee0679..084cd3e0f86 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -73,7 +73,7 @@ public: DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); _JustDied(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 724eb45d586..c7091b42c5a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -244,7 +244,7 @@ class boss_xt002 : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); _JustDied(); @@ -947,13 +947,19 @@ class spell_xt002_tympanic_tantrum : public SpellScriptLoader void FilterTargets(std::list& unitList) { - unitList.remove_if (PlayerOrPetCheck()); + unitList.remove_if(PlayerOrPetCheck()); + } + + void RecalculateDamage() + { + SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(GetHitDamage())); } void Register() { OnUnitTargetSelect += SpellUnitTargetFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); OnUnitTargetSelect += SpellUnitTargetFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnHit += SpellHitFn(spell_xt002_tympanic_tantrum_SpellScript::RecalculateDamage); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp index 3f01f21b189..58ba125b994 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp @@ -18,18 +18,27 @@ #include "ScriptMgr.h" #include "ulduar.h" -enum Sara_Yells +enum Sara { - SAY_SARA_PREFIGHT_1 = -1603310, - SAY_SARA_PREFIGHT_2 = -1603311, - SAY_SARA_AGGRO_1 = -1603312, - SAY_SARA_AGGRO_2 = -1603313, - SAY_SARA_AGGRO_3 = -1603314, - SAY_SARA_SLAY_1 = -1603315, - SAY_SARA_SLAY_2 = -1603316, - WHISP_SARA_INSANITY = -1603317, - SAY_SARA_PHASE2_1 = -1603318, - SAY_SARA_PHASE2_2 = -1603319, + // text + YELL_SARA_PREFIGHT = 0, + YELL_COMBAT_PHASE_1 = 1, + YELL_COMBAT_PHASE_2 = 2, + YELL_SLAY = 3, + + // Phase 1 spells + SPELL_SARAS_ANGER_1 = 63147, // Target Entry 33136 + SPELL_SARAS_ANGER_2 = 63744, // Target Entry 33136 + SPELL_SARAS_FEVOR_1 = 63138, // Target Player + SPELL_SARAS_FEVOR_2 = 63747, // Target Player + SPELL_SARAS_BLESSING_1 = 63134, // Target Player + SPELL_SARAS_BLESSING_2 = 63745, // Target Self + + // Phase 2 spells + SPELL_PHYCHOSIS = 63795, // Target Self + SPELL_MALADY_OF_THE_MIND = 63830, // Target Self + SPELL_DEATH_RAY = 63891, // Target Self + SPELL_BRAIN_LINK = 63802, // Target Self }; enum YoggSaron_Yells diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index e12393f047f..654d763ddbc 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -22,9 +22,14 @@ static DoorData const doorData[] = { - { GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S }, - { GO_XT_002_DOOR, BOSS_XT002, DOOR_TYPE_ROOM, BOUNDARY_S }, - { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + {GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S }, + {GO_XT_002_DOOR, BOSS_XT002, DOOR_TYPE_ROOM, BOUNDARY_S }, + {GO_DOODAD_UL_SIGILDOOR_03, BOSS_ALGALON, DOOR_TYPE_ROOM, BOUNDARY_W }, + {GO_DOODAD_UL_UNIVERSEFLOOR_01, BOSS_ALGALON, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + {GO_DOODAD_UL_UNIVERSEFLOOR_02, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_NONE }, + {GO_DOODAD_UL_UNIVERSEGLOBE01, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_NONE }, + {GO_DOODAD_UL_ULDUAR_TRAPDOOR_03, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_NONE }, + {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }, }; class instance_ulduar : public InstanceMapScript @@ -36,7 +41,6 @@ class instance_ulduar : public InstanceMapScript { instance_ulduar_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { } - uint32 Encounter[MAX_ENCOUNTER]; std::string m_strInstData; // Creatures @@ -72,6 +76,12 @@ class instance_ulduar : public InstanceMapScript uint64 HodirDoorGUID; uint64 HodirIceDoorGUID; uint64 ArchivumDoorGUID; + uint64 AlgalonSigilDoorGUID[3]; + uint64 AlgalonFloorGUID[2]; + uint64 AlgalonUniverseGUID; + uint64 AlgalonTrapdoorGUID; + uint64 BrannBronzebeardAlgGUID; + uint64 GiftOfTheObserverGUID; // Miscellaneous uint32 TeamInInstance; @@ -111,35 +121,49 @@ class instance_ulduar : public InstanceMapScript HodirDoorGUID = 0; HodirIceDoorGUID = 0; ArchivumDoorGUID = 0; + AlgalonUniverseGUID = 0; + AlgalonTrapdoorGUID = 0; + BrannBronzebeardAlgGUID = 0; + GiftOfTheObserverGUID = 0; + _algalonTimer = 61; + _maxArmorItemLevel = 0; + _maxWeaponItemLevel = 0; TeamInInstance = 0; HodirRareCacheData = 0; ColossusData = 0; elderCount = 0; conSpeedAtory = false; Unbroken = true; + _summonAlgalon = false; - memset(Encounter, 0, sizeof(Encounter)); + memset(AlgalonSigilDoorGUID, 0, sizeof(AlgalonSigilDoorGUID)); + memset(AlgalonFloorGUID, 0, sizeof(AlgalonFloorGUID)); memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs)); memset(AssemblyGUIDs, 0, sizeof(AssemblyGUIDs)); memset(RazorHarpoonGUIDs, 0, sizeof(RazorHarpoonGUIDs)); memset(KeeperGUIDs, 0, sizeof(KeeperGUIDs)); } - bool IsEncounterInProgress() const + void FillInitialWorldStates(WorldPacket& packet) { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (Encounter[i] == IN_PROGRESS) - return true; - } - - return false; + packet << uint32(WORLD_STATE_ALGALON_TIMER_ENABLED) << uint32(_algalonTimer && _algalonTimer <= 60); + packet << uint32(WORLD_STATE_ALGALON_DESPAWN_TIMER) << uint32(std::min(_algalonTimer, 60)); } void OnPlayerEnter(Player* player) { if (!TeamInInstance) TeamInInstance = player->GetTeam(); + + if (_summonAlgalon) + { + _summonAlgalon = false; + TempSummon* algalon = instance->SummonCreature(NPC_ALGALON, AlgalonLandPos); + if (_algalonTimer && _algalonTimer <= 60) + algalon->AI()->DoAction(ACTION_INIT_ALGALON); + else + algalon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } } void OnCreatureCreate(Creature* creature) @@ -234,7 +258,6 @@ class instance_ulduar : public InstanceMapScript case NPC_ALGALON: AlgalonGUID = creature->GetGUID(); break; - // Hodir's Helper NPCs case NPC_EIVI_NIGHTFEATHER: if (TeamInInstance == HORDE) @@ -268,9 +291,32 @@ class instance_ulduar : public InstanceMapScript if (TeamInInstance == HORDE) creature->UpdateEntry(NPC_BATTLE_PRIEST_GINA, HORDE); break; + case NPC_BRANN_BRONZBEARD_ALG: + BrannBronzebeardAlgGUID = creature->GetGUID(); + break; + //! These creatures are summoned by something else than Algalon + //! but need to be controlled/despawned by him - so they need to be + //! registered in his summon list + case NPC_ALGALON_VOID_ZONE_VISUAL_STALKER: + case NPC_ALGALON_STALKER_ASTEROID_TARGET_01: + case NPC_ALGALON_STALKER_ASTEROID_TARGET_02: + case NPC_UNLEASHED_DARK_MATTER: + if (Creature* algalon = instance->GetCreature(AlgalonGUID)) + algalon->AI()->JustSummoned(creature); + break; } + } - } + void OnCreatureRemove(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_BRANN_BRONZBEARD_ALG: + if (BrannBronzebeardAlgGUID == creature->GetGUID()) + BrannBronzebeardAlgGUID = 0; + break; + } + } void OnGameObjectCreate(GameObject* gameObject) { @@ -341,6 +387,45 @@ class instance_ulduar : public InstanceMapScript if (GetBossState(BOSS_ASSEMBLY_OF_IRON) != DONE) HandleGameObject(ArchivumDoorGUID, false); break; + case GO_CELESTIAL_PLANETARIUM_ACCESS_10: + case GO_CELESTIAL_PLANETARIUM_ACCESS_25: + if (_algalonSummoned) + gameObject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + break; + case GO_DOODAD_UL_SIGILDOOR_01: + AlgalonSigilDoorGUID[0] = gameObject->GetGUID(); + if (_algalonSummoned) + gameObject->SetGoState(GO_STATE_ACTIVE); + break; + case GO_DOODAD_UL_SIGILDOOR_02: + AlgalonSigilDoorGUID[1] = gameObject->GetGUID(); + if (_algalonSummoned) + gameObject->SetGoState(GO_STATE_ACTIVE); + break; + case GO_DOODAD_UL_SIGILDOOR_03: + AlgalonSigilDoorGUID[2] = gameObject->GetGUID(); + AddDoor(gameObject, true); + break; + case GO_DOODAD_UL_UNIVERSEFLOOR_01: + AlgalonFloorGUID[0] = gameObject->GetGUID(); + AddDoor(gameObject, true); + break; + case GO_DOODAD_UL_UNIVERSEFLOOR_02: + AlgalonFloorGUID[1] = gameObject->GetGUID(); + AddDoor(gameObject, true); + break; + case GO_DOODAD_UL_UNIVERSEGLOBE01: + AlgalonUniverseGUID = gameObject->GetGUID(); + AddDoor(gameObject, true); + break; + case GO_DOODAD_UL_ULDUAR_TRAPDOOR_03: + AlgalonTrapdoorGUID = gameObject->GetGUID(); + AddDoor(gameObject, true); + break; + case GO_GIFT_OF_THE_OBSERVER_10: + case GO_GIFT_OF_THE_OBSERVER_25: + GiftOfTheObserverGUID = gameObject->GetGUID(); + break; } } @@ -349,10 +434,14 @@ class instance_ulduar : public InstanceMapScript switch (gameObject->GetEntry()) { case GO_LEVIATHAN_DOOR: - AddDoor(gameObject, false); - break; case GO_XT_002_DOOR: + case GO_DOODAD_UL_SIGILDOOR_03: + case GO_DOODAD_UL_UNIVERSEFLOOR_01: + case GO_DOODAD_UL_UNIVERSEFLOOR_02: + case GO_DOODAD_UL_UNIVERSEGLOBE01: + case GO_DOODAD_UL_ULDUAR_TRAPDOOR_03: AddDoor(gameObject, false); + break; default: break; } @@ -390,6 +479,7 @@ class instance_ulduar : public InstanceMapScript // Flame Leviathan's Tower Event triggers Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID); if (FlameLeviathan && FlameLeviathan->isAlive()) // No leviathan, no event triggering ;) + { switch (eventId) { case EVENT_TOWER_OF_STORM_DESTROYED: @@ -405,6 +495,7 @@ class instance_ulduar : public InstanceMapScript FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_LIFE_DESTROYED); break; } + } } @@ -465,6 +556,52 @@ class instance_ulduar : public InstanceMapScript if (GameObject* gameObject = instance->GetGameObject(ThorimChestGUID)) gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); break; + case BOSS_ALGALON: + if (state == DONE) + { + _events.CancelEvent(EVENT_UPDATE_ALGALON_TIMER); + _events.CancelEvent(EVENT_DESPAWN_ALGALON); + DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 0); + _algalonTimer = 61; + if (GameObject* gameObject = instance->GetGameObject(GiftOfTheObserverGUID)) + gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); + // get item level (recheck weapons) + Map::PlayerList const& players = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->getSource()) + for (uint8 slot = EQUIPMENT_SLOT_MAINHAND; slot <= EQUIPMENT_SLOT_RANGED; ++slot) + if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) + if (item->GetTemplate()->ItemLevel > _maxWeaponItemLevel) + _maxWeaponItemLevel = item->GetTemplate()->ItemLevel; + } + else if (state == IN_PROGRESS) + { + // get item level (armor cannot be swapped in combat) + Map::PlayerList const& players = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->getSource()) + { + for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot) + { + if (slot == EQUIPMENT_SLOT_TABARD || slot == EQUIPMENT_SLOT_BODY) + continue; + + if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) + { + if (slot >= EQUIPMENT_SLOT_MAINHAND && slot <= EQUIPMENT_SLOT_RANGED) + { + if (item->GetTemplate()->ItemLevel > _maxWeaponItemLevel) + _maxWeaponItemLevel = item->GetTemplate()->ItemLevel; + } + else if (item->GetTemplate()->ItemLevel > _maxArmorItemLevel) + _maxArmorItemLevel = item->GetTemplate()->ItemLevel; + } + } + } + } + } + break; } return true; @@ -497,6 +634,16 @@ class instance_ulduar : public InstanceMapScript case DATA_UNBROKEN: Unbroken = bool(data); break; + case EVENT_DESPAWN_ALGALON: + DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, 60); + _algalonTimer = 60; + _events.ScheduleEvent(EVENT_DESPAWN_ALGALON, 3600000); + _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000); + break; + case DATA_ALGALON_SUMMON_STATE: + _algalonSummoned = true; + break; default: break; } @@ -571,6 +718,22 @@ class instance_ulduar : public InstanceMapScript return KeeperGUIDs[1]; case BOSS_STONEBARK: return KeeperGUIDs[2]; + case DATA_SIGILDOOR_01: + return AlgalonSigilDoorGUID[0]; + case DATA_SIGILDOOR_02: + return AlgalonSigilDoorGUID[1]; + case DATA_SIGILDOOR_03: + return AlgalonSigilDoorGUID[2]; + case DATA_UNIVERSE_FLOOR_01: + return AlgalonFloorGUID[0]; + case DATA_UNIVERSE_FLOOR_02: + return AlgalonFloorGUID[1]; + case DATA_UNIVERSE_GLOBE: + return AlgalonUniverseGUID; + case DATA_ALGALON_TRAPDOOR: + return AlgalonTrapdoorGUID; + case DATA_BRANN_BRONZEBEARD_ALG: + return BrannBronzebeardAlgGUID; } return 0; @@ -593,12 +756,23 @@ class instance_ulduar : public InstanceMapScript return 0; } + bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* , Unit const* /* = NULL */, uint32 /* = 0 */) + { + switch (criteriaId) + { + case CRITERIA_HERALD_OF_TITANS: + return _maxArmorItemLevel <= MAX_HERALD_ARMOR_ITEMLEVEL && _maxWeaponItemLevel <= MAX_HERALD_WEAPON_ITEMLEVEL; + } + + return false; + } + std::string GetSaveData() { OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "U U " << GetBossSaveData() << GetData(DATA_COLOSSUS); + saveStream << "U U " << GetBossSaveData() << GetData(DATA_COLOSSUS) << ' ' << _algalonTimer << ' ' << (_algalonSummoned ? 1 : 0); OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -628,15 +802,68 @@ class instance_ulduar : public InstanceMapScript if (tmpState == IN_PROGRESS || tmpState > SPECIAL) tmpState = NOT_STARTED; - if (i == DATA_COLOSSUS) - SetData(i, tmpState); - else - SetBossState(i, EncounterState(tmpState)); + SetBossState(i, EncounterState(tmpState)); + } + + uint32 tempState; + loadStream >> tempState; + if (tempState == IN_PROGRESS || tempState > SPECIAL) + tempState = NOT_STARTED; + SetData(DATA_COLOSSUS, tempState); + + loadStream >> _algalonTimer; + loadStream >> tempState; + _algalonSummoned = tempState != 0; + if (_algalonSummoned && GetBossState(BOSS_ALGALON) != DONE) + { + _summonAlgalon = true; + if (_algalonTimer && _algalonTimer <= 60) + { + _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000); + DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, _algalonTimer); + } } } OUT_LOAD_INST_DATA_COMPLETE; } + + void Update(uint32 diff) + { + if (_events.Empty()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_UPDATE_ALGALON_TIMER: + SaveToDB(); + DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, --_algalonTimer); + if (_algalonTimer) + _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000); + else + { + DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 0); + _events.CancelEvent(EVENT_UPDATE_ALGALON_TIMER); + if (Creature* algalon = instance->GetCreature(AlgalonGUID)) + algalon->AI()->DoAction(EVENT_DESPAWN_ALGALON); + } + break; + } + } + } + + private: + EventMap _events; + uint32 _algalonTimer; + bool _summonAlgalon; + bool _algalonSummoned; + uint32 _maxArmorItemLevel; + uint32 _maxWeaponItemLevel; }; InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index a31954b8a16..d35f0559080 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -21,6 +21,8 @@ #include "ObjectMgr.h" #define UlduarScriptName "instance_ulduar" +extern Position const AlgalonLandPos; + enum UlduarBosses { MAX_ENCOUNTER = 20, @@ -50,98 +52,124 @@ enum UlduarBosses enum UlduarNPCs { // General - NPC_LEVIATHAN = 33113, - NPC_SALVAGED_DEMOLISHER = 33109, - NPC_SALVAGED_SIEGE_ENGINE = 33060, - NPC_IGNIS = 33118, - NPC_RAZORSCALE = 33186, - NPC_RAZORSCALE_CONTROLLER = 33233, - NPC_STEELFORGED_DEFFENDER = 33236, - NPC_EXPEDITION_COMMANDER = 33210, - NPC_XT002 = 33293, - NPC_XT_TOY_PILE = 33337, - NPC_STEELBREAKER = 32867, - NPC_MOLGEIM = 32927, - NPC_BRUNDIR = 32857, - NPC_KOLOGARN = 32930, - NPC_FOCUSED_EYEBEAM = 33632, - NPC_FOCUSED_EYEBEAM_RIGHT = 33802, - NPC_LEFT_ARM = 32933, - NPC_RIGHT_ARM = 32934, - NPC_RUBBLE = 33768, - NPC_AURIAYA = 33515, - NPC_MIMIRON = 33350, - NPC_HODIR = 32845, - NPC_THORIM = 32865, - NPC_FREYA = 32906, - NPC_VEZAX = 33271, - NPC_YOGGSARON = 33288, - NPC_ALGALON = 32871, + NPC_LEVIATHAN = 33113, + NPC_SALVAGED_DEMOLISHER = 33109, + NPC_SALVAGED_SIEGE_ENGINE = 33060, + NPC_IGNIS = 33118, + NPC_RAZORSCALE = 33186, + NPC_RAZORSCALE_CONTROLLER = 33233, + NPC_STEELFORGED_DEFFENDER = 33236, + NPC_EXPEDITION_COMMANDER = 33210, + NPC_XT002 = 33293, + NPC_XT_TOY_PILE = 33337, + NPC_STEELBREAKER = 32867, + NPC_MOLGEIM = 32927, + NPC_BRUNDIR = 32857, + NPC_KOLOGARN = 32930, + NPC_FOCUSED_EYEBEAM = 33632, + NPC_FOCUSED_EYEBEAM_RIGHT = 33802, + NPC_LEFT_ARM = 32933, + NPC_RIGHT_ARM = 32934, + NPC_RUBBLE = 33768, + NPC_AURIAYA = 33515, + NPC_MIMIRON = 33350, + NPC_HODIR = 32845, + NPC_THORIM = 32865, + NPC_FREYA = 32906, + NPC_VEZAX = 33271, + NPC_YOGGSARON = 33288, + NPC_ALGALON = 32871, // Mimiron - NPC_LEVIATHAN_MKII = 33432, - NPC_VX_001 = 33651, - NPC_AERIAL_COMMAND_UNIT = 33670, + NPC_LEVIATHAN_MKII = 33432, + NPC_VX_001 = 33651, + NPC_AERIAL_COMMAND_UNIT = 33670, // Freya's Keepers - NPC_IRONBRANCH = 32913, - NPC_BRIGHTLEAF = 32915, - NPC_STONEBARK = 32914, + NPC_IRONBRANCH = 32913, + NPC_BRIGHTLEAF = 32915, + NPC_STONEBARK = 32914, // Hodir's Helper NPCs - NPC_TOR_GREYCLOUD = 32941, - NPC_KAR_GREYCLOUD = 33333, - NPC_EIVI_NIGHTFEATHER = 33325, - NPC_ELLIE_NIGHTFEATHER = 32901, - NPC_SPIRITWALKER_TARA = 33332, - NPC_SPIRITWALKER_YONA = 32950, - NPC_ELEMENTALIST_MAHFUUN = 33328, - NPC_ELEMENTALIST_AVUUN = 32900, - NPC_AMIRA_BLAZEWEAVER = 33331, - NPC_VEESHA_BLAZEWEAVER = 32946, - NPC_MISSY_FLAMECUFFS = 32893, - NPC_SISSY_FLAMECUFFS = 33327, - NPC_BATTLE_PRIEST_ELIZA = 32948, - NPC_BATTLE_PRIEST_GINA = 33330, - NPC_FIELD_MEDIC_PENNY = 32897, - NPC_FIELD_MEDIC_JESSI = 33326, + NPC_TOR_GREYCLOUD = 32941, + NPC_KAR_GREYCLOUD = 33333, + NPC_EIVI_NIGHTFEATHER = 33325, + NPC_ELLIE_NIGHTFEATHER = 32901, + NPC_SPIRITWALKER_TARA = 33332, + NPC_SPIRITWALKER_YONA = 32950, + NPC_ELEMENTALIST_MAHFUUN = 33328, + NPC_ELEMENTALIST_AVUUN = 32900, + NPC_AMIRA_BLAZEWEAVER = 33331, + NPC_VEESHA_BLAZEWEAVER = 32946, + NPC_MISSY_FLAMECUFFS = 32893, + NPC_SISSY_FLAMECUFFS = 33327, + NPC_BATTLE_PRIEST_ELIZA = 32948, + NPC_BATTLE_PRIEST_GINA = 33330, + NPC_FIELD_MEDIC_PENNY = 32897, + NPC_FIELD_MEDIC_JESSI = 33326, // Freya's trash NPCs - NPC_CORRUPTED_SERVITOR = 33354, - NPC_MISGUIDED_NYMPH = 33355, - NPC_GUARDIAN_LASHER = 33430, - NPC_FOREST_SWARMER = 33431, - NPC_MANGROVE_ENT = 33525, - NPC_IRONROOT_LASHER = 33526, - NPC_NATURES_BLADE = 33527, - NPC_GUARDIAN_OF_LIFE = 33528, + NPC_CORRUPTED_SERVITOR = 33354, + NPC_MISGUIDED_NYMPH = 33355, + NPC_GUARDIAN_LASHER = 33430, + NPC_FOREST_SWARMER = 33431, + NPC_MANGROVE_ENT = 33525, + NPC_IRONROOT_LASHER = 33526, + NPC_NATURES_BLADE = 33527, + NPC_GUARDIAN_OF_LIFE = 33528, + + // Algalon the Observer + NPC_BRANN_BRONZBEARD_ALG = 34064, + NPC_AZEROTH = 34246, + NPC_LIVING_CONSTELLATION = 33052, + NPC_ALGALON_STALKER = 33086, + NPC_COLLAPSING_STAR = 32955, + NPC_BLACK_HOLE = 32953, + NPC_WORM_HOLE = 34099, + NPC_ALGALON_VOID_ZONE_VISUAL_STALKER = 34100, + NPC_ALGALON_STALKER_ASTEROID_TARGET_01 = 33104, + NPC_ALGALON_STALKER_ASTEROID_TARGET_02 = 33105, + NPC_UNLEASHED_DARK_MATTER = 34097, }; enum UlduarGameObjects { - GO_KOLOGARN_CHEST_HERO = 195047, - GO_KOLOGARN_CHEST = 195046, - GO_KOLOGARN_BRIDGE = 194232, - GO_KOLOGARN_DOOR = 194553, - GO_THORIM_CHEST_HERO = 194315, - GO_THORIM_CHEST = 194314, - GO_HODIR_RARE_CACHE_OF_WINTER = 194200, - GO_HODIR_RARE_CACHE_OF_WINTER_HERO = 194201, - GO_HODIR_CHEST_HERO = 194308, - GO_HODIR_CHEST = 194307, - GO_LEVIATHAN_DOOR = 194905, - GO_LEVIATHAN_GATE = 194630, - GO_XT_002_DOOR = 194631, - GO_VEZAX_DOOR = 194750, - GO_MOLE_MACHINE = 194316, - GO_RAZOR_HARPOON_1 = 194542, - GO_RAZOR_HARPOON_2 = 194541, - GO_RAZOR_HARPOON_3 = 194543, - GO_RAZOR_HARPOON_4 = 194519, - GO_RAZOR_BROKEN_HARPOON = 194565, - GO_HODIR_DOOR = 194634, - GO_HODIR_ICE_DOOR = 194441, - GO_ARCHIVUM_DOOR = 194556, + GO_KOLOGARN_CHEST_HERO = 195047, + GO_KOLOGARN_CHEST = 195046, + GO_KOLOGARN_BRIDGE = 194232, + GO_KOLOGARN_DOOR = 194553, + GO_THORIM_CHEST_HERO = 194315, + GO_THORIM_CHEST = 194314, + GO_HODIR_RARE_CACHE_OF_WINTER = 194200, + GO_HODIR_RARE_CACHE_OF_WINTER_HERO = 194201, + GO_HODIR_CHEST_HERO = 194308, + GO_HODIR_CHEST = 194307, + GO_LEVIATHAN_DOOR = 194905, + GO_LEVIATHAN_GATE = 194630, + GO_XT_002_DOOR = 194631, + GO_VEZAX_DOOR = 194750, + GO_MOLE_MACHINE = 194316, + GO_RAZOR_HARPOON_1 = 194542, + GO_RAZOR_HARPOON_2 = 194541, + GO_RAZOR_HARPOON_3 = 194543, + GO_RAZOR_HARPOON_4 = 194519, + GO_RAZOR_BROKEN_HARPOON = 194565, + GO_HODIR_DOOR = 194634, + GO_HODIR_ICE_DOOR = 194441, + GO_ARCHIVUM_DOOR = 194556, + + // Algalon the Observer + GO_CELESTIAL_PLANETARIUM_ACCESS_10 = 194628, + GO_CELESTIAL_PLANETARIUM_ACCESS_25 = 194752, + GO_DOODAD_UL_SIGILDOOR_01 = 194767, + GO_DOODAD_UL_SIGILDOOR_02 = 194911, + GO_DOODAD_UL_SIGILDOOR_03 = 194910, + GO_DOODAD_UL_UNIVERSEFLOOR_01 = 194715, + GO_DOODAD_UL_UNIVERSEFLOOR_02 = 194716, + GO_DOODAD_UL_UNIVERSEGLOBE01 = 194148, + GO_DOODAD_UL_ULDUAR_TRAPDOOR_03 = 194253, + GO_GIFT_OF_THE_OBSERVER_10 = 194821, + GO_GIFT_OF_THE_OBSERVER_25 = 194822, }; enum LeviathanData @@ -161,6 +189,7 @@ enum UlduarAchievementCriteriaIds { CRITERIA_CON_SPEED_ATORY = 21597, CRITERIA_DISARMED = 21687, + CRITERIA_HERALD_OF_TITANS = 10678, }; enum UlduarData @@ -180,12 +209,38 @@ enum UlduarData // Hodir DATA_HODIR_RARE_CACHE, + + // Algalon the Observer + DATA_ALGALON_SUMMON_STATE, + DATA_SIGILDOOR_01, + DATA_SIGILDOOR_02, + DATA_SIGILDOOR_03, + DATA_UNIVERSE_FLOOR_01, + DATA_UNIVERSE_FLOOR_02, + DATA_UNIVERSE_GLOBE, + DATA_ALGALON_TRAPDOOR, + DATA_BRANN_BRONZEBEARD_ALG, +}; + +enum UlduarWorldStates +{ + WORLD_STATE_ALGALON_DESPAWN_TIMER = 4131, + WORLD_STATE_ALGALON_TIMER_ENABLED = 4132, }; enum UlduarAchievementData { // FL Achievement boolean DATA_UNBROKEN = 29052906, // 2905, 2906 are achievement IDs, + MAX_HERALD_ARMOR_ITEMLEVEL = 226, + MAX_HERALD_WEAPON_ITEMLEVEL = 232, +}; + +enum UlduarEvents +{ + EVENT_DESPAWN_ALGALON = 1, + EVENT_UPDATE_ALGALON_TIMER = 2, + ACTION_INIT_ALGALON = 6, }; template @@ -199,6 +254,17 @@ CreatureAI* GetUlduarAI(Creature* creature) return NULL; } +template +GameObjectAI* GetUlduarAI(GameObject* go) +{ + if (InstanceMap* instance = go->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(UlduarScriptName)) + return new AI(go); + + return NULL; +} + class PlayerOrPetCheck { public: diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index a11f88fc6af..a7853a07e22 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -309,9 +309,9 @@ public: struct mob_annhylde_the_callerAI : public ScriptedAI { - mob_annhylde_the_callerAI(Creature* c) : ScriptedAI(c) + mob_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } float x, y, z; @@ -321,6 +321,7 @@ public: void Reset() { + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_HOVER); me->SetSpeed(MOVE_SWIM, 1.0f); me->SetSpeed(MOVE_RUN, 1.0f); @@ -343,7 +344,7 @@ public: { if (type != POINT_MOTION_TYPE) return; - Unit* ingvar = Unit::GetUnit((*me), instance ? instance->GetData64(DATA_INGVAR) : 0); + Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0); if (ingvar) { switch (id) @@ -423,7 +424,7 @@ public: struct mob_ingvar_throw_dummyAI : public ScriptedAI { - mob_ingvar_throw_dummyAI(Creature* c) : ScriptedAI(c) + mob_ingvar_throw_dummyAI(Creature* creature) : ScriptedAI(creature) { } @@ -444,6 +445,7 @@ public: void AttackStart(Unit* /*who*/) {} void MoveInLineOfSight(Unit* /*who*/) {} void EnterCombat(Unit* /*who*/) {} + void UpdateAI(const uint32 diff) { if (uiDespawnTimer <= diff) @@ -454,7 +456,6 @@ public: } else uiDespawnTimer -= diff; } }; - }; void AddSC_boss_ingvar_the_plunderer() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp index 333278daa10..915d1c71bb2 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -69,9 +69,9 @@ public: struct boss_skarvald_the_constructorAI : public ScriptedAI { - boss_skarvald_the_constructorAI(Creature* c) : ScriptedAI(c) + boss_skarvald_the_constructorAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -93,7 +93,7 @@ public: ghost = (me->GetEntry() == MOB_SKARVALD_GHOST); if (!ghost && instance) { - Unit* dalronn = Unit::GetUnit((*me), instance->GetData64(DATA_DALRONN)); + Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN)); if (dalronn && dalronn->isDead()) CAST_CRE(dalronn)->Respawn(); @@ -107,7 +107,7 @@ public: { DoScriptText(YELL_SKARVALD_AGGRO, me); - Unit* dalronn = Unit::GetUnit((*me), instance->GetData64(DATA_DALRONN)); + Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN)); if (dalronn && dalronn->isAlive() && !dalronn->getVictim()) dalronn->getThreatManager().addThreat(who, 0.0f); @@ -115,11 +115,11 @@ public: } } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { if (!ghost && instance) { - Unit* dalronn = Unit::GetUnit((*me), instance->GetData64(DATA_DALRONN)); + Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN)); if (dalronn) { if (dalronn->isDead()) @@ -138,7 +138,7 @@ public: if (temp) { temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - temp->AI()->AttackStart(Killer); + temp->AI()->AttackStart(killer); } } } @@ -221,9 +221,9 @@ public: struct boss_dalronn_the_controllerAI : public ScriptedAI { - boss_dalronn_the_controllerAI(Creature* c) : ScriptedAI(c) + boss_dalronn_the_controllerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -250,7 +250,7 @@ public: ghost = me->GetEntry() == MOB_DALRONN_GHOST; if (!ghost && instance) { - Unit* skarvald = Unit::GetUnit((*me), instance->GetData64(DATA_SKARVALD)); + Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD)); if (skarvald && skarvald->isDead()) CAST_CRE(skarvald)->Respawn(); @@ -262,7 +262,7 @@ public: { if (!ghost && instance) { - Unit* skarvald = Unit::GetUnit((*me), instance->GetData64(DATA_SKARVALD)); + Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD)); if (skarvald && skarvald->isAlive() && !skarvald->getVictim()) skarvald->getThreatManager().addThreat(who, 0.0f); @@ -273,11 +273,11 @@ public: } } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { if (!ghost && instance) { - Unit* skarvald = Unit::GetUnit((*me), instance->GetData64(DATA_SKARVALD)); + Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD)); if (skarvald) { if (skarvald->isDead()) @@ -297,7 +297,7 @@ public: if (temp) { temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - temp->AI()->AttackStart(Killer); + temp->AI()->AttackStart(killer); } } } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp index 6ecc1883afc..fda4767e16b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp @@ -100,7 +100,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index d660b1516b3..95d2cb1709e 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -37,9 +37,9 @@ public: struct npc_dragonflayer_forge_masterAI : public ScriptedAI { - npc_dragonflayer_forge_masterAI(Creature* c) : ScriptedAI(c) + npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); fm_Type = 0; } @@ -48,65 +48,77 @@ public: void Reset() { - if (fm_Type == 0) fm_Type = GetForgeMasterType(); + if (fm_Type == 0) + fm_Type = GetForgeMasterType(); + CheckForge(); } void CheckForge() { - if (instance) + if (instance) { switch (fm_Type) { - case 1: - instance->SetData(EVENT_FORGE_1, me->isAlive() ? NOT_STARTED : DONE); - break; - case 2: - instance->SetData(EVENT_FORGE_2, me->isAlive() ? NOT_STARTED : DONE); - break; - case 3: - instance->SetData(EVENT_FORGE_3, me->isAlive() ? NOT_STARTED : DONE); - break; + case 1: + instance->SetData(EVENT_FORGE_1, me->isAlive() ? NOT_STARTED : DONE); + break; + + case 2: + instance->SetData(EVENT_FORGE_2, me->isAlive() ? NOT_STARTED : DONE); + break; + + case 3: + instance->SetData(EVENT_FORGE_3, me->isAlive() ? NOT_STARTED : DONE); + break; } } } void JustDied(Unit* /*killer*/) { - if (fm_Type == 0) fm_Type = GetForgeMasterType(); + if (fm_Type == 0) + fm_Type = GetForgeMasterType(); + if (instance) { switch (fm_Type) { - case 1: - instance->SetData(EVENT_FORGE_1, DONE); - break; - case 2: - instance->SetData(EVENT_FORGE_2, DONE); - break; - case 3: - instance->SetData(EVENT_FORGE_3, DONE); - break; + case 1: + instance->SetData(EVENT_FORGE_1, DONE); + break; + + case 2: + instance->SetData(EVENT_FORGE_2, DONE); + break; + + case 3: + instance->SetData(EVENT_FORGE_3, DONE); + break; } } } void EnterCombat(Unit* /*who*/) { - if (fm_Type == 0) fm_Type = GetForgeMasterType(); + if (fm_Type == 0) + fm_Type = GetForgeMasterType(); + if (instance) { switch (fm_Type) { - case 1: - instance->SetData(EVENT_FORGE_1, IN_PROGRESS); - break; - case 2: - instance->SetData(EVENT_FORGE_2, IN_PROGRESS); - break; - case 3: - instance->SetData(EVENT_FORGE_3, IN_PROGRESS); - break; + case 1: + instance->SetData(EVENT_FORGE_1, IN_PROGRESS); + break; + + case 2: + instance->SetData(EVENT_FORGE_2, IN_PROGRESS); + break; + + case 3: + instance->SetData(EVENT_FORGE_3, IN_PROGRESS); + break; } } me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); @@ -115,29 +127,26 @@ public: uint8 GetForgeMasterType() { float diff = 30.0f; - int near_f = 0; + uint8 near_f = 0; - for (uint8 i = 0; i < 3 ; ++i) + for (uint8 i = 0; i < 3; ++i) { - GameObject* temp; - temp = me->FindNearestGameObject(entry_search[i], 30); - if (temp) + if (GameObject* go = me->FindNearestGameObject(entry_search[i], 30)) { - if (me->IsWithinDist(temp, diff, false)) + if (me->IsWithinDist(go, diff, false)) { near_f = i + 1; - diff = me->GetDistance2d(temp); - + diff = me->GetDistance2d(go); } } } switch (near_f) { - case 1: return 1; - case 2: return 2; - case 3: return 3; - default: return 0; + case 1: return 1; + case 2: return 2; + case 3: return 3; + default: return 0; } } @@ -152,7 +161,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_utgarde_keep() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index 656b2931abb..e2943f491f6 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -94,9 +94,9 @@ public: struct boss_palehoofAI : public ScriptedAI { - boss_palehoofAI(Creature* c) : ScriptedAI(c) + boss_palehoofAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiArcingSmashTimer; @@ -297,9 +297,9 @@ public: struct mob_ravenous_furbolgAI : public ScriptedAI { - mob_ravenous_furbolgAI(Creature* c) : ScriptedAI(c) + mob_ravenous_furbolgAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiChainLightingTimer; @@ -410,9 +410,9 @@ public: struct mob_frenzied_worgenAI : public ScriptedAI { - mob_frenzied_worgenAI(Creature* c) : ScriptedAI(c) + mob_frenzied_worgenAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiMortalWoundTimer; @@ -526,9 +526,9 @@ public: struct mob_ferocious_rhinoAI : public ScriptedAI { - mob_ferocious_rhinoAI(Creature* c) : ScriptedAI(c) + mob_ferocious_rhinoAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiStompTimer; @@ -646,9 +646,9 @@ public: struct mob_massive_jormungarAI : public ScriptedAI { - mob_massive_jormungarAI(Creature* c) : ScriptedAI(c) + mob_massive_jormungarAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiAcidSpitTimer; @@ -752,9 +752,9 @@ public: struct mob_palehoof_orbAI : public ScriptedAI { - mob_palehoof_orbAI(Creature* c) : ScriptedAI(c) + mob_palehoof_orbAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -765,6 +765,7 @@ public: { currentPhase = PHASE_NONE; SummonTimer = 5000; + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->RemoveAurasDueToSpell(SPELL_ORB_VISUAL); me->SetSpeed(MOVE_FLIGHT, 0.5f); @@ -834,15 +835,15 @@ class go_palehoof_sphere : public GameObjectScript public: go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - InstanceScript* instance = pGO->GetInstanceScript(); + InstanceScript* instance = go->GetInstanceScript(); - Creature* pPalehoof = Unit::GetCreature(*pGO, instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); + Creature* pPalehoof = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); if (pPalehoof && pPalehoof->isAlive()) { - pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - pGO->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase(); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index d5cd79b25f1..5132dd0f046 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -168,12 +168,12 @@ public: struct boss_skadiAI : public ScriptedAI { - boss_skadiAI(Creature* c) : ScriptedAI(c), Summons(me) + boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - m_instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; SummonList Summons; uint64 m_uiGraufGUID; std::vector triggersGUID; @@ -208,16 +208,16 @@ public: me->SetSpeed(MOVE_FLIGHT, 3.0f); if ((Unit::GetCreature((*me), m_uiGraufGUID) == NULL) && !me->IsMounted()) me->SummonCreature(CREATURE_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f); - if (m_instance) + if (instance) { - m_instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, NOT_STARTED); - m_instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } } void JustReachedHome() { - me->SetFlying(false); + me->SetCanFly(false); me->Dismount(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); if (Unit::GetCreature((*me), m_uiGraufGUID) == NULL) @@ -235,12 +235,12 @@ public: m_uiMovementTimer = 1000; m_uiSummonTimer = 10000; me->SetInCombatWithZone(); - if (m_instance) + if (instance) { - m_instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, IN_PROGRESS); - m_instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); m_uiMountTimer = 1000; Summons.DespawnEntry(CREATURE_GRAUF); } @@ -284,7 +284,7 @@ public: if (m_uiSpellHitCount >= 3) { Phase = SKADI; - me->SetFlying(false); + me->SetCanFly(false); me->Dismount(); if (Creature* pGrauf = me->SummonCreature(CREATURE_GRAUF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS)) { @@ -328,7 +328,7 @@ public: if (m_uiMountTimer && m_uiMountTimer <= diff) { me->Mount(DATA_MOUNT); - me->SetFlying(true); + me->SetCanFly(true); m_uiMountTimer = 0; } else m_uiMountTimer -= diff; @@ -411,8 +411,8 @@ public: { DoScriptText(SAY_DEATH, me); Summons.DespawnAll(); - if (m_instance) - m_instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, DONE); + if (instance) + instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, DONE); } void KilledUnit(Unit* /*victim*/) @@ -426,9 +426,17 @@ public: { switch (urand(0, 2)) { - case 0: me->SummonCreature(CREATURE_YMIRJAR_WARRIOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); break; - case 1: me->SummonCreature(CREATURE_YMIRJAR_WITCH_DOCTOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); break; - case 2: me->SummonCreature(CREATURE_YMIRJAR_HARPOONER, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); break; + case 0: + me->SummonCreature(CREATURE_YMIRJAR_WARRIOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + + case 1: + me->SummonCreature(CREATURE_YMIRJAR_WITCH_DOCTOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + + case 2: + me->SummonCreature(CREATURE_YMIRJAR_HARPOONER, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; } } } @@ -461,15 +469,15 @@ class go_harpoon_launcher : public GameObjectScript public: go_harpoon_launcher() : GameObjectScript("go_harpoon_launcher") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - InstanceScript* m_instance = pGO->GetInstanceScript(); - if (!m_instance) return false; + InstanceScript* instance = go->GetInstanceScript(); + if (!instance) + return false; - if (Creature* pSkadi = Unit::GetCreature((*pGO), m_instance->GetData64(DATA_SKADI_THE_RUTHLESS))) - { + if (Creature* pSkadi = Unit::GetCreature(*go, instance->GetData64(DATA_SKADI_THE_RUTHLESS))) player->CastSpell(pSkadi, SPELL_RAPID_FIRE, true); - } + return false; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 915ead98bb7..29b8f2e7f48 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -94,11 +94,6 @@ enum SvalaPhase SVALADEAD }; -enum SvalaPoint -{ - POINT_FALL_GROUND = 1, -}; - #define DATA_INCREDIBLE_HULK 2043 static const float spectatorWP[2][3] = @@ -158,15 +153,11 @@ public: summons.DespawnAll(); me->RemoveAllAuras(); - if (Phase > INTRO) - { - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - } - if (Phase > NORMAL) Phase = NORMAL; + me->SetDisableGravity(Phase == NORMAL); + introTimer = 1 * IN_MILLISECONDS; introPhase = 0; arthasGUID = 0; @@ -178,17 +169,6 @@ public: } } - void JustReachedHome() - { - if (Phase > INTRO) - { - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SetOrientation(1.58f); - me->SendMovementFlagUpdate(); - } - } - void EnterCombat(Unit* /*who*/) { Talk(SAY_AGGRO); @@ -240,44 +220,13 @@ public: Talk(SAY_SLAY); } - void DamageTaken(Unit* attacker, uint32 &damage) - { - if (Phase == SVALADEAD) - { - if (attacker != me) - damage = 0; - return; - } - - if (damage >= me->GetHealth()) - { - if (Phase == SACRIFICING) - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - - damage = 0; - Phase = SVALADEAD; - me->InterruptNonMeleeSpells(true); - me->RemoveAllAuras(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetHealth(1); - - SetCombatMovement(false); - me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); - me->GetMotionMaster()->MoveFall(POINT_FALL_GROUND); - } - } - - void MovementInform(uint32 motionType, uint32 pointId) + void JustDied(Unit* /*killer*/) { - if (motionType != EFFECT_MOTION_TYPE) - return; + if (Phase == SACRIFICING) + SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - if (pointId == POINT_FALL_GROUND) - me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } + me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); - void JustDied(Unit* /*killer*/) - { summons.DespawnAll(); if (instance) @@ -325,8 +274,6 @@ public: break; case 2: arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false); - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); pos.Relocate(me); pos.m_positionZ += 8.0f; me->GetMotionMaster()->MoveTakeoff(0, pos, 3.30078125f); @@ -340,7 +287,7 @@ public: if ((*itr)->isAlive()) { (*itr)->SetStandState(UNIT_STAND_STATE_STAND); - (*itr)->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + (*itr)->SetWalk(false); (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0][0], spectatorWP[0][1], spectatorWP[0][2]); } } @@ -382,14 +329,13 @@ public: introTimer = 13800; break; case 8: - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SendMovementFlagUpdate(); pos.Relocate(me); pos.m_positionX = me->GetHomePosition().GetPositionX(); pos.m_positionY = me->GetHomePosition().GetPositionY(); pos.m_positionZ = 90.6065f; me->GetMotionMaster()->MoveLand(0, pos, 6.247422f); + me->SetDisableGravity(false, true); + me->SetHover(true); ++introPhase; introTimer = 3000; break; @@ -403,7 +349,8 @@ public: break; } } - else introTimer -= diff; + else + introTimer -= diff; return; } @@ -414,33 +361,29 @@ public: if (!UpdateVictim()) return; - if (me->IsWithinMeleeRange(me->getVictim()) && me->HasUnitMovementFlag(MOVEMENTFLAG_LEVITATING)) - { - me->SetFlying(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->SendMovementFlagUpdate(); - } - if (sinsterStrikeTimer <= diff) { DoCast(me->getVictim(), SPELL_SINSTER_STRIKE); sinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); - } else sinsterStrikeTimer -= diff; + } + else + sinsterStrikeTimer -= diff; if (callFlamesTimer <= diff) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { DoCast(target, SPELL_CALL_FLAMES); callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); } - } else callFlamesTimer -= diff; + } + else callFlamesTimer -= diff; if (!sacrificed) { if (HealthBelowPct(50)) { - if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true)) + if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true)) { if (instance) instance->SetData64(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID()); @@ -450,8 +393,6 @@ public: DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION); SetCombatMovement(false); - me->SetFlying(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); Phase = SACRIFICING; sacrePhase = 0; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index 29d6278124f..f9251c637ba 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -108,9 +108,9 @@ public: struct boss_ymironAI : public ScriptedAI { - boss_ymironAI(Creature* c) : ScriptedAI(c) + boss_ymironAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); for (int i = 0; i < 4; ++i) m_uiActiveOrder[i] = i; for (int i = 0; i < 3; ++i) @@ -218,7 +218,7 @@ public: m_uiActivedCreatureGUID = temp->GetGUID(); temp->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true); temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - temp->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + temp->SetDisableGravity(true); switch (m_uiActiveOrder[m_uiActivedNumber]) { case 0: m_bIsActiveWithBJORN = true; break; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp index cb596f284c5..26fbbf4d717 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp @@ -97,7 +97,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 2f4079d4e3c..4980ed36ec3 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -139,7 +139,7 @@ class boss_emalon : public CreatureScript case EVENT_OVERCHARGE: if (!summons.empty()) { - Creature* minion = Unit::GetCreature(*me, SelectRandomContainerElement(summons)); + Creature* minion = Unit::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(summons)); if (minion && minion->isAlive()) { minion->CastSpell(me, SPELL_OVERCHARGED, true); @@ -189,7 +189,7 @@ class mob_tempest_minion : public CreatureScript OverchargedTimer = 0; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (Creature* emalon = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EMALON) : 0)) { diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index 162f59fa5b7..100f1fccac8 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -125,7 +125,7 @@ class mob_frost_warder : public CreatureScript struct mob_frost_warderAI : public ScriptedAI { - mob_frost_warderAI(Creature* c) : ScriptedAI(c) {} + mob_frost_warderAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index 74fc2505969..37ef8bf2788 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -57,9 +57,9 @@ public: struct boss_cyanigosaAI : public ScriptedAI { - boss_cyanigosaAI(Creature* c) : ScriptedAI(c) + boss_cyanigosaAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiArcaneVacuumTimer; @@ -168,7 +168,7 @@ class achievement_defenseless : public AchievementCriteriaScript bool OnCheck(Player* /*player*/, Unit* target) { - if(!target) + if (!target) return false; InstanceScript* instance = target->GetInstanceScript(); diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 63f0cd39893..31902acfc46 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -55,9 +55,9 @@ public: struct boss_erekemAI : public ScriptedAI { - boss_erekemAI(Creature* c) : ScriptedAI(c) + boss_erekemAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiBloodlustTimer; @@ -270,9 +270,9 @@ public: struct mob_erekem_guardAI : public ScriptedAI { - mob_erekem_guardAI(Creature* c) : ScriptedAI(c) + mob_erekem_guardAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiGushingWoundTimer; diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index c5b2cb3c327..7a8254ad2b6 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -41,9 +41,9 @@ public: struct boss_lavanthorAI : public ScriptedAI { - boss_lavanthorAI(Creature* c) : ScriptedAI(c) + boss_lavanthorAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiFireboltTimer; diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 84b04579681..1a70846e1b6 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -37,9 +37,9 @@ public: struct boss_moraggAI : public ScriptedAI { - boss_moraggAI(Creature* c) : ScriptedAI(c) + boss_moraggAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiOpticLinkTimer; diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index ff2009c2a17..4569741e459 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -61,9 +61,9 @@ public: struct boss_zuramatAI : public ScriptedAI { - boss_zuramatAI(Creature* c) : ScriptedAI(c) + boss_zuramatAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 5980c534595..37a13388b5f 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -221,7 +221,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -689,7 +690,8 @@ public: { AddWave(); bActive = false; - uiActivationTimer = 5000; + // 1 minute waiting time after each boss fight + uiActivationTimer = (uiWaveCount == 6 || uiWaveCount == 12) ? 60000 : 5000; } else uiActivationTimer -= diff; } @@ -795,7 +797,7 @@ public: } } - void ProcessEvent(WorldObject* /*pGO*/, uint32 uiEventId) + void ProcessEvent(WorldObject* /*go*/, uint32 uiEventId) { switch (uiEventId) { diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 8b77cb250da..e9d2c85e13e 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -253,10 +253,10 @@ class npc_sinclari_vh : public CreatureScript public: npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); @@ -363,7 +363,7 @@ public: { if (Creature* pGuard = *itr) { - pGuard->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + pGuard->SetWalk(false); pGuard->GetMotionMaster()->MovePoint(0, MovePosition); } } @@ -426,9 +426,9 @@ public: struct mob_azure_saboteurAI : public npc_escortAI { - mob_azure_saboteurAI(Creature* c):npc_escortAI(c) + mob_azure_saboteurAI(Creature* creature):npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; uiBoss = 0; Reset(); @@ -447,32 +447,32 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void WaypointReached(uint32 uiWPointId) + void WaypointReached(uint32 waypointId) { switch (uiBoss) { case 1: - if (uiWPointId == 2) + if (waypointId == 2) FinishPointReached(); break; case 2: - if (uiWPointId == 2) + if (waypointId == 2) FinishPointReached(); break; case 3: - if (uiWPointId == 1) + if (waypointId == 1) FinishPointReached(); break; case 4: - if (uiWPointId == 0) + if (waypointId == 0) FinishPointReached(); break; case 5: - if (uiWPointId == 0) + if (waypointId == 0) FinishPointReached(); break; case 6: - if (uiWPointId == 4) + if (waypointId == 4) FinishPointReached(); break; } @@ -550,9 +550,9 @@ public: struct npc_teleportation_portalAI : public ScriptedAI { - npc_teleportation_portalAI(Creature* c) : ScriptedAI(c), listOfMobs(me) + npc_teleportation_portalAI(Creature* creature) : ScriptedAI(creature), listOfMobs(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); uiTypeOfMobsPortal = urand(0, 1); // 0 - elite mobs 1 - portal guardian or portal keeper with regular mobs bPortalGuardianOrKeeperOrEliteSpawn = false; } @@ -675,9 +675,9 @@ public: struct violet_hold_trashAI : public npc_escortAI { - violet_hold_trashAI(Creature* c):npc_escortAI(c) + violet_hold_trashAI(Creature* creature):npc_escortAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; if (instance) portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); @@ -690,32 +690,32 @@ struct violet_hold_trashAI : public npc_escortAI uint32 portalLocationID; uint32 secondPortalRouteID; - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { switch (portalLocationID) { case 0: - if (uiPointId == 5) + if (waypointId == 5) CreatureStartAttackDoor(); break; case 1: - if ((uiPointId == 8 && secondPortalRouteID == 0) || (uiPointId == 7 && secondPortalRouteID == 1)) + if ((waypointId == 8 && secondPortalRouteID == 0) || (waypointId == 7 && secondPortalRouteID == 1)) CreatureStartAttackDoor(); break; case 2: - if (uiPointId == 7) + if (waypointId == 7) CreatureStartAttackDoor(); break; case 3: - if (uiPointId == 8) + if (waypointId == 8) CreatureStartAttackDoor(); break; case 4: - if (uiPointId == 5) + if (waypointId == 5) CreatureStartAttackDoor(); break; case 5: - if (uiPointId == 3) + if (waypointId == 3) CreatureStartAttackDoor(); break; } @@ -778,7 +778,7 @@ struct violet_hold_trashAI : public npc_escortAI } } - void JustDied(Unit* /*unit*/) + void JustDied(Unit* /*killer*/) { if (Creature* portal = Unit::GetCreature((*me), instance->GetData64(DATA_TELEPORTATION_PORTAL))) CAST_AI(npc_teleportation_portal_vh::npc_teleportation_portalAI, portal->AI())->SummonedMobDied(me); @@ -808,9 +808,9 @@ public: struct mob_azure_invaderAI : public violet_hold_trashAI { - mob_azure_invaderAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_invaderAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiCleaveTimer; @@ -886,9 +886,9 @@ public: struct mob_azure_binderAI : public violet_hold_trashAI { - mob_azure_binderAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_binderAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiArcaneExplosionTimer; @@ -964,9 +964,9 @@ public: struct mob_azure_mage_slayerAI : public violet_hold_trashAI { - mob_azure_mage_slayerAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_mage_slayerAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiArcaneEmpowermentTimer; @@ -1024,9 +1024,9 @@ public: struct mob_azure_raiderAI : public violet_hold_trashAI { - mob_azure_raiderAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_raiderAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiConcussionBlowTimer; @@ -1076,9 +1076,9 @@ public: struct mob_azure_stalkerAI : public violet_hold_trashAI { - mob_azure_stalkerAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_stalkerAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiBackstabTimer; uint32 uiTacticalBlinkTimer; @@ -1135,9 +1135,9 @@ public: struct mob_azure_spellbreakerAI : public violet_hold_trashAI { - mob_azure_spellbreakerAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_spellbreakerAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiArcaneBlastTimer; @@ -1219,9 +1219,9 @@ public: struct mob_azure_captainAI : public violet_hold_trashAI { - mob_azure_captainAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_captainAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiMortalStrikeTimer; @@ -1271,9 +1271,9 @@ public: struct mob_azure_sorcerorAI : public violet_hold_trashAI { - mob_azure_sorcerorAI(Creature* c) : violet_hold_trashAI(c) + mob_azure_sorcerorAI(Creature* creature) : violet_hold_trashAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 uiArcaneStreamTimer; diff --git a/src/server/scripts/Northrend/borean_tundra.cpp b/src/server/scripts/Northrend/borean_tundra.cpp index 11fb0933b9b..8b51618eedd 100644 --- a/src/server/scripts/Northrend/borean_tundra.cpp +++ b/src/server/scripts/Northrend/borean_tundra.cpp @@ -60,7 +60,7 @@ public: struct npc_sinkhole_kill_creditAI : public ScriptedAI { - npc_sinkhole_kill_creditAI(Creature* c) : ScriptedAI(c){} + npc_sinkhole_kill_creditAI(Creature* creature) : ScriptedAI(creature){} uint32 uiPhaseTimer; uint8 Phase; @@ -139,7 +139,7 @@ public: case 7: DoCast(me, SPELL_EXPLODE_CART, true); if (Player* caster = Unit::GetPlayer(*me, casterGuid)) - caster->KilledMonster(me->GetCreatureInfo(), me->GetGUID()); + caster->KilledMonster(me->GetCreatureTemplate(), me->GetGUID()); uiPhaseTimer = 5000; Phase = 8; break; @@ -170,7 +170,7 @@ public: struct npc_khunok_the_behemothAI : public ScriptedAI { - npc_khunok_the_behemothAI(Creature* c) : ScriptedAI(c) {} + npc_khunok_the_behemothAI(Creature* creature) : ScriptedAI(creature) {} void MoveInLineOfSight(Unit* who) { @@ -186,7 +186,7 @@ public: if (owner->GetTypeId() == TYPEID_PLAYER) { owner->CastSpell(owner, 46231, true); - CAST_CRE(who)->ForcedDespawn(); + CAST_CRE(who)->DespawnOrUnsummon(); } } } @@ -228,10 +228,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { player->CLOSE_GOSSIP_MENU(); player->CastSpell(player, SPELL_TELEPORT_TO_SARAGOSA, true); @@ -273,10 +273,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); @@ -309,7 +309,6 @@ public: bool OnGossipHello(Player* player, Creature* creature) { - if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); @@ -317,10 +316,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); @@ -350,27 +349,28 @@ public: struct mob_nerubar_victimAI : public ScriptedAI { - mob_nerubar_victimAI(Creature* c) : ScriptedAI(c) {} + mob_nerubar_victimAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} void EnterCombat(Unit* /*who*/) {} void MoveInLineOfSight(Unit* /*who*/) {} - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { - if (Killer->GetTypeId() == TYPEID_PLAYER) + Player* player = killer->ToPlayer(); + if (!player) + return; + + if (player->GetQuestStatus(11611) == QUEST_STATUS_INCOMPLETE) { - if (CAST_PLR(Killer)->GetQuestStatus(11611) == QUEST_STATUS_INCOMPLETE) + uint8 uiRand = urand(0, 99); + if (uiRand < 25) { - uint8 uiRand = urand(0, 99); - if (uiRand < 25) - { - Killer->CastSpell(me, 45532, true); - CAST_PLR(Killer)->KilledMonsterCredit(WARSONG_PEON, 0); - } - else if (uiRand < 75) - Killer->CastSpell(me, nerubarVictims[urand(0, 2)], true); + player->CastSpell(me, 45532, true); + player->KilledMonsterCredit(WARSONG_PEON, 0); } + else if (uiRand < 75) + player->CastSpell(me, nerubarVictims[urand(0, 2)], true); } } }; @@ -403,9 +403,9 @@ public: { me->SetReactState(REACT_PASSIVE); - if (GameObject* pGO = me->FindNearestGameObject(GO_SCOURGE_CAGE, 5.0f)) - if (pGO->GetGoState() == GO_STATE_ACTIVE) - pGO->SetGoState(GO_STATE_READY); + if (GameObject* go = me->FindNearestGameObject(GO_SCOURGE_CAGE, 5.0f)) + if (go->GetGoState() == GO_STATE_ACTIVE) + go->SetGoState(GO_STATE_READY); } }; @@ -575,7 +575,7 @@ public: struct npc_nesingwary_trapperAI : public ScriptedAI { - npc_nesingwary_trapperAI(Creature* c) : ScriptedAI(c) { c->SetVisible(false); } + npc_nesingwary_trapperAI(Creature* creature) : ScriptedAI(creature) { creature->SetVisible(false); } uint64 go_caribouGUID; uint8 Phase; @@ -588,10 +588,11 @@ public: Phase = 1; go_caribouGUID = 0; } + void EnterCombat(Unit* /*who*/) {} void MoveInLineOfSight(Unit* /*who*/) {} - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (GameObject* go_caribou = me->GetMap()->GetGameObject(go_caribouGUID)) go_caribou->SetLootState(GO_JUST_DEACTIVATED); @@ -617,7 +618,6 @@ public: uiPhaseTimer = 2000; Phase = 2; break; - case 2: if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f)) me->GetMotionMaster()->MovePoint(0, go_fur->GetPositionX(), go_fur->GetPositionY(), go_fur->GetPositionZ()); @@ -645,7 +645,6 @@ public: uiPhaseTimer = 500; Phase = 7; break; - case 7: { GameObject* go_caribou = NULL; @@ -662,7 +661,7 @@ public: Phase = 8; uiPhaseTimer = 1000; } - break; + break; case 8: DoCast(me, SPELL_TRAPPED, true); Phase = 0; @@ -718,9 +717,9 @@ public: } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { - switch (i) + switch (waypointId) { case 0: IntroPhase = 1; @@ -849,7 +848,7 @@ public: struct npc_nexus_drake_hatchlingAI : public FollowerAI //The spell who makes the npc follow the player is missing, also we can use FollowerAI! { - npc_nexus_drake_hatchlingAI(Creature* c) : FollowerAI(c) {} + npc_nexus_drake_hatchlingAI(Creature* creature) : FollowerAI(creature) {} uint64 HarpoonerGUID; bool WithRedDragonBlood; @@ -1014,14 +1013,13 @@ public: uiPhaseTimer = 0; } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (uiPointId) + switch (waypointId) { case 3: SetEscortPaused(true); @@ -1030,18 +1028,17 @@ public: uiArthas = pArthas->GetGUID(); pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pArthas->SetReactState(REACT_PASSIVE); - pArthas->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pArthas->SetWalk(true); pArthas->GetMotionMaster()->MovePoint(0, 3737.374756f, 3564.841309f, 477.433014f); } if (Creature* pTalbot = me->SummonCreature(NPC_COUNSELOR_TALBOT, 3747.23f, 3614.936f, 473.321f, 4.462012f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000)) { uiTalbot = pTalbot->GetGUID(); - pTalbot->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pTalbot->SetWalk(true); pTalbot->GetMotionMaster()->MovePoint(0, 3738.000977f, 3568.882080f, 477.433014f); } - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); break; - case 4: SetEscortPaused(true); uiPhase = 7; @@ -1118,13 +1115,13 @@ public: if (Creature* pArlos = me->SummonCreature(NPC_GENERAL_ARLOS, 3745.527100f, 3615.655029f, 473.321533f, 4.447805f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000)) { uiArlos = pArlos->GetGUID(); - pArlos->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pArlos->SetWalk(true); pArlos->GetMotionMaster()->MovePoint(0, 3735.570068f, 3572.419922f, 477.441010f); } if (Creature* pLeryssa = me->SummonCreature(NPC_LERYSSA, 3749.654541f, 3614.959717f, 473.323486f, 4.524959f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000)) { uiLeryssa = pLeryssa->GetGUID(); - pLeryssa->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pLeryssa->SetWalk(false); pLeryssa->SetReactState(REACT_PASSIVE); pLeryssa->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pLeryssa->GetMotionMaster()->MovePoint(0, 3741.969971f, 3571.439941f, 477.441010f); @@ -1256,10 +1253,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); @@ -1446,11 +1443,11 @@ public: pArlos->Kill(pArlos, false); pLeryssa->RemoveAura(SPELL_STUN); pLeryssa->ClearUnitState(UNIT_STATE_STUNNED); - pLeryssa->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + pLeryssa->SetWalk(false); pLeryssa->GetMotionMaster()->MovePoint(0, 3722.114502f, 3564.201660f, 477.441437f); - if (killer->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(killer)->RewardPlayerAndGroupAtEvent(NPC_PRINCE_VALANAR, 0); + if (Player* player = killer->ToPlayer()) + player->RewardPlayerAndGroupAtEvent(NPC_PRINCE_VALANAR, 0); } }; @@ -1631,7 +1628,10 @@ public: StartFollow(pCaster->ToPlayer(), 0, NULL); me->UpdateEntry(NPC_CAPTURED_BERLY_SORCERER, TEAM_NEUTRAL); DoCast(me, SPELL_COSMETIC_ENSLAVE_CHAINS_SELF, true); - CAST_PLR(pCaster)->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER, 0); + + if (Player* player = pCaster->ToPlayer()) + player->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER, 0); + bEnslaved = true; } } @@ -1841,7 +1841,7 @@ public: struct npc_mootoo_the_youngerAI : public npc_escortAI { - npc_mootoo_the_youngerAI(Creature* c) : npc_escortAI(c) {} + npc_mootoo_the_youngerAI(Creature* creature) : npc_escortAI(creature) {} void Reset() { @@ -1854,35 +1854,33 @@ public: player->FailQuest(QUEST_ESCAPING_THE_MIST); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 10: - me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - DoScriptText(SAY_2, me); - break; - case 12: - DoScriptText(SAY_3, me); - me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT); - break; - case 16: - DoScriptText(SAY_4, me); - me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - break; - case 20: - me->SetPhaseMask(1, true); - DoScriptText(SAY_5, me); - me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - if (player) + case 10: + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + DoScriptText(SAY_2, me); + break; + case 12: + DoScriptText(SAY_3, me); + me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT); + break; + case 16: + DoScriptText(SAY_4, me); + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + case 20: + me->SetPhaseMask(1, true); + DoScriptText(SAY_5, me); + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); player->GroupEventHappens(QUEST_ESCAPING_THE_MIST, me); - SetRun(true); - break; + SetRun(true); + break; } } }; @@ -1926,7 +1924,7 @@ public: struct npc_bonker_togglevoltAI : public npc_escortAI { - npc_bonker_togglevoltAI(Creature* c) : npc_escortAI(c) {} + npc_bonker_togglevoltAI(Creature* creature) : npc_escortAI(creature) {} uint32 Bonker_agro; void Reset() @@ -1955,18 +1953,16 @@ public: else Bonker_agro=0; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { case 29: - if (player) - player->GroupEventHappens(QUEST_GET_ME_OUTA_HERE, me); + player->GroupEventHappens(QUEST_GET_ME_OUTA_HERE, me); break; } } @@ -2026,7 +2022,7 @@ public: struct npc_trapped_mammoth_calfAI : public ScriptedAI { - npc_trapped_mammoth_calfAI(Creature* c) : ScriptedAI(c) {} + npc_trapped_mammoth_calfAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiTimer; bool bStarted; @@ -2036,7 +2032,7 @@ public: uiTimer = 1500; bStarted = false; - GameObject* pTrap; + GameObject* pTrap = NULL; for (uint8 i = 0; i < MammothTrapsNum; ++i) { pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f); @@ -2071,11 +2067,12 @@ public: void MovementInform(uint32 uiType, uint32 /*uiId*/) { - if (uiType != POINT_MOTION_TYPE) return; + me->DisappearAndDie(); - GameObject* pTrap; + + GameObject* pTrap = NULL; for (uint8 i = 0; i < MammothTrapsNum; ++i) { pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f); @@ -2114,18 +2111,21 @@ public: struct npc_magmoth_crusherAI : public ScriptedAI { - npc_magmoth_crusherAI(Creature* c) : ScriptedAI(c) {} + npc_magmoth_crusherAI(Creature* creature) : ScriptedAI(creature) {} void JustDied(Unit* killer) { - if (killer->GetTypeId() == TYPEID_PLAYER && - CAST_PLR(killer)->GetQuestStatus(QUEST_YOU_RE_NOT_SO_BIG_NOW) == QUEST_STATUS_INCOMPLETE && + Player* player = killer->ToPlayer(); + if (!player) + return; + + if (player->GetQuestStatus(QUEST_YOU_RE_NOT_SO_BIG_NOW) == QUEST_STATUS_INCOMPLETE && (me->HasAura(SPELL_AURA_NOTSOBIG_1) || me->HasAura(SPELL_AURA_NOTSOBIG_2) || me->HasAura(SPELL_AURA_NOTSOBIG_3) || me->HasAura(SPELL_AURA_NOTSOBIG_4))) { Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_YOU_RE_NOT_SO_BIG_NOW); if (qInfo) - CAST_PLR(killer)->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0], 0); + player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0], 0); } } }; @@ -2150,13 +2150,15 @@ public: struct npc_seaforium_depth_chargeAI : public ScriptedAI { - npc_seaforium_depth_chargeAI(Creature* c) : ScriptedAI(c) {} + npc_seaforium_depth_chargeAI(Creature* creature) : ScriptedAI(creature) { } uint32 uiExplosionTimer; + void Reset() { uiExplosionTimer = urand(5000, 10000); } + void UpdateAI(const uint32 diff) { if (uiExplosionTimer < diff) @@ -2203,7 +2205,7 @@ public: struct npc_valiance_keep_cannoneerAI : public ScriptedAI { - npc_valiance_keep_cannoneerAI(Creature* c) : ScriptedAI(c) {} + npc_valiance_keep_cannoneerAI(Creature* creature) : ScriptedAI(creature) {} uint32 uiTimer; @@ -2229,7 +2231,6 @@ public: if (!UpdateVictim()) return; } - }; CreatureAI* GetAI(Creature* creature) const @@ -2540,18 +2541,18 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->AI()->SetGUID(player->GetGUID()); creature->AI()->DoAction(1); } - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -2561,31 +2562,31 @@ public: void AddSC_borean_tundra() { - new npc_sinkhole_kill_credit; - new npc_khunok_the_behemoth; - new npc_keristrasza; - new npc_corastrasza; - new npc_iruk; - new mob_nerubar_victim; - new npc_scourge_prisoner; - new npc_jenny; - new npc_fezzix_geartwist; - new npc_nesingwary_trapper; - new npc_lurgglbr; - new npc_nexus_drake_hatchling; - new npc_thassarian; - new npc_image_lich_king; - new npc_counselor_talbot; - new npc_leryssa; - new npc_general_arlos; - new npc_beryl_sorcerer; - new npc_imprisoned_beryl_sorcerer; - new npc_mootoo_the_younger; - new npc_bonker_togglevolt; - new npc_trapped_mammoth_calf; - new npc_magmoth_crusher; - new npc_seaforium_depth_charge; - new npc_valiance_keep_cannoneer; - new npc_warmage_coldarra; - new npc_hidden_cultist; + new npc_sinkhole_kill_credit(); + new npc_khunok_the_behemoth(); + new npc_keristrasza(); + new npc_corastrasza(); + new npc_iruk(); + new mob_nerubar_victim(); + new npc_scourge_prisoner(); + new npc_jenny(); + new npc_fezzix_geartwist(); + new npc_nesingwary_trapper(); + new npc_lurgglbr(); + new npc_nexus_drake_hatchling(); + new npc_thassarian(); + new npc_image_lich_king(); + new npc_counselor_talbot(); + new npc_leryssa(); + new npc_general_arlos(); + new npc_beryl_sorcerer(); + new npc_imprisoned_beryl_sorcerer(); + new npc_mootoo_the_younger(); + new npc_bonker_togglevolt(); + new npc_trapped_mammoth_calf(); + new npc_magmoth_crusher(); + new npc_seaforium_depth_charge(); + new npc_valiance_keep_cannoneer(); + new npc_warmage_coldarra(); + new npc_hidden_cultist(); } diff --git a/src/server/scripts/Northrend/dalaran.cpp b/src/server/scripts/Northrend/dalaran.cpp index 258d038ee4b..e7b92732066 100644 --- a/src/server/scripts/Northrend/dalaran.cpp +++ b/src/server/scripts/Northrend/dalaran.cpp @@ -153,13 +153,13 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRAIN) + if (action == GOSSIP_ACTION_TRAIN) player->GetSession()->SendTrainerList(creature->GetGUID()); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; diff --git a/src/server/scripts/Northrend/dragonblight.cpp b/src/server/scripts/Northrend/dragonblight.cpp index 0c1837ec37d..4cbe280a9f2 100644 --- a/src/server/scripts/Northrend/dragonblight.cpp +++ b/src/server/scripts/Northrend/dragonblight.cpp @@ -56,10 +56,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); player->SendMovieStart(MOVIE_ID_GATES); diff --git a/src/server/scripts/Northrend/grizzly_hills.cpp b/src/server/scripts/Northrend/grizzly_hills.cpp index ccb31c869a4..2da84dd3fdb 100644 --- a/src/server/scripts/Northrend/grizzly_hills.cpp +++ b/src/server/scripts/Northrend/grizzly_hills.cpp @@ -74,12 +74,13 @@ public: summoned->AI()->AttackStart(me->getVictim()); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); if (!player) return; - switch (i) + + switch (waypointId) { case 9: if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) @@ -162,7 +163,7 @@ public: player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); DoScriptText(SAY_QUEST_COMPLETE, me, player); } - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); break; case 25: DoScriptText(SAY_VICTORY4, me); @@ -194,9 +195,7 @@ public: if (HasEscortState(STATE_ESCORT_ESCORTING)) { if (m_uiChatTimer <= uiDiff) - { m_uiChatTimer = 12000; - } else m_uiChatTimer -= uiDiff; } @@ -209,9 +208,7 @@ public: { DoScriptText(SAY_QUEST_ACCEPT, creature); if (Creature* Mrfloppy = GetClosestCreatureWithEntry(creature, NPC_MRFLOPPY, 180.0f)) - { Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - } if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI()))) pEscortAI->Start(true, false, player->GetGUID()); @@ -233,7 +230,7 @@ public: struct npc_mrfloppyAI : public ScriptedAI { - npc_mrfloppyAI(Creature* c) : ScriptedAI(c) {} + npc_mrfloppyAI(Creature* creature) : ScriptedAI(creature) {} uint64 EmilyGUID; uint64 RWORGGUID; @@ -318,7 +315,7 @@ public: void SpellHit(Unit* pCaster, const SpellInfo* pSpell) { if (pSpell->Id == SPELL_OUTHOUSE_GROANS) - { + { ++m_counter; if (m_counter < 5) DoCast(pCaster, SPELL_CAMERA_SHAKE, true); @@ -327,8 +324,13 @@ public: DoCast(me, SPELL_DUST_FIELD, true); switch (m_gender) { - case GENDER_FEMALE: DoPlaySoundToSet(me, SOUND_FEMALE); break; - case GENDER_MALE: DoPlaySoundToSet(me, SOUND_MALE); break; + case GENDER_FEMALE: + DoPlaySoundToSet(me, SOUND_FEMALE); + break; + + case GENDER_MALE: + DoPlaySoundToSet(me, SOUND_MALE); + break; } } } @@ -471,13 +473,13 @@ public: struct npc_wounded_skirmisherAI : public ScriptedAI { - npc_wounded_skirmisherAI(Creature* c) : ScriptedAI(c) {} + npc_wounded_skirmisherAI(Creature* creature) : ScriptedAI(creature) {} uint64 uiPlayerGUID; uint32 DespawnTimer; - void Reset () + void Reset() { DespawnTimer = 5000; uiPlayerGUID = 0; @@ -503,7 +505,6 @@ public: me->SetStandState(UNIT_STAND_STATE_STAND); me->DespawnOrUnsummon(DespawnTimer); } - } } @@ -511,6 +512,7 @@ public: { if (!UpdateVictim()) return; + DoMeleeAttackIfReady(); } }; @@ -695,12 +697,12 @@ public: void AddSC_grizzly_hills() { - new npc_emily; - new npc_mrfloppy; - new npc_outhouse_bunny; - new npc_tallhorn_stag; - new npc_amberpine_woodsman; - new npc_wounded_skirmisher; + new npc_emily(); + new npc_mrfloppy(); + new npc_outhouse_bunny(); + new npc_tallhorn_stag(); + new npc_amberpine_woodsman(); + new npc_wounded_skirmisher(); new npc_lightning_sentry(); new npc_venture_co_straggler(); } diff --git a/src/server/scripts/Northrend/howling_fjord.cpp b/src/server/scripts/Northrend/howling_fjord.cpp index 3c44fa0eb44..88cc297868b 100644 --- a/src/server/scripts/Northrend/howling_fjord.cpp +++ b/src/server/scripts/Northrend/howling_fjord.cpp @@ -71,7 +71,7 @@ public: npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature){} uint32 PotTimer; - void Reset () + void Reset() { SetDespawnAtFar(false); PotTimer = 10000; //10 sec cooldown on potion @@ -97,20 +97,20 @@ public: DoMeleeAttackIfReady(); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); if (!player) return; - switch (i) + + switch (waypointId) { case 1: me->SetReactState(REACT_AGGRESSIVE); SetRun(true); break; case 23: - if (player) - player->GroupEventHappens(QUEST_TRAIL_OF_FIRE, me); + player->GroupEventHappens(QUEST_TRAIL_OF_FIRE, me); me->DespawnOrUnsummon(); break; case 5: @@ -254,10 +254,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_RAZAEL2, creature->GetGUID()); @@ -303,10 +303,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MG_II, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -389,7 +389,7 @@ public: { if (player->isAlive()) { - summon->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + summon->SetWalk(false); summon->GetMotionMaster()->MovePoint(0, afCenter[0], afCenter[1], afCenter[2]); summon->AI()->AttackStart(player); return; diff --git a/src/server/scripts/Northrend/icecrown.cpp b/src/server/scripts/Northrend/icecrown.cpp index 8da992af8fb..fb2e0f6c389 100644 --- a/src/server/scripts/Northrend/icecrown.cpp +++ b/src/server/scripts/Northrend/icecrown.cpp @@ -75,10 +75,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); @@ -149,10 +149,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->SummonCreature(NPC_ARGENT_VALIANT, 8575.451f, 952.472f, 547.554f, 0.38f); diff --git a/src/server/scripts/Northrend/sholazar_basin.cpp b/src/server/scripts/Northrend/sholazar_basin.cpp index 36dc6177f64..93d0182ea08 100644 --- a/src/server/scripts/Northrend/sholazar_basin.cpp +++ b/src/server/scripts/Northrend/sholazar_basin.cpp @@ -55,7 +55,7 @@ public: struct npc_injured_rainspeaker_oracleAI : public npc_escortAI { - npc_injured_rainspeaker_oracleAI(Creature* c) : npc_escortAI(c) { c_guid = c->GetGUID(); } + npc_injured_rainspeaker_oracleAI(Creature* creature) : npc_escortAI(creature) { c_guid = creature->GetGUID(); } uint64 c_guid; @@ -70,39 +70,40 @@ public: } } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 1: SetRun(); break; - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_JUMPING); - me->SetSpeed(MOVE_SWIM, 0.85f, true); - me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING); - break; - case 19: - me->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING); - break; - case 28: - player->GroupEventHappens(QUEST_FORTUNATE_MISUNDERSTANDINGS, me); - // me->RestoreFaction(); - DoScriptText(SAY_END_IRO, me); - SetRun(false); - break; + case 1: + SetRun(); + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + me->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + me->SetSpeed(MOVE_SWIM, 0.85f, true); + me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_DISABLE_GRAVITY); + break; + case 19: + me->SetUnitMovementFlags(MOVEMENTFLAG_FALLING); + break; + case 28: + player->GroupEventHappens(QUEST_FORTUNATE_MISUNDERSTANDINGS, me); + // me->RestoreFaction(); + DoScriptText(SAY_END_IRO, me); + SetRun(false); + break; } } @@ -113,8 +114,8 @@ public: if (Player* player = GetPlayerForEscort()) { - if (player->GetQuestStatus(QUEST_FORTUNATE_MISUNDERSTANDINGS) != QUEST_STATUS_COMPLETE) - player->FailQuest(QUEST_FORTUNATE_MISUNDERSTANDINGS); + if (player->GetQuestStatus(QUEST_FORTUNATE_MISUNDERSTANDINGS) != QUEST_STATUS_COMPLETE) + player->FailQuest(QUEST_FORTUNATE_MISUNDERSTANDINGS); } } }; @@ -132,14 +133,14 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); CAST_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(35.0f); - creature->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING); + creature->SetUnitMovementFlags(MOVEMENTFLAG_FALLING); DoScriptText(SAY_START_IRO, creature); switch (player->GetTeam()){ @@ -206,10 +207,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -263,10 +264,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -305,10 +306,9 @@ public: if (me->isDead()) return; - if (me->isSummon()) - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - if (summoner) - me->GetMotionMaster()->MovePoint(0, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); + if (TempSummon* summ = me->ToTempSummon()) + if (Unit* summoner = summ->GetSummoner()) + me->GetMotionMaster()->MovePoint(0, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); Reset(); } @@ -359,10 +359,11 @@ public: uint32 m_uiChatTimer; - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - switch (i) + + switch (waypointId) { case 0: DoScriptText(SAY_WP_2, me); @@ -401,12 +402,12 @@ public: { m_uiChatTimer = 4000; } + void JustDied(Unit* /*killer*/) { - Player* player = GetPlayerForEscort(); if (HasEscortState(STATE_ESCORT_ESCORTING)) { - if (player) + if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_DISASTER); } } @@ -647,11 +648,11 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); uint32 spellId = 0; - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: spellId = SPELL_ADD_ORANGE; break; case GOSSIP_ACTION_INFO_DEF + 2: spellId = SPELL_ADD_BANANAS; break; diff --git a/src/server/scripts/Northrend/storm_peaks.cpp b/src/server/scripts/Northrend/storm_peaks.cpp index 7bd59b92b7f..15239e9f836 100644 --- a/src/server/scripts/Northrend/storm_peaks.cpp +++ b/src/server/scripts/Northrend/storm_peaks.cpp @@ -61,10 +61,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { DoScriptText(SAY_AGGRO, creature); player->CLOSE_GOSSIP_MENU(); @@ -106,10 +106,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -166,10 +166,10 @@ public: return false; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(0, GOSSIP_SN1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -192,43 +192,6 @@ public: } }; -/*###### -## npc_goblin_prisoner -######*/ - -enum eGoblinPrisoner -{ - GO_RUSTY_CAGE = 191544 -}; - -class npc_goblin_prisoner : public CreatureScript -{ -public: - npc_goblin_prisoner() : CreatureScript("npc_goblin_prisoner") { } - - struct npc_goblin_prisonerAI : public ScriptedAI - { - npc_goblin_prisonerAI(Creature* creature) : ScriptedAI (creature){} - - void Reset() - { - me->SetReactState(REACT_PASSIVE); - - if (GameObject* pGO = me->FindNearestGameObject(GO_RUSTY_CAGE, 5.0f)) - { - if (pGO->GetGoState() == GO_STATE_ACTIVE) - pGO->SetGoState(GO_STATE_READY); - } - } - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_goblin_prisonerAI(creature); - } -}; - /*###### ## npc_victorious_challenger ######*/ @@ -307,10 +270,10 @@ public: return false; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->setFaction(14); @@ -363,10 +326,10 @@ public: return false; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOKLIRACRONE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -411,18 +374,20 @@ public: { npc_injured_goblinAI(Creature* creature) : npc_escortAI(creature) { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - switch (i) + if (!player) + return; + + switch (waypointId) { - case 26: - DoScriptText(SAY_END_WP_REACHED, me, player); - break; - case 27: - if (player) + case 26: + DoScriptText(SAY_END_WP_REACHED, me, player); + break; + case 27: player->GroupEventHappens(QUEST_BITTER_DEPARTURE, me); - break; + break; } } @@ -474,12 +439,12 @@ public: return false; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); npc_escortAI* pEscortAI = CAST_AI(npc_injured_goblin::npc_injured_goblinAI, creature->AI()); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { pEscortAI->Start(true, true, player->GetGUID()); creature->setFaction(113); @@ -585,7 +550,7 @@ public: // drake unsummoned, passengers dropped if (!me->IsOnVehicle(drake) && !hasEmptySeats) - me->ForcedDespawn(3000); + me->DespawnOrUnsummon(3000); if (enter_timer <= 0) return; @@ -602,9 +567,9 @@ public: enter_timer -= diff; } - void MoveInLineOfSight(Unit* unit) + void MoveInLineOfSight(Unit* who) { - if (!unit || !drakeGUID) + if (!who || !drakeGUID) return; Creature* drake = Unit::GetCreature(*me, drakeGUID); @@ -616,21 +581,21 @@ public: if (!me->IsOnVehicle(drake) && !me->HasAura(SPELL_ICE_PRISON)) { - if (unit->IsVehicle() && me->IsWithinDist(unit, 25.0f, true) && unit->ToCreature() && unit->ToCreature()->GetEntry() == 29709) + if (who->IsVehicle() && me->IsWithinDist(who, 25.0f, true) && who->ToCreature() && who->ToCreature()->GetEntry() == 29709) { - uint8 seat = unit->GetVehicleKit()->GetNextEmptySeat(0, true); + uint8 seat = who->GetVehicleKit()->GetNextEmptySeat(0, true); if (seat <= 0) return; - me->EnterVehicle(unit, seat); + me->EnterVehicle(who, seat); me->SendMovementFlagUpdate(); hasEmptySeats = false; } } - if (unit->ToCreature() && me->IsOnVehicle(drake)) + if (who->ToCreature() && me->IsOnVehicle(drake)) { - if (unit->ToCreature()->GetEntry() == NPC_QUEST_GIVER && me->IsWithinDist(unit, 15.0f, false)) + if (who->ToCreature()->GetEntry() == NPC_QUEST_GIVER && me->IsWithinDist(who, 15.0f, false)) { Unit* rider = drake->GetVehicleKit()->GetPassenger(0); if (!rider) @@ -640,7 +605,7 @@ public: me->ExitVehicle(); me->CastSpell(me, SPELL_SUMMON_LIBERATED, true); - me->ForcedDespawn(500); + me->DespawnOrUnsummon(500); // drake is empty now, deliver credit for drake and despawn him if (drake->GetVehicleKit()->HasEmptySeat(1) && @@ -651,7 +616,7 @@ public: if (rider->ToPlayer()) rider->ToPlayer()->KilledMonsterCredit(29709, 0); - drake->ToCreature()->ForcedDespawn(0); + drake->DespawnOrUnsummon(0); } } } @@ -706,7 +671,7 @@ public: } } - void WaypointReached(uint32 /*wp*/) + void WaypointReached(uint32 /*waypointId*/) { } @@ -746,7 +711,7 @@ class npc_hyldsmeet_protodrake : public CreatureScript class npc_hyldsmeet_protodrakeAI : public CreatureAI { public: - npc_hyldsmeet_protodrakeAI(Creature* c) : CreatureAI(c), _accessoryRespawnTimer(0), _vehicleKit(c->GetVehicleKit()) {} + npc_hyldsmeet_protodrakeAI(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0), _vehicleKit(creature->GetVehicleKit()) {} void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) { @@ -783,15 +748,14 @@ class npc_hyldsmeet_protodrake : public CreatureScript void AddSC_storm_peaks() { - new npc_agnetta_tyrsdottar; - new npc_frostborn_scout; - new npc_thorim; - new npc_goblin_prisoner; - new npc_victorious_challenger; - new npc_loklira_crone; - new npc_injured_goblin; - new npc_roxi_ramrocket; - new npc_brunnhildar_prisoner; - new npc_icefang; - new npc_hyldsmeet_protodrake; + new npc_agnetta_tyrsdottar(); + new npc_frostborn_scout(); + new npc_thorim(); + new npc_victorious_challenger(); + new npc_loklira_crone(); + new npc_injured_goblin(); + new npc_roxi_ramrocket(); + new npc_brunnhildar_prisoner(); + new npc_icefang(); + new npc_hyldsmeet_protodrake(); } diff --git a/src/server/scripts/Northrend/zuldrak.cpp b/src/server/scripts/Northrend/zuldrak.cpp index 0af82345dce..369f47cfb1c 100644 --- a/src/server/scripts/Northrend/zuldrak.cpp +++ b/src/server/scripts/Northrend/zuldrak.cpp @@ -52,8 +52,7 @@ public: float x, y, z; me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 0.1f); - if (Unit* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, - 0, TEMPSUMMON_DEAD_DESPAWN, 1000)) + if (Unit* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000)) { RageclawGUID = summon->GetGUID(); LockRageclaw(); @@ -92,7 +91,7 @@ public: if (Creature* pRageclaw = Unit::GetCreature(*me, RageclawGUID)) { UnlockRageclaw(pCaster); - pCaster->ToPlayer()->KilledMonster(pRageclaw->GetCreatureInfo(), RageclawGUID); + pCaster->ToPlayer()->KilledMonster(pRageclaw->GetCreatureTemplate(), RageclawGUID); me->DisappearAndDie(); } else @@ -156,7 +155,7 @@ public: me->RemoveAurasDueToSpell(SPELL_KNEEL); - me->setFaction(me->GetCreatureInfo()->faction_H); + me->setFaction(me->GetCreatureTemplate()->faction_H); DoCast(me, SPELL_UNSHACKLED, true); me->MonsterSay(SAY_RAGECLAW, LANG_UNIVERSAL, 0); @@ -223,10 +222,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); player->CastSpell(player, SPELL_GYMER, true); @@ -617,9 +616,9 @@ public: pWhisker->RemoveFromWorld(); } - void MovementInform(uint32 uiType, uint32 /*uiId*/) + void MovementInform(uint32 type, uint32 /*pointId*/) { - if (uiType != POINT_MOTION_TYPE) + if (type != EFFECT_MOTION_TYPE) return; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); @@ -741,9 +740,9 @@ public: bEnrage = false; } - void WaypointReached(uint32 uiI) + void WaypointReached(uint32 waypointId) { - switch (uiI) + switch (waypointId) { case 6: me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0); @@ -935,9 +934,9 @@ public: bThunderClap = false; } - void WaypointReached(uint32 uiI) + void WaypointReached(uint32 waypointId) { - switch (uiI) + switch (waypointId) { case 7: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); @@ -1072,7 +1071,7 @@ public: SummonList.clear(); - for (uint8 uiI = 0; uiI < 16 ; uiI++) + for (uint8 uiI = 0; uiI < 16; uiI++) { if (Creature* summon = me->SummonCreature(Boss[uiBossRandom].uiAdd, AddSpawnPosition[uiI])) { @@ -1328,7 +1327,7 @@ public: break; case 2: // walk forward - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (cos(m_heading) * 10), me->GetPositionY() + (sin(m_heading) * 10), me->GetPositionZ()); m_uiTimer = 5000; m_uiPhase = 3; @@ -1365,10 +1364,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF +1) + if (action == GOSSIP_ACTION_INFO_DEF +1) { player->CLOSE_GOSSIP_MENU(); creature->CastSpell(player, SPELL_QUEST_CREDIT, true); @@ -1397,14 +1396,14 @@ class go_scourge_enclosure : public GameObjectScript public: go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) { - Creature* pGymerDummy = pGO->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); + Creature* pGymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); if (pGymerDummy) { - pGO->UseDoorOrButton(); + go->UseDoorOrButton(); player->KilledMonsterCredit(pGymerDummy->GetEntry(), pGymerDummy->GetGUID()); pGymerDummy->CastSpell(pGymerDummy, 55529, true); pGymerDummy->DisappearAndDie(); diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt index 450f0f6cc7d..237b974aa9d 100644 --- a/src/server/scripts/OutdoorPvP/CMakeLists.txt +++ b/src/server/scripts/OutdoorPvP/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp index 6eb306b52af..1db4fb4dfc9 100755 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp @@ -244,7 +244,6 @@ void OPvPCapturePointEP_NPT::ChangeState() // complete quest objective if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) SendObjectiveComplete(EP_NPT_CM, 0); - } void OPvPCapturePointEP_NPT::SendChangePhase() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h index e019ba7ed7b..14712e0150d 100755 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h @@ -329,4 +329,3 @@ class OutdoorPvPEP : public OutdoorPvP }; #endif - diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp index 5b3468de203..38fed30f542 100755 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp @@ -176,7 +176,6 @@ OutdoorPvPZM::OutdoorPvPZM() m_GraveYard = NULL; m_AllianceTowersControlled = 0; m_HordeTowersControlled = 0; - } bool OutdoorPvPZM::SetupOutdoorPvP() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h index 2a11139a701..8d2124a3791 100755 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h @@ -219,7 +219,7 @@ class OPvPCapturePointZM_GraveYard : public OPvPCapturePoint bool HandleDropFlag(Player* player, uint32 spellId); - bool CanTalkTo(Player* player, Creature* c, GossipMenuItems const& gso); + bool CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso); uint32 GetGraveYardState() const; diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp index ef160a3a5c5..ae1a7296de6 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -53,7 +53,7 @@ public: struct mob_stolen_soulAI : public ScriptedAI { - mob_stolen_soulAI(Creature* c) : ScriptedAI(c) {} + mob_stolen_soulAI(Creature* creature) : ScriptedAI(creature) {} uint8 myClass; uint32 Class_Timer; @@ -162,7 +162,7 @@ public: struct boss_exarch_maladaarAI : public ScriptedAI { - boss_exarch_maladaarAI(Creature* c) : ScriptedAI(c) + boss_exarch_maladaarAI(Creature* creature) : ScriptedAI(creature) { HasTaunted = false; } @@ -233,7 +233,7 @@ public: DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); //When Exarch Maladar is defeated D'ore appear. @@ -319,7 +319,7 @@ public: struct mob_avatar_of_martyredAI : public ScriptedAI { - mob_avatar_of_martyredAI(Creature* c) : ScriptedAI(c) {} + mob_avatar_of_martyredAI(Creature* creature) : ScriptedAI(creature) {} uint32 Mortal_Strike_timer; diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp index d359917ab28..5fc912f2a01 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp @@ -52,7 +52,7 @@ public: struct boss_shirrak_the_dead_watcherAI : public ScriptedAI { - boss_shirrak_the_dead_watcherAI(Creature* c) : ScriptedAI(c) + boss_shirrak_the_dead_watcherAI(Creature* creature) : ScriptedAI(creature) { } @@ -170,7 +170,7 @@ public: struct mob_focus_fireAI : public ScriptedAI { - mob_focus_fireAI(Creature* c) : ScriptedAI(c) + mob_focus_fireAI(Creature* creature) : ScriptedAI(creature) { } diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp index aa63f1adf18..a4bba5f28fb 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp @@ -67,7 +67,7 @@ public: struct boss_nexusprince_shaffarAI : public ScriptedAI { - boss_nexusprince_shaffarAI(Creature* c) : ScriptedAI(c), summons(me) { HasTaunted = false; } + boss_nexusprince_shaffarAI(Creature* creature) : ScriptedAI(creature), summons(me) { HasTaunted = false; } uint32 Blink_Timer; uint32 Beacon_Timer; @@ -145,7 +145,7 @@ public: DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEAD, me); summons.DespawnAll(); @@ -233,7 +233,7 @@ public: struct mob_ethereal_beaconAI : public ScriptedAI { - mob_ethereal_beaconAI(Creature* c) : ScriptedAI(c) + mob_ethereal_beaconAI(Creature* creature) : ScriptedAI(creature) { } @@ -325,7 +325,7 @@ public: struct mob_ethereal_apprenticeAI : public ScriptedAI { - mob_ethereal_apprenticeAI(Creature* c) : ScriptedAI(c) {} + mob_ethereal_apprenticeAI(Creature* creature) : ScriptedAI(creature) {} uint32 Cast_Timer; diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp index d9ba99fcf24..487a1dd41ea 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp @@ -53,7 +53,7 @@ public: struct boss_pandemoniusAI : public ScriptedAI { - boss_pandemoniusAI(Creature* c) : ScriptedAI(c) + boss_pandemoniusAI(Creature* creature) : ScriptedAI(creature) { } @@ -68,7 +68,7 @@ public: VoidBlast_Counter = 0; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp index 2fd7498ea82..37544f9377b 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp @@ -65,7 +65,7 @@ public: struct boss_darkweaver_sythAI : public ScriptedAI { - boss_darkweaver_sythAI(Creature* c) : ScriptedAI(c) + boss_darkweaver_sythAI(Creature* creature) : ScriptedAI(creature) { } @@ -97,7 +97,7 @@ public: DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2, SAY_AGGRO_3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } @@ -206,7 +206,7 @@ public: struct mob_syth_fireAI : public ScriptedAI { - mob_syth_fireAI(Creature* c) : ScriptedAI(c) + mob_syth_fireAI(Creature* creature) : ScriptedAI(creature) { } @@ -265,7 +265,7 @@ public: struct mob_syth_arcaneAI : public ScriptedAI { - mob_syth_arcaneAI(Creature* c) : ScriptedAI(c) + mob_syth_arcaneAI(Creature* creature) : ScriptedAI(creature) { } @@ -319,7 +319,7 @@ public: struct mob_syth_frostAI : public ScriptedAI { - mob_syth_frostAI(Creature* c) : ScriptedAI(c) + mob_syth_frostAI(Creature* creature) : ScriptedAI(creature) { } @@ -374,7 +374,7 @@ public: struct mob_syth_shadowAI : public ScriptedAI { - mob_syth_shadowAI(Creature* c) : ScriptedAI(c) + mob_syth_shadowAI(Creature* creature) : ScriptedAI(creature) { } diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp index c3c53416a9b..768c4bf12d3 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp @@ -64,9 +64,9 @@ public: struct boss_talon_king_ikissAI : public ScriptedAI { - boss_talon_king_ikissAI(Creature* c) : ScriptedAI(c) + boss_talon_king_ikissAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -101,7 +101,7 @@ public: DoScriptText(SAY_INTRO, me); } - if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; float attackRadius = me->GetAttackDistance(who); @@ -118,7 +118,7 @@ public: DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2, SAY_AGGRO_3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp index d3ea73c5ba0..d92e76685d1 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp @@ -58,10 +58,10 @@ public: { boss_ambassador_hellmawAI(Creature* creature) : npc_escortAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 EventCheck_Timer; uint32 CorrosiveAcid_Timer; @@ -81,17 +81,17 @@ public: IsBanished = true; Enraged = false; - if (m_instance && me->isAlive()) + if (instance && me->isAlive()) { - if (m_instance->GetData(TYPE_OVERSEER) != DONE) + if (instance->GetData(TYPE_OVERSEER) != DONE) DoCast(me, SPELL_BANISH, true); } } void JustReachedHome() { - if (m_instance) - m_instance->SetData(TYPE_HELLMAW, FAIL); + if (instance) + instance->SetData(TYPE_HELLMAW, FAIL); } void MoveInLineOfSight(Unit* who) @@ -102,7 +102,7 @@ public: npc_escortAI::MoveInLineOfSight(who); } - void WaypointReached(uint32 /*i*/) + void WaypointReached(uint32 /*waypointId*/) { } @@ -114,15 +114,15 @@ public: IsBanished = false; Intro = true; - if (m_instance) + if (instance) { - if (m_instance->GetData(TYPE_HELLMAW) != FAIL) + if (instance->GetData(TYPE_HELLMAW) != FAIL) { DoScriptText(SAY_INTRO, me); Start(true, false, 0, NULL, false, true); } - m_instance->SetData(TYPE_HELLMAW, IN_PROGRESS); + instance->SetData(TYPE_HELLMAW, IN_PROGRESS); } } @@ -136,12 +136,12 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); - if (m_instance) - m_instance->SetData(TYPE_HELLMAW, DONE); + if (instance) + instance->SetData(TYPE_HELLMAW, DONE); } void UpdateAI(const uint32 diff) @@ -150,9 +150,9 @@ public: { if (EventCheck_Timer <= diff) { - if (m_instance) + if (instance) { - if (m_instance->GetData(TYPE_OVERSEER) == DONE) + if (instance->GetData(TYPE_OVERSEER) == DONE) { DoIntro(); return; diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp index f7032d78bb6..6eac36f71c8 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp @@ -66,9 +66,9 @@ public: struct boss_blackheart_the_inciterAI : public ScriptedAI { - boss_blackheart_the_inciterAI(Creature* c) : ScriptedAI(c) + boss_blackheart_the_inciterAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -96,7 +96,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index 81a7750d512..8d971c37559 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -74,7 +74,7 @@ public: struct mob_voidtravelerAI : public ScriptedAI { - mob_voidtravelerAI(Creature* c) : ScriptedAI(c) + mob_voidtravelerAI(Creature* creature) : ScriptedAI(creature) { } @@ -147,9 +147,9 @@ public: struct boss_grandmaster_vorpilAI : public ScriptedAI { - boss_grandmaster_vorpilAI(Creature* c) : ScriptedAI(c) + boss_grandmaster_vorpilAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); Intro = false; } @@ -201,7 +201,7 @@ public: { for (uint8 i = 0; i < 5; ++i) { - Unit* Portal = Unit::GetUnit((*me), PortalsGuid[i]); + Unit* Portal = Unit::GetUnit(*me, PortalsGuid[i]); if (Portal && Portal->isAlive()) Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); PortalsGuid[i] = 0; @@ -232,7 +232,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); destroyPortals(); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index 5fd908c44e8..99661d8818c 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -48,7 +48,7 @@ public: struct boss_murmurAI : public ScriptedAI { - boss_murmurAI(Creature* c) : ScriptedAI(c) + boss_murmurAI(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); } @@ -166,7 +166,7 @@ public: { std::list& m_threatlist = me->getThreatManager().getThreatList(); for (std::list::const_iterator i = m_threatlist.begin(); i != m_threatlist.end(); ++i) - if (Unit* target = Unit::GetUnit((*me), (*i)->getUnitGuid())) + if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid())) if (target->isAlive() && !me->IsWithinDist(target, 35, false)) DoCast(target, SPELL_THUNDERING_STORM, true); ThunderingStorm_Timer = 15000; @@ -189,7 +189,7 @@ public: { std::list& m_threatlist = me->getThreatManager().getThreatList(); for (std::list::const_iterator i = m_threatlist.begin(); i != m_threatlist.end(); ++i) - if (Unit* target = Unit::GetUnit((*me), (*i)->getUnitGuid())) + if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid())) if (target->isAlive() && me->IsWithinMeleeRange(target)) { me->TauntApply(target); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp index 1a9155dacb2..846669552ba 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp @@ -75,7 +75,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.cpp b/src/server/scripts/Outland/BlackTemple/black_temple.cpp index a934d5587c2..546f9ee1e7d 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/black_temple.cpp @@ -42,10 +42,10 @@ class npc_spirit_of_olum : public CreatureScript public: npc_spirit_of_olum() : CreatureScript("npc_spirit_of_olum") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) player->CLOSE_GOSSIP_MENU(); player->InterruptNonMeleeSpells(false); diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 3227e685fc4..caac89da765 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -67,9 +67,9 @@ public: struct boss_gurtogg_bloodboilAI : public ScriptedAI { - boss_gurtogg_bloodboilAI(Creature* c) : ScriptedAI(c) + boss_gurtogg_bloodboilAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -130,7 +130,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_GURTOGGBLOODBOILEVENT, DONE); @@ -186,7 +186,7 @@ public: void RevertThreatOnTarget(uint64 guid) { Unit* unit = NULL; - unit = Unit::GetUnit((*me), guid); + unit = Unit::GetUnit(*me, guid); if (unit) { if (DoGetThreat(unit)) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 58f0e10c950..1926929c97c 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -379,7 +379,7 @@ public: struct flame_of_azzinothAI : public ScriptedAI { - flame_of_azzinothAI(Creature* c) : ScriptedAI(c) {} + flame_of_azzinothAI(Creature* creature) : ScriptedAI(creature) {} uint32 FlameBlastTimer; uint32 CheckTimer; @@ -392,7 +392,10 @@ public: GlaiveGUID = 0; } - void EnterCombat(Unit* /*who*/) {DoZoneInCombat();} + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void ChargeCheck() { @@ -430,7 +433,10 @@ public: } } - void SetGlaiveGUID(uint64 guid){ GlaiveGUID = guid; } + void SetGlaiveGUID(uint64 guid) + { + GlaiveGUID = guid; + } void UpdateAI(const uint32 diff) { @@ -471,9 +477,9 @@ public: struct boss_illidan_stormrageAI : public ScriptedAI { - boss_illidan_stormrageAI(Creature* c) : ScriptedAI(c), Summons(me) + boss_illidan_stormrageAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); DoCast(me, SPELL_DUAL_WIELD, true); } @@ -502,7 +508,7 @@ public: void SummonedCreatureDespawn(Creature* summon) { - if (summon->GetCreatureInfo()->Entry == FLAME_OF_AZZINOTH) + if (summon->GetCreatureTemplate()->Entry == FLAME_OF_AZZINOTH) { for (uint8 i = 0; i < 2; ++i) if (summon->GetGUID() == FlameGUID[i]) @@ -566,7 +572,9 @@ public: void KilledUnit(Unit* victim) { - if (victim == me) return; + if (victim == me) + return; + // TODO: Find better way to handle emote switch (urand(0, 1)) { @@ -747,10 +755,11 @@ public: final.y = 2 * final.y - initial.y; Creature* Trigger = me->SummonCreature(23069, initial.x, initial.y, initial.z, 0, TEMPSUMMON_TIMED_DESPAWN, 13000); - if (!Trigger) return; + if (!Trigger) + return; Trigger->SetSpeed(MOVE_WALK, 3); - Trigger->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + Trigger->SetWalk(true); Trigger->GetMotionMaster()->MovePoint(0, final.x, final.y, final.z); // Trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -798,7 +807,7 @@ public: { case 1: // lift off me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); me->StopMoving(); me->MonsterYell(SAY_TAKEOFF, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_TAKEOFF); @@ -856,7 +865,7 @@ public: { if (GlaiveGUID[i]) { - Unit* Glaive = Unit::GetUnit((*me), GlaiveGUID[i]); + Unit* Glaive = Unit::GetUnit(*me, GlaiveGUID[i]); if (Glaive) { Glaive->CastSpell(me, SPELL_GLAIVE_RETURNS, false); // Make it look like the Glaive flies back up to us @@ -867,7 +876,7 @@ public: Timer[EVENT_FLIGHT_SEQUENCE] = 2000; break; case 9: // land - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->StopMoving(); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); for (uint8 i = 0; i < 2; ++i) @@ -1157,7 +1166,7 @@ public: struct boss_maievAI : public ScriptedAI { - boss_maievAI(Creature* c) : ScriptedAI(c) {}; + boss_maievAI(Creature* creature) : ScriptedAI(creature) {}; uint64 IllidanGUID; @@ -1181,7 +1190,11 @@ public: void EnterCombat(Unit* /*who*/) {} void MoveInLineOfSight(Unit* /*who*/) {} void EnterEvadeMode() {} - void GetIllidanGUID(uint64 guid) { IllidanGUID = guid; } + + void GetIllidanGUID(uint64 guid) + { + IllidanGUID = guid; + } void DamageTaken(Unit* done_by, uint32 &damage) { @@ -1372,9 +1385,9 @@ public: struct npc_akama_illidanAI : public ScriptedAI { - npc_akama_illidanAI(Creature* c) : ScriptedAI(c) + npc_akama_illidanAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); JustCreated = true; } bool JustCreated; @@ -1479,7 +1492,7 @@ public: std::vector eliteList; for (std::list::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->GetEntry() == ILLIDARI_ELITE) eliteList.push_back(unit); } @@ -1537,7 +1550,7 @@ public: void BeginWalk() { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->SetSpeed(MOVE_RUN, 1.0f); me->GetMotionMaster()->MovePoint(0, AkamaWP[WalkCount].x, AkamaWP[WalkCount].y, AkamaWP[WalkCount].z); } @@ -1636,9 +1649,9 @@ public: Unit* Channel = NULL, *Spirit[2] = { NULL, NULL }; if (ChannelCount <= 5) { - Channel = Unit::GetUnit((*me), ChannelGUID); - Spirit[0] = Unit::GetUnit((*me), SpiritGUID[0]); - Spirit[1] = Unit::GetUnit((*me), SpiritGUID[1]); + Channel = Unit::GetUnit(*me, ChannelGUID); + Spirit[0] = Unit::GetUnit(*me, SpiritGUID[0]); + Spirit[1] = Unit::GetUnit(*me, SpiritGUID[1]); if (!Channel || !Spirit[0] || !Spirit[1]) return; } @@ -1801,10 +1814,10 @@ public: } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) // Time to begin the Event + if (action == GOSSIP_ACTION_INFO_DEF) // Time to begin the Event { player->CLOSE_GOSSIP_MENU(); CAST_AI(npc_akama_illidan::npc_akama_illidanAI, creature->AI())->EnterPhase(PHASE_CHANNEL); @@ -1869,7 +1882,7 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset() me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->setActive(false); Summons.DespawnAll(); } @@ -1932,7 +1945,7 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::HandleTalkSequence() // Equip our warglaives! SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_ID_OFF_HAND, EQUIP_NO_CHANGE); me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); break; case 9: if (GETCRE(Akama, AkamaGUID)) @@ -2019,7 +2032,7 @@ public: struct cage_trap_triggerAI : public ScriptedAI { - cage_trap_triggerAI(Creature* c) : ScriptedAI(c) {} + cage_trap_triggerAI(Creature* creature) : ScriptedAI(creature) {} uint64 IllidanGUID; uint32 DespawnTimer; @@ -2083,7 +2096,6 @@ public: // } } }; - }; class gameobject_cage_trap : public GameObjectScript @@ -2102,7 +2114,6 @@ public: go->SetGoState(GO_STATE_ACTIVE); return true; } - }; class mob_shadow_demon : public CreatureScript @@ -2117,11 +2128,14 @@ public: struct shadow_demonAI : public ScriptedAI { - shadow_demonAI(Creature* c) : ScriptedAI(c) {} + shadow_demonAI(Creature* creature) : ScriptedAI(creature) {} uint64 TargetGUID; - void EnterCombat(Unit* /*who*/) {DoZoneInCombat();} + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void Reset() { @@ -2131,15 +2145,17 @@ public: void JustDied(Unit* /*killer*/) { - if (Unit* target = Unit::GetUnit((*me), TargetGUID)) + if (Unit* target = Unit::GetUnit(*me, TargetGUID)) target->RemoveAurasDueToSpell(SPELL_PARALYZE); } void UpdateAI(const uint32 /*diff*/) { - if (!UpdateVictim()) return; + if (!UpdateVictim()) + return; - if (me->getVictim()->GetTypeId() != TYPEID_PLAYER) return; // Only cast the below on players. + if (me->getVictim()->GetTypeId() != TYPEID_PLAYER) + return; // Only cast the below on players. if (!me->getVictim()->HasAura(SPELL_PARALYZE)) { @@ -2153,7 +2169,6 @@ public: DoCast(me->getVictim(), SPELL_CONSUME_SOUL); } }; - }; class mob_blade_of_azzinoth : public CreatureScript @@ -2168,7 +2183,7 @@ public: struct blade_of_azzinothAI : public NullCreatureAI { - blade_of_azzinothAI(Creature* c) : NullCreatureAI(c) {} + blade_of_azzinothAI(Creature* creature) : NullCreatureAI(creature) {} void SpellHit(Unit* /*caster*/, const SpellInfo* spell) { @@ -2192,9 +2207,9 @@ public: // Shadowfiends interact with Illidan, setting more targets in Illidan's hashmap struct mob_parasitic_shadowfiendAI : public ScriptedAI { - mob_parasitic_shadowfiendAI(Creature* c) : ScriptedAI(c) + mob_parasitic_shadowfiendAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -2212,7 +2227,10 @@ public: DoCast(me, SPELL_SHADOWFIEND_PASSIVE, true); } - void EnterCombat(Unit* /*who*/) { DoZoneInCombat(); } + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void DoMeleeAttackIfReady() { @@ -2258,7 +2276,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_boss_illidan() diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index 3c7f0d3b89c..4e4607a7d44 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -90,9 +90,9 @@ public: struct boss_shahrazAI : public ScriptedAI { - boss_shahrazAI(Creature* c) : ScriptedAI(c) + boss_shahrazAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -149,7 +149,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_MOTHERSHAHRAZEVENT, DONE); @@ -250,7 +250,7 @@ public: Unit* unit = NULL; if (TargetGUID[i]) { - unit = Unit::GetUnit((*me), TargetGUID[i]); + unit = Unit::GetUnit(*me, TargetGUID[i]); if (unit) unit->CastSpell(unit, SPELL_ATTRACTION, true); TargetGUID[i] = 0; diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index b0c29afda34..c5e78f2fa7b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -113,7 +113,7 @@ public: struct npc_enslaved_soulAI : public ScriptedAI { - npc_enslaved_soulAI(Creature* c) : ScriptedAI(c) {} + npc_enslaved_soulAI(Creature* creature) : ScriptedAI(creature) {} uint64 ReliquaryGUID; @@ -142,9 +142,9 @@ public: struct boss_reliquary_of_soulsAI : public ScriptedAI { - boss_reliquary_of_soulsAI(Creature* c) : ScriptedAI(c) + boss_reliquary_of_soulsAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); EssenceGUID = 0; } @@ -197,8 +197,11 @@ public: uint32 random = rand()%6; float x = Coords[random].x; float y = Coords[random].y; + Creature* Soul = me->SummonCreature(CREATURE_ENSLAVED_SOUL, x, y, me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 0); - if (!Soul) return false; + if (!Soul) + return false; + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { CAST_AI(npc_enslaved_soul::npc_enslaved_soulAI, Soul->AI())->ReliquaryGUID = me->GetGUID(); @@ -216,7 +219,7 @@ public: std::list::const_iterator itr = m_threatlist.begin(); for (; itr != m_threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit) { DoModifyThreatPercent(unit, -100); @@ -379,7 +382,7 @@ public: struct boss_essence_of_sufferingAI : public ScriptedAI { - boss_essence_of_sufferingAI(Creature* c) : ScriptedAI(c) {} + boss_essence_of_sufferingAI(Creature* creature) : ScriptedAI(creature) {} uint64 StatAuraGUID; @@ -438,7 +441,7 @@ public: std::list::const_iterator itr = m_threatlist.begin(); for (; itr != m_threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->isAlive() && (unit->GetTypeId() == TYPEID_PLAYER)) // Only alive players targets.push_back(unit); } @@ -504,7 +507,7 @@ public: struct boss_essence_of_desireAI : public ScriptedAI { - boss_essence_of_desireAI(Creature* c) : ScriptedAI(c) {} + boss_essence_of_desireAI(Creature* creature) : ScriptedAI(creature) {} uint32 RuneShieldTimer; uint32 DeadenTimer; @@ -607,7 +610,7 @@ public: struct boss_essence_of_angerAI : public ScriptedAI { - boss_essence_of_angerAI(Creature* c) : ScriptedAI(c) {} + boss_essence_of_angerAI(Creature* creature) : ScriptedAI(creature) {} uint64 AggroTargetGUID; @@ -640,7 +643,7 @@ public: DoCast(me, AURA_OF_ANGER, true); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(ANGER_SAY_DEATH, me); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 5ca3189ebca..630e44429fa 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -121,7 +121,10 @@ public: struct mob_ashtongue_channelerAI : public ScriptedAI { - mob_ashtongue_channelerAI(Creature* c) : ScriptedAI(c) {ShadeGUID = 0;} + mob_ashtongue_channelerAI(Creature* creature) : ScriptedAI(creature) + { + ShadeGUID = 0; + } uint64 ShadeGUID; @@ -147,7 +150,10 @@ public: struct mob_ashtongue_sorcererAI : public ScriptedAI { - mob_ashtongue_sorcererAI(Creature* c) : ScriptedAI(c) {ShadeGUID = 0;} + mob_ashtongue_sorcererAI(Creature* creature) : ScriptedAI(creature) + { + ShadeGUID = 0; + } uint64 ShadeGUID; uint32 CheckTimer; @@ -202,9 +208,9 @@ public: struct boss_shade_of_akamaAI : public ScriptedAI { - boss_shade_of_akamaAI(Creature* c) : ScriptedAI(c), summons(me) + boss_shade_of_akamaAI(Creature* creature) : ScriptedAI(creature), summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); AkamaGUID = instance ? instance->GetData64(DATA_AKAMA_SHADE) : 0; me->setActive(true);//if view distance is too low me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); @@ -320,7 +326,8 @@ public: void AttackStart(Unit* who) { - if (!who || IsBanished) return; + if (!who || IsBanished) + return; if (who->isTargetableForAttack() && who != me) DoStartMovement(who); @@ -354,7 +361,7 @@ public: if (Sorcerer) { CAST_AI(mob_ashtongue_sorcerer::mob_ashtongue_sorcererAI, Sorcerer->AI())->ShadeGUID = me->GetGUID(); - Sorcerer->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Sorcerer->SetWalk(false); Sorcerer->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); Sorcerer->SetTarget(me->GetGUID()); Sorcerers.push_back(Sorcerer->GetGUID()); @@ -369,7 +376,7 @@ public: Creature* Spawn = me->SummonCreature(spawnEntries[i], X, Y, Z_SPAWN, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 25000); if (Spawn) { - Spawn->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Spawn->SetWalk(false); Spawn->GetMotionMaster()->MovePoint(0, AGGRO_X, AGGRO_Y, AGGRO_Z); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); Spawn->AI()->AttackStart(target); @@ -430,7 +437,7 @@ public: Creature* Defender = me->SummonCreature(CREATURE_DEFENDER, SpawnLocations[ran].x, SpawnLocations[ran].y, Z_SPAWN, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 25000); if (Defender) { - Defender->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Defender->SetWalk(false); bool move = true; if (AkamaGUID) { @@ -541,10 +548,10 @@ class npc_akama_shade : public CreatureScript public: npc_akama_shade() : CreatureScript("npc_akama_shade") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) //Fight time + if (action == GOSSIP_ACTION_INFO_DEF + 1) //Fight time { player->CLOSE_GOSSIP_MENU(); CAST_AI(npc_akama_shade::npc_akamaAI, creature->AI())->BeginEvent(player); @@ -571,11 +578,11 @@ public: struct npc_akamaAI : public ScriptedAI { - npc_akamaAI(Creature* c) : ScriptedAI(c), summons(me) + npc_akamaAI(Creature* creature) : ScriptedAI(creature), summons(me) { ShadeHasDied = false; StartCombat = false; - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); if (instance) ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); else @@ -662,7 +669,8 @@ public: me->CombatStart(Shade); Shade->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); Shade->SetTarget(me->GetGUID()); - if (player) Shade->AddThreat(player, 1.0f); + if (player) + Shade->AddThreat(player, 1.0f); DoZoneInCombat(Shade); EventBegun = true; } @@ -675,17 +683,19 @@ public: switch (id) { - case 0: ++WayPointId; break; + case 0: + ++WayPointId; + break; - case 1: - if (Creature* Shade = Unit::GetCreature(*me, ShadeGUID)) - { - me->SetTarget(ShadeGUID); - DoCast(Shade, SPELL_AKAMA_SOUL_RETRIEVE); - EndingTalkCount = 0; - SoulRetrieveTimer = 16000; - } - break; + case 1: + if (Creature* Shade = Unit::GetCreature(*me, ShadeGUID)) + { + me->SetTarget(ShadeGUID); + DoCast(Shade, SPELL_AKAMA_SOUL_RETRIEVE); + EndingTalkCount = 0; + SoulRetrieveTimer = 16000; + } + break; } } @@ -760,7 +770,7 @@ public: { ShadeHasDied = true; WayPointId = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->GetMotionMaster()->MovePoint(WayPointId, AkamaWP[0].x, AkamaWP[0].y, AkamaWP[0].z); } if (Shade && Shade->isAlive()) @@ -878,7 +888,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_boss_shade_of_akama() diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index 5a02ffc891f..ce1732433c8 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -65,7 +65,7 @@ public: struct molten_flameAI : public NullCreatureAI { - molten_flameAI(Creature* c) : NullCreatureAI(c) {} + molten_flameAI(Creature* creature) : NullCreatureAI(creature) {} void InitializeAI() { @@ -91,9 +91,9 @@ public: struct boss_supremusAI : public ScriptedAI { - boss_supremusAI(Creature* c) : ScriptedAI(c), summons(me) + boss_supremusAI(Creature* creature) : ScriptedAI(creature), summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -134,7 +134,8 @@ public: if (!phase || phase == PHASE_CHASE) { phase = PHASE_STRIKE; - summons.DoAction(EVENT_VOLCANO, 0); + DummyEntryCheckPredicate pred; + summons.DoAction(EVENT_VOLCANO, pred); events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE); me->SetSpeed(MOVE_RUN, 1.2f); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); @@ -165,8 +166,15 @@ public: summons.DespawnAll(); } - void JustSummoned(Creature* summon) {summons.Summon(summon);} - void SummonedCreatureDespawn(Creature* summon) {summons.Despawn(summon);} + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } Unit* CalculateHatefulStrikeTarget() { @@ -177,7 +185,7 @@ public: std::list::const_iterator i = m_threatlist.begin(); for (i = m_threatlist.begin(); i!= m_threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && me->IsWithinMeleeRange(unit)) { if (unit->GetHealth() > health) @@ -263,7 +271,7 @@ public: struct npc_volcanoAI : public Scripted_NoMovementAI { - npc_volcanoAI(Creature* c) : Scripted_NoMovementAI(c) {} + npc_volcanoAI(Creature* creature) : Scripted_NoMovementAI(creature) {} void Reset() { diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 278488eac9e..bc12a6c1c6c 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -63,7 +63,7 @@ public: struct mob_doom_blossomAI : public ScriptedAI { - mob_doom_blossomAI(Creature* c) : ScriptedAI(c) {} + mob_doom_blossomAI(Creature* creature) : ScriptedAI(creature) {} uint32 CheckTeronTimer; uint32 ShadowBoltTimer; @@ -112,9 +112,11 @@ public: return; } - void SetTeronGUID(uint64 guid){ TeronGUID = guid; } + void SetTeronGUID(uint64 guid) + { + TeronGUID = guid; + } }; - }; class mob_shadowy_construct : public CreatureScript @@ -129,7 +131,7 @@ public: struct mob_shadowy_constructAI : public ScriptedAI { - mob_shadowy_constructAI(Creature* c) : ScriptedAI(c) {} + mob_shadowy_constructAI(Creature* creature) : ScriptedAI(creature) {} uint64 GhostGUID; uint64 TeronGUID; @@ -173,7 +175,7 @@ public: std::list targets; for (; itr != m_threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->isAlive()) targets.push_back(unit); } @@ -219,9 +221,9 @@ public: struct boss_teron_gorefiendAI : public ScriptedAI { - boss_teron_gorefiendAI(Creature* c) : ScriptedAI(c) + boss_teron_gorefiendAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -291,7 +293,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_TERONGOREFIENDEVENT, DONE); @@ -316,13 +318,14 @@ public: void SetThreatList(Creature* Blossom) { - if (!Blossom) return; + if (!Blossom) + return; std::list& m_threatlist = me->getThreatManager().getThreatList(); std::list::const_iterator i = m_threatlist.begin(); for (i = m_threatlist.begin(); i != m_threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && unit->isAlive()) { float threat = DoGetThreat(unit); @@ -342,7 +345,7 @@ public: Unit* Ghost = NULL; if (GhostGUID) - Ghost = Unit::GetUnit((*me), GhostGUID); + Ghost = Unit::GetUnit(*me, GhostGUID); if (Ghost && Ghost->isAlive() && Ghost->HasAura(SPELL_SHADOW_OF_DEATH)) { /*float x, y, z; @@ -389,7 +392,7 @@ public: Done = true; if (AggroTargetGUID) { - Unit* unit = Unit::GetUnit((*me), AggroTargetGUID); + Unit* unit = Unit::GetUnit(*me, AggroTargetGUID); if (unit) AttackStart(unit); diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 47f82447a80..5b2bb8e7bf5 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -72,9 +72,9 @@ public: struct boss_najentusAI : public ScriptedAI { - boss_najentusAI(Creature* c) : ScriptedAI(c) + boss_najentusAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -98,7 +98,7 @@ public: events.DelayEvents(5000, GCD_YELL); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, DONE); @@ -130,7 +130,9 @@ public: bool RemoveImpalingSpine() { - if (!SpineTargetGUID) return false; + if (!SpineTargetGUID) + return false; + Unit* target = Unit::GetUnit(*me, SpineTargetGUID); if (target && target->HasAura(SPELL_IMPALING_SPINE)) target->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE); diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index b0c6dcdda41..0742f174ccf 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -122,7 +122,7 @@ public: struct mob_blood_elf_council_voice_triggerAI : public ScriptedAI { - mob_blood_elf_council_voice_triggerAI(Creature* c) : ScriptedAI(c) + mob_blood_elf_council_voice_triggerAI(Creature* creature) : ScriptedAI(creature) { for (uint8 i = 0; i < 4; ++i) Council[i] = 0; @@ -217,9 +217,9 @@ public: struct mob_illidari_councilAI : public ScriptedAI { - mob_illidari_councilAI(Creature* c) : ScriptedAI(c) + mob_illidari_councilAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); for (uint8 i = 0; i < 4; ++i) Council[i] = 0; } @@ -299,7 +299,7 @@ public: Unit* Member = NULL; if (Council[i]) { - Member = Unit::GetUnit((*me), Council[i]); + Member = Unit::GetUnit(*me, Council[i]); if (Member && Member->isAlive()) CAST_CRE(Member)->AI()->AttackStart(target); } @@ -313,7 +313,8 @@ public: void UpdateAI(const uint32 diff) { - if (!EventBegun) return; + if (!EventBegun) + return; if (EndEventTimer) { @@ -378,9 +379,9 @@ public: struct boss_illidari_councilAI : public ScriptedAI { - boss_illidari_councilAI(Creature* c) : ScriptedAI(c) + boss_illidari_councilAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); for (uint8 i = 0; i < 4; ++i) Council[i] = 0; LoadedGUIDs = false; @@ -475,7 +476,7 @@ public: struct boss_gathios_the_shattererAI : public boss_illidari_councilAI { - boss_gathios_the_shattererAI(Creature* c) : boss_illidari_councilAI(c) {} + boss_gathios_the_shattererAI(Creature* creature) : boss_illidari_councilAI(creature) {} uint32 ConsecrationTimer; uint32 HammerOfJusticeTimer; @@ -497,7 +498,7 @@ public: DoScriptText(SAY_GATH_SLAY, me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_GATH_DEATH, me); } @@ -511,7 +512,7 @@ public: member = urand(1, 3); if (member != 2) // No need to create another pointer to us using Unit::GetUnit - unit = Unit::GetUnit((*me), Council[member]); + unit = Unit::GetUnit(*me, Council[member]); return unit; } @@ -525,7 +526,7 @@ public: } for (uint8 i = 0; i < 4; ++i) { - Unit* unit = Unit::GetUnit((*me), Council[i]); + Unit* unit = Unit::GetUnit(*me, Council[i]); if (unit) unit->CastSpell(unit, spellid, true, 0, 0, me->GetGUID()); } @@ -542,8 +543,13 @@ public: { switch (urand(0, 1)) { - case 0: DoCast(unit, SPELL_BLESS_SPELLWARD); break; - case 1: DoCast(unit, SPELL_BLESS_PROTECTION); break; + case 0: + DoCast(unit, SPELL_BLESS_SPELLWARD); + break; + + case 1: + DoCast(unit, SPELL_BLESS_PROTECTION); + break; } } BlessingTimer = 60000; @@ -602,7 +608,7 @@ public: struct boss_high_nethermancer_zerevorAI : public boss_illidari_councilAI { - boss_high_nethermancer_zerevorAI(Creature* c) : boss_illidari_councilAI(c) {} + boss_high_nethermancer_zerevorAI(Creature* creature) : boss_illidari_councilAI(creature) {} uint32 BlizzardTimer; uint32 FlamestrikeTimer; @@ -626,7 +632,7 @@ public: DoScriptText(SAY_ZERE_SLAY, me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_ZERE_DEATH, me); } @@ -706,7 +712,7 @@ public: struct boss_lady_malandeAI : public boss_illidari_councilAI { - boss_lady_malandeAI(Creature* c) : boss_illidari_councilAI(c) {} + boss_lady_malandeAI(Creature* creature) : boss_illidari_councilAI(creature) {} uint32 EmpoweredSmiteTimer; uint32 CircleOfHealingTimer; @@ -726,7 +732,7 @@ public: DoScriptText(SAY_MALA_SLAY, me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_MALA_DEATH, me); } @@ -784,7 +790,7 @@ public: struct boss_veras_darkshadowAI : public boss_illidari_councilAI { - boss_veras_darkshadowAI(Creature* c) : boss_illidari_councilAI(c) {} + boss_veras_darkshadowAI(Creature* creature) : boss_illidari_councilAI(creature) {} uint64 EnvenomTargetGUID; @@ -812,7 +818,7 @@ public: DoScriptText(SAY_VERA_SLAY, me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_VERA_DEATH, me); } diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index d4184a0b145..49bce6d82c0 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -118,7 +118,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -163,28 +164,75 @@ public: { switch (go->GetEntry()) { - case 185483: NajentusGate = go->GetGUID();// Gate past Naj'entus (at the entrance to Supermoose's courtyards) - if (m_auiEncounter[0] == DONE)HandleGameObject(0, true, go);break; - case 185882: MainTempleDoors = go->GetGUID();// Main Temple Doors - right past Supermoose (Supremus) - if (m_auiEncounter[1] == DONE)HandleGameObject(0, true, go);break; - case 185478: ShadeOfAkamaDoor = go->GetGUID();break; - case 185480: CommonDoor = go->GetGUID(); - if (m_auiEncounter[3] == DONE)HandleGameObject(0, true, go);break; - case 186153: TeronDoor = go->GetGUID(); - if (m_auiEncounter[3] == DONE)HandleGameObject(0, true, go);break; - case 185892: GuurtogDoor = go->GetGUID(); - if (m_auiEncounter[4] == DONE)HandleGameObject(0, true, go);break; - case 185479: TempleDoor = go->GetGUID(); - if (m_auiEncounter[5] == DONE)HandleGameObject(0, true, go);break; - case 185482: MotherDoor = go->GetGUID(); - if (m_auiEncounter[6] == DONE)HandleGameObject(0, true, go);break; - case 185481: CouncilDoor = go->GetGUID(); - if (m_auiEncounter[7] == DONE)HandleGameObject(0, true, go);break; - case 186152: SimpleDoor = go->GetGUID(); - if (m_auiEncounter[7] == DONE)HandleGameObject(0, true, go);break; - case 185905: IllidanGate = go->GetGUID(); break; // Gate leading to Temple Summit - case 186261: IllidanDoor[0] = go->GetGUID(); break; // Right door at Temple Summit - case 186262: IllidanDoor[1] = go->GetGUID(); break; // Left door at Temple Summit + case 185483: + NajentusGate = go->GetGUID();// Gate past Naj'entus (at the entrance to Supermoose's courtyards) + if (m_auiEncounter[0] == DONE) + HandleGameObject(0, true, go); + break; + + case 185882: + MainTempleDoors = go->GetGUID();// Main Temple Doors - right past Supermoose (Supremus) + if (m_auiEncounter[1] == DONE) + HandleGameObject(0, true, go); + break; + + case 185478: + ShadeOfAkamaDoor = go->GetGUID(); + break; + + case 185480: + CommonDoor = go->GetGUID(); + if (m_auiEncounter[3] == DONE) + HandleGameObject(0, true, go); + break; + + case 186153: + TeronDoor = go->GetGUID(); + if (m_auiEncounter[3] == DONE) + HandleGameObject(0, true, go); + break; + + case 185892: + GuurtogDoor = go->GetGUID(); + if (m_auiEncounter[4] == DONE) + HandleGameObject(0, true, go); + break; + + case 185479: + TempleDoor = go->GetGUID(); + if (m_auiEncounter[5] == DONE) + HandleGameObject(0, true, go); + break; + + case 185482: + MotherDoor = go->GetGUID(); + if (m_auiEncounter[6] == DONE) + HandleGameObject(0, true, go); + break; + + case 185481: + CouncilDoor = go->GetGUID(); + if (m_auiEncounter[7] == DONE) + HandleGameObject(0, true, go); + break; + + case 186152: + SimpleDoor = go->GetGUID(); + if (m_auiEncounter[7] == DONE) + HandleGameObject(0, true, go); + break; + + case 185905: + IllidanGate = go->GetGUID(); // Gate leading to Temple Summit + break; + + case 186261: + IllidanDoor[0] = go->GetGUID(); // Right door at Temple Summit + break; + + case 186262: + IllidanDoor[1] = go->GetGUID(); // Left door at Temple Summit + break; } } @@ -220,63 +268,65 @@ public: { case DATA_HIGHWARLORDNAJENTUSEVENT: if (data == DONE) - { HandleGameObject(NajentusGate, true); - } - m_auiEncounter[0] = data;break; + m_auiEncounter[0] = data; + break; case DATA_SUPREMUSEVENT: if (data == DONE) - { HandleGameObject(NajentusGate, true); - } - m_auiEncounter[1] = data; break; + m_auiEncounter[1] = data; + break; case DATA_SHADEOFAKAMAEVENT: if (data == IN_PROGRESS) - { HandleGameObject(ShadeOfAkamaDoor, false); - } else HandleGameObject(ShadeOfAkamaDoor, true); - m_auiEncounter[2] = data; break; + else + HandleGameObject(ShadeOfAkamaDoor, true); + m_auiEncounter[2] = data; + break; case DATA_TERONGOREFIENDEVENT: if (data == IN_PROGRESS) { HandleGameObject(TeronDoor, false); HandleGameObject(CommonDoor, false); - }else + } + else { HandleGameObject(TeronDoor, true); HandleGameObject(CommonDoor, true); } - m_auiEncounter[3] = data; break; + m_auiEncounter[3] = data; + break; case DATA_GURTOGGBLOODBOILEVENT: if (data == DONE) - { HandleGameObject(GuurtogDoor, true); - } - m_auiEncounter[4] = data; break; + m_auiEncounter[4] = data; + break; case DATA_RELIQUARYOFSOULSEVENT: if (data == DONE) - { HandleGameObject(TempleDoor, true); - } - m_auiEncounter[5] = data; break; + m_auiEncounter[5] = data; + break; case DATA_MOTHERSHAHRAZEVENT: if (data == DONE) - { HandleGameObject(MotherDoor, true); - } - m_auiEncounter[6] = data; break; + m_auiEncounter[6] = data; + break; case DATA_ILLIDARICOUNCILEVENT: if (data == IN_PROGRESS) { HandleGameObject(CouncilDoor, false); HandleGameObject(SimpleDoor, false); - }else + } + else { HandleGameObject(CouncilDoor, true); HandleGameObject(SimpleDoor, true); } - m_auiEncounter[7] = data; break; - case DATA_ILLIDANSTORMRAGEEVENT: m_auiEncounter[8] = data; break; + m_auiEncounter[7] = data; + break; + case DATA_ILLIDANSTORMRAGEEVENT: + m_auiEncounter[8] = data; + break; } if (data == DONE) diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt index 229f7de72ec..6056fa8b143 100644 --- a/src/server/scripts/Outland/CMakeLists.txt +++ b/src/server/scripts/Outland/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp index 9edc7179d5e..3937b213e7e 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -107,9 +107,9 @@ public: struct boss_fathomlord_karathressAI : public ScriptedAI { - boss_fathomlord_karathressAI(Creature* c) : ScriptedAI(c) + boss_fathomlord_karathressAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); Advisors[0] = 0; Advisors[1] = 0; Advisors[2] = 0; @@ -225,7 +225,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (target) { @@ -317,9 +317,9 @@ public: struct boss_fathomguard_sharkkisAI : public ScriptedAI { - boss_fathomguard_sharkkisAI(Creature* c) : ScriptedAI(c) + boss_fathomguard_sharkkisAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -354,7 +354,7 @@ public: instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -381,7 +381,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (target) { @@ -471,9 +471,9 @@ public: struct boss_fathomguard_tidalvessAI : public ScriptedAI { - boss_fathomguard_tidalvessAI(Creature* c) : ScriptedAI(c) + boss_fathomguard_tidalvessAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -494,7 +494,7 @@ public: instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -522,7 +522,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (target) { @@ -598,9 +598,9 @@ public: struct boss_fathomguard_caribdisAI : public ScriptedAI { - boss_fathomguard_caribdisAI(Creature* c) : ScriptedAI(c) + boss_fathomguard_caribdisAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -621,7 +621,7 @@ public: instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -648,7 +648,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (target) { @@ -691,7 +691,7 @@ public: Creature* Cyclone = me->SummonCreature(CREATURE_CYCLONE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%5), TEMPSUMMON_TIMED_DESPAWN, 15000); if (Cyclone) { - CAST_CRE(Cyclone)->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f); + CAST_CRE(Cyclone)->SetObjectScale(3.0f); Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Cyclone->setFaction(me->getFaction()); Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true); @@ -730,13 +730,13 @@ public: switch (rand()%4) { case 0: - unit = Unit::GetUnit((*me), instance->GetData64(DATA_KARATHRESS)); + unit = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESS)); break; case 1: - unit = Unit::GetUnit((*me), instance->GetData64(DATA_SHARKKIS)); + unit = Unit::GetUnit(*me, instance->GetData64(DATA_SHARKKIS)); break; case 2: - unit = Unit::GetUnit((*me), instance->GetData64(DATA_TIDALVESS)); + unit = Unit::GetUnit(*me, instance->GetData64(DATA_TIDALVESS)); break; case 3: unit = me; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index 6f020c16402..7abd2bbc8a8 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -88,9 +88,9 @@ public: struct boss_hydross_the_unstableAI : public ScriptedAI { - boss_hydross_the_unstableAI(Creature* c) : ScriptedAI(c), Summons(me) + boss_hydross_the_unstableAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -177,13 +177,9 @@ public: void KilledUnit(Unit* /*victim*/) { if (CorruptedForm) - { DoScriptText(RAND(SAY_CORRUPT_SLAY1, SAY_CORRUPT_SLAY2), me); - } else - { DoScriptText(RAND(SAY_CLEAN_SLAY1, SAY_CLEAN_SLAY2), me); - } } void JustSummoned(Creature* summoned) @@ -207,7 +203,7 @@ public: Summons.Despawn(summon); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (CorruptedForm) DoScriptText(SAY_CORRUPT_DEATH, me); @@ -242,12 +238,29 @@ public: switch (MarkOfCorruption_Count) { - case 0: mark_spell = SPELL_MARK_OF_CORRUPTION1; break; - case 1: mark_spell = SPELL_MARK_OF_CORRUPTION2; break; - case 2: mark_spell = SPELL_MARK_OF_CORRUPTION3; break; - case 3: mark_spell = SPELL_MARK_OF_CORRUPTION4; break; - case 4: mark_spell = SPELL_MARK_OF_CORRUPTION5; break; - case 5: mark_spell = SPELL_MARK_OF_CORRUPTION6; break; + case 0: + mark_spell = SPELL_MARK_OF_CORRUPTION1; + break; + + case 1: + mark_spell = SPELL_MARK_OF_CORRUPTION2; + break; + + case 2: + mark_spell = SPELL_MARK_OF_CORRUPTION3; + break; + + case 3: + mark_spell = SPELL_MARK_OF_CORRUPTION4; + break; + + case 4: + mark_spell = SPELL_MARK_OF_CORRUPTION5; + break; + + case 5: + mark_spell = SPELL_MARK_OF_CORRUPTION6; + break; } DoCast(me->getVictim(), mark_spell); @@ -309,12 +322,29 @@ public: switch (MarkOfHydross_Count) { - case 0: mark_spell = SPELL_MARK_OF_HYDROSS1; break; - case 1: mark_spell = SPELL_MARK_OF_HYDROSS2; break; - case 2: mark_spell = SPELL_MARK_OF_HYDROSS3; break; - case 3: mark_spell = SPELL_MARK_OF_HYDROSS4; break; - case 4: mark_spell = SPELL_MARK_OF_HYDROSS5; break; - case 5: mark_spell = SPELL_MARK_OF_HYDROSS6; break; + case 0: + mark_spell = SPELL_MARK_OF_HYDROSS1; + break; + + case 1: + mark_spell = SPELL_MARK_OF_HYDROSS2; + break; + + case 2: + mark_spell = SPELL_MARK_OF_HYDROSS3; + break; + + case 3: + mark_spell = SPELL_MARK_OF_HYDROSS4; + break; + + case 4: + mark_spell = SPELL_MARK_OF_HYDROSS5; + break; + + case 5: + mark_spell = SPELL_MARK_OF_HYDROSS6; + break; } DoCast(me->getVictim(), mark_spell); @@ -375,7 +405,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_boss_hydross_the_unstable() diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 33ce04e45e3..18d8b2b5a1e 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -25,7 +25,6 @@ EndScriptData */ #include "ScriptPCH.h" #include "serpent_shrine.h" -#include "ScriptedSimpleAI.h" #include "Spell.h" #define SAY_INTRO -1548042 @@ -132,7 +131,6 @@ float ShieldGeneratorChannelPos[4][4] = {49.3126f, -943.398f, 42.5501f, 2.40174f} }; -//Lady Vashj AI class boss_lady_vashj : public CreatureScript { public: @@ -145,12 +143,12 @@ public: struct boss_lady_vashjAI : public ScriptedAI { - boss_lady_vashjAI (Creature* c) : ScriptedAI(c) + boss_lady_vashjAI (Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); Intro = false; JustCreated = true; - c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //set it only once on Creature create (no need do intro if wiped) + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // set it only once on Creature create (no need do intro if wiped) } InstanceScript* instance; @@ -158,18 +156,18 @@ public: uint64 ShieldGeneratorChannel[4]; uint32 AggroTimer; - uint32 ShockBlast_Timer; - uint32 Entangle_Timer; - uint32 StaticCharge_Timer; - uint32 ForkedLightning_Timer; - uint32 Check_Timer; - uint32 EnchantedElemental_Timer; - uint32 TaintedElemental_Timer; - uint32 CoilfangElite_Timer; - uint32 CoilfangStrider_Timer; - uint32 SummonSporebat_Timer; - uint32 SummonSporebat_StaticTimer; - uint8 EnchantedElemental_Pos; + uint32 ShockBlastTimer; + uint32 EntangleTimer; + uint32 StaticChargeTimer; + uint32 ForkedLightningTimer; + uint32 CheckTimer; + uint32 EnchantedElementalTimer; + uint32 TaintedElementalTimer; + uint32 CoilfangEliteTimer; + uint32 CoilfangStriderTimer; + uint32 SummonSporebatTimer; + uint32 SummonSporebatStaticTimer; + uint8 EnchantedElementalPos; uint8 Phase; bool Entangle; @@ -180,18 +178,18 @@ public: void Reset() { AggroTimer = 19000; - ShockBlast_Timer = 1+rand()%60000; - Entangle_Timer = 30000; - StaticCharge_Timer = 10000+rand()%15000; - ForkedLightning_Timer = 2000; - Check_Timer = 15000; - EnchantedElemental_Timer = 5000; - TaintedElemental_Timer = 50000; - CoilfangElite_Timer = 45000+rand()%5000; - CoilfangStrider_Timer = 60000+rand()%10000; - SummonSporebat_Timer = 10000; - SummonSporebat_StaticTimer = 30000; - EnchantedElemental_Pos = 0; + ShockBlastTimer = 1+rand()%60000; + EntangleTimer = 30000; + StaticChargeTimer = 10000+rand()%15000; + ForkedLightningTimer = 2000; + CheckTimer = 15000; + EnchantedElementalTimer = 5000; + TaintedElementalTimer = 50000; + CoilfangEliteTimer = 45000+rand()%5000; + CoilfangStriderTimer = 60000+rand()%10000; + SummonSporebatTimer = 10000; + SummonSporebatStaticTimer = 30000; + EnchantedElementalPos = 0; Phase = 0; Entangle = false; @@ -201,13 +199,10 @@ public: JustCreated = false; } else CanAttack = true; - Unit* remo; + for (uint8 i = 0; i < 4; ++i) - { - remo = Unit::GetUnit(*me, ShieldGeneratorChannel[i]); - if (remo) + if (Unit* remo = Unit::GetUnit(*me, ShieldGeneratorChannel[i])) remo->setDeathState(JUST_DIED); - } if (instance) instance->SetData(DATA_LADYVASHJEVENT, NOT_STARTED); @@ -219,19 +214,19 @@ public: me->SetCorpseDelay(1000*60*60); } - //Called when a tainted elemental dies + // Called when a tainted elemental dies void EventTaintedElementalDeath() { - //the next will spawn 50 seconds after the previous one's death - if (TaintedElemental_Timer > 50000) - TaintedElemental_Timer = 50000; + // the next will spawn 50 seconds after the previous one's death + if (TaintedElementalTimer > 50000) + TaintedElementalTimer = 50000; } void KilledUnit(Unit* /*victim*/) { DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -253,18 +248,14 @@ public: { if (instance) { - //remove old tainted cores to prevent cheating in phase 2 + // remove old tainted cores to prevent cheating in phase 2 Map* map = me->GetMap(); Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (Player* i_pl = i->getSource()) - { - i_pl->DestroyItemCount(31088, 1, true); - } - } + for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) + if (Player* player = itr->getSource()) + player->DestroyItemCount(31088, 1, true); } - StartEvent();//this is EnterCombat(), so were are 100% in combat, start the event + StartEvent(); // this is EnterCombat(), so were are 100% in combat, start the event if (Phase != 2) AttackStart(who); @@ -287,10 +278,7 @@ public: float attackRadius = me->GetAttackDistance(who); if (me->IsWithinDistInMap(who, attackRadius) && me->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && me->IsWithinLOSInMap(who)) { - //if (who->HasStealthAura()) - // who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); - - if (!me->isInCombat())//AttackStart() sets UNIT_FLAG_IN_COMBAT, so this msut be before attacking + if (!me->isInCombat()) // AttackStart() sets UNIT_FLAG_IN_COMBAT, so this msut be before attacking StartEvent(); if (Phase != 2) @@ -304,13 +292,13 @@ public: switch (urand(0, 1)) { case 0: - //Shoot - //Used in Phases 1 and 3 after Entangle or while having nobody in melee range. A shot that hits her target for 4097-5543 Physical damage. + // Shoot + // Used in Phases 1 and 3 after Entangle or while having nobody in melee range. A shot that hits her target for 4097-5543 Physical damage. DoCast(me->getVictim(), SPELL_SHOOT); break; case 1: - //Multishot - //Used in Phases 1 and 3 after Entangle or while having nobody in melee range. A shot that hits 1 person and 4 people around him for 6475-7525 physical damage. + // Multishot + // Used in Phases 1 and 3 after Entangle or while having nobody in melee range. A shot that hits 1 person and 4 people around him for 6475-7525 physical damage. DoCast(me->getVictim(), SPELL_MULTI_SHOT); break; } @@ -329,231 +317,209 @@ public: CanAttack = true; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); AggroTimer=19000; - }else + } + else { AggroTimer-=diff; return; } } - //to prevent abuses during phase 2 + // to prevent abuses during phase 2 if (Phase == 2 && !me->getVictim() && me->isInCombat()) { EnterEvadeMode(); return; } - //Return since we have no target + // Return since we have no target if (!UpdateVictim()) return; if (Phase == 1 || Phase == 3) { - //ShockBlast_Timer - if (ShockBlast_Timer <= diff) + // ShockBlastTimer + if (ShockBlastTimer <= diff) { - //Shock Burst - //Randomly used in Phases 1 and 3 on Vashj's target, it's a Shock spell doing 8325-9675 nature damage and stunning the target for 5 seconds, during which she will not attack her target but switch to the next person on the aggro list. + // Shock Burst + // Randomly used in Phases 1 and 3 on Vashj's target, it's a Shock spell doing 8325-9675 nature damage and stunning the target for 5 seconds, during which she will not attack her target but switch to the next person on the aggro list. DoCast(me->getVictim(), SPELL_SHOCK_BLAST); me->TauntApply(me->getVictim()); - ShockBlast_Timer = 1000+rand()%14000; //random cooldown - } else ShockBlast_Timer -= diff; + ShockBlastTimer = 1000+rand()%14000; // random cooldown + } else ShockBlastTimer -= diff; - //StaticCharge_Timer - if (StaticCharge_Timer <= diff) + // StaticChargeTimer + if (StaticChargeTimer <= diff) { - //Static Charge - //Used on random people (only 1 person at any given time) in Phases 1 and 3, it's a debuff doing 2775 to 3225 Nature damage to the target and everybody in about 5 yards around it, every 1 seconds for 30 seconds. It can be removed by Cloak of Shadows, Iceblock, Divine Shield, etc, but not by Cleanse or Dispel Magic. - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true); - - if (target && !target->HasAura(SPELL_STATIC_CHARGE_TRIGGER)) - //cast Static Charge every 2 seconds for 20 seconds - DoCast(target, SPELL_STATIC_CHARGE_TRIGGER); + // Static Charge + // Used on random people (only 1 person at any given time) in Phases 1 and 3, it's a debuff doing 2775 to 3225 Nature damage to the target and everybody in about 5 yards around it, every 1 seconds for 30 seconds. It can be removed by Cloak of Shadows, Iceblock, Divine Shield, etc, but not by Cleanse or Dispel Magic. + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true); + if (target && !target->HasAura(SPELL_STATIC_CHARGE_TRIGGER)) + DoCast(target, SPELL_STATIC_CHARGE_TRIGGER); // cast Static Charge every 2 seconds for 20 seconds - StaticCharge_Timer = 10000+rand()%20000; //blizzlike - } else StaticCharge_Timer -= diff; + StaticChargeTimer = 10000+rand()%20000; + } else StaticChargeTimer -= diff; - //Entangle_Timer - if (Entangle_Timer <= diff) + // EntangleTimer + if (EntangleTimer <= diff) { if (!Entangle) { - //Entangle - //Used in Phases 1 and 3, it casts Entangling Roots on everybody in a 15 yard radius of Vashj, immobilzing them for 10 seconds and dealing 500 damage every 2 seconds. It's not a magic effect so it cannot be dispelled, but is removed by various buffs such as Cloak of Shadows or Blessing of Freedom. + // Entangle + // Used in Phases 1 and 3, it casts Entangling Roots on everybody in a 15 yard radius of Vashj, immobilzing them for 10 seconds and dealing 500 damage every 2 seconds. It's not a magic effect so it cannot be dispelled, but is removed by various buffs such as Cloak of Shadows or Blessing of Freedom. DoCast(me->getVictim(), SPELL_ENTANGLE); Entangle = true; - Entangle_Timer = 10000; + EntangleTimer = 10000; } else { CastShootOrMultishot(); Entangle = false; - Entangle_Timer = 20000+rand()%5000; + EntangleTimer = 20000+rand()%5000; } - } else Entangle_Timer -= diff; + } else EntangleTimer -= diff; - //Phase 1 + // Phase 1 if (Phase == 1) { - //Start phase 2 + // Start phase 2 if (HealthBelowPct(70)) { - //Phase 2 begins when Vashj hits 70%. She will run to the middle of her platform and surround herself in a shield making her invulerable. + // Phase 2 begins when Vashj hits 70%. She will run to the middle of her platform and surround herself in a shield making her invulerable. Phase = 2; me->GetMotionMaster()->Clear(); DoTeleportTo(MIDDLE_X, MIDDLE_Y, MIDDLE_Z); - Creature* creature; for (uint8 i = 0; i < 4; ++i) - { - creature = me->SummonCreature(SHIED_GENERATOR_CHANNEL, ShieldGeneratorChannelPos[i][0], ShieldGeneratorChannelPos[i][1], ShieldGeneratorChannelPos[i][2], ShieldGeneratorChannelPos[i][3], TEMPSUMMON_CORPSE_DESPAWN, 0); - if (creature) + if (Creature* creature = me->SummonCreature(SHIED_GENERATOR_CHANNEL, ShieldGeneratorChannelPos[i][0], ShieldGeneratorChannelPos[i][1], ShieldGeneratorChannelPos[i][2], ShieldGeneratorChannelPos[i][3], TEMPSUMMON_CORPSE_DESPAWN, 0)) ShieldGeneratorChannel[i] = creature->GetGUID(); - } + DoScriptText(SAY_PHASE2, me); } } - //Phase 3 + // Phase 3 else { - //SummonSporebat_Timer - if (SummonSporebat_Timer <= diff) + // SummonSporebatTimer + if (SummonSporebatTimer <= diff) { - Creature* Sporebat = NULL; - Sporebat = me->SummonCreature(TOXIC_SPOREBAT, SPOREBAT_X, SPOREBAT_Y, SPOREBAT_Z, SPOREBAT_O, TEMPSUMMON_CORPSE_DESPAWN, 0); + if (Creature* sporebat = me->SummonCreature(TOXIC_SPOREBAT, SPOREBAT_X, SPOREBAT_Y, SPOREBAT_Z, SPOREBAT_O, TEMPSUMMON_CORPSE_DESPAWN, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + sporebat->AI()->AttackStart(target); - if (Sporebat) - { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - Sporebat->AI()->AttackStart(target); - } + // summon sporebats faster and faster + if (SummonSporebatStaticTimer > 1000) + SummonSporebatStaticTimer -= 1000; - //summon sporebats faster and faster - if (SummonSporebat_StaticTimer > 1000) - SummonSporebat_StaticTimer -= 1000; + SummonSporebatTimer = SummonSporebatStaticTimer; - SummonSporebat_Timer = SummonSporebat_StaticTimer; + if (SummonSporebatTimer < 5000) + SummonSporebatTimer = 5000; - if (SummonSporebat_Timer < 5000) - SummonSporebat_Timer = 5000; - - } else SummonSporebat_Timer -= diff; + } else SummonSporebatTimer -= diff; } - //Melee attack + // Melee attack DoMeleeAttackIfReady(); - //Check_Timer - used to check if somebody is in melee range - if (Check_Timer <= diff) + // CheckTimer - used to check if somebody is in melee range + if (CheckTimer <= diff) { - bool InMeleeRange = false; - Unit* target; + bool inMeleeRange = false; std::list t_list = me->getThreatManager().getThreatList(); for (std::list::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); - //if in melee range - if (target && target->IsWithinDistInMap(me, 5)) + Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + if (target && target->IsWithinDistInMap(me, 5)) // if in melee range { - InMeleeRange = true; + inMeleeRange = true; break; } } - //if nobody is in melee range - if (!InMeleeRange) + // if nobody is in melee range + if (!inMeleeRange) CastShootOrMultishot(); - Check_Timer = 5000; - } else Check_Timer -= diff; + CheckTimer = 5000; + } else CheckTimer -= diff; } - //Phase 2 + // Phase 2 else { - //ForkedLightning_Timer - if (ForkedLightning_Timer <= diff) + // ForkedLightningTimer + if (ForkedLightningTimer <= diff) { - //Forked Lightning - //Used constantly in Phase 2, it shoots out completely randomly targeted bolts of lightning which hit everybody in a roughtly 60 degree cone in front of Vashj for 2313-2687 nature damage. - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); + // Forked Lightning + // Used constantly in Phase 2, it shoots out completely randomly targeted bolts of lightning which hit everybody in a roughtly 60 degree cone in front of Vashj for 2313-2687 nature damage. + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (!target) target = me->getVictim(); DoCast(target, SPELL_FORKED_LIGHTNING); - ForkedLightning_Timer = 2000+rand()%6000; //blizzlike - } else ForkedLightning_Timer -= diff; + ForkedLightningTimer = 2000+rand()%6000; + } else ForkedLightningTimer -= diff; - //EnchantedElemental_Timer - if (EnchantedElemental_Timer <= diff) + // EnchantedElementalTimer + if (EnchantedElementalTimer <= diff) { - me->SummonCreature(ENCHANTED_ELEMENTAL, ElementPos[EnchantedElemental_Pos][0], ElementPos[EnchantedElemental_Pos][1], ElementPos[EnchantedElemental_Pos][2], ElementPos[EnchantedElemental_Pos][3], TEMPSUMMON_CORPSE_DESPAWN, 0); + me->SummonCreature(ENCHANTED_ELEMENTAL, ElementPos[EnchantedElementalPos][0], ElementPos[EnchantedElementalPos][1], ElementPos[EnchantedElementalPos][2], ElementPos[EnchantedElementalPos][3], TEMPSUMMON_CORPSE_DESPAWN, 0); - if (EnchantedElemental_Pos == 7) - EnchantedElemental_Pos = 0; + if (EnchantedElementalPos == 7) + EnchantedElementalPos = 0; else - ++EnchantedElemental_Pos; + ++EnchantedElementalPos; - EnchantedElemental_Timer = 10000+rand()%5000; - } else EnchantedElemental_Timer -= diff; + EnchantedElementalTimer = 10000+rand()%5000; + } else EnchantedElementalTimer -= diff; - //TaintedElemental_Timer - if (TaintedElemental_Timer <= diff) + // TaintedElementalTimer + if (TaintedElementalTimer <= diff) { uint32 pos = rand()%8; me->SummonCreature(TAINTED_ELEMENTAL, ElementPos[pos][0], ElementPos[pos][1], ElementPos[pos][2], ElementPos[pos][3], TEMPSUMMON_DEAD_DESPAWN, 0); - TaintedElemental_Timer = 120000; - } else TaintedElemental_Timer -= diff; + TaintedElementalTimer = 120000; + } else TaintedElementalTimer -= diff; - //CoilfangElite_Timer - if (CoilfangElite_Timer <= diff) + // CoilfangEliteTimer + if (CoilfangEliteTimer <= diff) { uint32 pos = rand()%3; - Creature* CoilfangElite = NULL; - CoilfangElite = me->SummonCreature(COILFANG_ELITE, CoilfangElitePos[pos][0], CoilfangElitePos[pos][1], CoilfangElitePos[pos][2], CoilfangElitePos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - if (CoilfangElite) + Creature* coilfangElite = me->SummonCreature(COILFANG_ELITE, CoilfangElitePos[pos][0], CoilfangElitePos[pos][1], CoilfangElitePos[pos][2], CoilfangElitePos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + if (coilfangElite) { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - CoilfangElite->AI()->AttackStart(target); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + coilfangElite->AI()->AttackStart(target); else if (me->getVictim()) - CoilfangElite->AI()->AttackStart(me->getVictim()); + coilfangElite->AI()->AttackStart(me->getVictim()); } - CoilfangElite_Timer = 45000+rand()%5000; - } else CoilfangElite_Timer -= diff; + CoilfangEliteTimer = 45000+rand()%5000; + } else CoilfangEliteTimer -= diff; - //CoilfangStrider_Timer - if (CoilfangStrider_Timer <= diff) + // CoilfangStriderTimer + if (CoilfangStriderTimer <= diff) { uint32 pos = rand()%3; - Creature* CoilfangStrider = NULL; - CoilfangStrider = me->SummonCreature(COILFANG_STRIDER, CoilfangStriderPos[pos][0], CoilfangStriderPos[pos][1], CoilfangStriderPos[pos][2], CoilfangStriderPos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - if (CoilfangStrider) + if (Creature* CoilfangStrider = me->SummonCreature(COILFANG_STRIDER, CoilfangStriderPos[pos][0], CoilfangStriderPos[pos][1], CoilfangStriderPos[pos][2], CoilfangStriderPos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) CoilfangStrider->AI()->AttackStart(target); else if (me->getVictim()) CoilfangStrider->AI()->AttackStart(me->getVictim()); } - CoilfangStrider_Timer = 60000+rand()%10000; - } else CoilfangStrider_Timer -= diff; + CoilfangStriderTimer = 60000+rand()%10000; + } else CoilfangStriderTimer -= diff; - //Check_Timer - if (Check_Timer <= diff) + // CheckTimer + if (CheckTimer <= diff) { - //Start Phase 3 + // Start Phase 3 if (instance && instance->GetData(DATA_CANSTARTPHASE3)) { - //set life 50% + // set life 50% me->SetHealth(me->CountPctFromMaxHealth(50)); me->RemoveAurasDueToSpell(SPELL_MAGIC_BARRIER); @@ -562,19 +528,19 @@ public: Phase = 3; - //return to the tank + // return to the tank me->GetMotionMaster()->MoveChase(me->getVictim()); } - Check_Timer = 1000; - } else Check_Timer -= diff; + CheckTimer = 1000; + } else CheckTimer -= diff; } } }; }; -//Enchanted Elemental -//If one of them reaches Vashj he will increase her damage done by 5%. +// Enchanted Elemental +// If one of them reaches Vashj he will increase her damage done by 5%. class mob_enchanted_elemental : public CreatureScript { public: @@ -587,45 +553,42 @@ public: struct mob_enchanted_elementalAI : public ScriptedAI { - mob_enchanted_elementalAI(Creature* c) : ScriptedAI(c) + mob_enchanted_elementalAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; - uint32 move; - uint32 phase; - float x, y, z; + uint32 Move; + uint32 Phase; + float X, Y, Z; uint64 VashjGUID; void Reset() { - me->SetSpeed(MOVE_WALK, 0.6f);//walk - me->SetSpeed(MOVE_RUN, 0.6f);//run - move = 0; - phase = 1; + me->SetSpeed(MOVE_WALK, 0.6f); // walk + me->SetSpeed(MOVE_RUN, 0.6f); // run + Move = 0; + Phase = 1; VashjGUID = 0; - for (int i = 0; i<8; ++i)//search for nearest waypoint (up on stairs) + X = ElementWPPos[0][0]; + Y = ElementWPPos[0][1]; + Z = ElementWPPos[0][2]; + + //search for nearest waypoint (up on stairs) + for (uint32 i = 1; i < 8; ++i) { - if (!x || !y || !z) + if (me->GetDistance(ElementWPPos[i][0], ElementWPPos[i][1], ElementWPPos[i][2]) < me->GetDistance(X, Y, Z)) { - x = ElementWPPos[i][0]; - y = ElementWPPos[i][1]; - z = ElementWPPos[i][2]; - } - else - { - if (me->GetDistance(ElementWPPos[i][0], ElementWPPos[i][1], ElementWPPos[i][2]) < me->GetDistance(x, y, z)) - { - x = ElementWPPos[i][0]; - y = ElementWPPos[i][1]; - z = ElementWPPos[i][2]; - } + X = ElementWPPos[i][0]; + Y = ElementWPPos[i][1]; + Z = ElementWPPos[i][2]; } } + if (instance) VashjGUID = instance->GetData64(DATA_LADYVASHJ); } @@ -642,41 +605,36 @@ public: if (!VashjGUID) return; - if (move <= diff) + if (Move <= diff) { - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - if (phase == 1) - me->GetMotionMaster()->MovePoint(0, x, y, z); - if (phase == 1 && me->IsWithinDist3d(x, y, z, 0.1f)) - phase = 2; - if (phase == 2) + me->SetWalk(true); + if (Phase == 1) + me->GetMotionMaster()->MovePoint(0, X, Y, Z); + if (Phase == 1 && me->IsWithinDist3d(X, Y, Z, 0.1f)) + Phase = 2; + if (Phase == 2) { me->GetMotionMaster()->MovePoint(0, MIDDLE_X, MIDDLE_Y, MIDDLE_Z); - phase = 3; + Phase = 3; } - if (phase == 3) + if (Phase == 3) { me->GetMotionMaster()->MovePoint(0, MIDDLE_X, MIDDLE_Y, MIDDLE_Z); if (me->IsWithinDist3d(MIDDLE_X, MIDDLE_Y, MIDDLE_Z, 3)) DoCast(me, SPELL_SURGE); } - if (Creature* Vashj = Unit::GetCreature(*me, VashjGUID)) - { - if (!Vashj->isInCombat() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->AI())->Phase != 2 || Vashj->isDead()) - { - //call Unsummon() + if (Creature* vashj = Unit::GetCreature(*me, VashjGUID)) + if (!vashj->isInCombat() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase != 2 || vashj->isDead()) me->Kill(me); - } - } - move = 1000; - } else move -= diff; + Move = 1000; + } else Move -= diff; } }; }; -//Tainted Elemental -//This mob has 7, 900 life, doesn't move, and shoots Poison Bolts at one person anywhere in the area, doing 3, 000 nature damage and placing a posion doing 2, 000 damage every 2 seconds. He will switch targets often, or sometimes just hang on a single player, but there is nothing you can do about it except heal the damage and kill the Tainted Elemental +// Tainted Elemental +// This mob has 7, 900 life, doesn't move, and shoots Poison Bolts at one person anywhere in the area, doing 3, 000 nature damage and placing a posion doing 2, 000 damage every 2 seconds. He will switch targets often, or sometimes just hang on a single player, but there is nothing you can do about it except heal the damage and kill the Tainted Elemental class mob_tainted_elemental : public CreatureScript { public: @@ -689,32 +647,27 @@ public: struct mob_tainted_elementalAI : public ScriptedAI { - mob_tainted_elementalAI(Creature* c) : ScriptedAI(c) + mob_tainted_elementalAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; - uint32 PoisonBolt_Timer; - uint32 Despawn_Timer; + uint32 PoisonBoltTimer; + uint32 DespawnTimer; void Reset() { - PoisonBolt_Timer = 5000+rand()%5000; - Despawn_Timer = 30000; + PoisonBoltTimer = 5000+rand()%5000; + DespawnTimer = 30000; } void JustDied(Unit* /*killer*/) { if (instance) - { - Creature* Vashj = NULL; - Vashj = (Unit::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))); - - if (Vashj) - CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->AI())->EventTaintedElementalDeath(); - } + if (Creature* vashj = Unit::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))) + CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->EventTaintedElementalDeath(); } void EnterCombat(Unit* who) @@ -724,27 +677,26 @@ public: void UpdateAI(const uint32 diff) { - //PoisonBolt_Timer - if (PoisonBolt_Timer <= diff) + // PoisonBoltTimer + if (PoisonBoltTimer <= diff) { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (target && target->IsWithinDistInMap(me, 30)) DoCast(target, SPELL_POISON_BOLT); - PoisonBolt_Timer = 5000+rand()%5000; - } else PoisonBolt_Timer -= diff; + PoisonBoltTimer = 5000+rand()%5000; + } else PoisonBoltTimer -= diff; - //Despawn_Timer - if (Despawn_Timer <= diff) + // DespawnTimer + if (DespawnTimer <= diff) { - //call Unsummon() + // call Unsummon() me->setDeathState(DEAD); - //to prevent crashes - Despawn_Timer = 1000; - } else Despawn_Timer -= diff; + // to prevent crashes + DespawnTimer = 1000; + } else DespawnTimer -= diff; } }; @@ -764,37 +716,31 @@ public: struct mob_toxic_sporebatAI : public ScriptedAI { - mob_toxic_sporebatAI(Creature* c) : ScriptedAI(c) + mob_toxic_sporebatAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); EnterEvadeMode(); } InstanceScript* instance; - uint32 movement_timer; - uint32 ToxicSpore_Timer; - uint32 bolt_timer; - uint32 Check_Timer; + uint32 MovementTimer; + uint32 ToxicSporeTimer; + uint32 BoltTimer; + uint32 CheckTimer; void Reset() { - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->setFaction(14); - movement_timer = 0; - ToxicSpore_Timer = 5000; - bolt_timer = 5500; - Check_Timer = 1000; - } - - void EnterCombat(Unit* /*who*/) - { - + MovementTimer = 0; + ToxicSporeTimer = 5000; + BoltTimer = 5500; + CheckTimer = 1000; } void MoveInLineOfSight(Unit* /*who*/) { - } void MovementInform(uint32 type, uint32 id) @@ -803,113 +749,57 @@ public: return; if (id == 1) - movement_timer = 0; + MovementTimer = 0; } void UpdateAI (const uint32 diff) { - //Random movement - if (movement_timer <= diff) + // Random movement + if (MovementTimer <= diff) { uint32 rndpos = rand()%8; me->GetMotionMaster()->MovePoint(1, SporebatWPPos[rndpos][0], SporebatWPPos[rndpos][1], SporebatWPPos[rndpos][2]); - movement_timer = 6000; - } else movement_timer -= diff; + MovementTimer = 6000; + } else MovementTimer -= diff; - //toxic spores - if (bolt_timer <= diff) + // toxic spores + if (BoltTimer <= diff) { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - Creature* trig = me->SummonCreature(TOXIC_SPORES_TRIGGER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000); - if (trig) + if (Creature* trig = me->SummonCreature(TOXIC_SPORES_TRIGGER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000)) { trig->setFaction(14); trig->CastSpell(trig, SPELL_TOXIC_SPORES, true); } } - bolt_timer = 10000+rand()%5000; + BoltTimer = 10000+rand()%5000; } - else bolt_timer -= diff; + else BoltTimer -= diff; - //Check_Timer - if (Check_Timer <= diff) + // CheckTimer + if (CheckTimer <= diff) { if (instance) { - //check if vashj is death - Unit* Vashj = NULL; - Vashj = Unit::GetUnit((*me), instance->GetData64(DATA_LADYVASHJ)); + // check if vashj is death + Unit* Vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); if (!Vashj || (Vashj && !Vashj->isAlive()) || (Vashj && CAST_AI(boss_lady_vashj::boss_lady_vashjAI, CAST_CRE(Vashj)->AI())->Phase != 3)) { - //remove + // remove me->setDeathState(DEAD); me->RemoveCorpse(); me->setFaction(35); } } - Check_Timer = 1000; - } else Check_Timer -= diff; + CheckTimer = 1000; + } else CheckTimer -= diff; } }; }; -//Coilfang Elite -//It's an elite Naga mob with 170, 000 HP. It does about 5000 damage on plate, and has a nasty cleave hitting for about 7500 damage -class mob_coilfang_elite : public CreatureScript -{ -public: - mob_coilfang_elite() : CreatureScript("mob_coilfang_elite") { } - - CreatureAI* GetAI(Creature* creature) const - { - SimpleAI* ai = new SimpleAI (creature); - - ai->Spell[0].Enabled = true; - ai->Spell[0].Spell_Id = 31345; //Cleave - ai->Spell[0].Cooldown = 15000; - ai->Spell[0].CooldownRandomAddition = 5000; - ai->Spell[0].First_Cast = 5000; - ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_RANDOM; - - ai->EnterEvadeMode(); - - return ai; - } - -}; - -//Coilfang Strider -//It hits plate for about 8000 damage, has a Mind Blast spell doing about 3000 shadow damage, and a Psychic Scream Aura, which fears everybody in a 8 yard range of it every 2-3 seconds, for 5 seconds and increasing their movement speed by 150% during the fear. -class mob_coilfang_strider : public CreatureScript -{ -public: - mob_coilfang_strider() : CreatureScript("mob_coilfang_strider") { } - - CreatureAI* GetAI(Creature* creature) const - { - SimpleAI* ai = new SimpleAI (creature); - - ai->Spell[0].Enabled = true; - ai->Spell[0].Spell_Id = 41374; //Mind Blast - ai->Spell[0].Cooldown = 30000; - ai->Spell[0].CooldownRandomAddition = 10000; - ai->Spell[0].First_Cast = 8000; - ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_TARGET; - - //Scream aura not implemented - - ai->EnterEvadeMode(); - - return ai; - } - -}; - class mob_shield_generator_channel : public CreatureScript { public: @@ -922,25 +812,24 @@ public: struct mob_shield_generator_channelAI : public ScriptedAI { - mob_shield_generator_channelAI(Creature* c) : ScriptedAI(c) + mob_shield_generator_channelAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; - uint32 Check_Timer; + uint32 CheckTimer; bool Casted; + void Reset() { - Check_Timer = 0; + CheckTimer = 0; Casted = false; - me->SetDisplayId(11686); //invisible + me->SetDisplayId(11686); // invisible me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void EnterCombat(Unit* /*who*/) {} - void MoveInLineOfSight(Unit* /*who*/) {} void UpdateAI (const uint32 diff) @@ -948,22 +837,21 @@ public: if (!instance) return; - if (Check_Timer <= diff) + if (CheckTimer <= diff) { - Unit* Vashj = NULL; - Vashj = Unit::GetUnit((*me), instance->GetData64(DATA_LADYVASHJ)); + Unit* vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); - if (Vashj && Vashj->isAlive()) + if (vashj && vashj->isAlive()) { - //start visual channel - if (!Casted || !Vashj->HasAura(SPELL_MAGIC_BARRIER)) + // start visual channel + if (!Casted || !vashj->HasAura(SPELL_MAGIC_BARRIER)) { - DoCast(Vashj, SPELL_MAGIC_BARRIER, true); + DoCast(vashj, SPELL_MAGIC_BARRIER, true); Casted = true; } } - Check_Timer = 1000; - } else Check_Timer -= diff; + CheckTimer = 1000; + } else CheckTimer -= diff; } }; @@ -974,41 +862,39 @@ class item_tainted_core : public ItemScript public: item_tainted_core() : ItemScript("item_tainted_core") { } - bool OnUse(Player* player, Item* /*_Item*/, SpellCastTargets const& targets) + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& targets) { InstanceScript* instance = player->GetInstanceScript(); - if (!instance) { player->GetSession()->SendNotification(TEXT_NOT_INITIALIZED); return true; } - Creature* Vashj = NULL; - Vashj = (Unit::GetCreature((*player), instance->GetData64(DATA_LADYVASHJ))); - if (Vashj && (CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->AI())->Phase == 2)) + Creature* vashj = Unit::GetCreature((*player), instance->GetData64(DATA_LADYVASHJ)); + if (vashj && (CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase == 2)) { if (GameObject* gObj = targets.GetGOTarget()) { uint32 identifier; - uint8 channel_identifier; + uint8 channelIdentifier; switch (gObj->GetEntry()) { case 185052: identifier = DATA_SHIELDGENERATOR1; - channel_identifier = 0; + channelIdentifier = 0; break; case 185053: identifier = DATA_SHIELDGENERATOR2; - channel_identifier = 1; + channelIdentifier = 1; break; case 185051: identifier = DATA_SHIELDGENERATOR3; - channel_identifier = 2; + channelIdentifier = 2; break; case 185054: identifier = DATA_SHIELDGENERATOR4; - channel_identifier = 3; + channelIdentifier = 3; break; default: return true; @@ -1020,18 +906,13 @@ public: return true; } - //get and remove channel - Unit* Channel = NULL; - Channel = Unit::GetCreature(*Vashj, CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->AI())->ShieldGeneratorChannel[channel_identifier]); - if (Channel) - { - //call Unsummon() - Channel->setDeathState(JUST_DIED); - } + // get and remove channel + if (Unit* channel = Unit::GetCreature(*vashj, CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->ShieldGeneratorChannel[channelIdentifier])) + channel->setDeathState(JUST_DIED); // call Unsummon() instance->SetData(identifier, 1); - //remove this item + // remove this item player->DestroyItemCount(31088, 1, true); return true; } @@ -1055,8 +936,6 @@ void AddSC_boss_lady_vashj() new mob_enchanted_elemental(); new mob_tainted_elemental(); new mob_toxic_sporebat(); - new mob_coilfang_elite(); - new mob_coilfang_strider(); new mob_shield_generator_channel(); new item_tainted_core(); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 5111a8eaa8e..4876410890c 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -53,6 +53,7 @@ EndScriptData */ #define MODEL_NIGHTELF 20514 #define DEMON_FORM 21875 #define MOB_SPELLBINDER 21806 +#define INNER_DEMON_VICTIM 1 #define SAY_AGGRO -1548009 #define SAY_SWITCH_TO_DEMON -1548010 @@ -79,7 +80,7 @@ public: struct mob_inner_demonAI : public ScriptedAI { - mob_inner_demonAI(Creature* c) : ScriptedAI(c) + mob_inner_demonAI(Creature* creature) : ScriptedAI(creature) { victimGUID = 0; } @@ -94,9 +95,23 @@ public: ShadowBolt_Timer = 10000; Link_Timer = 1000; } - void JustDied(Unit* /*victim*/) + + void SetGUID(uint64 guid, int32 id/* = 0 */) + { + if (id == INNER_DEMON_VICTIM) + victimGUID = guid; + } + + uint64 GetGUID(int32 id/* = 0 */) { - Unit* unit = Unit::GetUnit((*me), victimGUID); + if (id == INNER_DEMON_VICTIM) + return victimGUID; + return 0; + } + + void JustDied(Unit* /*killer*/) + { + Unit* unit = Unit::GetUnit(*me, victimGUID); if (unit && unit->HasAura(SPELL_INSIDIOUS_WHISPER)) unit->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER); } @@ -112,7 +127,8 @@ public: void EnterCombat(Unit* /*who*/) { - if (!victimGUID) return; + if (!victimGUID) + return; } void UpdateAI(const uint32 diff) @@ -124,7 +140,7 @@ public: if (me->getVictim()->GetGUID() != victimGUID) { DoModifyThreatPercent(me->getVictim(), -100); - Unit* owner = Unit::GetUnit((*me), victimGUID); + Unit* owner = Unit::GetUnit(*me, victimGUID); if (owner && owner->isAlive()) { me->AddThreat(owner, 999999); @@ -170,10 +186,10 @@ public: struct boss_leotheras_the_blindAI : public ScriptedAI { - boss_leotheras_the_blindAI(Creature* c) : ScriptedAI(c) + boss_leotheras_the_blindAI(Creature* creature) : ScriptedAI(creature) { - c->GetPosition(x, y, z); - instance = c->GetInstanceScript(); + creature->GetPosition(x, y, z); + instance = creature->GetInstanceScript(); Demon = 0; for (uint8 i = 0; i < 3; ++i)//clear guids @@ -218,6 +234,7 @@ public: IsFinalForm = false; NeedThreatReset = false; EnrageUsed = false; + memset(InnderDemon, 0, sizeof(InnderDemon)); InnerDemon_Count = 0; me->SetSpeed(MOVE_RUN, 2.0f, true); me->SetDisplayId(MODEL_NIGHTELF); @@ -356,7 +373,7 @@ public: Creature* unit = Unit::GetCreature((*me), InnderDemon[i]); if (unit && unit->isAlive()) { - Unit* unit_target = Unit::GetUnit(*unit, CAST_AI(mob_inner_demon::mob_inner_demonAI, unit->AI())->victimGUID); + Unit* unit_target = Unit::GetUnit(*unit, unit->AI()->GetGUID(INNER_DEMON_VICTIM)); if (unit_target && unit_target->isAlive()) { unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true); @@ -382,7 +399,7 @@ public: } } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -524,7 +541,7 @@ public: if (demon) { demon->AI()->AttackStart((*itr)); - CAST_AI(mob_inner_demon::mob_inner_demonAI, demon->AI())->victimGUID = (*itr)->GetGUID(); + demon->AI()->SetGUID((*itr)->GetGUID(), INNER_DEMON_VICTIM); (*itr)->AddAura(SPELL_INSIDIOUS_WHISPER, *itr); @@ -600,7 +617,7 @@ public: struct boss_leotheras_the_blind_demonformAI : public ScriptedAI { - boss_leotheras_the_blind_demonformAI(Creature* c) : ScriptedAI(c) {} + boss_leotheras_the_blind_demonformAI(Creature* creature) : ScriptedAI(creature) {} uint32 ChaosBlast_Timer; bool DealDamage; @@ -624,7 +641,7 @@ public: DoScriptText(RAND(SAY_DEMON_SLAY1, SAY_DEMON_SLAY2, SAY_DEMON_SLAY3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { //invisibility (blizzlike, at the end of the fight he doesn't die, he disappears) DoCast(me, 8149, true); @@ -673,9 +690,9 @@ public: struct mob_greyheart_spellbinderAI : public ScriptedAI { - mob_greyheart_spellbinderAI(Creature* c) : ScriptedAI(c) + mob_greyheart_spellbinderAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); leotherasGUID = 0; AddedBanish = false; } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index 0ed9d8e7833..00de1802bc9 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -25,7 +25,6 @@ EndScriptData */ #include "ScriptPCH.h" #include "serpent_shrine.h" -#include "ScriptedSimpleAI.h" #include "Spell.h" #define SPELL_SPOUT 37433 @@ -55,15 +54,16 @@ EndScriptData */ float AddPos[9][3] = { - {2.8553810f, -459.823914f, -19.182686f}, //MOVE_AMBUSHER_1 X, Y, Z - {12.400000f, -466.042267f, -19.182686f}, //MOVE_AMBUSHER_2 X, Y, Z - {51.366653f, -460.836060f, -19.182686f}, //MOVE_AMBUSHER_3 X, Y, Z - {62.597980f, -457.433044f, -19.182686f}, //MOVE_AMBUSHER_4 X, Y, Z - {77.607452f, -384.302765f, -19.182686f}, //MOVE_AMBUSHER_5 X, Y, Z - {63.897900f, -378.984924f, -19.182686f}, //MOVE_AMBUSHER_6 X, Y, Z - {34.447250f, -387.333618f, -19.182686f}, //MOVE_GUARDIAN_1 X, Y, Z - {14.388216f, -423.468018f, -19.625271f}, //MOVE_GUARDIAN_2 X, Y, Z - {42.471519f, -445.115295f, -19.769423f} //MOVE_GUARDIAN_3 X, Y, Z + // MOVE_AMBUSHER_1 X, Y, Z + {2.8553810f, -459.823914f, -19.182686f}, + {12.400000f, -466.042267f, -19.182686f}, + {51.366653f, -460.836060f, -19.182686f}, + {62.597980f, -457.433044f, -19.182686f}, + {77.607452f, -384.302765f, -19.182686f}, + {63.897900f, -378.984924f, -19.182686f}, + {34.447250f, -387.333618f, -19.182686f}, + {14.388216f, -423.468018f, -19.625271f}, + {42.471519f, -445.115295f, -19.769423f} }; class boss_the_lurker_below : public CreatureScript @@ -78,9 +78,9 @@ public: struct boss_the_lurker_belowAI : public Scripted_NoMovementAI { - boss_the_lurker_belowAI(Creature* c) : Scripted_NoMovementAI(c), Summons(me) + boss_the_lurker_belowAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -109,19 +109,19 @@ public: } void Reset() { - me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING); + me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_DISABLE_GRAVITY); SpoutAnimTimer = 1000; RotTimer = 0; - WaterboltTimer = 15000;//give time to get in range when fight starts + WaterboltTimer = 15000; // give time to get in range when fight starts SpoutTimer = 45000; - WhirlTimer = 18000;//after avery spout + WhirlTimer = 18000; // after avery spout PhaseTimer = 120000; GeyserTimer = rand()%5000 + 15000; - CheckTimer = 15000;//give time to get in range when fight starts - WaitTimer = 60000;//never reached - WaitTimer2 = 60000;//never reached + CheckTimer = 15000; // give time to get in range when fight starts + WaitTimer = 60000; // never reached + WaitTimer2 = 60000; // never reached - Submerged = true;//will be false at combat start + Submerged = true; // will be false at combat start Spawned = false; InRange = false; CanStartEvent = false; @@ -133,13 +133,13 @@ public: instance->SetData(DATA_THELURKERBELOWEVENT, NOT_STARTED); instance->SetData(DATA_STRANGE_POOL, NOT_STARTED); } - DoCast(me, SPELL_SUBMERGE);//submerge anim - me->SetVisible(false);//we start invis under water, submerged + DoCast(me, SPELL_SUBMERGE); // submerge anim + me->SetVisible(false); // we start invis under water, submerged me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -159,15 +159,13 @@ public: void MoveInLineOfSight(Unit* who) { - if (!CanStartEvent)//boss is invisible, don't attack + if (!CanStartEvent) // boss is invisible, don't attack return; if (!me->getVictim() && who->IsValidAttackTarget(me)) { float attackRadius = me->GetAttackDistance(who); if (me->IsWithinDistInMap(who, attackRadius)) - { AttackStart(who); - } } } @@ -179,7 +177,7 @@ public: void UpdateAI(const uint32 diff) { - if (!CanStartEvent)//boss is invisible, don't attack + if (!CanStartEvent) // boss is invisible, don't attack { if (CheckCanStart()) { @@ -190,21 +188,21 @@ public: WaitTimer2 = 500; } - if (!Submerged && WaitTimer2 <= diff)//wait 500ms before emerge anim + if (!Submerged && WaitTimer2 <= diff) // wait 500ms before emerge anim { me->RemoveAllAuras(); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); DoCast(me, SPELL_EMERGE, false); - WaitTimer2 = 60000;//never reached + WaitTimer2 = 60000; // never reached WaitTimer = 3000; } else WaitTimer2 -= diff; - if (WaitTimer <= diff)//wait 3secs for emerge anim, then attack + if (WaitTimer <= diff) // wait 3secs for emerge anim, then attack { WaitTimer = 3000; - CanStartEvent = true;//fresh fished from pool + CanStartEvent = true; // fresh fished from pool me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } @@ -214,7 +212,7 @@ public: return; } - if (me->getThreatManager().getThreatList().empty())//check if should evade + if (me->getThreatManager().getThreatList().empty()) // check if should evade { if (me->isInCombat()) EnterEvadeMode(); @@ -226,7 +224,7 @@ public: { me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_SUBMERGE); - PhaseTimer = 60000;//60secs submerged + PhaseTimer = 60000; // 60secs submerged Submerged = true; } else PhaseTimer-=diff; @@ -236,12 +234,12 @@ public: me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->MoveRotate(20000, urand(0, 1) ? ROTATE_DIRECTION_LEFT : ROTATE_DIRECTION_RIGHT); SpoutTimer = 45000; - WhirlTimer = 20000;//whirl directly after spout + WhirlTimer = 20000; // whirl directly after spout RotTimer = 20000; return; } else SpoutTimer -= diff; - //Whirl directly after a Spout and at random times + // Whirl directly after a Spout and at random times if (WhirlTimer <= diff) { WhirlTimer = 18000; @@ -273,7 +271,7 @@ public: for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { if (i->getSource() && i->getSource()->isAlive() && me->HasInArc(float(diff/20000*M_PI*2), i->getSource()) && me->IsWithinDist(i->getSource(), SPOUT_DIST) && !i->getSource()->IsInWater()) - DoCast(i->getSource(), SPELL_SPOUT, true);//only knock back palyers in arc, in 100yards, not in water + DoCast(i->getSource(), SPELL_SPOUT, true); // only knock back players in arc, in 100yards, not in water } } @@ -300,7 +298,7 @@ public: GeyserTimer = rand()%5000 + 15000; } else GeyserTimer -= diff; - if (!InRange)//if on players in melee range cast Waterbolt + if (!InRange) // if on players in melee range cast Waterbolt { if (WaterboltTimer <= diff) { @@ -318,12 +316,13 @@ public: DoMeleeAttackIfReady(); - }else//submerged + } + else // submerged { if (PhaseTimer <= diff) { Submerged = false; - me->InterruptNonMeleeSpells(false);//shouldn't be any + me->InterruptNonMeleeSpells(false); // shouldn't be any me->RemoveAllAuras(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); @@ -334,28 +333,22 @@ public: return; } else PhaseTimer-=diff; - if (me->getThreatManager().getThreatList().empty())//check if should evade + if (me->getThreatManager().getThreatList().empty()) // check if should evade { EnterEvadeMode(); return; } + if (!me->isInCombat()) DoZoneInCombat(); if (!Spawned) { me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - //spawn adds + // spawn adds for (uint8 i = 0; i < 9; ++i) - { - Creature* Summoned; - if (i < 6) - Summoned = me->SummonCreature(MOB_COILFANG_AMBUSHER, AddPos[i][0], AddPos[i][1], AddPos[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - else Summoned = me->SummonCreature(MOB_COILFANG_GUARDIAN, AddPos[i][0], AddPos[i][1], AddPos[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - - if (Summoned) - Summons.Summon(Summoned); - } + if (Creature* summoned = me->SummonCreature(i < 6 ? MOB_COILFANG_AMBUSHER : MOB_COILFANG_GUARDIAN, AddPos[i][0], AddPos[i][1], AddPos[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0)) + Summons.Summon(summoned); Spawned = true; } } @@ -363,32 +356,6 @@ public: }; }; -class mob_coilfang_guardian : public CreatureScript -{ -public: - mob_coilfang_guardian() : CreatureScript("mob_coilfang_guardian") { } - - CreatureAI* GetAI(Creature* creature) const - { - SimpleAI* ai = new SimpleAI (creature); - - ai->Spell[0].Enabled = true; - ai->Spell[0].Spell_Id = SPELL_ARCINGSMASH; - ai->Spell[0].Cooldown = 15000; - ai->Spell[0].First_Cast = 5000; - ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_TARGET; - - ai->Spell[1].Enabled = true; - ai->Spell[1].Spell_Id = SPELL_HAMSTRING; - ai->Spell[1].Cooldown = 10000; - ai->Spell[1].First_Cast = 2000; - ai->Spell[1].Cast_Target_Type = CAST_HOSTILE_TARGET; - - return ai; - } - -}; - class mob_coilfang_ambusher : public CreatureScript { public: @@ -401,7 +368,7 @@ public: struct mob_coilfang_ambusherAI : public Scripted_NoMovementAI { - mob_coilfang_ambusherAI(Creature* c) : Scripted_NoMovementAI(c) + mob_coilfang_ambusherAI(Creature* creature) : Scripted_NoMovementAI(creature) { } @@ -412,22 +379,15 @@ public: { MultiShotTimer = 10000; ShootBowTimer = 4000; - - } - - void EnterCombat(Unit* /*who*/) - { - } void MoveInLineOfSight(Unit* who) { - if (!who || me->getVictim()) return; + if (!who || me->getVictim()) + return; if (who->isInAccessiblePlaceFor(me) && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 45)) - { AttackStart(who); - } } void UpdateAI(const uint32 diff) @@ -438,18 +398,16 @@ public: DoCast(me->getVictim(), SPELL_SPREAD_SHOT, true); MultiShotTimer = 10000+rand()%10000; - ShootBowTimer += 1500;//add global cooldown + ShootBowTimer += 1500; // add global cooldown } else MultiShotTimer -= diff; if (ShootBowTimer <= diff) { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); int bp0 = 1100; - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastCustomSpell(target, SPELL_SHOOT, &bp0, NULL, NULL, true); ShootBowTimer = 4000+rand()%5000; - MultiShotTimer += 1500;//add global cooldown + MultiShotTimer += 1500; // add global cooldown } else ShootBowTimer -= diff; } }; @@ -482,7 +440,6 @@ class go_strange_pool : public GameObjectScript void AddSC_boss_the_lurker_below() { new boss_the_lurker_below(); - new mob_coilfang_guardian(); new mob_coilfang_ambusher(); new go_strange_pool(); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp index eeef50e3f9c..865fb143800 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp @@ -89,9 +89,9 @@ public: struct boss_morogrim_tidewalkerAI : public ScriptedAI { - boss_morogrim_tidewalkerAI(Creature* c) : ScriptedAI(c) + boss_morogrim_tidewalkerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -140,7 +140,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -296,7 +296,7 @@ public: struct mob_water_globuleAI : public ScriptedAI { - mob_water_globuleAI(Creature* c) : ScriptedAI(c) {} + mob_water_globuleAI(Creature* creature) : ScriptedAI(creature) {} uint32 Check_Timer; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index 6c4019c7989..3ed3d1a82de 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -153,7 +153,7 @@ class instance_serpent_shrine : public InstanceMapScript if (Creature* frenzy = player->SummonCreature(MOB_COILFANG_FRENZY, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000)) { frenzy->Attack(player, false); - frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING); + frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_DISABLE_GRAVITY); } DoSpawnFrenzy = false; } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp index c3203621dbb..48c5a360619 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp @@ -58,9 +58,9 @@ public: struct boss_thespiaAI : public ScriptedAI { - boss_thespiaAI(Creature* c) : ScriptedAI(c) + boss_thespiaAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -79,7 +79,7 @@ public: instance->SetData(TYPE_HYDROMANCER_THESPIA, NOT_STARTED); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEAD, me); @@ -158,7 +158,7 @@ public: struct mob_coilfang_waterelementalAI : public ScriptedAI { - mob_coilfang_waterelementalAI(Creature* c) : ScriptedAI(c) {} + mob_coilfang_waterelementalAI(Creature* creature) : ScriptedAI(creature) {} uint32 WaterBoltVolley_Timer; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp index ce73e467c0c..739168863f4 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp @@ -60,9 +60,9 @@ public: struct boss_mekgineer_steamriggerAI : public ScriptedAI { - boss_mekgineer_steamriggerAI(Creature* c) : ScriptedAI(c) + boss_mekgineer_steamriggerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -88,7 +88,7 @@ public: instance->SetData(TYPE_MEKGINEER_STEAMRIGGER, NOT_STARTED); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -204,9 +204,9 @@ public: struct mob_steamrigger_mechanicAI : public ScriptedAI { - mob_steamrigger_mechanicAI(Creature* c) : ScriptedAI(c) + mob_steamrigger_mechanicAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -231,7 +231,7 @@ public: { if (instance && instance->GetData64(DATA_MEKGINEERSTEAMRIGGER) && instance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) { - if (Unit* pMekgineer = Unit::GetUnit((*me), instance->GetData64(DATA_MEKGINEERSTEAMRIGGER))) + if (Unit* pMekgineer = Unit::GetUnit(*me, instance->GetData64(DATA_MEKGINEERSTEAMRIGGER))) { if (me->IsWithinDistInMap(pMekgineer, MAX_REPAIR_RANGE)) { diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp index bfbeff81d3e..cae1117805a 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp @@ -54,9 +54,9 @@ public: struct mob_naga_distillerAI : public ScriptedAI { - mob_naga_distillerAI(Creature* c) : ScriptedAI(c) + mob_naga_distillerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -112,9 +112,9 @@ public: struct boss_warlord_kalithreshAI : public ScriptedAI { - boss_warlord_kalithreshAI(Creature* c) : ScriptedAI(c) + boss_warlord_kalithreshAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -157,7 +157,7 @@ public: me->RemoveAurasDueToSpell(SPELL_WARLORDS_RAGE_PROC); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp index aebd71bbd47..42d617992ed 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp @@ -40,7 +40,7 @@ public: struct boss_hungarfenAI : public ScriptedAI { - boss_hungarfenAI(Creature* c) : ScriptedAI(c) + boss_hungarfenAI(Creature* creature) : ScriptedAI(creature) { } @@ -112,7 +112,7 @@ public: struct mob_underbog_mushroomAI : public ScriptedAI { - mob_underbog_mushroomAI(Creature* c) : ScriptedAI(c) {} + mob_underbog_mushroomAI(Creature* creature) : ScriptedAI(creature) {} bool Stop; uint32 Grow_Timer; diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp index fb3be660b5e..f7079e5c664 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp @@ -47,7 +47,7 @@ public: struct boss_the_black_stalkerAI : public ScriptedAI { - boss_the_black_stalkerAI(Creature* c) : ScriptedAI(c) + boss_the_black_stalkerAI(Creature* creature) : ScriptedAI(creature) { } @@ -88,7 +88,7 @@ public: } } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { for (std::list::const_iterator i = Striders.begin(); i != Striders.end(); ++i) if (Creature* strider = Unit::GetCreature(*me, *i)) diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index b7604c41794..0e654ade995 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -66,9 +66,9 @@ public: struct boss_gruulAI : public ScriptedAI { - boss_gruulAI(Creature* c) : ScriptedAI(c) + boss_gruulAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } InstanceScript* instance; @@ -109,7 +109,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -130,8 +130,13 @@ public: { switch (urand(0, 1)) { - case 0: target->CastSpell(target, SPELL_MAGNETIC_PULL, true, NULL, NULL, me->GetGUID()); break; - case 1: target->CastSpell(target, SPELL_KNOCK_BACK, true, NULL, NULL, me->GetGUID()); break; + case 0: + target->CastSpell(target, SPELL_MAGNETIC_PULL, true, NULL, NULL, me->GetGUID()); + break; + + case 1: + target->CastSpell(target, SPELL_KNOCK_BACK, true, NULL, NULL, me->GetGUID()); + break; } } } diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp index 4636334e668..0f42b1b7e53 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp @@ -118,9 +118,9 @@ public: struct boss_high_king_maulgarAI : public ScriptedAI { - boss_high_king_maulgarAI(Creature* c) : ScriptedAI(c) + boss_high_king_maulgarAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); for (uint8 i = 0; i < 4; ++i) Council[i] = 0; } @@ -173,7 +173,7 @@ public: DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -223,7 +223,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_MAULGAREVENT_TANK)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); if (target) { @@ -317,9 +317,9 @@ public: struct boss_olm_the_summonerAI : public ScriptedAI { - boss_olm_the_summonerAI(Creature* c) : ScriptedAI(c) + boss_olm_the_summonerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 DarkDecay_Timer; @@ -363,7 +363,7 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -383,7 +383,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_MAULGAREVENT_TANK)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); if (target) { @@ -445,9 +445,9 @@ public: struct boss_kiggler_the_crazedAI : public ScriptedAI { - boss_kiggler_the_crazedAI(Creature* c) : ScriptedAI(c) + boss_kiggler_the_crazedAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 GreaterPolymorph_Timer; @@ -478,7 +478,7 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -498,7 +498,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_MAULGAREVENT_TANK)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); if (target) { @@ -567,9 +567,9 @@ public: struct boss_blindeye_the_seerAI : public ScriptedAI { - boss_blindeye_the_seerAI(Creature* c) : ScriptedAI(c) + boss_blindeye_the_seerAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 GreaterPowerWordShield_Timer; @@ -598,7 +598,7 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -618,7 +618,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_MAULGAREVENT_TANK)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); if (target) { @@ -677,9 +677,9 @@ public: struct boss_krosh_firehandAI : public ScriptedAI { - boss_krosh_firehandAI(Creature* c) : ScriptedAI(c) + boss_krosh_firehandAI(Creature* creature) : ScriptedAI(creature) { - instance = c->GetInstanceScript(); + instance = creature->GetInstanceScript(); } uint32 GreaterFireball_Timer; @@ -708,7 +708,7 @@ public: } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -728,7 +728,7 @@ public: //Only if not incombat check if the event is started if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) { - Unit* target = Unit::GetUnit((*me), instance->GetData64(DATA_MAULGAREVENT_TANK)); + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); if (target) { diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp index bd4f91e8e39..3514732b53a 100644 --- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp +++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp @@ -77,7 +77,8 @@ public: bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -136,12 +137,18 @@ public: switch (type) { case DATA_MAULGAREVENT: - if (data == DONE) HandleGameObject(MaulgarDoor, true); - m_auiEncounter[0] = data; break; + if (data == DONE) + HandleGameObject(MaulgarDoor, true); + m_auiEncounter[0] = data; + break; + case DATA_GRUULEVENT: - if (data == IN_PROGRESS) HandleGameObject(GruulDoor, false); - else HandleGameObject(GruulDoor, true); - m_auiEncounter[1] = data; break; + if (data == IN_PROGRESS) + HandleGameObject(GruulDoor, false); + else + HandleGameObject(GruulDoor, true); + m_auiEncounter[1] = data; + break; } if (data == DONE) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 7fa417cacb2..f6b7518661e 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -121,7 +121,7 @@ class boss_broggok : public CreatureScript DoMeleeAttackIfReady(); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -133,9 +133,9 @@ class boss_broggok : public CreatureScript }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_broggokAI (Creature); + return new boss_broggokAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index b847500fc36..01873afeaa9 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -158,7 +158,9 @@ class boss_kelidan_the_breaker : public CreatureScript uint64 GetChanneled(Creature* channeler1) { SummonChannelers(); - if (!channeler1) return 0; + if (!channeler1) + return 0; + uint8 i; for (i=0; i<5; ++i) { @@ -183,7 +185,7 @@ class boss_kelidan_the_breaker : public CreatureScript } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DIE, me); @@ -268,9 +270,9 @@ class boss_kelidan_the_breaker : public CreatureScript }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_kelidan_the_breakerAI (Creature); + return new boss_kelidan_the_breakerAI(creature); } }; @@ -324,10 +326,10 @@ class mob_shadowmoon_channeler : public CreatureScript DoStartMovement(who); } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) - CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(Killer); + CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer); } void UpdateAI(const uint32 diff) @@ -371,9 +373,9 @@ class mob_shadowmoon_channeler : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_shadowmoon_channelerAI (Creature); + return new mob_shadowmoon_channelerAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp index f056ccd40ee..dc9f83b073d 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp @@ -94,7 +94,7 @@ class boss_the_maker : public CreatureScript DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DIE, me); @@ -153,9 +153,9 @@ class boss_the_maker : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_the_makerAI (Creature); + return new boss_the_makerAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp index a6adb6b952e..2ab2b2b5b2e 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp @@ -113,7 +113,7 @@ class boss_omor_the_unscarred : public CreatureScript ++SummonedCount; } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DIE, me); } @@ -143,7 +143,7 @@ class boss_omor_the_unscarred : public CreatureScript if (Player* temp = Unit::GetPlayer(*me, PlayerGUID)) { //if unit dosen't have this flag, then no pulling back (script will attempt cast, even if orbital strike was resisted) - if (temp->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) + if (temp->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR)) { me->InterruptNonMeleeSpells(false); DoCast(temp, SPELL_SHADOW_WHIP); @@ -219,9 +219,9 @@ class boss_omor_the_unscarred : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_omor_the_unscarredAI (Creature); + return new boss_omor_the_unscarredAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index ecea5e6abb4..a5cdebea754 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -145,8 +145,8 @@ class boss_nazan : public CreatureScript flight = false; BellowingRoar_Timer = 6000; ConeOfFire_Timer = 12000; - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetDisableGravity(false); + me->SetWalk(true); me->GetMotionMaster()->Clear(); if (Unit* victim = SelectTarget(SELECT_TARGET_NEAREST, 0)) me->AI()->AttackStart(victim); @@ -194,9 +194,9 @@ class boss_nazan : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_nazanAI (Creature); + return new boss_nazanAI(creature); } }; @@ -236,9 +236,9 @@ class boss_vazruden : public CreatureScript DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me); } - void JustDied(Unit* who) + void JustDied(Unit* killer) { - if (who && who != me) + if (killer && killer != me) DoScriptText(SAY_DIE, me); } @@ -272,9 +272,9 @@ class boss_vazruden : public CreatureScript DoMeleeAttackIfReady(); } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_vazrudenAI (Creature); + return new boss_vazrudenAI(creature); } }; @@ -374,7 +374,7 @@ class boss_vazruden_the_herald : public CreatureScript if (summoned->GetEntry() == ENTRY_NAZAN) { CAST_AI(boss_nazan::boss_nazanAI, summoned->AI())->VazrudenGUID = VazrudenGUID; - summoned->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + summoned->SetDisableGravity(true); summoned->SetSpeed(MOVE_FLIGHT, 2.5f); if (victim) AttackStartNoMove(victim); @@ -453,9 +453,9 @@ class boss_vazruden_the_herald : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_vazruden_the_heraldAI (Creature); + return new boss_vazruden_the_heraldAI(creature); } }; @@ -480,10 +480,10 @@ class mob_hellfire_sentry : public CreatureScript void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* who) + void JustDied(Unit* killer) { if (Creature* herald = me->FindNearestCreature(ENTRY_VAZRUDEN_HERALD, 150)) - CAST_AI(boss_vazruden_the_herald::boss_vazruden_the_heraldAI, herald->AI())->SentryDownBy(who); + CAST_AI(boss_vazruden_the_herald::boss_vazruden_the_heraldAI, herald->AI())->SentryDownBy(killer); } void UpdateAI(const uint32 diff) @@ -503,9 +503,9 @@ class mob_hellfire_sentry : public CreatureScript DoMeleeAttackIfReady(); } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_hellfire_sentryAI (Creature); + return new mob_hellfire_sentryAI(creature); } }; void AddSC_boss_vazruden_the_herald() diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp index b2f8af2c80d..2c00a68321a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp @@ -87,7 +87,7 @@ class boss_watchkeeper_gargolmar : public CreatureScript { if (!me->getVictim() && me->canCreatureAttack(who)) { - if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; float attackRadius = me->GetAttackDistance(who); @@ -109,7 +109,7 @@ class boss_watchkeeper_gargolmar : public CreatureScript DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DIE, me); } @@ -163,9 +163,9 @@ class boss_watchkeeper_gargolmar : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_watchkeeper_gargolmarAI (Creature); + return new boss_watchkeeper_gargolmarAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index c355079e0e8..1b29abf1afc 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -198,9 +198,9 @@ class mob_abyssal : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_abyssalAI(Creature); + return new mob_abyssalAI(creature); } }; @@ -322,7 +322,7 @@ class boss_magtheridon : public CreatureScript DoScriptText(SAY_PLAYER_KILLED, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_MAGTHERIDON_EVENT, DONE); @@ -464,9 +464,9 @@ class boss_magtheridon : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_magtheridonAI(Creature); + return new boss_magtheridonAI(creature); } }; @@ -533,7 +533,7 @@ class mob_hellfire_channeler : public CreatureScript DoCast(me, SPELL_SOUL_TRANSFER, true); } - void JustDied(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_CHANNELER_EVENT, DONE); @@ -583,9 +583,9 @@ class mob_hellfire_channeler : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_hellfire_channelerAI(Creature); + return new mob_hellfire_channelerAI(creature); } }; @@ -597,16 +597,16 @@ public: { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - InstanceScript* instance = pGO->GetInstanceScript(); + InstanceScript* instance = go->GetInstanceScript(); if (!instance) return true; if (instance->GetData(DATA_MAGTHERIDON_EVENT) != IN_PROGRESS) return true; - Creature* Magtheridon =Unit::GetCreature(*pGO, instance->GetData64(DATA_MAGTHERIDON)); + Creature* Magtheridon =Unit::GetCreature(*go, instance->GetData64(DATA_MAGTHERIDON)); if (!Magtheridon || !Magtheridon->isAlive()) return true; @@ -617,7 +617,7 @@ public: player->InterruptNonMeleeSpells(false); player->CastSpell(player, SPELL_SHADOW_GRASP, true); player->CastSpell(player, SPELL_SHADOW_GRASP_VISUAL, false); - CAST_AI(boss_magtheridon::boss_magtheridonAI, Magtheridon->AI())->SetClicker(pGO->GetGUID(), player->GetGUID()); + CAST_AI(boss_magtheridon::boss_magtheridonAI, Magtheridon->AI())->SetClicker(go->GetGUID(), player->GetGUID()); return true; } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp index caaedc4c51b..cb55d627f7d 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -80,7 +80,9 @@ class instance_magtheridons_lair : public InstanceMapScript bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; + return false; } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index 970c089918e..7dfdc40a787 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -224,7 +224,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DIE, me); @@ -301,9 +301,9 @@ class boss_grand_warlock_nethekurse : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_grand_warlock_nethekurseAI (Creature); + return new boss_grand_warlock_nethekurseAI(creature); } }; @@ -356,7 +356,7 @@ class mob_fel_orc_convert : public CreatureScript } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { if (instance) { @@ -383,9 +383,9 @@ class mob_fel_orc_convert : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_fel_orc_convertAI (Creature); + return new mob_fel_orc_convertAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index 5e8ed53fa4b..5371473e21e 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -143,9 +143,9 @@ class mob_omrogg_heads : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_omrogg_headsAI (Creature); + return new mob_omrogg_headsAI(creature); } }; @@ -295,7 +295,7 @@ class boss_warbringer_omrogg : public CreatureScript } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { Unit* pLeftHead = Unit::GetUnit(*me, LeftHeadGUID); Unit* pRightHead = Unit::GetUnit(*me, RightHeadGUID); diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index 3f07552441b..c1489671292 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -95,7 +95,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript removeAdds(); me->SetSpeed(MOVE_RUN, 2); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); summoned = 2; InBlade = false; @@ -137,7 +137,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript } } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); removeAdds(); @@ -166,7 +166,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript { for (std::vector::const_iterator itr = adds.begin(); itr!= adds.end(); ++itr) { - Unit* temp = Unit::GetUnit((*me), *itr); + Unit* temp = Unit::GetUnit(*me, *itr); if (temp && temp->isAlive()) { (*temp).GetMotionMaster()->Clear(true); @@ -178,7 +178,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript for (std::vector::const_iterator itr = assassins.begin(); itr!= assassins.end(); ++itr) { - Unit* temp = Unit::GetUnit((*me), *itr); + Unit* temp = Unit::GetUnit(*me, *itr); if (temp && temp->isAlive()) { (*temp).GetMotionMaster()->Clear(true); @@ -236,8 +236,8 @@ class boss_warchief_kargath_bladefist : public CreatureScript float x, y, randx, randy; randx = 0.0f + rand()%40; randy = 0.0f + rand()%40; - x = 210+ randx ; - y = -60- randy ; + x = 210+ randx; + y = -60- randy; me->GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ()); Wait_Timer = 0; } @@ -316,9 +316,9 @@ class boss_warchief_kargath_bladefist : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_warchief_kargath_bladefistAI (Creature); + return new boss_warchief_kargath_bladefistAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index fcfe6c0ea16..25207073708 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -130,7 +130,7 @@ class boss_alar : public CreatureScript //me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); //me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true); - me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->setActive(false); } @@ -140,12 +140,12 @@ class boss_alar : public CreatureScript if (instance) instance->SetData(DATA_ALAREVENT, IN_PROGRESS); - me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); // after enterevademode will be set walk movement + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); // after enterevademode will be set walk movement DoZoneInCombat(); me->setActive(true); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { if (instance) instance->SetData(DATA_ALAREVENT, DONE); @@ -409,7 +409,7 @@ class boss_alar : public CreatureScript if (Summoned) { Summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Summoned->SetFloatValue(OBJECT_FIELD_SCALE_X, Summoned->GetFloatValue(OBJECT_FIELD_SCALE_X)*2.5f); + Summoned->SetObjectScale(Summoned->GetFloatValue(OBJECT_FIELD_SCALE_X)*2.5f); Summoned->SetDisplayId(11686); Summoned->setFaction(me->getFaction()); Summoned->SetLevel(me->getLevel()); @@ -450,9 +450,9 @@ class boss_alar : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_alarAI(Creature); + return new boss_alarAI(creature); } }; @@ -470,7 +470,7 @@ class mob_ember_of_alar : public CreatureScript mob_ember_of_alarAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + creature->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true); } @@ -500,7 +500,7 @@ class mob_ember_of_alar : public CreatureScript me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (instance && instance->GetData(DATA_ALAREVENT) == 2) { - if (Unit* Alar = Unit::GetUnit((*me), instance->GetData64(DATA_ALAR))) + if (Unit* Alar = Unit::GetUnit(*me, instance->GetData64(DATA_ALAR))) { int32 AlarHealth = int32(Alar->GetHealth()) - int32(Alar->CountPctFromMaxHealth(3)); if (AlarHealth > 0) @@ -529,9 +529,9 @@ class mob_ember_of_alar : public CreatureScript }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_ember_of_alarAI(Creature); + return new mob_ember_of_alarAI(creature); } }; @@ -554,9 +554,9 @@ class mob_flame_patch_alar : public CreatureScript void UpdateAI(const uint32 /*diff*/) {} }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_flame_patch_alarAI(Creature); + return new mob_flame_patch_alarAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index 05fad24f35e..d202fdd2f44 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -140,7 +140,7 @@ class boss_high_astromancer_solarian : public CreatureScript me->SetArmor(defaultarmor); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetVisible(true); - me->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize); + me->SetObjectScale(defaultsize); me->SetDisplayId(MODEL_HUMAN); Summons.DespawnAll(); @@ -151,9 +151,9 @@ class boss_high_astromancer_solarian : public CreatureScript DoScriptText(RAND(SAY_KILL1, SAY_KILL2, SAY_KILL3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { - me->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize); + me->SetObjectScale(defaultsize); me->SetDisplayId(MODEL_HUMAN); DoScriptText(SAY_DEATH, me); if (instance) @@ -397,7 +397,7 @@ class boss_high_astromancer_solarian : public CreatureScript DoScriptText(SAY_VOIDB, me); me->SetArmor(WV_ARMOR); me->SetDisplayId(MODEL_VOIDWALKER); - me->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize*2.5f); + me->SetObjectScale(defaultsize*2.5f); } DoMeleeAttackIfReady(); } @@ -454,7 +454,7 @@ class mob_solarium_priest : public CreatureScript { case 0: if (instance) - target = Unit::GetUnit((*me), instance->GetData64(DATA_ASTROMANCER)); + target = Unit::GetUnit(*me, instance->GetData64(DATA_ASTROMANCER)); break; case 1: target = me; @@ -490,9 +490,9 @@ class mob_solarium_priest : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_solarium_priestAI (Creature); + return new mob_solarium_priestAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 7a60b1545d0..b66fc5f5e24 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -147,11 +147,11 @@ struct advisorbase_ai : public ScriptedAI { advisorbase_ai(Creature* creature) : ScriptedAI(creature) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); m_bDoubled_Health = false; } - InstanceScript* m_instance; + InstanceScript* instance; bool FakeDeath; bool m_bDoubled_Health; uint32 DelayRes_Timer; @@ -174,8 +174,8 @@ struct advisorbase_ai : public ScriptedAI me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //reset encounter - if (m_instance && (m_instance->GetData(DATA_KAELTHASEVENT) == 1 || m_instance->GetData(DATA_KAELTHASEVENT) == 3)) - if (Creature* Kaelthas = Unit::GetCreature((*me), m_instance->GetData64(DATA_KAELTHAS))) + if (instance && (instance->GetData(DATA_KAELTHASEVENT) == 1 || instance->GetData(DATA_KAELTHASEVENT) == 3)) + if (Creature* Kaelthas = Unit::GetCreature((*me), instance->GetData64(DATA_KAELTHAS))) Kaelthas->AI()->EnterEvadeMode(); } @@ -214,14 +214,14 @@ struct advisorbase_ai : public ScriptedAI return; //Prevent glitch if in fake death - if (FakeDeath && m_instance && m_instance->GetData(DATA_KAELTHASEVENT) != 0) + if (FakeDeath && instance && instance->GetData(DATA_KAELTHASEVENT) != 0) { damage = 0; return; } //Don't really die in phase 1 & 3, only die after that - if (m_instance && m_instance->GetData(DATA_KAELTHASEVENT) != 0) + if (instance && instance->GetData(DATA_KAELTHASEVENT) != 0) { //prevent death damage = 0; @@ -253,7 +253,7 @@ struct advisorbase_ai : public ScriptedAI DelayRes_Timer = 0; FakeDeath = false; - Unit* Target = Unit::GetUnit((*me), DelayRes_Target); + Unit* Target = Unit::GetUnit(*me, DelayRes_Target); if (!Target) Target = me->getVictim(); @@ -280,11 +280,11 @@ class boss_kaelthas : public CreatureScript { boss_kaelthasAI(Creature* creature) : ScriptedAI(creature), summons(me) { - m_instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); memset(&m_auiAdvisorGuid, 0, sizeof(m_auiAdvisorGuid)); } - InstanceScript* m_instance; + InstanceScript* instance; uint32 Fireball_Timer; uint32 ArcaneDisruption_Timer; @@ -335,8 +335,8 @@ class boss_kaelthas : public CreatureScript me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (m_instance) - m_instance->SetData(DATA_KAELTHASEVENT, 0); + if (instance) + instance->SetData(DATA_KAELTHASEVENT, 0); } void PrepareAdvisors() @@ -355,13 +355,13 @@ class boss_kaelthas : public CreatureScript void StartEvent() { - if (!m_instance) + if (!instance) return; - m_auiAdvisorGuid[0] = m_instance->GetData64(DATA_THALADREDTHEDARKENER); - m_auiAdvisorGuid[1] = m_instance->GetData64(DATA_LORDSANGUINAR); - m_auiAdvisorGuid[2] = m_instance->GetData64(DATA_GRANDASTROMANCERCAPERNIAN); - m_auiAdvisorGuid[3] = m_instance->GetData64(DATA_MASTERENGINEERTELONICUS); + m_auiAdvisorGuid[0] = instance->GetData64(DATA_THALADREDTHEDARKENER); + m_auiAdvisorGuid[1] = instance->GetData64(DATA_LORDSANGUINAR); + m_auiAdvisorGuid[2] = instance->GetData64(DATA_GRANDASTROMANCERCAPERNIAN); + m_auiAdvisorGuid[3] = instance->GetData64(DATA_MASTERENGINEERTELONICUS); if (!m_auiAdvisorGuid[0] || !m_auiAdvisorGuid[1] || !m_auiAdvisorGuid[2] || !m_auiAdvisorGuid[3]) { @@ -371,7 +371,7 @@ class boss_kaelthas : public CreatureScript Phase = 4; - m_instance->SetData(DATA_KAELTHASEVENT, 4); + instance->SetData(DATA_KAELTHASEVENT, 4); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -386,7 +386,7 @@ class boss_kaelthas : public CreatureScript DoScriptText(SAY_INTRO, me); - m_instance->SetData(DATA_KAELTHASEVENT, 1); + instance->SetData(DATA_KAELTHASEVENT, 1); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); PhaseSubphase = 0; @@ -399,7 +399,7 @@ class boss_kaelthas : public CreatureScript { if (!me->HasUnitState(UNIT_STATE_STUNNED) && me->canCreatureAttack(who)) { - if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; float attackRadius = me->GetAttackDistance(who); @@ -412,7 +412,7 @@ class boss_kaelthas : public CreatureScript } else if (me->GetMap()->IsDungeon()) { - if (m_instance && !m_instance->GetData(DATA_KAELTHASEVENT) && !Phase) + if (instance && !instance->GetData(DATA_KAELTHASEVENT) && !Phase) StartEvent(); who->SetInCombatWith(me); @@ -424,7 +424,7 @@ class boss_kaelthas : public CreatureScript void EnterCombat(Unit* /*who*/) { - if (m_instance && !m_instance->GetData(DATA_KAELTHASEVENT) && !Phase) + if (instance && !instance->GetData(DATA_KAELTHASEVENT) && !Phase) StartEvent(); } @@ -445,9 +445,12 @@ class boss_kaelthas : public CreatureScript } } - void SummonedCreatureDespawn(Creature* summon) {summons.Despawn(summon);} + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -456,12 +459,12 @@ class boss_kaelthas : public CreatureScript summons.DespawnAll(); - if (m_instance) - m_instance->SetData(DATA_KAELTHASEVENT, 0); + if (instance) + instance->SetData(DATA_KAELTHASEVENT, 0); for (uint8 i = 0; i < MAX_ADVISORS; ++i) { - if (Unit* pAdvisor = Unit::GetUnit((*me), m_auiAdvisorGuid[i])) + if (Unit* pAdvisor = Unit::GetUnit(*me, m_auiAdvisorGuid[i])) pAdvisor->Kill(pAdvisor); } } @@ -621,8 +624,8 @@ class boss_kaelthas : public CreatureScript if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) { Phase = 2; - if (m_instance) - m_instance->SetData(DATA_KAELTHASEVENT, 2); + if (instance) + instance->SetData(DATA_KAELTHASEVENT, 2); DoScriptText(SAY_PHASE2_WEAPON, me); @@ -666,8 +669,8 @@ class boss_kaelthas : public CreatureScript if (Phase_Timer <= diff) { DoScriptText(SAY_PHASE3_ADVANCE, me); - if (m_instance) - m_instance->SetData(DATA_KAELTHASEVENT, 3); + if (instance) + instance->SetData(DATA_KAELTHASEVENT, 3); Phase = 3; PhaseSubphase = 0; } @@ -704,8 +707,8 @@ class boss_kaelthas : public CreatureScript DoScriptText(SAY_PHASE4_INTRO2, me); Phase = 4; - if (m_instance) - m_instance->SetData(DATA_KAELTHASEVENT, 4); + if (instance) + instance->SetData(DATA_KAELTHASEVENT, 4); // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael. DoResetThreat(); @@ -809,8 +812,8 @@ class boss_kaelthas : public CreatureScript { if (HealthBelowPct(50)) { - if (m_instance) - m_instance->SetData(DATA_KAELTHASEVENT, 4); + if (instance) + instance->SetData(DATA_KAELTHASEVENT, 4); Phase = 5; Phase_Timer = 10000; @@ -892,7 +895,7 @@ class boss_kaelthas : public CreatureScript // 1) Kael'thas will portal the whole raid right into his body for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { //Use work around packet to prevent player from being dropped from combat @@ -913,7 +916,7 @@ class boss_kaelthas : public CreatureScript // 2) At that point he will put a Gravity Lapse debuff on everyone for (i = me->getThreatManager().getThreatList().begin(); i != me->getThreatManager().getThreatList().end(); ++i) { - if (Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid())) + if (Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid())) { DoCast(unit, SPELL_KNOCKBACK, true); //Gravity lapse - needs an exception in Spell system to work @@ -945,7 +948,7 @@ class boss_kaelthas : public CreatureScript //Remove flight for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i) { - if (Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid())) + if (Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid())) { //Using packet workaround WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY, 12); @@ -996,9 +999,9 @@ class boss_kaelthas : public CreatureScript } } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_kaelthasAI(Creature); + return new boss_kaelthasAI(creature); } }; @@ -1042,7 +1045,7 @@ class boss_thaladred_the_darkener : public CreatureScript void JustDied(Unit* /*killer*/) { - if (m_instance && m_instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) DoScriptText(SAY_THALADRED_DEATH, me); } @@ -1094,9 +1097,9 @@ class boss_thaladred_the_darkener : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_thaladred_the_darkenerAI(Creature); + return new boss_thaladred_the_darkenerAI(creature); } }; @@ -1132,9 +1135,9 @@ class boss_lord_sanguinar : public CreatureScript DoScriptText(SAY_SANGUINAR_AGGRO, me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { - if (m_instance && m_instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) DoScriptText(SAY_SANGUINAR_DEATH, me); } @@ -1162,9 +1165,9 @@ class boss_lord_sanguinar : public CreatureScript DoMeleeAttackIfReady(); } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_lord_sanguinarAI(Creature); + return new boss_lord_sanguinarAI(creature); } }; //Grand Astromancer Capernian AI @@ -1199,7 +1202,7 @@ class boss_grand_astromancer_capernian : public CreatureScript void JustDied(Unit* /*killer*/) { - if (m_instance && m_instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) DoScriptText(SAY_CAPERNIAN_DEATH, me); } @@ -1284,7 +1287,7 @@ class boss_grand_astromancer_capernian : public CreatureScript std::list& m_threatlist = me->getThreatManager().getThreatList(); for (std::list::const_iterator i = m_threatlist.begin(); i!= m_threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit((*me), (*i)->getUnitGuid()); + Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); //if in melee range if (unit && unit->IsWithinDistInMap(me, 5)) { @@ -1306,9 +1309,9 @@ class boss_grand_astromancer_capernian : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_grand_astromancer_capernianAI(Creature); + return new boss_grand_astromancer_capernianAI(creature); } }; @@ -1338,7 +1341,7 @@ class boss_master_engineer_telonicus : public CreatureScript void JustDied(Unit* /*killer*/) { - if (m_instance && m_instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) DoScriptText(SAY_TELONICUS_DEATH, me); } @@ -1389,9 +1392,9 @@ class boss_master_engineer_telonicus : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_master_engineer_telonicusAI(Creature); + return new boss_master_engineer_telonicusAI(creature); } }; @@ -1453,9 +1456,9 @@ class mob_kael_flamestrike : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_kael_flamestrikeAI(Creature); + return new mob_kael_flamestrikeAI(creature); } }; @@ -1507,9 +1510,9 @@ class mob_phoenix_tk : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_phoenix_tkAI(Creature); + return new mob_phoenix_tkAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 576d0a8bbf2..275a72e75ac 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -76,8 +76,8 @@ class boss_void_reaver : public CreatureScript Enraged = false; - if (instance && me->isAlive()) - instance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED); + if (instance && me->isAlive()) + instance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED); } void KilledUnit(Unit* /*victim*/) @@ -85,7 +85,7 @@ class boss_void_reaver : public CreatureScript DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2, SAY_SLAY3), me); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); DoZoneInCombat(); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp index 1ec4a6e55ec..f25b6749055 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp @@ -78,7 +78,8 @@ class instance_the_eye : public InstanceMapScript bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp index b8b0ffd4d2e..a1287a57402 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp @@ -86,7 +86,7 @@ class boss_gatewatcher_iron_hand : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH_1, me); //TODO: Add door check/open code diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 7e435187be9..59837fdbed1 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -101,7 +101,7 @@ class boss_nethermancer_sepethrea : public CreatureScript DoScriptText(RAND(SAY_SLAY1, SAY_SLAY2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (instance) diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp index cdc3b799b2c..3a4d449707d 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp @@ -103,7 +103,7 @@ class boss_pathaleon_the_calculator : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp index 9db2b660d2a..ad3c899237f 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp @@ -66,7 +66,7 @@ class instance_mechanar : public InstanceMapScript return false; } - uint64 GetData64 (uint32 /*identifier*/) + uint64 GetData64(uint32 /*identifier*/) { return 0; } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index db95f60f556..d675b438968 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -128,7 +128,7 @@ class npc_millhouse_manastorm : public CreatureScript Talk(SAY_KILL); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { Talk(SAY_DEATH); @@ -316,7 +316,7 @@ class npc_warden_mellichar : public CreatureScript if (!me->getVictim() && me->canCreatureAttack(who)) { - if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; if (who->GetTypeId() != TYPEID_PLAYER) return; diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index de86ec8672c..c2eeaf9fe7a 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -112,7 +112,7 @@ class boss_harbinger_skyriss : public CreatureScript void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (instance) diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp index 6a27d295ebc..ffe96fb7bd1 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp @@ -93,7 +93,8 @@ class instance_arcatraz : public InstanceMapScript bool IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; return false; } @@ -102,15 +103,41 @@ class instance_arcatraz : public InstanceMapScript { switch (go->GetEntry()) { - case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_AlphaGUID = go->GetGUID(); break; - case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_BetaGUID = go->GetGUID(); break; - case POD_ALPHA: Pod_AlphaGUID = go->GetGUID(); break; - case POD_GAMMA: Pod_GammaGUID = go->GetGUID(); break; - case POD_BETA: Pod_BetaGUID = go->GetGUID(); break; - case POD_DELTA: Pod_DeltaGUID = go->GetGUID(); break; - case POD_OMEGA: Pod_OmegaGUID = go->GetGUID(); break; - case SEAL_SPHERE: GoSphereGUID = go->GetGUID(); break; - //case WARDENS_SHIELD: Wardens_ShieldGUID = go->GetGUID(); break; + case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: + Containment_Core_Security_Field_AlphaGUID = go->GetGUID(); + break; + + case CONTAINMENT_CORE_SECURITY_FIELD_BETA: + Containment_Core_Security_Field_BetaGUID = go->GetGUID(); + break; + + case POD_ALPHA: + Pod_AlphaGUID = go->GetGUID(); + break; + + case POD_GAMMA: + Pod_GammaGUID = go->GetGUID(); + break; + + case POD_BETA: + Pod_BetaGUID = go->GetGUID(); + break; + + case POD_DELTA: + Pod_DeltaGUID = go->GetGUID(); + break; + + case POD_OMEGA: + Pod_OmegaGUID = go->GetGUID(); + break; + + case SEAL_SPHERE: + GoSphereGUID = go->GetGUID(); + break; + + /*case WARDENS_SHIELD: + Wardens_ShieldGUID = go->GetGUID(); + break;*/ } } diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp index ccac73c5dc6..ba61a1bfb12 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp @@ -107,7 +107,7 @@ class boss_high_botanist_freywinn : public CreatureScript DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } @@ -195,9 +195,9 @@ class boss_high_botanist_freywinn : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_high_botanist_freywinnAI (Creature); + return new boss_high_botanist_freywinnAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp index 488ddba40cf..e8188f892b3 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp @@ -211,9 +211,9 @@ class boss_laj : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_lajAI (Creature); + return new boss_lajAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp index 7e9960225bb..3acde2455db 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -118,9 +118,9 @@ class mob_warp_splinter_treant : public CreatureScript DoMeleeAttackIfReady(); } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new mob_warp_splinter_treantAI (Creature); + return new mob_warp_splinter_treantAI(creature); } }; @@ -169,7 +169,7 @@ class boss_warp_splinter : public CreatureScript DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } @@ -226,9 +226,9 @@ class boss_warp_splinter : public CreatureScript } }; - CreatureAI* GetAI(Creature* Creature) const + CreatureAI* GetAI(Creature* creature) const { - return new boss_warp_splinterAI (Creature); + return new boss_warp_splinterAI(creature); } }; diff --git a/src/server/scripts/Outland/blades_edge_mountains.cpp b/src/server/scripts/Outland/blades_edge_mountains.cpp index f99851f013e..4ec1d04b6ad 100644 --- a/src/server/scripts/Outland/blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/blades_edge_mountains.cpp @@ -61,7 +61,7 @@ public: struct mobs_bladespire_ogreAI : public ScriptedAI { - mobs_bladespire_ogreAI(Creature* c) : ScriptedAI(c) {} + mobs_bladespire_ogreAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { } @@ -73,7 +73,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -113,7 +112,7 @@ public: struct mobs_nether_drakeAI : public ScriptedAI { - mobs_nether_drakeAI(Creature* c) : ScriptedAI(c) {} + mobs_nether_drakeAI(Creature* creature) : ScriptedAI(creature) {} bool IsNihil; uint32 NihilSpeech_Timer; @@ -253,7 +252,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -278,7 +276,7 @@ public: struct npc_daranelleAI : public ScriptedAI { - npc_daranelleAI(Creature* c) : ScriptedAI(c) {} + npc_daranelleAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { } @@ -299,7 +297,6 @@ public: ScriptedAI::MoveInLineOfSight(who); } }; - }; /*###### @@ -313,10 +310,10 @@ class npc_overseer_nuaar : public CreatureScript public: npc_overseer_nuaar() : CreatureScript("npc_overseer_nuaar") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->SEND_GOSSIP_MENU(10533, creature->GetGUID()); player->AreaExploredOrEventHappens(10682); @@ -333,7 +330,6 @@ public: return true; } - }; /*###### @@ -348,10 +344,10 @@ class npc_saikkal_the_elder : public CreatureScript public: npc_saikkal_the_elder() : CreatureScript("npc_saikkal_the_elder") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_STE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -374,7 +370,6 @@ public: return true; } - }; /*###### @@ -423,7 +418,6 @@ public: return true; } - }; /*###### @@ -469,7 +463,6 @@ public: void UpdateAI(const uint32 /*uiDiff*/) {} }; - }; /*###### @@ -499,7 +492,8 @@ public: void MoveInLineOfSight(Unit* who) { - if (!who || (!who->isAlive())) return; + if (!who || (!who->isAlive())) + return; if (me->IsWithinDistInMap(who, 50.0f)) { @@ -523,7 +517,7 @@ public: me->GetMotionMaster()->MoveTargetedHome(); Creature* Credit = me->FindNearestCreature(NPC_QUEST_CREDIT, 50, true); if (player && Credit) - player->KilledMonster(Credit->GetCreatureInfo(), Credit->GetGUID()); + player->KilledMonster(Credit->GetCreatureTemplate(), Credit->GetGUID()); } } @@ -534,7 +528,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -759,7 +752,7 @@ class npc_simon_bunny : public CreatureScript // Used for getting involved player guid. Parameter id is used for defining if is a large(Monument) or small(Relic) node void SetGUID(uint64 guid, int32 id) { - me->SetFlying(true); + me->SetCanFly(true); large = (bool)id; playerGUID = guid; @@ -781,7 +774,7 @@ class npc_simon_bunny : public CreatureScript colorSequence.clear(); playableSequence.clear(); playerSequence.clear(); - me->SetFloatValue(OBJECT_FIELD_SCALE_X, large ? 2 : 1); + me->SetObjectScale(large ? 2.0f : 1.0f); std::list ClusterList; Trinity::AllWorldObjectsInRange objects(me, searchDistance); @@ -797,20 +790,42 @@ class npc_simon_bunny : public CreatureScript { switch (go->GetGOInfo()->displayId) { - case GO_BLUE_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_BLUE] = go->GetEntry(); break; - case GO_RED_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_RED] = go->GetEntry(); break; - case GO_GREEN_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_GREEN] = go->GetEntry(); break; - case GO_YELLOW_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_YELLOW] = go->GetEntry(); break; + case GO_BLUE_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_BLUE] = go->GetEntry(); + break; + + case GO_RED_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_RED] = go->GetEntry(); + break; + + case GO_GREEN_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_GREEN] = go->GetEntry(); + break; + + case GO_YELLOW_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_YELLOW] = go->GetEntry(); + break; } } else { switch (go->GetGOInfo()->displayId) { - case GO_BLUE_CLUSTER_DISPLAY: clusterIds[SIMON_BLUE] = go->GetEntry(); break; - case GO_RED_CLUSTER_DISPLAY: clusterIds[SIMON_RED] = go->GetEntry(); break; - case GO_GREEN_CLUSTER_DISPLAY: clusterIds[SIMON_GREEN] = go->GetEntry(); break; - case GO_YELLOW_CLUSTER_DISPLAY: clusterIds[SIMON_YELLOW] = go->GetEntry(); break; + case GO_BLUE_CLUSTER_DISPLAY: + clusterIds[SIMON_BLUE] = go->GetEntry(); + break; + + case GO_RED_CLUSTER_DISPLAY: + clusterIds[SIMON_RED] = go->GetEntry(); + break; + + case GO_GREEN_CLUSTER_DISPLAY: + clusterIds[SIMON_GREEN] = go->GetEntry(); + break; + + case GO_YELLOW_CLUSTER_DISPLAY: + clusterIds[SIMON_YELLOW] = go->GetEntry(); + break; } } } @@ -840,7 +855,7 @@ class npc_simon_bunny : public CreatureScript if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) relic->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - me->ForcedDespawn(1000); + me->DespawnOrUnsummon(1000); } /* diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp index 2f6e0823da1..a213713ae1a 100644 --- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp +++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp @@ -18,7 +18,7 @@ #include "ScriptPCH.h" -enum Yells +enum Texts { SAY_INTRO = 0, SAY_AGGRO = 1, @@ -31,15 +31,15 @@ enum Yells enum Spells { - SPELL_SHADOWVOLLEY = 32963, + SPELL_SHADOW_VOLLEY = 32963, SPELL_CLEAVE = 31779, SPELL_THUNDERCLAP = 36706, - SPELL_VOIDBOLT = 39329, - SPELL_MARKOFKAZZAK = 32960, - SPELL_MARKOFKAZZAK_DAMAGE = 32961, + SPELL_VOID_BOLT = 39329, + SPELL_MARK_OF_KAZZAK = 32960, SPELL_ENRAGE = 32964, - SPELL_CAPTURESOUL = 32966, - SPELL_TWISTEDREFLECTION = 21063 + SPELL_CAPTURE_SOUL = 32966, + SPELL_TWISTED_REFLECTION = 21063, + SPELL_BERSERK = 32965, }; enum Events @@ -47,10 +47,11 @@ enum Events EVENT_SHADOW_VOLLEY = 1, EVENT_CLEAVE = 2, EVENT_THUNDERCLAP = 3, - EVENT_VOIDBOLT = 4, + EVENT_VOID_BOLT = 4, EVENT_MARK_OF_KAZZAK = 5, EVENT_ENRAGE = 6, - EVENT_TWISTED_REFLECTION = 7 + EVENT_TWISTED_REFLECTION = 7, + EVENT_BERSERK = 8 }; class boss_doomlord_kazzak : public CreatureScript @@ -70,10 +71,11 @@ class boss_doomlord_kazzak : public CreatureScript _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000)); _events.ScheduleEvent(EVENT_CLEAVE, 7000); _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000)); - _events.ScheduleEvent(EVENT_VOIDBOLT, 30000); + _events.ScheduleEvent(EVENT_VOID_BOLT, 30000); _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000); _events.ScheduleEvent(EVENT_ENRAGE, 60000); _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000); + _events.ScheduleEvent(EVENT_BERSERK, 180000); } void JustRespawned() @@ -92,12 +94,12 @@ class boss_doomlord_kazzak : public CreatureScript if (victim->GetTypeId() != TYPEID_PLAYER) return; - DoCast(me, SPELL_CAPTURESOUL); + DoCast(me, SPELL_CAPTURE_SOUL); Talk(SAY_KILL); } - void JustDied(Unit* /*victim*/) + void JustDied(Unit* /*killer*/) { Talk(SAY_DEATH); } @@ -118,7 +120,7 @@ class boss_doomlord_kazzak : public CreatureScript switch (eventId) { case EVENT_SHADOW_VOLLEY: - DoCastVictim(SPELL_SHADOWVOLLEY); + DoCastVictim(SPELL_SHADOW_VOLLEY); _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000)); break; case EVENT_CLEAVE: @@ -129,13 +131,13 @@ class boss_doomlord_kazzak : public CreatureScript DoCastVictim(SPELL_THUNDERCLAP); _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000)); break; - case EVENT_VOIDBOLT: - DoCastVictim(SPELL_VOIDBOLT); - _events.ScheduleEvent(EVENT_VOIDBOLT, urand(15000, 18000)); + case EVENT_VOID_BOLT: + DoCastVictim(SPELL_VOID_BOLT); + _events.ScheduleEvent(EVENT_VOID_BOLT, urand(15000, 18000)); break; case EVENT_MARK_OF_KAZZAK: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - DoCast(target, SPELL_MARKOFKAZZAK); + DoCast(target, SPELL_MARK_OF_KAZZAK); _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000); break; case EVENT_ENRAGE: @@ -145,9 +147,12 @@ class boss_doomlord_kazzak : public CreatureScript break; case EVENT_TWISTED_REFLECTION: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - DoCast(target, SPELL_TWISTEDREFLECTION); + DoCast(target, SPELL_TWISTED_REFLECTION); _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000); break; + case EVENT_BERSERK: + DoCast(me, SPELL_BERSERK); + break; default: break; } diff --git a/src/server/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp index c4bd232cc85..67834601d6f 100644 --- a/src/server/scripts/Outland/boss_doomwalker.cpp +++ b/src/server/scripts/Outland/boss_doomwalker.cpp @@ -18,7 +18,7 @@ #include "ScriptPCH.h" -enum Yells +enum Texts { SAY_AGGRO = 0, SAY_EARTHQUAKE = 1, @@ -79,7 +79,7 @@ class boss_doomwalker : public CreatureScript Talk(SAY_SLAY); } - void JustDied(Unit* /*Killer*/) + void JustDied(Unit* /*killer*/) { Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/hellfire_peninsula.cpp b/src/server/scripts/Outland/hellfire_peninsula.cpp index 7d4de409b8b..b0e19f0e322 100644 --- a/src/server/scripts/Outland/hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/hellfire_peninsula.cpp @@ -66,7 +66,7 @@ public: struct npc_aeranasAI : public ScriptedAI { - npc_aeranasAI(Creature* c) : ScriptedAI(c) {} + npc_aeranasAI(Creature* creature) : ScriptedAI(creature) {} uint32 Faction_Timer; uint32 EnvelopingWinds_Timer; @@ -124,7 +124,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -181,9 +180,9 @@ public: npc_escortAI::MoveInLineOfSight(who); } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 0: DoScriptText(EMOTE_WOLF_LIFT_HEAD, me); @@ -198,7 +197,6 @@ public: } } }; - }; /*###### @@ -215,7 +213,6 @@ public: go->SummonCreature(C_AERANAS, -1321.79f, 4043.80f, 116.24f, 1.25f, TEMPSUMMON_TIMED_DESPAWN, 180000); return false; } - }; /*###### @@ -234,10 +231,10 @@ class npc_naladu : public CreatureScript public: npc_naladu() : CreatureScript("npc_naladu") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_NALADU1, creature->GetGUID()); return true; @@ -252,7 +249,6 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -274,10 +270,10 @@ class npc_tracy_proudwell : public CreatureScript public: npc_tracy_proudwell() : CreatureScript("npc_tracy_proudwell") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TRACY_PROUDWELL_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); @@ -308,7 +304,6 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -331,10 +326,10 @@ class npc_trollbane : public CreatureScript public: npc_trollbane() : CreatureScript("npc_trollbane") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TROLLBANE_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); @@ -361,7 +356,6 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*###### @@ -406,40 +400,39 @@ public: struct npc_wounded_blood_elfAI : public npc_escortAI { - npc_wounded_blood_elfAI(Creature* c) : npc_escortAI(c) {} + npc_wounded_blood_elfAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 0: - DoScriptText(SAY_ELF_START, me, player); - break; - case 9: - DoScriptText(SAY_ELF_SUMMON1, me, player); - // Spawn two Haal'eshi Talonguard - DoSpawnCreature(16967, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - DoSpawnCreature(16967, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - break; - case 13: - DoScriptText(SAY_ELF_RESTING, me, player); - break; - case 14: - DoScriptText(SAY_ELF_SUMMON2, me, player); - // Spawn two Haal'eshi Windwalker - DoSpawnCreature(16966, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - DoSpawnCreature(16966, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - break; - case 27: - DoScriptText(SAY_ELF_COMPLETE, me, player); - // Award quest credit - player->GroupEventHappens(QUEST_ROAD_TO_FALCON_WATCH, me); - break; + case 0: + DoScriptText(SAY_ELF_START, me, player); + break; + case 9: + DoScriptText(SAY_ELF_SUMMON1, me, player); + // Spawn two Haal'eshi Talonguard + DoSpawnCreature(16967, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + DoSpawnCreature(16967, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + break; + case 13: + DoScriptText(SAY_ELF_RESTING, me, player); + break; + case 14: + DoScriptText(SAY_ELF_SUMMON2, me, player); + // Spawn two Haal'eshi Windwalker + DoSpawnCreature(16966, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + DoSpawnCreature(16966, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + break; + case 27: + DoScriptText(SAY_ELF_COMPLETE, me, player); + // Award quest credit + player->GroupEventHappens(QUEST_ROAD_TO_FALCON_WATCH, me); + break; } } @@ -456,7 +449,6 @@ public: summoned->AI()->AttackStart(me); } }; - }; /*###### @@ -529,7 +521,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void AddSC_hellfire_peninsula() diff --git a/src/server/scripts/Outland/nagrand.cpp b/src/server/scripts/Outland/nagrand.cpp index 668db2efcbb..871a2f200bb 100644 --- a/src/server/scripts/Outland/nagrand.cpp +++ b/src/server/scripts/Outland/nagrand.cpp @@ -57,10 +57,10 @@ class npc_greatmother_geyah : public CreatureScript public: npc_greatmother_geyah() : CreatureScript("npc_greatmother_geyah") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); @@ -90,7 +90,6 @@ public: player->AreaExploredOrEventHappens(10044); player->CLOSE_GOSSIP_MENU(); break; - case GOSSIP_ACTION_INFO_DEF + 10: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -135,12 +134,10 @@ public: player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); } else - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } - }; /*##### @@ -224,9 +221,9 @@ public: DoCast(me, SPELL_EARTHBIND_TOTEM, false); } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { - switch (uiPointId) + switch (waypointId) { case 7: DoScriptText(SAY_MAG_MORE, me); @@ -235,7 +232,6 @@ public: DoScriptText(SAY_MAG_MORE_REPLY, temp); me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0]-2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]+2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); break; @@ -258,7 +254,7 @@ public: if (summoned->isTotem()) return; - summoned->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + summoned->SetWalk(false); summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); summoned->AI()->AttackStart(me); @@ -311,7 +307,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -330,7 +325,7 @@ public: struct npc_creditmarker_visit_with_ancestorsAI : public ScriptedAI { - npc_creditmarker_visit_with_ancestorsAI(Creature* c) : ScriptedAI(c) {} + npc_creditmarker_visit_with_ancestorsAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} @@ -356,7 +351,6 @@ public: } } }; - }; /*###### @@ -401,6 +395,7 @@ public: player->KilledMonsterCredit(NPC_CORKI_CREDIT_1, 0); } } + if (go->GetEntry() == GO_CORKIS_PRISON_2) { if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true)) @@ -411,6 +406,7 @@ public: player->KilledMonsterCredit(NPC_CORKI_2, 0); } } + if (go->GetEntry() == GO_CORKIS_PRISON_3) { if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true)) @@ -444,18 +440,22 @@ public: void Reset() { + Say_Timer = 5000; ReleasedFromCage = false; } void UpdateAI(uint32 const diff) { - if (Say_Timer <= diff && ReleasedFromCage) + if (ReleasedFromCage) { - me->ForcedDespawn(); - ReleasedFromCage = false; + if (Say_Timer <= diff) + { + me->DespawnOrUnsummon(); + ReleasedFromCage = false; + } + else + Say_Timer -= diff; } - else - Say_Timer -= diff; } void MovementInform(uint32 type, uint32 id) @@ -565,9 +565,9 @@ public: } } - void WaypointReached(uint32 PointId) + void WaypointReached(uint32 waypointId) { - switch(PointId) + switch (waypointId) { case 3: { @@ -603,7 +603,7 @@ public: if (summoned->isTotem()) return; - summoned->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + summoned->SetWalk(false); summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); summoned->AI()->AttackStart(me); } @@ -685,15 +685,11 @@ class go_warmaul_prison : public GameObjectScript if (Creature* prisoner = go->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f)) { - if (prisoner) - { - go->UseDoorOrButton(); - if (player) - player->KilledMonsterCredit(NPC_MAGHAR_PRISONER, 0); + go->UseDoorOrButton(); + player->KilledMonsterCredit(NPC_MAGHAR_PRISONER, 0); - prisoner->AI()->Talk(SAY_FREE, player->GetGUID()); - prisoner->ForcedDespawn(6000); - } + prisoner->AI()->Talk(SAY_FREE, player->GetGUID()); + prisoner->DespawnOrUnsummon(6000); } return true; } diff --git a/src/server/scripts/Outland/netherstorm.cpp b/src/server/scripts/Outland/netherstorm.cpp index 79811069402..afc18c71b92 100644 --- a/src/server/scripts/Outland/netherstorm.cpp +++ b/src/server/scripts/Outland/netherstorm.cpp @@ -78,7 +78,7 @@ public: struct npc_manaforge_control_consoleAI : public ScriptedAI { - npc_manaforge_control_consoleAI(Creature* c) : ScriptedAI(c) {} + npc_manaforge_control_consoleAI(Creature* creature) : ScriptedAI(creature) {} uint32 Event_Timer; uint32 Wave_Timer; @@ -115,7 +115,7 @@ public: if (someplayer) { - Unit* p = Unit::GetUnit((*me), someplayer); + Unit* p = Unit::GetUnit(*me, someplayer); if (p && p->GetTypeId() == TYPEID_PLAYER) { switch (me->GetEntry()) @@ -142,7 +142,7 @@ public: if (goConsole) { - if (GameObject* go = GameObject::GetGameObject((*me), goConsole)) + if (GameObject* go = GameObject::GetGameObject(*me, goConsole)) go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); } } @@ -243,7 +243,7 @@ public: case 1: if (someplayer) { - Unit* u = Unit::GetUnit((*me), someplayer); + Unit* u = Unit::GetUnit(*me, someplayer); if (u && u->GetTypeId() == TYPEID_PLAYER) DoScriptText(EMOTE_START, me, u); } Event_Timer = 60000; @@ -271,14 +271,14 @@ public: DoScriptText(EMOTE_COMPLETE, me); if (someplayer) { - Unit* u = Unit::GetUnit((*me), someplayer); + Unit* u = Unit::GetUnit(*me, someplayer); if (u && u->GetTypeId() == TYPEID_PLAYER) CAST_PLR(u)->KilledMonsterCredit(me->GetEntry(), me->GetGUID()); DoCast(me, SPELL_DISABLE_VISUAL); } if (goConsole) { - if (GameObject* go = GameObject::GetGameObject((*me), goConsole)) + if (GameObject* go = GameObject::GetGameObject(*me, goConsole)) go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); } ++Phase; @@ -295,7 +295,6 @@ public: } } }; - }; /*###### @@ -350,7 +349,6 @@ public: } return true; } - }; /*###### @@ -396,7 +394,7 @@ public: struct npc_commander_dawnforgeAI : public ScriptedAI { - npc_commander_dawnforgeAI(Creature* c) : ScriptedAI(c) { Reset (); } + npc_commander_dawnforgeAI(Creature* creature) : ScriptedAI(creature) { Reset(); } uint64 PlayerGUID; uint64 ardonisGUID; @@ -633,7 +631,6 @@ public: } } }; - }; class at_commander_dawnforge : public AreaTriggerScript @@ -650,7 +647,6 @@ public: if (player->isAlive() && player->GetQuestStatus(QUEST_INFO_GATHERING) == QUEST_STATUS_INCOMPLETE) { Creature* Dawnforge = player->FindNearestCreature(CreatureEntry[1], 30.0f); - if (!Dawnforge) return false; @@ -659,7 +655,6 @@ public: } return false; } - }; /*###### @@ -690,10 +685,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { creature->CastSpell(player, SPELL_PHASE_DISTRUPTOR, false); player->CLOSE_GOSSIP_MENU(); @@ -714,7 +709,6 @@ public: return true; } - }; /*###### @@ -750,7 +744,7 @@ public: struct mob_phase_hunterAI : public ScriptedAI { - mob_phase_hunterAI(Creature* c) : ScriptedAI(c) {} + mob_phase_hunterAI(Creature* creature) : ScriptedAI(creature) {} bool Weak; bool Materialize; @@ -818,7 +812,7 @@ public: } if (!UnitsWithMana.empty()) { - DoCast(SelectRandomContainerElement(UnitsWithMana), SPELL_MANA_BURN); + DoCast(Trinity::Containers::SelectRandomContainerElement(UnitsWithMana), SPELL_MANA_BURN); ManaBurnTimer = 8000 + (rand() % 10 * 1000); // 8-18 sec cd } else @@ -849,7 +843,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -888,8 +881,7 @@ public: struct npc_bessyAI : public npc_escortAI { - - npc_bessyAI(Creature* c) : npc_escortAI(c) {} + npc_bessyAI(Creature* creature) : npc_escortAI(creature) {} void JustDied(Unit* /*killer*/) { @@ -897,34 +889,32 @@ public: player->FailQuest(Q_ALMABTRIEB); } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { case 3: //first spawn me->SummonCreature(SPAWN_FIRST, 2449.67f, 2183.11f, 96.85f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(SPAWN_FIRST, 2449.53f, 2184.43f, 96.36f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(SPAWN_FIRST, 2449.85f, 2186.34f, 97.57f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); break; - case 7: me->SummonCreature(SPAWN_SECOND, 2309.64f, 2186.24f, 92.25f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(SPAWN_SECOND, 2309.25f, 2183.46f, 91.75f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); break; - case 12: - if (player) - player->GroupEventHappens(Q_ALMABTRIEB, me); + player->GroupEventHappens(Q_ALMABTRIEB, me); if (me->FindNearestCreature(N_THADELL, 30)) - DoScriptText(SAY_THADELL_1, me); break; + DoScriptText(SAY_THADELL_1, me); + break; case 13: if (me->FindNearestCreature(N_THADELL, 30)) - DoScriptText(SAY_THADELL_2, me, player); break; + DoScriptText(SAY_THADELL_2, me, player); + break; } } @@ -937,9 +927,7 @@ public: { me->RestoreFaction(); } - }; - }; /*###### @@ -975,13 +963,13 @@ public: uiTakeTimer=3000; } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); if (!player) return; - switch (i) + switch (waypointId) { case 7: case 17: @@ -996,16 +984,14 @@ public: } break; case 36: //return and quest_complete - if (player) - player->CompleteQuest(QUEST_MARK_V_IS_ALIVE); + player->CompleteQuest(QUEST_MARK_V_IS_ALIVE); break; } } void JustDied(Unit* /*killer*/) { - Player* player = GetPlayerForEscort(); - if (player) + if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_MARK_V_IS_ALIVE); } @@ -1018,12 +1004,12 @@ public: if (uiTakeTimer < uiDiff) { me->HandleEmoteCommand(EMOTE_STATE_NONE); - if (GameObject* pGO = GetClosestGameObjectWithEntry(me, GO_DRAENEI_MACHINE, INTERACTION_DISTANCE)) + if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_DRAENEI_MACHINE, INTERACTION_DISTANCE)) { SetEscortPaused(false); bTake=false; uiTakeTimer = 3000; - pGO->Delete(); + go->Delete(); } } else @@ -1071,7 +1057,7 @@ class go_captain_tyralius_prison : public GameObjectScript player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS, 0); tyralius->AI()->Talk(SAY_FREE); - tyralius->ForcedDespawn(8000); + tyralius->DespawnOrUnsummon(8000); } return true; } diff --git a/src/server/scripts/Outland/shadowmoon_valley.cpp b/src/server/scripts/Outland/shadowmoon_valley.cpp index 19c4754c4fd..340049ba4fa 100644 --- a/src/server/scripts/Outland/shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/shadowmoon_valley.cpp @@ -75,7 +75,7 @@ public: struct mob_mature_netherwing_drakeAI : public ScriptedAI { - mob_mature_netherwing_drakeAI(Creature* c) : ScriptedAI(c) { } + mob_mature_netherwing_drakeAI(Creature* creature) : ScriptedAI(creature) { } uint64 uiPlayerGUID; @@ -96,12 +96,12 @@ public: CastTimer = 5000; } - void SpellHit(Unit* pCaster, SpellInfo const* pSpell) + void SpellHit(Unit* pCaster, SpellInfo const* spell) { if (bCanEat || bIsEating) return; - if (pCaster->GetTypeId() == TYPEID_PLAYER && pSpell->Id == SPELL_PLACE_CARCASS && !me->HasAura(SPELL_JUST_EATEN)) + if (pCaster->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_PLACE_CARCASS && !me->HasAura(SPELL_JUST_EATEN)) { uiPlayerGUID = pCaster->GetGUID(); bCanEat = true; @@ -179,7 +179,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*### @@ -207,7 +206,7 @@ public: struct mob_enslaved_netherwing_drakeAI : public ScriptedAI { - mob_enslaved_netherwing_drakeAI(Creature* c) : ScriptedAI(c) + mob_enslaved_netherwing_drakeAI(Creature* creature) : ScriptedAI(creature) { PlayerGUID = 0; Tapped = false; @@ -224,7 +223,7 @@ public: me->setFaction(FACTION_DEFAULT); FlyTimer = 10000; - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->SetVisible(true); } @@ -242,7 +241,6 @@ public: DoCast(caster, SPELL_FORCE_OF_NELTHARAKU, true); Unit* Dragonmaw = me->FindNearestCreature(CREATURE_DRAGONMAW_SUBJUGATOR, 50); - if (Dragonmaw) { me->AddThreat(Dragonmaw, 100000.0f); @@ -264,14 +262,14 @@ public: { if (PlayerGUID) { - Unit* player = Unit::GetUnit((*me), PlayerGUID); + Unit* player = Unit::GetUnit(*me, PlayerGUID); if (player) DoCast(player, SPELL_FORCE_OF_NELTHARAKU, true); PlayerGUID = 0; } me->SetVisible(false); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(false); me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); me->RemoveCorpse(); } @@ -309,7 +307,7 @@ public: pos.m_positionZ += 25; } - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->GetMotionMaster()->MovePoint(1, pos); } } @@ -321,7 +319,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*##### @@ -340,7 +337,7 @@ public: struct mob_dragonmaw_peonAI : public ScriptedAI { - mob_dragonmaw_peonAI(Creature* c) : ScriptedAI(c) {} + mob_dragonmaw_peonAI(Creature* creature) : ScriptedAI(creature) {} uint64 PlayerGUID; bool Tapped; @@ -366,7 +363,7 @@ public: float x, y, z; caster->GetClosePoint(x, y, z, me->GetObjectSize()); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); me->GetMotionMaster()->MovePoint(1, x, y, z); } } @@ -401,7 +398,6 @@ public: } } }; - }; /*###### @@ -413,10 +409,10 @@ class npc_drake_dealer_hurlunk : public CreatureScript public: npc_drake_dealer_hurlunk() : CreatureScript("npc_drake_dealer_hurlunk") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -431,7 +427,6 @@ public: return true; } - }; /*###### @@ -446,10 +441,10 @@ class npcs_flanis_swiftwing_and_kagrosh : public CreatureScript public: npcs_flanis_swiftwing_and_kagrosh() : CreatureScript("npcs_flanis_swiftwing_and_kagrosh") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30658, 1, NULL); @@ -459,7 +454,7 @@ public: player->PlayerTalkClass->ClearMenus(); } } - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF+2) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30659, 1, NULL); @@ -483,7 +478,6 @@ public: return true; } - }; /*###### @@ -504,10 +498,10 @@ class npc_murkblood_overseer : public CreatureScript public: npc_murkblood_overseer() : CreatureScript("npc_murkblood_overseer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -552,7 +546,6 @@ public: player->SEND_GOSSIP_MENU(10940, creature->GetGUID()); return true; } - }; /*###### @@ -572,10 +565,10 @@ class npc_oronok_tornheart : public CreatureScript public: npc_oronok_tornheart() : CreatureScript("npc_oronok_tornheart") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); @@ -628,7 +621,6 @@ public: return true; } - }; /*#### @@ -721,7 +713,7 @@ public: struct npc_overlord_morghorAI : public ScriptedAI { - npc_overlord_morghorAI(Creature* c) : ScriptedAI(c) {} + npc_overlord_morghorAI(Creature* creature) : ScriptedAI(creature) {} uint64 PlayerGUID; uint64 IllidanGUID; @@ -766,9 +758,8 @@ public: uint32 NextStep(uint32 Step) { - Unit* player = Unit::GetUnit((*me), PlayerGUID); - - Unit* Illi = Unit::GetUnit((*me), IllidanGUID); + Player* player = Unit::GetPlayer(*me, PlayerGUID); + Unit* Illi = Unit::GetUnit(*me, IllidanGUID); if (!player || !Illi) { @@ -778,95 +769,178 @@ public: switch (Step) { - case 0: return 0; break; - case 1: me->GetMotionMaster()->MovePoint(0, -5104.41f, 595.297f, 85.6838f); return 9000; break; - case 2: DoScriptText(OVERLORD_YELL_1, me, player); return 4500; break; - case 3: me->SetInFront(player); return 3200; break; - case 4: DoScriptText(OVERLORD_SAY_2, me, player); return 2000; break; - case 5: Illi->SetVisible(true); - Illi->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); return 350; break; - case 6: - Illi->CastSpell(Illi, SPELL_ONE, true); - Illi->SetTarget(me->GetGUID()); - me->SetTarget(IllidanGUID); - return 2000; break; - case 7: DoScriptText(OVERLORD_YELL_2, me); return 4500; break; - case 8: me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8); return 2500; break; - case 9: DoScriptText(OVERLORD_SAY_3, me); return 6500; break; - case 10: DoScriptText(LORD_ILLIDAN_SAY_1, Illi); return 5000; break; - case 11: DoScriptText(OVERLORD_SAY_4, me, player); return 6000; break; - case 12: DoScriptText(LORD_ILLIDAN_SAY_2, Illi); return 5500; break; - case 13: DoScriptText(LORD_ILLIDAN_SAY_3, Illi); return 4000; break; - case 14: Illi->SetTarget(PlayerGUID); return 1500; break; - case 15: DoScriptText(LORD_ILLIDAN_SAY_4, Illi); return 1500; break; - case 16: - if (player) - { - Illi->CastSpell(player, SPELL_TWO, true); - player->RemoveAurasDueToSpell(SPELL_THREE); - player->RemoveAurasDueToSpell(SPELL_FOUR); + case 0: + return 0; + break; + case 1: + me->GetMotionMaster()->MovePoint(0, -5104.41f, 595.297f, 85.6838f); + return 9000; + break; + case 2: + DoScriptText(OVERLORD_YELL_1, me, player); + return 4500; + break; + case 3: + me->SetInFront(player); + return 3200; + break; + case 4: + DoScriptText(OVERLORD_SAY_2, me, player); + return 2000; + break; + case 5: + Illi->SetVisible(true); + Illi->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + return 350; + break; + case 6: + Illi->CastSpell(Illi, SPELL_ONE, true); + Illi->SetTarget(me->GetGUID()); + me->SetTarget(IllidanGUID); + return 2000; + break; + case 7: + DoScriptText(OVERLORD_YELL_2, me); + return 4500; + break; + case 8: + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8); + return 2500; + break; + case 9: + DoScriptText(OVERLORD_SAY_3, me); + return 6500; + break; + case 10: + DoScriptText(LORD_ILLIDAN_SAY_1, Illi); return 5000; - }else{ - CAST_PLR(player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); Step = 30; return 100; - } - break; - case 17: DoScriptText(LORD_ILLIDAN_SAY_5, Illi); return 5000; break; - case 18: DoScriptText(LORD_ILLIDAN_SAY_6, Illi); return 5000; break; - case 19: DoScriptText(LORD_ILLIDAN_SAY_7, Illi); return 5000; break; - case 20: - Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - Illi->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - return 500; break; - case 21: DoScriptText(OVERLORD_SAY_5, me); return 500; break; - case 22: - Illi->SetVisible(false); - Illi->setDeathState(JUST_DIED); - return 1000; break; - case 23: me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); return 2000; break; - case 24: me->SetTarget(PlayerGUID); return 5000; break; - case 25: DoScriptText(OVERLORD_SAY_6, me); return 2000; break; - case 26: - if (player) - CAST_PLR(player)->GroupEventHappens(QUEST_LORD_ILLIDAN_STORMRAGE, me); - return 6000; break; - case 27: - { - Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); - if (Yarzill) - Yarzill->SetTarget(PlayerGUID); - return 500; } - break; - case 28: - player->RemoveAurasDueToSpell(SPELL_TWO); - player->RemoveAurasDueToSpell(41519); - player->CastSpell(player, SPELL_THREE, true); - player->CastSpell(player, SPELL_FOUR, true); - return 1000; break; - case 29: - { - Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); - if (Yarzill) - DoScriptText(YARZILL_THE_MERC_SAY, Yarzill, player); - return 5000; } - break; - case 30: - { - Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); - if (Yarzill) - Yarzill->SetTarget(0); - return 5000; } - break; - case 31: - { - Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); - if (Yarzill) - Yarzill->CastSpell(player, 41540, true); - return 1000;} - break; - case 32: me->GetMotionMaster()->MovePoint(0, -5085.77f, 577.231f, 86.6719f); return 5000; break; - case 33: Reset(); return 100; break; - - default : return 0; + break; + case 11: + DoScriptText(OVERLORD_SAY_4, me, player); + return 6000; + break; + case 12: + DoScriptText(LORD_ILLIDAN_SAY_2, Illi); + return 5500; + break; + case 13: + DoScriptText(LORD_ILLIDAN_SAY_3, Illi); + return 4000; + break; + case 14: + Illi->SetTarget(PlayerGUID); + return 1500; + break; + case 15: + DoScriptText(LORD_ILLIDAN_SAY_4, Illi); + return 1500; + break; + case 16: + if (player) + { + Illi->CastSpell(player, SPELL_TWO, true); + player->RemoveAurasDueToSpell(SPELL_THREE); + player->RemoveAurasDueToSpell(SPELL_FOUR); + return 5000; + } + else + { + player->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); + Step = 30; + return 100; + } + break; + case 17: + DoScriptText(LORD_ILLIDAN_SAY_5, Illi); + return 5000; + break; + case 18: + DoScriptText(LORD_ILLIDAN_SAY_6, Illi); + return 5000; + break; + case 19: + DoScriptText(LORD_ILLIDAN_SAY_7, Illi); + return 5000; + break; + case 20: + Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); + Illi->SetDisableGravity(true); + return 500; + break; + case 21: + DoScriptText(OVERLORD_SAY_5, me); + return 500; + break; + case 22: + Illi->SetVisible(false); + Illi->setDeathState(JUST_DIED); + return 1000; + break; + case 23: + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + return 2000; + break; + case 24: + me->SetTarget(PlayerGUID); + return 5000; + break; + case 25: + DoScriptText(OVERLORD_SAY_6, me); + return 2000; + break; + case 26: + player->GroupEventHappens(QUEST_LORD_ILLIDAN_STORMRAGE, me); + return 6000; + break; + case 27: + { + Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); + if (Yarzill) + Yarzill->SetTarget(PlayerGUID); + return 500; + } + break; + case 28: + player->RemoveAurasDueToSpell(SPELL_TWO); + player->RemoveAurasDueToSpell(41519); + player->CastSpell(player, SPELL_THREE, true); + player->CastSpell(player, SPELL_FOUR, true); + return 1000; + break; + case 29: + { + Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); + if (Yarzill) + DoScriptText(YARZILL_THE_MERC_SAY, Yarzill, player); + return 5000; + } + break; + case 30: + { + Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); + if (Yarzill) + Yarzill->SetTarget(0); + return 5000; + } + break; + case 31: + { + Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50); + if (Yarzill) + Yarzill->CastSpell(player, 41540, true); + return 1000; + } + break; + case 32: + me->GetMotionMaster()->MovePoint(0, -5085.77f, 577.231f, 86.6719f); return 5000; + break; + case 33: + Reset(); + return 100; + break; + default : + return 0; + break; } } @@ -878,13 +952,10 @@ public: if (ConversationTimer <= diff) { if (Event && IllidanGUID && PlayerGUID) - { ConversationTimer = NextStep(++Step); - } } else ConversationTimer -= diff; } }; - }; /*#### @@ -948,14 +1019,13 @@ public: m_uiHealingTimer = 0; } - void WaypointReached(uint32 uiPointId) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (uiPointId) + switch (waypointId) { case 13: DoScriptText(SAY_WIL_PROGRESS1, me, player); @@ -1002,7 +1072,6 @@ public: break; case 50: DoScriptText(SAY_WIL_END, me, player); - player->GroupEventHappens(QUEST_ESCAPE_COILSCAR, me); break; } @@ -1061,7 +1130,6 @@ public: } } }; - }; /*##### @@ -1176,7 +1244,7 @@ public: struct mob_torloth_the_magnificentAI : public ScriptedAI { - mob_torloth_the_magnificentAI(Creature* c) : ScriptedAI(c) {} + mob_torloth_the_magnificentAI(Creature* creature) : ScriptedAI(creature) {} uint32 AnimationTimer, SpellTimer1, SpellTimer2, SpellTimer3; @@ -1265,7 +1333,6 @@ public: me->CombatStop(); } else if (!Timers) { - SpellTimer1 = SpawnCast[6].Timer1; SpellTimer2 = SpawnCast[7].Timer1; SpellTimer3 = SpawnCast[8].Timer1; @@ -1296,32 +1363,29 @@ public: DoMeleeAttackIfReady(); } - void JustDied(Unit* slayer) + void JustDied(Unit* killer) { - if (slayer) - switch (slayer->GetTypeId()) - { - case TYPEID_UNIT: - if (Unit* owner = slayer->GetOwner()) - if (owner->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(owner)->GroupEventHappens(QUEST_BATTLE_OF_THE_CRIMSON_WATCH, me); - break; - - case TYPEID_PLAYER: - CAST_PLR(slayer)->GroupEventHappens(QUEST_BATTLE_OF_THE_CRIMSON_WATCH, me); - break; - default: - break; - } + switch (killer->GetTypeId()) + { + case TYPEID_UNIT: + if (Unit* owner = killer->GetOwner()) + if (owner->GetTypeId() == TYPEID_PLAYER) + CAST_PLR(owner)->GroupEventHappens(QUEST_BATTLE_OF_THE_CRIMSON_WATCH, me); + break; + case TYPEID_PLAYER: + CAST_PLR(killer)->GroupEventHappens(QUEST_BATTLE_OF_THE_CRIMSON_WATCH, me); + break; + default: + break; + } if (Creature* LordIllidan = (Unit::GetCreature(*me, LordIllidanGUID))) { - DoScriptText(END_TEXT, LordIllidan, slayer); + DoScriptText(END_TEXT, LordIllidan, killer); LordIllidan->AI()->EnterEvadeMode(); } } }; - }; /*##### @@ -1340,7 +1404,7 @@ public: struct npc_lord_illidan_stormrageAI : public ScriptedAI { - npc_lord_illidan_stormrageAI(Creature* c) : ScriptedAI(c) {} + npc_lord_illidan_stormrageAI(Creature* creature) : ScriptedAI(creature) {} uint64 PlayerGUID; @@ -1467,7 +1531,6 @@ public: EnterEvadeMode(); } }; - }; /*###### @@ -1486,7 +1549,7 @@ public: struct mob_illidari_spawnAI : public ScriptedAI { - mob_illidari_spawnAI(Creature* c) : ScriptedAI(c) {} + mob_illidari_spawnAI(Creature* creature) : ScriptedAI(creature) {} uint64 LordIllidanGUID; uint32 SpellTimer1, SpellTimer2, SpellTimer3; @@ -1499,7 +1562,8 @@ public: } void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* /*slayer*/) + + void JustDied(Unit* /*killer*/) { me->RemoveCorpse(); if (Creature* LordIllidan = (Unit::GetCreature(*me, LordIllidanGUID))) @@ -1586,7 +1650,6 @@ public: DoMeleeAttackIfReady(); } }; - }; void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave() @@ -1680,7 +1743,6 @@ public: } return true; } - }; /*#### @@ -1739,9 +1801,9 @@ public: struct npc_enraged_spiritAI : public ScriptedAI { - npc_enraged_spiritAI(Creature* c) : ScriptedAI(c) {} + npc_enraged_spiritAI(Creature* creature) : ScriptedAI(creature) {} - void Reset() { } + void Reset() { } void EnterCombat(Unit* /*who*/){} @@ -1753,7 +1815,8 @@ public: uint32 entry = 0; uint32 credit = 0; - switch (me->GetEntry()) { + switch (me->GetEntry()) + { case ENTRY_ENRAGED_FIRE_SPIRIT: entry = ENTRY_FIERY_SOUL; //credit = SPELL_FIERY_SOUL_CAPTURED_CREDIT; @@ -1801,7 +1864,6 @@ public: } } }; - }; /*##### diff --git a/src/server/scripts/Outland/shattrath_city.cpp b/src/server/scripts/Outland/shattrath_city.cpp index ed68f55aeb5..79cce47e16c 100644 --- a/src/server/scripts/Outland/shattrath_city.cpp +++ b/src/server/scripts/Outland/shattrath_city.cpp @@ -55,10 +55,10 @@ class npc_raliq_the_drunk : public CreatureScript public: npc_raliq_the_drunk() : CreatureScript("npc_raliq_the_drunk") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->setFaction(FACTION_HOSTILE_RD); @@ -83,9 +83,9 @@ public: struct npc_raliq_the_drunkAI : public ScriptedAI { - npc_raliq_the_drunkAI(Creature* c) : ScriptedAI(c) + npc_raliq_the_drunkAI(Creature* creature) : ScriptedAI(creature) { - m_uiNormFaction = c->getFaction(); + m_uiNormFaction = creature->getFaction(); } uint32 m_uiNormFaction; @@ -111,7 +111,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -152,7 +151,7 @@ public: struct npc_salsalabimAI : public ScriptedAI { - npc_salsalabimAI(Creature* c) : ScriptedAI(c) {} + npc_salsalabimAI(Creature* creature) : ScriptedAI(creature) {} uint32 MagneticPull_Timer; @@ -187,12 +186,11 @@ public: DoMeleeAttackIfReady(); } }; - }; /* ################################################## -Shattrath City Flask Vendors provides flasks to people exalted with 3 factions: +Shattrath City Flask Vendors provides flasks to people exalted with 3 fActions: Haldor the Compulsive Arcanist Xorith Both sell special flasks for use in Outlands 25man raids only, @@ -206,10 +204,10 @@ class npc_shattrathflaskvendors : public CreatureScript public: npc_shattrathflaskvendors() : CreatureScript("npc_shattrathflaskvendors") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -247,7 +245,6 @@ public: return true; } - }; /*###### @@ -261,10 +258,10 @@ class npc_zephyr : public CreatureScript public: npc_zephyr() : CreatureScript("npc_zephyr") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) player->CastSpell(player, 37778, false); return true; @@ -279,7 +276,6 @@ public: return true; } - }; /*###### @@ -321,41 +317,82 @@ public: struct npc_kservantAI : public npc_escortAI { public: - npc_kservantAI(Creature* c) : npc_escortAI(c) {} + npc_kservantAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 0: DoScriptText(SAY1, me, player); break; - case 4: DoScriptText(WHISP1, me, player); break; - case 6: DoScriptText(WHISP2, me, player); break; - case 7: DoScriptText(WHISP3, me, player); break; - case 8: DoScriptText(WHISP4, me, player); break; - case 17: DoScriptText(WHISP5, me, player); break; - case 18: DoScriptText(WHISP6, me, player); break; - case 19: DoScriptText(WHISP7, me, player); break; - case 33: DoScriptText(WHISP8, me, player); break; - case 34: DoScriptText(WHISP9, me, player); break; - case 35: DoScriptText(WHISP10, me, player); break; - case 36: DoScriptText(WHISP11, me, player); break; - case 43: DoScriptText(WHISP12, me, player); break; - case 44: DoScriptText(WHISP13, me, player); break; - case 49: DoScriptText(WHISP14, me, player); break; - case 50: DoScriptText(WHISP15, me, player); break; - case 51: DoScriptText(WHISP16, me, player); break; - case 52: DoScriptText(WHISP17, me, player); break; - case 53: DoScriptText(WHISP18, me, player); break; - case 54: DoScriptText(WHISP19, me, player); break; - case 55: DoScriptText(WHISP20, me, player); break; - case 56: DoScriptText(WHISP21, me, player); - if (player) - player->GroupEventHappens(10211, me); + case 0: + DoScriptText(SAY1, me, player); + break; + case 4: + DoScriptText(WHISP1, me, player); + break; + case 6: + DoScriptText(WHISP2, me, player); + break; + case 7: + DoScriptText(WHISP3, me, player); + break; + case 8: + DoScriptText(WHISP4, me, player); + break; + case 17: + DoScriptText(WHISP5, me, player); + break; + case 18: + DoScriptText(WHISP6, me, player); + break; + case 19: + DoScriptText(WHISP7, me, player); + break; + case 33: + DoScriptText(WHISP8, me, player); + break; + case 34: + DoScriptText(WHISP9, me, player); + break; + case 35: + DoScriptText(WHISP10, me, player); + break; + case 36: + DoScriptText(WHISP11, me, player); + break; + case 43: + DoScriptText(WHISP12, me, player); + break; + case 44: + DoScriptText(WHISP13, me, player); + break; + case 49: + DoScriptText(WHISP14, me, player); + break; + case 50: + DoScriptText(WHISP15, me, player); + break; + case 51: + DoScriptText(WHISP16, me, player); + break; + case 52: + DoScriptText(WHISP17, me, player); + break; + case 53: + DoScriptText(WHISP18, me, player); + break; + case 54: + DoScriptText(WHISP19, me, player); + break; + case 55: + DoScriptText(WHISP20, me, player); + break; + case 56: + DoScriptText(WHISP21, me, player); + player->GroupEventHappens(10211, me); break; } } @@ -406,7 +443,7 @@ public: struct npc_dirty_larryAI : public ScriptedAI { - npc_dirty_larryAI(Creature* c) : ScriptedAI(c) {} + npc_dirty_larryAI(Creature* creature) : ScriptedAI(creature) {} bool Event; bool Attack; @@ -543,10 +580,10 @@ public: } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { CAST_AI(npc_dirty_larry::npc_dirty_larryAI, creature->AI())->Event = true; CAST_AI(npc_dirty_larry::npc_dirty_larryAI, creature->AI())->PlayerGUID = player->GetGUID(); @@ -572,7 +609,6 @@ public: { return new npc_dirty_larryAI (creature); } - }; /*###### @@ -587,12 +623,12 @@ class npc_ishanah : public CreatureScript public: npc_ishanah() : CreatureScript("npc_ishanah") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) player->SEND_GOSSIP_MENU(9458, creature->GetGUID()); - else if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + else if (action == GOSSIP_ACTION_INFO_DEF+2) player->SEND_GOSSIP_MENU(9459, creature->GetGUID()); return true; @@ -610,7 +646,6 @@ public: return true; } - }; /*###### @@ -629,10 +664,10 @@ class npc_khadgar : public CreatureScript public: npc_khadgar() : CreatureScript("npc_khadgar") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); @@ -678,7 +713,6 @@ public: return true; } - }; void AddSC_shattrath_city() diff --git a/src/server/scripts/Outland/terokkar_forest.cpp b/src/server/scripts/Outland/terokkar_forest.cpp index 043b74b6924..6c2214cde37 100644 --- a/src/server/scripts/Outland/terokkar_forest.cpp +++ b/src/server/scripts/Outland/terokkar_forest.cpp @@ -62,7 +62,7 @@ public: struct mob_unkor_the_ruthlessAI : public ScriptedAI { - mob_unkor_the_ruthlessAI(Creature* c) : ScriptedAI(c) {} + mob_unkor_the_ruthlessAI(Creature* creature) : ScriptedAI(creature) {} bool CanDoQuest; uint32 UnkorUnfriendly_Timer; @@ -99,12 +99,12 @@ public: { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - Player* pGroupie = itr->getSource(); - if (pGroupie && - pGroupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - pGroupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + Player* groupie = itr->getSource(); + if (groupie && + groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && + groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) { - pGroupie->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); + groupie->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); if (!CanDoQuest) CanDoQuest = true; } @@ -150,7 +150,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -169,7 +168,7 @@ public: struct mob_infested_root_walkerAI : public ScriptedAI { - mob_infested_root_walkerAI(Creature* c) : ScriptedAI(c) {} + mob_infested_root_walkerAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { } void EnterCombat(Unit* /*who*/) { } @@ -183,7 +182,6 @@ public: DoCast(me, 39130, true); } }; - }; /*###### @@ -202,15 +200,15 @@ public: struct npc_skywingAI : public npc_escortAI { public: - npc_skywingAI(Creature* c) : npc_escortAI(c) {} + npc_skywingAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); if (!player) return; - switch (i) + switch (waypointId) { case 8: player->AreaExploredOrEventHappens(10898); @@ -245,7 +243,6 @@ public: npc_escortAI::UpdateAI(diff); } }; - }; /*###### @@ -264,7 +261,7 @@ public: struct mob_rotting_forest_ragerAI : public ScriptedAI { - mob_rotting_forest_ragerAI(Creature* c) : ScriptedAI(c) {} + mob_rotting_forest_ragerAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { } void EnterCombat(Unit* /*who*/) { } @@ -278,7 +275,6 @@ public: DoCast(me, 39134, true); } }; - }; /*###### @@ -304,34 +300,35 @@ public: struct mob_netherweb_victimAI : public ScriptedAI { - mob_netherweb_victimAI(Creature* c) : ScriptedAI(c) {} + mob_netherweb_victimAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { } void EnterCombat(Unit* /*who*/) { } void MoveInLineOfSight(Unit* /*who*/) { } - void JustDied(Unit* Killer) + void JustDied(Unit* killer) { - if (Killer->GetTypeId() == TYPEID_PLAYER) + Player* player = killer->ToPlayer(); + if (!player) + return; + + if (player->GetQuestStatus(10873) == QUEST_STATUS_INCOMPLETE) { - if (CAST_PLR(Killer)->GetQuestStatus(10873) == QUEST_STATUS_INCOMPLETE) + if (rand()%100 < 25) { - if (rand()%100 < 25) - { - me->SummonCreature(QUEST_TARGET, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - CAST_PLR(Killer)->KilledMonsterCredit(QUEST_TARGET, 0); - } - else - me->SummonCreature(netherwebVictims[rand()%6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(QUEST_TARGET, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + player->KilledMonsterCredit(QUEST_TARGET, 0); + } + else + me->SummonCreature(netherwebVictims[rand()%6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - if (rand()%100 < 75) - me->SummonCreature(netherwebVictims[rand()%6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + if (rand()%100 < 75) me->SummonCreature(netherwebVictims[rand()%6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - } + + me->SummonCreature(netherwebVictims[rand()%6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); } } }; - }; /*###### @@ -358,15 +355,15 @@ class npc_floon : public CreatureScript public: npc_floon() : CreatureScript("npc_floon") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(9443, creature->GetGUID()); } - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); creature->setFaction(FACTION_HOSTILE_FL); @@ -392,9 +389,9 @@ public: struct npc_floonAI : public ScriptedAI { - npc_floonAI(Creature* c) : ScriptedAI(c) + npc_floonAI(Creature* creature) : ScriptedAI(creature) { - m_uiNormFaction = c->getFaction(); + m_uiNormFaction = creature->getFaction(); } uint32 m_uiNormFaction; @@ -439,7 +436,6 @@ public: DoMeleeAttackIfReady(); } }; - }; /*###### @@ -465,39 +461,44 @@ public: struct npc_isla_starmaneAI : public npc_escortAI { - npc_isla_starmaneAI(Creature* c) : npc_escortAI(c) {} + npc_isla_starmaneAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { - case 0: - { - GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 10); - if (Cage) - Cage->SetGoState(GO_STATE_ACTIVE); - } - break; - case 2: DoScriptText(SAY_PROGRESS_1, me, player); break; - case 5: DoScriptText(SAY_PROGRESS_2, me, player); break; - case 6: DoScriptText(SAY_PROGRESS_3, me, player); break; - case 29:DoScriptText(SAY_PROGRESS_4, me, player); - if (player) - { + case 0: + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 10)) + Cage->SetGoState(GO_STATE_ACTIVE); + break; + case 2: + DoScriptText(SAY_PROGRESS_1, me, player); + break; + case 5: + DoScriptText(SAY_PROGRESS_2, me, player); + break; + case 6: + DoScriptText(SAY_PROGRESS_3, me, player); + break; + case 29: + DoScriptText(SAY_PROGRESS_4, me, player); if (player->GetTeam() == ALLIANCE) player->GroupEventHappens(QUEST_EFTW_A, me); else if (player->GetTeam() == HORDE) player->GroupEventHappens(QUEST_EFTW_H, me); - } - me->SetInFront(player); break; - case 30: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break; - case 31: DoCast(me, SPELL_CAT); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); break; + me->SetInFront(player); + break; + case 30: + me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); + break; + case 31: + DoCast(me, SPELL_CAT); + me->SetWalk(false); + break; } } @@ -532,7 +533,6 @@ public: { return new npc_isla_starmaneAI(creature); } - }; /*###### @@ -548,12 +548,12 @@ class go_skull_pile : public GameObjectScript public: go_skull_pile() : GameObjectScript("go_skull_pile") { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 uiSender, uint32 uiAction) + bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiSender) + switch (sender) { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, uiAction); break; + case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break; } return true; } @@ -572,9 +572,9 @@ public: return true; } - void SendActionMenu(Player* player, GameObject* /*go*/, uint32 uiAction) + void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action) { - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: player->CastSpell(player, 40642, false); @@ -606,10 +606,10 @@ class npc_slim : public CreatureScript public: npc_slim() : CreatureScript("npc_slim") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; @@ -627,7 +627,6 @@ public: return true; } - }; /*######## @@ -667,23 +666,22 @@ public: struct npc_akunoAI : public npc_escortAI { - npc_akunoAI(Creature* c) : npc_escortAI(c) {} + npc_akunoAI(Creature* creature) : npc_escortAI(creature) {} - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { case 3: me->SummonCreature(NPC_CABAL_SKRIMISHER, -2795.99f, 5420.33f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(NPC_CABAL_SKRIMISHER, -2793.55f, 5412.79f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); break; case 11: - if (player && player->GetTypeId() == TYPEID_PLAYER) + if (player->GetTypeId() == TYPEID_PLAYER) player->GroupEventHappens(QUEST_ESCAPING_THE_TOMB, me); break; } @@ -694,7 +692,6 @@ public: summon->AI()->AttackStart(me); } }; - }; void AddSC_terokkar_forest() diff --git a/src/server/scripts/Outland/zangarmarsh.cpp b/src/server/scripts/Outland/zangarmarsh.cpp index fc7a3f4d667..90ce070ecc7 100644 --- a/src/server/scripts/Outland/zangarmarsh.cpp +++ b/src/server/scripts/Outland/zangarmarsh.cpp @@ -56,6 +56,7 @@ public: { if (creature->GetEntry() == 17900) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + if (creature->GetEntry() == 17901) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); } @@ -64,10 +65,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF+1) { creature->setPowerType(POWER_MANA); creature->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case @@ -149,9 +150,9 @@ public: struct npc_cooshcooshAI : public ScriptedAI { - npc_cooshcooshAI(Creature* c) : ScriptedAI(c) + npc_cooshcooshAI(Creature* creature) : ScriptedAI(creature) { - m_uiNormFaction = c->getFaction(); + m_uiNormFaction = creature->getFaction(); } uint32 m_uiNormFaction; @@ -195,10 +196,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF) + if (action == GOSSIP_ACTION_INFO_DEF) { player->CLOSE_GOSSIP_MENU(); creature->setFaction(FACTION_HOSTILE_CO); @@ -231,10 +232,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -284,10 +285,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_TRADE) + if (action == GOSSIP_ACTION_TRADE) player->GetSession()->SendListInventory(creature->GetGUID()); return true; } @@ -317,18 +318,17 @@ public: struct npc_kayra_longmaneAI : public npc_escortAI { - npc_kayra_longmaneAI(Creature* c) : npc_escortAI(c) {} + npc_kayra_longmaneAI(Creature* creature) : npc_escortAI(creature) {} void Reset() { } - void WaypointReached(uint32 i) + void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); - if (!player) return; - switch (i) + switch (waypointId) { case 4: DoScriptText(SAY_AMBUSH1, me, player); @@ -404,10 +404,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF+1: player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_TIMOTHY_DANIELS1, creature->GetGUID()); diff --git a/src/server/scripts/Spells/CMakeLists.txt b/src/server/scripts/Spells/CMakeLists.txt index 496324e4de9..04dcee9287c 100644 --- a/src/server/scripts/Spells/CMakeLists.txt +++ b/src/server/scripts/Spells/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index eb42b377128..36dcb53ad00 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -337,11 +337,11 @@ class spell_dk_death_pact : public SpellScriptLoader void FilterTargets(std::list& unitList) { Unit* unit_to_add = NULL; - for (std::list::iterator itr = unitList.begin() ; itr != unitList.end(); ++itr) + for (std::list::iterator itr = unitList.begin(); itr != unitList.end(); ++itr) { if ((*itr)->GetTypeId() == TYPEID_UNIT && (*itr)->GetOwnerGUID() == GetCaster()->GetGUID() - && (*itr)->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_UNDEAD) + && (*itr)->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_UNDEAD) { unit_to_add = (*itr); break; @@ -642,9 +642,7 @@ public: void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - Unit* target = GetTarget(); - if (target->HasAura(DK_SPELL_UNHOLY_PRESENCE)) - target->RemoveAura(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); + GetTarget()->RemoveAura(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); } void Register() @@ -713,6 +711,7 @@ enum DeathCoil { SPELL_DEATH_COIL_DAMAGE = 47632, SPELL_DEATH_COIL_HEAL = 47633, + SPELL_SIGIL_VENGEFUL_HEART = 64962, }; class spell_dk_death_coil : public SpellScriptLoader @@ -743,12 +742,34 @@ class spell_dk_death_coil : public SpellScriptLoader caster->CastCustomSpell(target, SPELL_DEATH_COIL_HEAL, &bp, NULL, NULL, true); } else + { + if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_SIGIL_VENGEFUL_HEART, EFFECT_1)) + damage += auraEffect->GetBaseAmount(); caster->CastCustomSpell(target, SPELL_DEATH_COIL_DAMAGE, &damage, NULL, NULL, true); + } } } + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (Unit* target = GetExplTargetUnit()) + { + if (!caster->IsFriendlyTo(target) && !caster->isInFront(target)) + return SPELL_FAILED_UNIT_NOT_INFRONT; + + if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD) + return SPELL_FAILED_BAD_TARGETS; + } + else + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + void Register() { + OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast); OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } @@ -769,16 +790,14 @@ class spell_dk_death_grip : public SpellScriptLoader { PrepareSpellScript(spell_dk_death_grip_SpellScript); - void HandleDummy(SpellEffIndex effIndex) + void HandleDummy(SpellEffIndex /*effIndex*/) { int32 damage = GetEffectValue(); - Position pos; + Position const* pos = GetExplTargetDest(); if (Unit* target = GetHitUnit()) { - GetSummonPosition(effIndex, pos, 0.0f, 0); - if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS)) // Deterrence - target->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), damage, true); + target->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), damage, true); } } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 4c440f18bd9..898350dbd71 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -237,7 +237,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader } else { - unitList.remove(GetTargetUnit()); + unitList.remove(GetExplTargetUnit()); std::list tempTargets; for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith(*itr)) @@ -250,7 +250,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader return; } - Unit* target = SelectRandomContainerElement(tempTargets); + Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets); unitList.clear(); unitList.push_back(target); } @@ -279,7 +279,7 @@ class spell_dru_starfall_aoe : public SpellScriptLoader void FilterTargets(std::list& unitList) { - unitList.remove(GetTargetUnit()); + unitList.remove(GetExplTargetUnit()); } void Register() diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 886384a1c68..0c879cfb029 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -169,7 +169,7 @@ class spell_gen_burn_brutallus : public SpellScriptLoader } }; -enum eCannibalizeSpells +enum CannibalizeSpells { SPELL_CANNIBALIZE_TRIGGERED = 20578, }; @@ -224,7 +224,7 @@ class spell_gen_cannibalize : public SpellScriptLoader }; // 45472 Parachute -enum eParachuteSpells +enum ParachuteSpells { SPELL_PARACHUTE = 45472, SPELL_PARACHUTE_BUFF = 44795, @@ -365,7 +365,7 @@ class spell_gen_remove_flight_auras : public SpellScriptLoader }; // 66118 Leeching Swarm -enum eLeechingSwarmSpells +enum LeechingSwarmSpells { SPELL_LEECHING_SWARM_DMG = 66240, SPELL_LEECHING_SWARM_HEAL = 66125, @@ -481,7 +481,7 @@ class spell_gen_elune_candle : public SpellScriptLoader }; // 24750 Trick -enum eTrickSpells +enum TrickSpells { SPELL_PIRATE_COSTUME_MALE = 24708, SPELL_PIRATE_COSTUME_FEMALE = 24709, @@ -557,7 +557,7 @@ class spell_gen_trick : public SpellScriptLoader }; // 24751 Trick or Treat -enum eTrickOrTreatSpells +enum TrickOrTreatSpells { SPELL_TRICK = 24714, SPELL_TREAT = 24715, @@ -1234,30 +1234,30 @@ class spell_gen_magic_rooster : public SpellScriptLoader class spell_gen_allow_cast_from_item_only : public SpellScriptLoader { -public: - spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { } - - class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript); + public: + spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { } - SpellCastResult CheckRequirement() + class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript { - if (!GetCastItem()) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - return SPELL_CAST_OK; - } + PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript); - void Register() + SpellCastResult CheckRequirement() + { + if (!GetCastItem()) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const { - OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement); + return new spell_gen_allow_cast_from_item_only_SpellScript(); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_allow_cast_from_item_only_SpellScript(); - } }; enum Launch @@ -1282,7 +1282,7 @@ class spell_gen_launch : public SpellScriptLoader void Launch() { - WorldLocation const* const position = GetTargetDest(); + WorldLocation const* const position = GetExplTargetDest(); if (Player* player = GetHitPlayer()) { @@ -1312,6 +1312,11 @@ class spell_gen_launch : public SpellScriptLoader } }; +enum VehicleScaling +{ + SPELL_GEAR_SCALING = 66668, +}; + class spell_gen_vehicle_scaling : public SpellScriptLoader { public: @@ -1323,7 +1328,7 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader bool Load() { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; } void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) @@ -1335,7 +1340,7 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader // TODO: Reserach coeffs for different vehicles switch (GetId()) { - case 66668: + case SPELL_GEAR_SCALING: factor = 1.0f; baseItemLevel = 205; break; @@ -1508,7 +1513,7 @@ class spell_gen_luck_of_the_draw : public SpellScriptLoader if (group->isLFGGroup()) if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true)) if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId)) - if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty()) + if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == uint32(map->GetDifficulty())) if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM) return; // in correct dungeon @@ -1585,19 +1590,17 @@ class spell_gen_spirit_healer_res : public SpellScriptLoader bool Load() { - return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; + return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; } void HandleDummy(SpellEffIndex /* effIndex */) { - if (Player* originalCaster = GetOriginalCaster()->ToPlayer()) + Player* originalCaster = GetOriginalCaster()->ToPlayer(); + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); - data << uint64(target->GetGUID()); - originalCaster->GetSession()->SendPacket(&data); - } + WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); + data << uint64(target->GetGUID()); + originalCaster->GetSession()->SendPacket(&data); } } @@ -2550,6 +2553,141 @@ class spell_gen_chaos_blast : public SpellScriptLoader }; +class spell_gen_ds_flush_knockback : public SpellScriptLoader +{ + public: + spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") {} + + class spell_gen_ds_flush_knockback_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + // Here the target is the water spout and determines the position where the player is knocked from + if (Unit* target = GetHitUnit()) + { + if (Player* player = GetCaster()->ToPlayer()) + { + float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target)); + float verticalSpeed = 8.0f; + // This method relies on the Dalaran Sewer map disposition and Water Spout position + // What we do is knock the player from a position exactly behind him and at the end of the pipe + player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed); + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_ds_flush_knockback_SpellScript(); + } +}; + +class spell_gen_wg_water : public SpellScriptLoader +{ + public: + spell_gen_wg_water() : SpellScriptLoader("spell_gen_wg_water") {} + + class spell_gen_wg_water_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_wg_water_SpellScript); + + SpellCastResult CheckCast() + { + if (!GetSpellInfo()->CheckTargetCreatureType(GetCaster())) + return SPELL_FAILED_DONT_REPORT; + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_wg_water_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_wg_water_SpellScript(); + } +}; + +class spell_gen_count_pct_from_max_hp : public SpellScriptLoader +{ + public: + spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { } + + class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript) + + public: + spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { } + + void RecalculateDamage() + { + if (!_damagePct) + _damagePct = GetHitDamage(); + + SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct)); + } + + void Register() + { + OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage); + } + + private: + int32 _damagePct; + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct); + } + + private: + int32 _damagePct; +}; + +class spell_gen_despawn_self : public SpellScriptLoader +{ +public: + spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { } + + class spell_gen_despawn_self_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_despawn_self_SpellScript); + + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void HandleDummy(SpellEffIndex effIndex) + { + if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) + GetCaster()->ToCreature()->DespawnOrUnsummon(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_despawn_self_SpellScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -2599,4 +2737,9 @@ void AddSC_generic_spell_scripts() new spell_gen_on_tournament_mount(); new spell_gen_tournament_pennant(); new spell_gen_chaos_blast(); + new spell_gen_ds_flush_knockback(); + new spell_gen_wg_water(); + new spell_gen_count_pct_from_max_hp("spell_gen_default_count_pct_from_max_hp"); + new spell_gen_count_pct_from_max_hp("spell_gen_50pct_count_pct_from_max_hp", 50); + new spell_gen_despawn_self(); } diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 855af75cd83..896ed331bde 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -137,8 +137,9 @@ class spell_hun_chimera_shot : public SpellScriptLoader { int32 TickCount = aurEff->GetTotalTicks(); spellId = HUNTER_SPELL_CHIMERA_SHOT_SERPENT; - basePoint = caster->SpellDamageBonus(unitTarget, aura->GetSpellInfo(), aurEff->GetAmount(), DOT, aura->GetStackAmount()); + basePoint = caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), aurEff->GetAmount(), DOT, aura->GetStackAmount()); ApplyPctN(basePoint, TickCount * 40); + basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount()); } // Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting. else if (familyFlag[1] & 0x00000080) @@ -286,8 +287,8 @@ class spell_hun_masters_call : public SpellScriptLoader target->CastSpell(target, HUNTER_SPELL_MASTERS_CALL_TRIGGERED, castMask); // there is a possibility that this effect should access effect 0 (dummy) target, but i dubt that // it's more likely that on on retail it's possible to call target selector based on dbc values - // anyways, we're using GetTargetUnit() here and it's ok - if (Unit* ally = GetTargetUnit()) + // anyways, we're using GetExplTargetUnit() here and it's ok + if (Unit* ally = GetExplTargetUnit()) { target->CastSpell(ally, GetEffectValue(), castMask); target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), castMask); @@ -560,6 +561,64 @@ class spell_hun_pet_carrion_feeder : public SpellScriptLoader } }; +// 34477 Misdirection +class spell_hun_misdirection : public SpellScriptLoader +{ + public: + spell_hun_misdirection() : SpellScriptLoader("spell_hun_misdirection") { } + + class spell_hun_misdirection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_misdirection_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (!GetDuration()) + caster->SetReducedThreatPercent(0, 0); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_misdirection_AuraScript(); + } +}; + +// 35079 Misdirection proc +class spell_hun_misdirection_proc : public SpellScriptLoader +{ + public: + spell_hun_misdirection_proc() : SpellScriptLoader("spell_hun_misdirection_proc") { } + + class spell_hun_misdirection_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_misdirection_proc_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetCaster()) + GetCaster()->SetReducedThreatPercent(0, 0); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_misdirection_proc_AuraScript(); + } +}; + + void AddSC_hunter_spell_scripts() { new spell_hun_aspect_of_the_beast(); @@ -572,4 +631,6 @@ void AddSC_hunter_spell_scripts() new spell_hun_sniper_training(); new spell_hun_pet_heart_of_the_phoenix(); new spell_hun_pet_carrion_feeder(); + new spell_hun_misdirection(); + new spell_hun_misdirection_proc(); } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 416869d98ce..4e2eb633662 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -55,8 +55,8 @@ class spell_item_trigger_spell : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - if (Item* pItem = GetCastItem()) - caster->CastSpell(caster, _triggeredSpellId, true, pItem); + if (Item* item = GetCastItem()) + caster->CastSpell(caster, _triggeredSpellId, true, item); } void Register() @@ -1095,7 +1095,7 @@ class spell_item_shimmering_vessel : public SpellScriptLoader void HandleDummy(SpellEffIndex /* effIndex */) { if (Creature* target = GetHitCreature()) - target->setDeathState(JUST_ALIVED); + target->setDeathState(JUST_RESPAWNED); } void Register() @@ -1513,7 +1513,7 @@ class spell_item_complete_raptor_capture : public SpellScriptLoader enum ImpaleLeviroth { NPC_LEVIROTH = 26452, - SPELL_LEVIROTH_SELF_IMPALE = 49882 + SPELL_LEVIROTH_SELF_IMPALE = 49882, }; class spell_item_impale_leviroth : public SpellScriptLoader @@ -1534,11 +1534,9 @@ class spell_item_impale_leviroth : public SpellScriptLoader void HandleDummy(SpellEffIndex /* effIndex */) { - Unit* target = GetHitCreature(); - if (!target || target->GetEntry() != NPC_LEVIROTH || !target->HealthBelowPct(95)) - return; - - target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true); + if (Unit* target = GetHitCreature()) + if (target->GetEntry() == NPC_LEVIROTH && !target->HealthBelowPct(95)) + target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true); } void Register() @@ -1591,15 +1589,15 @@ class spell_item_brewfest_mount_transformation : public SpellScriptLoader { case SPELL_BREWFEST_MOUNT_TRANSFORM: if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f) - spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100 ; + spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100; else - spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60 ; + spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60; break; case SPELL_BREWFEST_MOUNT_TRANSFORM_REVERSE: if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f) - spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100 ; + spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100; else - spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60 ; + spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60; break; default: return; @@ -1746,11 +1744,20 @@ class spell_item_rocket_boots : public SpellScriptLoader if (Battleground* bg = caster->GetBattleground()) bg->EventPlayerDroppedFlag(caster); + caster->RemoveSpellCooldown(SPELL_ROCKET_BOOTS_PROC); caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, NULL); } + SpellCastResult CheckCast() + { + if (GetCaster()->IsInWater()) + return SPELL_FAILED_ONLY_ABOVEWATER; + return SPELL_CAST_OK; + } + void Register() { + OnCheckCast += SpellCheckCastFn(spell_item_rocket_boots_SpellScript::CheckCast); OnEffectHitTarget += SpellEffectFn(spell_item_rocket_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -1994,6 +2001,65 @@ class spell_item_refocus : public SpellScriptLoader } }; +class spell_item_muisek_vessel : public SpellScriptLoader +{ + public: + spell_item_muisek_vessel() : SpellScriptLoader("spell_item_muisek_vessel") { } + + class spell_item_muisek_vessel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_muisek_vessel_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Creature* target = GetHitCreature()) + if (target->isDead()) + target->DespawnOrUnsummon(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_muisek_vessel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_muisek_vessel_SpellScript(); + } +}; + +enum GreatmothersSoulcather +{ + SPELL_FORCE_CAST_SUMMON_GNOME_SOUL = 46486, +}; +class spell_item_greatmothers_soulcatcher : public SpellScriptLoader +{ +public: + spell_item_greatmothers_soulcatcher() : SpellScriptLoader("spell_item_greatmothers_soulcatcher") { } + + class spell_item_greatmothers_soulcatcher_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_greatmothers_soulcatcher_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()) + GetCaster()->CastSpell(GetCaster(),SPELL_FORCE_CAST_SUMMON_GNOME_SOUL); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_greatmothers_soulcatcher_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_greatmothers_soulcatcher_SpellScript(); + } +}; + void AddSC_item_spell_scripts() { // 23074 Arcanite Dragonling @@ -2045,4 +2111,6 @@ void AddSC_item_spell_scripts() new spell_item_unusual_compass(); new spell_item_uded(); new spell_item_chicken_cover(); + new spell_item_muisek_vessel(); + new spell_item_greatmothers_soulcatcher(); } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index ea1af10816b..050741ffaba 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -123,6 +123,12 @@ class spell_mage_cold_snap : public SpellScriptLoader } }; +enum SilvermoonPolymorph +{ + NPC_AUROSALIA = 18744, +}; + +// TODO: move out of here and rename - not a mage spell class spell_mage_polymorph_cast_visual : public SpellScriptLoader { public: @@ -132,22 +138,22 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader { PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript); - static const uint32 spell_list[6]; + static const uint32 PolymorhForms[6]; bool Validate(SpellInfo const* /*spellEntry*/) { // check if spell ids exist in dbc - for (int i = 0; i < 6; i++) - if (!sSpellMgr->GetSpellInfo(spell_list[i])) + for (uint32 i = 0; i < 6; i++) + if (!sSpellMgr->GetSpellInfo(PolymorhForms[i])) return false; return true; } void HandleDummy(SpellEffIndex /*effIndex*/) { - if (Unit* unitTarget = GetHitUnit()) - if (unitTarget->GetTypeId() == TYPEID_UNIT) - unitTarget->CastSpell(unitTarget, spell_list[urand(0, 5)], true); + if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) + if (target->GetTypeId() == TYPEID_UNIT) + target->CastSpell(target, PolymorhForms[urand(0, 5)], true); } void Register() @@ -163,7 +169,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader } }; -const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::spell_list[6] = +const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] = { SPELL_MAGE_SQUIRREL_FORM, SPELL_MAGE_GIRAFFE_FORM, @@ -244,9 +250,11 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader if (roll_chance_i(chance)) { - absorbAmount = dmgInfo.GetDamage(); - int32 bp = absorbAmount; + int32 bp = dmgInfo.GetDamage(); + dmgInfo.AbsorbDamage(bp); target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); + absorbAmount = 0; + PreventDefaultAction(); } } } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index d823c629d4b..4baa1eb3735 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -285,9 +285,29 @@ class spell_pal_holy_shock : public SpellScriptLoader } } + SpellCastResult CheckCast() + { + Player* caster = GetCaster()->ToPlayer(); + if (Unit* target = GetExplTargetUnit()) + { + if (!caster->IsFriendlyTo(target)) + { + if (!caster->IsValidAttackTarget(target)) + return SPELL_FAILED_BAD_TARGETS; + + if (!caster->isInFront(target)) + return SPELL_FAILED_UNIT_NOT_INFRONT; + } + } + else + return SPELL_FAILED_BAD_TARGETS; + return SPELL_CAST_OK; + } + void Register() { // add dummy effect spell handler to Holy Shock + OnCheckCast += SpellCheckCastFn(spell_pal_holy_shock_SpellScript::CheckCast); OnEffectHitTarget += SpellEffectFn(spell_pal_holy_shock_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index b012fe5f183..8088004c9d1 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -185,6 +185,11 @@ class spell_pri_penance : public SpellScriptLoader { PrepareSpellScript(spell_pri_penance_SpellScript); + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + bool Validate(SpellInfo const* spellEntry) { if (!sSpellMgr->GetSpellInfo(PRIEST_SPELL_PENANCE_R1)) @@ -207,7 +212,7 @@ class spell_pri_penance : public SpellScriptLoader Unit* caster = GetCaster(); if (Unit* unitTarget = GetHitUnit()) { - if(!unitTarget->isAlive()) + if (!unitTarget->isAlive()) return; uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id); @@ -219,10 +224,20 @@ class spell_pri_penance : public SpellScriptLoader } } + SpellCastResult CheckCast() + { + Player* caster = GetCaster()->ToPlayer(); + if (Unit* target = GetExplTargetUnit()) + if (!caster->IsFriendlyTo(target) && !caster->IsValidAttackTarget(target)) + return SPELL_FAILED_BAD_TARGETS; + return SPELL_CAST_OK; + } + void Register() { // add dummy effect spell handler to Penance OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast); } }; @@ -275,12 +290,53 @@ class spell_pri_reflective_shield_trigger : public SpellScriptLoader } }; +enum PrayerOfMending +{ + SPELL_T9_HEALING_2_PIECE = 67201, +}; +// Prayer of Mending Heal +class spell_pri_prayer_of_mending_heal : public SpellScriptLoader +{ +public: + spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { } + + class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); + + void HandleHeal(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetOriginalCaster()) + { + if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_T9_HEALING_2_PIECE,EFFECT_0)) + { + int32 heal = GetHitHeal(); + AddPctN(heal, aurEff->GetAmount()); + SetHitHeal(heal); + } + } + + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_prayer_of_mending_heal_SpellScript(); + } +}; + void AddSC_priest_spell_scripts() { new spell_pri_guardian_spirit(); - new spell_pri_mana_burn; - new spell_pri_pain_and_suffering_proc; - new spell_pri_penance; + new spell_pri_mana_burn(); + new spell_pri_pain_and_suffering_proc(); + new spell_pri_penance(); new spell_pri_reflective_shield_trigger(); new spell_pri_mind_sear(); + new spell_pri_prayer_of_mending_heal(); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 09c34e3499d..810cc20e04b 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -275,7 +275,7 @@ class spell_q11396_11399_scourging_crystal_controller : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { - if (Unit* target = GetTargetUnit()) + if (Unit* target = GetExplTargetUnit()) if (target->GetTypeId() == TYPEID_UNIT && target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) // Make sure nobody else is channeling the same target if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) @@ -636,6 +636,10 @@ class spell_q12851_going_bearback : public SpellScriptLoader if (Unit* caster = GetCaster()) { Unit* target = GetTarget(); + // Already in fire + if (target->HasAura(SPELL_ABLAZE)) + return; + if (Player* player = caster->GetCharmerOrOwnerPlayerOrPlayerItself()) { switch (target->GetEntry()) @@ -833,7 +837,7 @@ class spell_q12659_ahunaes_knife : public SpellScriptLoader Player* caster = GetCaster()->ToPlayer(); if (Creature* target = GetHitCreature()) { - target->ForcedDespawn(); + target->DespawnOrUnsummon(); caster->KilledMonsterCredit(NPC_SCALPS_KC_BUNNY, 0); } } @@ -1025,9 +1029,9 @@ class spell_q14112_14145_chum_the_water: public SpellScriptLoader // http://old01.wowhead.com/quest=9452 - Red Snapper - Very Tasty! enum RedSnapperVeryTasty { - SPELL_CAST_NET = 29866, - ITEM_RED_SNAPPER = 23614, - NPC_ANGRY_MURLOC = 17102, + SPELL_CAST_NET = 29866, + ITEM_RED_SNAPPER = 23614, + SPELL_NEW_SUMMON_TEST = 49214, }; class spell_q9452_cast_net: public SpellScriptLoader @@ -1047,16 +1051,10 @@ class spell_q9452_cast_net: public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { Player* caster = GetCaster()->ToPlayer(); - switch (urand(0, 2)) - { - case 0: case 1: - caster->AddItem(ITEM_RED_SNAPPER, 1); - break; - case 2: - if (Creature* murloc = caster->SummonCreature(NPC_ANGRY_MURLOC, caster->GetPositionX()+5, caster->GetPositionY(), caster->GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 120000)) - murloc->AI()->AttackStart(caster); - break; - } + if (roll_chance_i(66)) + caster->AddItem(ITEM_RED_SNAPPER, 1); + else + caster->CastSpell(caster, SPELL_NEW_SUMMON_TEST, true); } void Register() @@ -1107,6 +1105,63 @@ public: } }; +enum LeaveNothingToChance +{ + NPC_UPPER_MINE_SHAFT = 27436, + NPC_LOWER_MINE_SHAFT = 27437, + + SPELL_UPPER_MINE_SHAFT_CREDIT = 48744, + SPELL_LOWER_MINE_SHAFT_CREDIT = 48745, +}; + +class spell_q12277_wintergarde_mine_explosion : public SpellScriptLoader +{ + public: + spell_q12277_wintergarde_mine_explosion() : SpellScriptLoader("spell_q12277_wintergarde_mine_explosion") { } + + class spell_q12277_wintergarde_mine_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12277_wintergarde_mine_explosion_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Creature* unitTarget = GetHitCreature()) + { + if (Unit* caster = GetCaster()) + { + if (caster->GetTypeId() == TYPEID_UNIT) + { + if (Unit* owner = caster->GetOwner()) + { + switch (unitTarget->GetEntry()) + { + case NPC_UPPER_MINE_SHAFT: + caster->CastSpell(owner, SPELL_UPPER_MINE_SHAFT_CREDIT, true); + break; + case NPC_LOWER_MINE_SHAFT: + caster->CastSpell(owner, SPELL_LOWER_MINE_SHAFT_CREDIT, true); + break; + default: + break; + } + } + } + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12277_wintergarde_mine_explosion_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12277_wintergarde_mine_explosion_SpellScript(); + } +}; + void AddSC_quest_spell_scripts() { new spell_q55_sacred_cleansing(); @@ -1133,4 +1188,5 @@ void AddSC_quest_spell_scripts() new spell_q14112_14145_chum_the_water(); new spell_q9452_cast_net(); new spell_q12987_read_pronouncement(); + new spell_q12277_wintergarde_mine_explosion(); } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 96ee7a18429..c9c036d5329 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -35,6 +35,9 @@ enum ShamanSpells SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349, SHAMAN_SPELL_SATED = 57724, SHAMAN_SPELL_EXHAUSTION = 57723, + + SHAMAN_SPELL_STORM_EARTH_AND_FIRE = 51483, + EARTHBIND_TOTEM_SPELL_EARTHGRAB = 64695, // For Earthen Power SHAMAN_TOTEM_SPELL_EARTHBIND_TOTEM = 6474, @@ -210,20 +213,35 @@ class spell_sha_earthbind_totem : public SpellScriptLoader return true; } - void HandleEffectPeriodic(AuraEffect const* aurEff) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - if (Unit* target = GetTarget()) - if (Unit* caster = aurEff->GetBase()->GetCaster()) - if (TempSummon* summon = caster->ToTempSummon()) - if (Unit* owner = summon->GetOwner()) - if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0)) - if (roll_chance_i(aur->GetBaseAmount()) && target->HasAuraWithMechanic(1 << MECHANIC_SNARE)) - caster->CastSpell(caster, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true, NULL, aurEff); + if (!GetCaster()) + return; + if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0)) + if (roll_chance_i(aur->GetBaseAmount())) + GetTarget()->CastSpell((Unit*)NULL, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true); + } + + void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (!GetCaster()) + return; + Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!owner) + return; + // Storm, Earth and Fire + if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_STORM_EARTH_AND_FIRE, EFFECT_1)) + { + if (roll_chance_i(aurEff->GetAmount())) + GetCaster()->CastSpell(GetCaster(), EARTHBIND_TOTEM_SPELL_EARTHGRAB, false); + } } void Register() { OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_earthbind_totem_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectApply += AuraEffectApplyFn(spell_sha_earthbind_totem_AuraScript::Apply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; @@ -233,6 +251,46 @@ class spell_sha_earthbind_totem : public SpellScriptLoader } }; +class EarthenPowerTargetSelector +{ + public: + EarthenPowerTargetSelector() { } + + bool operator() (Unit* target) + { + if (!target->HasAuraWithMechanic(1 << MECHANIC_SNARE)) + return true; + + return false; + } +}; + +class spell_sha_earthen_power : public SpellScriptLoader +{ + public: + spell_sha_earthen_power() : SpellScriptLoader("spell_sha_earthen_power") { } + + class spell_sha_earthen_power_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_earthen_power_SpellScript); + + void FilterTargets(std::list& unitList) + { + unitList.remove_if(EarthenPowerTargetSelector()); + } + + void Register() + { + OnUnitTargetSelect += SpellUnitTargetFn(spell_sha_earthen_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_earthen_power_SpellScript(); + } +}; + class spell_sha_bloodlust : public SpellScriptLoader { public: @@ -251,7 +309,7 @@ class spell_sha_bloodlust : public SpellScriptLoader void RemoveInvalidTargets(std::list& targets) { - targets.remove_if (Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED)); + targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED)); } void ApplyDebuff() @@ -430,7 +488,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader if (Unit* owner = caster->GetOwner()) { if (triggeringSpell) - damage = int32(owner->SpellHealingBonus(target, triggeringSpell, damage, HEAL)); + damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL)); // Restorative Totems if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, ICON_ID_RESTORATIVE_TOTEMS, 1)) @@ -439,6 +497,8 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader // Glyph of Healing Stream Totem if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0)) AddPctN(damage, aurEff->GetAmount()); + + damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL)); } caster->CastCustomSpell(target, SPELL_HEALING_STREAM_TOTEM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); } @@ -542,6 +602,55 @@ class spell_sha_lava_lash : public SpellScriptLoader } }; +// 1064 Chain Heal +class spell_sha_chain_heal : public SpellScriptLoader +{ + public: + spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { } + + class spell_sha_chain_heal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_chain_heal_SpellScript); + + bool Load() + { + firstHeal = true; + riptide = false; + return true; + } + + void HandleHeal(SpellEffIndex /*effIndex*/) + { + if (firstHeal) + { + // Check if the target has Riptide + if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID())) + { + riptide = true; + // Consume it + GetHitUnit()->RemoveAura(aurEff->GetBase()); + } + firstHeal = false; + } + // Riptide increases the Chain Heal effect by 25% + if (riptide) + SetHitHeal(GetHitHeal() * 1.25f); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_chain_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + } + + bool firstHeal; + bool riptide; + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_chain_heal_SpellScript(); + } +}; void AddSC_shaman_spell_scripts() { @@ -549,6 +658,7 @@ void AddSC_shaman_spell_scripts() new spell_sha_fire_nova(); new spell_sha_mana_tide_totem(); new spell_sha_earthbind_totem(); + new spell_sha_earthen_power(); new spell_sha_bloodlust(); new spell_sha_heroism(); new spell_sha_ancestral_awakening_proc(); @@ -556,4 +666,5 @@ void AddSC_shaman_spell_scripts() new spell_sha_healing_stream_totem(); new spell_sha_mana_spring_totem(); new spell_sha_lava_lash(); + new spell_sha_chain_heal(); } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index b1aff706db0..838b9e4f932 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -34,6 +34,9 @@ enum WarlockSpells WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444, WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692, WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693, + WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018, + WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020, + WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388, }; class spell_warl_banish : public SpellScriptLoader @@ -169,6 +172,19 @@ class spell_warl_create_healthstone : public SpellScriptLoader return true; } + SpellCastResult CheckCast() + { + if (Player* caster = GetCaster()->ToPlayer()) + { + uint8 spellRank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id); + ItemPosCountVec dest; + InventoryResult msg = caster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, iTypes[spellRank - 1][0], 1, NULL); + if (msg != EQUIP_ERR_OK) + return SPELL_FAILED_TOO_MANY_OF_ITEM; + } + return SPELL_CAST_OK; + } + void HandleScriptEffect(SpellEffIndex effIndex) { if (Unit* unitTarget = GetHitUnit()) @@ -195,6 +211,7 @@ class spell_warl_create_healthstone : public SpellScriptLoader void Register() { OnEffectHitTarget += SpellEffectFn(spell_warl_create_healthstone_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnCheckCast += SpellCheckCastFn(spell_warl_create_healthstone_SpellScript::CheckCast); } }; @@ -284,8 +301,8 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader void FilterTargets(std::list& unitList) { - if (GetTargetUnit()) - unitList.remove(GetTargetUnit()); + if (GetExplTargetUnit()) + unitList.remove(GetExplTargetUnit()); } void Register() @@ -327,11 +344,7 @@ class spell_warl_soulshatter : public SpellScriptLoader if (Unit* target = GetHitUnit()) { if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f) - { - sLog->outString("THREATREDUCTION"); caster->CastSpell(target, SPELL_SOULSHATTER, true); - } else - sLog->outString("can have threat? %u . threat number? %f ",target->CanHaveThreatList(),target->getThreatManager().getThreat(caster)); } } @@ -349,9 +362,6 @@ class spell_warl_soulshatter : public SpellScriptLoader enum LifeTap { - SPELL_LIFE_TAP_RANK_6 = 11689, - SPELL_LIFE_TAP_RANK_7 = 27222, - SPELL_LIFE_TAP_RANK_8 = 57946, SPELL_LIFE_TAP_ENERGIZE = 31818, SPELL_LIFE_TAP_ENERGIZE_2 = 32553, ICON_ID_IMPROVED_LIFE_TAP = 208, @@ -374,9 +384,7 @@ class spell_warl_life_tap : public SpellScriptLoader bool Validate(SpellInfo const* /*spell*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_RANK_6) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_RANK_7) - || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_RANK_8) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE) - || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2)) + if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2)) return false; return true; } @@ -386,18 +394,8 @@ class spell_warl_life_tap : public SpellScriptLoader Player* caster = GetCaster()->ToPlayer(); if (Unit* target = GetHitUnit()) { - SpellInfo const* spellInfo = GetSpellInfo(); - float spFactor = 0.0f; - int32 damage = int32(GetEffectValue() + (6.3875 * spellInfo->BaseLevel)); - switch (spellInfo->Id) - { - case SPELL_LIFE_TAP_RANK_6: spFactor = 0.2f; break; - case SPELL_LIFE_TAP_RANK_7: - case SPELL_LIFE_TAP_RANK_8: spFactor = 0.5f; break; - default: break; - } - - int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * spFactor)); + int32 damage = GetEffectValue(); + int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * 0.5f)); // Shouldn't Appear in Combat Log target->ModifyHealth(-damage); @@ -424,9 +422,7 @@ class spell_warl_life_tap : public SpellScriptLoader SpellCastResult CheckCast() { if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel)))) - { return SPELL_CAST_OK; - } return SPELL_FAILED_FIZZLE; } @@ -443,6 +439,90 @@ class spell_warl_life_tap : public SpellScriptLoader } }; +class spell_warl_demonic_circle_summon : public SpellScriptLoader +{ + public: + spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { } + + class spell_warl_demonic_circle_summon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript); + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) + { + // If effect is removed by expire remove the summoned demonic circle too. + if (!(mode & AURA_EFFECT_HANDLE_REAPPLY)) + GetTarget()->RemoveGameObject(GetId(), true); + + GetTarget()->RemoveAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); + } + + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + if (GameObject* circle = GetTarget()->GetGameObject(GetId())) + { + // Here we check if player is in demonic circle teleport range, if so add + // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT. + // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST. + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_CIRCLE_TELEPORT); + + if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true))) + { + if (!GetTarget()->HasAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST)) + GetTarget()->CastSpell(GetTarget(), WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true); + } + else + GetTarget()->RemoveAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); + } + } + + void Register() + { + OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_demonic_circle_summon_AuraScript(); + } +}; + +class spell_warl_demonic_circle_teleport : public SpellScriptLoader +{ + public: + spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { } + + class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript); + + void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* player = GetTarget()->ToPlayer()) + { + if (GameObject* circle = player->GetGameObject(WARLOCK_DEMONIC_CIRCLE_SUMMON)) + { + player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation()); + player->RemoveMovementImpairingAuras(); + } + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_demonic_circle_teleport_AuraScript(); + } +}; + void AddSC_warlock_spell_scripts() { new spell_warl_banish(); @@ -453,4 +533,6 @@ void AddSC_warlock_spell_scripts() new spell_warl_seed_of_corruption(); new spell_warl_soulshatter(); new spell_warl_life_tap(); + new spell_warl_demonic_circle_summon(); + new spell_warl_demonic_circle_teleport(); } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 1084398c37d..0ba5c866d63 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -177,24 +177,27 @@ class spell_warr_deep_wounds : public SpellScriptLoader void HandleDummy(SpellEffIndex /* effIndex */) { int32 damage = GetEffectValue(); + Unit* caster = GetCaster(); if (Unit* target = GetHitUnit()) - if (Unit* caster = GetCaster()) - { - // apply percent damage mods - damage = caster->SpellDamageBonus(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE); + { + // apply percent damage mods + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE); - ApplyPctN(damage, 16 * sSpellMgr->GetSpellRank(GetSpellInfo()->Id)); + ApplyPctN(damage, 16 * sSpellMgr->GetSpellRank(GetSpellInfo()->Id)); + + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE); + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC); + uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC); - uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude; + // Add remaining ticks to damage done + if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID())) + damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber()); - // Add remaining ticks to damage done - if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID())) - damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber()); + damage = damage / ticks; - damage = damage / ticks; - caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true); - } + caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true); + } } void Register() @@ -365,7 +368,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader void HandleDummy(SpellEffIndex /* effIndex */) { - SetHitDamage(GetHitDamage() + CalculatePctF(GetHitDamage(),GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK))); + SetHitDamage(CalculatePctN(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue())); } void Register() @@ -397,8 +400,7 @@ class spell_warr_bloodthirst : public SpellScriptLoader void HandleDummy(SpellEffIndex /* effIndex */) { int32 damage = GetEffectValue(); - if (GetHitUnit()) - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_BLOODTHIRST, &damage, NULL, NULL, true, NULL); + GetCaster()->CastCustomSpell(GetCaster(), SPELL_BLOODTHIRST, &damage, NULL, NULL, true, NULL); } void Register() @@ -413,6 +415,51 @@ class spell_warr_bloodthirst : public SpellScriptLoader } }; +enum Overpower +{ + SPELL_UNRELENTING_ASSAULT_RANK_1 = 46859, + SPELL_UNRELENTING_ASSAULT_RANK_2 = 46860, + SPELL_UNRELENTING_ASSAULT_TRIGGER_1 = 64849, + SPELL_UNRELENTING_ASSAULT_TRIGGER_2 = 64850, +}; + +class spell_warr_overpower : public SpellScriptLoader +{ +public: + spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { } + + class spell_warr_overpower_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_overpower_SpellScript); + + void HandleEffect(SpellEffIndex /* effIndex */) + { + uint32 spellId = 0; + if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_1)) + spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_1; + else if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_2)) + spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_2; + + if (!spellId) + return; + + if (Player* target = GetHitPlayer()) + if (target->HasUnitState(UNIT_STATE_CASTING)) + target->CastSpell(target, spellId, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_overpower_SpellScript(); + } +}; + void AddSC_warrior_spell_scripts() { new spell_warr_last_stand(); @@ -424,4 +471,5 @@ void AddSC_warrior_spell_scripts() new spell_warr_execute(); new spell_warr_concussion_blow(); new spell_warr_bloodthirst(); + new spell_warr_overpower(); } diff --git a/src/server/scripts/World/CMakeLists.txt b/src/server/scripts/World/CMakeLists.txt index 41ba775efec..f081a5225e4 100644 --- a/src/server/scripts/World/CMakeLists.txt +++ b/src/server/scripts/World/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2011 TrinityCore +# Copyright (C) 2008-2012 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/server/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp index 8f86f760775..daf0ef213d9 100644 --- a/src/server/scripts/World/areatrigger_scripts.cpp +++ b/src/server/scripts/World/areatrigger_scripts.cpp @@ -32,6 +32,7 @@ at_sholazar_waygate q12548 at_nats_landing q11209 at_bring_your_orphan_to q910 q910 q1800 q1479 q1687 q1558 q10951 q10952 at_brewfest +at_area_52_entrance EndContentData */ #include "ScriptPCH.h" @@ -251,8 +252,13 @@ class AreaTrigger_at_sholazar_waygate : public AreaTriggerScript { switch (trigger->id) { - case AT_SHOLAZAR: player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, false); break; - case AT_UNGORO: player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, false); break; + case AT_SHOLAZAR: + player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, false); + break; + + case AT_UNGORO: + player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, false); + break; } } @@ -420,6 +426,75 @@ class AreaTrigger_at_brewfest : public AreaTriggerScript std::map _triggerTimes; }; +/*###### +## at_area_52_entrance +######*/ + +enum Area52Entrance +{ + SPELL_A52_NEURALYZER = 34400, + NPC_SPOTLIGHT = 19913, + SUMMON_COOLDOWN = 5, + + AT_AREA_52_SOUTH = 4472, + AT_AREA_52_NORTH = 4466, + AT_AREA_52_WEST = 4471, + AT_AREA_52_EAST = 4422, +}; + +class AreaTrigger_at_area_52_entrance : public AreaTriggerScript +{ + public: + AreaTrigger_at_area_52_entrance() : AreaTriggerScript("at_area_52_entrance") + { + _triggerTimes[AT_AREA_52_SOUTH] = _triggerTimes[AT_AREA_52_NORTH] = _triggerTimes[AT_AREA_52_WEST] = _triggerTimes[AT_AREA_52_EAST] = 0; + } + + bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) + { + float x = 0.0f, y = 0.0f, z = 0.0f; + + if (!player->isAlive()) + return false; + + uint32 triggerId = trigger->id; + if (sWorld->GetGameTime() - _triggerTimes[trigger->id] < SUMMON_COOLDOWN) + return false; + + switch (triggerId) + { + case AT_AREA_52_EAST: + x = 3044.176f; + y = 3610.692f; + z = 143.61f; + break; + case AT_AREA_52_NORTH: + x = 3114.87f; + y = 3687.619f; + z = 143.62f; + break; + case AT_AREA_52_WEST: + x = 3017.79f; + y = 3746.806f; + z = 144.27f; + break; + case AT_AREA_52_SOUTH: + x = 2950.63f; + y = 3719.905f; + z = 143.33f; + break; + } + + player->SummonCreature(NPC_SPOTLIGHT, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 5000); + player->AddAura(SPELL_A52_NEURALYZER, player); + _triggerTimes[trigger->id] = sWorld->GetGameTime(); + return false; + } + + private: + std::map _triggerTimes; +}; + void AddSC_areatrigger_scripts() { new AreaTrigger_at_coilfang_waterfall(); @@ -431,4 +506,5 @@ void AddSC_areatrigger_scripts() new AreaTrigger_at_nats_landing(); new AreaTrigger_at_bring_your_orphan_to(); new AreaTrigger_at_brewfest(); + new AreaTrigger_at_area_52_entrance(); } diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 9f652e7a859..045dea9c9a9 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -198,7 +198,7 @@ class npc_dream_fog : public CreatureScript me->GetMotionMaster()->MoveRandom(25.0f); } // Seeping fog movement is slow enough for a player to be able to walk backwards and still outpace it - me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(true); me->SetSpeed(MOVE_WALK, 0.75f); } else @@ -371,7 +371,7 @@ class boss_ysondre : public CreatureScript { Talk(SAY_YSONDRE_SUMMON_DRUIDS); - for (uint8 i = 0 ; i < 10 ; ++i) + for (uint8 i = 0; i < 10; ++i) DoCast(me, SPELL_SUMMON_DRUID_SPIRITS, true); ++_stage; } diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 3dfc85d7eb4..790a9d0f814 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -34,7 +34,6 @@ go_tablet_of_madness go_tablet_of_the_seven go_tele_to_dalaran_crystal go_tele_to_violet_stand -go_rusty_cage go_scourge_cage go_jotunheim_cage go_table_theka @@ -44,7 +43,6 @@ go_ethereal_teleport_pad go_soulwell go_dragonflayer_cage go_tadpole_cage -go_black_cage go_amberpine_outhouse go_hive_pod go_gjalerbron_cage @@ -68,7 +66,7 @@ class go_cat_figurine : public GameObjectScript public: go_cat_figurine() : GameObjectScript("go_cat_figurine") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); return false; @@ -83,12 +81,12 @@ class go_northern_crystal_pylon : public GameObjectScript public: go_northern_crystal_pylon() : GameObjectScript("go_northern_crystal_pylon") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) + if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) { - player->PrepareQuestMenu(pGO->GetGUID()); - player->SendPreparedQuest(pGO->GetGUID()); + player->PrepareQuestMenu(go->GetGUID()); + player->SendPreparedQuest(go->GetGUID()); } if (player->GetQuestStatus(4285) == QUEST_STATUS_INCOMPLETE) @@ -103,12 +101,12 @@ class go_eastern_crystal_pylon : public GameObjectScript public: go_eastern_crystal_pylon() : GameObjectScript("go_eastern_crystal_pylon") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) + if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) { - player->PrepareQuestMenu(pGO->GetGUID()); - player->SendPreparedQuest(pGO->GetGUID()); + player->PrepareQuestMenu(go->GetGUID()); + player->SendPreparedQuest(go->GetGUID()); } if (player->GetQuestStatus(4287) == QUEST_STATUS_INCOMPLETE) @@ -123,12 +121,12 @@ class go_western_crystal_pylon : public GameObjectScript public: go_western_crystal_pylon() : GameObjectScript("go_western_crystal_pylon") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) + if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) { - player->PrepareQuestMenu(pGO->GetGUID()); - player->SendPreparedQuest(pGO->GetGUID()); + player->PrepareQuestMenu(go->GetGUID()); + player->SendPreparedQuest(go->GetGUID()); } if (player->GetQuestStatus(4288) == QUEST_STATUS_INCOMPLETE) @@ -147,12 +145,11 @@ class go_barov_journal : public GameObjectScript public: go_barov_journal() : GameObjectScript("go_barov_journal") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) - { player->CastSpell(player, 26095, false); - } + return true; } }; @@ -166,12 +163,11 @@ class go_field_repair_bot_74A : public GameObjectScript public: go_field_repair_bot_74A() : GameObjectScript("go_field_repair_bot_74A") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->HasSkill(SKILL_ENGINEERING) && player->GetBaseSkillValue(SKILL_ENGINEERING) >= 300 && !player->HasSpell(22704)) - { player->CastSpell(player, 22864, false); - } + return true; } }; @@ -190,9 +186,9 @@ class go_gilded_brazier : public GameObjectScript public: go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) { if (player->GetQuestStatus(9678) == QUEST_STATUS_INCOMPLETE) { @@ -213,7 +209,7 @@ class go_orb_of_command : public GameObjectScript public: go_orb_of_command() : GameObjectScript("go_orb_of_command") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->GetQuestRewardStatus(7761)) player->CastSpell(player, 23460, true); @@ -231,12 +227,11 @@ class go_tablet_of_madness : public GameObjectScript public: go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) - { player->CastSpell(player, 24267, false); - } + return true; } }; @@ -251,9 +246,9 @@ public: go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { } //TODO: use gossip option ("Transcript the Tablet") instead, if Trinity adds support. - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) return true; if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) @@ -272,10 +267,10 @@ class go_jump_a_tron : public GameObjectScript public: go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 33382, true); + player->CastSpell(player, 33382, true); return true; } @@ -306,12 +301,11 @@ class go_ethereum_prison : public GameObjectScript public: go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { int Random = rand() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); - if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], - pGO->GetPositionX(), pGO->GetPositionY(), pGO->GetPositionZ(), pGO->GetAngle(player), + if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { if (!creature->IsHostileTo(player)) @@ -356,12 +350,11 @@ class go_ethereum_stasis : public GameObjectScript public: go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { int Random = rand() % (sizeof(NpcStasisEntry) / sizeof(uint32)); - player->SummonCreature(NpcStasisEntry[Random], - pGO->GetPositionX(), pGO->GetPositionY(), pGO->GetPositionZ(), pGO->GetAngle(player), + player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); return false; @@ -382,10 +375,10 @@ class go_resonite_cask : public GameObjectScript public: go_resonite_cask() : GameObjectScript("go_resonite_cask") { } - bool OnGossipHello(Player* /*player*/, GameObject* pGO) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - pGO->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); return false; } @@ -402,9 +395,9 @@ class go_sacred_fire_of_life : public GameObjectScript public: go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); return true; @@ -430,14 +423,14 @@ class go_shrine_of_the_birds : public GameObjectScript public: go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { uint32 BirdEntry = 0; float fX, fY, fZ; - pGO->GetClosePoint(fX, fY, fZ, pGO->GetObjectSize(), INTERACTION_DISTANCE); + go->GetClosePoint(fX, fY, fZ, go->GetObjectSize(), INTERACTION_DISTANCE); - switch (pGO->GetEntry()) + switch (go->GetEntry()) { case GO_SHRINE_HAWK: BirdEntry = NPC_HAWK_GUARD; @@ -451,7 +444,7 @@ public: } if (BirdEntry) - player->SummonCreature(BirdEntry, fX, fY, fZ, pGO->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + player->SummonCreature(BirdEntry, fX, fY, fZ, go->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); return false; } @@ -473,7 +466,7 @@ class go_southfury_moonstone : public GameObjectScript public: go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); @@ -496,19 +489,18 @@ enum eDalaranCrystal }; #define GO_TELE_TO_DALARAN_CRYSTAL_FAILED "This teleport crystal cannot be used until the teleport crystal in Dalaran has been used at least once." + class go_tele_to_dalaran_crystal : public GameObjectScript { public: go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) - { return false; - } - else - player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + + player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); return true; } @@ -523,7 +515,7 @@ class go_tele_to_violet_stand : public GameObjectScript public: go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) return false; @@ -553,38 +545,38 @@ class go_fel_crystalforge : public GameObjectScript public: go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(pGO->GetGUID()); /* return true*/ + if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(go->GetGUID()); /* return true*/ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_TEXT, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); return true; } - bool OnGossipSelect(Player* player, GameObject* pGO, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 1: player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; - case GOSSIP_ACTION_INFO_DEF + 2: + case GOSSIP_ACTION_INFO_DEF + 2: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_TEXT, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); break; } return true; @@ -612,38 +604,38 @@ class go_bashir_crystalforge : public GameObjectScript public: go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(pGO->GetGUID()); /* return true*/ + if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(go->GetGUID()); /* return true*/ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_TEXT, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); return true; } - bool OnGossipSelect(Player* player, GameObject* pGO, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 1: player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_TEXT, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); break; } return true; @@ -676,9 +668,9 @@ class go_matrix_punchograph : public GameObjectScript public: go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - switch (pGO->GetEntry()) + switch (go->GetEntry()) { case MATRIX_PUNCHOGRAPH_3005_A: if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD, 1)) @@ -715,33 +707,6 @@ public: } }; -/*###### -## go_rusty_cage -######*/ - -enum eRustyCage -{ - NPC_GOBLIN_PRISIONER = 29466 -}; - -class go_rusty_cage : public GameObjectScript -{ -public: - go_rusty_cage() : GameObjectScript("go_rusty_cage") { } - - bool OnGossipHello(Player* player, GameObject* pGO) - { - if (Creature* pGoblinPrisoner = pGO->FindNearestCreature(NPC_GOBLIN_PRISIONER, 5.0f, true)) - { - pGO->SetGoState(GO_STATE_ACTIVE); - player->KilledMonsterCredit(NPC_GOBLIN_PRISIONER, pGoblinPrisoner->GetGUID()); - pGoblinPrisoner->DisappearAndDie(); - } - - return true; - } -}; - /*###### ## go_scourge_cage ######*/ @@ -756,11 +721,11 @@ class go_scourge_cage : public GameObjectScript public: go_scourge_cage() : GameObjectScript("go_scourge_cage") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (Creature* pNearestPrisoner = pGO->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) { - pGO->SetGoState(GO_STATE_ACTIVE); + go->SetGoState(GO_STATE_ACTIVE); player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); pNearestPrisoner->DisappearAndDie(); } @@ -784,15 +749,15 @@ class go_arcane_prison : public GameObjectScript public: go_arcane_prison() : GameObjectScript("go_arcane_prison") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) { - pGO->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); + go->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); return true; - } else - return false; + } + return false; } }; @@ -807,9 +772,9 @@ class go_blood_filled_orb : public GameObjectScript public: go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - if (pGO->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); return true; @@ -838,17 +803,17 @@ class go_jotunheim_cage : public GameObjectScript public: go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - Creature* pPrisoner = pGO->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); + Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); if (!pPrisoner) { - pPrisoner = pGO->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); + pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); if (!pPrisoner) { - pPrisoner = pGO->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); if (!pPrisoner) - pPrisoner = pGO->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); + pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); } } if (!pPrisoner || !pPrisoner->isAlive()) @@ -887,12 +852,12 @@ class go_table_theka : public GameObjectScript public: go_table_theka() : GameObjectScript("go_table_theka") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); - player->SEND_GOSSIP_MENU(GOSSIP_TABLE_THEKA, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_TABLE_THEKA, go->GetGUID()); return true; } @@ -913,7 +878,7 @@ class go_inconspicuous_landmark : public GameObjectScript public: go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } - bool OnGossipHello(Player* player, GameObject* /*pGO*/) + bool OnGossipHello(Player* player, GameObject* /*go*/) { if (player->HasItemCount(ITEM_CUERGOS_KEY, 1)) return false; @@ -939,12 +904,12 @@ class go_ethereal_teleport_pad : public GameObjectScript public: go_ethereal_teleport_pad() : GameObjectScript("go_ethereal_teleport_pad") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK, 1)) return false; - pGO->SummonCreature(NPC_IMAGE_WIND_TRADER, pGO->GetPositionX(), pGO->GetPositionY(), pGO->GetPositionZ(), pGO->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + go->SummonCreature(NPC_IMAGE_WIND_TRADER, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); return true; } @@ -959,9 +924,9 @@ class go_soulwell : public GameObjectScript public: go_soulwell() : GameObjectScript("go_soulwell") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - Unit* caster = pGO->GetOwner(); + Unit* caster = go->GetOwner(); if (!caster || caster->GetTypeId() != TYPEID_PLAYER) return true; @@ -972,7 +937,7 @@ public: // GO scripting with at least On Create and On Update events, the other options are no less // ugly and hacky. uint32 newSpell = 0; - if (pGO->GetEntry() == 193169) // Soulwell for rank 2 + if (go->GetEntry() == 193169) // Soulwell for rank 2 { if (caster->HasAura(18693)) // Improved Healthstone rank 2 newSpell = 58898; @@ -980,7 +945,7 @@ public: newSpell = 58896; else newSpell = 58890; } - else if (pGO->GetEntry() == 181621) // Soulwell for rank 1 + else if (go->GetEntry() == 181621) // Soulwell for rank 1 { if (caster->HasAura(18693)) // Improved Healthstone rank 2 newSpell = 34150; @@ -989,7 +954,7 @@ public: else newSpell = 34130; } - pGO->AddUse(); + go->AddUse(); player->CastSpell(player, newSpell, true); return true; } @@ -1014,20 +979,20 @@ class go_dragonflayer_cage : public GameObjectScript public: go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) return true; - Creature* pPrisoner = pGO->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); + Creature* pPrisoner = go->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); if (!pPrisoner) { - pPrisoner = pGO->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); + pPrisoner = go->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); if (!pPrisoner) { - pPrisoner = pGO->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + pPrisoner = go->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); if (!pPrisoner) - pPrisoner = pGO->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + pPrisoner = go->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); } } @@ -1061,14 +1026,14 @@ class go_tadpole_cage : public GameObjectScript public: go_tadpole_cage() : GameObjectScript("go_tadpole_cage") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE) { - Creature* pTadpole = pGO->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f); + Creature* pTadpole = go->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f); if (pTadpole) { - pGO->UseDoorOrButton(); + go->UseDoorOrButton(); pTadpole->DisappearAndDie(); player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE, 0); //FIX: Summon minion tadpole @@ -1078,43 +1043,6 @@ public: } }; -/*###### -## Quest 14096 & 14142: You've Really Done It This Time, Kul -## go_black_cage -######*/ - -enum eReallyDoneItThisTime -{ - QUEST_ALLIANCE_YOU_VE_REALLY_DONE_IT_THIS_TIME_KUL = 14096, - QUEST_HORDE_YOU_VE_REALLY_DONE_IT_THIS_TIME_KUL = 14142, - NPC_CAPTIVE_ASPIRANT = 34716, - NPC_KUL = 34956 -}; - -class go_black_cage : public GameObjectScript -{ -public: - go_black_cage() : GameObjectScript("go_black_cage") { } - - bool OnGossipHello(Player* player, GameObject* pGO) - { - if ((player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestStatus(QUEST_ALLIANCE_YOU_VE_REALLY_DONE_IT_THIS_TIME_KUL) == QUEST_STATUS_INCOMPLETE) || - (player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_HORDE_YOU_VE_REALLY_DONE_IT_THIS_TIME_KUL) == QUEST_STATUS_INCOMPLETE)) - { - Creature* pPrisoner = pGO->FindNearestCreature(NPC_CAPTIVE_ASPIRANT, 1.0f); - if (!pPrisoner) - pPrisoner = pGO->FindNearestCreature(NPC_KUL, 1.0f); - if (pPrisoner) - { - pGO->UseDoorOrButton(); - pPrisoner->DisappearAndDie(); - player->KilledMonsterCredit(pPrisoner->GetEntry(), 0); - } - } - return true; - } -}; - /*###### ## go_amberpine_outhouse ######*/ @@ -1139,35 +1067,35 @@ class go_amberpine_outhouse : public GameObjectScript public: go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(GOSSIP_OUTHOUSE_VACANT, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_OUTHOUSE_VACANT, go->GetGUID()); return true; } else - player->SEND_GOSSIP_MENU(GOSSIP_OUTHOUSE_INUSE, pGO->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_OUTHOUSE_INUSE, go->GetGUID()); return true; } - bool OnGossipSelect(Player* player, GameObject* pGO, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF +1) + if (action == GOSSIP_ACTION_INFO_DEF +1) { player->CLOSE_GOSSIP_MENU(); Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); if (target) { target->AI()->SetData(1, player->getGender()); - pGO->CastSpell(target, SPELL_INDISPOSED_III); + go->CastSpell(target, SPELL_INDISPOSED_III); } - pGO->CastSpell(player, SPELL_INDISPOSED); + go->CastSpell(player, SPELL_INDISPOSED); if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER, 1)) - pGO->CastSpell(player, SPELL_CREATE_AMBERSEEDS); + go->CastSpell(player, SPELL_CREATE_AMBERSEEDS); return true; } else @@ -1195,11 +1123,11 @@ class go_hive_pod : public GameObjectScript public: go_hive_pod() : GameObjectScript("go_hive_pod") { } - bool OnGossipHello(Player* player, GameObject* pGO) + bool OnGossipHello(Player* player, GameObject* go) { - player->SendLoot(pGO->GetGUID(), LOOT_CORPSE); - pGO->SummonCreature(NPC_HIVE_AMBUSHER, pGO->GetPositionX()+1, pGO->GetPositionY(), pGO->GetPositionZ(), pGO->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - pGO->SummonCreature(NPC_HIVE_AMBUSHER, pGO->GetPositionX(), pGO->GetPositionY()+1, pGO->GetPositionZ(), pGO->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + player->SendLoot(go->GetGUID(), LOOT_CORPSE); + go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); return true; } }; @@ -1246,7 +1174,7 @@ class go_gjalerbron_cage : public GameObjectScript player->KilledMonsterCredit(NPC_GJALERBRON_PRISONER, 0); prisoner->AI()->Talk(SAY_FREE); - prisoner->ForcedDespawn(6000); + prisoner->DespawnOrUnsummon(6000); } } return true; @@ -1273,7 +1201,7 @@ class go_large_gjalerbron_cage : public GameObjectScript { go->UseDoorOrButton(); player->KilledMonsterCredit(NPC_GJALERBRON_PRISONER, (*itr)->GetGUID()); - (*itr)->ForcedDespawn(6000); + (*itr)->DespawnOrUnsummon(6000); (*itr)->AI()->Talk(SAY_FREE); } } @@ -1307,7 +1235,7 @@ class go_veil_skith_cage : public GameObjectScript { go->UseDoorOrButton(); player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); - (*itr)->ForcedDespawn(5000); + (*itr)->DespawnOrUnsummon(5000); (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); (*itr)->AI()->Talk(SAY_FREE_0); (*itr)->GetMotionMaster()->Clear(); @@ -1341,7 +1269,6 @@ void AddSC_go_scripts() new go_fel_crystalforge; new go_bashir_crystalforge; new go_matrix_punchograph; - new go_rusty_cage; new go_scourge_cage; new go_arcane_prison; new go_blood_filled_orb; @@ -1352,7 +1279,6 @@ void AddSC_go_scripts() new go_soulwell; new go_tadpole_cage; new go_dragonflayer_cage; - new go_black_cage; new go_amberpine_outhouse; new go_hive_pod; new go_massive_seaforium_charge; diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp index 9bc511931b9..e3100522fbe 100644 --- a/src/server/scripts/World/guards.cpp +++ b/src/server/scripts/World/guards.cpp @@ -177,7 +177,6 @@ public: //Set our global cooldown globalCooldown = GENERIC_CREATURE_COOLDOWN; - } //If no spells available and we arn't moving run to target else if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE) { @@ -196,12 +195,26 @@ public: { switch (emote) { - case TEXT_EMOTE_KISS: me->HandleEmoteCommand(EMOTE_ONESHOT_BOW); break; - case TEXT_EMOTE_WAVE: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break; - case TEXT_EMOTE_SALUTE: me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); break; - case TEXT_EMOTE_SHY: me->HandleEmoteCommand(EMOTE_ONESHOT_FLEX); break; + case TEXT_EMOTE_KISS: + me->HandleEmoteCommand(EMOTE_ONESHOT_BOW); + break; + + case TEXT_EMOTE_WAVE: + me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); + break; + + case TEXT_EMOTE_SALUTE: + me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); + break; + + case TEXT_EMOTE_SHY: + me->HandleEmoteCommand(EMOTE_ONESHOT_FLEX); + break; + case TEXT_EMOTE_RUDE: - case TEXT_EMOTE_CHICKEN: me->HandleEmoteCommand(EMOTE_ONESHOT_POINT); break; + case TEXT_EMOTE_CHICKEN: + me->HandleEmoteCommand(EMOTE_ONESHOT_POINT); + break; } } diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 165ef9f18b1..ae69744ea2b 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -47,9 +47,9 @@ class item_only_for_flight : public ItemScript public: item_only_for_flight() : ItemScript("item_only_for_flight") { } - bool OnUse(Player* player, Item* pItem, SpellCastTargets const& /*targets*/) + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) { - uint32 itemId = pItem->GetEntry(); + uint32 itemId = item->GetEntry(); bool disabled = false; //for special scripts @@ -64,8 +64,8 @@ public: disabled = true; break; case 34475: - if (const SpellInfo* pSpellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES)) - Spell::SendCastResult(player, pSpellInfo, 1, SPELL_FAILED_NOT_ON_GROUND); + if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES)) + Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_ON_GROUND); break; } @@ -74,7 +74,7 @@ public: return false; // error - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pItem, NULL); + player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); return true; } }; @@ -94,6 +94,7 @@ public: { if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY()+20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) nether->AI()->AttackStart(player); + if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY()-20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) nether->AI()->AttackStart(player); } @@ -110,13 +111,13 @@ class item_gor_dreks_ointment : public ItemScript public: item_gor_dreks_ointment() : ItemScript("item_gor_dreks_ointment") { } - bool OnUse(Player* player, Item* pItem, SpellCastTargets const& targets) + bool OnUse(Player* player, Item* item, SpellCastTargets const& targets) { if (targets.GetUnitTarget() && targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT && targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578)) return false; - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pItem, NULL); + player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); return true; } }; @@ -130,13 +131,13 @@ class item_incendiary_explosives : public ItemScript public: item_incendiary_explosives() : ItemScript("item_incendiary_explosives") { } - bool OnUse(Player* player, Item* pItem, SpellCastTargets const & /*targets*/) + bool OnUse(Player* player, Item* item, SpellCastTargets const & /*targets*/) { if (player->FindNearestCreature(26248, 15) || player->FindNearestCreature(26249, 15)) return false; else { - player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, pItem, NULL); + player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL); return true; } } @@ -150,6 +151,7 @@ class item_mysterious_egg : public ItemScript { public: item_mysterious_egg() : ItemScript("item_mysterious_egg") { } + bool OnExpire(Player* player, ItemTemplate const* /*pItemProto*/) { ItemPosCountVec dest; @@ -219,7 +221,7 @@ class item_pile_fake_furs : public ItemScript public: item_pile_fake_furs() : ItemScript("item_pile_fake_furs") { } - bool OnUse(Player* player, Item* /*pItem*/, SpellCastTargets const & /*targets*/) + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const & /*targets*/) { GameObject* go = NULL; for (uint8 i = 0; i < CaribouTrapsNum; ++i) @@ -264,17 +266,17 @@ class item_petrov_cluster_bombs : public ItemScript public: item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { } - bool OnUse(Player* player, Item* pItem, const SpellCastTargets & /*pTargets*/) + bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/) { if (player->GetZoneId() != ZONE_ID_HOWLING) return false; if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS) { - player->SendEquipError(EQUIP_ERR_NONE, pItem, NULL); + player->SendEquipError(EQUIP_ERR_NONE, item, NULL); - if (const SpellInfo* pSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB)) - Spell::SendCastResult(player, pSpellInfo, 1, SPELL_FAILED_NOT_HERE); + if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB)) + Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE); return true; } @@ -330,17 +332,16 @@ class item_dehta_trap_smasher : public ItemScript public: item_dehta_trap_smasher() : ItemScript("item_dehta_trap_smasher") { } - bool OnUse(Player* player, Item* /*pItem*/, const SpellCastTargets & /*pTargets*/) + bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/) { if (player->GetQuestStatus(QUEST_CANNOT_HELP_THEMSELVES) != QUEST_STATUS_INCOMPLETE) return false; - Creature* pMammoth; - pMammoth = player->FindNearestCreature(NPC_TRAPPED_MAMMOTH_CALF, 5.0f); + Creature* pMammoth = player->FindNearestCreature(NPC_TRAPPED_MAMMOTH_CALF, 5.0f); if (!pMammoth) return false; - GameObject* pTrap; + GameObject* pTrap = NULL; for (uint8 i = 0; i < MammothTrapsNum; ++i) { pTrap = player->FindNearestGameObject(MammothTraps[i], 11.0f); @@ -367,7 +368,7 @@ class item_trident_of_nazjan : public ItemScript public: item_trident_of_nazjan() : ItemScript("item_Trident_of_Nazjan") { } - bool OnUse(Player* player, Item* pItem, const SpellCastTargets & /*pTargets*/) + bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/) { if (player->GetQuestStatus(QUEST_THE_EMISSARY) == QUEST_STATUS_INCOMPLETE) { @@ -376,9 +377,9 @@ public: pLeviroth->AI()->AttackStart(player); return false; } else - player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, pItem, NULL); + player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pItem, NULL); + player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); return true; } }; @@ -394,17 +395,17 @@ class item_captured_frog : public ItemScript public: item_captured_frog() : ItemScript("item_captured_frog") { } - bool OnUse(Player* player, Item* pItem, SpellCastTargets const& /*targets*/) + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) { if (player->GetQuestStatus(QUEST_THE_PERFECT_SPIES) == QUEST_STATUS_INCOMPLETE) { if (player->FindNearestCreature(NPC_VANIRAS_SENTRY_TOTEM, 10.0f)) return false; else - player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, pItem, NULL); + player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pItem, NULL); + player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); return true; } }; diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp index 3a61b9f9e18..208effee61b 100644 --- a/src/server/scripts/World/mob_generic_creature.cpp +++ b/src/server/scripts/World/mob_generic_creature.cpp @@ -34,7 +34,7 @@ public: struct generic_creatureAI : public ScriptedAI { - generic_creatureAI(Creature* c) : ScriptedAI(c) {} + generic_creatureAI(Creature* creature) : ScriptedAI(creature) {} uint32 GlobalCooldown; //This variable acts like the global cooldown that players have (1.5 seconds) uint32 BuffTimer; //This variable keeps track of buffs @@ -105,7 +105,7 @@ public: else info = SelectSpell(me->getVictim(), 0, 0, SELECT_TARGET_ANY_ENEMY, 0, 0, 0, 0, SELECT_EFFECT_DONTCARE); //50% chance if elite or higher, 20% chance if not, to replace our white hit with a spell - if (info && (rand() % (me->GetCreatureInfo()->rank > 1 ? 2 : 5) == 0) && !GlobalCooldown) + if (info && (rand() % (me->GetCreatureTemplate()->rank > 1 ? 2 : 5) == 0) && !GlobalCooldown) { //Cast the spell if (Healing)DoCastSpell(me, info); @@ -174,7 +174,7 @@ public: struct trigger_periodicAI : public NullCreatureAI { - trigger_periodicAI(Creature* c) : NullCreatureAI(c) + trigger_periodicAI(Creature* creature) : NullCreatureAI(creature) { spell = me->m_spells[0] ? sSpellMgr->GetSpellInfo(me->m_spells[0]) : NULL; interval = me->GetAttackTime(BASE_ATTACK); @@ -210,7 +210,7 @@ public: struct trigger_deathAI : public NullCreatureAI { - trigger_deathAI(Creature* c) : NullCreatureAI(c) {} + trigger_deathAI(Creature* creature) : NullCreatureAI(creature) {} void JustDied(Unit* killer) { if (me->m_spells[0]) diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp index 334eb48cb05..fb7c0833d22 100644 --- a/src/server/scripts/World/npc_innkeeper.cpp +++ b/src/server/scripts/World/npc_innkeeper.cpp @@ -79,10 +79,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID && IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + if (action == GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID && IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); @@ -116,7 +116,7 @@ public: player->CLOSE_GOSSIP_MENU(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break; case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break; diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 336e232236d..2afa80dd42c 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -83,11 +83,8 @@ there is no difference here (except that default text is chosen with `gameobject #define BOX_UNLEARN_WEAPON_SPEC "Do you really want to unlearn your weaponsmith specialty and lose all associated recipes? \n Cost: " -#define GOSSIP_LEARN_DRAGON "I am absolutely certain that i want to learn dragonscale leatherworking" #define GOSSIP_UNLEARN_DRAGON "I wish to unlearn Dragonscale Leatherworking" -#define GOSSIP_LEARN_ELEMENTAL "I am absolutely certain that i want to learn elemental leatherworking" #define GOSSIP_UNLEARN_ELEMENTAL "I wish to unlearn Elemental Leatherworking" -#define GOSSIP_LEARN_TRIBAL "I am absolutely certain that i want to learn tribal leatherworking" #define GOSSIP_UNLEARN_TRIBAL "I wish to unlearn Tribal Leatherworking" #define BOX_UNLEARN_LEATHER_SPEC "Do you really want to unlearn your leatherworking specialty and lose all associated recipes? \n Cost: " @@ -101,9 +98,6 @@ there is no difference here (except that default text is chosen with `gameobject #define BOX_UNLEARN_TAILOR_SPEC "Do you really want to unlearn your tailoring specialty and lose all associated recipes? \n Cost: " -#define GOSSIP_LEARN_GOBLIN "I am absolutely certain that i want to learn Goblin engineering" -#define GOSSIP_LEARN_GNOMISH "I am absolutely certain that i want to learn Gnomish engineering" - /*### # spells defines ###*/ @@ -213,7 +207,7 @@ int32 DoLowUnlearnCost(Player* player) //blacksmith return 100000; } -void ProcessCastAction(Player* player, Creature* creature, uint32 spellId, uint32 triggeredSpellId, int32 cost) +void ProcessCastaction(Player* player, Creature* creature, uint32 spellId, uint32 triggeredSpellId, int32 cost) { if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney(cost)) { @@ -241,14 +235,14 @@ bool EquippedOk(Player* player, uint32 spellId) if (!reqSpell) continue; - Item* pItem; + Item* item = NULL; for (uint8 j = EQUIPMENT_SLOT_START; j < EQUIPMENT_SLOT_END; ++j) { - pItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, j); - if (pItem && pItem->GetTemplate()->RequiredSpell == reqSpell) + item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, j); + if (item && item->GetTemplate()->RequiredSpell == reqSpell) { //player has item equipped that require specialty. Not allow to unlearn, player has to unequip first - sLog->outDebug(LOG_FILTER_TSCR, "TSCR: player attempt to unlearn spell %u, but item %u is equipped.", reqSpell, pItem->GetEntry()); + sLog->outDebug(LOG_FILTER_TSCR, "TSCR: player attempt to unlearn spell %u, but item %u is equipped.", reqSpell, item->GetEntry()); return false; } } @@ -387,8 +381,10 @@ public: { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); + if (creature->isVendor()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (creature->isTrainer()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); @@ -424,9 +420,9 @@ public: return true; } - void SendActionMenu(Player* player, Creature* creature, uint32 uiAction) + void SendActionMenu(Player* player, Creature* creature, uint32 action) { - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); @@ -436,45 +432,45 @@ public: break; //Learn Alchemy case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastAction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); + ProcessCastaction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastAction(player, creature, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player)); + ProcessCastaction(player, creature, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastAction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player)); + ProcessCastaction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player)); break; //Unlearn Alchemy case GOSSIP_ACTION_INFO_DEF + 4: - ProcessCastAction(player, creature, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player)); + ProcessCastaction(player, creature, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 5: - ProcessCastAction(player, creature, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player)); + ProcessCastaction(player, creature, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 6: - ProcessCastAction(player, creature, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player)); + ProcessCastaction(player, creature, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player)); break; } } - void SendConfirmLearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmLearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { case 22427: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 19052: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 17909: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -482,24 +478,24 @@ public: } } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { case 22427: //Zarevhi - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 19052: //Lorokeem - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 17909: //Lauranna Thar'well - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -507,15 +503,26 @@ public: } } - bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiSender) + switch (sender) { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, creature, uiAction); break; - case GOSSIP_SENDER_LEARN: SendConfirmLearn(player, creature, uiAction); break; - case GOSSIP_SENDER_UNLEARN: SendConfirmUnlearn(player, creature, uiAction); break; - case GOSSIP_SENDER_CHECK: SendActionMenu(player, creature, uiAction); break; + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, creature, action); + break; + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, creature, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, creature, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, creature, action); + break; } return true; } @@ -539,16 +546,18 @@ public: { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); + if (creature->isVendor()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (creature->isTrainer()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - uint32 eCreature = creature->GetEntry(); + uint32 creatureId = creature->GetEntry(); //WEAPONSMITH & ARMORSMITH if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) { - switch (eCreature) + switch (creatureId) { case 11145: //Myolor Sunderfury case 11176: //Krathok Moltenfist @@ -572,7 +581,7 @@ public: //WEAPONSMITH SPEC if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) { - switch (eCreature) + switch (creatureId) { case 11191: //Lilith the Lithe if (!HasWeaponSub(player)) @@ -599,9 +608,9 @@ public: return true; } - void SendActionMenu(Player* player, Creature* creature, uint32 uiAction) + void SendActionMenu(Player* player, Creature* creature, uint32 action) { - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); @@ -665,24 +674,24 @@ public: } } - void SendConfirmLearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmLearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { case 11191: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); //unknown textID (TALK_HAMMER_LEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 11192: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); //unknown textID (TALK_AXE_LEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 11193: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); //unknown textID (TALK_SWORD_LEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -690,9 +699,9 @@ public: } } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { @@ -700,23 +709,23 @@ public: case 11178: //Borgosh Corebender case 5164: //Grumnus Steelshaper case 11177: //Okothos Ironrager - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); //unknown textID (TALK_UNLEARN_AXEORWEAPON) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 11191: - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); //unknown textID (TALK_HAMMER_UNLEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 11192: - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); //unknown textID (TALK_AXE_UNLEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 11193: - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); //unknown textID (TALK_SWORD_UNLEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -724,15 +733,26 @@ public: } } - bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiSender) + switch (sender) { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, creature, uiAction); break; - case GOSSIP_SENDER_LEARN: SendConfirmLearn(player, creature, uiAction); break; - case GOSSIP_SENDER_UNLEARN: SendConfirmUnlearn(player, creature, uiAction); break; - case GOSSIP_SENDER_CHECK: SendActionMenu(player, creature, uiAction); break; + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, creature, action); + break; + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, creature, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, creature, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, creature, action); + break; } return true; } @@ -763,7 +783,6 @@ enum eEngineeringTrinkets #define GOSSIP_ITEM_ZAP "[PH] Unknown" #define GOSSIP_ITEM_JHORDY "I must build a beacon for this marvelous device!" #define GOSSIP_ITEM_KABLAM "[PH] Unknown" -#define GOSSIP_ITEM_SMILES "[PH] Unknown" class npc_engineering_tele_trinket : public CreatureScript { @@ -824,16 +843,16 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) player->CLOSE_GOSSIP_MENU(); - if (uiSender != creature->GetEntry()) + if (sender != creature->GetEntry()) return true; - switch (uiSender) + switch (sender) { case NPC_ZAP: player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); @@ -866,8 +885,10 @@ public: { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); + if (creature->isVendor()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (creature->isTrainer()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); @@ -897,9 +918,9 @@ public: return true; } - void SendActionMenu(Player* player, Creature* creature, uint32 uiAction) + void SendActionMenu(Player* player, Creature* creature, uint32 action) { - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); @@ -920,27 +941,27 @@ public: } } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { case 7866: //Peter Galen case 7867: //Thorkaf Dragoneye - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 7868: //Sarah Tanner case 7869: //Brumn Winterhoof - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 7870: //Caryssia Moonhunter case 7871: //Se'Jib - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -948,14 +969,22 @@ public: } } - bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiSender) + switch (sender) { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, creature, uiAction); break; - case GOSSIP_SENDER_UNLEARN: SendConfirmUnlearn(player, creature, uiAction); break; - case GOSSIP_SENDER_CHECK: SendActionMenu(player, creature, uiAction); break; + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, creature, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, creature, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, creature, action); + break; } return true; } @@ -979,8 +1008,10 @@ public: { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); + if (creature->isVendor()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (creature->isTrainer()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); @@ -1017,9 +1048,9 @@ public: return true; } - void SendActionMenu(Player* player, Creature* creature, uint32 uiAction) + void SendActionMenu(Player* player, Creature* creature, uint32 action) { - switch (uiAction) + switch (action) { case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); @@ -1029,13 +1060,13 @@ public: break; //Learn Tailor case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastAction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); + ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastAction(player, creature, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); + ProcessCastaction(player, creature, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastAction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); + ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); break; //Unlearn Tailor case GOSSIP_ACTION_INFO_DEF + 4: @@ -1050,24 +1081,24 @@ public: } } - void SendConfirmLearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmLearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { case 22213: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 22208: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 22212: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, uiAction); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -1075,24 +1106,24 @@ public: } } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 uiAction) + void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) { - if (uiAction) + if (action) { switch (creature->GetEntry()) { case 22213: //Gidge Spellweaver - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 22208: //Nasmara Moonsong - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case 22212: //Andrion Darkspinner - player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, uiAction, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; @@ -1100,29 +1131,36 @@ public: } } - bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiSender) + switch (sender) { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, creature, uiAction); break; - case GOSSIP_SENDER_LEARN: SendConfirmLearn(player, creature, uiAction); break; - case GOSSIP_SENDER_UNLEARN: SendConfirmUnlearn(player, creature, uiAction); break; - case GOSSIP_SENDER_CHECK: SendActionMenu(player, creature, uiAction); break; + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, creature, action); + break; + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, creature, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, creature, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, creature, action); + break; } return true; } }; -/*### -# -###*/ - void AddSC_npc_professions() { - new npc_prof_alchemy; - new npc_prof_blacksmith; - new npc_engineering_tele_trinket; - new npc_prof_leather; - new npc_prof_tailor; + new npc_prof_alchemy(); + new npc_prof_blacksmith(); + new npc_engineering_tele_trinket(); + new npc_prof_leather(); + new npc_prof_tailor(); } diff --git a/src/server/scripts/World/npc_taxi.cpp b/src/server/scripts/World/npc_taxi.cpp index aff326e152d..ceda8e0f6ac 100644 --- a/src/server/scripts/World/npc_taxi.cpp +++ b/src/server/scripts/World/npc_taxi.cpp @@ -38,7 +38,7 @@ EndScriptData #define GOSSIP_BRACK2 "Fly me to The Abyssal Shelf" #define GOSSIP_BRACK3 "Fly me to Spinebreaker Post" #define GOSSIP_IRENA "Fly me to Skettis please" -#define GOSSIP_CLOUDBREAKER1 "Speaking of uiAction, I've been ordered to undertake an air strike." +#define GOSSIP_CLOUDBREAKER1 "Speaking of action, I've been ordered to undertake an air strike." #define GOSSIP_CLOUDBREAKER2 "I need to intercept the Dawnblade reinforcements." #define GOSSIP_DRAGONHAWK "" #define GOSSIP_VERONIA "Fly me to Manaforge Coruu please" @@ -186,10 +186,10 @@ public: return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); - switch (uiAction) + switch (action) { case GOSSIP_ACTION_INFO_DEF: //spellId is correct, however it gives flight a somewhat funny effect //TaxiPath 506. @@ -201,9 +201,10 @@ public: player->ActivateTaxiPathTo(627); //TaxiPath 627 (possibly 627+628(152->153->154->155)) break; case GOSSIP_ACTION_INFO_DEF + 2: - if (!player->HasItemCount(25853, 1)) { + if (!player->HasItemCount(25853, 1)) player->SEND_GOSSIP_MENU(9780, creature->GetGUID()); - } else { + else + { player->CLOSE_GOSSIP_MENU(); player->ActivateTaxiPathTo(534); //TaxiPath 534 } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 1e1e34431a2..ecd1a439a58 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -137,8 +137,8 @@ public: if (!spawnedTemplate) { - SpawnAssoc = NULL; sLog->outErrorDb("TCSR: Creature template entry %u does not exist in DB, which is required by npc_air_force_bots", SpawnAssoc->spawnedCreatureEntry); + SpawnAssoc = NULL; return; } } @@ -315,7 +315,7 @@ public: struct npc_chicken_cluckAI : public ScriptedAI { - npc_chicken_cluckAI(Creature* c) : ScriptedAI(c) {} + npc_chicken_cluckAI(Creature* creature) : ScriptedAI(creature) {} uint32 ResetFlagTimer; @@ -407,7 +407,7 @@ public: struct npc_dancing_flamesAI : public ScriptedAI { - npc_dancing_flamesAI(Creature* c) : ScriptedAI(c) {} + npc_dancing_flamesAI(Creature* creature) : ScriptedAI(creature) {} bool Active; uint32 CanIteract; @@ -421,7 +421,7 @@ public: float x, y, z; me->GetPosition(x, y, z); me->Relocate(x, y, z + 0.94f); - me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetDisableGravity(true); me->HandleEmoteCommand(EMOTE_ONESHOT_DANCE); WorldPacket data; //send update position to client me->BuildHeartBeatMsg(&data); @@ -558,7 +558,7 @@ public: struct npc_doctorAI : public ScriptedAI { - npc_doctorAI(Creature* c) : ScriptedAI(c) {} + npc_doctorAI(Creature* creature) : ScriptedAI(creature) {} uint64 PlayerGUID; @@ -703,7 +703,7 @@ public: struct npc_injured_patientAI : public ScriptedAI { - npc_injured_patientAI(Creature* c) : ScriptedAI(c) {} + npc_injured_patientAI(Creature* creature) : ScriptedAI(creature) {} uint64 DoctorGUID; Location* Coord; @@ -764,7 +764,7 @@ public: DoScriptText(RAND(SAY_DOC1, SAY_DOC2, SAY_DOC3), me); uint32 mobId = me->GetEntry(); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetWalk(false); switch (mobId) { @@ -905,7 +905,7 @@ public: struct npc_garments_of_questsAI : public npc_escortAI { - npc_garments_of_questsAI(Creature* c) : npc_escortAI(c) {Reset();} + npc_garments_of_questsAI(Creature* creature) : npc_escortAI(creature) {Reset();} uint64 CasterGUID; @@ -1040,8 +1040,9 @@ public: } } - void WaypointReached(uint32 /*point*/) + void WaypointReached(uint32 /*waypointId*/) { + } void UpdateAI(uint32 const diff) @@ -1105,7 +1106,7 @@ public: struct npc_guardianAI : public ScriptedAI { - npc_guardianAI(Creature* c) : ScriptedAI(c) {} + npc_guardianAI(Creature* creature) : ScriptedAI(creature) {} void Reset() { @@ -1477,7 +1478,7 @@ public: struct npc_steam_tonkAI : public ScriptedAI { - npc_steam_tonkAI(Creature* c) : ScriptedAI(c) {} + npc_steam_tonkAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} void EnterCombat(Unit* /*who*/) {} @@ -1495,7 +1496,6 @@ public: else me->SetReactState(REACT_AGGRESSIVE); } - }; CreatureAI* GetAI(Creature* creature) const @@ -1513,7 +1513,7 @@ public: struct npc_tonk_mineAI : public ScriptedAI { - npc_tonk_mineAI(Creature* c) : ScriptedAI(c) + npc_tonk_mineAI(Creature* creature) : ScriptedAI(creature) { me->SetReactState(REACT_PASSIVE); } @@ -1558,7 +1558,7 @@ public: struct npc_brewfest_revelerAI : public ScriptedAI { - npc_brewfest_revelerAI(Creature* c) : ScriptedAI(c) {} + npc_brewfest_revelerAI(Creature* creature) : ScriptedAI(creature) {} void ReceiveEmote(Player* player, uint32 emote) { if (!IsHolidayActive(HOLIDAY_BREWFEST)) @@ -1594,7 +1594,7 @@ class npc_winter_reveler : public CreatureScript struct npc_winter_revelerAI : public ScriptedAI { - npc_winter_revelerAI(Creature* c) : ScriptedAI(c) {} + npc_winter_revelerAI(Creature* creature) : ScriptedAI(creature) {} void ReceiveEmote(Player* player, uint32 emote) { @@ -1639,7 +1639,7 @@ public: struct npc_snake_trap_serpentsAI : public ScriptedAI { - npc_snake_trap_serpentsAI(Creature* c) : ScriptedAI(c) {} + npc_snake_trap_serpentsAI(Creature* creature) : ScriptedAI(creature) {} uint32 SpellTimer; bool IsViper; @@ -1650,7 +1650,7 @@ public: { SpellTimer = 0; - CreatureTemplate const* Info = me->GetCreatureInfo(); + CreatureTemplate const* Info = me->GetCreatureTemplate(); IsViper = Info->Entry == C_VIPER ? true : false; @@ -1753,15 +1753,13 @@ public: struct mob_mojoAI : public ScriptedAI { - mob_mojoAI(Creature* c) : ScriptedAI(c) {Reset();} - - uint32 Hearts; - uint64 VictimGUID; - + mob_mojoAI(Creature* creature) : ScriptedAI(creature) {Reset();} + uint32 hearts; + uint64 victimGUID; void Reset() { - VictimGUID = 0; - Hearts = 15000; + victimGUID = 0; + hearts = 15000; if (Unit* own = me->GetOwner()) me->GetMotionMaster()->MoveFollow(own, 0, 0); } @@ -1772,12 +1770,11 @@ public: { if (me->HasAura(20372)) { - if (Hearts <= diff) + if (hearts <= diff) { me->RemoveAurasDueToSpell(20372); - Hearts = 15000; - } - Hearts -= diff; + hearts = 15000; + } hearts -= diff; } } @@ -1821,14 +1818,14 @@ public: } me->MonsterWhisper(whisp.c_str(), player->GetGUID()); - if (VictimGUID) - if (Player* victim = Unit::GetPlayer(*me, VictimGUID)) + if (victimGUID) + if (Player* victim = Unit::GetPlayer(*me, victimGUID)) victim->RemoveAura(43906);//remove polymorph frog thing me->AddAura(43906, player);//add polymorph frog thing - VictimGUID = player->GetGUID(); + victimGUID = player->GetGUID(); DoCast(me, 20372, true);//tag.hearts me->GetMotionMaster()->MoveFollow(player, 0, 0); - Hearts = 15000; + hearts = 15000; } } }; @@ -1846,7 +1843,7 @@ public: struct npc_mirror_imageAI : CasterAI { - npc_mirror_imageAI(Creature* c) : CasterAI(c) {} + npc_mirror_imageAI(Creature* creature) : CasterAI(creature) {} void InitializeAI() { @@ -1892,9 +1889,9 @@ public: struct npc_ebon_gargoyleAI : CasterAI { - npc_ebon_gargoyleAI(Creature* c) : CasterAI(c) {} + npc_ebon_gargoyleAI(Creature* creature) : CasterAI(creature) {} - uint32 DespawnTimer; + uint32 despawnTimer; void InitializeAI() { @@ -1903,7 +1900,7 @@ public: if (!ownerGuid) return; // Not needed to be despawned now - DespawnTimer = 0; + despawnTimer = 0; // Find victim of Summon Gargoyle spell std::list targets; Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30); @@ -1941,6 +1938,7 @@ public: me->CastSpell(me, 54661, true); me->SetReactState(REACT_PASSIVE); + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING // Fly Away me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY|MOVEMENTFLAG_ASCENDING|MOVEMENTFLAG_FLYING); me->SetSpeed(MOVE_FLIGHT, 0.75f, true); @@ -1952,15 +1950,15 @@ public: me->GetMotionMaster()->MovePoint(0, x, y, z); // Despawn as soon as possible - DespawnTimer = 4 * IN_MILLISECONDS; + despawnTimer = 4 * IN_MILLISECONDS; } void UpdateAI(const uint32 diff) { - if (DespawnTimer > 0) + if (despawnTimer > 0) { - if (DespawnTimer > diff) - DespawnTimer -= diff; + if (despawnTimer > diff) + despawnTimer -= diff; else me->DespawnOrUnsummon(); return; @@ -1977,33 +1975,31 @@ public: class npc_lightwell : public CreatureScript { -public: - npc_lightwell() : CreatureScript("npc_lightwell") { } - - struct npc_lightwellAI : public PassiveAI - { - npc_lightwellAI(Creature* c) : PassiveAI(c) {} + public: + npc_lightwell() : CreatureScript("npc_lightwell") { } - void Reset() + struct npc_lightwellAI : public PassiveAI { - DoCast(me, 59907, false); // Spell for Lightwell Charges - } + npc_lightwellAI(Creature* creature) : PassiveAI(creature) + { + DoCast(me, 59907, false); + } - void EnterEvadeMode() - { - if (!me->isAlive()) - return; + void EnterEvadeMode() + { + if (!me->isAlive()) + return; - me->DeleteThreatList(); - me->CombatStop(true); - me->ResetPlayerDamageReq(); - } - }; + me->DeleteThreatList(); + me->CombatStop(true); + me->ResetPlayerDamageReq(); + } + }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_lightwellAI(creature); - } + CreatureAI* GetAI(Creature* creature) const + { + return new npc_lightwellAI(creature); + } }; enum eTrainingDummy @@ -2021,20 +2017,20 @@ public: { npc_training_dummyAI(Creature* creature) : Scripted_NoMovementAI(creature) { - Entry = creature->GetEntry(); + entry = creature->GetEntry(); } - uint32 Entry; - uint32 ResetTimer; - uint32 DespawnTimer; + uint32 entry; + uint32 resetTimer; + uint32 despawnTimer; void Reset() { me->SetControlled(true, UNIT_STATE_STUNNED);//disable rotate me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);//imune to knock aways like blast wave - ResetTimer = 5000; - DespawnTimer = 15000; + resetTimer = 5000; + despawnTimer = 15000; } void EnterEvadeMode() @@ -2047,13 +2043,13 @@ public: void DamageTaken(Unit* /*doneBy*/, uint32& damage) { - ResetTimer = 5000; + resetTimer = 5000; damage = 0; } void EnterCombat(Unit* /*who*/) { - if (Entry != NPC_ADVANCED_TARGET_DUMMY && Entry != NPC_TARGET_DUMMY) + if (entry != NPC_ADVANCED_TARGET_DUMMY && entry != NPC_TARGET_DUMMY) return; } @@ -2065,23 +2061,23 @@ public: if (!me->HasUnitState(UNIT_STATE_STUNNED)) me->SetControlled(true, UNIT_STATE_STUNNED);//disable rotate - if (Entry != NPC_ADVANCED_TARGET_DUMMY && Entry != NPC_TARGET_DUMMY) + if (entry != NPC_ADVANCED_TARGET_DUMMY && entry != NPC_TARGET_DUMMY) { - if (ResetTimer <= diff) + if (resetTimer <= diff) { EnterEvadeMode(); - ResetTimer = 5000; + resetTimer = 5000; } else - ResetTimer -= diff; + resetTimer -= diff; return; } else { - if (DespawnTimer <= diff) + if (despawnTimer <= diff) me->DespawnOrUnsummon(); else - DespawnTimer -= diff; + despawnTimer -= diff; } } void MoveInLineOfSight(Unit* /*who*/){return;} @@ -2101,34 +2097,26 @@ public: class npc_shadowfiend : public CreatureScript { -public: - npc_shadowfiend() : CreatureScript("npc_shadowfiend") { } - - struct npc_shadowfiendAI : public ScriptedAI - { - npc_shadowfiendAI(Creature* creature) : ScriptedAI(creature) {} + public: + npc_shadowfiend() : CreatureScript("npc_shadowfiend") { } - void DamageTaken(Unit* /*killer*/, uint32& damage) + struct npc_shadowfiendAI : public ScriptedAI { - if (me->isSummon()) - if (Unit* owner = me->ToTempSummon()->GetSummoner()) - if (owner->HasAura(GLYPH_OF_SHADOWFIEND) && damage >= me->GetHealth()) - owner->CastSpell(owner, GLYPH_OF_SHADOWFIEND_MANA, true); - } + npc_shadowfiendAI(Creature* creature) : ScriptedAI(creature) {} - void UpdateAI(uint32 const /*diff*/) - { - if (!UpdateVictim()) - return; + void DamageTaken(Unit* /*killer*/, uint32& damage) + { + if (me->isSummon()) + if (Unit* owner = me->ToTempSummon()->GetSummoner()) + if (owner->HasAura(GLYPH_OF_SHADOWFIEND) && damage >= me->GetHealth()) + owner->CastSpell(owner, GLYPH_OF_SHADOWFIEND_MANA, true); + } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const + { + return new npc_shadowfiendAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_shadowfiendAI(creature); - } }; /*###### @@ -2195,7 +2183,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_fire_elementalAI(creature); } @@ -2240,7 +2228,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_earth_elementalAI(creature); } @@ -2250,78 +2238,111 @@ public: # npc_wormhole ######*/ -#define GOSSIP_ENGINEERING1 "Borean Tundra." -#define GOSSIP_ENGINEERING2 "Howling Fjord." -#define GOSSIP_ENGINEERING3 "Sholazar Basin." -#define GOSSIP_ENGINEERING4 "Icecrown." -#define GOSSIP_ENGINEERING5 "Storm Peaks." +#define GOSSIP_ENGINEERING1 "Borean Tundra" +#define GOSSIP_ENGINEERING2 "Howling Fjord" +#define GOSSIP_ENGINEERING3 "Sholazar Basin" +#define GOSSIP_ENGINEERING4 "Icecrown" +#define GOSSIP_ENGINEERING5 "Storm Peaks" +#define GOSSIP_ENGINEERING6 "Underground..." -enum eWormhole +enum WormholeSpells { - SPELL_HOWLING_FJORD = 67838, + SPELL_BOREAN_TUNDRA = 67834, SPELL_SHOLAZAR_BASIN = 67835, SPELL_ICECROWN = 67836, SPELL_STORM_PEAKS = 67837, + SPELL_HOWLING_FJORD = 67838, + SPELL_UNDERGROUND = 68081, - TEXT_WORMHOLE = 907 + TEXT_WORMHOLE = 907, + + DATA_SHOW_UNDERGROUND = 1, }; class npc_wormhole : public CreatureScript { -public: - npc_wormhole() : CreatureScript("npc_wormhole") { } + public: + npc_wormhole() : CreatureScript("npc_wormhole") {} - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isSummon()) + struct npc_wormholeAI : public PassiveAI { - if (player == creature->ToTempSummon()->GetSummoner()) + npc_wormholeAI(Creature* creature) : PassiveAI(creature) {} + + void InitializeAI() { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + _showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though + } - player->PlayerTalkClass->SendGossipMenu(TEXT_WORMHOLE, creature->GetGUID()); + uint32 GetData(uint32 type) + { + return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; } + + private: + bool _showUnderground; + }; + + bool OnGossipHello(Player* player, Creature* creature) + { + if (creature->isSummon()) + { + if (player == creature->ToTempSummon()->GetSummoner()) + { + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + + if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND)) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + + player->PlayerTalkClass->SendGossipMenu(TEXT_WORMHOLE, creature->GetGUID()); + } + } + + return true; } - return true; - } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - bool roll = urand(0, 1); + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) + { + player->PlayerTalkClass->ClearMenus(); - switch (action) + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra + player->CLOSE_GOSSIP_MENU(); + creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord + player->CLOSE_GOSSIP_MENU(); + creature->CastSpell(player, SPELL_HOWLING_FJORD, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin + player->CLOSE_GOSSIP_MENU(); + creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown + player->CLOSE_GOSSIP_MENU(); + creature->CastSpell(player, SPELL_ICECROWN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks + player->CLOSE_GOSSIP_MENU(); + creature->CastSpell(player, SPELL_STORM_PEAKS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 6: // Underground + player->CLOSE_GOSSIP_MENU(); + creature->CastSpell(player, SPELL_UNDERGROUND, false); + break; + } + + return true; + } + + CreatureAI* GetAI(Creature* creature) const { - case GOSSIP_ACTION_INFO_DEF + 1: //Borean Tundra - player->CLOSE_GOSSIP_MENU(); - if (roll) //At the moment we don't have chance on spell_target_position table so we hack this - player->TeleportTo(571, 4305.505859f, 5450.839844f, 63.005806f, 0.627286f); - else - player->TeleportTo(571, 3201.936279f, 5630.123535f, 133.658798f, 3.855272f); - break; - case GOSSIP_ACTION_INFO_DEF + 2: //Howling Fjord - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_HOWLING_FJORD, true); - break; - case GOSSIP_ACTION_INFO_DEF + 3: //Sholazar Basin - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_SHOLAZAR_BASIN, true); - break; - case GOSSIP_ACTION_INFO_DEF + 4: //Icecrown - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_ICECROWN, true); - break; - case GOSSIP_ACTION_INFO_DEF + 5: //Storm peaks - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_STORM_PEAKS, true); - break; + return new npc_wormholeAI(creature); } - return true; - } }; /*###### @@ -2402,6 +2423,9 @@ enum eLockSmith QUEST_HOTTER_THAN_HELL_H = 10764, QUEST_RETURN_TO_KHAGDAR = 9837, QUEST_CONTAINMENT = 13159, + QUEST_ETERNAL_VIGILANCE = 11011, + QUEST_KEY_TO_THE_FOCUSING_IRIS = 13372, + QUEST_HC_KEY_TO_THE_FOCUSING_IRIS = 13375, ITEM_ARCATRAZ_KEY = 31084, ITEM_SHADOWFORGE_KEY = 11000, @@ -2409,21 +2433,28 @@ enum eLockSmith ITEM_SHATTERED_HALLS_KEY = 28395, ITEM_THE_MASTERS_KEY = 24490, ITEM_VIOLET_HOLD_KEY = 42482, + ITEM_ESSENCE_INFUSED_MOONSTONE = 32449, + ITEM_KEY_TO_THE_FOCUSING_IRIS = 44582, + ITEM_HC_KEY_TO_THE_FOCUSING_IRIS = 44581, SPELL_ARCATRAZ_KEY = 54881, SPELL_SHADOWFORGE_KEY = 54882, SPELL_SKELETON_KEY = 54883, SPELL_SHATTERED_HALLS_KEY = 54884, SPELL_THE_MASTERS_KEY = 54885, - SPELL_VIOLET_HOLD_KEY = 67253 + SPELL_VIOLET_HOLD_KEY = 67253, + SPELL_ESSENCE_INFUSED_MOONSTONE = 40173, }; -#define GOSSIP_LOST_ARCATRAZ_KEY "I've lost my key to the Arcatraz." -#define GOSSIP_LOST_SHADOWFORGE_KEY "I've lost my key to the Blackrock Depths." -#define GOSSIP_LOST_SKELETON_KEY "I've lost my key to the Scholomance." -#define GOSSIP_LOST_SHATTERED_HALLS_KEY "I've lost my key to the Shattered Halls." -#define GOSSIP_LOST_THE_MASTERS_KEY "I've lost my key to the Karazhan." -#define GOSSIP_LOST_VIOLET_HOLD_KEY "I've lost my key to the Violet Hold." +#define GOSSIP_LOST_ARCATRAZ_KEY "I've lost my key to the Arcatraz." +#define GOSSIP_LOST_SHADOWFORGE_KEY "I've lost my key to the Blackrock Depths." +#define GOSSIP_LOST_SKELETON_KEY "I've lost my key to the Scholomance." +#define GOSSIP_LOST_SHATTERED_HALLS_KEY "I've lost my key to the Shattered Halls." +#define GOSSIP_LOST_THE_MASTERS_KEY "I've lost my key to the Karazhan." +#define GOSSIP_LOST_VIOLET_HOLD_KEY "I've lost my key to the Violet Hold." +#define GOSSIP_LOST_ESSENCE_INFUSED_MOONSTONE "I've lost my Essence-Infused Moonstone." +#define GOSSIP_LOST_KEY_TO_THE_FOCUSING_IRIS "I've lost my Key to the Focusing Iris." +#define GOSSIP_LOST_HC_KEY_TO_THE_FOCUSING_IRIS "I've lost my Heroic Key to the Focusing Iris." class npc_locksmith : public CreatureScript { @@ -2458,6 +2489,18 @@ public: if (player->GetQuestRewardStatus(QUEST_CONTAINMENT) && !player->HasItemCount(ITEM_VIOLET_HOLD_KEY, 1, true)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_VIOLET_HOLD_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + // Essence-Infused Moonstone + if (player->GetQuestRewardStatus(QUEST_ETERNAL_VIGILANCE) && !player->HasItemCount(ITEM_ESSENCE_INFUSED_MOONSTONE, 1, true)) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_ESSENCE_INFUSED_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + + // Key to the Focusing Iris + if (player->GetQuestRewardStatus(QUEST_KEY_TO_THE_FOCUSING_IRIS) && !player->HasItemCount(ITEM_KEY_TO_THE_FOCUSING_IRIS, 1, true)) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_KEY_TO_THE_FOCUSING_IRIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); + + // Heroic Key to the Focusing Iris + if (player->GetQuestRewardStatus(QUEST_HC_KEY_TO_THE_FOCUSING_IRIS) && !player->HasItemCount(ITEM_HC_KEY_TO_THE_FOCUSING_IRIS, 1, true)) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_HC_KEY_TO_THE_FOCUSING_IRIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -2492,171 +2535,17 @@ public: player->CLOSE_GOSSIP_MENU(); player->CastSpell(player, SPELL_VIOLET_HOLD_KEY, false); break; - } - return true; - } -}; - -/*###### -## npc_tabard_vendor -######*/ - -enum -{ - QUEST_TRUE_MASTERS_OF_LIGHT = 9737, - QUEST_THE_UNWRITTEN_PROPHECY = 9762, - QUEST_INTO_THE_BREACH = 10259, - QUEST_BATTLE_OF_THE_CRIMSON_WATCH = 10781, - QUEST_SHARDS_OF_AHUNE = 11972, - - ACHIEVEMENT_EXPLORE_NORTHREND = 45, - ACHIEVEMENT_TWENTYFIVE_TABARDS = 1021, - ACHIEVEMENT_THE_LOREMASTER_A = 1681, - ACHIEVEMENT_THE_LOREMASTER_H = 1682, - - ITEM_TABARD_OF_THE_HAND = 24344, - ITEM_TABARD_OF_THE_BLOOD_KNIGHT = 25549, - ITEM_TABARD_OF_THE_PROTECTOR = 28788, - ITEM_OFFERING_OF_THE_SHATAR = 31408, - ITEM_GREEN_TROPHY_TABARD_OF_THE_ILLIDARI = 31404, - ITEM_PURPLE_TROPHY_TABARD_OF_THE_ILLIDARI = 31405, - ITEM_TABARD_OF_THE_SUMMER_SKIES = 35279, - ITEM_TABARD_OF_THE_SUMMER_FLAMES = 35280, - ITEM_TABARD_OF_THE_ACHIEVER = 40643, - ITEM_LOREMASTERS_COLORS = 43300, - ITEM_TABARD_OF_THE_EXPLORER = 43348, - - SPELL_TABARD_OF_THE_BLOOD_KNIGHT = 54974, - SPELL_TABARD_OF_THE_HAND = 54976, - SPELL_GREEN_TROPHY_TABARD_OF_THE_ILLIDARI = 54977, - SPELL_PURPLE_TROPHY_TABARD_OF_THE_ILLIDARI = 54982, - SPELL_TABARD_OF_THE_ACHIEVER = 55006, - SPELL_TABARD_OF_THE_PROTECTOR = 55008, - SPELL_LOREMASTERS_COLORS = 58194, - SPELL_TABARD_OF_THE_EXPLORER = 58224, - SPELL_TABARD_OF_SUMMER_SKIES = 62768, - SPELL_TABARD_OF_SUMMER_FLAMES = 62769 -}; - -#define GOSSIP_LOST_TABARD_OF_BLOOD_KNIGHT "I've lost my Tabard of Blood Knight." -#define GOSSIP_LOST_TABARD_OF_THE_HAND "I've lost my Tabard of the Hand." -#define GOSSIP_LOST_TABARD_OF_THE_PROTECTOR "I've lost my Tabard of the Protector." -#define GOSSIP_LOST_GREEN_TROPHY_TABARD_OF_THE_ILLIDARI "I've lost my Green Trophy Tabard of the Illidari." -#define GOSSIP_LOST_PURPLE_TROPHY_TABARD_OF_THE_ILLIDARI "I've lost my Purple Trophy Tabard of the Illidari." -#define GOSSIP_LOST_TABARD_OF_SUMMER_SKIES "I've lost my Tabard of Summer Skies." -#define GOSSIP_LOST_TABARD_OF_SUMMER_FLAMES "I've lost my Tabard of Summer Flames." -#define GOSSIP_LOST_LOREMASTERS_COLORS "I've lost my Loremaster's Colors." -#define GOSSIP_LOST_TABARD_OF_THE_EXPLORER "I've lost my Tabard of the Explorer." -#define GOSSIP_LOST_TABARD_OF_THE_ACHIEVER "I've lost my Tabard of the Achiever." - -class npc_tabard_vendor : public CreatureScript -{ -public: - npc_tabard_vendor() : CreatureScript("npc_tabard_vendor") { } - - bool OnGossipHello(Player* player, Creature* creature) - { - bool lostBloodKnight = false; - bool lostHand = false; - bool lostProtector = false; - bool lostIllidari = false; - bool lostSummer = false; - - //Tabard of the Blood Knight - if (player->GetQuestRewardStatus(QUEST_TRUE_MASTERS_OF_LIGHT) && !player->HasItemCount(ITEM_TABARD_OF_THE_BLOOD_KNIGHT, 1, true)) - lostBloodKnight = true; - - //Tabard of the Hand - if (player->GetQuestRewardStatus(QUEST_THE_UNWRITTEN_PROPHECY) && !player->HasItemCount(ITEM_TABARD_OF_THE_HAND, 1, true)) - lostHand = true; - - //Tabard of the Protector - if (player->GetQuestRewardStatus(QUEST_INTO_THE_BREACH) && !player->HasItemCount(ITEM_TABARD_OF_THE_PROTECTOR, 1, true)) - lostProtector = true; - - //Green Trophy Tabard of the Illidari - //Purple Trophy Tabard of the Illidari - if (player->GetQuestRewardStatus(QUEST_BATTLE_OF_THE_CRIMSON_WATCH) && - (!player->HasItemCount(ITEM_GREEN_TROPHY_TABARD_OF_THE_ILLIDARI, 1, true) && - !player->HasItemCount(ITEM_PURPLE_TROPHY_TABARD_OF_THE_ILLIDARI, 1, true) && - !player->HasItemCount(ITEM_OFFERING_OF_THE_SHATAR, 1, true))) - lostIllidari = true; - - //Tabard of Summer Skies - //Tabard of Summer Flames - if (player->GetQuestRewardStatus(QUEST_SHARDS_OF_AHUNE) && - !player->HasItemCount(ITEM_TABARD_OF_THE_SUMMER_SKIES, 1, true) && - !player->HasItemCount(ITEM_TABARD_OF_THE_SUMMER_FLAMES, 1, true)) - lostSummer = true; - - if (lostBloodKnight || lostHand || lostProtector || lostIllidari || lostSummer) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (lostBloodKnight) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_TABARD_OF_BLOOD_KNIGHT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (lostHand) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_TABARD_OF_THE_HAND, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - - if (lostProtector) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_TABARD_OF_THE_PROTECTOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - - if (lostIllidari) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_GREEN_TROPHY_TABARD_OF_THE_ILLIDARI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_PURPLE_TROPHY_TABARD_OF_THE_ILLIDARI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - } - - if (lostSummer) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_TABARD_OF_SUMMER_SKIES, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOST_TABARD_OF_SUMMER_FLAMES, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - } - - player->SEND_GOSSIP_MENU(13583, creature->GetGUID()); - } - else - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_TABARD_OF_THE_BLOOD_KNIGHT, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_TABARD_OF_THE_HAND, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_TABARD_OF_THE_PROTECTOR, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_GREEN_TROPHY_TABARD_OF_THE_ILLIDARI, false); - break; - case GOSSIP_ACTION_INFO_DEF + 5: + case GOSSIP_ACTION_INFO_DEF + 7: player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_PURPLE_TROPHY_TABARD_OF_THE_ILLIDARI, false); + player->CastSpell(player, SPELL_ESSENCE_INFUSED_MOONSTONE, false); break; - case GOSSIP_ACTION_INFO_DEF + 6: + case GOSSIP_ACTION_INFO_DEF + 8: player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_TABARD_OF_SUMMER_SKIES, false); + player->AddItem(ITEM_KEY_TO_THE_FOCUSING_IRIS,1); break; - case GOSSIP_ACTION_INFO_DEF + 7: + case GOSSIP_ACTION_INFO_DEF + 9: player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_TABARD_OF_SUMMER_FLAMES, false); + player->AddItem(ITEM_HC_KEY_TO_THE_FOCUSING_IRIS,1); break; } return true; @@ -2999,7 +2888,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_fireworkAI(creature); } @@ -3031,7 +2920,7 @@ public: struct npc_spring_rabbitAI : public ScriptedAI { - npc_spring_rabbitAI(Creature* c) : ScriptedAI(c) { } + npc_spring_rabbitAI(Creature* creature) : ScriptedAI(creature) { } bool inLove; uint32 jumpTimer; @@ -3101,35 +2990,34 @@ public: void AddSC_npcs_special() { - new npc_air_force_bots; - new npc_lunaclaw_spirit; - new npc_chicken_cluck; - new npc_dancing_flames; - new npc_doctor; - new npc_injured_patient; - new npc_garments_of_quests; - new npc_guardian; - new npc_mount_vendor; - new npc_rogue_trainer; - new npc_sayge; - new npc_steam_tonk; - new npc_tonk_mine; - new npc_winter_reveler; - new npc_brewfest_reveler; - new npc_snake_trap; - new npc_mirror_image; - new npc_ebon_gargoyle; - new npc_lightwell; - new mob_mojo; - new npc_training_dummy; - new npc_shadowfiend; - new npc_wormhole; - new npc_pet_trainer; - new npc_locksmith; - new npc_tabard_vendor; - new npc_experience; - new npc_fire_elemental; - new npc_earth_elemental; - new npc_firework; + new npc_air_force_bots(); + new npc_lunaclaw_spirit(); + new npc_chicken_cluck(); + new npc_dancing_flames(); + new npc_doctor(); + new npc_injured_patient(); + new npc_garments_of_quests(); + new npc_guardian(); + new npc_mount_vendor(); + new npc_rogue_trainer(); + new npc_sayge(); + new npc_steam_tonk(); + new npc_tonk_mine(); + new npc_winter_reveler(); + new npc_brewfest_reveler(); + new npc_snake_trap(); + new npc_mirror_image(); + new npc_ebon_gargoyle(); + new npc_lightwell(); + new mob_mojo(); + new npc_training_dummy(); + new npc_shadowfiend(); + new npc_wormhole(); + new npc_pet_trainer(); + new npc_locksmith(); + new npc_experience(); + new npc_fire_elemental(); + new npc_earth_elemental(); + new npc_firework(); new npc_spring_rabbit(); } diff --git a/src/server/shared/AutoPtr.h b/src/server/shared/AutoPtr.h new file mode 100644 index 00000000000..988c46cc5a2 --- /dev/null +++ b/src/server/shared/AutoPtr.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef _TRINITY_AUTO_PTR_H +#define _TRINITY_AUTO_PTR_H + +#include + +namespace Trinity +{ + template + class AutoPtr : public ACE_Strong_Bound_Ptr + { + public: + AutoPtr() : ACE_Strong_Bound_Ptr() {} + + AutoPtr(Pointer* x) + { + ACE_Strong_Bound_Ptr::reset(x); + } + + operator bool() const + { + return ACE_Strong_Bound_Ptr::get() != NULL; + } + + bool operator !() const + { + return ACE_Strong_Bound_Ptr::get() == NULL; + } + + bool operator !=(Pointer* x) const + { + return ACE_Strong_Bound_Ptr::get() != x; + } + }; +}; + +#endif \ No newline at end of file diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index 3ec35b5394a..de998442419 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -53,7 +53,6 @@ set(shared_STAT_SRCS include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/mersennetwister ${CMAKE_SOURCE_DIR}/dep/sockets/include ${CMAKE_SOURCE_DIR}/dep/utf8cpp ${CMAKE_SOURCE_DIR}/src/server diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h index 57809cca255..259c60ade20 100755 --- a/src/server/shared/Common.h +++ b/src/server/shared/Common.h @@ -208,10 +208,14 @@ typedef std::vector StringVector; ACE_Guard< MUTEX > TRINITY_GUARD_OBJECT (LOCK); \ if (TRINITY_GUARD_OBJECT.locked() == 0) ASSERT(false); +//! For proper implementation of multiple-read, single-write pattern, use +//! ACE_RW_Mutex as underlying @MUTEX # define TRINITY_WRITE_GUARD(MUTEX, LOCK) \ ACE_Write_Guard< MUTEX > TRINITY_GUARD_OBJECT (LOCK); \ if (TRINITY_GUARD_OBJECT.locked() == 0) ASSERT(false); +//! For proper implementation of multiple-read, single-write pattern, use +//! ACE_RW_Mutex as underlying @MUTEX # define TRINITY_READ_GUARD(MUTEX, LOCK) \ ACE_Read_Guard< MUTEX > TRINITY_GUARD_OBJECT (LOCK); \ if (TRINITY_GUARD_OBJECT.locked() == 0) ASSERT(false); diff --git a/src/server/shared/Containers.h b/src/server/shared/Containers.h new file mode 100644 index 00000000000..f0242cbff0e --- /dev/null +++ b/src/server/shared/Containers.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef TRINITY_CONTAINERS_H +#define TRINITY_CONTAINERS_H + +#include + +//! Because circular includes are bad +extern uint32 urand(uint32 min, uint32 max); + +namespace Trinity +{ + namespace Containers + { + template + void RandomResizeList(std::list &list, uint32 size) + { + size_t list_size = list.size(); + + while (list_size > size) + { + typename std::list::iterator itr = list.begin(); + std::advance(itr, urand(0, list_size - 1)); + list.erase(itr); + --list_size; + } + } + + template + void RandomResizeList(std::list &list, Predicate& predicate, uint32 size) + { + //! First use predicate filter + std::list listCopy; + for (typename std::list::iterator itr = list.begin(); itr != list.end(); ++itr) + if (predicate(*itr)) + listCopy.push_back(*itr); + + if (size) + RandomResizeList(listCopy, size); + + list = listCopy; + } + + /* Select a random element from a container. Note: make sure you explicitly empty check the container */ + template typename C::value_type const& SelectRandomContainerElement(C const& container) + { + typename C::const_iterator it = container.begin(); + std::advance(it, urand(0, container.size() - 1)); + return *it; + } + }; + //! namespace Containers +}; +//! namespace Trinity + +#endif //! #ifdef TRINITY_CONTAINERS_H \ No newline at end of file diff --git a/src/server/shared/Cryptography/BigNumber.cpp b/src/server/shared/Cryptography/BigNumber.cpp index f55e87c99fc..364ee76ec75 100755 --- a/src/server/shared/Cryptography/BigNumber.cpp +++ b/src/server/shared/Cryptography/BigNumber.cpp @@ -16,6 +16,8 @@ * with this program. If not, see . */ +#include + #include "Cryptography/BigNumber.h" #include #include @@ -169,6 +171,8 @@ uint8 *BigNumber::AsByteArray(int minSize, bool reverse) { int length = (minSize >= GetNumBytes()) ? minSize : GetNumBytes(); + ACE_GUARD_RETURN(ACE_Mutex, g, _lock, 0); + if (_array) { delete[] _array; diff --git a/src/server/shared/Cryptography/BigNumber.h b/src/server/shared/Cryptography/BigNumber.h index 7196aae6579..6646245a6a0 100755 --- a/src/server/shared/Cryptography/BigNumber.h +++ b/src/server/shared/Cryptography/BigNumber.h @@ -20,6 +20,7 @@ #define _AUTH_BIGNUMBER_H #include "Define.h" +#include struct bignum_st; @@ -89,6 +90,10 @@ class BigNumber private: struct bignum_st *_bn; uint8 *_array; + + // This mutex only controls thread-safe access to AsByteArray() and should be replaced with a thread-safe implementation of BigNumber + ACE_Mutex _lock; + }; #endif diff --git a/src/server/shared/Cryptography/HMACSHA1.cpp b/src/server/shared/Cryptography/HMACSHA1.cpp index 447d0b58efc..c9de1191464 100755 --- a/src/server/shared/Cryptography/HMACSHA1.cpp +++ b/src/server/shared/Cryptography/HMACSHA1.cpp @@ -31,19 +31,9 @@ HmacHash::~HmacHash() HMAC_CTX_cleanup(&m_ctx); } -void HmacHash::UpdateBigNumber(BigNumber* bn) -{ - UpdateData(bn->AsByteArray(), bn->GetNumBytes()); -} - -void HmacHash::UpdateData(const uint8 *data, int length) -{ - HMAC_Update(&m_ctx, data, length); -} - void HmacHash::UpdateData(const std::string &str) { - UpdateData((uint8 const*)str.c_str(), str.length()); + HMAC_Update(&m_ctx, (uint8 const*)str.c_str(), str.length()); } void HmacHash::Finalize() diff --git a/src/server/shared/Cryptography/HMACSHA1.h b/src/server/shared/Cryptography/HMACSHA1.h index bd0418b600e..4b7667968ca 100755 --- a/src/server/shared/Cryptography/HMACSHA1.h +++ b/src/server/shared/Cryptography/HMACSHA1.h @@ -33,8 +33,6 @@ class HmacHash public: HmacHash(uint32 len, uint8 *seed); ~HmacHash(); - void UpdateBigNumber(BigNumber* bn); - void UpdateData(const uint8 *data, int length); void UpdateData(const std::string &str); void Finalize(); uint8 *ComputeHash(BigNumber* bn); diff --git a/src/server/shared/Cryptography/SHA1.h b/src/server/shared/Cryptography/SHA1.h index b5bf97fd7d9..7c77defebfa 100755 --- a/src/server/shared/Cryptography/SHA1.h +++ b/src/server/shared/Cryptography/SHA1.h @@ -31,7 +31,6 @@ class SHA1Hash SHA1Hash(); ~SHA1Hash(); - void UpdateFinalizeBigNumbers(BigNumber* bn0, ...); void UpdateBigNumbers(BigNumber* bn0, ...); void UpdateData(const uint8 *dta, int len); diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index b91972e5b0c..314d196cc06 100755 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -33,17 +33,11 @@ class PingOperation : public SQLOperation { - /// Operation for idle delaythreads + //! Operation for idle delaythreads bool Execute() { - if (m_conn->LockIfReady()) - { - m_conn->Ping(); - m_conn->Unlock(); - return true; - } - - return false; + m_conn->Ping(); + return true; } }; @@ -53,10 +47,10 @@ class DatabaseWorkerPool public: /* Activity state */ DatabaseWorkerPool() : - m_queue(new ACE_Activation_Queue(new ACE_Message_Queue)) + _queue(new ACE_Activation_Queue()) { - memset(m_connectionCount, 0, sizeof(m_connectionCount)); - m_connections.resize(IDX_SIZE); + memset(_connectionCount, 0, sizeof(_connectionCount)); + _connections.resize(IDX_SIZE); WPFatal (mysql_thread_safe(), "Used MySQL library isn't thread-safe."); } @@ -68,64 +62,72 @@ class DatabaseWorkerPool bool Open(const std::string& infoString, uint8 async_threads, uint8 synch_threads) { bool res = true; - m_connectionInfo = MySQLConnectionInfo(infoString); + _connectionInfo = MySQLConnectionInfo(infoString); - sLog->outSQLDriver("Opening databasepool '%s'. Async threads: %u, synch threads: %u", m_connectionInfo.database.c_str(), async_threads, synch_threads); + sLog->outSQLDriver("Opening DatabasePool '%s'. Asynchronous connections: %u, synchronous connections: %u.", + GetDatabaseName(), async_threads, synch_threads); - /// Open asynchronous connections (delayed operations) - m_connections[IDX_ASYNC].resize(async_threads); + //! Open asynchronous connections (delayed operations) + _connections[IDX_ASYNC].resize(async_threads); for (uint8 i = 0; i < async_threads; ++i) { - T* t = new T(m_queue, m_connectionInfo); + T* t = new T(_queue, _connectionInfo); res &= t->Open(); - m_connections[IDX_ASYNC][i] = t; - ++m_connectionCount[IDX_ASYNC]; + _connections[IDX_ASYNC][i] = t; + ++_connectionCount[IDX_ASYNC]; } - /// Open synchronous connections (direct, blocking operations) - m_connections[IDX_SYNCH].resize(synch_threads); + //! Open synchronous connections (direct, blocking operations) + _connections[IDX_SYNCH].resize(synch_threads); for (uint8 i = 0; i < synch_threads; ++i) { - T* t = new T(m_connectionInfo); + T* t = new T(_connectionInfo); res &= t->Open(); - m_connections[IDX_SYNCH][i] = t; - ++m_connectionCount[IDX_SYNCH]; + _connections[IDX_SYNCH][i] = t; + ++_connectionCount[IDX_SYNCH]; } - sLog->outSQLDriver("Databasepool opened successfully. %u total connections running.", (m_connectionCount[IDX_SYNCH] + m_connectionCount[IDX_ASYNC])); + if (res) + sLog->outSQLDriver("DatabasePool '%s' opened successfully. %u total connections running.", GetDatabaseName(), + (_connectionCount[IDX_SYNCH] + _connectionCount[IDX_ASYNC])); + else + sLog->outError("DatabasePool %s NOT opened. There were errors opening the MySQL connections. Check your SQLDriverLogFile " + "for specific errors.", GetDatabaseName()); return res; } void Close() { - sLog->outSQLDriver("Closing down databasepool '%s'.", m_connectionInfo.database.c_str()); + sLog->outSQLDriver("Closing down DatabasePool '%s'.", GetDatabaseName()); - /// Shuts down delaythreads for this connection pool by underlying deactivate() - m_queue->queue()->close(); + //! Shuts down delaythreads for this connection pool by underlying deactivate(). + //! The next dequeue attempt in the worker thread tasks will result in an error, + //! ultimately ending the worker thread task. + _queue->queue()->close(); - for (uint8 i = 0; i < m_connectionCount[IDX_ASYNC]; ++i) + for (uint8 i = 0; i < _connectionCount[IDX_ASYNC]; ++i) { - /// TODO: Better way. probably should flip a boolean and check it on low level code before doing anything on the mysql ctx - /// Now we just wait until m_queue gives the signal to the worker threads to stop - T* t = m_connections[IDX_ASYNC][i]; + T* t = _connections[IDX_ASYNC][i]; DatabaseWorker* worker = t->m_worker; - worker->wait(); + worker->wait(); //! Block until no more threads are running this task. delete worker; - t->Close(); + t->Close(); //! Closes the actualy MySQL connection. } - sLog->outSQLDriver("Asynchronous connections on databasepool '%s' terminated. Proceeding with synchronous connections.", m_connectionInfo.database.c_str()); + sLog->outSQLDriver("Asynchronous connections on DatabasePool '%s' terminated. Proceeding with synchronous connections.", + GetDatabaseName()); - /// Shut down the synchronous connections - for (uint8 i = 0; i < m_connectionCount[IDX_SYNCH]; ++i) - { - T* t = m_connections[IDX_SYNCH][i]; - //while (1) - // if (t->LockIfReady()) -- For some reason deadlocks us - t->Close(); - } + //! Shut down the synchronous connections + //! There's no need for locking the connection, because DatabaseWorkerPool<>::Close + //! should only be called after any other thread tasks in the core have exited, + //! meaning there can be no concurrent access at this point. + for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i) + _connections[IDX_SYNCH][i]->Close(); + + //! Deletes the ACE_Activation_Queue object and its underlying ACE_Message_Queue + delete _queue; - sLog->outSQLDriver("All connections on databasepool %s closed.", m_connectionInfo.database.c_str()); + sLog->outSQLDriver("All connections on DatabasePool '%s' closed.", GetDatabaseName()); } /** @@ -133,6 +135,7 @@ class DatabaseWorkerPool */ //! Enqueues a one-way SQL operation in string format that will be executed asynchronously. + //! This method should only be used for queries that are only executed once, e.g during startup. void Execute(const char* sql) { if (!sql) @@ -143,6 +146,7 @@ class DatabaseWorkerPool } //! Enqueues a one-way SQL operation in string format -with variable args- that will be executed asynchronously. + //! This method should only be used for queries that are only executed once, e.g during startup. void PExecute(const char* sql, ...) { if (!sql) @@ -166,10 +170,11 @@ class DatabaseWorkerPool } /** - Direct syncrhonous one-way statement methods. + Direct synchronous one-way statement methods. */ //! Directly executes a one-way SQL operation in string format, that will block the calling thread until finished. + //! This method should only be used for queries that are only executed once, e.g during startup. void DirectExecute(const char* sql) { if (!sql) @@ -181,6 +186,7 @@ class DatabaseWorkerPool } //! Directly executes a one-way SQL operation in string format -with variable args-, that will block the calling thread until finished. + //! This method should only be used for queries that are only executed once, e.g during startup. void DirectPExecute(const char* sql, ...) { if (!sql) @@ -233,7 +239,7 @@ class DatabaseWorkerPool va_list ap; char szQuery[MAX_QUERY_LEN]; - va_start(ap, sql); + va_start(ap, conn); vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap); va_end(ap); @@ -265,6 +271,9 @@ class DatabaseWorkerPool PreparedResultSet* ret = t->Query(stmt); t->Unlock(); + //! Delete proxy-class. Not needed anymore + delete stmt; + if (!ret || !ret->GetRowCount()) return PreparedQueryResult(NULL); @@ -335,20 +344,22 @@ class DatabaseWorkerPool //! were appended to the transaction will be respected during execution. void CommitTransaction(SQLTransaction transaction) { - if (sLog->GetSQLDriverQueryLogging()) + #ifdef TRINITY_DEBUG + //! Only analyze transaction weaknesses in Debug mode. + //! Ideally we catch the faults in Debug mode and then correct them, + //! so there's no need to waste these CPU cycles in Release mode. + switch (transaction->GetSize()) { - switch (transaction->GetSize()) - { - case 0: - sLog->outSQLDriver("Transaction contains 0 queries. Not executing."); - return; - case 1: - sLog->outSQLDriver("Warning: Transaction only holds 1 query, consider removing Transaction context in code."); - break; - default: - break; - } + case 0: + sLog->outSQLDriver("Transaction contains 0 queries. Not executing."); + return; + case 1: + sLog->outSQLDriver("Warning: Transaction only holds 1 query, consider removing Transaction context in code."); + break; + default: + break; } + #endif // TRINITY_DEBUG Enqueue(new TransactionTask(transaction)); } @@ -364,9 +375,11 @@ class DatabaseWorkerPool return; } + //! Handle MySQL Errno 1213 without extending deadlock to the core itself + //! TODO: More elegant way if (con->GetLastError() == 1213) { - uint8 loopBreaker = 5; // Handle MySQL Errno 1213 without extending deadlock to the core itself + uint8 loopBreaker = 5; for (uint8 i = 0; i < loopBreaker; ++i) { if (con->ExecuteTransaction(transaction)) @@ -374,7 +387,7 @@ class DatabaseWorkerPool } } - // Clean up now. + //! Clean up now. transaction->Cleanup(); con->Unlock(); @@ -405,6 +418,7 @@ class DatabaseWorkerPool */ //! Automanaged (internally) pointer to a prepared statement object for usage in upper level code. + //! Pointer is deleted in this->Query(PreparedStatement*) or PreparedStatementTask::~PreparedStatementTask. //! This object is not tied to the prepared statement on the MySQL context yet until execution. PreparedStatement* GetPreparedStatement(uint32 index) { @@ -426,10 +440,10 @@ class DatabaseWorkerPool //! Keeps all our MySQL connections alive, prevent the server from disconnecting us. void KeepAlive() { - /// Ping synchronous connections - for (uint8 i = 0; i < m_connectionCount[IDX_SYNCH]; ++i) + //! Ping synchronous connections + for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i) { - T* t = m_connections[IDX_SYNCH][i]; + T* t = _connections[IDX_SYNCH][i]; if (t->LockIfReady()) { t->Ping(); @@ -437,10 +451,10 @@ class DatabaseWorkerPool } } - /// Assuming all worker threads are free, every worker thread will receive 1 ping operation request - /// If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter - /// as the sole purpose is to prevent connections from idling. - for (size_t i = 0; i < m_connections[IDX_ASYNC].size(); ++i) + //! Assuming all worker threads are free, every worker thread will receive 1 ping operation request + //! If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter + //! as the sole purpose is to prevent connections from idling. + for (size_t i = 0; i < _connections[IDX_ASYNC].size(); ++i) Enqueue(new PingOperation); } @@ -450,41 +464,50 @@ class DatabaseWorkerPool if (!to || !from || !length) return 0; - return mysql_real_escape_string(m_connections[IDX_SYNCH][0]->GetHandle(), to, from, length); + return mysql_real_escape_string(_connections[IDX_SYNCH][0]->GetHandle(), to, from, length); } void Enqueue(SQLOperation* op) { - m_queue->enqueue(op); + _queue->enqueue(op); } + //! Gets a free connection in the synchronous connection pool. + //! Caller MUST call t->Unlock() after touching the MySQL context to prevent deadlocks. T* GetFreeConnection() { uint8 i = 0; - size_t num_cons = m_connectionCount[IDX_SYNCH]; - for (;;) /// Block forever until a connection is free + size_t num_cons = _connectionCount[IDX_SYNCH]; + //! Block forever until a connection is free + for (;;) { - T* t = m_connections[IDX_SYNCH][++i % num_cons ]; - if (t->LockIfReady()) /// Must be matched with t->Unlock() or you will get deadlocks + T* t = _connections[IDX_SYNCH][++i % num_cons]; + //! Must be matched with t->Unlock() or you will get deadlocks + if (t->LockIfReady()) return t; } - // This will be called when Celine Dion learns to sing + //! This will be called when Celine Dion learns to sing return NULL; } + char const* GetDatabaseName() const + { + return _connectionInfo.database.c_str(); + } + private: - enum + enum _internalIndex { IDX_ASYNC, IDX_SYNCH, IDX_SIZE, }; - ACE_Activation_Queue* m_queue; //! Queue shared by async worker threads. - std::vector< std::vector > m_connections; - uint32 m_connectionCount[2]; //! Counter of MySQL connections; - MySQLConnectionInfo m_connectionInfo; + ACE_Activation_Queue* _queue; //! Queue shared by async worker threads. + std::vector< std::vector > _connections; + uint32 _connectionCount[2]; //! Counter of MySQL connections; + MySQLConnectionInfo _connectionInfo; }; #endif diff --git a/src/server/shared/Database/Field.h b/src/server/shared/Database/Field.h index 355f6b47ff2..bfa42dbe574 100755 --- a/src/server/shared/Database/Field.h +++ b/src/server/shared/Database/Field.h @@ -41,12 +41,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_TINY)) { - sLog->outSQLDriver("Error: GetUInt8() on non-numeric field."); + sLog->outSQLDriver("Warning: GetUInt8() on non-tinyint field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -58,12 +59,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_TINY)) { - sLog->outSQLDriver("Error: GeInt8() on non-numeric field."); + sLog->outSQLDriver("Warning: GetInt8() on non-tinyint field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -75,12 +77,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_SHORT) && !IsType(MYSQL_TYPE_YEAR)) { - sLog->outSQLDriver("Error: GetUInt16() on non-numeric field."); + sLog->outSQLDriver("Warning: GetUInt16() on non-smallint field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -92,12 +95,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_SHORT) && !IsType(MYSQL_TYPE_YEAR)) { - sLog->outSQLDriver("Error: GetInt16() on non-numeric field."); + sLog->outSQLDriver("Warning: GetInt16() on non-smallint field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -109,12 +113,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_INT24) && !IsType(MYSQL_TYPE_LONG)) { - sLog->outSQLDriver("Error: GetUInt32() on non-numeric field."); + sLog->outSQLDriver("Warning: GetUInt32() on non-(medium)int field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -126,12 +131,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_INT24) && !IsType(MYSQL_TYPE_LONG)) { - sLog->outSQLDriver("Error: GetInt32() on non-numeric field."); + sLog->outSQLDriver("Warning: GetInt32() on non-(medium)int field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -143,12 +149,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_LONGLONG) && !IsType(MYSQL_TYPE_BIT)) { - sLog->outSQLDriver("Error: GetUInt64() on non-numeric field."); + sLog->outSQLDriver("Warning: GetUInt64() on non-bigint field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atol((char*)data.value)); @@ -160,12 +167,13 @@ class Field return 0; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_LONGLONG) && !IsType(MYSQL_TYPE_BIT)) { - sLog->outSQLDriver("Error: GetInt64() on non-numeric field."); + sLog->outSQLDriver("Warning: GetInt64() on non-bigint field. Using type: %s.", FieldTypeToString(data.type)); return 0; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(strtol((char*)data.value, NULL, 10)); @@ -177,12 +185,13 @@ class Field return 0.0f; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_FLOAT)) { - sLog->outSQLDriver("Error: GetFloat() on non-numeric field."); + sLog->outSQLDriver("Warning: GetFloat() on non-float field. Using type: %s.", FieldTypeToString(data.type)); return 0.0f; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atof((char*)data.value)); @@ -194,18 +203,19 @@ class Field return 0.0f; #ifdef TRINITY_DEBUG - if (!IsNumeric()) + if (!IsType(MYSQL_TYPE_DOUBLE)) { - sLog->outSQLDriver("Error: GetDouble() on non-numeric field."); + sLog->outSQLDriver("Warning: GetDouble() on non-double field. Using type: %s.", FieldTypeToString(data.type)); return 0.0f; } #endif + if (data.raw) return *reinterpret_cast(data.value); return static_cast(atof((char*)data.value)); } - const char* GetCString() const + char const* GetCString() const { if (!data.value) return NULL; @@ -213,11 +223,12 @@ class Field #ifdef TRINITY_DEBUG if (IsNumeric()) { - sLog->outSQLDriver("Error: GetCString() on numeric field."); + sLog->outSQLDriver("Error: GetCString() on numeric field. Using type: %s.", FieldTypeToString(data.type)); return NULL; } #endif - return static_cast(data.value); + return static_cast(data.value); + } std::string GetString() const @@ -227,7 +238,7 @@ class Field if (data.raw) { - const char* string = GetCString(); + char const* string = GetCString(); if (!string) string = ""; return std::string(string, data.length); @@ -257,7 +268,7 @@ class Field #pragma pack(pop) #endif - void SetByteValue(const void* newValue, const size_t newSize, enum_field_types newType, uint32 length); + void SetByteValue(void const* newValue, size_t const newSize, enum_field_types newType, uint32 length); void SetStructuredValue(char* newValue, enum_field_types newType); void CleanUp() @@ -316,6 +327,11 @@ class Field } } + bool IsType(enum_field_types type) const + { + return data.type == type; + } + bool IsNumeric() const { return (data.type == MYSQL_TYPE_TINY || @@ -326,6 +342,43 @@ class Field data.type == MYSQL_TYPE_DOUBLE || data.type == MYSQL_TYPE_LONGLONG ); } + + private: + #ifdef TRINITY_DEBUG + static char const* FieldTypeToString(enum_field_types type) + { + switch (type) + { + case MYSQL_TYPE_BIT: return "BIT"; + case MYSQL_TYPE_BLOB: return "BLOB"; + case MYSQL_TYPE_DATE: return "DATE"; + case MYSQL_TYPE_DATETIME: return "DATETIME"; + case MYSQL_TYPE_NEWDECIMAL: return "NEWDECIMAL"; + case MYSQL_TYPE_DECIMAL: return "DECIMAL"; + case MYSQL_TYPE_DOUBLE: return "DOUBLE"; + case MYSQL_TYPE_ENUM: return "ENUM"; + case MYSQL_TYPE_FLOAT: return "FLOAT"; + case MYSQL_TYPE_GEOMETRY: return "GEOMETRY"; + case MYSQL_TYPE_INT24: return "INT24"; + case MYSQL_TYPE_LONG: return "LONG"; + case MYSQL_TYPE_LONGLONG: return "LONGLONG"; + case MYSQL_TYPE_LONG_BLOB: return "LONG_BLOB"; + case MYSQL_TYPE_MEDIUM_BLOB: return "MEDIUM_BLOB"; + case MYSQL_TYPE_NEWDATE: return "NEWDATE"; + case MYSQL_TYPE_NULL: return "NULL"; + case MYSQL_TYPE_SET: return "SET"; + case MYSQL_TYPE_SHORT: return "SHORT"; + case MYSQL_TYPE_STRING: return "STRING"; + case MYSQL_TYPE_TIME: return "TIME"; + case MYSQL_TYPE_TIMESTAMP: return "TIMESTAMP"; + case MYSQL_TYPE_TINY: return "TINY"; + case MYSQL_TYPE_TINY_BLOB: return "TINY_BLOB"; + case MYSQL_TYPE_VAR_STRING: return "VAR_STRING"; + case MYSQL_TYPE_YEAR: return "YEAR"; + default: return "-Unknown-"; + } + } + #endif }; #endif diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 72f509706e8..42e7fdbe087 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -27,13 +27,15 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_EXPIRED_BANS, "UPDATE character_banned SET active = 0 WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate <> bandate", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_BOTH); - PREPARE_STATEMENT(CHAR_SEL_CHECK_NAME, "SELECT 1 FROM characters WHERE name = ?", CONNECTION_ASYNC); - PREPARE_STATEMENT(CHAR_SEL_SUM_CHARS, "SELECT COUNT(guid) FROM characters WHERE account = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SEL_CHECK_NAME, "SELECT 1 FROM characters WHERE name = ?", CONNECTION_BOTH); + PREPARE_STATEMENT(CHAR_SEL_CHECK_GUID, "SELECT 1 FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_SUM_CHARS, "SELECT COUNT(guid) FROM characters WHERE account = ?", CONNECTION_BOTH); PREPARE_STATEMENT(CHAR_SEL_CHAR_CREATE_INFO, "SELECT level, race, class FROM characters WHERE account = ? LIMIT 0, ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_INS_CHARACTER_BAN, "INSERT INTO character_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_UPD_CHARACTER_BAN, "UPDATE character_banned SET active = 0 WHERE guid = ? AND active != 0", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_DEL_CHARACTER_BAN, "DELETE cb FROM character_banned cb INNER JOIN characters c ON c.guid = cb.guid WHERE c.account = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_SEL_BANINFO, "SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate, banreason, bannedby FROM character_banned WHERE guid = ? ORDER BY bandate ASC", CONNECTION_SYNCH) - PREPARE_STATEMENT(CHAR_SEL_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%', ?, '%')", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_SEL_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_SEL_BANINFO_LIST, "SELECT bandate, unbandate, bannedby, banreason FROM character_banned WHERE guid = ? ORDER BY unbandate", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_SEL_BANNED_NAME, "SELECT characters.name FROM characters, character_banned WHERE character_banned.guid = ? AND character_banned.guid = characters.guid", CONNECTION_SYNCH) PREPARE_STATEMENT(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); @@ -43,7 +45,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_PET_ENTRY, "SELECT entry FROM character_pet WHERE owner = ? AND id = ? AND slot >= ? AND slot <= ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_SEL_PET_SLOT_BY_ID, "SELECT slot, entry FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(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); - PREPARE_STATEMENT(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_BOTH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_RACE, "SELECT race FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_LEVEL, "SELECT level FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME_DATA, "SELECT race, class, gender FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_POSITION, "SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_DAILY, "DELETE FROM character_queststatus_daily", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_WEEKLY, "DELETE FROM character_queststatus_weekly", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_SEASONAL, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC); @@ -59,13 +67,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() "resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " "conquestPoints, totalHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " "health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, guildId FROM characters WHERE guid = ?", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, " "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, " - "itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC) + "itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DAILYQUESTSTATUS, "SELECT quest, time FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS, "SELECT quest, event FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC) @@ -78,11 +86,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activespec AND a.guid = ? ORDER BY button", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_SEL_MAIL_COUNT, "SELECT COUNT(*) FROM mail WHERE receiver = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_SEL_GUILD_MEMBER, "SELECT guildid, rank FROM guild_member WHERE guid = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_SEL_GUILD_MEMBER, "SELECT guildid, rank FROM guild_member WHERE guid = ?", CONNECTION_BOTH) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_CRITERIAPROGRESS, "SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, " @@ -103,8 +112,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_SEL_AUCTION_BY_TIME, "SELECT id FROM auctionhouse WHERE time <= ? ORDER BY TIME ASC", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET buyguid = ?, lastbid = ? WHERE id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_DEL_MAIL, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_INS_MAIL_ITEM, "INSERT INTO mail_items(mail_id, item_guid, receiver) VALUES (?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_DEL_INVALID_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC); @@ -120,17 +131,20 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_DEL_INVENTORY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ? WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_BY_NAME, "SELECT account FROM characters WHERE name = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_BY_GUID, "SELECT account FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_NAME_BY_GUID, "SELECT account, name FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, "DELETE FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, "INSERT INTO account_instance_times (accountId, instanceId, releaseTime) VALUES (?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME_CLASS, "SELECT name, class FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME, "SELECT name FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_MATCH_MAKER_RATING, "SELECT matchMakerRating FROM character_arena_stats WHERE guid = ? AND slot = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_CHARACTER_COUNT, "SELECT account, COUNT(guid) FROM characters WHERE account = ? GROUP BY account", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_NAME, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC); @@ -229,13 +243,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC) // Auras - PREPARE_STATEMENT(CHAR_DEL_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_INS_AURA, "INSERT INTO character_aura (guid, caster_guid, item_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) // Account data PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_SYNCH) - PREPARE_STATEMENT(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data(accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data (accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_ACCOUNT_DATA, "DELETE FROM account_data WHERE accountId = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_PLAYER_ACCOUNT_DATA, "SELECT type, time, data FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_REP_PLAYER_ACCOUNT_DATA, "REPLACE INTO character_account_data(guid, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) @@ -266,6 +279,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_PETITION_SIGNATURE, "SELECT playerguid FROM petition_sign WHERE petitionguid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_DEL_ALL_PETITION_SIGNATURES, "DELETE FROM petition_sign WHERE playerguid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE, "DELETE FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SEL_PETITION_BY_OWNER, "SELECT petitionguid FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PETITION_TYPE, "SELECT type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PETITION_SIGNATURES, "SELECT ownerguid, (SELECT COUNT(playerguid) FROM petition_sign WHERE petition_sign.petitionguid = ?) AS signs, type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PETITION_SIG_BY_ACCOUNT, "SELECT playerguid FROM petition_sign WHERE player_account = ? AND petitionguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PETITION_OWNER_BY_GUID, "SELECT ownerguid FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PETITION_SIG_BY_GUID, "SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PETITION_SIG_BY_GUID_TYPE, "SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_SYNCH); // Arena teams PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ARENAINFO, "SELECT arenaTeamId, weekGames, seasonGames, seasonWins, personalRating FROM arena_team_member WHERE guid = ?", CONNECTION_ASYNC) @@ -283,7 +303,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() // Character battleground data PREPARE_STATEMENT(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_UPD_PLAYERS_BGDATA, "UPDATE character_battleground_data SET instanceId = 0", CONNECTION_SYNCH) // Character homebind PREPARE_STATEMENT(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) @@ -296,7 +315,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_UPD_NONEXISTENT_INSTANCE_FOR_CORPSES, "UPDATE corpse SET instanceId = 0 WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)", CONNECTION_SYNCH) // Creature respawn PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM creature_respawn", CONNECTION_SYNCH) @@ -305,15 +323,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_GUID, "DELETE FROM creature_respawn WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE instanceId = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_MAX_CREATURE_RESPAWNS, "SELECT MAX(respawnTime), instanceId FROM creature_respawn WHERE instanceId > 0 GROUP BY instanceId", CONNECTION_SYNCH) - PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_INSTANCE_CREATURE_RESPAWNS, "DELETE FROM creature_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)", CONNECTION_SYNCH) // Gameobject respawn PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM gameobject_respawn", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, instanceId) VALUES (?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND instanceId = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE instanceId = ?", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_DEL_EXPIRED_GO_RESPAWNS, "DELETE FROM gameobject_respawn WHERE respawnTime <= UNIX_TIMESTAMP(NOW())", CONNECTION_SYNCH) - PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_INSTANCE_GO_RESPAWNS, "DELETE FROM gameobject_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)", CONNECTION_SYNCH) // GM Tickets PREPARE_STATEMENT(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed FROM gm_tickets", CONNECTION_SYNCH) @@ -324,7 +339,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // GM Survey/subsurvey/lag report PREPARE_STATEMENT(CHAR_INS_GM_SURVEY, "INSERT INTO gm_surveys (guid, surveyId, mainSurvey, overallComment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurveys (surveyId, subsurveyId, rank, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ, latency, createTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) // For loading and deleting expired auctions at startup PREPARE_STATEMENT(CHAR_SEL_EXPIRED_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ah.time <= ?", CONNECTION_SYNCH) @@ -386,7 +401,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_UPD_CHAR_NAME_AT_LOGIN, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_WORLDSTATE, "UPDATE worldstates SET value = ? WHERE entry = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_INS_WORLDSTATE, "INSERT INTO worldstates (entry, value) VALUES (?, ?)", CONNECTION_ASYNC); - PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? WHERE guid = ?", CONNECTION_ASYNC); @@ -397,5 +412,145 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC); - + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_DEL_INFO, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHARS_BY_ACCOUNT_ID, "SELECT guid FROM characters WHERE account = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AT_LOGIN, "SELECT at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PET_SPELL_LIST, "SELECT DISTINCT pet_spell.spell FROM pet_spell, character_pet WHERE character_pet.owner = ? AND character_pet.id = pet_spell.guid AND character_pet.id <> ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PET, "SELECT id FROM character_pet WHERE owner = ? AND id <> ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PETS, "SELECT id FROM character_pet WHERE owner = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PET_AURA, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, "SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid = ? AND type = ? LIMIT 1", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PLAYERBYTES2, "SELECT playerBytes2 FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_PET_DECLINED_NAME, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = ? AND id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_DEL_CHAR_AURA_FROZEN, "DELETE FROM character_aura WHERE spell = 9454 AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_MAIL_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM,"SELECT COUNT(itemEntry) FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE itemEntry = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_GUILD_BANK_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM guild_bank_item gbi INNER JOIN item_instance ii ON ii.guid = gbi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY, "SELECT ci.item, cb.slot AS bag, ci.slot, ci.guid, c.account, c.name FROM characters c INNER JOIN character_inventory ci ON ci.guid = c.guid INNER JOIN item_instance ii ON ii.guid = ci.item LEFT JOIN character_inventory cb ON cb.item = ci.bag WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_MAIL_ITEMS_BY_ENTRY, "SELECT mi.item_guid, m.sender, m.receiver, cs.account, cs.name, cr.account, cr.name FROM mail m INNER JOIN mail_items mi ON mi.mail_id = m.id INNER JOIN item_instance ii ON ii.guid = mi.item_guid INNER JOIN characters cs ON cs.guid = m.sender INNER JOIN characters cr ON cr.guid = m.receiver WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah INNER JOIN characters c ON c.guid = ah.itemowner INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND entry = ? AND (slot = ? OR slot > ?)", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?) ", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_ITEM_REFUND_INSTANCE, "DELETE FROM item_refund_instance WHERE item_guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_ITEM_REFUND_INSTANCE, "INSERT INTO item_refund_instance (item_guid, player_guid, paidMoney, paidExtendedCost) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GROUP, "DELETE FROM groups WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GROUP_MEMBER_ALL, "DELETE FROM group_member WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_GIFT, "INSERT INTO character_gifts (guid, item_guid, entry, flags) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_INSTANCE_BY_INSTANCE, "DELETE FROM instance WHERE id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, "DELETE FROM character_instance WHERE instance = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF, "DELETE FROM character_instance USING character_instance LEFT JOIN instance ON character_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF, "DELETE FROM group_instance USING group_instance LEFT JOIN instance ON group_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_INSTANCE_BY_MAP_DIFF, "DELETE FROM instance WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_MAIL_ITEM_BY_ID, "DELETE FROM mail_items WHERE mail_id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_DECLINEDNAME, "DELETE FROM character_pet_declinedname WHERE id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_ADD_CHAR_PET_DECLINEDNAME, "INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_PET_NAME, "UPDATE character_pet SET name = ?, renamed = 1 WHERE owner = ? AND id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_PETITION, "INSERT INTO petition (ownerguid, petitionguid, name, type) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PETITION_BY_GUID, "DELETE FROM petition WHERE petitionguid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE_BY_GUID, "DELETE FROM petition_sign WHERE petitionguid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ? AND id <> ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_PET_SLOT_BY_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_BY_ID, "DELETE FROM character_pet WHERE id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PET_AURAS, "DELETE FROM pet_aura WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PET_SPELLS, "DELETE FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PET_SPELL_COOLDOWNS, "DELETE FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? and spell = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_DECLINED_NAME, "INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_FACTION_OR_RACE, "UPDATE characters SET name = ?, race = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILL_LANGUAGES, "DELETE FROM character_skills WHERE skill IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_SKILL_LANGUAGE, "INSERT INTO `character_skills` (guid, skill, value, max) VALUES (?, ?, 300, 300)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_TAXI_PATH, "UPDATE characters SET taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_TAXIMASK, "UPDATE characters SET taximask = ? WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS, "DELETE FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SOCIAL_BY_GUID, "DELETE FROM character_social WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, "DELETE FROM character_social WHERE friend = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, "DELETE FROM character_achievement WHERE achievement = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_ACHIEVEMENT, "UPDATE character_achievement SET achievement = ? where achievement = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, "UPDATE item_instance ii, character_inventory ci SET ii.itemEntry = ? WHERE ii.itemEntry = ? AND ci.guid = ? AND ci.item = ii.guid", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL_BY_SPELL, "DELETE FROM character_spell WHERE spell = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, "UPDATE character_spell SET spell = ? where spell = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_REP_BY_FACTION, "DELETE FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_REP_FACTION_CHANGE, "UPDATE character_reputation SET faction = ? where faction = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL_COOLDOWN, "DELETE FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION, "DELETE FROM character_action WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_GIFT, "DELETE FROM character_gifts WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INVENTORY, "DELETE FROM character_inventory WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, "DELETE FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_REPUTATION, "DELETE FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL, "DELETE FROM character_spell WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_MAIL, "DELETE FROM mail WHERE receiver = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_MAIL_ITEMS, "DELETE FROM mail_items WHERE receiver = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_BY_OWNER, "DELETE FROM character_pet WHERE owner = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, "DELETE FROM character_pet_declinedname WHERE owner = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENTS, "DELETE FROM character_achievement WHERE guid = ? AND achievement NOT BETWEEN '456' AND '467' AND achievement NOT BETWEEN '1400' AND '1427' AND achievement NOT IN(1463, 3117, 3259)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_GLYPHS, "DELETE FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_DAILY, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UDP_CHAR_HONOR_POINTS, "UPDATE characters SET totalHonorPoints = ? WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UDP_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = ? WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UDP_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_ACTION, "INSERT INTO character_action (guid, spec, button, action, type) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_CHAR_ACTION, "UPDATE character_action SET action = ?, type = ? WHERE guid = ? AND button = ? AND spec = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, "DELETE FROM character_action WHERE guid = ? and button = ? and spec = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3, itemcount4, playercount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, "DELETE FROM character_queststatus WHERE guid = ? AND quest = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_QUESTSTATUS, "INSERT IGNORE INTO character_queststatus_rewarded (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, "DELETE FROM character_queststatus_rewarded WHERE guid = ? AND quest = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILL_BY_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_SKILLS, "INSERT INTO character_skills (guid, skill, value, max) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UDP_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, spirit, armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE FROM petition_sign WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and spec = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, spec) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND slot = ?", CONNECTION_SYNCH); } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index fa3654dc0c9..85b948f6ce6 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -48,10 +48,12 @@ enum CharacterDatabaseStatements CHAR_DEL_EXPIRED_BANS, CHAR_SEL_GUID_BY_NAME, CHAR_SEL_CHECK_NAME, + CHAR_SEL_CHECK_GUID, CHAR_SEL_SUM_CHARS, CHAR_SEL_CHAR_CREATE_INFO, CHAR_INS_CHARACTER_BAN, CHAR_UPD_CHARACTER_BAN, + CHAR_DEL_CHARACTER_BAN, CHAR_SEL_BANINFO, CHAR_SEL_GUID_BY_NAME_FILTER, CHAR_SEL_BANINFO_LIST, @@ -64,6 +66,12 @@ enum CharacterDatabaseStatements CHAR_SEL_PET_SLOT_BY_ID, CHAR_SEL_FREE_NAME, CHAR_SEL_GUID_RACE_ACC_BY_NAME, + CHAR_SEL_CHAR_RACE, + CHAR_SEL_CHAR_LEVEL, + CHAR_SEL_CHAR_ZONE, + CHAR_SEL_CHARACTER_NAME_DATA, + CHAR_SEL_CHAR_POSITION_XYZ, + CHAR_SEL_CHAR_POSITION, CHAR_DEL_QUEST_STATUS_DAILY, CHAR_DEL_QUEST_STATUS_WEEKLY, CHAR_DEL_QUEST_STATUS_SEASONAL, @@ -91,6 +99,7 @@ enum CharacterDatabaseStatements CHAR_SEL_CHARACTER_ACTIONS_SPEC, CHAR_SEL_CHARACTER_MAILCOUNT, CHAR_SEL_CHARACTER_MAILDATE, + CHAR_SEL_MAIL_COUNT, CHAR_SEL_CHARACTER_SOCIALLIST, CHAR_SEL_CHARACTER_HOMEBIND, CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, @@ -112,9 +121,11 @@ enum CharacterDatabaseStatements CHAR_SEL_AUCTION_ITEMS, CHAR_INS_AUCTION, CHAR_DEL_AUCTION, + CHAR_SEL_AUCTION_BY_TIME, + CHAR_UPD_AUCTION_BID, CHAR_SEL_AUCTIONS, CHAR_INS_MAIL, - CHAR_DEL_MAIL, + CHAR_DEL_MAIL_BY_ID, CHAR_INS_MAIL_ITEM, CHAR_DEL_MAIL_ITEM, CHAR_DEL_INVALID_MAIL_ITEM, @@ -129,21 +140,24 @@ enum CharacterDatabaseStatements CHAR_DEL_ITEM_BOP_TRADE, CHAR_INS_ITEM_BOP_TRADE, CHAR_REP_INVENTORY_ITEM, - CHAR_DEL_INVENTORY_ITEM, CHAR_REP_ITEM_INSTANCE, CHAR_UPD_ITEM_INSTANCE, CHAR_UPD_ITEM_INSTANCE_ON_LOAD, CHAR_DEL_ITEM_INSTANCE, CHAR_UPD_GIFT_OWNER, CHAR_DEL_GIFT, + CHAR_SEL_CHARACTER_GIFT_BY_ITEM, CHAR_SEL_ACCOUNT_BY_NAME, + CHAR_SEL_ACCOUNT_BY_GUID, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_SEL_CHARACTER_NAME_CLASS, + CHAR_SEL_CHARACTER_NAME, CHAR_SEL_MATCH_MAKER_RATING, CHAR_SEL_CHARACTER_COUNT, CHAR_UPD_NAME, CHAR_DEL_DECLINED_NAME, + CHAR_SEL_ACCOUNT_NAME_BY_GUID, CHAR_INS_GUILD, CHAR_DEL_GUILD, @@ -220,7 +234,6 @@ enum CharacterDatabaseStatements CHAR_INS_EQUIP_SET, CHAR_DEL_EQUIP_SET, - CHAR_DEL_AURA, CHAR_INS_AURA, CHAR_SEL_ACCOUNT_DATA, @@ -261,10 +274,16 @@ enum CharacterDatabaseStatements CHAR_SEL_PETITION_SIGNATURE, CHAR_DEL_ALL_PETITION_SIGNATURES, CHAR_DEL_PETITION_SIGNATURE, + CHAR_SEL_PETITION_BY_OWNER, + CHAR_SEL_PETITION_TYPE, + CHAR_SEL_PETITION_SIGNATURES, + CHAR_SEL_PETITION_SIG_BY_ACCOUNT, + CHAR_SEL_PETITION_OWNER_BY_GUID, + CHAR_SEL_PETITION_SIG_BY_GUID, + CHAR_SEL_PETITION_SIG_BY_GUID_TYPE, CHAR_INS_PLAYER_BGDATA, CHAR_DEL_PLAYER_BGDATA, - CHAR_UPD_PLAYERS_BGDATA, CHAR_INS_PLAYER_HOMEBIND, CHAR_UPD_PLAYER_HOMEBIND, @@ -275,7 +294,6 @@ enum CharacterDatabaseStatements CHAR_DEL_CORPSE, CHAR_DEL_PLAYER_CORPSES, CHAR_DEL_OLD_CORPSES, - CHAR_UPD_NONEXISTENT_INSTANCE_FOR_CORPSES, CHAR_SEL_CREATURE_RESPAWNS, CHAR_REP_CREATURE_RESPAWN, @@ -283,14 +301,11 @@ enum CharacterDatabaseStatements CHAR_DEL_CREATURE_RESPAWN_BY_GUID, CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, CHAR_SEL_MAX_CREATURE_RESPAWNS, - CHAR_DEL_NONEXISTENT_INSTANCE_CREATURE_RESPAWNS, CHAR_SEL_GO_RESPAWNS, CHAR_REP_GO_RESPAWN, CHAR_DEL_GO_RESPAWN, CHAR_DEL_GO_RESPAWN_BY_INSTANCE, - CHAR_DEL_EXPIRED_GO_RESPAWNS, - CHAR_DEL_NONEXISTENT_INSTANCE_GO_RESPAWNS, CHAR_SEL_GM_TICKETS, CHAR_REP_GM_TICKET, @@ -342,7 +357,7 @@ enum CharacterDatabaseStatements CHAR_UPD_CHAR_NAME_AT_LOGIN, CHAR_UPD_WORLDSTATE, CHAR_INS_WORLDSTATE, - CHAR_DEL_CHAR_INSTANCE, + CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, CHAR_UPD_CHAR_INSTANCE, CHAR_INS_CHAR_INSTANCE, CHAR_UPD_GENDER_PLAYERBYTES, @@ -357,6 +372,150 @@ enum CharacterDatabaseStatements CHAR_INS_LFG_DATA, CHAR_DEL_LFG_DATA, + CHAR_SEL_CHARACTER_AURA_FROZEN, + CHAR_SEL_CHARACTER_ONLINE, + + CHAR_SEL_CHAR_DEL_INFO_BY_GUID, + CHAR_SEL_CHAR_DEL_INFO_BY_NAME, + CHAR_SEL_CHAR_DEL_INFO, + + CHAR_SEL_CHARS_BY_ACCOUNT_ID, + CHAR_SEL_CHAR_PINFO, + CHAR_SEL_PINFO_BANS, + CHAR_SEL_CHAR_HOMEBIND, + CHAR_SEL_CHAR_GUID_NAME_BY_ACC, + CHAR_SEL_POOL_QUEST_SAVE, + CHAR_SEL_CHARACTER_AT_LOGIN, + CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, + CHAR_SEL_INSTANCE, + CHAR_SEL_PET_SPELL_LIST, + CHAR_SEL_CHAR_PET, + CHAR_SEL_CHAR_PETS, + CHAR_SEL_CHAR_COD_ITEM_MAIL, + CHAR_SEL_CHAR_SOCIAL, + CHAR_SEL_PET_AURA, + CHAR_SEL_CHAR_OLD_CHARS, + CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, + CHAR_SEL_MAIL, + CHAR_SEL_CHAR_PLAYERBYTES2, + CHAR_SEL_PET_SPELL, + CHAR_SEL_PET_SPELL_COOLDOWN, + CHAR_SEL_PET_DECLINED_NAME, + CHAR_SEL_CHAR_GUID_BY_NAME, + CHAR_DEL_CHAR_AURA_FROZEN, + CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, + CHAR_SEL_MAIL_COUNT_ITEM, + CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM, + CHAR_SEL_GUILD_BANK_COUNT_ITEM, + CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY, + CHAR_SEL_MAIL_ITEMS_BY_ENTRY, + CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, + CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, + CHAR_SEL_CHAR_PET_BY_ENTRY, + CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, + CHAR_SEL_CHAR_PET_BY_SLOT, + CHAR_DEL_CHAR_ACHIEVEMENT, + CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, + CHAR_DEL_CHAR_REPUTATION_BY_FACTION, + CHAR_INS_CHAR_REPUTATION_BY_FACTION, + CHAR_UPD_CHAR_ARENA_POINTS, + CHAR_DEL_ITEM_REFUND_INSTANCE, + CHAR_INS_ITEM_REFUND_INSTANCE, + CHAR_DEL_GROUP, + CHAR_DEL_GROUP_MEMBER_ALL, + CHAR_INS_CHAR_GIFT, + CHAR_DEL_INSTANCE_BY_INSTANCE, + CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, + CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF, + CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF, + CHAR_DEL_INSTANCE_BY_MAP_DIFF, + CHAR_DEL_MAIL_ITEM_BY_ID, + CHAR_DEL_CHAR_PET_DECLINEDNAME, + CHAR_ADD_CHAR_PET_DECLINEDNAME, + CHAR_UPD_CHAR_PET_NAME, + CHAR_INS_PETITION, + CHAR_DEL_PETITION_BY_GUID, + CHAR_DEL_PETITION_SIGNATURE_BY_GUID, + CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID, + CHAR_UDP_CHAR_PET_SLOT_BY_SLOT, + CHAR_UPD_CHAR_PET_SLOT_BY_ID, + CHAR_DEL_CHAR_PET_BY_ID, + CHAR_DEL_CHAR_PET_BY_SLOT, + CHAR_DEL_PET_AURAS, + CHAR_DEL_PET_SPELLS, + CHAR_DEL_PET_SPELL_COOLDOWNS, + CHAR_INS_PET_SPELL_COOLDOWN, + CHAR_DEL_PET_SPELL_BY_SPELL, + CHAR_INS_PET_SPELL, + CHAR_INS_PET_AURA, + CHAR_DEL_CHAR_DECLINED_NAME, + CHAR_INS_CHAR_DECLINED_NAME, + CHAR_UPD_FACTION_OR_RACE, + CHAR_DEL_CHAR_SKILL_LANGUAGES, + CHAR_INS_CHAR_SKILL_LANGUAGE, + CHAR_UPD_CHAR_TAXI_PATH, + CHAR_UPD_CHAR_TAXIMASK, + CHAR_DEL_CHAR_QUESTSTATUS, + CHAR_DEL_CHAR_SOCIAL_BY_GUID, + CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, + CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, + CHAR_UPD_CHAR_ACHIEVEMENT, + CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, + CHAR_DEL_CHAR_SPELL_BY_SPELL, + CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, + CHAR_DEL_CHAR_REP_BY_FACTION, + CHAR_UPD_CHAR_REP_FACTION_CHANGE, + CHAR_DEL_CHAR_SPELL_COOLDOWN, + CHAR_DEL_CHARACTER, + CHAR_DEL_CHAR_ACTION, + CHAR_DEL_CHAR_AURA, + CHAR_DEL_CHAR_GIFT, + CHAR_DEL_CHAR_INSTANCE, + CHAR_DEL_CHAR_INVENTORY, + CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, + CHAR_DEL_CHAR_REPUTATION, + CHAR_DEL_CHAR_SPELL, + CHAR_DEL_MAIL, + CHAR_DEL_MAIL_ITEMS, + CHAR_DEL_CHAR_PET_BY_OWNER, + CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, + CHAR_DEL_CHAR_ACHIEVEMENTS, + CHAR_DEL_CHAR_EQUIPMENTSETS, + CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, + CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, + CHAR_DEL_CHAR_GLYPHS, + CHAR_DEL_CHAR_QUESTSTATUS_DAILY, + CHAR_DEL_CHAR_TALENT, + CHAR_DEL_CHAR_SKILLS, + CHAR_UDP_CHAR_HONOR_POINTS, + CHAR_UDP_CHAR_ARENA_POINTS, + CHAR_UDP_CHAR_MONEY, + CHAR_INS_CHAR_ACTION, + CHAR_UPD_CHAR_ACTION, + CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, + CHAR_DEL_CHAR_INVENTORY_BY_ITEM, + CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, + CHAR_UPD_MAIL, + CHAR_REP_CHAR_QUESTSTATUS, + CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, + CHAR_INS_CHAR_QUESTSTATUS, + CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, + CHAR_DEL_CHAR_SKILL_BY_SKILL, + CHAR_INS_CHAR_SKILLS, + CHAR_UDP_CHAR_SKILLS, + CHAR_INS_CHAR_SPELL, + CHAR_DEL_CHAR_STATS, + CHAR_INS_CHAR_STATS, + CHAR_DEL_PETITION_BY_OWNER, + CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, + CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, + CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, + CHAR_INS_CHAR_GLYPHS, + CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, + CHAR_INS_CHAR_TALENT, + CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, + CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, + MAX_CHARACTERDATABASE_STATEMENTS, }; diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp index 8ef8d3b48cf..028d927a720 100755 --- a/src/server/shared/Database/Implementation/LoginDatabase.cpp +++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp @@ -22,13 +22,18 @@ void LoginDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_LOGINDATABASE_STATEMENTS); - PREPARE_STATEMENT(LOGIN_SEL_REALMLIST, "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE color <> 3 ORDER BY name", CONNECTION_SYNCH) + PREPARE_STATEMENT(LOGIN_SEL_REALMLIST, "SELECT id, name, address, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE flag <> 3 ORDER BY name", CONNECTION_SYNCH) PREPARE_STATEMENT(LOGIN_DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_SEL_IP_BANNED, "SELECT * FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH) PREPARE_STATEMENT(LOGIN_INS_IP_AUTO_BANNED, "INSERT INTO ip_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban')", CONNECTION_ASYNC) + PREPARE_STATEMENT(LOGIN_SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_IP_BANNED_BY_IP, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) AND ip LIKE CONCAT('%%', ?, '%%') ORDER BY unbandate", CONNECTION_SYNCH); PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BANNED, "SELECT bandate, unbandate FROM account_banned WHERE id = ? AND active = 1", CONNECTION_SYNCH) + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id", CONNECTION_SYNCH); PREPARE_STATEMENT(LOGIN_INS_ACCOUNT_AUTO_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban', 1)", CONNECTION_ASYNC) + PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH) PREPARE_STATEMENT(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_ASYNC) @@ -36,19 +41,22 @@ void LoginDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", CONNECTION_SYNCH) PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT id, sessionkey, last_ip, locked, v, s, expansion, mutetime, locale, recruiter, os FROM account WHERE username = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(LOGIN_SEL_NUM_CHARS_ON_REALM, "SELECT numchars FROM realmcharacters WHERE realmid = ? AND acctid= ?", CONNECTION_SYNCH) - PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id FROM account WHERE last_ip = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(LOGIN_INS_IP_BANNED, "INSERT INTO ip_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_DEL_IP_NOT_BANNED, "DELETE FROM ip_banned WHERE ip = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_INS_ACCOUNT_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_UPD_ACCOUNT_NOT_BANNED, "UPDATE account_banned SET active = 0 WHERE id = ? AND active != 0", CONNECTION_ASYNC) - PREPARE_STATEMENT(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ? AND realmid = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(LOGIN_DEL_REALM_CHARACTERS_BY_REALM, "DELETE FROM realmcharacters WHERE acctid = ? AND realmid = ?", CONNECTION_ASYNC) + PREPARE_STATEMENT(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(LOGIN_SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, joindate) VALUES(?, ?, NOW())", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL", CONNECTION_ASYNC); - PREPARE_STATEMENT(LOGIN_DEL_OLD_BANS, "DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate", CONNECTION_ASYNC); - PREPARE_STATEMENT(LOGIN_DEL_OLD_IP_BANS, "DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_INS_LOG, "INSERT INTO logs (time, realm, type, string) VALUES (UNIX_TIMESTAMP(), ? , ?, ?)", CONNECTION_ASYNC); @@ -62,4 +70,21 @@ void LoginDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT_ACCESS, "DELETE FROM account_access WHERE id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM, "DELETE FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_ASYNC); PREPARE_STATEMENT(LOGIN_INS_ACCOUNT_ACCESS, "INSERT INTO account_access (id,gmlevel,RealmID) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(LOGIN_GET_ACCOUNT_ID_BY_USERNAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL, "SELECT gmlevel FROM account_access WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_GET_GMLEVEL_BY_REALMID, "SELECT gmlevel FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, "SELECT 1 FROM account_access WHERE id = ? AND gmlevel > ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_ACCESS, "SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_RECRUITER, "SELECT 1 FROM account WHERE recruiter = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_BANS, "SELECT 1 FROM account_banned WHERE id = ? AND active = 1 UNION SELECT 1 FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC); } diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h index afb188020c7..7c2a94eec94 100755 --- a/src/server/shared/Database/Implementation/LoginDatabase.h +++ b/src/server/shared/Database/Implementation/LoginDatabase.h @@ -48,7 +48,10 @@ enum LoginDatabaseStatements LOGIN_SEL_IP_BANNED, LOGIN_INS_IP_AUTO_BANNED, LOGIN_SEL_ACCOUNT_BANNED, + LOGIN_SEL_ACCOUNT_BANNED_ALL, + LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, LOGIN_INS_ACCOUNT_AUTO_BANNED, + LOGIN_DEL_ACCOUNT_BANNED, LOGIN_SEL_SESSIONKEY, LOGIN_UPD_VS, LOGIN_UPD_LOGONPROOF, @@ -56,19 +59,24 @@ enum LoginDatabaseStatements LOGIN_UPD_FAILEDLOGINS, LOGIN_SEL_FAILEDLOGINS, LOGIN_SEL_ACCOUNT_ID_BY_NAME, + LOGIN_SEL_ACCOUNT_LIST_BY_NAME, + LOGIN_SEL_ACCOUNT_INFO_BY_NAME, + LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, LOGIN_SEL_NUM_CHARS_ON_REALM, LOGIN_SEL_ACCOUNT_BY_IP, LOGIN_INS_IP_BANNED, LOGIN_DEL_IP_NOT_BANNED, + LOGIN_SEL_IP_BANNED_ALL, + LOGIN_SEL_IP_BANNED_BY_IP, + LOGIN_SEL_ACCOUNT_BY_ID, LOGIN_INS_ACCOUNT_BANNED, LOGIN_UPD_ACCOUNT_NOT_BANNED, + LOGIN_DEL_REALM_CHARACTERS_BY_REALM, LOGIN_DEL_REALM_CHARACTERS, LOGIN_INS_REALM_CHARACTERS, LOGIN_SEL_SUM_REALM_CHARACTERS, LOGIN_INS_ACCOUNT, LOGIN_INS_REALM_CHARACTERS_INIT, - LOGIN_DEL_OLD_BANS, - LOGIN_DEL_OLD_IP_BANS, LOGIN_UPD_EXPANSION, LOGIN_UPD_ACCOUNT_LOCK, LOGIN_INS_LOG, @@ -82,6 +90,23 @@ enum LoginDatabaseStatements LOGIN_DEL_ACCOUNT_ACCESS, LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM, LOGIN_INS_ACCOUNT_ACCESS, + LOGIN_GET_ACCOUNT_ID_BY_USERNAME, + LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL, + LOGIN_GET_GMLEVEL_BY_REALMID, + LOGIN_GET_USERNAME_BY_ID, + LOGIN_SEL_CHECK_PASSWORD, + LOGIN_SEL_CHECK_PASSWORD_BY_NAME, + LOGIN_SEL_PINFO, + LOGIN_SEL_PINFO_BANS, + LOGIN_SEL_GM_ACCOUNTS, + LOGIN_SEL_ACCOUNT_INFO, + LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, + LOGIN_SEL_ACCOUNT_ACCESS, + LOGIN_SEL_ACCOUNT_RECRUITER, + LOGIN_SEL_BANS, + LOGIN_SEL_ACCOUNT_WHOIS, + LOGIN_SEL_REALMLIST_SECURITY_LEVEL, + LOGIN_DEL_ACCOUNT, MAX_LOGINDATABASE_STATEMENTS, }; diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index d7d8491008b..e3455891909 100755 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -36,6 +36,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(WORLD_DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_INS_NPC_VENODR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry = ? ORDER BY slot ASC", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_UPD_CREATURE_MOVEMENT_TYPE, "UPDATE creature SET MovementType = ? WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_CREATURE_FACTION, "UPDATE creature_template SET faction_A = ?, faction_H = ? WHERE entry = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_CREATURE_NPCFLAG, "UPDATE creature_template SET npcflag = ? WHERE entry = ?", CONNECTION_ASYNC); @@ -48,10 +49,23 @@ void WorldDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_POINT, "UPDATE waypoint_data SET point = point - 1 WHERE id = ? AND point > ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_POSITION, "UPDATE waypoint_data SET position_x = ?, position_y = ?, position_z = ? where id = ? AND point = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_WPGUID, "UPDATE waypoint_data SET wpguid = ? WHERE id = ? and point = ?", CONNECTION_ASYNC); - PREPARE_STATEMENT(WORLD_UPD_ALL_WAYPOINT_DATA_WPGUID, "UPDATE waypoint_data SET wpguid = 0", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_MAX_ID, "SELECT MAX(id) FROM waypoint_data", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_MAX_POINT, "SELECT MAX(point) FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, move_flag, delay, action, action_chance FROM waypoint_data WHERE id = ? ORDER BY point", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT position_x, position_y, position_z FROM waypoint_data WHERE point = 1 AND id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID, "SELECT id, point FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID, "SELECT id, point, delay, move_flag, action, action_chance FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, "UPDATE waypoint_data SET wpguid = 0", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_BY_POS, "SELECT id, point FROM waypoint_data WHERE (abs(position_x - ?) <= ?) and (abs(position_y - ?) <= ?) and (abs(position_z - ?) <= ?)", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID, "SELECT wpguid FROM waypoint_data WHERE id = ? and wpguid <> 0", CONNECTION_SYNCH); + PREPARE_STATEMENT(WOLRD_SEL_WAYPOINT_DATA_ACTION, "SELECT DISTINCT action FROM waypoint_data", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID, "SELECT MAX(guid) FROM waypoint_scripts", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_INS_CREATURE_ADDON, "INSERT INTO creature_addon(guid, path_id) VALUES (?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_CREATURE_ADDON_PATH, "UPDATE creature_addon SET path_id = ? WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_DEL_CREATURE_ADDON, "DELETE FROM creature_addon WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_CREATURE_ADDON_BY_GUID, "SELECT guid FROM creature_addon WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_INS_WAYPOINT_SCRIPT, "INSERT INTO waypoint_scripts (guid) VALUES (?)", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_DEL_WAYPOINT_SCRIPT, "DELETE FROM waypoint_scripts WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_ID, "UPDATE waypoint_scripts SET id = ? WHERE guid = ?", CONNECTION_ASYNC); @@ -59,5 +73,19 @@ void WorldDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_Y, "UPDATE waypoint_scripts SET y = ? WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_Z, "UPDATE waypoint_scripts SET z = ? WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnMask, phaseMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); } diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h index e708177503f..0580cecec7e 100755 --- a/src/server/shared/Database/Implementation/WorldDatabase.h +++ b/src/server/shared/Database/Implementation/WorldDatabase.h @@ -56,6 +56,7 @@ enum WorldDatabaseStatements WORLD_DEL_GAME_TELE, WORLD_INS_NPC_VENODR, WORLD_DEL_NPC_VENDOR, + WORLD_SEL_NPC_VENDOR_REF, WORLD_UPD_CREATURE_MOVEMENT_TYPE, WORLD_UPD_CREATURE_FACTION, WORLD_UPD_CREATURE_NPCFLAG, @@ -68,10 +69,23 @@ enum WorldDatabaseStatements WORLD_UPD_WAYPOINT_DATA_POINT, WORLD_UPD_WAYPOINT_DATA_POSITION, WORLD_UPD_WAYPOINT_DATA_WPGUID, - WORLD_UPD_ALL_WAYPOINT_DATA_WPGUID, + WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, + WORLD_SEL_WAYPOINT_DATA_MAX_ID, + WORLD_SEL_WAYPOINT_DATA_BY_ID, + WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, + WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, + WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, + WORLD_SEL_WAYPOINT_DATA_BY_WPGUID, + WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID, + WORLD_SEL_WAYPOINT_DATA_MAX_POINT, + WORLD_SEL_WAYPOINT_DATA_BY_POS, + WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID, + WOLRD_SEL_WAYPOINT_DATA_ACTION, + WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID, WORLD_UPD_CREATURE_ADDON_PATH, WORLD_INS_CREATURE_ADDON, WORLD_DEL_CREATURE_ADDON, + WORLD_SEL_CREATURE_ADDON_BY_GUID, WORLD_INS_WAYPOINT_SCRIPT, WORLD_DEL_WAYPOINT_SCRIPT, WORLD_UPD_WAYPOINT_SCRIPT_ID, @@ -79,7 +93,22 @@ enum WorldDatabaseStatements WORLD_UPD_WAYPOINT_SCRIPT_Y, WORLD_UPD_WAYPOINT_SCRIPT_Z, WORLD_UPD_WAYPOINT_SCRIPT_O, + WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, WORLD_DEL_CREATURE, + WORLD_INS_CREATURE_TRANSPORT, + WORLD_UPD_CREATURE_TRANSPORT_EMOTE, + WORLD_SEL_COMMANDS, + WORLD_SEL_CREATURE_TEMPLATE, + WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, + WORLD_SEL_IP2NATION_COUNTRY, + WORLD_SEL_ITEM_TEMPLATE_BY_NAME, + WORLD_SEL_CREATURE_BY_ID, + WORLD_SEL_GAMEOBJECT_NEAREST, + WORLD_SEL_GAMEOBJECT_TARGET, + WORLD_INS_CREATURE, + WORLD_DEL_GAME_EVENT_CREATURE, + WORLD_DEL_GAME_EVENT_MODEL_EQUIP, + WORLD_INS_GAMEOBJECT, MAX_WORLDDATABASE_STATEMENTS, }; diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp index f686db4c199..7fb4a4f7025 100755 --- a/src/server/shared/Database/MySQLConnection.cpp +++ b/src/server/shared/Database/MySQLConnection.cpp @@ -58,17 +58,13 @@ MySQLConnection::~MySQLConnection() { ASSERT (m_Mysql); /// MySQL context must be present at this point - sLog->outSQLDriver("MySQLConnection::~MySQLConnection()"); for (size_t i = 0; i < m_stmts.size(); ++i) delete m_stmts[i]; for (PreparedStatementMap::const_iterator itr = m_queries.begin(); itr != m_queries.end(); ++itr) - { free((void *)m_queries[itr->first].first); - } mysql_close(m_Mysql); - Unlock(); /// Unlock while we die, how ironic } void MySQLConnection::Close() diff --git a/src/server/shared/Database/PreparedStatement.cpp b/src/server/shared/Database/PreparedStatement.cpp index baeb591ffb1..db26dabaee7 100755 --- a/src/server/shared/Database/PreparedStatement.cpp +++ b/src/server/shared/Database/PreparedStatement.cpp @@ -42,12 +42,20 @@ void PreparedStatement::BindParameters() m_stmt->setBool(i, statement_data[i].data.boolean); break; case TYPE_UI8: + m_stmt->setUInt8(i, statement_data[i].data.ui8); + break; case TYPE_UI16: + m_stmt->setUInt16(i, statement_data[i].data.ui16); + break; case TYPE_UI32: m_stmt->setUInt32(i, statement_data[i].data.ui32); break; case TYPE_I8: + m_stmt->setInt8(i, statement_data[i].data.i8); + break; case TYPE_I16: + m_stmt->setInt16(i, statement_data[i].data.i16); + break; case TYPE_I32: m_stmt->setInt32(i, statement_data[i].data.i32); break; @@ -89,7 +97,7 @@ void PreparedStatement::setUInt8(const uint8 index, const uint8 value) if (index >= statement_data.size()) statement_data.resize(index+1); - statement_data[index].data.ui32 = value; + statement_data[index].data.ui8 = value; statement_data[index].type = TYPE_UI8; } @@ -98,7 +106,7 @@ void PreparedStatement::setUInt16(const uint8 index, const uint16 value) if (index >= statement_data.size()) statement_data.resize(index+1); - statement_data[index].data.ui32 = value; + statement_data[index].data.ui16 = value; statement_data[index].type = TYPE_UI16; } @@ -125,7 +133,7 @@ void PreparedStatement::setInt8(const uint8 index, const int8 value) if (index >= statement_data.size()) statement_data.resize(index+1); - statement_data[index].data.i32 = value; + statement_data[index].data.i8 = value; statement_data[index].type = TYPE_I8; } @@ -134,7 +142,7 @@ void PreparedStatement::setInt16(const uint8 index, const int16 value) if (index >= statement_data.size()) statement_data.resize(index+1); - statement_data[index].data.i32 = value; + statement_data[index].data.i16 = value; statement_data[index].type = TYPE_I16; } @@ -201,6 +209,11 @@ m_bind(NULL) MySQLPreparedStatement::~MySQLPreparedStatement() { ClearParameters(); + if(m_Mstmt->bind_result_done) + { + delete[] m_Mstmt->bind->length; + delete[] m_Mstmt->bind->is_null; + } mysql_stmt_close(m_Mstmt); delete[] m_bind; } @@ -230,17 +243,23 @@ bool MySQLPreparedStatement::CheckValidIndex(uint8 index) void MySQLPreparedStatement::setBool(const uint8 index, const bool value) { - setUInt32(index, value); + setUInt8(index, value ? 1 : 0); } void MySQLPreparedStatement::setUInt8(const uint8 index, const uint8 value) { - setUInt32(index, value); + CheckValidIndex(index); + m_paramsSet[index] = true; + MYSQL_BIND* param = &m_bind[index]; + setValue(param, MYSQL_TYPE_TINY, &value, sizeof(uint8), true); } void MySQLPreparedStatement::setUInt16(const uint8 index, const uint16 value) { - setUInt32(index, value); + CheckValidIndex(index); + m_paramsSet[index] = true; + MYSQL_BIND* param = &m_bind[index]; + setValue(param, MYSQL_TYPE_SHORT, &value, sizeof(uint16), true); } void MySQLPreparedStatement::setUInt32(const uint8 index, const uint32 value) @@ -261,12 +280,18 @@ void MySQLPreparedStatement::setUInt64(const uint8 index, const uint64 value) void MySQLPreparedStatement::setInt8(const uint8 index, const int8 value) { - setInt32(index, value); + CheckValidIndex(index); + m_paramsSet[index] = true; + MYSQL_BIND* param = &m_bind[index]; + setValue(param, MYSQL_TYPE_TINY, &value, sizeof(int8), false); } void MySQLPreparedStatement::setInt16(const uint8 index, const int16 value) { - setInt32(index, value); + CheckValidIndex(index); + m_paramsSet[index] = true; + MYSQL_BIND* param = &m_bind[index]; + setValue(param, MYSQL_TYPE_SHORT, &value, sizeof(int16), false); } void MySQLPreparedStatement::setInt32(const uint8 index, const int32 value) @@ -348,12 +373,20 @@ std::string MySQLPreparedStatement::getQueryString(const char *query) replace << (m_stmt->statement_data[i].data.boolean ? '1' : '0'); break; case TYPE_UI8: + replace << uint16(m_stmt->statement_data[i].data.ui8); // stringstream will append a character with that code instead of numeric representation + break; case TYPE_UI16: + replace << m_stmt->statement_data[i].data.ui16; + break; case TYPE_UI32: replace << m_stmt->statement_data[i].data.ui32; break; case TYPE_I8: + replace << int16(m_stmt->statement_data[i].data.i8); // stringstream will append a character with that code instead of numeric representation + break; case TYPE_I16: + replace << m_stmt->statement_data[i].data.i16; + break; case TYPE_I32: replace << m_stmt->statement_data[i].data.i32; break; diff --git a/src/server/shared/Database/QueryResult.h b/src/server/shared/Database/QueryResult.h index 524532f30ec..e32b16555bc 100755 --- a/src/server/shared/Database/QueryResult.h +++ b/src/server/shared/Database/QueryResult.h @@ -19,7 +19,7 @@ #ifndef QUERYRESULT_H #define QUERYRESULT_H -#include +#include "AutoPtr.h" #include #include "Field.h" @@ -58,7 +58,7 @@ class ResultSet MYSQL_FIELD* _fields; }; -typedef ACE_Refcounted_Auto_Ptr QueryResult; +typedef Trinity::AutoPtr QueryResult; class PreparedResultSet { @@ -103,7 +103,7 @@ class PreparedResultSet }; -typedef ACE_Refcounted_Auto_Ptr PreparedQueryResult; +typedef Trinity::AutoPtr PreparedQueryResult; #endif diff --git a/src/server/shared/Database/Transaction.h b/src/server/shared/Database/Transaction.h index 92002819951..805d48f76cf 100755 --- a/src/server/shared/Database/Transaction.h +++ b/src/server/shared/Database/Transaction.h @@ -47,7 +47,7 @@ class Transaction bool _cleanedUp; }; -typedef ACE_Refcounted_Auto_Ptr SQLTransaction; +typedef Trinity::AutoPtr SQLTransaction; /*! Low level class*/ class TransactionTask : public SQLOperation diff --git a/src/server/shared/Debugging/Errors.h b/src/server/shared/Debugging/Errors.h index 6927fdb483f..48a8bda32ed 100755 --- a/src/server/shared/Debugging/Errors.h +++ b/src/server/shared/Debugging/Errors.h @@ -24,10 +24,10 @@ #include #include -#define WPAssert( assertion ) { if (!(assertion)) { ACE_Stack_Trace st; sLog->outError( "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); assert( #assertion &&0 ); ((void(*)())NULL)();} } -#define WPError( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "%\n%s:%i in %s ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); assert( false ); } -#define WPWarning( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s WARNING:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); } -#define WPFatal( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); ACE_OS::sleep(10); assert( #assertion &&0 ); abort(); } +#define WPAssert(assertion) { if (!(assertion)) { ACE_Stack_Trace st; sLog->outError("\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); *((volatile int*)NULL) = 0; } } +#define WPError(assertion, errmsg) { if (!(assertion)) { sLog->outError("%\n%s:%i in %s ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg); *((volatile int*)NULL) = 0; } } +#define WPWarning(assertion, errmsg) { if (!(assertion)) { sLog->outError("\n%s:%i in %s WARNING:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg); } } +#define WPFatal(assertion, errmsg) { if (!(assertion)) { sLog->outError("\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg); ACE_OS::sleep(10); *((volatile int*)NULL) = 0; } } #define ASSERT WPAssert #endif diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/server/shared/Debugging/WheatyExceptionReport.cpp index 63648f66e29..febc5ef3573 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.cpp +++ b/src/server/shared/Debugging/WheatyExceptionReport.cpp @@ -195,7 +195,23 @@ BOOL WheatyExceptionReport::_GetWindowsVersion(TCHAR* szVersion, DWORD cntMax) case VER_PLATFORM_WIN32_NT: // Test for the specific product family. if (osvi.dwMajorVersion == 6) - _tcsncat(szVersion, _T("Windows Vista or Windows Server 2008 "), cntMax); + { + #if WINVER < 0x0500 + if (osvi.wReserved[1] == VER_NT_WORKSTATION) + #else + if (osvi.wProductType == VER_NT_WORKSTATION) + #endif // WINVER < 0x0500 + { + if (osvi.dwMinorVersion == 1) + _tcsncat(szVersion, _T("Windows 7 "), cntMax); + else + _tcsncat(szVersion, _T("Windows Vista "), cntMax); + } + else if (osvi.dwMinorVersion == 1) + _tcsncat(szVersion, _T("Windows Server 2008 R2 "), cntMax); + else + _tcsncat(szVersion, _T("Windows Server 2008 "), cntMax); + } if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) _tcsncat(szVersion, _T("Microsoft Windows Server 2003 "), cntMax); if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) diff --git a/src/server/shared/Dynamic/TypeContainerFunctionsPtr.h b/src/server/shared/Dynamic/TypeContainerFunctionsPtr.h deleted file mode 100755 index 2c065d96d4a..00000000000 --- a/src/server/shared/Dynamic/TypeContainerFunctionsPtr.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TYPECONTAINER_FUNCTIONS_PTR_H -#define TYPECONTAINER_FUNCTIONS_PTR_H - -/* - * Here you'll find a list of helper functions to make - * the TypeContainer usefull. Without it, its hard - * to access or mutate the container. - */ - -#include "Platform/Define.h" -#include "Utilities/TypeList.h" -#include - -namespace Trinity -{ - /* ContainerMapList Helpers */ - // count functions - // template size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) - // { - // return elements._element.size(); - // }; - // - // template size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) - // { - // return 0; - // } - // - // template size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) - // { - // return 0; - // } - // - // template size_t Count(const ContainerMapList >&elements, SPECIFIC_TYPE* fake) - // { - // return Count(elements._elements, fake); - // } - // - // template size_t Count(const ContainerMapList >&elements, SPECIFIC_TYPE* fake) - // { - // return Count(elements._TailElements, fake); - // } - - // non-const find functions - template CountedPtr& Find(ContainerMapList &elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) - { - typename std::map >::iterator iter = elements._element.find(hdl); - return (iter == elements._element.end() ? NullPtr((SPECIFIC_TYPE*)NULL) : iter->second); - }; - - template CountedPtr& Find(ContainerMapList &elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) - { - return NullPtr((SPECIFIC_TYPE*)NULL);// terminate recursion - } - - template CountedPtr& Find(ContainerMapList &elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) - { - return NullPtr((SPECIFIC_TYPE*)NULL);// this is a missed - } - - template CountedPtr& Find(ContainerMapList >&elements, OBJECT_HANDLE hdl, CountedPtr* fake) - { - CountedPtr &t = Find(elements._elements, hdl, fake); - return (!t ? Find(elements._TailElements, hdl, fake) : t); - } - - // const find functions - template const CountedPtr& Find(const ContainerMapList &elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) - { - typename CountedPtr::iterator iter = elements._element.find(hdl); - return (iter == elements._element.end() ? NullPtr((SPECIFIC_TYPE*)NULL) : iter->second); - }; - - template const CountedPtr& Find(const ContainerMapList &elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) - { - return NullPtr((SPECIFIC_TYPE*)NULL); - } - - template const CountedPtr& Find(const ContainerMapList &elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) - { - return NullPtr((SPECIFIC_TYPE*)NULL); - } - - template CountedPtr& Find(const ContainerMapList >&elements, OBJECT_HANDLE hdl, CountedPtr* fake) - { - CountedPtr &t = Find(elements._elements, hdl, fake); - if (!t) - t = Find(elements._TailElement, hdl, fake); - - return t; - } - - // non-const insert functions - template CountedPtr& Insert(ContainerMapList &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - elements._element[hdl] = obj; - return obj; - }; - - template CountedPtr& Insert(ContainerMapList &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - return NullPtr((SPECIFIC_TYPE*)NULL); - } - - // this is a missed - template CountedPtr& Insert(ContainerMapList &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - return NullPtr((SPECIFIC_TYPE*)NULL);// a missed - } - - // Recursion - template CountedPtr& Insert(ContainerMapList >&elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - CountedPtr &t= Insert(elements._elements, obj, hdl); - return (!t ? Insert(elements._TailElements, obj, hdl) : t); - } - - // non-const remove method - template bool Remove(ContainerMapList &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - typename std::map >::iterator iter = elements._element.find(hdl); - if ( iter != elements._element.end() ) - { - elements._element.erase(iter); - return true; - } - - return false; // found... terminate the search - } - - template bool Remove(ContainerMapList &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - return false; - } - - // this is a missed - template bool Remove(ContainerMapList &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - return false; - } - - template bool Remove(ContainerMapList > &elements, CountedPtr &obj, OBJECT_HANDLE hdl) - { - // The head element is bad - bool t = Remove(elements._elements, obj, hdl); - return ( !t ? Remove(elements._TailElements, obj, hdl) : t ); - } - -} -#endif - diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index b583d742748..493e30d36c0 100755 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -38,11 +38,11 @@ Log::Log() : Log::~Log() { - if ( logfile != NULL ) + if (logfile != NULL) fclose(logfile); logfile = NULL; - if ( gmLogfile != NULL ) + if (gmLogfile != NULL) fclose(gmLogfile); gmLogfile = NULL; @@ -50,7 +50,7 @@ Log::~Log() fclose(charLogfile); charLogfile = NULL; - if ( dberLogfile != NULL ) + if (dberLogfile != NULL) fclose(dberLogfile); dberLogfile = NULL; @@ -81,32 +81,32 @@ Log::~Log() void Log::SetLogLevel(char *Level) { - int32 NewLevel =atoi((char*)Level); - if ( NewLevel <0 ) + int32 NewLevel = atoi((char*)Level); + if (NewLevel < 0) NewLevel = 0; m_logLevel = NewLevel; - outString( "LogLevel is %u", m_logLevel ); + outString("LogLevel is %u", m_logLevel); } void Log::SetLogFileLevel(char *Level) { - int32 NewLevel =atoi((char*)Level); - if ( NewLevel <0 ) + int32 NewLevel = atoi((char*)Level); + if (NewLevel < 0) NewLevel = 0; m_logFileLevel = NewLevel; - outString( "LogFileLevel is %u", m_logFileLevel ); + outString("LogFileLevel is %u", m_logFileLevel); } void Log::SetDBLogLevel(char *Level) { int32 NewLevel = atoi((char*)Level); - if ( NewLevel < 0 ) + if (NewLevel < 0) NewLevel = 0; m_dbLogLevel = NewLevel; - outString( "DBLogLevel is %u", m_dbLogLevel ); + outString("DBLogLevel is %u", m_dbLogLevel); } void Log::Initialize() @@ -382,7 +382,7 @@ void Log::outDB(LogTypes type, const char * str) PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_LOG); stmt->setInt32(0, realm); - stmt->setInt32(1, type); + stmt->setUInt8(1, uint8(type)); stmt->setString(2, logStr); LoginDatabase.Execute(stmt); diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index cbaa2d80451..e32ea7765a9 100755 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -31,7 +31,7 @@ enum DebugLogFilters LOG_FILTER_PETS = 0x00000002, LOG_FILTER_VEHICLES = 0x00000004, LOG_FILTER_TSCR = 0x00000008, // C++ AI, instance scripts, etc. - LOG_FILTER_DATABASE_AI = 0x08000010, // SmartAI, EventAI, CreatureAI + LOG_FILTER_DATABASE_AI = 0x00000010, // SmartAI, EventAI, CreatureAI LOG_FILTER_MAPSCRIPTS = 0x00000020, LOG_FILTER_NETWORKIO = 0x00000040, // Anything packet/netcode related LOG_FILTER_SPELLS_AURAS = 0x00000080, @@ -118,28 +118,28 @@ class Log void SetColor(bool stdout_stream, ColorTypes color); void ResetColor(bool stdout_stream); - void outErrorST( const char * err, ... ) ATTR_PRINTF(2, 3); - void outDB( LogTypes type, const char * str ); - void outString( const char * str, ... ) ATTR_PRINTF(2, 3); - void outString( ); - void outStringInLine( const char * str, ... ) ATTR_PRINTF(2, 3); - void outError( const char * err, ... ) ATTR_PRINTF(2, 3); - void outCrash( const char * err, ... ) ATTR_PRINTF(2, 3); - void outBasic( const char * str, ... ) ATTR_PRINTF(2, 3); - void outDetail( const char * str, ... ) ATTR_PRINTF(2, 3); - void outSQLDev( const char * str, ... ) ATTR_PRINTF(2, 3); + void outErrorST(const char * err, ...) ATTR_PRINTF(2, 3); + void outDB(LogTypes type, const char * str); + void outString(const char * str, ...) ATTR_PRINTF(2, 3); + void outString(); + void outStringInLine(const char * str, ...) ATTR_PRINTF(2, 3); + void outError(const char * err, ...) ATTR_PRINTF(2, 3); + void outCrash(const char * err, ...) ATTR_PRINTF(2, 3); + void outBasic(const char * str, ...) ATTR_PRINTF(2, 3); + void outDetail(const char * str, ...) ATTR_PRINTF(2, 3); + void outSQLDev(const char * str, ...) ATTR_PRINTF(2, 3); void outDebug(DebugLogFilters f, const char* str, ...) ATTR_PRINTF(3, 4); - void outStaticDebug( const char * str, ... ) ATTR_PRINTF(2, 3); - void outDebugInLine( const char * str, ... ) ATTR_PRINTF(2, 3); - void outErrorDb( const char * str, ... ) ATTR_PRINTF(2, 3); - void outChar( const char * str, ... ) ATTR_PRINTF(2, 3); - void outCommand( uint32 account, const char * str, ...) ATTR_PRINTF(3, 4); - void outRemote( const char * str, ... ) ATTR_PRINTF(2, 3); - void outChat( const char * str, ... ) ATTR_PRINTF(2, 3); - void outArena( const char * str, ... ) ATTR_PRINTF(2, 3); - void outSQLDriver( const char* str, ... ) ATTR_PRINTF(2, 3); - void outWarden( const char * str, ... ) ATTR_PRINTF(2, 3); - void outCharDump( const char * str, uint32 account_id, uint32 guid, const char * name ); + void outStaticDebug(const char * str, ...) ATTR_PRINTF(2, 3); + void outDebugInLine(const char * str, ...) ATTR_PRINTF(2, 3); + void outErrorDb(const char * str, ...) ATTR_PRINTF(2, 3); + void outChar(const char * str, ...) ATTR_PRINTF(2, 3); + void outCommand(uint32 account, const char * str, ...) ATTR_PRINTF(3, 4); + void outRemote(const char * str, ...) ATTR_PRINTF(2, 3); + void outChat(const char * str, ...) ATTR_PRINTF(2, 3); + void outArena(const char * str, ...) ATTR_PRINTF(2, 3); + void outSQLDriver(const char* str, ...) ATTR_PRINTF(2, 3); + void outWarden(const char * str, ...) ATTR_PRINTF(2, 3); + void outCharDump(const char * str, uint32 account_id, uint32 guid, const char * name); void outOpCode(uint32 op, const char * name, bool smsg = true); static void outTimestamp(FILE* file); diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 3506913fc23..24ca412d6f2 100755 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -29,22 +29,52 @@ class ByteBufferException { public: - ByteBufferException(bool _add, size_t _pos, size_t _esize, size_t _size) - : add(_add), pos(_pos), esize(_esize), size(_size) + ByteBufferException(size_t pos, size_t size, size_t valueSize) + : Pos(pos), Size(size), ValueSize(valueSize) { - PrintPosError(); } - void PrintPosError() const + protected: + size_t Pos; + size_t Size; + size_t ValueSize; +}; + +class ByteBufferPositionException : public ByteBufferException +{ + public: + ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize) + : ByteBufferException(pos, size, valueSize), _add(add) + { + PrintError(); + } + + protected: + void PrintError() const { - sLog->outError("Attempted to %s in ByteBuffer (pos: " SIZEFMTD " size: "SIZEFMTD") value with size: " SIZEFMTD, - (add ? "put" : "get"), pos, size, esize); + sLog->outError("Attempted to %s value with size: "SIZEFMTD" in ByteBuffer (pos: " SIZEFMTD " size: "SIZEFMTD") " , + (_add ? "put" : "get"), ValueSize, Pos, Size); } + private: - bool add; - size_t pos; - size_t esize; - size_t size; + bool _add; +}; + +class ByteBufferSourceException : public ByteBufferException +{ + public: + ByteBufferSourceException(size_t pos, size_t size, size_t valueSize) + : ByteBufferException(pos, size, valueSize) + { + PrintError(); + } + + protected: + void PrintError() const + { + sLog->outError("Attempted to put a %s in ByteBuffer (pos: "SIZEFMTD" size: "SIZEFMTD")", + (ValueSize > 0 ? "NULL-pointer" : "zero-sized value"), Pos, Size); + } }; class BitStream @@ -288,14 +318,17 @@ class ByteBuffer ByteBuffer &operator<<(const std::string &value) { - append((uint8 const*)value.c_str(), value.length()); + if (size_t len = value.length()) + append((uint8 const*)value.c_str(), len); append((uint8)0); return *this; } ByteBuffer &operator<<(const char *str) { - append((uint8 const*)str, str ? strlen(str) : 0); + size_t len = 0; + if (str && (len = strlen(str))) + append((uint8 const*)str, len); append((uint8)0); return *this; } @@ -421,7 +454,7 @@ class ByteBuffer void read_skip(size_t skip) { if (_rpos + skip > size()) - throw ByteBufferException(false, _rpos, skip, size()); + throw ByteBufferPositionException(false, _rpos, skip, size()); _rpos += skip; } @@ -435,7 +468,7 @@ class ByteBuffer template T read(size_t pos) const { if (pos + sizeof(T) > size()) - throw ByteBufferException(false, pos, sizeof(T), size()); + throw ByteBufferPositionException(false, pos, sizeof(T), size()); T val = *((T const*)&_storage[pos]); EndianConvert(val); return val; @@ -444,7 +477,7 @@ class ByteBuffer void read(uint8 *dest, size_t len) { if (_rpos + len > size()) - throw ByteBufferException(false, _rpos, len, size()); + throw ByteBufferPositionException(false, _rpos, len, size()); memcpy(dest, &_storage[_rpos], len); _rpos += len; } @@ -452,7 +485,7 @@ class ByteBuffer void readPackGUID(uint64& guid) { if (rpos() + 1 > size()) - throw ByteBufferException(false, _rpos, 1, size()); + throw ByteBufferPositionException(false, _rpos, 1, size()); guid = 0; @@ -464,7 +497,7 @@ class ByteBuffer if (guidmark & (uint8(1) << i)) { if (rpos() + 1 > size()) - throw ByteBufferException(false, _rpos, 1, size()); + throw ByteBufferPositionException(false, _rpos, 1, size()); uint8 bit; (*this) >> bit; @@ -557,7 +590,7 @@ class ByteBuffer void resize(size_t newsize) { - _storage.resize(newsize); + _storage.resize(newsize, 0); _rpos = 0; _wpos = size(); } @@ -568,11 +601,6 @@ class ByteBuffer _storage.reserve(ressize); } - void append(const std::string& str) - { - append((uint8 const*)str.c_str(), str.size() + 1); - } - void append(const char *src, size_t cnt) { return append((const uint8 *)src, cnt); @@ -586,7 +614,10 @@ class ByteBuffer void append(const uint8 *src, size_t cnt) { if (!cnt) - return; + throw ByteBufferSourceException(_wpos, size(), cnt); + + if (!src) + throw ByteBufferSourceException(_wpos, size(), cnt); ASSERT(size() < 10000000); @@ -634,7 +665,11 @@ class ByteBuffer void put(size_t pos, const uint8 *src, size_t cnt) { if (pos + cnt > size()) - throw ByteBufferException(true, pos, cnt, size()); + throw ByteBufferPositionException(true, pos, cnt, size()); + + if (!src) + throw ByteBufferSourceException(_wpos, size(), cnt); + memcpy(&_storage[pos], src, cnt); } diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp index 52ce74be8f8..7bedf9690ca 100755 --- a/src/server/shared/Utilities/Util.cpp +++ b/src/server/shared/Utilities/Util.cpp @@ -19,15 +19,10 @@ #include #include "Util.h" #include "utf8.h" -#ifdef USE_SFMT_FOR_RNG #include "SFMT.h" -#else -#include "MersenneTwister.h" -#endif #include #include -#ifdef USE_SFMT_FOR_RNG typedef ACE_TSS SFMTRandTSS; static SFMTRandTSS sfmtRand; @@ -61,41 +56,6 @@ double rand_chance(void) return sfmtRand->Random() * 100.0; } -#else -typedef ACE_TSS MTRandTSS; -static MTRandTSS mtRand; - -int32 irand(int32 min, int32 max) -{ - return int32(mtRand->randInt(max - min)) + min; -} - -uint32 urand(uint32 min, uint32 max) -{ - return mtRand->randInt(max - min) + min; -} - -float frand(float min, float max) -{ - return float(mtRand->randExc(max - min) + min); -} - -int32 rand32() -{ - return mtRand->randInt(); -} - -double rand_norm(void) -{ - return mtRand->randExc(); -} - -double rand_chance(void) -{ - return mtRand->randExc(100.0); -} -#endif - Tokens::Tokens(const std::string &src, const char sep, uint32 vectorReserve) { m_str = new char[src.length() + 1]; diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h index 4c2c1936993..196882dc2a0 100755 --- a/src/server/shared/Utilities/Util.h +++ b/src/server/shared/Utilities/Util.h @@ -20,7 +20,7 @@ #define _UTIL_H #include "Common.h" - +#include "Containers.h" #include #include @@ -73,7 +73,7 @@ inline uint32 secsToTimeBitFields(time_t secs) double rand_norm(void); /* Return a random double from 0.0 to 99.9999999999999. Floats support only 7 valid decimal digits. - * A double supports up to 15 valid decimal digits and is used internaly (RAND32_MAX has 10 digits). + * A double supports up to 15 valid decimal digits and is used internally (RAND32_MAX has 10 digits). * With an FPU, there is usually no difference in performance between float and double. */ double rand_chance(void); @@ -653,12 +653,4 @@ public: }; }; -/* Select a random element from a container. Note: make sure you explicitly empty check the container */ -template typename C::value_type const& SelectRandomContainerElement(C const& container) -{ - typename C::const_iterator it = container.begin(); - std::advance(it, urand(0, container.size() - 1)); - return *it; -} - #endif diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index b75dfcfc064..0d51f30449e 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -48,7 +48,6 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/gsoap ${CMAKE_SOURCE_DIR}/dep/sockets/include ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/mersennetwister ${CMAKE_SOURCE_DIR}/src/server/collision ${CMAKE_SOURCE_DIR}/src/server/collision/Management ${CMAKE_SOURCE_DIR}/src/server/collision/Models @@ -134,6 +133,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Weather ${CMAKE_SOURCE_DIR}/src/server/game/World ${CMAKE_SOURCE_DIR}/src/server/authserver/Server + ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess @@ -201,4 +201,3 @@ if( USE_COREPCH ) add_native_precompiled_header(worldserver ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders/worldPCH) endif() endif() - diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp index 8e04a9c2f34..e85a3e1870d 100755 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -125,29 +125,44 @@ void commandFinished(void*, bool /*success*/) */ bool ChatHandler::GetDeletedCharacterInfoList(DeletedInfoList& foundList, std::string searchString) { - QueryResult resultChar; + PreparedQueryResult result; + PreparedStatement* stmt; if (!searchString.empty()) { // search by GUID if (isNumeric(searchString.c_str())) - resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = %u", uint64(atoi(searchString.c_str()))); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID); + + stmt->setUInt32(0, uint32(atoi(searchString.c_str()))); + + result = CharacterDatabase.Query(stmt); + } // search by name else { if (!normalizePlayerName(searchString)) return false; - resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'"), searchString.c_str()); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME); + + stmt->setString(0, searchString); + + result = CharacterDatabase.Query(stmt); } } else - resultChar = CharacterDatabase.Query("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL"); + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO); - if (resultChar) + result = CharacterDatabase.Query(stmt); + } + + if (result) { do { - Field* fields = resultChar->Fetch(); + Field* fields = result->Fetch(); DeletedInfo info; @@ -161,7 +176,7 @@ bool ChatHandler::GetDeletedCharacterInfoList(DeletedInfoList& foundList, std::s info.deleteDate = time_t(fields[3].GetUInt32()); foundList.push_back(info); - } while (resultChar->NextRow()); + } while (result->NextRow()); } return true; @@ -299,6 +314,11 @@ void ChatHandler::HandleCharacterDeletedRestoreHelper(DeletedInfo const& delInfo stmt->setUInt32(2, delInfo.lowguid); CharacterDatabase.Execute(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME_DATA); + stmt->setUInt32(0, delInfo.lowguid); + if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) + sWorld->AddCharacterNameData(delInfo.lowguid, delInfo.name, (*result)[2].GetUInt8(), (*result)[0].GetUInt8(), (*result)[1].GetUInt8()); } /** diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 23f925dedef..04820f59355 100755 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -137,8 +137,8 @@ extern int main(int argc, char **argv) } sLog->outString("Using configuration file %s.", cfg_file); - sLog->outDetail("%s (Library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); - sLog->outDetail("Using ACE: %s", ACE_VERSION); + sLog->outString("Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); + sLog->outString("Using ACE version: %s", ACE_VERSION); ///- and run the 'Master' /// \todo Why do we need this 'Master'? Can't all of this be in the Main as for Realmd? diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index d84cfc1a4a4..03b2859c514 100755 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -41,6 +41,7 @@ #include "Timer.h" #include "Util.h" #include "AuthSocket.h" +#include "RealmList.h" #include "BigNumber.h" @@ -136,13 +137,6 @@ int Master::Run() sLog->outString(" C O R E /\\___/"); sLog->outString("http://TrinityCore.org \\/__/\n"); -#ifdef USE_SFMT_FOR_RNG - sLog->outString("\n"); - sLog->outString("SFMT has been enabled as the random number generator, if worldserver"); - sLog->outString("freezes or crashes randomly, first, try disabling SFMT in CMAKE configuration"); - sLog->outString("\n"); -#endif //USE_SFMT_FOR_RNG - /// worldserver PID file creation std::string pidfile = ConfigMgr::GetStringDefault("PidFile", ""); if (!pidfile.empty()) @@ -162,7 +156,7 @@ int Master::Run() return 1; // set server offline (not connectable) - LoginDatabase.DirectPExecute("UPDATE realmlist SET color = (color & ~%u) | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, REALM_FLAG_INVALID, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = (flag & ~%u) | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, REALM_FLAG_INVALID, realmID); ///- Initialize the World sWorld->SetInitialWorldSettings(); @@ -273,10 +267,14 @@ int Master::Run() } // set server online (allow connecting now) - LoginDatabase.DirectPExecute("UPDATE realmlist SET color = color & ~%u, population = 0 WHERE id = '%u'", REALM_FLAG_INVALID, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag & ~%u, population = 0 WHERE id = '%u'", REALM_FLAG_INVALID, realmID); sLog->outString("%s (worldserver-daemon) ready...", _FULLVERSION); - sWorldSocketMgr->Wait(); + + // when the main thread closes the singletons get unloaded + // since worldrunnable uses them, it will crash if unloaded after master + world_thread.wait(); + rar_thread.wait(); if (soap_thread) { @@ -286,15 +284,10 @@ int Master::Run() } // set server offline - LoginDatabase.DirectPExecute("UPDATE realmlist SET color = color | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); - - // when the main thread closes the singletons get unloaded - // since worldrunnable uses them, it will crash if unloaded after master - world_thread.wait(); - rar_thread.wait(); + LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); ///- Clean database before leaving - clearOnlineAccounts(); + ClearOnlineAccounts(); _StopDB(); @@ -454,7 +447,7 @@ bool Master::_StartDB() sLog->SetRealmID(realmID); ///- Clean the database before starting - clearOnlineAccounts(); + ClearOnlineAccounts(); ///- Insert version info into DB WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", _FULLVERSION, _HASH); // One-time query @@ -475,16 +468,14 @@ void Master::_StopDB() } /// Clear 'online' status for all accounts with characters in this realm -void Master::clearOnlineAccounts() +void Master::ClearOnlineAccounts() { - // Cleanup online status for characters hosted at current realm - /// \todo Only accounts with characters logged on *this* realm should have online status reset. Move the online column from 'account' to 'realmcharacters'? - LoginDatabase.DirectPExecute( - "UPDATE account SET online = 0 WHERE online > 0 " - "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')", realmID); + // Reset online status for all accounts with characters on the current realm + LoginDatabase.DirectPExecute("UPDATE account SET online = 0 WHERE online > 0 AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = %d)", realmID); + // Reset online status for all characters CharacterDatabase.DirectExecute("UPDATE characters SET online = 0 WHERE online <> 0"); // Battleground instance ids reset at server restart - CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_PLAYERS_BGDATA)); + CharacterDatabase.DirectExecute("UPDATE character_battleground_data SET instanceId = 0"); } diff --git a/src/server/worldserver/Master.h b/src/server/worldserver/Master.h index 17c230ef7c7..548cd02c64a 100755 --- a/src/server/worldserver/Master.h +++ b/src/server/worldserver/Master.h @@ -37,7 +37,7 @@ class Master bool _StartDB(); void _StopDB(); - void clearOnlineAccounts(); + void ClearOnlineAccounts(); }; #define sMaster ACE_Singleton::instance() diff --git a/src/server/worldserver/RemoteAccess/RASocket.cpp b/src/server/worldserver/RemoteAccess/RASocket.cpp index e5637d282c6..ebc7c7624d9 100755 --- a/src/server/worldserver/RemoteAccess/RASocket.cpp +++ b/src/server/worldserver/RemoteAccess/RASocket.cpp @@ -32,7 +32,7 @@ RASocket::RASocket() { - iMinLevel = ConfigMgr::GetIntDefault("RA.MinLevel", 3); + _minLevel = ConfigMgr::GetIntDefault("RA.MinLevel", 3); } RASocket::~RASocket() @@ -174,12 +174,15 @@ int RASocket::process_command(const std::string& command) int RASocket::check_access_level(const std::string& user) { - std::string safe_user = user; + std::string safeUser = user; + + AccountMgr::normalizeString(safeUser); + - AccountMgr::normalizeString(safe_user); - LoginDatabase.EscapeString(safe_user); - QueryResult result = LoginDatabase.PQuery("SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = '%s'", safe_user.c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_ACCESS); + stmt->setString(0, safeUser); + PreparedQueryResult result = LoginDatabase.Query(stmt); if (!result) { @@ -189,7 +192,7 @@ int RASocket::check_access_level(const std::string& user) Field* fields = result->Fetch(); - if (fields[1].GetUInt32() < iMinLevel) + if (fields[1].GetUInt8() < _minLevel) { sLog->outRemote("User %s has no privilege to login", user.c_str()); return -1; @@ -207,19 +210,20 @@ int RASocket::check_password(const std::string& user, const std::string& pass) { std::string safe_user = user; AccountMgr::normalizeString(safe_user); - LoginDatabase.EscapeString(safe_user); std::string safe_pass = pass; AccountMgr::normalizeString(safe_pass); - LoginDatabase.EscapeString(safe_pass); std::string hash = AccountMgr::CalculateShaPassHash(safe_user, safe_pass); - QueryResult check = LoginDatabase.PQuery( - "SELECT 1 FROM account WHERE username = '%s' AND sha_pass_hash = '%s'", - safe_user.c_str(), hash.c_str()); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_CHECK_PASSWORD_BY_NAME); - if (!check) + stmt->setString(0, safe_user); + stmt->setString(1, hash); + + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (!result) { sLog->outRemote("Wrong password for user: %s", user.c_str()); return -1; diff --git a/src/server/worldserver/RemoteAccess/RASocket.h b/src/server/worldserver/RemoteAccess/RASocket.h index 1c9b1ac24b5..450245a0ff4 100755 --- a/src/server/worldserver/RemoteAccess/RASocket.h +++ b/src/server/worldserver/RemoteAccess/RASocket.h @@ -56,7 +56,7 @@ class RASocket: public ACE_Svc_Handler private: /// Minimum security level required to connect - uint8 iMinLevel; + uint8 _minLevel; }; #endif /// @} diff --git a/src/server/worldserver/WorldThread/WorldRunnable.cpp b/src/server/worldserver/WorldThread/WorldRunnable.cpp index 8ea54ca599e..42cfaae41ec 100755 --- a/src/server/worldserver/WorldThread/WorldRunnable.cpp +++ b/src/server/worldserver/WorldThread/WorldRunnable.cpp @@ -30,6 +30,7 @@ #include "MapManager.h" #include "Timer.h" #include "WorldRunnable.h" +#include "OutdoorPvPMgr.h" #define WORLD_SLEEP_CONST 50 @@ -93,4 +94,5 @@ void WorldRunnable::run() sMapMgr->UnloadAll(); // unload all grids (including locked in memory) sObjectAccessor->UnloadAll(); // unload 'i_player2corpse' storage and remove from world sScriptMgr->Unload(); + sOutdoorPvPMgr->Die(); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index ac4d3fb1bc0..6c598667a1f 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1409,10 +1409,10 @@ AllowTickets = 1 # # DungeonFinder.Enable # Description: Dungeon and raid finder system. -# Default: 0 - (Disabled) -# 1 - (Enabled, Experimental as of still being in development) +# Default: 1 - (Enabled) +# 0 - (Disabled) -DungeonFinder.Enable = 0 +DungeonFinder.Enable = 1 # # DBC.EnforceItemAttributes diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index fb64adb3c61..241be4982ab 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -313,16 +313,16 @@ void ReadLiquidTypeTableDBC() exit(1); } - size_t LiqType_count = dbc.getRecordCount(); - size_t LiqType_maxid = dbc.getMaxId(); - LiqType = new uint16[LiqType_maxid + 1]; - memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16)); + size_t liqTypeCount = dbc.getRecordCount(); + size_t liqTypeMaxId = dbc.getMaxId(); + LiqType = new uint16[liqTypeMaxId + 1]; + memset(LiqType, 0xff, (liqTypeMaxId + 1) * sizeof(uint16)); - for(uint32 x = 0; x < LiqType_count; ++x) + for(uint32 x = 0; x < liqTypeCount; ++x) LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3); SFileCloseFile(dbcFile); - printf("Done! (%u LiqTypes loaded)\n", LiqType_count); + printf("Done! (%u LiqTypes loaded)\n", liqTypeCount); } // @@ -331,7 +331,7 @@ void ReadLiquidTypeTableDBC() // Map file format data static char const* MAP_MAGIC = "MAPS"; -static char const* MAP_VERSION_MAGIC = "v1.1"; +static char const* MAP_VERSION_MAGIC = "v1.2"; static char const* MAP_AREA_MAGIC = "AREA"; static char const* MAP_HEIGHT_MAGIC = "MHGT"; static char const* MAP_LIQUID_MAGIC = "MLIQ"; @@ -414,7 +414,8 @@ uint16 uint16_V9[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1]; uint8 uint8_V8[ADT_GRID_SIZE][ADT_GRID_SIZE]; uint8 uint8_V9[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1]; -uint8 liquid_type[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]; +uint16 liquid_entry[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]; +uint8 liquid_flags[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]; bool liquid_show[ADT_GRID_SIZE][ADT_GRID_SIZE]; float liquid_height[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1]; @@ -426,7 +427,8 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x, uint32 return false; memset(liquid_show, 0, sizeof(liquid_show)); - memset(liquid_type, 0, sizeof(liquid_type)); + memset(liquid_flags, 0, sizeof(liquid_flags)); + memset(liquid_entry, 0, sizeof(liquid_entry)); // Prepare map header map_fileheader map; @@ -663,13 +665,75 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x, uint32 map.heightMapSize+= sizeof(V9) + sizeof(V8); } + // Get from MCLQ chunk (old) + for (int i = 0; i < ADT_CELLS_PER_GRID; i++) + { + for(int j = 0; j < ADT_CELLS_PER_GRID; j++) + { + adt_MCNK *cell = cells->getMCNK(i, j); + if (!cell) + continue; + + adt_MCLQ *liquid = cell->getMCLQ(); + int count = 0; + if (!liquid || cell->sizeMCLQ <= 8) + continue; + + for (int y = 0; y < ADT_CELL_SIZE; y++) + { + int cy = i * ADT_CELL_SIZE + y; + for (int x = 0; x < ADT_CELL_SIZE; x++) + { + int cx = j * ADT_CELL_SIZE + x; + if (liquid->flags[y][x] != 0x0F) + { + liquid_show[cy][cx] = true; + if (liquid->flags[y][x] & (1<<7)) + liquid_flags[i][j] |= MAP_LIQUID_TYPE_DARK_WATER; + ++count; + } + } + } + + uint32 c_flag = cell->flags; + if (c_flag & (1<<2)) + { + liquid_entry[i][j] = 1; + liquid_flags[i][j] |= MAP_LIQUID_TYPE_WATER; // water + } + if (c_flag & (1<<3)) + { + liquid_entry[i][j] = 2; + liquid_flags[i][j] |= MAP_LIQUID_TYPE_OCEAN; // ocean + } + if (c_flag & (1<<4)) + { + liquid_entry[i][j] = 3; + liquid_flags[i][j] |= MAP_LIQUID_TYPE_MAGMA; // magma/slime + } + + if (!count && liquid_flags[i][j]) + fprintf(stderr, "Wrong liquid detect in MCLQ chunk"); + + for (int y = 0; y <= ADT_CELL_SIZE; y++) + { + int cy = i * ADT_CELL_SIZE + y; + for (int x = 0; x <= ADT_CELL_SIZE; x++) + { + int cx = j * ADT_CELL_SIZE + x; + liquid_height[cy][cx] = liquid->liquid[y][x].height; + } + } + } + } + // Get liquid map for grid (in WOTLK used MH2O chunk) adt_MH2O * h2o = adt.a_grid->getMH2O(); if (h2o) { - for (int i=0;igetLiquidData(i,j); if (!h) @@ -677,111 +741,58 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x, uint32 int count = 0; uint64 show = h2o->getLiquidShowMap(h); - for (int y=0; y < h->height;y++) + for (int y = 0; y < h->height; y++) { - int cy = i*ADT_CELL_SIZE + y + h->yOffset; - for (int x=0; x < h->width; x++) + int cy = i * ADT_CELL_SIZE + y + h->yOffset; + for (int x = 0; x < h->width; x++) { - int cx = j*ADT_CELL_SIZE + x + h->xOffset; + int cx = j * ADT_CELL_SIZE + x + h->xOffset; if (show & 1) { liquid_show[cy][cx] = true; ++count; } - show>>=1; + show >>= 1; } } - uint32 type = LiqType[h->liquidType]; - switch (type) + liquid_entry[i][j] = h->liquidType; + switch (LiqType[h->liquidType]) { - case LIQUID_TYPE_WATER: liquid_type[i][j] |= MAP_LIQUID_TYPE_WATER; break; - case LIQUID_TYPE_OCEAN: liquid_type[i][j] |= MAP_LIQUID_TYPE_OCEAN; break; - case LIQUID_TYPE_MAGMA: liquid_type[i][j] |= MAP_LIQUID_TYPE_MAGMA; break; - case LIQUID_TYPE_SLIME: liquid_type[i][j] |= MAP_LIQUID_TYPE_SLIME; break; + case LIQUID_TYPE_WATER: liquid_flags[i][j] |= MAP_LIQUID_TYPE_WATER; break; + case LIQUID_TYPE_OCEAN: liquid_flags[i][j] |= MAP_LIQUID_TYPE_OCEAN; break; + case LIQUID_TYPE_MAGMA: liquid_flags[i][j] |= MAP_LIQUID_TYPE_MAGMA; break; + case LIQUID_TYPE_SLIME: liquid_flags[i][j] |= MAP_LIQUID_TYPE_SLIME; break; default: printf("\nCan't find Liquid type %u for map %s\nchunk %d,%d\n", h->liquidType, filename, i, j); break; } // Dark water detect - if (type == LIQUID_TYPE_OCEAN) + if (LiqType[h->liquidType] == LIQUID_TYPE_OCEAN) { - uint8 *lm = h2o->getLiquidLightMap(h); + uint8* lm = h2o->getLiquidLightMap(h); if (!lm) - liquid_type[i][j]|=MAP_LIQUID_TYPE_DARK_WATER; + liquid_flags[i][j] |= MAP_LIQUID_TYPE_DARK_WATER; } - if (!count && liquid_type[i][j]) + if (!count && liquid_flags[i][j]) printf("Wrong liquid detect in MH2O chunk"); - float *height = h2o->getLiquidHeightMap(h); + float* height = h2o->getLiquidHeightMap(h); int pos = 0; - for (int y=0; y<=h->height;y++) + for (int y = 0; y <= h->height; y++) { - int cy = i*ADT_CELL_SIZE + y + h->yOffset; - for (int x=0; x<= h->width; x++) + int cy = i * ADT_CELL_SIZE + y + h->yOffset; + for (int x = 0; x <= h->width; x++) { - int cx = j*ADT_CELL_SIZE + x + h->xOffset; + int cx = j * ADT_CELL_SIZE + x + h->xOffset; + if (height) liquid_height[cy][cx] = height[pos]; else liquid_height[cy][cx] = h->heightLevel1; - pos++; - } - } - } - } - } - else - { - // Get from MCLQ chunk (old) - for (int i=0;igetMCLQ(); - int count = 0; - if (!liquid || cell->sizeMCLQ <= 8) - continue; - - for (int y=0; y < ADT_CELL_SIZE; y++) - { - int cy = i*ADT_CELL_SIZE + y; - for (int x=0; x < ADT_CELL_SIZE; x++) - { - int cx = j*ADT_CELL_SIZE + x; - if (liquid->flags[y][x] != 0x0F) - { - liquid_show[cy][cx] = true; - if (liquid->flags[y][x]&(1<<7)) - liquid_type[i][j]|=MAP_LIQUID_TYPE_DARK_WATER; - ++count; - } - } - } - - uint32 c_flag = cell->flags; - if(c_flag & (1<<2)) - liquid_type[i][j]|=MAP_LIQUID_TYPE_WATER; // water - if(c_flag & (1<<3)) - liquid_type[i][j]|=MAP_LIQUID_TYPE_OCEAN; // ochean - if(c_flag & (1<<4)) - liquid_type[i][j]|=MAP_LIQUID_TYPE_MAGMA; // magma/slime - if (!count && liquid_type[i][j]) - printf("Wrong liquid detect in MCLQ chunk"); - - for (int y=0; y <= ADT_CELL_SIZE; y++) - { - int cy = i*ADT_CELL_SIZE + y; - for (int x=0; x<= ADT_CELL_SIZE; x++) - { - int cx = j*ADT_CELL_SIZE + x; - liquid_height[cy][cx] = liquid->liquid[y][x].height; + pos++; } } } @@ -791,13 +802,13 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x, uint32 //============================================ // Pack liquid data //============================================ - uint8 type = liquid_type[0][0]; + uint8 type = liquid_flags[0][0]; bool fullType = false; - for (int y=0;y& filelist) { - uint32 filenum; - if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return; - libmpq__off_t size, transferred; - libmpq__file_unpacked_size(mpq_a, filenum, &size); + uint32 filenum; + if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return; + libmpq__off_t size, transferred; + libmpq__file_unpacked_size(mpq_a, filenum, &size); char *buffer = new char[size]; - libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); + libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); char seps[] = "\n"; char *token; diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 599290a9254..e60a773c6de 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -76,7 +76,7 @@ bool preciseVectorData = false; //static const char * szWorkDirMaps = ".\\Maps"; const char* szWorkDirWmo = "./Buildings"; -const char* szRawVMAPMagic = "VMAP004"; +const char* szRawVMAPMagic = "VMAP041"; // Local testing functions @@ -261,20 +261,7 @@ void ParsMapFiles() void getGamePath() { #ifdef _WIN32 - HKEY key; - DWORD t,s; - LONG l; - s = sizeof(input_path); - memset(input_path,0,s); - l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\World of Warcraft",0,KEY_QUERY_VALUE,&key); - //l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\Burning Crusade Closed Beta",0,KEY_QUERY_VALUE,&key); - l = RegQueryValueEx(key,"InstallPath",0,&t,(LPBYTE)input_path,&s); - RegCloseKey(key); - if (strlen(input_path) > 0) - { - if (input_path[strlen(input_path) - 1] != '\\') strcat(input_path, "\\"); - } - strcat(input_path,"Data\\"); + strcpy(input_path,"Data\\"); #else strcpy(input_path,"Data/"); #endif diff --git a/src/tools/vmap4_extractor/vmapexport.h b/src/tools/vmap4_extractor/vmapexport.h index b407e7a106e..0381011efb7 100644 --- a/src/tools/vmap4_extractor/vmapexport.h +++ b/src/tools/vmap4_extractor/vmapexport.h @@ -23,8 +23,8 @@ enum ModelFlags { - MOD_M2 = 1, - MOD_WORLDSPAWN = 1<<1, + MOD_M2 = 1, + MOD_WORLDSPAWN = 1<<1, MOD_HAS_BOUND = 1<<2 }; diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 58957e007c1..6703872111b 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -404,11 +404,53 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPrecis if (rootWMO->liquidType & 4) liquidEntry = liquidType; else if (liquidType == 15) - liquidEntry = 1; // first entry, generic "Water" + liquidEntry = 0; else liquidEntry = liquidType + 1; - // overwrite material type in header... - hlq->type = LiqType[liquidEntry]; + + if (!liquidEntry) + { + int v1; // edx@1 + int v2; // eax@1 + + v1 = hlq->xtiles * hlq->ytiles; + v2 = 0; + if (v1 > 0) + { + while ((LiquBytes[v2] & 0xF) == 15) + { + ++v2; + if (v2 >= v1) + break; + } + + if (v2 < v1 && (LiquBytes[v2] & 0xF) != 15) + liquidEntry = (LiquBytes[v2] & 0xF) + 1; + } + } + + if (liquidEntry && liquidEntry < 21) + { + switch (((uint8)liquidEntry - 1) & 3) + { + case 0: + liquidEntry = ((mogpFlags & 0x80000) != 0) + 13; + break; + case 1: + liquidEntry = 14; + break; + case 2: + liquidEntry = 19; + break; + case 3: + liquidEntry = 20; + break; + default: + break; + } + } + + hlq->type = liquidEntry; /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app); llog << filename; -- cgit v1.2.3 From 774f3cdc9b2861f0ba2bf496a8528e41f0f578c3 Mon Sep 17 00:00:00 2001 From: kaelima Date: Wed, 30 May 2012 09:22:56 +0200 Subject: Fixed some merging errors, there could be more, but at least it compiles. --- src/server/game/Battlegrounds/ArenaTeamMgr.cpp | 4 +-- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 7 +++-- src/server/game/DataStores/DBCStores.cpp | 8 ++++++ src/server/game/DataStores/DBCStores.h | 2 ++ src/server/game/DataStores/DBCStructure.h | 34 ++++++++++++----------- src/server/game/DataStores/DBCfmt.h | 4 +-- src/server/game/Entities/Creature/Creature.cpp | 4 +-- src/server/game/Entities/Pet/Pet.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 23 +++++++-------- src/server/game/Entities/Unit/Unit.cpp | 14 +++++----- src/server/game/Handlers/LFGHandler.cpp | 2 +- src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/game/Handlers/MovementHandler.cpp | 4 +-- src/server/game/Handlers/QuestHandler.cpp | 2 -- src/server/game/Server/Protocol/Opcodes.cpp | 1 - src/server/game/Server/Protocol/Opcodes.h | 24 ++++++++++++++++ src/server/game/Server/WorldSocket.cpp | 13 --------- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 13 ++++++--- src/server/game/Spells/Spell.cpp | 17 ------------ src/server/game/Spells/SpellEffects.cpp | 4 +-- src/server/scripts/Commands/cs_misc.cpp | 3 +- src/server/shared/Packets/ByteBuffer.h | 4 +-- 22 files changed, 101 insertions(+), 90 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index 47282be3a8e..c964f47f495 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -153,10 +153,10 @@ void ArenaTeamMgr::DistributeArenaPoints() SQLTransaction trans = CharacterDatabase.BeginTransaction(); - PreparedStatement* stmt; - // Cycle that gives points to all players /* + PreparedStatement* stmt; + for (std::map::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) { // Add points to player if online diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 167933b9c0c..eae84c9c7b3 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -771,10 +771,11 @@ void BattlegroundMgr::CreateInitialBattlegrounds() continue; } - data.StartMaxDist = fields[9].GetFloat(); - - //data.BattlegroundName = bl->name[sWorld->GetDefaultDbcLocale()]; + selectionWeight = fields[9].GetUInt8(); + // data.StartMaxDist = fields[9].GetFloat(); ? data.scriptId = sObjectMgr->GetScriptId(fields[10].GetCString()); + + //data.BattlegroundName = bl->name[sWorld->GetDefaultDbcLocale()]; data.MapID = bl->mapid[0]; if (!CreateBattleground(data)) diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index e8087753efd..973421bc2e3 100755 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -1006,6 +1006,14 @@ std::vector const* GetTalentTreePrimarySpells(uint32 talentTree) return &itr->second; } +uint32 GetLiquidFlags(uint32 liquidType) +{ + if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType)) + return 1 << liq->Type; + + return 0; +} + uint32 ScalingStatValuesEntry::GetStatMultiplier(uint32 inventoryType) const { if (inventoryType < MAX_INVTYPE) diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index d04dc4ff131..c22f2ccd625 100755 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -67,6 +67,8 @@ MapDifficulty const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &di uint32 const* /*[MAX_TALENT_TABS]*/ GetTalentTabPages(uint8 cls); std::vector const* GetTalentTreePrimarySpells(uint32 talentTree); +uint32 GetLiquidFlags(uint32 liquidType); + PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index f0b462e827c..54e961eaf84 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -543,10 +543,9 @@ struct AreaTableEntry //uint32 unk8; // 8, //uint32 unk9; // 9, int32 area_level; // 10 + char* area_name; // 11 uint32 team; // 12 - //uint32 unk14; // 14, All zeros (4.2.2) - //uint32 unk15; // 15, - //uint32 unk16; // 16, Only Naxxramas has value (21) + uint32 LiquidTypeOverride[4]; // 13-16 liquid override by type //float unk13; // 17, //float unk13; // 18, //uint32 unk19; // 19, All zeros (4.2.2) @@ -1134,21 +1133,24 @@ struct HolidayNamesEntry }; */ +#define MAX_HOLIDAY_DURATIONS 10 +#define MAX_HOLIDAY_DATES 26 +#define MAX_HOLIDAY_FLAGS 10 + struct HolidaysEntry { - uint32 ID; // 0, holiday id - //uint32 unk1; // 1 - //uint32 unk2; // 2 - //uint32 unk3[8] // 3-10, empty fields - //uint32 unk11[13] // 11-23, some unknown data (bit strings?) - //uint32 unk11[13] // 24-36, some empty fields (continue prev?) - //uint32 unk11[12] // 37-48, counters? - //uint32 holidayNameId; // 49, id for HolidayNames.dbc - //uint32 holidayDescriptionId; // 50, id for HolidayDescriptions.dbc - //uint32 unk51; // 51 - //uint32 unk52; // 52 - //uint32 unk53; // 53 - //uint32 unk54; // 54 + uint32 Id; // 0 m_ID + uint32 Duration[MAX_HOLIDAY_DURATIONS]; // 1-10 m_duration + uint32 Date[MAX_HOLIDAY_DATES]; // 11-36 m_date (dates in unix time starting at January, 1, 2000) + uint32 Region; // 37 m_region (wow region) + uint32 Looping; // 38 m_looping + uint32 CalendarFlags[MAX_HOLIDAY_FLAGS]; // 39-48 m_calendarFlags + //uint32 holidayNameId; // 49 m_holidayNameID (HolidayNames.dbc) + //uint32 holidayDescriptionId; // 50 m_holidayDescriptionID (HolidayDescriptions.dbc) + char* TextureFilename; // 51 m_textureFilename + uint32 Priority; // 52 m_priority + uint32 CalendarFilterType; // 53 m_calendarFilterType (-1 = Fishing Contest, 0 = Unk, 1 = Darkmoon Festival, 2 = Yearly holiday) + //uint32 flags; // 54 m_flags (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) }; // common struct for: diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index df5e1ce5035..50af8928e6b 100755 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -23,7 +23,7 @@ const char Achievementfmt[]="niixsxiixixxii"; //const std::string CustomAchievementfmt="pppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapapaaaaaaaaaaaaaaaaaapp"; //const std::string CustomAchievementIndex = "ID"; const char AchievementCriteriafmt[]="niiiiiiiisiiiiixxiiiiii"; -const char AreaTableEntryfmt[]="iiinixxxxxisixxxxxxxxxxxxx"; +const char AreaTableEntryfmt[]="iiinixxxxxisiiiiixxxxxxxxx"; const char AreaGroupEntryfmt[]="niiiiiii"; const char AreaPOIEntryfmt[]="niiiiiiiiiiiffixixxixx"; const char AreaTriggerEntryfmt[]="nifffxxxfffff"; @@ -75,7 +75,7 @@ const char GtOCTRegenHPfmt[]="f"; const char GtRegenHPPerSptfmt[]="f"; const char GtRegenMPPerSptfmt[]="xf"; -const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +const char Holidaysfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix"; const char ItemBagFamilyfmt[]="nx"; const char ItemArmorQualityfmt[]="nfffffffi"; const char ItemArmorShieldfmt[]="nifffffff"; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index ca075703277..bbce6cf56c1 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2474,7 +2474,7 @@ bool Creature::SetDisableGravity(bool disable, bool packetOnly/*=false*/) if (!movespline->Initialized()) return true; - WorldPacket data(disable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE, 9); + WorldPacket data(disable ? SMSG_MOVE_SPLINE_DISABLE_GRAVITY : SMSG_MOVE_SPLINE_ENABLE_GRAVITY, 9); data.append(GetPackGUID()); SendMessageToSet(&data, false); return true; @@ -2495,7 +2495,7 @@ bool Creature::SetHover(bool enable) return true; //! Not always a packet is sent - WorldPacket data(enable ? SMSG_SPLINE_MOVE_SET_HOVER : SMSG_SPLINE_MOVE_UNSET_HOVER, 9); + WorldPacket data(enable ? SMSG_MOVE_SPLINE_SET_HOVER : SMSG_MOVE_SPLINE_UNSET_HOVER, 9); data.append(GetPackGUID()); SendMessageToSet(&data, false); return true; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 414792c8d5c..efd5e577f9e 100755 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1850,7 +1850,7 @@ bool Pet::IsPermanentPetFor(Player* owner) case CLASS_DEATH_KNIGHT: return GetCreatureTemplate()->type == CREATURE_TYPE_UNDEAD; case CLASS_MAGE: - return GetCreatureInfo()->type == CREATURE_TYPE_ELEMENTAL; + return GetCreatureTemplate()->type == CREATURE_TYPE_ELEMENTAL; default: return false; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d62e0ccfd53..890ceb72c3e 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -19081,7 +19081,7 @@ void Player::_SaveActions(SQLTransaction& trans) case ACTIONBUTTON_NEW: stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION); stmt->setUInt32(0, GetGUIDLow()); - stmt->setUInt8(1, m_activeSpec); + stmt->setUInt8(1, GetActiveSpec()); stmt->setUInt8(2, itr->first); stmt->setUInt32(3, itr->second.GetAction()); stmt->setUInt8(4, uint8(itr->second.GetType())); @@ -19096,7 +19096,7 @@ void Player::_SaveActions(SQLTransaction& trans) stmt->setUInt8(1, uint8(itr->second.GetType())); stmt->setUInt32(2, GetGUIDLow()); stmt->setUInt8(3, itr->first); - stmt->setUInt8(4, m_activeSpec); + stmt->setUInt8(4, GetActiveSpec()); trans->Append(stmt); itr->second.uState = ACTIONBUTTON_UNCHANGED; @@ -19106,7 +19106,7 @@ void Player::_SaveActions(SQLTransaction& trans) stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC); stmt->setUInt32(0, GetGUIDLow()); stmt->setUInt8(1, itr->first); - stmt->setUInt8(2, m_activeSpec); + stmt->setUInt8(2, GetActiveSpec()); trans->Append(stmt); m_actionButtons.erase(itr++); @@ -19646,6 +19646,7 @@ void Player::_SaveStats(SQLTransaction& trans) stmt->setUInt32(index++, GetGUIDLow()); stmt->setUInt32(index++, GetMaxHealth()); + for (uint8 i = 0; i < MAX_STORED_POWERS; ++i) stmt->setUInt32(index++, GetMaxPower(Powers(i))); for (uint8 i = 0; i < MAX_STATS; ++i) @@ -25093,7 +25094,7 @@ void Player::_SaveGlyphs(SQLTransaction& trans) trans->Append(stmt); - for (uint8 spec = 0; spec < m_specsCount; ++spec) + for (uint8 spec = 0; spec < GetSpecsCount(); ++spec) { uint8 index = 0; @@ -25103,7 +25104,7 @@ void Player::_SaveGlyphs(SQLTransaction& trans) stmt->setUInt8(index++, spec); for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - stmt->setUInt16(index++, uint16(m_Glyphs[spec][i])); + stmt->setUInt16(index++, uint16(GetGlyph(spec, i))); trans->Append(stmt); } @@ -25193,7 +25194,7 @@ void Player::UpdateSpecCount(uint8 count) _SaveActions(trans); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC); - stmt->setUInt8(0, m_activeSpec); + stmt->setUInt8(0, GetActiveSpec()); stmt->setUInt32(1, GetGUIDLow()); trans->Append(stmt); @@ -25688,8 +25689,8 @@ void Player::SendMovementSetCanFly(bool apply) void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) { WorldPacket data(apply ? - SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY : - SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, 12); + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY : + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, 12); data.append(GetPackGUID()); data << uint32(0); //! movement counter SendDirectMessage(&data); @@ -25697,7 +25698,7 @@ void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) void Player::SendMovementSetHover(bool apply) { - WorldPacket data(apply ? SMSG_MOVE_SET_HOVER : SMSG_MOVE_UNSET_HOVER, 12); + WorldPacket data(apply ? SMSG_MOVE_SET_HOVERING : SMSG_MOVE_SPLINE_UNSET_HOVER, 12); data.append(GetPackGUID()); data << uint32(0); //! movement counter SendDirectMessage(&data); @@ -25705,7 +25706,7 @@ void Player::SendMovementSetHover(bool apply) void Player::SendMovementSetWaterWalking(bool apply) { - WorldPacket data(apply ? SMSG_MOVE_WATER_WALK : SMSG_MOVE_LAND_WALK, 12); + WorldPacket data(apply ? SMSG_MOVE_SET_WATER_WALK : SMSG_MOVE_SET_LAND_WALK, 12); data.append(GetPackGUID()); data << uint32(0); //! movement counter SendDirectMessage(&data); @@ -25713,7 +25714,7 @@ void Player::SendMovementSetWaterWalking(bool apply) void Player::SendMovementSetFeatherFall(bool apply) { - WorldPacket data(apply ? SMSG_MOVE_FEATHER_FALL : SMSG_MOVE_NORMAL_FALL, 12); + WorldPacket data(apply ? SMSG_MOVE_SET_FEATHER_FALL : SMSG_MOVE_SET_NORMAL_FALL, 12); data.append(GetPackGUID()); data << uint32(0); //! movement counter SendDirectMessage(&data); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6ae8e0b7caf..347a51a67d9 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10828,7 +10828,7 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui // From caster spells AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) - if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) + if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectingSpell(spellProto)) AddPctN(TakenTotalMod, (*i)->GetAmount()); // Mod damage from spell mechanic @@ -11431,7 +11431,7 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u AuraEffectList const& mHealingGet= GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_RECEIVED); for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i) - if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto)) + if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectingSpell(spellProto)) AddPctN(TakenTotalMod, (*i)->GetAmount()); for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) @@ -11844,7 +11844,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT // From caster spells AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) - if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) + if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectingSpell(spellProto)) AddPctN(TakenTotalMod, (*i)->GetAmount()); // Mod damage from spell mechanic @@ -17696,8 +17696,8 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const switch (GetTypeId()) { case TYPEID_UNIT: - if (canFly()) - const_cast(this)->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + if (CanFly()) + const_cast(this)->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); break; case TYPEID_PLAYER: // remove unknown, unused etc flags for now @@ -17718,7 +17718,7 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const bool swimming = ((GetUnitMovementFlags() & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (m_movementInfo.flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)); bool interPolatedTurning = m_movementInfo.flags2 & MOVEMENTFLAG2_INTERPOLATED_TURNING; - bool jumping = GetUnitMovementFlags() & MOVEMENTFLAG_JUMPING; + bool jumping = GetUnitMovementFlags() & MOVEMENTFLAG_FALLING; bool splineElevation = GetUnitMovementFlags() & MOVEMENTFLAG_SPLINE_ELEVATION; bool splineData = false; @@ -18187,7 +18187,7 @@ void Unit::SendMovementHover() if (GetTypeId() == TYPEID_PLAYER) ToPlayer()->SendMovementSetHover(HasUnitMovementFlag(MOVEMENTFLAG_HOVER)); - WorldPacket data(MSG_MOVE_HOVER, 64); + WorldPacket data(MSG_MOVE_HOVER, 64); // SMSG_MOVE_SET_HOVERING? data.append(GetPackGUID()); BuildMovementPacket(&data); SendMessageToSet(&data, false); diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 9c66ca44383..82afdfb9044 100755 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -529,7 +529,7 @@ void WorldSession::SendLfgBootPlayer(const LfgPlayerBoot* pBoot) } sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_LFG_BOOT_PROPOSAL_UPDATE [" UI64FMTD "] inProgress: %u - didVote: %u - agree: %u - victim: [" UI64FMTD "] votes: %u - agrees: %u - left: %u - needed: %u - reason %s", guid, uint8(pBoot->inProgress), uint8(playerVote != LFG_ANSWER_PENDING), uint8(playerVote == LFG_ANSWER_AGREE), pBoot->victim, votesNum, agreeNum, secsleft, pBoot->votedNeeded, pBoot->reason.c_str()); - WorldPacket data(SMSG_LFG_BOOT_PROPOSAL_UPDATE, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length()); + WorldPacket data(SMSG_LFG_BOOT_PLAYER, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length()); data << uint8(pBoot->inProgress); // Vote in progress data << uint8(playerVote != LFG_ANSWER_PENDING); // Did Vote data << uint8(playerVote == LFG_ANSWER_AGREE); // Agree diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 7cea7b2ea8e..247db1975a4 100755 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1829,7 +1829,7 @@ void WorldSession::HandleUpdateMissileTrajectory(WorldPacket& recvPacket) { uint32 opcode; recvPacket >> opcode; - recvPacket.SetOpcode(opcode); + recvPacket.SetOpcode(MSG_MOVE_STOP); // always set to MSG_MOVE_STOP in client SetOpcode HandleMovementOpcodes(recvPacket); } } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 3d9968d9a9d..592b2cbeff6 100755 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -345,7 +345,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) /*----------------------*/ /* process position-change */ - WorldPacket data(SMSG_PLAYER_MOVE, recv_data.size()); + WorldPacket data(SMSG_PLAYER_MOVE, recvData.size()); movementInfo.time = getMSTime(); movementInfo.guid = mover->GetGUID(); WriteMovementInfo(data, &movementInfo); @@ -824,7 +824,7 @@ void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi) HavePitch = (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))) || (mi->flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING), HaveFallData = mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_TURNING), - HaveFallDirection = mi->HasMovementFlag(MOVEMENTFLAG_JUMPING), + HaveFallDirection = mi->HasMovementFlag(MOVEMENTFLAG_FALLING), HaveSplineElevation = mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION), HaveSpline = false; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 62372004f03..ccd2e178f88 100755 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -489,8 +489,6 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, questId = %u", uint32(GUID_LOPART(playerGuid)), questId); Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, playerGuid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); - if (!object || !object->hasInvolvedQuest(questId)) - Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); if (!object || !object->hasInvolvedQuest(questId)) return; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index dc9dcad3d17..51760b3323e 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -835,7 +835,6 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_FEATHER_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_NORMAL_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 0920da2543e..dfcf56c388b 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -483,7 +483,10 @@ enum Opcodes MSG_LIST_STABLED_PETS = 0x88CA, MSG_MINIMAP_PING = 0x00, MSG_MOVE_FALL_LAND = 0x00A5, + MSG_MOVE_FEATHER_FALL = 0x00, + MSG_MOVE_GRAVITY_CHNG = 0x00, MSG_MOVE_HEARTBEAT = 0xB024, + MSG_MOVE_HOVER = 0x00, MSG_MOVE_JUMP = 0x9225, MSG_MOVE_SET_ALL_SPEED_CHEAT = 0x00, MSG_MOVE_SET_FACING = 0x02A4, @@ -517,6 +520,8 @@ enum Opcodes MSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x00, MSG_MOVE_TOGGLE_FALL_LOGGING = 0x00, MSG_MOVE_TOGGLE_LOGGING = 0x00, + MSG_MOVE_WATER_WALK = 0x00, + MSG_MOVE_UPDATE_CAN_FLY = 0x00, MSG_NOTIFY_PARTY_SQUELCH = 0x00, MSG_PARTY_ASSIGNMENT = 0x00, MSG_PETITION_DECLINE = 0x98E7, @@ -603,9 +608,28 @@ enum Opcodes SMSG_BUY_BANK_SLOT_RESULT = 0x00, SMSG_BUY_FAILED = 0x4A7F, SMSG_BUY_ITEM = 0xCA67, + SMSG_CALENDAR_ACTION_PENDING = 0x00, + SMSG_CALENDAR_ARENA_TEAM = 0x00, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x00, SMSG_CALENDAR_COMMAND_RESULT = 0x9A4E, + SMSG_CALENDAR_EVENT_INVITE = 0x00, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x00, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x00, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x00, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x00, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x00, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x00, + SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0x00, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x5C72, + SMSG_CALENDAR_EVENT_STATUS = 0x00, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x5CFA, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x9AC2, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x985B, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xDCDF, SMSG_CALENDAR_SEND_CALENDAR = 0x08FB, + SMSG_CALENDAR_SEND_EVENT = 0x00, SMSG_CALENDAR_SEND_NUM_PENDING = 0x00, + SMSG_CALENDAR_UPDATE_INVITE_LIST = 0x00, SMSG_CAMERA_SHAKE = 0x5CFB, SMSG_CANCEL_AUTO_REPEAT = 0x5ACB, SMSG_CANCEL_COMBAT = 0x4AC7, diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 3e4a38ba6b1..11837b0cbab 100755 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -858,19 +858,6 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) stmt->setString(0, account); PreparedQueryResult result = LoginDatabase.Query(stmt); - "sessionkey, " //1 - "last_ip, " //2 - "locked, " //3 - "v, " //4 - "s, " //5 - "expansion, " //6 - "mutetime, " //7 - "locale, " //8 - "recruiter, " //9 - "os " - "FROM account " - "WHERE username = '%s'", - safe_account.c_str()); // Stop if the account is not found if (!result) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 200007c3190..7cff80cf6a0 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1516,7 +1516,9 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const if (target->GetTypeId() == TYPEID_PLAYER) { - const PlayerSpellMap& sp_list = target->ToPlayer()->GetSpellMap(); + Player* plrTarget = target->ToPlayer(); + + PlayerSpellMap const& sp_list = plrTarget->GetSpellMap(); for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) { if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) @@ -1536,13 +1538,14 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const // Also do it for Glyphs for (uint32 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) { - if (uint32 glyphId = target->ToPlayer()->GetGlyph(i)) + if (uint32 glyphId = plrTarget->GetGlyph(plrTarget->GetActiveSpec(), i)) { if (GlyphPropertiesEntry const* glyph = sGlyphPropertiesStore.LookupEntry(glyphId)) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyph->SpellId); if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) continue; + if (spellInfo->Stances & (1<<(GetMiscValue()-1))) target->CastSpell(target, glyph->SpellId, true, NULL, this); } @@ -1550,19 +1553,21 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const } // Leader of the Pack - if (target->ToPlayer()->HasSpell(17007)) + if (plrTarget->HasSpell(17007)) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(24932); if (spellInfo && spellInfo->Stances & (1<<(GetMiscValue()-1))) target->CastSpell(target, 24932, true, NULL, this); } + // Improved Barkskin - apply/remove armor bonus due to shapeshift - if (target->ToPlayer()->HasSpell(63410) || target->ToPlayer()->HasSpell(63411)) + if (plrTarget->HasSpell(63410) || target->ToPlayer()->HasSpell(63411)) { target->RemoveAurasDueToSpell(66530); if (GetMiscValue() == FORM_TRAVEL || GetMiscValue() == FORM_NONE) // "while in Travel Form or while not shapeshifted" target->CastSpell(target, 66530, true); } + // Heart of the Wild if (HotWSpellId) { // hacky, but the only way as spell family is not SPELLFAMILY_DRUID diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index fd0530e171f..d833782bc76 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3800,23 +3800,6 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas data << uint32(missingItem); // first missing item break; } - case SPELL_FAILED_PREVENTED_BY_MECHANIC: - data << uint32(spellInfo->Mechanic); - break; - case SPELL_FAILED_NEED_EXOTIC_AMMO: - data << uint32(spellInfo->EquippedItemSubClassMask); - break; - case SPELL_FAILED_NEED_MORE_ITEMS: - data << uint32(0); // Item entry - data << uint32(0); // Count - break; - case SPELL_FAILED_MIN_SKILL: - data << uint32(0); // SkillLine.dbc Id - data << uint32(0); // Amount - break; - case SPELL_FAILED_FISHING_TOO_LOW: - data << uint32(0); // Skill level - break; default: break; } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 4069cd5271a..8c95bc054d9 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -670,8 +670,8 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (Item* item = caster->GetWeaponForAttack(RANGED_ATTACK)) { ItemTemplate const* weaponTemplate = item->GetTemplate(); - float dmg_min = weaponTemplate->Damage[0].DamageMin; - float dmg_max = weaponTemplate->Damage[0].DamageMax; + float dmg_min = weaponTemplate->DamageMin; + float dmg_max = weaponTemplate->DamageMax; if (dmg_max == 0.0f && dmg_min > dmg_max) damage += int32(dmg_min); else diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 7c431566f52..2deac95d287 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -135,7 +135,7 @@ public: else handler->PSendSysMessage("no VMAP available for area info"); - handler->PSendSysMessage(LANG_MAP_POSITION, + /*handler->PSendSysMessage(LANG_MAP_POSITION, object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : ""), zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : ""), areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : ""), @@ -143,6 +143,7 @@ public: object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); + */ LiquidData liquidStatus; ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 24ca412d6f2..1e346760e30 100755 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -416,14 +416,14 @@ class ByteBuffer uint8& operator[](size_t const pos) { if (pos >= size()) - throw ByteBufferException(false, pos, 1, size()); + throw ByteBufferPositionException(false, pos, 1, size()); return _storage[pos]; } uint8 const& operator[](size_t const pos) const { if (pos >= size()) - throw ByteBufferException(false, pos, 1, size()); + throw ByteBufferPositionException(false, pos, 1, size()); return _storage[pos]; } -- cgit v1.2.3 From 853f96217da40c00be8d09fae171484f69723393 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 30 May 2012 13:15:51 +0200 Subject: Core/Players: 310% mounted speed is identified by riding skill 375, no need for a custom flag anymore. --- .../2012_05_30_00_characters_characters.sql | 2 + src/server/game/Entities/Player/Player.cpp | 50 ---------------------- src/server/game/Entities/Player/Player.h | 3 -- src/server/game/Spells/Auras/SpellAuras.cpp | 1 - src/server/game/Spells/Auras/SpellAuras.h | 2 +- src/server/game/Spells/SpellEffects.cpp | 38 ++++++++-------- src/server/scripts/Spells/spell_druid.cpp | 2 +- 7 files changed, 23 insertions(+), 75 deletions(-) create mode 100644 sql/updates/characters/2012_05_30_00_characters_characters.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2012_05_30_00_characters_characters.sql b/sql/updates/characters/2012_05_30_00_characters_characters.sql new file mode 100644 index 00000000000..9336e826580 --- /dev/null +++ b/sql/updates/characters/2012_05_30_00_characters_characters.sql @@ -0,0 +1,2 @@ +-- Remove unused flag +UPDATE `characters` SET `extra_flags`=`extra_flags`&~0x40; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 890ceb72c3e..e8d89110f82 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3895,12 +3895,6 @@ bool Player::addSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - if (!Has310Flyer(false) && pSkill->id == SKILL_MOUNTS) - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && - spellInfo->Effects[i].CalcValue() == 310) - SetHas310Flyer(true); - if (HasSkill(pSkill->id)) continue; @@ -4165,16 +4159,6 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank) SetSkill(pSkill->id, GetSkillStep(pSkill->id), 0, 0); } - - // most likely will never be used, haven't heard of cases where players unlearn a mount - if (Has310Flyer(false) && _spell_idx->second->skillId == SKILL_MOUNTS) - { - if (spellInfo) - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && - spellInfo->Effects[i].CalcValue() == 310) - Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag - } } } @@ -4255,40 +4239,6 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank) } } -bool Player::Has310Flyer(bool checkAllSpells, uint32 excludeSpellId) -{ - if (!checkAllSpells) - return m_ExtraFlags & PLAYER_EXTRA_HAS_310_FLYER; - else - { - SetHas310Flyer(false); - SpellInfo const* spellInfo; - for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) - { - if (itr->first == excludeSpellId) - continue; - - SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first); - for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx) - { - if (_spell_idx->second->skillId != SKILL_MOUNTS) - break; // We can break because mount spells belong only to one skillline (at least 310 flyers do) - - spellInfo = sSpellMgr->GetSpellInfo(itr->first); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && - spellInfo->Effects[i].CalcValue() == 310) - { - SetHas310Flyer(true); - return true; - } - } - } - } - - return false; -} - void Player::RemoveSpellCooldown(uint32 spell_id, bool update /* = false */) { m_spellCooldowns.erase(spell_id); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index dc6fd7eab26..24a1c35b8e2 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -500,7 +500,6 @@ enum PlayerExtraFlags PLAYER_EXTRA_TAXICHEAT = 0x0008, PLAYER_EXTRA_GM_INVISIBLE = 0x0010, PLAYER_EXTRA_GM_CHAT = 0x0020, // Show GM badge in chat messages - PLAYER_EXTRA_HAS_310_FLYER = 0x0040, // Marks if player already has 310% speed flying mount // other states PLAYER_EXTRA_PVP_DEATH = 0x0100 // store PvP death status until corpse creating. @@ -1197,8 +1196,6 @@ class Player : public Unit, public GridObject void SetTaxiCheater(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_TAXICHEAT; else m_ExtraFlags &= ~PLAYER_EXTRA_TAXICHEAT; } bool isGMVisible() const { return !(m_ExtraFlags & PLAYER_EXTRA_GM_INVISIBLE); } void SetGMVisible(bool on); - bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId = 0); - void SetHas310Flyer(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; } void SetPvPDeath(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; } void GiveXP(uint32 xp, Unit* victim, float group_rate=1.0f); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index ea25c0b76b5..58c8ce5c558 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2479,4 +2479,3 @@ void DynObjAura::FillTargetMap(std::map & targets, Unit* /*caster* } } } - diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 2f50d47a79b..36398bafa97 100755 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -166,7 +166,7 @@ class Aura void SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 * amount); // helpers for aura effects - bool HasEffect(uint8 effIndex) const { return bool(GetEffect(effIndex)); } + bool HasEffect(uint8 effIndex) const { return GetEffect(effIndex) != NULL; } bool HasEffectType(AuraType type) const; AuraEffect* GetEffect(uint8 effIndex) const { ASSERT (effIndex < MAX_SPELL_EFFECTS); return m_effects[effIndex]; } uint8 GetEffectMask() const { uint8 effMask = 0; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (m_effects[i]) effMask |= 1<ToPlayer()->GetBaseSkillValue(SKILL_RIDING)) { - case 75: unitTarget->CastSpell(unitTarget, 75619, true); break; - case 150: unitTarget->CastSpell(unitTarget, 75620, true); break; - case 225: + case 75: unitTarget->CastSpell(unitTarget, 75619, true); break; + case 150: unitTarget->CastSpell(unitTarget, 75620, true); break; + case 225: { if (canFly) unitTarget->CastSpell(unitTarget, 75617, true); else unitTarget->CastSpell(unitTarget, 75620, true); - }break; - case 300: + } + break; + case 300: { if (canFly) - { - if (unitTarget->ToPlayer()->Has310Flyer(false)) - unitTarget->CastSpell(unitTarget, 76153, true); - else - unitTarget->CastSpell(unitTarget, 75618, true); - } + unitTarget->CastSpell(unitTarget, 75618, true); else unitTarget->CastSpell(unitTarget, 75620, true); - }break; + } + break; + case 375: + if (canFly) + unitTarget->CastSpell(unitTarget, 76153, true); + else + unitTarget->CastSpell(unitTarget, 75620, true); + break; } return; } @@ -4427,13 +4430,10 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) // Triggered spell id dependent on riding skill if (uint16 skillval = unitTarget->ToPlayer()->GetSkillValue(SKILL_RIDING)) { - if (skillval >= 300) - { - if (unitTarget->ToPlayer()->Has310Flyer(false)) - unitTarget->CastSpell(unitTarget, 76154, true); - else - unitTarget->CastSpell(unitTarget, 75972, true); - } + if (skillval >= 375) + unitTarget->CastSpell(unitTarget, 76154, true); + else if (skillval >= 300) + unitTarget->CastSpell(unitTarget, 75972, true); else unitTarget->CastSpell(unitTarget, 75957, true); } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 898350dbd71..286bec6abab 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -312,7 +312,7 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) { if (Player* caster = GetCaster()->ToPlayer()) - if (caster->Has310Flyer(false)) + if (caster->GetSkillValue(SKILL_RIDING) >= 375) amount = 310; } -- cgit v1.2.3 From 06a4ade88a9aee90e66c02852752c6acc30b7a6d Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 9 Jul 2012 11:08:33 +0200 Subject: Core/Achievements: Implemented guild achievements --- sql/base/characters_database.sql | 51 + ...12_07_09_00_characters_guild_achievement_4x.sql | 24 + ...00_characters_guild_achievement_progress_4x.sql | 25 + src/server/game/Achievements/AchievementMgr.cpp | 1118 +++++++++++++++----- src/server/game/Achievements/AchievementMgr.h | 51 +- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 6 +- src/server/game/Battlegrounds/Battleground.cpp | 20 +- .../game/Battlegrounds/Zones/BattlegroundAB.cpp | 4 +- .../game/Battlegrounds/Zones/BattlegroundAV.cpp | 8 +- .../game/Battlegrounds/Zones/BattlegroundEY.cpp | 2 +- .../game/Battlegrounds/Zones/BattlegroundWS.cpp | 4 +- src/server/game/DataStores/DBCEnums.h | 254 ++--- src/server/game/DungeonFinding/LFGMgr.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 107 +- src/server/game/Entities/Player/Player.h | 8 +- src/server/game/Entities/Unit/Unit.cpp | 16 +- src/server/game/Groups/Group.cpp | 4 +- src/server/game/Guilds/Guild.cpp | 4 +- src/server/game/Guilds/Guild.h | 7 +- src/server/game/Guilds/GuildMgr.cpp | 20 +- src/server/game/Handlers/AuctionHouseHandler.cpp | 8 +- src/server/game/Handlers/CharacterHandler.cpp | 4 +- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/GroupHandler.cpp | 4 +- src/server/game/Handlers/ItemHandler.cpp | 6 +- src/server/game/Handlers/LootHandler.cpp | 10 +- src/server/game/Handlers/MailHandler.cpp | 2 +- src/server/game/Handlers/MiscHandler.cpp | 11 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- src/server/game/Handlers/SpellHandler.cpp | 4 +- src/server/game/Maps/Map.h | 1 + src/server/game/Reputation/ReputationMgr.cpp | 10 +- src/server/game/Server/Protocol/Opcodes.cpp | 14 +- src/server/game/Server/Protocol/Opcodes.h | 15 +- src/server/game/Server/WorldSession.h | 1 + src/server/game/Server/WorldSocket.cpp | 2 +- src/server/game/Spells/Spell.cpp | 10 +- src/server/scripts/Commands/cs_reset.cpp | 2 +- src/server/shared/DataStores/DBCStore.h | 2 +- .../Database/Implementation/CharacterDatabase.cpp | 8 + .../Database/Implementation/CharacterDatabase.h | 8 + src/server/shared/Packets/ByteBuffer.h | 2 +- 42 files changed, 1345 insertions(+), 518 deletions(-) create mode 100644 sql/updates/characters/2012_07_09_00_characters_guild_achievement_4x.sql create mode 100644 sql/updates/characters/2012_07_09_00_characters_guild_achievement_progress_4x.sql (limited to 'src/server/scripts') diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index bbbc799a6af..3016614cd0e 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1558,6 +1558,57 @@ LOCK TABLES `guild` WRITE; /*!40000 ALTER TABLE `guild` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `guild_achievement` +-- + +DROP TABLE IF EXISTS `guild_achievement`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `guild_achievement` ( + `guildId` int(10) unsigned NOT NULL, + `achievement` smallint(5) unsigned NOT NULL, + `date` int(10) unsigned NOT NULL DEFAULT '0', + `guids` text NOT NULL, + PRIMARY KEY (`guildId`,`achievement`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `guild_achievement` +-- + +LOCK TABLES `guild_achievement` WRITE; +/*!40000 ALTER TABLE `guild_achievement` DISABLE KEYS */; +/*!40000 ALTER TABLE `guild_achievement` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `guild_achievement_progress` +-- + +DROP TABLE IF EXISTS `guild_achievement_progress`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `guild_achievement_progress` ( + `guildId` int(10) unsigned NOT NULL, + `criteria` smallint(5) unsigned NOT NULL, + `counter` int(10) unsigned NOT NULL, + `date` int(10) unsigned NOT NULL DEFAULT '0', + `completedGuid` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guildId`,`criteria`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `guild_achievement_progress` +-- + +LOCK TABLES `guild_achievement_progress` WRITE; +/*!40000 ALTER TABLE `guild_achievement_progress` DISABLE KEYS */; +/*!40000 ALTER TABLE `guild_achievement_progress` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `guild_bank_eventlog` -- diff --git a/sql/updates/characters/2012_07_09_00_characters_guild_achievement_4x.sql b/sql/updates/characters/2012_07_09_00_characters_guild_achievement_4x.sql new file mode 100644 index 00000000000..fffe375b464 --- /dev/null +++ b/sql/updates/characters/2012_07_09_00_characters_guild_achievement_4x.sql @@ -0,0 +1,24 @@ +-- +-- Table structure for table `guild_achievement` +-- + +DROP TABLE IF EXISTS `guild_achievement`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `guild_achievement` ( + `guildId` int(10) unsigned NOT NULL, + `achievement` smallint(5) unsigned NOT NULL, + `date` int(10) unsigned NOT NULL DEFAULT '0', + `guids` text NOT NULL DEFAULT '', + PRIMARY KEY (`guildId`,`achievement`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `guild_achievement` +-- + +LOCK TABLES `guild_achievement` WRITE; +/*!40000 ALTER TABLE `guild_achievement` DISABLE KEYS */; +/*!40000 ALTER TABLE `guild_achievement` ENABLE KEYS */; +UNLOCK TABLES; diff --git a/sql/updates/characters/2012_07_09_00_characters_guild_achievement_progress_4x.sql b/sql/updates/characters/2012_07_09_00_characters_guild_achievement_progress_4x.sql new file mode 100644 index 00000000000..c69e41a4ad4 --- /dev/null +++ b/sql/updates/characters/2012_07_09_00_characters_guild_achievement_progress_4x.sql @@ -0,0 +1,25 @@ +-- +-- Table structure for table `guild_achievement_progress` +-- + +DROP TABLE IF EXISTS `guild_achievement_progress`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `guild_achievement_progress` ( + `guildId` int(10) unsigned NOT NULL, + `criteria` smallint(5) unsigned NOT NULL, + `counter` int(10) unsigned NOT NULL, + `date` int(10) unsigned NOT NULL DEFAULT '0', + `completedGuid` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guildId`,`criteria`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `guild_achievement_progress` +-- + +LOCK TABLES `guild_achievement_progress` WRITE; +/*!40000 ALTER TABLE `guild_achievement_progress` DISABLE KEYS */; +/*!40000 ALTER TABLE `guild_achievement_progress` ENABLE KEYS */; +UNLOCK TABLES; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 252e120f0c9..7ff744a1dc8 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -377,45 +377,90 @@ bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, return true; } -AchievementMgr::AchievementMgr(Player* player) +template +AchievementMgr::AchievementMgr(T* owner) { - m_player = player; + _owner = owner; } -AchievementMgr::~AchievementMgr() +template +AchievementMgr::~AchievementMgr() { } -void AchievementMgr::Reset() +template +void AchievementMgr::SendPacket(WorldPacket* data) const { - for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter) - { - WorldPacket data(SMSG_ACHIEVEMENT_DELETED, 4); - data << uint32(iter->first); - m_player->SendDirectMessage(&data); - } +} - for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter) - { - WorldPacket data(SMSG_CRITERIA_DELETED, 4); - data << uint32(iter->first); - m_player->SendDirectMessage(&data); - } +template<> +void AchievementMgr::SendPacket(WorldPacket* data) const +{ + GetOwner()->BroadcastPacket(data); +} - m_completedAchievements.clear(); - m_criteriaProgress.clear(); - DeleteFromDB(m_player->GetGUIDLow()); +template<> +void AchievementMgr::SendPacket(WorldPacket* data) const +{ + GetOwner()->GetSession()->SendPacket(data); +} - // re-fill data - CheckAllAchievementCriteria(); +template +void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry) +{ + CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(entry->ID); + if (criteriaProgress == m_criteriaProgress.end()) + return; + + WorldPacket data(SMSG_CRITERIA_DELETED, 4); + data << uint32(entry->ID); + SendPacket(&data); + + m_criteriaProgress.erase(criteriaProgress); +} + +template<> +void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry) +{ + CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(entry->ID); + if (criteriaProgress == m_criteriaProgress.end()) + return; + + uint8 guidBytes[8]; + *reinterpret_cast(&guidBytes[0]) = GetOwner()->GetGUID(); + + WorldPacket data(SMSG_GUILD_CRITERIA_DELETED, 4 + 8); + data.WriteBit(guidBytes[6]); + data.WriteBit(guidBytes[5]); + data.WriteBit(guidBytes[7]); + data.WriteBit(guidBytes[0]); + data.WriteBit(guidBytes[1]); + data.WriteBit(guidBytes[3]); + data.WriteBit(guidBytes[2]); + data.WriteBit(guidBytes[4]); + + data.WriteByteSeq(guidBytes[2]); + data.WriteByteSeq(guidBytes[3]); + data.WriteByteSeq(guidBytes[4]); + data.WriteByteSeq(guidBytes[1]); + data.WriteByteSeq(guidBytes[7]); + data << uint32(entry->ID); + data.WriteByteSeq(guidBytes[5]); + data.WriteByteSeq(guidBytes[0]); + data.WriteByteSeq(guidBytes[6]); + + SendPacket(&data); + + m_criteriaProgress.erase(criteriaProgress); } -void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, bool evenIfCriteriaComplete) +template +void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, bool evenIfCriteriaComplete) { sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", type, miscvalue1, miscvalue2); // disable for gamemasters with GM-mode enabled - if (m_player->isGameMaster()) + if (GetOwner()->isGameMaster()) return; AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type); @@ -442,7 +487,19 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin } } -void AchievementMgr::DeleteFromDB(uint32 lowguid) +template<> +void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes /*type*/, uint32 /*miscvalue1*/, uint32 /*miscvalue2*/, bool /*evenIfCriteriaComplete*/) +{ + // Not needed +} + +template +void AchievementMgr::DeleteFromDB(uint32 /*lowguid*/) +{ +} + +template<> +void AchievementMgr::DeleteFromDB(uint32 lowguid) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -457,7 +514,29 @@ void AchievementMgr::DeleteFromDB(uint32 lowguid) CharacterDatabase.CommitTransaction(trans); } -void AchievementMgr::SaveToDB(SQLTransaction& trans) +template<> +void AchievementMgr::DeleteFromDB(uint32 lowguid) +{ + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ALL_GUILD_ACHIEVEMENTS); + stmt->setUInt32(0, lowguid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ALL_GUILD_ACHIEVEMENT_CRITERIA); + stmt->setUInt32(0, lowguid); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); +} + +template +void AchievementMgr::SaveToDB(SQLTransaction& /*trans*/) +{ +} + +template<> +void AchievementMgr::SaveToDB(SQLTransaction& trans) { if (!m_completedAchievements.empty()) { @@ -472,7 +551,7 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) /// first new/changed record prefix if (!need_execute) { - ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN ("; + ssdel << "DELETE FROM character_achievement WHERE guid = " << GetOwner()->GetGUIDLow() << " AND achievement IN ("; ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES "; need_execute = true; } @@ -485,7 +564,7 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) // new/changed record data ssdel << iter->first; - ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << uint64(iter->second.date) << ')'; + ssins << '(' << GetOwner()->GetGUIDLow() << ',' << iter->first << ',' << uint64(iter->second.date) << ')'; /// mark as saved in db iter->second.changed = false; @@ -516,7 +595,7 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) /// first new/changed record prefix (for any counter value) if (!need_execute_del) { - ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN ("; + ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetOwner()->GetGUIDLow() << " AND criteria IN ("; need_execute_del = true; } /// next new/changed record prefix @@ -541,7 +620,7 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) ssins << ','; // new/changed record data - ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << iter->second.counter << ',' << iter->second.date << ')'; + ssins << '(' << GetOwner()->GetGUIDLow() << ',' << iter->first << ',' << iter->second.counter << ',' << iter->second.date << ')'; } /// mark as updated in db @@ -561,7 +640,61 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) } } -void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) +template<> +void AchievementMgr::SaveToDB(SQLTransaction& trans) +{ + PreparedStatement* stmt; + std::ostringstream guidstr; + for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) + { + if (!itr->second.changed) + continue; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_ACHIEVEMENT); + stmt->setUInt32(0, GetOwner()->GetId()); + stmt->setUInt16(1, itr->first); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_ACHIEVEMENT); + stmt->setUInt32(0, GetOwner()->GetId()); + stmt->setUInt16(1, itr->first); + stmt->setUInt32(2, itr->second.date); + for (std::set::const_iterator gItr = itr->second.guids.begin(); gItr != itr->second.guids.end(); ++gItr) + guidstr << GUID_LOPART(*gItr) << ','; + + stmt->setString(3, guidstr.str()); + trans->Append(stmt); + + guidstr.str(""); + } + + for (CriteriaProgressMap::const_iterator itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr) + { + if (!itr->second.changed) + continue; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_ACHIEVEMENT_CRITERIA); + stmt->setUInt32(0, GetOwner()->GetId()); + stmt->setUInt16(1, itr->first); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_ACHIEVEMENT_CRITERIA); + stmt->setUInt32(0, GetOwner()->GetId()); + stmt->setUInt16(1, itr->first); + stmt->setUInt32(2, itr->second.counter); + stmt->setUInt32(3, itr->second.date); + stmt->setUInt32(4, GUID_LOPART(itr->second.CompletedGUID)); + trans->Append(stmt); + } +} + +template +void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) +{ +} + +template<> +void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) { if (achievementResult) { @@ -581,10 +714,10 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ // title achievement rewards are retroactive if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) - if (uint32 titleId = reward->titleId[Player::TeamForRace(GetPlayer()->getRace()) == ALLIANCE ? 0 : 1]) + if (uint32 titleId = reward->titleId[Player::TeamForRace(GetOwner()->getRace()) == ALLIANCE ? 0 : 1]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) - if (!GetPlayer()->HasTitle(titleEntry)) - GetPlayer()->SetTitle(titleEntry); + if (!GetOwner()->HasTitle(titleEntry)) + GetOwner()->SetTitle(titleEntry); } while (achievementResult->NextRow()); } @@ -605,9 +738,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ sLog->outError("Non-existing achievement criteria %u data removed from table `character_achievement_progress`.", id); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA); - stmt->setUInt16(0, uint16(id)); - CharacterDatabase.Execute(stmt); continue; @@ -624,11 +755,136 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ } } -void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) const +template<> +void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) { - if (GetPlayer()->GetSession()->PlayerLoading()) - return; + if (achievementResult) + { + do + { + Field* fields = achievementResult->Fetch(); + uint32 achievementid = fields[0].GetUInt16(); + + // must not happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements() + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid); + if (!achievement) + continue; + + CompletedAchievementData& ca = m_completedAchievements[achievementid]; + ca.date = time_t(fields[1].GetUInt32()); + Tokens guids(fields[2].GetString(), ' '); + for (uint32 i = 0; i < guids.size(); ++i) + ca.guids.insert(MAKE_NEW_GUID(atol(guids[i]), 0, HIGHGUID_PLAYER)); + + ca.changed = false; + + } while (achievementResult->NextRow()); + } + if (criteriaResult) + { + time_t now = time(NULL); + do + { + Field* fields = criteriaResult->Fetch(); + uint32 id = fields[0].GetUInt16(); + uint32 counter = fields[1].GetUInt32(); + time_t date = time_t(fields[2].GetUInt32()); + uint64 guid = fields[3].GetUInt32(); + + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id); + if (!criteria) + { + // we will remove not existed criteria for all guilds + sLog->outError("Non-existing achievement criteria %u data removed from table `guild_achievement_progress`.", id); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA); + stmt->setUInt16(0, uint16(id)); + CharacterDatabase.Execute(stmt); + continue; + } + + if (criteria->timeLimit && time_t(date + criteria->timeLimit) < now) + continue; + + CriteriaProgress& progress = m_criteriaProgress[id]; + progress.counter = counter; + progress.date = date; + progress.CompletedGUID = MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER); + progress.changed = false; + } while (criteriaResult->NextRow()); + } +} + +template +void AchievementMgr::Reset() +{ + for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter) + { + WorldPacket data(SMSG_ACHIEVEMENT_DELETED, 4); + data << uint32(iter->first); + SendPacket(&data); + } + + for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter) + { + WorldPacket data(SMSG_CRITERIA_DELETED, 4); + data << uint32(iter->first); + SendPacket(&data); + } + + m_completedAchievements.clear(); + m_criteriaProgress.clear(); + DeleteFromDB(_owner->GetGUIDLow()); + + // re-fill data + CheckAllAchievementCriteria(); +} + +template<> +void AchievementMgr::Reset() +{ + uint8 guidBytes[8]; + *reinterpret_cast(&guidBytes[0]) = GetOwner()->GetGUID(); + + for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter) + { + WorldPacket data(SMSG_GUILD_ACHIEVEMENT_DELETED, 4); + data.WriteBit(guidBytes[4]); + data.WriteBit(guidBytes[1]); + data.WriteBit(guidBytes[2]); + data.WriteBit(guidBytes[3]); + data.WriteBit(guidBytes[0]); + data.WriteBit(guidBytes[7]); + data.WriteBit(guidBytes[5]); + data.WriteBit(guidBytes[6]); + data << uint32(iter->first); + data.WriteByteSeq(guidBytes[5]); + data.WriteByteSeq(guidBytes[1]); + data.WriteByteSeq(guidBytes[3]); + data.WriteByteSeq(guidBytes[6]); + data.WriteByteSeq(guidBytes[0]); + data.WriteByteSeq(guidBytes[7]); + data << uint32(secsToTimeBitFields(iter->second.date)); + data.WriteByteSeq(guidBytes[4]); + data.WriteByteSeq(guidBytes[2]); + SendPacket(&data); + } + + while (!m_criteriaProgress.empty()) + if (AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(m_criteriaProgress.begin()->first)) + RemoveCriteriaProgress(criteria); + + m_completedAchievements.clear(); + DeleteFromDB(_owner->GetId()); + + // re-fill data + CheckAllAchievementCriteria(); +} + +template +void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) const +{ // Don't send for achievements with ACHIEVEMENT_FLAG_TRACKING if (achievement->flags & ACHIEVEMENT_FLAG_HIDDEN) return; @@ -637,47 +893,83 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::SendAchievementEarned(%u)", achievement->ID); #endif - if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId())) + if (Guild* guild = sGuildMgr->GetGuildById(GetOwner()->GetGuildId())) { - Trinity::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED, achievement->ID); + Trinity::AchievementChatBuilder say_builder(*GetOwner(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED, achievement->ID); Trinity::LocalizedPacketDo say_do(say_builder); - guild->BroadcastWorker(say_do, GetPlayer()); + guild->BroadcastWorker(say_do); } - if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH)) + if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_REACH)) { // broadcast realm first reached - WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, strlen(GetPlayer()->GetName())+1+8+4+4); - data << GetPlayer()->GetName(); - data << uint64(GetPlayer()->GetGUID()); + WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, strlen(GetOwner()->GetName())+1+8+4+4); + data << GetOwner()->GetName(); + data << uint64(GetOwner()->GetGUID()); data << uint32(achievement->ID); data << uint32(0); // 1=link supplied string as player name, 0=display plain string sWorld->SendGlobalMessage(&data); } // if player is in world he can tell his friends about new achievement - else if (GetPlayer()->IsInWorld()) + else if (GetOwner()->IsInWorld()) { - CellCoord p = Trinity::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY()); + CellCoord p = Trinity::ComputeCellCoord(GetOwner()->GetPositionX(), GetOwner()->GetPositionY()); Cell cell(p); cell.SetNoCreate(); - Trinity::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED, achievement->ID); + Trinity::AchievementChatBuilder say_builder(*GetOwner(), CHAT_MSG_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED, achievement->ID); Trinity::LocalizedPacketDo say_do(say_builder); - Trinity::PlayerDistWorker > say_worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), say_do); + Trinity::PlayerDistWorker > say_worker(GetOwner(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), say_do); TypeContainerVisitor >, WorldTypeMapContainer > message(say_worker); - cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY)); + cell.Visit(p, message, *GetOwner()->GetMap(), *GetOwner(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY)); } WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8); - data.append(GetPlayer()->GetPackGUID()); + data.append(GetOwner()->GetPackGUID()); data << uint32(achievement->ID); data << uint32(secsToTimeBitFields(time(NULL))); - data << uint32(0); - GetPlayer()->SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); + data << uint32(0); // does not notify player ingame + GetOwner()->SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); } -void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const +template<> +void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) const +{ + uint8 guidBytes[8]; + *reinterpret_cast(&guidBytes[0]) = GetOwner()->GetGUID(); + + WorldPacket data(SMSG_GUILD_ACHIEVEMENT_EARNED, 8+4+8); + data.WriteByteMask(guidBytes[3]); + data.WriteByteMask(guidBytes[1]); + data.WriteByteMask(guidBytes[0]); + data.WriteByteMask(guidBytes[7]); + data.WriteByteMask(guidBytes[4]); + data.WriteByteMask(guidBytes[6]); + data.WriteByteMask(guidBytes[2]); + data.WriteByteMask(guidBytes[5]); + + data.WriteByteSeq(guidBytes[2]); + data << uint32(secsToTimeBitFields(time(NULL))); + data.WriteByteSeq(guidBytes[0]); + data.WriteByteSeq(guidBytes[4]); + data.WriteByteSeq(guidBytes[1]); + data.WriteByteSeq(guidBytes[3]); + data << uint32(achievement->ID); + data.WriteByteSeq(guidBytes[7]); + data.WriteByteSeq(guidBytes[5]); + data.WriteByteSeq(guidBytes[6]); + + SendPacket(&data); +} + +template +void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* /*entry*/, CriteriaProgress const* /*progress*/, uint32 /*timeElapsed*/, bool /*timedCompleted*/) const +{ +} + +template<> +void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const { WorldPacket data(SMSG_CRITERIA_UPDATE, 8+4+8); data << uint32(entry->ID); @@ -685,7 +977,7 @@ void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, C // the counter is packed like a packed Guid data.appendPackGUID(progress->counter); - data.append(GetPlayer()->GetPackGUID()); + data.appendPackGUID(GetOwner()->GetGUID()); if (!entry->timeLimit) data << uint32(0); else @@ -693,13 +985,68 @@ void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, C data << uint32(secsToTimeBitFields(progress->date)); data << uint32(timeElapsed); // time elapsed in seconds data << uint32(0); // unk - GetPlayer()->SendDirectMessage(&data); + SendPacket(&data); +} + +template<> +void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 /*timeElapsed*/, bool /*timedCompleted*/) const +{ + //will send response to criteria progress request + WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + 1 + 1 + 8 + 8 + 4 + 4 + 4 + 4 + 4); + + uint8 criteriaProgress[8]; + uint8 criteriaGuid[8]; + *reinterpret_cast(&criteriaProgress[0]) = progress->counter; + *reinterpret_cast(&criteriaGuid[0]) = progress->CompletedGUID; + + data.WriteBits(1, 21); + data.WriteBit(criteriaProgress[4]); + data.WriteBit(criteriaProgress[1]); + data.WriteBit(criteriaGuid[2]); + data.WriteBit(criteriaProgress[3]); + data.WriteBit(criteriaGuid[1]); + data.WriteBit(criteriaProgress[5]); + data.WriteBit(criteriaProgress[0]); + data.WriteBit(criteriaGuid[3]); + data.WriteBit(criteriaProgress[2]); + data.WriteBit(criteriaGuid[7]); + data.WriteBit(criteriaGuid[5]); + data.WriteBit(criteriaGuid[0]); + data.WriteBit(criteriaProgress[6]); + data.WriteBit(criteriaGuid[6]); + data.WriteBit(criteriaProgress[7]); + data.WriteBit(criteriaGuid[4]); + + data.WriteByteSeq(criteriaGuid[5]); + data << uint32(progress->date); // unknown date + data.WriteByteSeq(criteriaProgress[3]); + data.WriteByteSeq(criteriaProgress[7]); + data << uint32(progress->date); // unknown date + data.WriteByteSeq(criteriaProgress[6]); + data.WriteByteSeq(criteriaGuid[4]); + data.WriteByteSeq(criteriaGuid[1]); + data.WriteByteSeq(criteriaProgress[4]); + data.WriteByteSeq(criteriaGuid[3]); + data.WriteByteSeq(criteriaProgress[0]); + data.WriteByteSeq(criteriaGuid[2]); + data.WriteByteSeq(criteriaProgress[1]); + data.WriteByteSeq(criteriaGuid[6]); + data << uint32(progress->date); // last update time (not packed!) + data << uint32(entry->ID); + data.WriteByteSeq(criteriaProgress[5]); + data << uint32(0); + data.WriteByteSeq(criteriaGuid[7]); + data.WriteByteSeq(criteriaProgress[2]); + data.WriteByteSeq(criteriaGuid[0]); + + SendPacket(&data); } /** * called at player login. The player might have fulfilled some achievements when the achievement system wasn't working yet */ -void AchievementMgr::CheckAllAchievementCriteria() +template +void AchievementMgr::CheckAllAchievementCriteria() { // suppress sending packets for (uint32 i=0; i static bool IsGuild() { return false; } +template<> static bool IsGuild() { return true; } + /** * this function will be called whenever the user might have done a criteria relevant action */ -void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/) +template +void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/, Player* referencePlayer /*= NULL*/) { sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::UpdateAchievementCriteria(%u, %u, %u)", type, miscValue1, miscValue2); // disable for gamemasters with GM-mode enabled - if (m_player->isGameMaster()) + if (referencePlayer->isGameMaster()) return; - AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type); + AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type, IsGuild()); for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i) { AchievementCriteriaEntry const* achievementCriteria = (*i); @@ -737,12 +1089,12 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!achievement) continue; - if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, unit)) + if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, unit, referencePlayer)) continue; // requirements not found in the dbc if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria)) - if (!data->Meets(GetPlayer(), unit, miscValue1)) + if (!data->Meets(referencePlayer, unit, miscValue1)) continue; switch (type) @@ -761,7 +1113,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; // std case: increment at miscvalue1 case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: @@ -777,7 +1129,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; // std case: high value at miscvalue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: @@ -789,7 +1141,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_HIGHEST); break; // specialized cases @@ -799,7 +1151,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: @@ -807,10 +1159,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if (!miscValue1) continue; - if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId()) + if (achievementCriteria->win_bg.bgMapID != referencePlayer->GetMapId()) continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: @@ -821,33 +1173,33 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (achievementCriteria->kill_creature.creatureID != miscValue1) continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue2, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: - SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel()); + SetCriteriaProgress(achievementCriteria, referencePlayer->getLevel(), referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: // update at loading or specific skill update if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID) continue; - if (uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID)) - SetCriteriaProgress(achievementCriteria, skillvalue); + if (uint32 skillvalue = referencePlayer->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID)) + SetCriteriaProgress(achievementCriteria, skillvalue, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: // update at loading or specific skill update if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID) continue; - if (uint32 maxSkillvalue = GetPlayer()->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID)) - SetCriteriaProgress(achievementCriteria, maxSkillvalue); + if (uint32 maxSkillvalue = referencePlayer->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID)) + SetCriteriaProgress(achievementCriteria, maxSkillvalue, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: if (m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end()) - SetCriteriaProgress(achievementCriteria, 1); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT: { - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetRewardedQuestCount()); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetRewardedQuestCount(), referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY: @@ -859,7 +1211,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui { // reset if player missed one day. if (progress && progress->date < (nextDailyResetTime - 2 * DAY)) - SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET); + SetCriteriaProgress(achievementCriteria, 0, referencePlayer, PROGRESS_SET); continue; } @@ -877,7 +1229,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // last progress is within the day before the reset => Already counted today. continue; - SetCriteriaProgress(achievementCriteria, 1, progressType); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, progressType); break; } case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: @@ -888,31 +1240,31 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui uint32 counter = 0; - const RewardedQuestSet &rewQuests = GetPlayer()->getRewardedQuests(); + const RewardedQuestSet &rewQuests = referencePlayer->getRewardedQuests(); for (RewardedQuestSet::const_iterator itr = rewQuests.begin(); itr != rewQuests.end(); ++itr) { Quest const* quest = sObjectMgr->GetQuestTemplate(*itr); if (quest && quest->GetZoneOrSort() >= 0 && uint32(quest->GetZoneOrSort()) == achievementCriteria->complete_quests_in_zone.zoneID) ++counter; } - SetCriteriaProgress(achievementCriteria, counter); + SetCriteriaProgress(achievementCriteria, counter, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if (!miscValue1) continue; - if (GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID) + if (referencePlayer->GetMapId() != achievementCriteria->complete_battleground.mapID) continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if (!miscValue1) continue; - if (GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID) + if (referencePlayer->GetMapId() != achievementCriteria->death_at_map.mapID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_DEATH: { @@ -925,7 +1277,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui { if (achievIdByArenaSlot[j] == achievement->ID) { - Battleground* bg = GetPlayer()->GetBattleground(); + Battleground* bg = referencePlayer->GetBattleground(); if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j) notfit = true; @@ -935,7 +1287,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (notfit) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: @@ -944,7 +1296,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1) continue; - Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId()); + Map const* map = referencePlayer->IsInWorld() ? referencePlayer->GetMap() : sMapMgr->FindMap(referencePlayer->GetMapId(), referencePlayer->GetInstanceId()); if (!map || !map->IsDungeon()) continue; @@ -960,7 +1312,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!achievIdForDungeon[j][2]) break; // for } - else if (GetPlayer()->GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL) + else if (referencePlayer->GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL) { // dungeon in normal mode accepted if (!achievIdForDungeon[j][1]) @@ -983,7 +1335,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui //FIXME: work only for instances where max == min for players if (((InstanceMap*)map)->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } @@ -993,7 +1345,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; if (miscValue1 != achievementCriteria->killed_by_creature.creatureEntry) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case @@ -1001,10 +1353,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; // if team check required: must kill by opposition faction - if (achievement->ID == 318 && miscValue2 == GetPlayer()->GetTeam()) + if (achievement->ID == 318 && miscValue2 == referencePlayer->GetTeam()) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: { @@ -1013,7 +1365,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; // miscvalue1 is the ingame fallheight*100 as stored in dbc - SetCriteriaProgress(achievementCriteria, miscValue1); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: @@ -1022,7 +1374,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; if (miscValue2 != achievementCriteria->death_from.type) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: { @@ -1035,15 +1387,15 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui else { // login case. - if (!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID)) + if (!referencePlayer->GetQuestRewardStatus(achievementCriteria->complete_quest.questID)) continue; } if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria)) - if (!data->Meets(GetPlayer(), unit)) + if (!data->Meets(referencePlayer, unit)) continue; - SetCriteriaProgress(achievementCriteria, 1); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: @@ -1052,7 +1404,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: @@ -1061,15 +1413,15 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID) continue; - if (GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID)) - SetCriteriaProgress(achievementCriteria, 1); + if (referencePlayer->HasSpell(achievementCriteria->learn_spell.spellID)) + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: { @@ -1080,20 +1432,20 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue1 != achievementCriteria->loot_type.lootType) continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue2, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: // speedup for non-login case if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1) continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue2, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: if (!miscValue1) // no update at login continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case @@ -1103,7 +1455,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (achievementCriteria->use_item.itemID != miscValue1) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: // You _have_ to loot that item, just owning it when logging in does _not_ count! @@ -1111,7 +1463,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; if (miscValue1 != achievementCriteria->own_item.itemID) continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue2, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: { @@ -1133,7 +1485,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui uint32 playerIndexOffset = uint32(exploreFlag) / 32; uint32 mask = 1<< (uint32(exploreFlag) % 32); - if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask) + if (referencePlayer->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask) { matchFound = true; break; @@ -1141,11 +1493,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui } if (matchFound) - SetCriteriaProgress(achievementCriteria, 1); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetBankBagSlotCount()); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetBankBagSlotCount(), referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: { @@ -1153,14 +1505,14 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID) continue; - int32 reputation = GetPlayer()->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID); + int32 reputation = referencePlayer->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID); if (reputation > 0) - SetCriteriaProgress(achievementCriteria, reputation); + SetCriteriaProgress(achievementCriteria, reputation, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: { - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetExaltedFactionCount()); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetReputationMgr().GetExaltedFactionCount(), referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: @@ -1168,7 +1520,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // skip for login case if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, 1); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: @@ -1181,7 +1533,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue2 != achievementCriteria->equip_epic_item.itemSlot) continue; - SetCriteriaProgress(achievementCriteria, 1); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; } @@ -1199,7 +1551,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!pProto) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: @@ -1210,7 +1562,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue1 != achievementCriteria->do_emote.emoteID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: @@ -1221,7 +1573,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP) { - if (GetPlayer()->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value) + if (referencePlayer->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value) continue; // map specific case (BG in fact) expected player targeted damage/heal @@ -1229,7 +1581,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; } - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: @@ -1239,7 +1591,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue1 != achievementCriteria->equip_item.itemID) continue; - SetCriteriaProgress(achievementCriteria, 1); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: // miscvalue1 = go entry @@ -1248,7 +1600,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue1 != achievementCriteria->use_gameobject.goEntry) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: if (!miscValue1) @@ -1256,7 +1608,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue1 != achievementCriteria->fish_in_gameobject.goEntry) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: { @@ -1264,8 +1616,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; uint32 spellCount = 0; - for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin(); - spellIter != GetPlayer()->GetSpellMap().end(); + for (PlayerSpellMap::const_iterator spellIter = referencePlayer->GetSpellMap().begin(); + spellIter != referencePlayer->GetSpellMap().end(); ++spellIter) { SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter->first); @@ -1275,7 +1627,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui spellCount++; } } - SetCriteriaProgress(achievementCriteria, spellCount); + SetCriteriaProgress(achievementCriteria, spellCount, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: @@ -1283,16 +1635,16 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION: - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetReveredFactionCount()); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetReputationMgr().GetReveredFactionCount(), referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION: - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetHonoredFactionCount()); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetReputationMgr().GetHonoredFactionCount(), referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetVisibleFactionCount()); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetReputationMgr().GetVisibleFactionCount(), referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: @@ -1303,7 +1655,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1); if (!proto || proto->Quality < ITEM_QUALITY_EPIC) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: @@ -1312,8 +1664,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; uint32 spellCount = 0; - for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin(); - spellIter != GetPlayer()->GetSpellMap().end(); + for (PlayerSpellMap::const_iterator spellIter = referencePlayer->GetSpellMap().begin(); + spellIter != referencePlayer->GetSpellMap().end(); ++spellIter) { SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter->first); @@ -1321,26 +1673,26 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (skillIter->second->skillId == achievementCriteria->learn_skill_line.skillLine) spellCount++; } - SetCriteriaProgress(achievementCriteria, spellCount); + SetCriteriaProgress(achievementCriteria, spellCount, referencePlayer); break; } case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL: - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS)); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS), referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED: - SetCriteriaProgress(achievementCriteria, GetPlayer()->GetMoney(), PROGRESS_HIGHEST); + SetCriteriaProgress(achievementCriteria, referencePlayer->GetMoney(), referencePlayer, PROGRESS_HIGHEST); break; case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: { @@ -1350,10 +1702,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui for (CompletedAchievementMap::iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) if (AchievementEntry const* pAchievement = sAchievementStore.LookupEntry(itr->first)) points += pAchievement->points; - SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET); + SetCriteriaProgress(achievementCriteria, points, referencePlayer, PROGRESS_SET); } else - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: @@ -1361,7 +1713,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: @@ -1372,7 +1724,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: @@ -1380,7 +1732,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID) continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; } case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: @@ -1392,13 +1744,13 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue2 != reqTeamType) continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_HIGHEST); } else // login case { for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot) { - uint32 teamId = GetPlayer()->GetArenaTeamId(arena_slot); + uint32 teamId = referencePlayer->GetArenaTeamId(arena_slot); if (!teamId) continue; @@ -1406,7 +1758,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!team || team->GetType() != reqTeamType) continue; - SetCriteriaProgress(achievementCriteria, team->GetStats().Rating, PROGRESS_HIGHEST); + SetCriteriaProgress(achievementCriteria, team->GetStats().Rating, referencePlayer, PROGRESS_HIGHEST); break; } } @@ -1422,13 +1774,13 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (miscValue2 != reqTeamType) continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_HIGHEST); } else // login case { for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot) { - uint32 teamId = GetPlayer()->GetArenaTeamId(arena_slot); + uint32 teamId = referencePlayer->GetArenaTeamId(arena_slot); if (!teamId) continue; @@ -1436,9 +1788,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!team || team->GetType() != reqTeamType) continue; - if (ArenaTeamMember const* member = team->GetMember(GetPlayer()->GetGUID())) + if (ArenaTeamMember const* member = team->GetMember(referencePlayer->GetGUID())) { - SetCriteriaProgress(achievementCriteria, member->PersonalRating, PROGRESS_HIGHEST); + SetCriteriaProgress(achievementCriteria, member->PersonalRating, referencePlayer, PROGRESS_HIGHEST); break; } } @@ -1453,7 +1805,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; if (int64(miscValue2) < 0) continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); + SetCriteriaProgress(achievementCriteria, miscValue2, referencePlayer, PROGRESS_ACCUMULATE); break; // FIXME: not triggered in code as result, need to implement case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: @@ -1479,22 +1831,23 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui } if (IsCompletedCriteria(achievementCriteria, achievement)) - CompletedCriteriaFor(achievement); + CompletedCriteriaFor(achievement, referencePlayer); // check again the completeness for SUMM and REQ COUNT achievements, // as they don't depend on the completed criteria but on the sum of the progress of each individual criteria if (achievement->flags & ACHIEVEMENT_FLAG_SUMM) if (IsCompletedAchievement(achievement)) - CompletedAchievement(achievement); + CompletedAchievement(achievement, referencePlayer); if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achievement->ID)) for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr) if (IsCompletedAchievement(*itr)) - CompletedAchievement(*itr); + CompletedAchievement(*itr, referencePlayer); } } -bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement) +template +bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement) { // counter can never complete if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER) @@ -1651,7 +2004,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve return false; } -void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement) +template +void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement, Player* referencePlayer) { // counter can never complete if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER) @@ -1662,10 +2016,11 @@ void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement) return; if (IsCompletedAchievement(achievement)) - CompletedAchievement(achievement); + CompletedAchievement(achievement, referencePlayer); } -bool AchievementMgr::IsCompletedAchievement(AchievementEntry const* entry) +template +bool AchievementMgr::IsCompletedAchievement(AchievementEntry const* entry) { // counter can never complete if (entry->flags & ACHIEVEMENT_FLAG_COUNTER) @@ -1727,7 +2082,8 @@ bool AchievementMgr::IsCompletedAchievement(AchievementEntry const* entry) return false; } -CriteriaProgress* AchievementMgr::GetCriteriaProgress(AchievementCriteriaEntry const* entry) +template +CriteriaProgress* AchievementMgr::GetCriteriaProgress(AchievementCriteriaEntry const* entry) { CriteriaProgressMap::iterator iter = m_criteriaProgress.find(entry->ID); @@ -1737,14 +2093,15 @@ CriteriaProgress* AchievementMgr::GetCriteriaProgress(AchievementCriteriaEntry c return &(iter->second); } -void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, ProgressType ptype) +template +void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, Player* referencePlayer, ProgressType ptype) { // Don't allow to cheat - doing timed achievements without timer active TimedAchievementMap::iterator timedIter = m_timedAchievements.find(entry->ID); if (entry->timeLimit && timedIter == m_timedAchievements.end()) return; - sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::SetCriteriaProgress(%u, %u) for (GUID:%u)", entry->ID, changeValue, m_player->GetGUIDLow()); + sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::SetCriteriaProgress(%u, %u) for (%s GUID: "UI64FMTD")", entry->ID, changeValue, GetLogNameForGuid(GetOwner()->GetGUID()), GetOwner()->GetGUID()); CriteriaProgress* progress = GetCriteriaProgress(entry); if (!progress) @@ -1787,38 +2144,28 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, progress->changed = true; progress->date = time(NULL); // set the date to the latest update. + AchievementEntry const* achievement = sAchievementStore.LookupEntry(entry->referredAchievement); uint32 timeElapsed = 0; - bool timedCompleted = false; + bool criteriaComplete = IsCompletedCriteria(entry, achievement); if (entry->timeLimit) { - // has to exist else we wouldn't be here - timedCompleted = IsCompletedCriteria(entry, sAchievementStore.LookupEntry(entry->referredAchievement)); // Client expects this in packet timeElapsed = entry->timeLimit - (timedIter->second/IN_MILLISECONDS); // Remove the timer, we wont need it anymore - if (timedCompleted) + if (criteriaComplete) m_timedAchievements.erase(timedIter); } - SendCriteriaUpdate(entry, progress, timeElapsed, timedCompleted); -} - -void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry) -{ - CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(entry->ID); - if (criteriaProgress == m_criteriaProgress.end()) - return; - - WorldPacket data(SMSG_CRITERIA_DELETED, 4); - data << uint32(entry->ID); - m_player->SendDirectMessage(&data); + if (criteriaComplete && achievement->flags & ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS && !progress->CompletedGUID) + progress->CompletedGUID = referencePlayer->GetGUID(); - m_criteriaProgress.erase(criteriaProgress); + SendCriteriaUpdate(entry, progress, timeElapsed, criteriaComplete); } -void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) +template +void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) { if (!m_timedAchievements.empty()) { @@ -1840,7 +2187,13 @@ void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) } } -void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost /*= 0*/) +template +void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes /*type*/, uint32 /*entry*/, uint32 /*timeLost = 0*/) +{ +} + +template<> +void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost /* = 0 */) { AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type); for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i) @@ -1857,13 +2210,14 @@ void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes type, u m_timedAchievements[(*i)->ID] = (*i)->timeLimit * IN_MILLISECONDS - timeLost; // and at client too - SetCriteriaProgress(*i, 0, PROGRESS_SET); + SetCriteriaProgress(*i, 0, GetOwner(), PROGRESS_SET); } } } } -void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry) +template +void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry) { AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type); for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i!=achievementCriteriaList.end(); ++i) @@ -1884,18 +2238,21 @@ void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, } } -void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) +template +void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* /*referencePlayer*/) { sLog->outDetail("AchievementMgr::CompletedAchievement(%u)", achievement->ID); // disable for gamemasters with GM-mode enabled - if (m_player->isGameMaster()) + if (_owner->isGameMaster()) return; if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID)) return; - SendAchievementEarned(achievement); + if (!GetOwner()->GetSession()->PlayerLoading()) + SendAchievementEarned(achievement); + CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; ca.date = time(NULL); ca.changed = true; @@ -1920,16 +2277,16 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) //! Since no common attributes were found, (not even in titleRewardFlags field) //! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! condition fields to the condition system. - if (uint32 titleId = reward->titleId[achievement->ID == 1793 ? GetPlayer()->getGender() : (GetPlayer()->GetTeam() == ALLIANCE ? 0 : 1)]) + if (uint32 titleId = reward->titleId[achievement->ID == 1793 ? GetOwner()->getGender() : (GetOwner()->GetTeam() == ALLIANCE ? 0 : 1)]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) - GetPlayer()->SetTitle(titleEntry); + GetOwner()->SetTitle(titleEntry); // mail if (reward->sender) { - Item* item = reward->itemId ? Item::CreateItem(reward->itemId, 1, GetPlayer()) : NULL; + Item* item = reward->itemId ? Item::CreateItem(reward->itemId, 1, GetOwner()) : NULL; - int loc_idx = GetPlayer()->GetSession()->GetSessionDbLocaleIndex(); + int loc_idx = GetOwner()->GetSession()->GetSessionDbLocaleIndex(); // subject and text std::string subject = reward->subject; @@ -1955,100 +2312,336 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) draft.AddItem(item); } - draft.SendMailTo(trans, GetPlayer(), MailSender(MAIL_CREATURE, reward->sender)); + draft.SendMailTo(trans, GetOwner(), MailSender(MAIL_CREATURE, reward->sender)); CharacterDatabase.CommitTransaction(trans); } } -void AchievementMgr::SendAllAchievementData() const +template<> +void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* referencePlayer) { - WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, m_completedAchievements.size()*8+4+m_criteriaProgress.size()*38+4); - BuildAllDataPacket(&data); + sLog->outDetail("AchievementMgr::CompletedAchievement(%u)", achievement->ID); + + if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID)) + return; + + SendAchievementEarned(achievement); + CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; + ca.date = time(NULL); + ca.changed = true; + + if (achievement->flags & ACHIEVEMENT_FLAG_SHOW_GUILD_MEMBERS) + { + if (referencePlayer->GetGuildId() == GetOwner()->GetId()) + ca.guids.insert(referencePlayer->GetGUID()); + + if (Group const* group = referencePlayer->GetGroup()) + for (GroupReference const* ref = group->GetFirstMember(); ref != NULL; ref = ref->next()) + if (Player const* groupMember = ref->getSource()) + if (groupMember->GetGuildId() == GetOwner()->GetId()) + ca.guids.insert(groupMember->GetGUID()); + } + + sAchievementMgr->SetRealmCompleted(achievement); + + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->points); +} + +struct VisibleAchievementPred +{ + bool operator()(CompletedAchievementMap::value_type const& val) + { + AchievementEntry const* achievement = sAchievementStore.LookupEntry(val.first); + return achievement && !(achievement->flags & ACHIEVEMENT_FLAG_HIDDEN); + } +}; + +template +void AchievementMgr::SendAllAchievementData(Player* /*receiver*/) const +{ + VisibleAchievementPred isVisible; + size_t numCriteria = m_criteriaProgress.size(); + size_t numAchievements = std::count_if(m_completedAchievements.begin(), m_completedAchievements.end(), isVisible); + ByteBuffer criteriaData(numCriteria * (4 + 4 + 4 + 4 + 8 + 8)); + uint8 guidBytes[8]; + uint8 progressBytes[8]; + *reinterpret_cast(&guidBytes[0]) = GetOwner()->GetGUID(); + + WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, 4 + numAchievements * (4 + 4) + 4 + numCriteria * (4 + 4 + 4 + 4 + 8 + 8)); + data.WriteBits(21, numCriteria); + for (CriteriaProgressMap::const_iterator itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr) + { + *reinterpret_cast(&progressBytes[0]) = itr->second.counter; + + data.WriteBit(guidBytes[4]); + data.WriteBit(progressBytes[3]); + data.WriteBit(guidBytes[5]); + data.WriteBit(progressBytes[0]); + data.WriteBit(progressBytes[6]); + data.WriteBit(guidBytes[3]); + data.WriteBit(guidBytes[0]); + data.WriteBit(progressBytes[4]); + data.WriteBit(guidBytes[2]); + data.WriteBit(progressBytes[7]); + data.WriteBit(guidBytes[7]); + data.WriteBits(0, 2); + data.WriteBit(guidBytes[6]); + data.WriteBit(progressBytes[2]); + data.WriteBit(progressBytes[1]); + data.WriteBit(progressBytes[5]); + data.WriteBit(guidBytes[1]); + + criteriaData.WriteByteSeq(guidBytes[3]); + criteriaData.WriteByteSeq(progressBytes[5]); + criteriaData.WriteByteSeq(progressBytes[6]); + criteriaData.WriteByteSeq(guidBytes[4]); + criteriaData.WriteByteSeq(guidBytes[6]); + criteriaData.WriteByteSeq(progressBytes[2]); + criteriaData << uint32(0); // timer 2 + criteriaData.WriteByteSeq(guidBytes[2]); + criteriaData << uint32(itr->first); // criteria id + criteriaData.WriteByteSeq(guidBytes[5]); + criteriaData.WriteByteSeq(progressBytes[0]); + criteriaData.WriteByteSeq(progressBytes[3]); + criteriaData.WriteByteSeq(progressBytes[1]); + criteriaData.WriteByteSeq(progressBytes[4]); + criteriaData.WriteByteSeq(guidBytes[0]); + criteriaData.WriteByteSeq(guidBytes[7]); + criteriaData.WriteByteSeq(progressBytes[7]); + criteriaData << uint32(0); // timer 1 + criteriaData << uint32(secsToTimeBitFields(itr->second.date)); // criteria date + criteriaData.WriteByteSeq(guidBytes[1]); + } + + data.WriteBits(numAchievements, 23); + data.append(criteriaData); + + for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) + { + if (!isVisible(*itr)) + continue; + + data << uint32(secsToTimeBitFields(itr->second.date)); + data << uint32(itr->first); + } + if (data.size() > 0x1000) data.Compress(SMSG_COMPRESSED_ACHIEVEMENT_DATA); - GetPlayer()->GetSession()->SendPacket(&data); + SendPacket(&data); } -void AchievementMgr::SendRespondInspectAchievements(Player* player) const +template<> +void AchievementMgr::SendAllAchievementData(Player* receiver) const { - WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 9+m_completedAchievements.size()*8+4+m_criteriaProgress.size()*38+4); - data.append(GetPlayer()->GetPackGUID()); - BuildAllDataPacket(&data); - player->GetSession()->SendPacket(&data); + WorldPacket data(SMSG_GUILD_ACHIEVEMENT_DATA, m_completedAchievements.size() * (4 + 4) + 4); + data.WriteBits(m_completedAchievements.size(), 23); + for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) + { + data << uint32(secsToTimeBitFields(itr->second.date)); + data << uint32(itr->first); + } + + receiver->GetSession()->SendPacket(&data); } -/** - * used by SMSG_RESPOND_INSPECT_ACHIEVEMENT and SMSG_ALL_ACHIEVEMENT_DATA - */ -void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const +template +void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 achievementId /*= 0*/) const { - size_t numCriterias = m_criteriaProgress.size(); - uint32 achievementCount = 0; - ByteBuffer bitBuffer(numCriterias * 2 / 8 + 1); // 2 bits per criteria/8 bits per byte - ByteBuffer counterBuffer(numCriterias * 8); // uint64 values - ByteBuffer guidBuffer(numCriterias * 8); - ByteBuffer criteriaDateBuffer(numCriterias * 4); - ByteBuffer zeros(numCriterias * 4, true); // fill with zeros - ByteBuffer criteriaIdBuffer(numCriterias * 4); - ByteBuffer achievementDateBuffer(m_completedAchievements.size() * 4); - ByteBuffer achievementIdBuffer(m_completedAchievements.size() * 4); - - AchievementEntry const* achievement = NULL; - for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter) +} + +template<> +void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 /*achievementId = 0 */) const +{ + uint8 guidBytes[8]; + uint8 progressBytes[8]; + + VisibleAchievementPred isVisible; + size_t numCriteria = m_criteriaProgress.size(); + size_t numAchievements = std::count_if(m_completedAchievements.begin(), m_completedAchievements.end(), isVisible); + ByteBuffer criteriaData(numCriteria * (0)); + *reinterpret_cast(&guidBytes[0]) = GetOwner()->GetGUID(); + + WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 1 + 8 + 3 + 3 + numAchievements * (4 + 4) + numCriteria * (0)); + data.WriteBit(guidBytes[7]); + data.WriteBit(guidBytes[4]); + data.WriteBit(guidBytes[1]); + data.WriteBits(numAchievements, 23); + data.WriteBit(guidBytes[0]); + data.WriteBit(guidBytes[3]); + data.WriteBits(numCriteria, 21); + data.WriteBit(guidBytes[2]); + for (CriteriaProgressMap::const_iterator itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr) + { + *reinterpret_cast(&progressBytes[0]) = itr->second.counter; + data.WriteBit(progressBytes[5]); + data.WriteBit(progressBytes[3]); + data.WriteBit(guidBytes[1]); + data.WriteBit(guidBytes[4]); + data.WriteBit(guidBytes[2]); + data.WriteBit(progressBytes[6]); + data.WriteBit(guidBytes[0]); + data.WriteBit(progressBytes[4]); + data.WriteBit(progressBytes[1]); + data.WriteBit(progressBytes[2]); + data.WriteBit(guidBytes[3]); + data.WriteBit(guidBytes[7]); + data.WriteBits(0, 2); // criteria progress flags + data.WriteBit(progressBytes[0]); + data.WriteBit(guidBytes[5]); + data.WriteBit(guidBytes[6]); + data.WriteBit(progressBytes[7]); + + criteriaData.WriteByteSeq(guidBytes[3]); + criteriaData.WriteByteSeq(progressBytes[4]); + criteriaData << uint32(0); // timer 1 + criteriaData.WriteByteSeq(guidBytes[1]); + criteriaData << uint32(secsToTimeBitFields(itr->second.date)); + criteriaData.WriteByteSeq(progressBytes[3]); + criteriaData.WriteByteSeq(progressBytes[7]); + criteriaData.WriteByteSeq(guidBytes[5]); + criteriaData.WriteByteSeq(progressBytes[0]); + criteriaData.WriteByteSeq(guidBytes[4]); + criteriaData.WriteByteSeq(guidBytes[2]); + criteriaData.WriteByteSeq(guidBytes[6]); + criteriaData.WriteByteSeq(guidBytes[7]); + criteriaData.WriteByteSeq(progressBytes[6]); + criteriaData << uint32(itr->first); + criteriaData << uint32(0); // timer 2 + criteriaData.WriteByteSeq(progressBytes[1]); + criteriaData.WriteByteSeq(progressBytes[5]); + criteriaData.WriteByteSeq(guidBytes[0]); + criteriaData.WriteByteSeq(progressBytes[2]); + } + + data.WriteBit(guidBytes[6]); + data.WriteBit(guidBytes[5]); + data.append(criteriaData); + data.WriteByteSeq(guidBytes[1]); + data.WriteByteSeq(guidBytes[6]); + data.WriteByteSeq(guidBytes[3]); + data.WriteByteSeq(guidBytes[0]); + data.WriteByteSeq(guidBytes[2]); + + for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) { - // Skip hidden achievements - achievement = sAchievementStore.LookupEntry(iter->first); - if (achievement->flags & ACHIEVEMENT_FLAG_HIDDEN) + if (!isVisible(*itr)) continue; - achievementDateBuffer << uint32(secsToTimeBitFields(iter->second.date)); - achievementIdBuffer << uint32(achievement->ID); - ++achievementCount; + data << uint32(itr->first); + data << uint32(secsToTimeBitFields(itr->second.date)); } - for (CriteriaProgressMap::const_iterator itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr) + data.WriteByteSeq(guidBytes[7]); + data.WriteByteSeq(guidBytes[4]); + data.WriteByteSeq(guidBytes[5]); + + receiver->GetSession()->SendPacket(&data); +} + +template<> +void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 achievementId /*= 0*/) const +{ + //will send response to criteria progress request + AchievementCriteriaEntryList const* criteria = sAchievementMgr->GetAchievementCriteriaByAchievement(achievementId); + if (!criteria) + { + // send empty packet + WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3); + data.WriteBits(0, 21); + receiver->GetSession()->SendPacket(&data); + return; + } + + uint8 criteriaProgress[8]; + uint8 criteriaGuid[8]; + uint32 numCriteria = 0; + ByteBuffer criteriaData(criteria->size() * (8 + 8 + 4 + 4 + 4)); + ByteBuffer criteriaBits(criteria->size() * (8 + 8) / 8); + for (AchievementCriteriaEntryList::const_iterator itr = criteria->begin(); itr != criteria->end(); ++itr) + { + uint32 criteriaId = (*itr)->ID; + CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(criteriaId); + if (progress == m_criteriaProgress.end()) + continue; + + ++numCriteria; + *reinterpret_cast(&criteriaProgress[0]) = progress->second.counter; + *reinterpret_cast(&criteriaGuid[0]) = progress->second.CompletedGUID; + + criteriaBits.WriteBit(criteriaProgress[4]); + criteriaBits.WriteBit(criteriaProgress[1]); + criteriaBits.WriteBit(criteriaGuid[2]); + criteriaBits.WriteBit(criteriaProgress[3]); + criteriaBits.WriteBit(criteriaGuid[1]); + criteriaBits.WriteBit(criteriaProgress[5]); + criteriaBits.WriteBit(criteriaProgress[0]); + criteriaBits.WriteBit(criteriaGuid[3]); + criteriaBits.WriteBit(criteriaProgress[2]); + criteriaBits.WriteBit(criteriaGuid[7]); + criteriaBits.WriteBit(criteriaGuid[5]); + criteriaBits.WriteBit(criteriaGuid[0]); + criteriaBits.WriteBit(criteriaProgress[6]); + criteriaBits.WriteBit(criteriaGuid[6]); + criteriaBits.WriteBit(criteriaProgress[7]); + criteriaBits.WriteBit(criteriaGuid[4]); + + criteriaData.WriteByteSeq(criteriaGuid[5]); + criteriaData << uint32(progress->second.date); // unknown date + criteriaData.WriteByteSeq(criteriaProgress[3]); + criteriaData.WriteByteSeq(criteriaProgress[7]); + criteriaData << uint32(progress->second.date); // unknown date + criteriaData.WriteByteSeq(criteriaProgress[6]); + criteriaData.WriteByteSeq(criteriaGuid[4]); + criteriaData.WriteByteSeq(criteriaGuid[1]); + criteriaData.WriteByteSeq(criteriaProgress[4]); + criteriaData.WriteByteSeq(criteriaGuid[3]); + criteriaData.WriteByteSeq(criteriaProgress[0]); + criteriaData.WriteByteSeq(criteriaGuid[2]); + criteriaData.WriteByteSeq(criteriaProgress[1]); + criteriaData.WriteByteSeq(criteriaGuid[6]); + criteriaData << uint32(progress->second.date); // last update time (not packed!) + criteriaData << uint32(criteriaId); + criteriaData.WriteByteSeq(criteriaProgress[5]); + criteriaData << uint32(0); + criteriaData.WriteByteSeq(criteriaGuid[7]); + criteriaData.WriteByteSeq(criteriaProgress[2]); + criteriaData.WriteByteSeq(criteriaGuid[0]); + } + + WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + criteriaBits.size() + criteriaData.size()); + data.WriteBits(numCriteria, 21); + if (numCriteria) { - bitBuffer.WriteBits(0, 2); - counterBuffer << uint64(itr->second.counter); - guidBuffer << uint64(GetPlayer()->GetGUID()); - criteriaDateBuffer << uint32(secsToTimeBitFields(itr->second.date)); - criteriaIdBuffer << uint32(itr->first); + data.append(criteriaBits); + data.append(criteriaData); } - bitBuffer.FlushBits(); - *data << uint32(numCriterias); - data->append(bitBuffer); - data->append(counterBuffer); - *data << uint32(achievementCount); - data->append(achievementDateBuffer); - data->append(guidBuffer); - data->append(criteriaDateBuffer); - data->append(zeros); - data->append(achievementIdBuffer); - data->append(criteriaIdBuffer); - data->append(zeros); + receiver->GetSession()->SendPacket(&data); } -bool AchievementMgr::HasAchieved(uint32 achievementId) const +template +bool AchievementMgr::HasAchieved(uint32 achievementId) const { return m_completedAchievements.find(achievementId) != m_completedAchievements.end(); } -bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, Unit* unit) +template +bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 /*miscValue2*/, Unit* unit, Player* referencePlayer) { if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, NULL)) return false; - if (achievement->mapID != -1 && GetPlayer()->GetMapId() != uint32(achievement->mapID)) + if (achievement->mapID != -1 && referencePlayer->GetMapId() != uint32(achievement->mapID)) return false; // don't update already completed criteria if (IsCompletedCriteria(criteria, achievement)) return false; - if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && GetPlayer()->GetTeam() != HORDE) || - (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeam() != ALLIANCE)) + if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && referencePlayer->GetTeam() != HORDE) || + (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && referencePlayer->GetTeam() != ALLIANCE)) return false; for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i) @@ -2059,11 +2652,11 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, switch (criteria->additionalRequirements[i].additionalRequirement_type) { case ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP: - if (GetPlayer()->GetMapId() != criteria->additionalRequirements[i].additionalRequirement_value) + if (referencePlayer->GetMapId() != criteria->additionalRequirements[i].additionalRequirement_value) return false; break; case ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP: - if (GetPlayer()->GetGroup()) + if (referencePlayer->GetGroup()) return false; break; default: @@ -2093,26 +2686,26 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY: - if (GetPlayer()->GetDifficulty(GetPlayer()->GetMap()->IsRaid()) != value) + if (uint32(referencePlayer->GetMap()->GetDifficulty()) != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_MAP: - if (GetPlayer()->GetMapId() != value) + if (referencePlayer->GetMapId() != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_ZONE: - if (GetPlayer()->GetZoneId() != value) + if (referencePlayer->GetZoneId() != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA: - if (GetPlayer()->GetAreaId() != value) + if (referencePlayer->GetAreaId() != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY: if (!unit) return false; if (const Player* player = unit->ToPlayer()) - if (player->GetTeam() == GetPlayer()->GetTeam()) + if (player->GetTeam() == referencePlayer->GetTeam()) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY: @@ -2122,7 +2715,7 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA: - if (!GetPlayer()->HasAura(value)) + if (!referencePlayer->HasAura(value)) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA: @@ -2139,11 +2732,11 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_RACE: - if (GetPlayer()->getRace() != value) + if (referencePlayer->getRace() != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_CLASS: - if (GetPlayer()->getClass() != value) + if (referencePlayer->getClass() != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_RACE: @@ -2159,7 +2752,7 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAX_GROUP_MEMBERS: - if (GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetMembersCount() >= value) + if (referencePlayer->GetGroup() && referencePlayer->GetGroup()->GetMembersCount() >= value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_TYPE: @@ -2169,7 +2762,7 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL: - if (GetPlayer()->getLevel() != value) + if (referencePlayer->getLevel() != value) return false; break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL: @@ -2193,6 +2786,9 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, return true; } +template class AchievementMgr; +template class AchievementMgr; + //========================================================== void AchievementGlobalMgr::LoadAchievementCriteriaList() { @@ -2205,20 +2801,28 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() return; } + uint32 criterias = 0; + uint32 guildCriterias = 0; for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId) { AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId); if (!criteria) continue; - m_AchievementCriteriasByType[criteria->requiredType].push_back(criteria); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement); + m_AchievementCriteriaListByAchievement[criteria->referredAchievement].push_back(criteria); + if (achievement && achievement->flags & ACHIEVEMENT_FLAG_GUILD) + ++guildCriterias, m_GuildAchievementCriteriasByType[criteria->requiredType].push_back(criteria); + else + ++criterias, m_AchievementCriteriasByType[criteria->requiredType].push_back(criteria); + if (criteria->timeLimit) m_AchievementCriteriasByTimedType[criteria->timedCriteriaStartType].push_back(criteria); } - sLog->outString(">> Loaded %lu achievement criteria in %u ms", (unsigned long)m_AchievementCriteriasByType->size(), GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(">> Loaded %u achievement criteria and %u guild achievement crieteria in %u ms", criterias, guildCriterias, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 7e0f715f2d2..636160d4437 100755 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -37,6 +37,7 @@ struct CriteriaProgress { uint32 counter; time_t date; // latest update time. + uint64 CompletedGUID; // GUID of the player that completed this criteria (guild achievements) bool changed; }; @@ -52,6 +53,7 @@ enum AchievementCriteriaDataType ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9, // minlevel minlevel of target ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER = 10, // gender 0=male; 1=female ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT = 11, // scripted requirement + // REUSE ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13, // count "with less than %u people in the zone" ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14, // team HORDE(67), ALLIANCE(469) ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15, // drunken_state 0 (enum DrunkenState) of player @@ -208,6 +210,7 @@ typedef std::map AchievementRewardLocales; struct CompletedAchievementData { time_t date; + std::set guids; bool changed; }; @@ -218,10 +221,11 @@ class Unit; class Player; class WorldPacket; +template class AchievementMgr { public: - AchievementMgr(Player* player); + AchievementMgr(T* owner); ~AchievementMgr(); void Reset(); @@ -229,13 +233,14 @@ class AchievementMgr void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult); void SaveToDB(SQLTransaction& trans); void ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, bool evenIfCriteriaComplete = false); - void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = NULL); - void CompletedAchievement(AchievementEntry const* entry); + void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = NULL, Player* referencePlayer = NULL); + void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer); void CheckAllAchievementCriteria(); - void SendAllAchievementData() const; - void SendRespondInspectAchievements(Player* player) const; + void SendAllAchievementData(Player* receiver) const; + void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const; bool HasAchieved(uint32 achievementId) const; - Player* GetPlayer() const { return m_player; } + T* GetOwner() const { return _owner; } + void UpdateTimedAchievements(uint32 timeDiff); void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements @@ -245,15 +250,15 @@ class AchievementMgr void SendAchievementEarned(AchievementEntry const* achievement) const; void SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const; CriteriaProgress* GetCriteriaProgress(AchievementCriteriaEntry const* entry); - void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, ProgressType ptype = PROGRESS_SET); + void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, Player* referencePlayer, ProgressType ptype = PROGRESS_SET); void RemoveCriteriaProgress(AchievementCriteriaEntry const* entry); - void CompletedCriteriaFor(AchievementEntry const* achievement); + void CompletedCriteriaFor(AchievementEntry const* achievement, Player* referencePlayer); bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement); bool IsCompletedAchievement(AchievementEntry const* entry); - bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, Unit* unit); - void BuildAllDataPacket(WorldPacket* data) const; + bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, Unit* unit, Player* referencePlayer); + void SendPacket(WorldPacket* data) const; - Player* m_player; + T* _owner; CriteriaProgressMap m_criteriaProgress; CompletedAchievementMap m_completedAchievements; typedef std::map TimedAchievementMap; @@ -267,9 +272,9 @@ class AchievementGlobalMgr ~AchievementGlobalMgr() {} public: - AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type) const + AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type, bool guild = false) const { - return m_AchievementCriteriasByType[type]; + return guild ? m_GuildAchievementCriteriasByType[type] : m_AchievementCriteriasByType[type]; } AchievementCriteriaEntryList const& GetTimedAchievementCriteriaByType(AchievementCriteriaTimedTypes type) const @@ -317,6 +322,22 @@ class AchievementGlobalMgr m_allCompletedAchievements.insert(achievement->ID); } + bool IsGroupCriteriaType(AchievementCriteriaTypes type) const + { + switch (type) + { + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: + case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: // NYI + case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: // NYI + case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND: // NYI + return true; + } + + return false; + } + void LoadAchievementCriteriaList(); void LoadAchievementCriteriaData(); void LoadAchievementReferenceList(); @@ -328,9 +349,13 @@ class AchievementGlobalMgr // store achievement criterias by type to speed up lookup AchievementCriteriaEntryList m_AchievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL]; + AchievementCriteriaEntryList m_GuildAchievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL]; + AchievementCriteriaEntryList m_AchievementCriteriasByTimedType[ACHIEVEMENT_TIMED_TYPE_MAX]; + // store achievement criterias by achievement to speed up lookup AchievementCriteriaListByAchievement m_AchievementCriteriaListByAchievement; + // store achievements by referenced achievement id to speed up lookup AchievementListByReferencedId m_AchievementListByReferencedId; diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index a156583a006..cb119884558 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -154,7 +154,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& { bidder->GetSession()->SendAuctionBidderNotification(auction->GetHouseId(), auction->Id, bidder_guid, 0, 0, auction->item_template); // FIXME: for offline player need also - bidder->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); + bidder->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); } MailDraft(msgAuctionWonSubject.str(), msgAuctionWonBody.str()) @@ -219,8 +219,8 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa //FIXME: what do if owner offline if (owner) { - owner->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit); - owner->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid); + owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit); + owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid); //send auction owner notification, bidder must be current! owner->GetSession()->SendAuctionOwnerNotification(auction); } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index ebcf5495a55..3c47b739072 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -34,6 +34,8 @@ #include "SpellAuras.h" #include "SpellAuraEffects.h" #include "Util.h" +#include "Guild.h" +#include "GuildMgr.h" namespace Trinity { @@ -799,6 +801,7 @@ void Battleground::EndBattleground(uint32 winner) } } + bool guildAwarded = false; uint8 aliveWinners = GetAlivePlayersCountByTeam(winner); for (BattlegroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { @@ -851,7 +854,7 @@ void Battleground::EndBattleground(uint32 winner) { // update achievement BEFORE personal rating update uint32 rating = player->GetArenaPersonalRating(winner_arena_team->GetSlot()); - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1); winner_arena_team->MemberWon(player, loser_matchmaker_rating, winner_matchmaker_change); } @@ -883,7 +886,18 @@ void Battleground::EndBattleground(uint32 winner) player->SetRandomWinner(true); } - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1); + if (!guildAwarded) + { + guildAwarded = true; + if (uint32 guildId = GetBgMap()->GetOwnerGuildId(player->GetTeam())) + if (Guild* guild = sGuildMgr->GetGuildById(guildId)) + { + guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1, 0, NULL, player); + if (isArena() && isRated() && winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) + guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, std::max(winner_arena_team->GetRating(), 1), 0, NULL, player); + } + } } else { @@ -902,7 +916,7 @@ void Battleground::EndBattleground(uint32 winner) BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType()); player->GetSession()->SendPacket(&data); - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1); } if (isArena() && isRated() && winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index d28f5ddfe6a..86f3d5c54cb 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -681,11 +681,11 @@ void BattlegroundAB::UpdatePlayerScore(Player* Source, uint32 type, uint32 value { case SCORE_BASES_ASSAULTED: ((BattlegroundABScore*)itr->second)->BasesAssaulted += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE); break; case SCORE_BASES_DEFENDED: ((BattlegroundABScore*)itr->second)->BasesDefended += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE); break; default: Battleground::UpdatePlayerScore(Source, type, value, doAddHonor); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index d2cbab2be54..715564d3252 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -540,19 +540,19 @@ void BattlegroundAV::UpdatePlayerScore(Player* Source, uint32 type, uint32 value { case SCORE_GRAVEYARDS_ASSAULTED: ((BattlegroundAVScore*)itr->second)->GraveyardsAssaulted += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD); break; case SCORE_GRAVEYARDS_DEFENDED: ((BattlegroundAVScore*)itr->second)->GraveyardsDefended += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD); break; case SCORE_TOWERS_ASSAULTED: ((BattlegroundAVScore*)itr->second)->TowersAssaulted += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER); break; case SCORE_TOWERS_DEFENDED: ((BattlegroundAVScore*)itr->second)->TowersDefended += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER); break; case SCORE_MINES_CAPTURED: ((BattlegroundAVScore*)itr->second)->MinesCaptured += value; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 8269a04a383..2b02caaf5a2 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -816,7 +816,7 @@ void BattlegroundEY::UpdatePlayerScore(Player* Source, uint32 type, uint32 value { case SCORE_FLAG_CAPTURES: // flags captured ((BattlegroundEYScore*)itr->second)->FlagCaptures += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG); break; default: Battleground::UpdatePlayerScore(Source, type, value, doAddHonor); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index d100dc645a2..0c583ddde3f 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -759,11 +759,11 @@ void BattlegroundWS::UpdatePlayerScore(Player* Source, uint32 type, uint32 value { case SCORE_FLAG_CAPTURES: // flags captured ((BattlegroundWGScore*)itr->second)->FlagCaptures += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG); break; case SCORE_FLAG_RETURNS: // flags returned ((BattlegroundWGScore*)itr->second)->FlagReturns += value; - Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG); + Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG); break; default: Battleground::UpdatePlayerScore(Source, type, value, doAddHonor); diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index e032335c3bc..cd8accd3759 100755 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -60,7 +60,7 @@ enum AchievementFlags { ACHIEVEMENT_FLAG_COUNTER = 0x00000001, // Just count statistic (never stop and complete) ACHIEVEMENT_FLAG_HIDDEN = 0x00000002, // Not sent to client - internal use only - ACHIEVEMENT_FLAG_STORE_MAX_VALUE = 0x00000004, // Store only max value? used only in "Reach level xx" + ACHIEVEMENT_FLAG_PLAY_NO_VISUAL = 0x00000004, // Client does not play achievement earned visual ACHIEVEMENT_FLAG_SUMM = 0x00000008, // Use summ criteria value from all reqirements (and calculate max value) ACHIEVEMENT_FLAG_MAX_USED = 0x00000010, // Show max criteria (and calculate max value ??) ACHIEVEMENT_FLAG_REQ_COUNT = 0x00000020, // Use not zero req count (and calculate max value) @@ -70,8 +70,8 @@ enum AchievementFlags ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200, // ACHIEVEMENT_FLAG_UNK3 = 0x00000400, // ACHIEVEMENT_FLAG_HIDE_NAME_IN_TIE ACHIEVEMENT_FLAG_REALM_FIRST_GUILD = 0x00000800, // first guild on realm done something - ACHIEVEMENT_FLAG_UNK4 = 0x00001000, // as guild group? - ACHIEVEMENT_FLAG_UNK5 = 0x00002000, // as guild group? + ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS = 0x00001000, // Shows in guild news + ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER = 0x00002000, // Shows in guild news header ACHIEVEMENT_FLAG_GUILD = 0x00004000, // ACHIEVEMENT_FLAG_SHOW_GUILD_MEMBERS = 0x00008000, // ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS = 0x00010000, // @@ -191,137 +191,143 @@ enum AchievementCriteriaTimedTypes enum AchievementCriteriaTypes { - ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0, - ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1, - ACHIEVEMENT_CRITERIA_TYPE_UNK3 = 3, // struct { uint32 itemCount; } - ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5, - ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9, + ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0, + ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS = 3, // struct { uint32 itemCount; } + ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5, + ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9, // you have to complete a daily quest x times in a row - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11, - ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12, - ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15, - ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16, - ACHIEVEMENT_CRITERIA_TYPE_DEATH= 17, - ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19, - ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20, - ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER = 23, - ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24, - ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27, - ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28, - ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL= 29, - ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30, - ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31, - ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32, - ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33, - ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34, - ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL = 35, - ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36, - ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39, - ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40, - ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41, - ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM= 42, - ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43, - ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK= 44, - ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT= 45, - ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION= 46, - ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11, + ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12, + ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15, + ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16, + ACHIEVEMENT_CRITERIA_TYPE_DEATH = 17, + ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19, + ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20, + ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER = 23, + ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24, + ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27, + ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28, + ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29, + ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30, + ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31, + ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32, + ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33, + ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34, + ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL = 35, + ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36, + ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39, + ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40, + ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41, + ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42, + ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43, + ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK = 44, + ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT = 45, + ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46, + ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION = 47, // noted: rewarded as soon as the player payed, not at taking place at the seat - ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP= 48, - ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49, + ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48, + ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49, // TODO: itemlevel is mentioned in text but not present in dbc - ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50, - ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT= 51, - ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52, - ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53, - ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54, - ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55, + ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50, + ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51, + ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52, + ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53, + ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54, + ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55, // TODO: in some cases map not present, and in some cases need do without die - ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56, - ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57, - ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS = 59, - ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60, - ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61, - ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62, - ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63, - ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65, - ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66, - ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67, - ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68, - ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2= 69, - ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70, - ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72, + ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56, + ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57, + ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS = 59, + ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60, + ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61, + ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62, + ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63, + ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65, + ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66, + ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67, + ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68, + ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69, + ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70, + ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72, // TODO: title id is not mentioned in dbc - ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE = 74, - ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75, - ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76, - ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77, + ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE = 74, + ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75, + ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76, + ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77, // TODO: creature type (demon, undead etc.) is not stored in dbc - ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE = 78, - ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS= 80, - ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION= 82, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID= 83, - ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS= 84, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86, - ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87, - ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88, - ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS = 89, - ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90, - ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91, - ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED = 93, - ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED = 94, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102, - ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED = 104, - ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106, - ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107, - ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108, - ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109, + ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE = 78, + ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS = 80, + ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION = 82, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID = 83, + ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS = 84, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86, + ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87, + ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88, + ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS = 89, + ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90, + ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91, + ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED = 93, + ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED = 94, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102, + ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED = 104, + ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106, + ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107, + ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108, + ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109, // TODO: target entry is missing - ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110, - ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112, - ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113, - ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114, - ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115, - ACHIEVEMENT_CRITERIA_TYPE_UNK118 = 118, + ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110, + ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112, + ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113, + ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114, + ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115, + ACHIEVEMENT_CRITERIA_TYPE_UNK118 = 118, ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS = 119, - ACHIEVEMENT_CRITERIA_TYPE_UNK120 = 120, - ACHIEVEMENT_CRITERIA_TYPE_UNK121 = 121, - ACHIEVEMENT_CRITERIA_TYPE_UNK122 = 122, - ACHIEVEMENT_CRITERIA_TYPE_UNK123 = 123, - ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124, - ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125, - ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126, - ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL = 127, - ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS = 128, + ACHIEVEMENT_CRITERIA_TYPE_UNK120 = 120, + ACHIEVEMENT_CRITERIA_TYPE_UNK121 = 121, + ACHIEVEMENT_CRITERIA_TYPE_UNK122 = 122, + ACHIEVEMENT_CRITERIA_TYPE_UNK123 = 123, + ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124, + ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125, + ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126, + ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL = 127, + ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS = 128, ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS = 129, - ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND = 130, - ACHIEVEMENT_CRITERIA_TYPE_REACH_BG_RATING = 132, - ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD = 133, - ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134, - ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135, - ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136, - ACHIEVEMENT_CRITERIA_TYPE_UNK137 = 137, - ACHIEVEMENT_CRITERIA_TYPE_UNK138 = 138, //struct { Flag flag; uint32 count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild battlefield - ACHIEVEMENT_CRITERIA_TYPE_UNK139 = 139, //struct { uint32 count; } Guild Challenge - ACHIEVEMENT_CRITERIA_TYPE_UNK140 = 140, - ACHIEVEMENT_CRITERIA_TYPE_UNK141 = 141, - ACHIEVEMENT_CRITERIA_TYPE_UNK142 = 142, - ACHIEVEMENT_CRITERIA_TYPE_UNK143 = 143, - ACHIEVEMENT_CRITERIA_TYPE_UNK144 = 144, + ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND = 130, + ACHIEVEMENT_CRITERIA_TYPE_REACH_BG_RATING = 132, + ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD = 133, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134, + ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135, + ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136, + ACHIEVEMENT_CRITERIA_TYPE_UNK137 = 137, + ACHIEVEMENT_CRITERIA_TYPE_UNK138 = 138, //struct { Flag flag; uint32 count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild battlefield + ACHIEVEMENT_CRITERIA_TYPE_UNK139 = 139, //struct { uint32 count; } Guild Challenge + ACHIEVEMENT_CRITERIA_TYPE_UNK140 = 140, + ACHIEVEMENT_CRITERIA_TYPE_UNK141 = 141, + ACHIEVEMENT_CRITERIA_TYPE_UNK142 = 142, + ACHIEVEMENT_CRITERIA_TYPE_UNK143 = 143, + ACHIEVEMENT_CRITERIA_TYPE_UNK144 = 144, + ACHIEVEMENT_CRITERIA_TYPE_UNK145 = 145, + ACHIEVEMENT_CRITERIA_TYPE_UNK146 = 146, + ACHIEVEMENT_CRITERIA_TYPE_UNK147 = 147, + ACHIEVEMENT_CRITERIA_TYPE_UNK148 = 148, + ACHIEVEMENT_CRITERIA_TYPE_UNK149 = 149, + ACHIEVEMENT_CRITERIA_TYPE_UNK150 = 150, // 0..144 => 145 criteria types total - ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 145, + ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 151, }; enum AchievementCategory diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 91f9104b0b1..b3e5f2a3eab 100755 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1901,7 +1901,7 @@ void LFGMgr::RewardDungeonDoneFor(const uint32 dungeonId, Player* player) // Update achievements if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC) - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 1); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 1); LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->getLevel()); if (!reward) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ba7ca524521..f66f3b95128 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -432,6 +432,7 @@ void TradeData::SetAccepted(bool state, bool crosssend /*= false*/) // 4.3. Give reputation (player must not be on BG). // 4.4. Give kill credit (player must not be in group, or he must be alive or without corpse). // 5. Credit instance encounter. +// 6. Update guild achievements. KillRewarder::KillRewarder(Player* killer, Unit* victim, bool isBattleGround) : // 1. Initialize internal variables to default values. _killer(killer), _victim(victim), _group(killer->GetGroup()), @@ -623,10 +624,18 @@ void KillRewarder::Reward() } // 5. Credit instance encounter. + // 6. Update guild achievements. if (Creature* victim = _victim->ToCreature()) + { if (victim->IsDungeonBoss()) if (InstanceScript* instance = _victim->GetInstanceScript()) instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, _victim->GetEntry(), _victim); + + if (uint32 guildId = victim->GetMap()->GetOwnerGuildId()) + if (Guild* guild = sGuildMgr->GetGuildById(guildId)) + guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, victim, _killer); + } + } // == Player ==================================================== @@ -1277,7 +1286,7 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) GetSession()->SendPacket(&data2); } - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, 1, type); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, 1, type); } return final_damage; @@ -1816,9 +1825,9 @@ void Player::setDeathState(DeathState s) // passive spell if (!ressSpellId) ressSpellId = GetResurrectionSpellId(); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1); GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH); GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH); GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH); @@ -3158,7 +3167,7 @@ void Player::GiveLevel(uint8 level) CharacterDatabase.CommitTransaction(trans); } - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL); // Refer-A-Friend if (GetSession()->GetRecruiterId()) @@ -3939,11 +3948,11 @@ bool Player::addSpell(uint32 spellId, bool active, bool learning, bool dependent // not ranked skills for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx) { - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, _spell_idx->second->skillId); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, _spell_idx->second->skillId); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, _spell_idx->second->skillId); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, _spell_idx->second->skillId); } - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, spellId); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, spellId); } // return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell @@ -4511,8 +4520,8 @@ bool Player::ResetTalents(bool no_cost) if (!no_cost) { ModifyMoney(-(int32)cost); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, cost); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, cost); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, 1); SetTalentResetCost(cost); SetTalentResetTime(time(NULL)); @@ -6219,7 +6228,7 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step) if (itr->second.uState != SKILL_NEW) itr->second.uState = SKILL_CHANGED; UpdateSkillEnchantments(skill_id, value, new_value); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, skill_id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, skill_id); return true; } @@ -6362,7 +6371,7 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) } } UpdateSkillEnchantments(SkillId, SkillValue, new_value); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, SkillId); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, SkillId); sLog->outDebug(LOG_FILTER_PLAYER_SKILLS, "Player::UpdateSkillPro Chance=%3.1f%% taken", Chance / 10.0f); return true; } @@ -6552,8 +6561,8 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal) // if skill value is going up, update enchantments after setting the new value if (newVal > currVal) UpdateSkillEnchantments(id, currVal, newVal); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id); } else //remove { @@ -6593,8 +6602,8 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal) SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id, step)); SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i), MAKE_SKILL_VALUE(newVal, maxVal)); UpdateSkillEnchantments(id, currVal, newVal); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id); // insert new entry or update if not deleted old entry yet if (itr != mSkillStatus.end()) @@ -6964,7 +6973,7 @@ void Player::CheckAreaExploreAndOutdoor() { SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val)); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA); AreaTableEntry const* areaEntry = GetAreaEntryByAreaFlagAndMap(areaFlag, GetMapId()); if (!areaEntry) @@ -7494,7 +7503,7 @@ void Player::ModifyCurrency(uint32 id, int32 count) if (IsInWorld() && !GetSession()->PlayerLoading()) { if (count > 0) - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count); WorldPacket packet(SMSG_UPDATE_CURRENCY, 12); packet << uint32(id); @@ -7870,10 +7879,10 @@ void Player::DuelComplete(DuelCompleteType type) } break; case DUEL_WON: - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, 1); if (duel->opponent) { - duel->opponent->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, 1); + duel->opponent->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, 1); //Credit for quest Death's Challenge if (getClass() == CLASS_DEATH_KNIGHT && duel->opponent->GetQuestStatus(12733) == QUEST_STATUS_INCOMPLETE) @@ -12163,8 +12172,8 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update if (pItem) { ItemAddedQuestCheck(item, count); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, count); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, item, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, count); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, item, 1); if (randomPropertyId) pItem->SetItemRandomProperties(randomPropertyId); pItem = StoreItem(dest, pItem, update); @@ -12334,7 +12343,7 @@ Item* Player::EquipNewItem(uint16 pos, uint32 item, bool update) if (Item* pItem = Item::CreateItem(item, 1, this)) { ItemAddedQuestCheck(item, 1); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, 1); return EquipItem(pos, pItem, update); } @@ -12444,8 +12453,8 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) } // only for full equip instead adding to stack - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); return pItem; } @@ -12466,8 +12475,8 @@ void Player::QuickEquipItem(uint16 pos, Item* pItem) pItem->SendUpdateToPlayer(this); } - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); } } @@ -12613,7 +12622,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool { // update quest counters ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount()); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount()); // store item Item* pLastItem = StoreItem(dest, pItem, update); @@ -15210,7 +15219,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, ModifyMoney(moneyRew); if (moneyRew > 0) - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, uint32(moneyRew)); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, uint32(moneyRew)); } // honor reward @@ -15244,8 +15253,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, SetDailyQuestStatus(quest_id); if (quest->IsDaily()) { - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, quest_id); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, quest_id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, quest_id); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, quest_id); } } else if (quest->IsWeekly()) @@ -15273,9 +15282,9 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, CastSpell(this, quest->GetRewSpell(), true); if (quest->GetZoneOrSort() > 0) - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, quest->GetZoneOrSort()); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, quest->GetZoneOrSort()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId()); uint32 zone = 0; uint32 area = 0; @@ -16055,7 +16064,7 @@ void Player::KilledMonsterCredit(uint32 entry, uint64 guid) } GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : NULL); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : NULL); for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i) { @@ -20883,8 +20892,8 @@ bool Player::ActivateTaxiPathTo(std::vector const& nodes, Creature* npc //Checks and preparations done, DO FLIGHT ModifyMoney(-(int32)totalcost); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, totalcost); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, totalcost); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, 1); // prevent stealth flight //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK); @@ -22218,7 +22227,7 @@ void Player::SendInitialPacketsBeforeAddToMap() SendInitialActionButtons(); m_reputationMgr.SendInitialReputations(); - m_achievementMgr.SendAllAchievementData(); + m_achievementMgr.SendAllAchievementData(this); SendEquipmentSetList(); @@ -22852,7 +22861,7 @@ void Player::SummonIfPossible(bool agree) m_summon_expire = 0; - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, 1); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, 1); TeleportTo(m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, GetOrientation()); } @@ -24021,9 +24030,9 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) --loot->unlootedCount; SendNewItem(newitem, uint32(item->count), false, false, true); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item->count); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item->itemid, item->count); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item->count); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item->itemid, item->count); } else SendEquipError(msg, NULL, NULL, item->itemid); @@ -24303,7 +24312,7 @@ void Player::HandleFall(MovementInfo const& movementInfo) // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case if (isAlive() && final_damage < original_health) - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100)); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100)); } //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction @@ -24315,12 +24324,20 @@ void Player::HandleFall(MovementInfo const& movementInfo) void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/) { - GetAchievementMgr().UpdateAchievementCriteria(type, miscValue1, miscValue2, unit); + GetAchievementMgr().UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, this); + + // Update only individual achievement criteria here, otherwise we may get multiple updates + // from a single boss kill + if (sAchievementMgr->IsGroupCriteriaType(type)) + return; + + if (Guild* guild = sGuildMgr->GetGuildById(m_guildId)) + guild->GetAchievementMgr().UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, this); } void Player::CompletedAchievement(AchievementEntry const* entry) { - GetAchievementMgr().CompletedAchievement(entry); + GetAchievementMgr().CompletedAchievement(entry, this); } bool Player::LearnTalent(uint32 talentId, uint32 talentRank) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index dbe9cd94a21..e273ba81077 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1887,7 +1887,7 @@ class Player : public Unit, public GridObject CharacterDatabase.Execute(stmt); m_guildId = GuildId; } - uint32 GetGuildId() { return m_guildId; } + uint32 GetGuildId() const { return m_guildId; } static uint32 GetGuildIdFromDB(uint64 guid); void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); } @@ -2532,8 +2532,8 @@ class Player : public Unit, public GridObject void AddRunePower(uint8 index); void InitRunes(); - AchievementMgr& GetAchievementMgr() { return m_achievementMgr; } - AchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } + AchievementMgr& GetAchievementMgr() { return m_achievementMgr; } + AchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = NULL); void CompletedAchievement(AchievementEntry const* entry); @@ -2914,7 +2914,7 @@ class Player : public Unit, public GridObject uint32 m_temporaryUnsummonedPetNumber; uint32 m_oldpetspell; - AchievementMgr m_achievementMgr; + AchievementMgr m_achievementMgr; ReputationMgr m_reputationMgr; SpellCooldowns m_spellCooldowns; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5fe8f0bf657..599c79dedbd 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -693,7 +693,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam // call before auras are removed if (Player* killer = GetCharmerOrOwnerPlayerOrPlayerItself()) - killer->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, victim); + killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, victim); } Kill(victim, durabilityLoss); @@ -10019,15 +10019,15 @@ int32 Unit::DealHeal(Unit* victim, uint32 addhealth) // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria) if (gain) - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim); - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); } if (Player* player = victim->ToPlayer()) { - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); } return gain; @@ -15971,7 +15971,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) // update get killing blow achievements, must be done before setDeathState to be able to require auras on target // and before Spirit of Redemption as it also removes auras if (player) - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim); // if talent known but not triggered (check priest class for speedup check) bool spiritOfRedemption = false; @@ -16122,9 +16122,9 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) if (victim->GetTypeId() == TYPEID_PLAYER) { if (GetTypeId() == TYPEID_UNIT) - victim->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry()); + victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry()); else if (GetTypeId() == TYPEID_PLAYER && victim != this) - victim->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ToPlayer()->GetTeam()); + victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ToPlayer()->GetTeam()); } // Hook for OnPVPKill Event diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 743d56886f0..da363fbbb15 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1194,7 +1194,7 @@ void Group::CountTheRoll(Rolls::iterator rollI) if (player && player->GetSession()) { - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, roll->itemid, maxresul); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, roll->itemid, maxresul); ItemPosCountVec dest; LootItem* item = &(roll->getLoot()->items[roll->itemSlot]); @@ -1244,7 +1244,7 @@ void Group::CountTheRoll(Rolls::iterator rollI) if (player && player->GetSession()) { - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, roll->itemid, maxresul); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, roll->itemid, maxresul); LootItem* item = &(roll->getLoot()->items[roll->itemSlot]); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index b57e9970dab..94a9aff18bc 100755 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1070,7 +1070,7 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) /////////////////////////////////////////////////////////////////////////////// // Guild -Guild::Guild() : m_id(0), m_leaderGuid(0), m_createdDate(0), m_accountsNumber(0), m_bankMoney(0), m_eventLog(NULL) +Guild::Guild() : m_id(0), m_leaderGuid(0), m_createdDate(0), m_accountsNumber(0), m_bankMoney(0), m_eventLog(NULL), m_achievementMgr(this) { memset(&m_bankEventLog, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(LogHolder*)); } @@ -1227,7 +1227,7 @@ void Guild::HandleQuery(WorldSession* session) { WorldPacket data(SMSG_GUILD_QUERY_RESPONSE, 8 * 32 + 200); // Guess size - data << uint64(GetGuid()); + data << uint64(GetGUID()); data << m_name; // Rank name diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index f5d71d50023..59552da2c41 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -600,7 +600,7 @@ public: // Getters uint32 GetId() const { return m_id; } - uint64 GetGuid() const { return MAKE_NEW_GUID(m_id, 0, HIGHGUID_GUILD); } + uint64 GetGUID() const { return MAKE_NEW_GUID(m_id, 0, HIGHGUID_GUILD); } uint64 GetLeaderGUID() const { return m_leaderGuid; } const std::string& GetName() const { return m_name; } const std::string& GetMOTD() const { return m_motd; } @@ -679,6 +679,9 @@ public: // Bank tabs void SetBankTabText(uint8 tabId, const std::string& text); + AchievementMgr& GetAchievementMgr() { return m_achievementMgr; } + AchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } + protected: uint32 m_id; std::string m_name; @@ -699,6 +702,8 @@ protected: LogHolder* m_eventLog; LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; + AchievementMgr m_achievementMgr; + private: inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 450a49e345c..a6b73664695 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -405,7 +405,25 @@ void GuildMgr::LoadGuilds() } } - // 9. Validate loaded guild data + // 9. Load guild achievements + { + PreparedQueryResult achievementResult; + PreparedQueryResult criteriaResult; + for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_ACHIEVEMENT); + stmt->setUInt32(0, itr->first); + achievementResult = CharacterDatabase.Query(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA); + stmt->setUInt32(0, itr->first); + criteriaResult = CharacterDatabase.Query(stmt); + + itr->second->GetAchievementMgr().LoadFromDB(achievementResult, criteriaResult); + } + } + + // 10. Validate loaded guild data sLog->outString("Validating data of loaded guilds..."); { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 95204dfa353..f26379f4101 100755 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -276,7 +276,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, AUCTION_OK); - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); return; } else // Required stack size of auction does not match to current item stack size, clone item and set correct stack size @@ -345,7 +345,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, AUCTION_OK); - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); return; } } @@ -437,7 +437,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) auction->bidder = player->GetGUIDLow(); auction->bid = price; - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, price); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, price); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID); stmt->setUInt32(0, auction->bidder); @@ -460,7 +460,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) } auction->bidder = player->GetGUIDLow(); auction->bid = auction->buyout; - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, auction->buyout); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, auction->buyout); //- Mails must be under transaction control too to prevent data loss sAuctionMgr->SendAuctionSalePendingMail(auction, trans); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1c79b20ce81..26a3e7c67ea 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1441,7 +1441,7 @@ void WorldSession::HandleAlterAppearance(WorldPacket & recv_data) } _player->ModifyMoney(-int32(Cost)); // it isn't free - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, Cost); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, Cost); _player->SetByteValue(PLAYER_BYTES, 2, uint8(bs_hair->hair_id)); _player->SetByteValue(PLAYER_BYTES, 3, uint8(Color)); @@ -1449,7 +1449,7 @@ void WorldSession::HandleAlterAppearance(WorldPacket & recv_data) if (bs_skinColor) _player->SetByteValue(PLAYER_BYTES, 0, uint8(bs_skinColor->hair_id)); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, 1); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, 1); _player->SetStandState(0); // stand up } diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index c1246799e4b..08d36328cf0 100755 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -740,7 +740,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket & recv_data) TypeContainerVisitor >, WorldTypeMapContainer> message(emote_worker); cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE)); - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, unit); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, unit); //Send scripted event call if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index eadc0958518..626221e9696 100755 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -476,10 +476,10 @@ void WorldSession::HandleLootRoll(WorldPacket& recvData) switch (rollType) { case ROLL_NEED: - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); break; case ROLL_GREED: - GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); break; } } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 5baa54a2779..1e29ea2621e 100755 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -584,7 +584,7 @@ void WorldSession::HandleSellItemOpcode(WorldPacket & recv_data) uint32 money = pProto->SellPrice * count; _player->ModifyMoney(money); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS, money); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS, money); } else _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, itemguid, 0); @@ -632,7 +632,7 @@ void WorldSession::HandleBuybackItem(WorldPacket & recv_data) _player->ModifyMoney(-(int32)price); _player->RemoveItemFromBuyBackSlot(slot, false); _player->ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount()); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount()); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount()); _player->StoreItem(dest, pItem, true); } else @@ -947,7 +947,7 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& recvPacket) data << uint32(ERR_BANKSLOT_OK); SendPacket(&data); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT); } void WorldSession::HandleAutoBankItemOpcode(WorldPacket& recvPacket) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 339c7a44d9f..53e589e31fd 100755 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -179,7 +179,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket & /*recv_data*/) for (std::vector::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i) { (*i)->ModifyMoney(goldPerPlayer); - (*i)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer); + (*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer); WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); data << uint32(goldPerPlayer); @@ -190,7 +190,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket & /*recv_data*/) else { player->ModifyMoney(loot->gold); - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); data << uint32(loot->gold); @@ -496,9 +496,9 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket & recv_data) // not move item from loot to target inventory Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, looters); target->SendNewItem(newitem, uint32(item.count), false, false, true); - target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count); - target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item.count); - target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count); + target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count); + target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item.count); + target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count); // mark as looted item.count=0; diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index ce056d2729c..dd76c3a4c80 100755 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -246,7 +246,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data) player->SendMailResult(0, MAIL_SEND, MAIL_OK); player->ModifyMoney(-int32(reqmoney)); - player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, cost); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, cost); bool needItemDelay = false; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 956179b9d26..1c02d2082b8 100755 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1691,7 +1691,16 @@ void WorldSession::HandleQueryInspectAchievements(WorldPacket & recv_data) if (!player) return; - player->GetAchievementMgr().SendRespondInspectAchievements(_player); + player->GetAchievementMgr().SendAchievementInfo(_player); +} + +void WorldSession::HandleGuildAchievementProgressQuery(WorldPacket& recvData) +{ + uint32 achievementId; + recvData >> achievementId; + + if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) + guild->GetAchievementMgr().SendAchievementInfo(_player, achievementId); } void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& /*recv_data*/) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 2998b8a1c75..62924c6ef36 100755 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -440,7 +440,7 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPacket& recv_data) _player->SetQuestSlot(slot, 0); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED, 1); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED, 1); } } diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 5823a38fb42..6aba8c82477 100755 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -306,7 +306,7 @@ void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket) go->AI()->GossipHello(_player); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry()); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry()); } void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) @@ -599,7 +599,7 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket & recv_data) data << uint8(player->GetByteValue(PLAYER_BYTES, 2)); // hair data << uint8(player->GetByteValue(PLAYER_BYTES, 3)); // haircolor data << uint8(player->GetByteValue(PLAYER_BYTES_2, 0)); // facialhair - data << uint64(guild ? guild->GetGuid() : 0); + data << uint64(guild ? guild->GetGUID() : 0); static EquipmentSlots const itemSlots[] = { diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 6d526f23a94..5eb11416fdd 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -444,6 +444,7 @@ class Map : public GridRefManager bool Contains(const GameObjectModel& mdl) const { return _dynamicTree.contains(mdl);} bool getObjectHitPos(uint32 phasemask, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float modifyDist); + virtual uint32 GetOwnerGuildId(uint32 /*team*/ = TEAM_OTHER) const { return 0; } /* RESPAWN TIMES */ diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index 94a6590cc4a..0ae16d72758 100755 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -388,11 +388,11 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in UpdateRankCounters(old_rank, new_rank); _player->ReputationChanged(factionEntry); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, factionEntry->ID); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, factionEntry->ID); - _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, factionEntry->ID); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, factionEntry->ID); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, factionEntry->ID); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, factionEntry->ID); return true; } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 90245e8b109..ee28bd59618 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -320,6 +320,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_GROUP_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupUninviteOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_GROUP_UNINVITE_GUID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupUninviteGuidOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_GUILD_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAcceptOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_GUILD_ACHIEVEMENT_PROGRESS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAchievementProgressQuery); //DEFINE_OPCODE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAddRankOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_GUILD_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankerActivate ); //DEFINE_OPCODE_HANDLER(CMSG_GUILD_BANK_BUY_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankBuyTab ); @@ -779,7 +780,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(MSG_VIEW_PHASE_SHIFT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -916,8 +917,8 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_DAMAGE_CALC_LOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_DANCE_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1001,8 +1002,13 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_GROUP_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GROUP_SET_LEADER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GUILD_BANK_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_GUILD_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1240,7 +1246,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SERVER_BUCK_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SERVER_BUCK_DATA_START, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SERVER_INFO_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index f73f3af0446..26e3c65a1b7 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -200,6 +200,7 @@ enum Opcodes CMSG_GROUP_UNINVITE_GUID = 0x0000, CMSG_GUILDFINDER_JOIN = 0x0000, CMSG_GUILD_ACCEPT = 0x2531, + CMSG_GUILD_ACHIEVEMENT_PROGRESS_QUERY = 0x3235, CMSG_GUILD_BANKER_ACTIVATE = 0x2E37, CMSG_GUILD_BANK_BUY_TAB = 0x0000, CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x0000, @@ -543,7 +544,7 @@ enum Opcodes MSG_TALENT_WIPE_CONFIRM = 0x0000, MSG_VERIFY_CONNECTIVITY = 0x4F57, SMSG_ACCOUNT_DATA_TIMES = 0x4B05, - SMSG_ACHIEVEMENT_DELETED = 0x0000, + SMSG_ACHIEVEMENT_DELETED = 0x6A16, SMSG_ACHIEVEMENT_EARNED = 0x4405, SMSG_ACTION_BUTTONS = 0x38B5, SMSG_ACTIVATETAXIREPLY = 0x0000, @@ -672,7 +673,7 @@ enum Opcodes SMSG_CORPSE_NOT_IN_INSTANCE = 0x0000, SMSG_CORPSE_RECLAIM_DELAY = 0x0D34, SMSG_CREATURE_QUERY_RESPONSE = 0x6024, - SMSG_CRITERIA_DELETED = 0x0000, + SMSG_CRITERIA_DELETED = 0x2915, SMSG_CRITERIA_UPDATE = 0x6E37, SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x0000, SMSG_DAMAGE_CALC_LOG = 0x0000, @@ -742,10 +743,14 @@ enum Opcodes SMSG_GROUP_SET_LEADER = 0x0526, SMSG_GROUP_UNINVITE = 0x0000, SMSG_GUILDFINDER_SEARCH_RESULT = 0x0000, - SMSG_GUILD_ACHIEVEMENT_DATA = 0x0000, + SMSG_GUILD_ACHIEVEMENT_DATA = 0x54B7, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x35A0, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x50B5, SMSG_GUILD_BANK_LIST = 0x78A5, SMSG_GUILD_CANCEL = 0x0000, SMSG_GUILD_COMMAND_RESULT = 0x0000, + SMSG_GUILD_CRITERIA_DATA = 0x14B4, + SMSG_GUILD_CRITERIA_DELETED = 0x55B1, SMSG_GUILD_DECLINE = 0x0000, SMSG_GUILD_EVENT = 0x0705, SMSG_GUILD_INFO = 0x0000, @@ -977,7 +982,7 @@ enum Opcodes SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x0000, SMSG_RESET_FAILED_NOTIFY = 0x0000, SMSG_RESISTLOG = 0x0000, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x0000, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x15B0, SMSG_RESURRECT_REQUEST = 0x0000, SMSG_RESYNC_RUNES = 0x0000, SMSG_RWHOIS = 0x0000, @@ -985,7 +990,7 @@ enum Opcodes SMSG_SEND_MAIL_RESULT = 0x0000, SMSG_SEND_UNLEARN_SPELLS = 0x4E25, SMSG_SERVERTIME = 0x0000, - SMSG_SERVER_FIRST_ACHIEVEMENT = 0x0000, + SMSG_SERVER_FIRST_ACHIEVEMENT = 0x6424, SMSG_SERVER_MESSAGE = 0x6C04, SMSG_SET_FACTION_ATWAR = 0x0000, SMSG_SET_FACTION_STANDING = 0x0126, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1d648fec6c9..7495a57f399 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -921,6 +921,7 @@ class WorldSession void HandleRemoveGlyph(WorldPacket& recv_data); void HandleCharCustomize(WorldPacket& recv_data); void HandleQueryInspectAchievements(WorldPacket& recv_data); + void HandleGuildAchievementProgressQuery(WorldPacket& recvData); void HandleEquipmentSetSave(WorldPacket& recv_data); void HandleEquipmentSetDelete(WorldPacket& recv_data); void HandleEquipmentSetUse(WorldPacket& recv_data); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index a9c53f3a817..968a5b850e2 100755 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -1028,7 +1028,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) // Sleep this Network thread for uint32 sleepTime = sWorld->getIntConfig(CONFIG_SESSION_ADD_DELAY); - ACE_OS::sleep(ACE_Time_Value (0, sleepTime)); + ACE_OS::sleep(ACE_Time_Value(0, sleepTime)); sWorld->AddSession(m_Session); return 0; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 54b3ae310e2..76cae551bbd 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2602,14 +2602,14 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA if (unit->GetTypeId() == TYPEID_PLAYER) { unit->ToPlayer()->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, m_spellInfo->Id); - unit->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id, 0, m_caster); - unit->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, m_spellInfo->Id); + unit->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id, 0, m_caster); + unit->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, m_spellInfo->Id); } if (m_caster->GetTypeId() == TYPEID_PLAYER) { m_caster->ToPlayer()->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_CASTER, m_spellInfo->Id); - m_caster->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, m_spellInfo->Id, 0, unit); + m_caster->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, m_spellInfo->Id, 0, unit); } if (m_caster != unit) @@ -3251,10 +3251,10 @@ void Spell::cast(bool skipCheck) if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_ITEM) && m_CastItem) { m_caster->ToPlayer()->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_ITEM, m_CastItem->GetEntry()); - m_caster->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, m_CastItem->GetEntry()); + m_caster->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, m_CastItem->GetEntry()); } - m_caster->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, m_spellInfo->Id); + m_caster->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, m_spellInfo->Id); } if (!(_triggeredCastFlags & TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)) diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index a8294dc9ddb..82c692ce39e 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -62,7 +62,7 @@ public: if (target) target->GetAchievementMgr().Reset(); else - AchievementMgr::DeleteFromDB(GUID_LOPART(targetGuid)); + AchievementMgr::DeleteFromDB(GUID_LOPART(targetGuid)); return true; } diff --git a/src/server/shared/DataStores/DBCStore.h b/src/server/shared/DataStores/DBCStore.h index 589d331f22d..f8a983d22f3 100755 --- a/src/server/shared/DataStores/DBCStore.h +++ b/src/server/shared/DataStores/DBCStore.h @@ -41,7 +41,7 @@ struct SqlDbc for (uint32 i = 0; i< sqlTableName.size(); ++i) { if (isalpha(sqlTableName[i])) - sqlTableName[i] = tolower(sqlTableName[i]); + sqlTableName[i] = char(tolower(sqlTableName[i])); else if (sqlTableName[i] == '.') sqlTableName[i] = '_'; } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 27bf92ad846..3bd398d040e 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -228,6 +228,14 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_UPD_GUILD_RANK_BANK_TIME4, "UPDATE guild_member SET BankResetTimeTab4 = 0 WHERE guildid = ? AND rank = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_UPD_GUILD_RANK_BANK_TIME5, "UPDATE guild_member SET BankResetTimeTab5 = 0 WHERE guildid = ? AND rank = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_CHAR_DATA_FOR_GUILD, "SELECT name, level, class, zone, account FROM characters WHERE guid = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_DEL_GUILD_ACHIEVEMENT, "DELETE FROM guild_achievement WHERE guildId = ? AND achievement = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_INS_GUILD_ACHIEVEMENT, "INSERT INTO guild_achievement (guildId, achievement, date, guids) VALUES (?, ?, ?, ?)", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_DEL_GUILD_ACHIEVEMENT_CRITERIA, "DELETE FROM guild_achievement_progress WHERE guildId = ? AND criteria = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_INS_GUILD_ACHIEVEMENT_CRITERIA, "INSERT INTO guild_achievement_progress (guildId, criteria, counter, date, completedGuid) VALUES (?, ?, ?, ?, ?)", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_DEL_ALL_GUILD_ACHIEVEMENTS, "DELETE FROM guild_achievement WHERE guildId = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_DEL_ALL_GUILD_ACHIEVEMENT_CRITERIA, "DELETE FROM guild_achievement_progress WHERE guildId = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_SEL_GUILD_ACHIEVEMENT, "SELECT achievement, date, guids FROM guild_achievement WHERE guildId = ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA, "SELECT criteria, counter, date, completedGuid FROM guild_achievement_progress WHERE guildId = ?", CONNECTION_SYNCH) // Chat channel handling PREPARE_STATEMENT(CHAR_SEL_CHANNEL, "SELECT announce, ownership, password, bannedList FROM channels WHERE name = ? AND team = ?", CONNECTION_SYNCH) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 08265c455d6..adaa4acf7c5 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -222,6 +222,14 @@ enum CharacterDatabaseStatements CHAR_UPD_GUILD_RANK_BANK_TIME4, CHAR_UPD_GUILD_RANK_BANK_TIME5, CHAR_SEL_CHAR_DATA_FOR_GUILD, + CHAR_DEL_GUILD_ACHIEVEMENT, + CHAR_INS_GUILD_ACHIEVEMENT, + CHAR_DEL_GUILD_ACHIEVEMENT_CRITERIA, + CHAR_INS_GUILD_ACHIEVEMENT_CRITERIA, + CHAR_DEL_ALL_GUILD_ACHIEVEMENTS, + CHAR_DEL_ALL_GUILD_ACHIEVEMENT_CRITERIA, + CHAR_SEL_GUILD_ACHIEVEMENT, + CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA, CHAR_SEL_CHANNEL, CHAR_INS_CHANNEL, diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 27d5e78bac5..b78d78c69f2 100755 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -234,7 +234,7 @@ class ByteBuffer if (!bit) byte = 0; else - byte = ReadUInt8() ^ bit; + byte = uint8(ReadUInt8() ^ bit); } void WriteByteMask(uint8 b) -- cgit v1.2.3 From 27ea130b55dd3d16092a3d58f2093b99abc0a46b Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 14 Jul 2012 23:39:12 +0200 Subject: Core/Movement * Updated movement flags * Cleaned up MovementStatusElements enum * Updated and enabled MSG_MOVE_START_FORWARD --- src/server/game/Entities/Object/Object.cpp | 15 +- src/server/game/Entities/Object/Object.h | 4 +- src/server/game/Entities/Player/Player.cpp | 5 +- src/server/game/Entities/Transport/Transport.cpp | 3 +- src/server/game/Entities/Unit/Unit.cpp | 11 +- src/server/game/Entities/Unit/Unit.h | 43 +- src/server/game/Entities/Vehicle/Vehicle.cpp | 2 - src/server/game/Handlers/MovementHandler.cpp | 707 ++++---- src/server/game/Movement/MovementStructures.h | 1870 ++++++++++---------- src/server/game/Movement/Spline/MoveSplineInit.cpp | 6 +- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/WorldSession.cpp | 2 - .../ScarletMonastery/boss_headless_horseman.cpp | 4 +- .../SunwellPlateau/boss_kiljaeden.cpp | 4 +- .../TrialOfTheChampion/boss_grand_champions.cpp | 16 +- 15 files changed, 1404 insertions(+), 1290 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d9d8c3c461a..6894928b551 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -47,6 +47,7 @@ #include "OutdoorPvPMgr.h" #include "MovementPacketBuilder.h" #include "DynamicTree.h" +#include "Unit.h" uint32 GuidHigh2TypeId(uint32 guid_hi) { @@ -331,13 +332,13 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(0); data->WriteBit(!((movementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (movementFlagsExtra & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))); // Has pitch - data->WriteBit(movementFlags & MOVEMENTFLAG_SPLINE_ENABLED); // Has spline data + data->WriteBit(self->IsSplineEnabled()); // Has spline data data->WriteBit(movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_TURNING);// Has fall data data->WriteBit(!(movementFlags & MOVEMENTFLAG_SPLINE_ELEVATION)); // Has spline elevation data->WriteBit(guid[5]); - data->WriteBit(movementFlags & MOVEMENTFLAG_ONTRANSPORT); // Has transport data + data->WriteBit(self->m_movementInfo.t_guid); // Has transport data data->WriteBit(0); // Is missing time - if (movementFlags & MOVEMENTFLAG_ONTRANSPORT) + if (self->m_movementInfo.t_guid) { ObjectGuid transGuid = self->m_movementInfo.t_guid; @@ -354,7 +355,7 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const } data->WriteBit(guid[4]); - if (movementFlags & MOVEMENTFLAG_SPLINE_ENABLED) + if (self->IsSplineEnabled()) { data->WriteBit(1); // Has extended spline data Movement::PacketBuilder::WriteCreateBits(*self->movespline, *data); @@ -440,12 +441,12 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const if (movementFlags & MOVEMENTFLAG_SPLINE_ELEVATION) *data << float(self->m_movementInfo.splineElevation); - if (movementFlags & MOVEMENTFLAG_SPLINE_ENABLED) + if (self->IsSplineEnabled()) Movement::PacketBuilder::WriteCreateData(*self->movespline, *data); *data << float(self->GetPositionZMinusOffset()); data->WriteByteSeq(guid[5]); - if (movementFlags & MOVEMENTFLAG_ONTRANSPORT) + if (self->m_movementInfo.t_guid) { ObjectGuid transGuid = self->m_movementInfo.t_guid; @@ -1298,7 +1299,7 @@ void MovementInfo::OutDebug() sLog->outString("flags2 %u", flags2); sLog->outString("time %u current time " UI64FMTD "", flags2, uint64(::time(NULL))); sLog->outString("position: `%s`", pos.ToString().c_str()); - if (flags & MOVEMENTFLAG_ONTRANSPORT) + if (t_guid) { sLog->outString("TRANSPORT:"); sLog->outString("guid: " UI64FMTD, t_guid); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 01ad11ba2df..8e1677991f4 100755 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -529,16 +529,16 @@ struct MovementInfo // transport uint64 t_guid; Position t_pos; + int8 t_seat; uint32 t_time; uint32 t_time2; uint32 t_time3; - int8 t_seat; // swimming/flying float pitch; // falling uint32 fallTime; // jumping - float j_zspeed, j_sinAngle, j_cosAngle, j_xyspeed; + float j_zspeed, j_cosAngle, j_sinAngle, j_xyspeed; // spline float splineElevation; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e5df31734a4..88f2170fdfb 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2176,15 +2176,14 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (m_transport) { - if (options & TELE_TO_NOT_LEAVE_TRANSPORT) - AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); - else + if (!(options & TELE_TO_NOT_LEAVE_TRANSPORT)) { m_transport->RemovePassenger(this); m_transport = NULL; m_movementInfo.t_pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f); m_movementInfo.t_time = 0; m_movementInfo.t_seat = -1; + m_movementInfo.t_guid = 0; } } diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index ef3e1331a4c..e44f67f128d 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -642,8 +642,7 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, } creature->SetTransport(this); - creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); - creature->m_movementInfo.guid = GetGUID(); + creature->m_movementInfo.t_guid = GetGUID(); creature->m_movementInfo.t_pos.Relocate(x, y, z, o); if (anim) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2435a403408..19a8ab32ac1 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -396,7 +396,7 @@ void Unit::UpdateSplineMovement(uint32 t_diff) m_movesplineTimer.Reset(POSITION_UPDATE_DELAY); Movement::Location loc = movespline->ComputePosition(); - if (HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (GetTransGUID()) { Position& pos = m_movementInfo.t_pos; pos.m_positionX = loc.x; @@ -420,7 +420,7 @@ void Unit::UpdateSplineMovement(uint32 t_diff) void Unit::DisableSpline() { - m_movementInfo.RemoveMovementFlag(MovementFlags(MOVEMENTFLAG_SPLINE_ENABLED|MOVEMENTFLAG_FORWARD)); + m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); movespline->_Interrupt(); } @@ -17644,7 +17644,7 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const *data << GetPositionZMinusOffset(); *data << GetOrientation(); - bool onTransport = GetUnitMovementFlags() & MOVEMENTFLAG_ONTRANSPORT; + bool onTransport = m_movementInfo.t_guid != 0; bool hasInterpolatedMovement = m_movementInfo.flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT; bool time3 = false; bool swimming = ((GetUnitMovementFlags() & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) @@ -18180,3 +18180,8 @@ void Unit::SendMovementCanFlyChange() BuildMovementPacket(&data); SendMessageToSet(&data, false); } + +bool Unit::IsSplineEnabled() const +{ + return !movespline->Finalized(); +} diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 6d188fe3593..7471ae603f6 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -675,28 +675,26 @@ enum MovementFlags MOVEMENTFLAG_PITCH_UP = 0x00000040, MOVEMENTFLAG_PITCH_DOWN = 0x00000080, MOVEMENTFLAG_WALKING = 0x00000100, // Walking - MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures - MOVEMENTFLAG_DISABLE_GRAVITY = 0x00000400, // Former MOVEMENTFLAG_LEVITATING. This is used when walking is not possible. - MOVEMENTFLAG_ROOT = 0x00000800, // Must not be set along with MOVEMENTFLAG_MASK_MOVING - MOVEMENTFLAG_FALLING = 0x00001000, // damage dealt on that type of falling - MOVEMENTFLAG_FALLING_FAR = 0x00002000, - MOVEMENTFLAG_PENDING_STOP = 0x00004000, - MOVEMENTFLAG_PENDING_STRAFE_STOP = 0x00008000, - MOVEMENTFLAG_PENDING_FORWARD = 0x00010000, - MOVEMENTFLAG_PENDING_BACKWARD = 0x00020000, - MOVEMENTFLAG_PENDING_STRAFE_LEFT = 0x00040000, - MOVEMENTFLAG_PENDING_STRAFE_RIGHT = 0x00080000, - MOVEMENTFLAG_PENDING_ROOT = 0x00100000, - MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also - MOVEMENTFLAG_ASCENDING = 0x00400000, // press "space" when flying - MOVEMENTFLAG_DESCENDING = 0x00800000, - MOVEMENTFLAG_CAN_FLY = 0x01000000, // Appears when unit can fly AND also walk - MOVEMENTFLAG_FLYING = 0x02000000, // unit is actually flying. pretty sure this is only used for players. creatures use disable_gravity - MOVEMENTFLAG_SPLINE_ELEVATION = 0x04000000, // used for flight paths - MOVEMENTFLAG_SPLINE_ENABLED = 0x08000000, // used for flight paths - MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water - MOVEMENTFLAG_FALLING_SLOW = 0x20000000, // active rogue safe fall spell (passive) - MOVEMENTFLAG_HOVER = 0x40000000, // hover, cannot jump + MOVEMENTFLAG_DISABLE_GRAVITY = 0x00000200, // Former MOVEMENTFLAG_LEVITATING. This is used when walking is not possible. + MOVEMENTFLAG_ROOT = 0x00000400, // Must not be set along with MOVEMENTFLAG_MASK_MOVING + MOVEMENTFLAG_FALLING = 0x00000800, // damage dealt on that type of falling + MOVEMENTFLAG_FALLING_FAR = 0x00001000, + MOVEMENTFLAG_PENDING_STOP = 0x00002000, + MOVEMENTFLAG_PENDING_STRAFE_STOP = 0x00004000, + MOVEMENTFLAG_PENDING_FORWARD = 0x00008000, + MOVEMENTFLAG_PENDING_BACKWARD = 0x00010000, + MOVEMENTFLAG_PENDING_STRAFE_LEFT = 0x00020000, + MOVEMENTFLAG_PENDING_STRAFE_RIGHT = 0x00040000, + MOVEMENTFLAG_PENDING_ROOT = 0x00080000, + MOVEMENTFLAG_SWIMMING = 0x00100000, // appears with fly flag also + MOVEMENTFLAG_ASCENDING = 0x00200000, // press "space" when flying + MOVEMENTFLAG_DESCENDING = 0x00400000, + MOVEMENTFLAG_CAN_FLY = 0x00800000, // Appears when unit can fly AND also walk + MOVEMENTFLAG_FLYING = 0x01000000, // unit is actually flying. pretty sure this is only used for players. creatures use disable_gravity + MOVEMENTFLAG_SPLINE_ELEVATION = 0x02000000, // used for flight paths + MOVEMENTFLAG_WATERWALKING = 0x04000000, // prevent unit from falling through water + MOVEMENTFLAG_FALLING_SLOW = 0x08000000, // active rogue safe fall spell (passive) + MOVEMENTFLAG_HOVER = 0x10000000, // hover, cannot jump // TODO: Check if PITCH_UP and PITCH_DOWN really belong here.. MOVEMENTFLAG_MASK_MOVING = @@ -2103,6 +2101,7 @@ class Unit : public WorldObject uint16 HasExtraUnitMovementFlag(uint16 f) const { return m_movementInfo.flags2 & f; } uint16 GetExtraUnitMovementFlags() const { return m_movementInfo.flags2; } void SetExtraUnitMovementFlags(uint16 f) { m_movementInfo.flags2 = f; } + bool IsSplineEnabled() const; float GetPositionZMinusOffset() const { diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index eb50f3fe229..3d36f6ccda5 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -342,7 +342,6 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_ALLOW_TURNING)) unit->AddUnitState(UNIT_STATE_ONVEHICLE); - unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); VehicleSeatEntry const* veSeat = seat->second.SeatInfo; unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY; @@ -419,7 +418,6 @@ void Vehicle::RemovePassenger(Unit* unit) if (_me->IsInWorld()) { - unit->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); unit->m_movementInfo.t_pos.Relocate(0, 0, 0, 0); unit->m_movementInfo.t_time = 0; unit->m_movementInfo.t_seat = 0; diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 57afc614545..df28e01d5c7 100755 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -277,7 +277,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) } /* handle special cases */ - if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT) + if (movementInfo.t_guid) { // transports size limited // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) @@ -339,7 +339,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) { GameObject* go = mover->GetMap()->GetGameObject(movementInfo.t_guid); if (!go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT) - movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT; + movementInfo.t_guid = 0; } } else if (plrMover && plrMover->GetTransport()) // if we were on a transport, leave @@ -595,167 +595,205 @@ void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data) _player->SummonIfPossible(agree); } -void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) +void WorldSession::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) { - bool HaveTransportData = false, - HaveTransportTime2 = false, - HaveTransportTime3 = false, - HavePitch = false, - HaveFallData = false, - HaveFallDirection = false, - HaveSplineElevation = false, - HaveSpline = false; - - MovementStatusElements *sequence = GetMovementStatusElementsSequence(data.GetOpcode()); - if (sequence == NULL) - return; - - ObjectGuid guid; - ObjectGuid tguid; - - for (uint32 i = 0; i < MSE_COUNT; i++) - { - MovementStatusElements element = sequence[i]; - - if (element >= MSEGuidByte0 && element <= MSEGuidByte7) - { - guid[element - MSEGuidByte0] = data.ReadBit(); - continue; - } - - if (element >= MSETransportGuidByte0 && - element <= MSETransportGuidByte7) - { - if (HaveTransportData) - tguid[element - MSETransportGuidByte0] = data.ReadBit(); - continue; - } - - if (element >= MSEGuidByte0_2 && element <= MSEGuidByte7_2) - { - data.ReadByteSeq(guid[element - MSEGuidByte0_2]); - continue; - } - - if (element >= MSETransportGuidByte0_2 && - element <= MSETransportGuidByte7_2) - { - if (HaveTransportData) - data.ReadByteSeq(tguid[element - MSETransportGuidByte0_2]); - continue; - } - - switch (element) - { - case MSEFlags: - mi->flags = data.ReadBits(30); - break; - case MSEFlags2: - mi->flags2 = data.ReadBits(12); - break; - case MSETimestamp: - data >> mi->time; - break; - case MSEHavePitch: - HavePitch = data.ReadBit(); - break; - case MSEHaveFallData: - HaveFallData = data.ReadBit(); - break; - case MSEHaveFallDirection: - if (HaveFallData) - HaveFallDirection = data.ReadBit(); - break; - case MSEHaveTransportData: - HaveTransportData = data.ReadBit(); - break; - case MSETransportHaveTime2: - if (HaveTransportData) - HaveTransportTime2 = data.ReadBit(); - break; - case MSETransportHaveTime3: - if (HaveTransportData) - HaveTransportTime3 = data.ReadBit(); - break; - case MSEHaveSpline: - HaveSpline = data.ReadBit(); - break; - case MSEHaveSplineElev: - HaveSplineElevation = data.ReadBit(); - break; - case MSEPositionX: - data >> mi->pos.PositionXYZStream(); - break; - case MSEPositionY: - case MSEPositionZ: - break; // assume they always go as vector of 3 - case MSEPositionO: - data >> mi->pos.m_orientation; - break; - case MSEPitch: - if (HavePitch) - data >> mi->pitch; - break; - case MSEFallTime: - if (HaveFallData) - data >> mi->fallTime; - break; - case MSESplineElev: - if (HaveSplineElevation) - data >> mi->splineElevation; - break; - case MSEFallHorizontalSpeed: - if (HaveFallDirection) - data >> mi->j_xyspeed; - break; - case MSEFallVerticalSpeed: - if (HaveFallData) - data >> mi->j_zspeed; - break; - case MSEFallCosAngle: - if (HaveFallDirection) - data >> mi->j_cosAngle; - break; - case MSEFallSinAngle: - if (HaveFallDirection) - data >> mi->j_sinAngle; - break; - case MSETransportSeat: - if (HaveTransportData) - data >> mi->t_seat; - break; - case MSETransportPositionO: - if (HaveTransportData) - data >> mi->t_pos.m_orientation; - break; - case MSETransportPositionX: - if (HaveTransportData) - data >> mi->t_pos.PositionXYZStream(); - break; - case MSETransportPositionY: - case MSETransportPositionZ: - break; // assume they always go as vector of 3 - case MSETransportTime: - if (HaveTransportData) - data >> mi->t_time; - break; - case MSETransportTime2: - if (HaveTransportTime2) - data >> mi->t_time2; - break; - case MSETransportTime3: - if (HaveTransportTime3) - data >> mi->t_time3; - break; - default: - WPError(false, "Incorrect sequence element detected at ReadMovementInfo"); - } - } - - mi->guid = guid; - mi->t_guid = tguid; - - if (HaveTransportData && mi->pos.m_positionX != mi->t_pos.m_positionX) + bool hasMovementFlags = false; + bool hasMovementFlags2 = false; + bool hasTimestamp = false; + bool hasOrientation = false; + bool hasTransportData = false; + bool hasTransportTime2 = false; + bool hasTransportTime3 = false; + bool hasPitch = false; + bool hasFallData = false; + bool hasFallDirection = false; + bool hasSplineElevation = false; + bool hasSpline = false; + + MovementStatusElements* sequence = GetMovementStatusElementsSequence(data.GetOpcode()); + if (sequence == NULL) + { + sLog->outError("WorldSession::ReadMovementInfo: No movement sequence found for opcode 0x%04X", uint32(data.GetOpcode())); + return; + } + + ObjectGuid guid; + ObjectGuid tguid; + + for (uint32 i = 0; i < MSE_COUNT; ++i) + { + MovementStatusElements element = sequence[i]; + if (element == MSEEnd) + break; + + if (element >= MSEHasGuidByte0 && element <= MSEHasGuidByte7) + { + guid[element - MSEHasGuidByte0] = data.ReadBit(); + continue; + } + + if (element >= MSEHasTransportGuidByte0 && + element <= MSEHasTransportGuidByte7) + { + if (hasTransportData) + tguid[element - MSEHasTransportGuidByte0] = data.ReadBit(); + continue; + } + + if (element >= MSEGuidByte0 && element <= MSEGuidByte7) + { + data.ReadByteSeq(guid[element - MSEGuidByte0]); + continue; + } + + if (element >= MSETransportGuidByte0 && + element <= MSETransportGuidByte7) + { + if (hasTransportData) + data.ReadByteSeq(tguid[element - MSETransportGuidByte0]); + continue; + } + + switch (element) + { + case MSEHasMovementFlags: + hasMovementFlags = !data.ReadBit(); + break; + case MSEHasMovementFlags2: + hasMovementFlags2 = !data.ReadBit(); + break; + case MSEHasTimestamp: + hasTimestamp = !data.ReadBit(); + break; + case MSEHasOrientation: + hasOrientation = !data.ReadBit(); + break; + case MSEHasTransportData: + hasTransportData = data.ReadBit(); + break; + case MSEHasTransportTime2: + if (hasTransportData) + hasTransportTime2 = data.ReadBit(); + break; + case MSEHasTransportTime3: + if (hasTransportData) + hasTransportTime3 = data.ReadBit(); + break; + case MSEHasPitch: + hasPitch = !data.ReadBit(); + break; + case MSEHasFallData: + hasFallData = data.ReadBit(); + break; + case MSEHasFallDirection: + if (hasFallData) + hasFallDirection = data.ReadBit(); + break; + case MSEHasSplineElev: + hasSplineElevation = !data.ReadBit(); + break; + case MSEHasSpline: + hasSpline = data.ReadBit(); + break; + case MSEMovementFlags: + if (hasMovementFlags) + mi->flags = data.ReadBits(30); + break; + case MSEMovementFlags2: + if (hasMovementFlags2) + mi->flags2 = data.ReadBits(12); + break; + case MSETimestamp: + if (hasTimestamp) + data >> mi->time; + break; + case MSEPositionX: + data >> mi->pos.m_positionX; + break; + case MSEPositionY: + data >> mi->pos.m_positionY; + break; + case MSEPositionZ: + data >> mi->pos.m_positionZ; + break; + case MSEOrientation: + if (hasOrientation) + data >> mi->pos.m_orientation; + break; + case MSETransportPositionX: + if (hasTransportData) + data >> mi->t_pos.m_positionX; + break; + case MSETransportPositionY: + if (hasTransportData) + data >> mi->t_pos.m_positionY; + break; + case MSETransportPositionZ: + if (hasTransportData) + data >> mi->t_pos.m_positionZ; + break; + case MSETransportOrientation: + if (hasTransportData) + data >> mi->t_pos.m_orientation; + break; + case MSETransportSeat: + if (hasTransportData) + data >> mi->t_seat; + break; + case MSETransportTime: + if (hasTransportData) + data >> mi->t_time; + break; + case MSETransportTime2: + if (hasTransportData && hasTransportTime2) + data >> mi->t_time2; + break; + case MSETransportTime3: + if (hasTransportData && hasTransportTime3) + data >> mi->t_time3; + break; + case MSEPitch: + if (hasPitch) + data >> mi->pitch; + break; + case MSEFallTime: + if (hasFallData) + data >> mi->fallTime; + break; + case MSEFallVerticalSpeed: + if (hasFallData) + data >> mi->j_zspeed; + break; + case MSEFallCosAngle: + if (hasFallDirection) + data >> mi->j_cosAngle; + break; + case MSEFallSinAngle: + if (hasFallDirection) + data >> mi->j_sinAngle; + break; + case MSEFallHorizontalSpeed: + if (hasFallDirection) + data >> mi->j_xyspeed; + break; + case MSESplineElev: + if (hasSplineElevation) + data >> mi->splineElevation; + break; + case MSEZeroBit: + case MSEOneBit: + data.ReadBit(); + break; + default: + ASSERT(false && "Incorrect sequence element detected at ReadMovementInfo"); + break; + } + } + + mi->guid = guid; + mi->t_guid = tguid; + + if (hasTransportData && mi->pos.m_positionX != mi->t_pos.m_positionX) if (GetPlayer()->GetTransport()) GetPlayer()->GetTransport()->UpdatePosition(mi); @@ -834,157 +872,196 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi) { - bool HaveTransportData = mi->HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT), - HaveTransportTime2 = (mi->flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT) != 0, - HaveTransportTime3 = false, - HavePitch = (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))) - || (mi->flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING), - HaveFallData = mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_TURNING), - HaveFallDirection = mi->HasMovementFlag(MOVEMENTFLAG_FALLING), - HaveSplineElevation = mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION), - HaveSpline = false; - - MovementStatusElements *sequence = GetMovementStatusElementsSequence(data.GetOpcode()); - if(!sequence) - return; - uint8 *guid = (uint8 *)&mi->guid; - uint8 *tguid = (uint8 *)&mi->t_guid; - for(uint32 i=0; i < MSE_COUNT; i++) - { - MovementStatusElements element = sequence[i]; - - if (element >= MSEGuidByte0 && element <= MSEGuidByte7) - { - data.WriteBit(guid[element - MSEGuidByte0]); - continue; - } - - if (element >= MSETransportGuidByte0 && - element <= MSETransportGuidByte7) - { - if (HaveTransportData) - data.WriteBit(tguid[element - MSETransportGuidByte0]); - continue; - } - - if (element >= MSEGuidByte0_2 && element <= MSEGuidByte7_2) - { - data.WriteByteSeq(guid[element - MSEGuidByte0_2]); - continue; - } - - if (element >= MSETransportGuidByte0_2 && - element <= MSETransportGuidByte7_2) - { - if (HaveTransportData) - data.WriteByteSeq(tguid[element - MSETransportGuidByte0_2]); - continue; - } - - switch (element) - { - case MSEFlags: - data.WriteBits(mi->flags, 30); - break; - case MSEFlags2: - data.WriteBits(mi->flags2, 12); - break; - case MSETimestamp: - data << mi->time; - break; - case MSEHavePitch: - data.WriteBit(HavePitch); - break; - case MSEHaveFallData: - data.WriteBit(HaveFallData); - break; - case MSEHaveFallDirection: - if (HaveFallData) - data.WriteBit(HaveFallDirection); - break; - case MSEHaveTransportData: - data.WriteBit(HaveTransportData); - break; - case MSETransportHaveTime2: - if (HaveTransportData) - data.WriteBit(HaveTransportTime2); - break; - case MSETransportHaveTime3: - if (HaveTransportData) - data.WriteBit(HaveTransportTime3); - break; - case MSEHaveSpline: - data.WriteBit(HaveSpline); - break; - case MSEHaveSplineElev: - data.WriteBit(HaveSplineElevation); - break; - case MSEPositionX: - data << mi->pos.PositionXYZStream(); - break; - case MSEPositionY: - case MSEPositionZ: - break; // assume they always go as vector of 3 - case MSEPositionO: - data << mi->pos.m_orientation; - break; - case MSEPitch: - if (HavePitch) - data << mi->pitch; - break; - case MSEFallTime: - if (HaveFallData) - data << mi->fallTime; - break; - case MSESplineElev: - if (HaveSplineElevation) - data << mi->splineElevation; - break; - case MSEFallHorizontalSpeed: - if (HaveFallDirection) - data << mi->j_xyspeed; - break; - case MSEFallVerticalSpeed: - if (HaveFallData) - data << mi->j_zspeed; - break; - case MSEFallCosAngle: - if (HaveFallDirection) - data << mi->j_cosAngle; - break; - case MSEFallSinAngle: - if (HaveFallDirection) - data << mi->j_sinAngle; - break; - case MSETransportSeat: - if (HaveTransportData) - data << mi->t_seat; - break; - case MSETransportPositionO: - if (HaveTransportData) - data << mi->t_pos.m_orientation; - break; - case MSETransportPositionX: - if (HaveTransportData) - data << mi->t_pos.PositionXYZStream(); - break; - case MSETransportPositionY: - case MSETransportPositionZ: - break; // assume they always go as vector of 3 - case MSETransportTime: - if (HaveTransportData) - data << mi->t_time; - break; - case MSETransportTime2: - if (HaveTransportTime2) - data << mi->t_time2; - break; - case MSETransportTime3: - if (HaveTransportTime3) - data << mi->t_time3; - break; - default: - WPError(false, "Incorrect sequence element detected at ReadMovementInfo"); - } - } + bool hasMovementFlags = mi->GetMovementFlags() != 0; + bool hasMovementFlags2 = mi->GetExtraMovementFlags() != 0; + bool hasTimestamp = mi->time != 0; + bool hasOrientation = !G3D::fuzzyEq(mi->pos.GetOrientation(), 0.0f); + bool hasTransportData = mi->t_guid != 0; + bool hasTransportTime2 = mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT); + bool hasTransportTime3 = false; + bool hasPitch = mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || mi->HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); + bool hasFallData = mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_TURNING); + bool hasFallDirection = mi->HasMovementFlag(MOVEMENTFLAG_FALLING); + bool hasSplineElevation = mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION); + bool hasSpline = false; + + MovementStatusElements* sequence = GetMovementStatusElementsSequence(data.GetOpcode()); + if (!sequence) + { + sLog->outError("WorldSession::WriteMovementInfo: No movement sequence found for opcode 0x%04X", uint32(data.GetOpcode())); + return; + } + + ObjectGuid guid = mi->guid; + ObjectGuid tguid = mi->t_guid; + + for(uint32 i = 0; i < MSE_COUNT; ++i) + { + MovementStatusElements element = sequence[i]; + + if (element >= MSEHasGuidByte0 && element <= MSEHasGuidByte7) + { + data.WriteBit(guid[element - MSEHasGuidByte0]); + continue; + } + + if (element >= MSEHasTransportGuidByte0 && + element <= MSEHasTransportGuidByte7) + { + if (hasTransportData) + data.WriteBit(tguid[element - MSEHasTransportGuidByte0]); + continue; + } + + if (element >= MSEGuidByte0 && element <= MSEGuidByte7) + { + data.WriteByteSeq(guid[element - MSEGuidByte0]); + continue; + } + + if (element >= MSETransportGuidByte0 && + element <= MSETransportGuidByte7) + { + if (hasTransportData) + data.WriteByteSeq(tguid[element - MSETransportGuidByte0]); + continue; + } + + switch (element) + { + case MSEHasMovementFlags: + data.WriteBit(!hasMovementFlags); + break; + case MSEHasMovementFlags2: + data.WriteBit(!hasMovementFlags2); + break; + case MSEHasTimestamp: + data.WriteBit(!hasTimestamp); + break; + case MSEHasOrientation: + data.WriteBit(!hasOrientation); + break; + case MSEHasTransportData: + data.WriteBit(hasTransportData); + break; + case MSEHasTransportTime2: + if (hasTransportData) + data.WriteBit(hasTransportTime2); + break; + case MSEHasTransportTime3: + if (hasTransportData) + data.WriteBit(hasTransportTime3); + break; + case MSEHasPitch: + data.WriteBit(!hasPitch); + break; + case MSEHasFallData: + data.WriteBit(hasFallData); + break; + case MSEHasFallDirection: + if (hasFallData) + data.WriteBit(hasFallDirection); + break; + case MSEHasSplineElev: + data.WriteBit(!hasSplineElevation); + break; + case MSEHasSpline: + data.WriteBit(hasSpline); + break; + case MSEMovementFlags: + if (hasMovementFlags) + data.WriteBits(mi->flags, 30); + break; + case MSEMovementFlags2: + if (hasMovementFlags2) + data.WriteBits(mi->flags2, 12); + break; + case MSETimestamp: + if (hasTimestamp) + data << mi->time; + break; + case MSEPositionX: + data << mi->pos.m_positionX; + break; + case MSEPositionY: + data << mi->pos.m_positionY; + break; + case MSEPositionZ: + data << mi->pos.m_positionZ; + break; + case MSEOrientation: + if (hasOrientation) + data << mi->pos.m_orientation; + break; + case MSETransportPositionX: + if (hasTransportData) + data << mi->t_pos.m_positionX; + break; + case MSETransportPositionY: + if (hasTransportData) + data << mi->t_pos.m_positionY; + break; + case MSETransportPositionZ: + if (hasTransportData) + data << mi->t_pos.m_positionZ; + break; + case MSETransportOrientation: + if (hasTransportData) + data << mi->t_pos.m_orientation; + break; + case MSETransportSeat: + if (hasTransportData) + data << mi->t_seat; + break; + case MSETransportTime: + if (hasTransportData) + data << mi->t_time; + break; + case MSETransportTime2: + if (hasTransportData && hasTransportTime2) + data << mi->t_time2; + break; + case MSETransportTime3: + if (hasTransportData && hasTransportTime3) + data << mi->t_time3; + break; + case MSEPitch: + if (hasPitch) + data << mi->pitch; + break; + case MSEFallTime: + if (hasFallData) + data << mi->fallTime; + break; + case MSEFallVerticalSpeed: + if (hasFallData) + data << mi->j_zspeed; + break; + case MSEFallCosAngle: + if (hasFallDirection) + data << mi->j_cosAngle; + break; + case MSEFallSinAngle: + if (hasFallDirection) + data << mi->j_sinAngle; + break; + case MSEFallHorizontalSpeed: + if (hasFallDirection) + data << mi->j_xyspeed; + break; + case MSESplineElev: + if (hasSplineElevation) + data << mi->splineElevation; + break; + case MSEZeroBit: + data.WriteBit(0); + break; + case MSEOneBit: + data.WriteBit(1); + break; + default: + ASSERT(false && "Incorrect sequence element detected at ReadMovementInfo"); + break; + } + } } diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 84b6d79cbd5..87439bbedbc 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -21,10 +21,35 @@ enum MovementStatusElements { - MSEFlags, - MSEFlags2, - MSETimestamp, - MSEHavePitch, + MSEHasGuidByte0, + MSEHasGuidByte1, + MSEHasGuidByte2, + MSEHasGuidByte3, + MSEHasGuidByte4, + MSEHasGuidByte5, + MSEHasGuidByte6, + MSEHasGuidByte7, + MSEHasMovementFlags, + MSEHasMovementFlags2, + MSEHasTimestamp, + MSEHasOrientation, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasPitch, + MSEHasFallData, + MSEHasFallDirection, + MSEHasSplineElev, + MSEHasSpline, + MSEGuidByte0, MSEGuidByte1, MSEGuidByte2, @@ -33,11 +58,13 @@ enum MovementStatusElements MSEGuidByte5, MSEGuidByte6, MSEGuidByte7, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportHaveTime2, - MSETransportHaveTime3, + MSEMovementFlags, + MSEMovementFlags2, + MSETimestamp, + MSEPositionX, + MSEPositionY, + MSEPositionZ, + MSEOrientation, MSETransportGuidByte0, MSETransportGuidByte1, MSETransportGuidByte2, @@ -46,1326 +73,1337 @@ enum MovementStatusElements MSETransportGuidByte5, MSETransportGuidByte6, MSETransportGuidByte7, - MSEHaveSpline, - MSEHaveSplineElev, - MSEPositionX, - MSEPositionY, - MSEPositionZ, - MSEPositionO, - MSEGuidByte0_2, - MSEGuidByte1_2, - MSEGuidByte2_2, - MSEGuidByte3_2, - MSEGuidByte4_2, - MSEGuidByte5_2, - MSEGuidByte6_2, - MSEGuidByte7_2, - MSEPitch, - MSEFallTime, - MSETransportGuidByte0_2, - MSETransportGuidByte1_2, - MSETransportGuidByte2_2, - MSETransportGuidByte3_2, - MSETransportGuidByte4_2, - MSETransportGuidByte5_2, - MSETransportGuidByte6_2, - MSETransportGuidByte7_2, - MSESplineElev, - MSEFallHorizontalSpeed, - MSEFallVerticalSpeed, - MSEFallCosAngle, - MSEFallSinAngle, - MSETransportSeat, - MSETransportPositionO, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, + MSETransportOrientation, + MSETransportSeat, MSETransportTime, MSETransportTime2, MSETransportTime3, + MSEPitch, + MSEFallTime, + MSEFallVerticalSpeed, + MSEFallCosAngle, + MSEFallSinAngle, + MSEFallHorizontalSpeed, + MSESplineElev, + + // Special + MSEZeroBit, // writes bit value 1 or skips read bit + MSEOneBit, // writes bit value 0 or skips read bit + MSEEnd, // marks end of parsing MSE_COUNT }; + //4.2.2 MovementStatusElements PlayerMoveSequence[] = { - MSEHaveSplineElev, - MSEHaveTransportData, - MSEGuidByte5, - MSETransportGuidByte2, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte0, - MSETransportHaveTime2, - MSETransportGuidByte7, - MSETransportHaveTime3, - MSETransportGuidByte6, - MSETransportGuidByte5, - MSEGuidByte7, - MSEGuidByte3, - MSEGuidByte1, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasGuidByte5, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte0, + MSEHasTransportTime2, + MSEHasTransportGuidByte7, + MSEHasTransportTime3, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte5, + MSEHasGuidByte7, + MSEHasGuidByte3, + MSEHasGuidByte1, + MSEHasGuidByte4, + MSEHasGuidByte0, + MSEMovementFlags, + MSEHasPitch, + MSEHasGuidByte2, + MSEMovementFlags2, + MSEHasGuidByte6, + MSEHasFallData, + MSEHasFallDirection, + MSEHasSpline, MSEGuidByte4, MSEGuidByte0, - MSEFlags, - MSEHavePitch, - MSEGuidByte2, - MSEFlags2, + MSEOrientation, MSEGuidByte6, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveSpline, - MSEGuidByte4_2, - MSEGuidByte0_2, - MSEPositionO, - MSEGuidByte6_2, - MSEGuidByte7_2, + MSEGuidByte7, MSESplineElev, - MSETransportGuidByte4_2, - MSETransportGuidByte2_2, - MSETransportPositionO, + MSETransportGuidByte4, + MSETransportGuidByte2, + MSETransportOrientation, MSETransportTime, MSETransportSeat, - MSETransportGuidByte3_2, + MSETransportGuidByte3, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, - MSETransportGuidByte1_2, + MSETransportGuidByte1, MSETransportTime2, MSETransportTime3, - MSETransportGuidByte5_2, - MSETransportGuidByte0_2, - MSETransportGuidByte6_2, - MSETransportGuidByte7_2, - MSEGuidByte2_2, + MSETransportGuidByte5, + MSETransportGuidByte0, + MSETransportGuidByte6, + MSETransportGuidByte7, + MSEGuidByte2, MSETimestamp, - MSEGuidByte1_2, + MSEGuidByte1, MSEPitch, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEGuidByte5_2, - MSEGuidByte3_2, + MSEGuidByte5, + MSEGuidByte3, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, MSEFallVerticalSpeed, MSEFallTime, }; + //4.2.2 MovementStatusElements MovementFallLandSequence[] = { - MSEGuidByte4, - MSEGuidByte6, - MSEGuidByte3, - MSEHaveSpline, - MSEGuidByte2, - MSEFlags, - MSEGuidByte7, - MSEGuidByte1, - MSEFlags2, - MSEGuidByte5, - MSEGuidByte0, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHavePitch, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveSplineElev, - MSEPositionO, + MSEHasGuidByte4, + MSEHasGuidByte6, + MSEHasGuidByte3, + MSEHasSpline, + MSEHasGuidByte2, + MSEMovementFlags, + MSEHasGuidByte7, + MSEHasGuidByte1, + MSEMovementFlags2, + MSEHasGuidByte5, + MSEHasGuidByte0, + MSEHasFallData, + MSEHasFallDirection, + MSEHasPitch, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasSplineElev, + MSEOrientation, MSEPositionX, MSEPositionY, MSEPositionZ, MSETimestamp, - MSEGuidByte7_2, - MSEGuidByte2_2, + MSEGuidByte7, + MSEGuidByte2, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte0_2, + MSEGuidByte0, MSEPitch, - MSEGuidByte4_2, - MSEGuidByte6_2, - MSEGuidByte5_2, - MSEGuidByte3_2, + MSEGuidByte4, + MSEGuidByte6, + MSEGuidByte5, + MSEGuidByte3, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSESplineElev, - MSEGuidByte1_2, + MSEGuidByte1, }; + //4.2.2 MovementStatusElements MovementHeartBeatSequence[] = { - MSEFlags, - MSEHaveSpline, - MSEGuidByte0, - MSEGuidByte6, - MSEGuidByte1, - MSEGuidByte7, - MSEGuidByte2, - MSEGuidByte4, - MSEGuidByte3, - MSEFlags2, - MSEGuidByte5, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHavePitch, - MSEHaveFallData, - MSEHaveFallDirection, + MSEMovementFlags, + MSEHasSpline, + MSEHasGuidByte0, + MSEHasGuidByte6, + MSEHasGuidByte1, + MSEHasGuidByte7, + MSEHasGuidByte2, + MSEHasGuidByte4, + MSEHasGuidByte3, + MSEMovementFlags2, + MSEHasGuidByte5, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasPitch, + MSEHasFallData, + MSEHasFallDirection, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEPositionO, - MSEGuidByte7_2, - MSEGuidByte5_2, + MSEOrientation, + MSEGuidByte7, + MSEGuidByte5, MSESplineElev, - MSEGuidByte1_2, - MSEGuidByte6_2, - MSEGuidByte4_2, - MSEGuidByte3_2, + MSEGuidByte1, + MSEGuidByte6, + MSEGuidByte4, + MSEGuidByte3, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSEPitch, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte2_2, - MSEGuidByte0_2, + MSEGuidByte2, + MSEGuidByte0, }; + //4.2.2 MovementStatusElements MovementJumpSequence[] = { - MSEHaveSpline, - MSEGuidByte0, - MSEGuidByte1, - MSEGuidByte4, - MSEFlags, - MSEGuidByte2, - MSEGuidByte5, - MSEGuidByte3, - MSEFlags2, - MSEGuidByte7, - MSEGuidByte6, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHavePitch, - MSEPositionO, + MSEHasSpline, + MSEHasGuidByte0, + MSEHasGuidByte1, + MSEHasGuidByte4, + MSEMovementFlags, + MSEHasGuidByte2, + MSEHasGuidByte5, + MSEHasGuidByte3, + MSEMovementFlags2, + MSEHasGuidByte7, + MSEHasGuidByte6, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasFallData, + MSEHasFallDirection, + MSEHasPitch, + MSEOrientation, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, MSESplineElev, - MSEGuidByte0_2, - MSEGuidByte5_2, - MSEGuidByte3_2, + MSEGuidByte0, + MSEGuidByte5, + MSEGuidByte3, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte4_2, - MSEGuidByte1_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte4, + MSEGuidByte1, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte2_2, - MSEGuidByte6_2, - MSEGuidByte7_2, + MSEGuidByte2, + MSEGuidByte6, + MSEGuidByte7, MSEPitch, }; + //4.2.2 MovementStatusElements MovementSetFacingSequence[] = { - MSEFlags, - MSEGuidByte4, - MSEGuidByte2, - MSEHaveSpline, - MSEGuidByte3, - MSEGuidByte5, - MSEFlags2, - MSEGuidByte0, - MSEGuidByte7, - MSEGuidByte6, - MSEGuidByte1, - MSEHaveSplineElev, - MSEHavePitch, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEPositionO, + MSEMovementFlags, + MSEHasGuidByte4, + MSEHasGuidByte2, + MSEHasSpline, + MSEHasGuidByte3, + MSEHasGuidByte5, + MSEMovementFlags2, + MSEHasGuidByte0, + MSEHasGuidByte7, + MSEHasGuidByte6, + MSEHasGuidByte1, + MSEHasSplineElev, + MSEHasPitch, + MSEHasFallData, + MSEHasFallDirection, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEOrientation, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEGuidByte7_2, - MSEGuidByte5_2, + MSEGuidByte7, + MSEGuidByte5, MSESplineElev, - MSEGuidByte4_2, - MSEGuidByte1_2, - MSEGuidByte2_2, + MSEGuidByte4, + MSEGuidByte1, + MSEGuidByte2, MSEPitch, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte6_2, - MSEGuidByte0_2, + MSEGuidByte6, + MSEGuidByte0, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte3_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte3, }; + //4.2.2 MovementStatusElements MovementSetPitchSequence[] = { - MSEGuidByte1, - MSEGuidByte6, - MSEGuidByte7, - MSEGuidByte3, - MSEFlags, - MSEGuidByte5, - MSEGuidByte2, - MSEGuidByte0, - MSEHaveSpline, - MSEGuidByte4, - MSEFlags2, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHavePitch, - MSEHaveFallData, - MSEHaveFallDirection, + MSEHasGuidByte1, + MSEHasGuidByte6, + MSEHasGuidByte7, + MSEHasGuidByte3, + MSEMovementFlags, + MSEHasGuidByte5, + MSEHasGuidByte2, + MSEHasGuidByte0, + MSEHasSpline, + MSEHasGuidByte4, + MSEMovementFlags2, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasPitch, + MSEHasFallData, + MSEHasFallDirection, MSEPositionX, MSEPositionY, MSEPositionZ, MSETimestamp, - MSEPositionO, - MSEGuidByte1_2, - MSEGuidByte4_2, + MSEOrientation, + MSEGuidByte1, + MSEGuidByte4, MSESplineElev, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSEPitch, - MSEGuidByte5_2, + MSEGuidByte5, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte0_2, - MSEGuidByte3_2, - MSEGuidByte6_2, - MSEGuidByte7_2, - MSEGuidByte2_2, + MSEGuidByte0, + MSEGuidByte3, + MSEGuidByte6, + MSEGuidByte7, + MSEGuidByte2, }; + //4.2.2 MovementStatusElements MovementStartBackwardSequence[] = { - MSEGuidByte5, - MSEFlags2, - MSEGuidByte2, - MSEGuidByte7, - MSEHaveSpline, - MSEFlags, - MSEGuidByte1, - MSEGuidByte3, - MSEGuidByte4, - MSEGuidByte6, - MSEGuidByte0, - MSEHaveSplineElev, - MSEHavePitch, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveFallData, - MSEHaveFallDirection, - MSEPositionO, + MSEHasGuidByte5, + MSEMovementFlags2, + MSEHasGuidByte2, + MSEHasGuidByte7, + MSEHasSpline, + MSEMovementFlags, + MSEHasGuidByte1, + MSEHasGuidByte3, + MSEHasGuidByte4, + MSEHasGuidByte6, + MSEHasGuidByte0, + MSEHasSplineElev, + MSEHasPitch, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasFallData, + MSEHasFallDirection, + MSEOrientation, MSEPositionX, MSEPositionY, MSEPositionZ, MSETimestamp, - MSEGuidByte3_2, - MSEGuidByte0_2, - MSEGuidByte1_2, + MSEGuidByte3, + MSEGuidByte0, + MSEGuidByte1, MSESplineElev, - MSEGuidByte4_2, + MSEGuidByte4, MSEPitch, - MSEGuidByte7_2, - MSEGuidByte2_2, - MSEGuidByte6_2, + MSEGuidByte7, + MSEGuidByte2, + MSEGuidByte6, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte5_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte5, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, }; -//4.2.2 -MovementStatusElements MovementStartForwardSequence[] = { - MSEFlags, + +//4.3.3 +MovementStatusElements MovementStartForwardSequence[] = +{ + MSEPositionY, + MSEPositionZ, + MSEPositionX, + MSEHasGuidByte5, + MSEHasGuidByte2, + MSEHasGuidByte0, + MSEZeroBit, + MSEHasMovementFlags, + MSEHasGuidByte7, + MSEHasGuidByte3, + MSEHasGuidByte1, + MSEHasOrientation, + MSEHasGuidByte6, + MSEHasSpline, + MSEHasSplineElev, + MSEHasGuidByte4, + MSEHasTransportData, + MSEHasTimestamp, + MSEHasPitch, + MSEHasMovementFlags2, + MSEHasFallData, + MSEMovementFlags, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte7, + MSEHasTransportGuidByte1, + MSEHasTransportTime3, + MSEHasTransportTime2, + MSEHasFallDirection, + MSEMovementFlags2, + MSEGuidByte2, + MSEGuidByte4, + MSEGuidByte6, MSEGuidByte1, MSEGuidByte7, - MSEFlags2, - MSEGuidByte6, + MSEGuidByte3, MSEGuidByte5, - MSEHaveSpline, MSEGuidByte0, - MSEGuidByte3, - MSEGuidByte4, - MSEGuidByte2, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHavePitch, - MSEPositionX, - MSEPositionY, - MSEPositionZ, - MSETimestamp, - MSEPositionO, - MSEGuidByte2_2, - MSEGuidByte3_2, - MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSESplineElev, - MSEGuidByte6_2, - MSEGuidByte0_2, - MSEGuidByte1_2, - MSEGuidByte7_2, - MSETransportSeat, - MSETransportPositionO, - MSETransportPositionX, + MSEFallTime, + MSETransportGuidByte3, MSETransportPositionY, MSETransportPositionZ, + MSETransportGuidByte1, + MSETransportGuidByte4, + MSETransportGuidByte7, + MSETransportOrientation, + MSETransportGuidByte2, + MSETransportPositionX, + MSETransportGuidByte5, + MSETransportTime3, MSETransportTime, + MSETransportGuidByte6, + MSETransportGuidByte0, + MSETransportSeat, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, - MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte5_2, - MSEGuidByte4_2, + MSESplineElev, MSEPitch, + MSEOrientation, + MSETimestamp, + + MSEEnd, }; + //4.2.2 MovementStatusElements MovementStartStrafeLeftSequence[] = { - MSEGuidByte5, - MSEFlags, - MSEHaveSpline, - MSEGuidByte6, - MSEGuidByte1, - MSEGuidByte2, - MSEFlags2, - MSEGuidByte7, - MSEGuidByte0, - MSEGuidByte3, - MSEGuidByte4, - MSEHavePitch, - MSEHaveSplineElev, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, + MSEHasGuidByte5, + MSEMovementFlags, + MSEHasSpline, + MSEHasGuidByte6, + MSEHasGuidByte1, + MSEHasGuidByte2, + MSEMovementFlags2, + MSEHasGuidByte7, + MSEHasGuidByte0, + MSEHasGuidByte3, + MSEHasGuidByte4, + MSEHasPitch, + MSEHasSplineElev, + MSEHasFallData, + MSEHasFallDirection, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEPositionO, + MSEOrientation, MSETimestamp, MSEPitch, MSESplineElev, - MSEGuidByte7_2, - MSEGuidByte5_2, + MSEGuidByte7, + MSEGuidByte5, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte4_2, - MSEGuidByte3_2, - MSEGuidByte2_2, - MSEGuidByte6_2, - MSEGuidByte0_2, - MSEGuidByte1_2, + MSEGuidByte4, + MSEGuidByte3, + MSEGuidByte2, + MSEGuidByte6, + MSEGuidByte0, + MSEGuidByte1, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, }; + //4.2.2 MovementStatusElements MovementStartStrafeRightSequence[] = { - MSEGuidByte3, - MSEGuidByte2, - MSEGuidByte4, - MSEGuidByte5, - MSEGuidByte0, - MSEGuidByte6, - MSEHaveSpline, - MSEFlags2, - MSEGuidByte1, - MSEFlags, - MSEGuidByte7, - MSEHaveSplineElev, - MSEHavePitch, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveFallData, - MSEHaveFallDirection, - MSEPositionO, + MSEHasGuidByte3, + MSEHasGuidByte2, + MSEHasGuidByte4, + MSEHasGuidByte5, + MSEHasGuidByte0, + MSEHasGuidByte6, + MSEHasSpline, + MSEMovementFlags2, + MSEHasGuidByte1, + MSEMovementFlags, + MSEHasGuidByte7, + MSEHasSplineElev, + MSEHasPitch, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasFallData, + MSEHasFallDirection, + MSEOrientation, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEGuidByte4_2, - MSEGuidByte1_2, - MSEGuidByte2_2, + MSEGuidByte4, + MSEGuidByte1, + MSEGuidByte2, MSESplineElev, - MSEGuidByte0_2, + MSEGuidByte0, MSEPitch, - MSEGuidByte6_2, - MSEGuidByte3_2, - MSEGuidByte7_2, - MSEGuidByte5_2, + MSEGuidByte6, + MSEGuidByte3, + MSEGuidByte7, + MSEGuidByte5, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, }; + //4.2.2 MovementStatusElements MovementStartTurnLeftSequence[] = { - MSEGuidByte5, - MSEGuidByte4, - MSEGuidByte6, - MSEGuidByte0, - MSEGuidByte1, - MSEGuidByte7, - MSEGuidByte2, - MSEGuidByte3, - MSEFlags, - MSEFlags2, - MSEHaveSpline, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveSplineElev, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHavePitch, + MSEHasGuidByte5, + MSEHasGuidByte4, + MSEHasGuidByte6, + MSEHasGuidByte0, + MSEHasGuidByte1, + MSEHasGuidByte7, + MSEHasGuidByte2, + MSEHasGuidByte3, + MSEMovementFlags, + MSEMovementFlags2, + MSEHasSpline, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasSplineElev, + MSEHasFallData, + MSEHasFallDirection, + MSEHasPitch, MSEPositionX, MSEPositionY, MSEPositionZ, MSETimestamp, - MSEPositionO, + MSEOrientation, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte4_2, - MSEGuidByte0_2, - MSEGuidByte7_2, - MSEGuidByte1_2, - MSEGuidByte6_2, - MSEGuidByte5_2, - MSEGuidByte3_2, - MSESplineElev, - MSEFallTime, - MSEFallVerticalSpeed, - MSEFallHorizontalSpeed, - MSEFallCosAngle, - MSEFallSinAngle, - MSEGuidByte2_2, - MSEPitch, -}; -//4.2.2 -MovementStatusElements MovementStartTurnRightSequence[] = { + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSEGuidByte4, + MSEGuidByte0, + MSEGuidByte7, MSEGuidByte1, MSEGuidByte6, - MSEGuidByte0, - MSEFlags, MSEGuidByte5, - MSEFlags2, - MSEHaveSpline, - MSEGuidByte2, MSEGuidByte3, - MSEGuidByte7, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHavePitch, - MSEHaveSplineElev, + MSESplineElev, + MSEFallTime, + MSEFallVerticalSpeed, + MSEFallHorizontalSpeed, + MSEFallCosAngle, + MSEFallSinAngle, + MSEGuidByte2, + MSEPitch, +}; + +//4.2.2 +MovementStatusElements MovementStartTurnRightSequence[] = { + MSEHasGuidByte4, + MSEHasGuidByte1, + MSEHasGuidByte6, + MSEHasGuidByte0, + MSEMovementFlags, + MSEHasGuidByte5, + MSEMovementFlags2, + MSEHasSpline, + MSEHasGuidByte2, + MSEHasGuidByte3, + MSEHasGuidByte7, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasFallData, + MSEHasFallDirection, + MSEHasPitch, + MSEHasSplineElev, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEPositionO, + MSEOrientation, MSETimestamp, - MSEGuidByte6_2, + MSEGuidByte6, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte2_2, - MSEGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte2, + MSEGuidByte4, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, MSEPitch, - MSEGuidByte7_2, - MSEGuidByte3_2, - MSEGuidByte1_2, - MSEGuidByte0_2, + MSEGuidByte7, + MSEGuidByte3, + MSEGuidByte1, + MSEGuidByte0, MSESplineElev, - MSEGuidByte5_2, + MSEGuidByte5, }; + //4.2.2 MovementStatusElements MovementStopSequence[] = { - MSEGuidByte2, - MSEGuidByte0, - MSEHaveSpline, - MSEFlags, - MSEGuidByte4, - MSEGuidByte6, - MSEGuidByte3, - MSEGuidByte5, - MSEGuidByte7, - MSEFlags2, - MSEGuidByte1, - MSEHavePitch, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHaveSplineElev, - MSEPositionO, + MSEHasGuidByte2, + MSEHasGuidByte0, + MSEHasSpline, + MSEMovementFlags, + MSEHasGuidByte4, + MSEHasGuidByte6, + MSEHasGuidByte3, + MSEHasGuidByte5, + MSEHasGuidByte7, + MSEMovementFlags2, + MSEHasGuidByte1, + MSEHasPitch, + MSEHasFallData, + MSEHasFallDirection, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasSplineElev, + MSEOrientation, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEGuidByte2_2, - MSEGuidByte3_2, + MSEGuidByte2, + MSEGuidByte3, MSEPitch, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte5_2, - MSEGuidByte7_2, + MSEGuidByte5, + MSEGuidByte7, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte1_2, - MSEGuidByte0_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte1, + MSEGuidByte0, MSESplineElev, - MSEGuidByte6_2, - MSEGuidByte4_2, + MSEGuidByte6, + MSEGuidByte4, }; + //4.2.2 MovementStatusElements MovementStopStrafeSequence[] = { - MSEGuidByte4, - MSEFlags2, - MSEGuidByte3, - MSEGuidByte1, - MSEFlags, - MSEGuidByte5, - MSEHaveSpline, - MSEGuidByte2, - MSEGuidByte6, - MSEGuidByte0, - MSEGuidByte7, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHavePitch, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEPositionO, + MSEHasGuidByte4, + MSEMovementFlags2, + MSEHasGuidByte3, + MSEHasGuidByte1, + MSEMovementFlags, + MSEHasGuidByte5, + MSEHasSpline, + MSEHasGuidByte2, + MSEHasGuidByte6, + MSEHasGuidByte0, + MSEHasGuidByte7, + MSEHasFallData, + MSEHasFallDirection, + MSEHasPitch, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEOrientation, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEGuidByte1_2, - MSEGuidByte2_2, - MSEGuidByte6_2, - MSEGuidByte5_2, - MSEGuidByte7_2, - MSEGuidByte0_2, + MSEGuidByte1, + MSEGuidByte2, + MSEGuidByte6, + MSEGuidByte5, + MSEGuidByte7, + MSEGuidByte0, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte3_2, + MSEGuidByte3, MSEPitch, MSESplineElev, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte4, }; + //4.2.2 MovementStatusElements MovementStopTurnSequence[] = { - MSEGuidByte6, - MSEFlags, - MSEGuidByte2, - MSEGuidByte3, - MSEFlags2, - MSEGuidByte5, - MSEGuidByte7, - MSEGuidByte0, - MSEGuidByte4, - MSEGuidByte1, - MSEHaveSpline, - MSEHavePitch, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, + MSEHasGuidByte6, + MSEMovementFlags, + MSEHasGuidByte2, + MSEHasGuidByte3, + MSEMovementFlags2, + MSEHasGuidByte5, + MSEHasGuidByte7, + MSEHasGuidByte0, + MSEHasGuidByte4, + MSEHasGuidByte1, + MSEHasSpline, + MSEHasPitch, + MSEHasFallData, + MSEHasFallDirection, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEPositionO, - MSEGuidByte4_2, - MSEGuidByte5_2, - MSEGuidByte7_2, - MSEGuidByte1_2, + MSEOrientation, + MSEGuidByte4, + MSEGuidByte5, + MSEGuidByte7, + MSEGuidByte1, MSEPitch, - MSEGuidByte3_2, - MSEGuidByte6_2, + MSEGuidByte3, + MSEGuidByte6, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, MSESplineElev, - MSEGuidByte0_2, - MSEGuidByte2_2, + MSEGuidByte0, + MSEGuidByte2, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, }; + //4.2.2 MovementStatusElements MovementStartAscendSequence[] = { - MSEGuidByte3, - MSEGuidByte1, - MSEGuidByte5, - MSEFlags, - MSEGuidByte4, - MSEGuidByte6, - MSEGuidByte0, - MSEGuidByte7, - MSEFlags2, - MSEGuidByte2, - MSEHaveSpline, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHavePitch, - MSEHaveSplineElev, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, + MSEHasGuidByte3, + MSEHasGuidByte1, + MSEHasGuidByte5, + MSEMovementFlags, + MSEHasGuidByte4, + MSEHasGuidByte6, + MSEHasGuidByte0, + MSEHasGuidByte7, + MSEMovementFlags2, + MSEHasGuidByte2, + MSEHasSpline, + MSEHasFallData, + MSEHasFallDirection, + MSEHasPitch, + MSEHasSplineElev, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, MSEPositionX, MSEPositionY, MSEPositionZ, MSETimestamp, - MSEPositionO, - MSEGuidByte3_2, + MSEOrientation, + MSEGuidByte3, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, MSEPitch, - MSEGuidByte0_2, - MSEGuidByte5_2, + MSEGuidByte0, + MSEGuidByte5, MSESplineElev, - MSEGuidByte1_2, + MSEGuidByte1, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte4_2, - MSEGuidByte7_2, - MSEGuidByte2_2, - MSEGuidByte6_2, -}; -//4.2.2 -MovementStatusElements MovementStartDescendSequence[] = { - MSEGuidByte6, - MSEGuidByte1, - MSEGuidByte0, - MSEGuidByte3, - MSEFlags, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSEGuidByte4, MSEGuidByte7, - MSEHaveSpline, - MSEGuidByte5, - MSEFlags2, MSEGuidByte2, - MSEHaveSplineElev, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHavePitch, + MSEGuidByte6, +}; + +//4.2.2 +MovementStatusElements MovementStartDescendSequence[] = { + MSEHasGuidByte6, + MSEHasGuidByte1, + MSEHasGuidByte0, + MSEHasGuidByte3, + MSEMovementFlags, + MSEHasGuidByte4, + MSEHasGuidByte7, + MSEHasSpline, + MSEHasGuidByte5, + MSEMovementFlags2, + MSEHasGuidByte2, + MSEHasSplineElev, + MSEHasFallData, + MSEHasFallDirection, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasPitch, MSETimestamp, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEPositionO, + MSEOrientation, MSESplineElev, - MSEGuidByte7_2, - MSEGuidByte4_2, - MSEGuidByte2_2, - MSEGuidByte5_2, + MSEGuidByte7, + MSEGuidByte4, + MSEGuidByte2, + MSEGuidByte5, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte6_2, + MSEGuidByte6, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte0_2, - MSEGuidByte3_2, - MSEGuidByte1_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte0, + MSEGuidByte3, + MSEGuidByte1, MSEPitch, }; + //4.2.2 MovementStatusElements MovementStartSwimSequence[] = { - MSEGuidByte2, - MSEHaveSpline, - MSEGuidByte1, - MSEFlags, - MSEGuidByte3, - MSEGuidByte5, - MSEGuidByte0, - MSEGuidByte6, - MSEGuidByte7, - MSEFlags2, - MSEGuidByte4, - MSEHavePitch, - MSEHaveSplineElev, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, + MSEHasGuidByte2, + MSEHasSpline, + MSEHasGuidByte1, + MSEMovementFlags, + MSEHasGuidByte3, + MSEHasGuidByte5, + MSEHasGuidByte0, + MSEHasGuidByte6, + MSEHasGuidByte7, + MSEMovementFlags2, + MSEHasGuidByte4, + MSEHasPitch, + MSEHasSplineElev, + MSEHasFallData, + MSEHasFallDirection, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEPositionO, + MSEOrientation, MSETimestamp, MSEPitch, MSESplineElev, - MSEGuidByte2_2, - MSEGuidByte0_2, - MSEGuidByte5_2, - MSEGuidByte4_2, - MSEGuidByte7_2, - MSEGuidByte1_2, + MSEGuidByte2, + MSEGuidByte0, + MSEGuidByte5, + MSEGuidByte4, + MSEGuidByte7, + MSEGuidByte1, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, - MSEGuidByte3_2, + MSEGuidByte3, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, - MSEGuidByte6_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEGuidByte6, }; + //4.2.2 MovementStatusElements MovementStopAscendSequence[] = { - MSEGuidByte0, - MSEGuidByte3, - MSEFlags2, - MSEGuidByte1, - MSEGuidByte5, - MSEHaveSpline, - MSEGuidByte4, - MSEGuidByte2, - MSEFlags, - MSEGuidByte7, - MSEGuidByte6, - MSEHaveFallData, - MSEHaveFallDirection, - MSEHaveTransportData, - MSETransportGuidByte0, - MSETransportGuidByte6, - MSETransportGuidByte2, - MSETransportGuidByte5, - MSETransportGuidByte4, - MSETransportGuidByte1, - MSETransportGuidByte3, - MSETransportGuidByte7, - MSETransportHaveTime2, - MSETransportHaveTime3, - MSEHavePitch, - MSEHaveSplineElev, + MSEHasGuidByte0, + MSEHasGuidByte3, + MSEMovementFlags2, + MSEHasGuidByte1, + MSEHasGuidByte5, + MSEHasSpline, + MSEHasGuidByte4, + MSEHasGuidByte2, + MSEMovementFlags, + MSEHasGuidByte7, + MSEHasGuidByte6, + MSEHasFallData, + MSEHasFallDirection, + MSEHasTransportData, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte7, + MSEHasTransportTime2, + MSEHasTransportTime3, + MSEHasPitch, + MSEHasSplineElev, MSETimestamp, - MSEPositionO, + MSEOrientation, MSEPositionX, MSEPositionY, MSEPositionZ, - MSEGuidByte0_2, - MSEGuidByte1_2, - MSEGuidByte2_2, - MSEGuidByte7_2, + MSEGuidByte0, + MSEGuidByte1, + MSEGuidByte2, + MSEGuidByte7, MSEFallTime, MSEFallVerticalSpeed, MSEFallHorizontalSpeed, MSEFallCosAngle, MSEFallSinAngle, MSETransportSeat, - MSETransportPositionO, + MSETransportOrientation, MSETransportPositionX, MSETransportPositionY, MSETransportPositionZ, MSETransportTime, MSETransportTime2, - MSETransportGuidByte3_2, - MSETransportGuidByte6_2, + MSETransportGuidByte3, + MSETransportGuidByte6, MSETransportTime3, - MSETransportGuidByte7_2, - MSETransportGuidByte5_2, - MSETransportGuidByte2_2, - MSETransportGuidByte1_2, - MSETransportGuidByte0_2, - MSETransportGuidByte4_2, + MSETransportGuidByte7, + MSETransportGuidByte5, + MSETransportGuidByte2, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, MSEPitch, - MSEGuidByte5_2, - MSEGuidByte4_2, - MSEGuidByte3_2, + MSEGuidByte5, + MSEGuidByte4, + MSEGuidByte3, MSESplineElev, - MSEGuidByte6_2, + MSEGuidByte6, }; MovementStatusElements* GetMovementStatusElementsSequence(Opcodes opcode) { - switch(opcode) + switch (opcode) { - case SMSG_PLAYER_MOVE: - return PlayerMoveSequence; - case MSG_MOVE_FALL_LAND: - return MovementFallLandSequence; + //case SMSG_PLAYER_MOVE: + // return PlayerMoveSequence; + //case MSG_MOVE_FALL_LAND: + // return MovementFallLandSequence; //case MSG_MOVE_HEARTBEAT: // return MovementHeartBeatSequence; - case MSG_MOVE_JUMP: - return MovementJumpSequence; + //case MSG_MOVE_JUMP: + // return MovementJumpSequence; //case MSG_MOVE_SET_FACING: // return MovementSetFacingSequence; //case MSG_MOVE_SET_PITCH: // return MovementSetPitchSequence; - case MSG_MOVE_START_BACKWARD: - return MovementStartBackwardSequence; + //case MSG_MOVE_START_BACKWARD: + // return MovementStartBackwardSequence; case MSG_MOVE_START_FORWARD: return MovementStartForwardSequence; - case MSG_MOVE_START_STRAFE_LEFT: - return MovementStartStrafeLeftSequence; - case MSG_MOVE_START_STRAFE_RIGHT: - return MovementStartStrafeRightSequence; - case MSG_MOVE_START_TURN_LEFT: - return MovementStartTurnLeftSequence; - case MSG_MOVE_START_TURN_RIGHT: - return MovementStartTurnRightSequence; - case MSG_MOVE_STOP: - return MovementStopSequence; - case MSG_MOVE_STOP_STRAFE: - return MovementStopStrafeSequence; - case MSG_MOVE_STOP_TURN: - return MovementStopTurnSequence; - case MSG_MOVE_START_ASCEND: - return MovementStartAscendSequence; - case MSG_MOVE_START_DESCEND: - return MovementStartDescendSequence; - case MSG_MOVE_START_SWIM: - return MovementStartSwimSequence; - case MSG_MOVE_STOP_ASCEND: - return MovementStopAscendSequence; + //case MSG_MOVE_START_STRAFE_LEFT: + // return MovementStartStrafeLeftSequence; + //case MSG_MOVE_START_STRAFE_RIGHT: + // return MovementStartStrafeRightSequence; + //case MSG_MOVE_START_TURN_LEFT: + // return MovementStartTurnLeftSequence; + //case MSG_MOVE_START_TURN_RIGHT: + // return MovementStartTurnRightSequence; + //case MSG_MOVE_STOP: + // return MovementStopSequence; + //case MSG_MOVE_STOP_STRAFE: + // return MovementStopStrafeSequence; + //case MSG_MOVE_STOP_TURN: + // return MovementStopTurnSequence; + //case MSG_MOVE_START_ASCEND: + // return MovementStartAscendSequence; + //case MSG_MOVE_START_DESCEND: + // return MovementStartDescendSequence; + //case MSG_MOVE_START_SWIM: + // return MovementStartSwimSequence; + //case MSG_MOVE_STOP_ASCEND: + // return MovementStopAscendSequence; default: break; } + return NULL; } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index c539dd3cc39..ba5c59c1078 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -63,7 +63,7 @@ namespace Movement bool transport = false; Location real_position(unit.GetPositionX(), unit.GetPositionY(), unit.GetPositionZMinusOffset(), unit.GetOrientation()); // Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes - if (unit.HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && unit.GetTransGUID()) + if (unit.GetTransGUID()) { transport = true; real_position.x = unit.GetTransOffsetX(); @@ -91,7 +91,7 @@ namespace Movement else moveFlags &= ~MOVEMENTFLAG_WALKING; - moveFlags |= (MOVEMENTFLAG_SPLINE_ENABLED|MOVEMENTFLAG_FORWARD); + moveFlags |= MOVEMENTFLAG_FORWARD; if (!args.HasVelocity) args.velocity = unit.GetSpeed(SelectSpeedType(moveFlags)); @@ -120,7 +120,7 @@ namespace Movement MoveSplineInit::MoveSplineInit(Unit& m) : unit(m) { // Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes - args.TransformForTransport = unit.HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && unit.GetTransGUID(); + args.TransformForTransport = unit.GetTransGUID(); // mix existing state into new args.flags.walkmode = unit.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); args.flags.flying = unit.m_movementInfo.HasMovementFlag((MovementFlags)(MOVEMENTFLAG_CAN_FLY|MOVEMENTFLAG_DISABLE_GRAVITY)); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b7fa07ad430..bdf8a23412d 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -735,7 +735,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_BACKWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_DESCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); - //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_FORWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); + DEFINE_OPCODE_HANDLER(MSG_MOVE_START_FORWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_PITCH_DOWN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_PITCH_UP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_START_STRAFE_LEFT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index f3ae9009572..d08f814c479 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -166,8 +166,6 @@ void WorldSession::SendPacket(WorldPacket const* packet) if (packet->GetOpcode() == NULL_OPCODE || packet->GetOpcode() == UNKNOWN_OPCODE) { sLog->outError("Prevented sending of %s", packet->GetOpcode() == NULL_OPCODE ? "NULL_OPCODE" : "UNKNOWN_OPCODE"); - //ACE_Stack_Trace trace; - //sLog->outError("%s", trace.c_str()); return; } diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 813c43288d0..b777fe8d9dc 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -433,7 +433,7 @@ public: { me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); + me->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); me->SetSpeed(MOVE_WALK, 5.0f, true); wp_reached = false; count = 0; @@ -466,7 +466,7 @@ public: instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject break; case 19: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); break; case 20: { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 8a64d45abcb..be657761def 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -264,7 +264,7 @@ public: { OrbsEmpowered = 0; EmpowerCount = 0; - me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); + me->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->setActive(true); @@ -452,7 +452,7 @@ public: summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false); break; case CREATURE_ANVEENA: - summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); + summoned->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true); summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); break; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 18c972b966c..14713787164 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -130,9 +130,9 @@ bool GrandChampionsOutVehicle(Creature* me) if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3) { - if (!pGrandChampion1->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && - !pGrandChampion2->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && - !pGrandChampion3->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (!pGrandChampion1->m_movementInfo.t_guid && + !pGrandChampion2->m_movementInfo.t_guid && + !pGrandChampion3->m_movementInfo.t_guid) return true; } @@ -384,7 +384,7 @@ public: } }else uiPhaseTimer -= uiDiff; - if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (!UpdateVictim() || me->m_movementInfo.t_guid) return; if (uiInterceptTimer <= uiDiff) @@ -528,7 +528,7 @@ public: uiFireBallTimer = 5000; } else uiFireBallTimer -= uiDiff; - if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (!UpdateVictim() || me->m_movementInfo.t_guid) return; if (uiFireBallTimer <= uiDiff) @@ -666,7 +666,7 @@ public: } }else uiPhaseTimer -= uiDiff; - if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (!UpdateVictim() || me->m_movementInfo.t_guid) return; if (uiChainLightningTimer <= uiDiff) @@ -812,7 +812,7 @@ public: } }else uiPhaseTimer -= uiDiff; - if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (!UpdateVictim() || me->m_movementInfo.t_guid) return; if (uiLightningArrowsTimer <= uiDiff) @@ -960,7 +960,7 @@ public: } } else uiPhaseTimer -= uiDiff; - if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + if (!UpdateVictim() || me->m_movementInfo.t_guid) return; if (uiEviscerateTimer <= uiDiff) -- cgit v1.2.3 From 953f0939203501f0182cb10f9c92246df2bee343 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 17 Jul 2012 19:29:18 +0200 Subject: Core/PacketIO: Updated and enabled MSG_MOVE_TELEPORT, MSG_MOVE_TELEPORT_ACK, MSG_MOVE_WORLDPORT_ACK, SMSG_NEW_WORLD and SMSG_TRANSFER_PENDING --- src/server/game/Entities/Player/Player.cpp | 155 +++++++++++---------------- src/server/game/Entities/Player/Player.h | 1 - src/server/game/Handlers/MovementHandler.cpp | 53 +++++---- src/server/game/Server/Protocol/Opcodes.cpp | 11 +- src/server/game/Server/Protocol/Opcodes.h | 4 +- src/server/scripts/Commands/cs_gm.cpp | 4 +- 6 files changed, 107 insertions(+), 121 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 88f2170fdfb..fbd3f4a12a9 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2039,89 +2039,64 @@ uint8 Player::GetChatTag() const void Player::SendTeleportPacket(Position &oldPos) { - WorldPacket data(SMSG_MOVE_TELEPORT, 38); - - uint64 guid = GetGUID(); - uint8* bytes = (uint8*)&guid; - - data.WriteBit(GetTransGUID()); - data.WriteBit(bytes[0]); - data.WriteBit(bytes[2]); - data.WriteBit(bytes[6]); - data.WriteBit(bytes[7]); - data.WriteBit(bytes[4]); - data.WriteBit(bytes[5]); - data.WriteBit(bytes[3]); - data.WriteBit(bytes[1]); - data.WriteBit(0); //unk byte's bit - data << GetPositionX(); - data << GetPositionY(); - data << GetPositionZ(); - data.WriteByteSeq(bytes[5]); - data.WriteByteSeq(bytes[4]); - if (GetTransGUID()) data << GetTransGUID(); - data.WriteByteSeq(bytes[2]); - data.WriteByteSeq(bytes[7]); - data << uint32(0); //unk int - data.WriteByteSeq(bytes[1]); - data.WriteByteSeq(bytes[0]); - data.WriteByteSeq(bytes[6]); - data.WriteByteSeq(bytes[3]); - // unk byte, only if bit is set - data << GetOrientation(); + ObjectGuid guid = GetGUID(); + ObjectGuid transGuid = GetTransGUID(); + + WorldPacket data(MSG_MOVE_TELEPORT, 38); + data.WriteBit(guid[6]); + data.WriteBit(guid[0]); + data.WriteBit(guid[3]); + data.WriteBit(guid[2]); + data.WriteBit(0); // unknown + data.WriteBit(uint64(transGuid)); + data.WriteBit(guid[1]); + if (transGuid) + { + data.WriteBit(transGuid[1]); + data.WriteBit(transGuid[3]); + data.WriteBit(transGuid[2]); + data.WriteBit(transGuid[5]); + data.WriteBit(transGuid[0]); + data.WriteBit(transGuid[7]); + data.WriteBit(transGuid[6]); + data.WriteBit(transGuid[4]); + } + + data.WriteBit(guid[4]); + data.WriteBit(guid[7]); + data.WriteBit(guid[5]); + data.FlushBits(); + + if (transGuid) + { + data.WriteByteSeq(transGuid[6]); + data.WriteByteSeq(transGuid[5]); + data.WriteByteSeq(transGuid[1]); + data.WriteByteSeq(transGuid[7]); + data.WriteByteSeq(transGuid[0]); + data.WriteByteSeq(transGuid[2]); + data.WriteByteSeq(transGuid[4]); + data.WriteByteSeq(transGuid[3]); + } + + data << uint32(0); // counter + data.WriteByteSeq(guid[1]); + data.WriteByteSeq(guid[2]); + data.WriteByteSeq(guid[3]); + data.WriteByteSeq(guid[5]); + data << float(GetPositionX()); + data.WriteByteSeq(guid[4]); + data << float(GetOrientation()); + data.WriteByteSeq(guid[7]); + data << float(GetPositionZMinusOffset()); + data.WriteByteSeq(guid[0]); + data.WriteByteSeq(guid[6]); + data << float(GetPositionY()); Relocate(&oldPos); SendDirectMessage(&data); } -void Player::SendSetFlyPacket(bool apply) -{ - WorldPacket data(apply ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY, 12); - uint64 guid = GetGUID(); - uint8* bytes = (uint8*)&guid; - if (apply) - { - data.WriteBit(bytes[4]); - data.WriteBit(bytes[3]); - data.WriteBit(bytes[6]); - data.WriteBit(bytes[0]); - data.WriteBit(bytes[1]); - data.WriteBit(bytes[2]); - data.WriteBit(bytes[7]); - data.WriteBit(bytes[5]); - data.WriteByteSeq(bytes[3]); - data.WriteByteSeq(bytes[7]); - data.WriteByteSeq(bytes[5]); - data.WriteByteSeq(bytes[0]); - data.WriteByteSeq(bytes[1]); - data.WriteByteSeq(bytes[4]); - data << uint32(sWorld->GetGameTime()); - data.WriteByteSeq(bytes[6]); - data.WriteByteSeq(bytes[2]); - } - else - { - data.WriteBit(bytes[1]); - data.WriteBit(bytes[6]); - data.WriteBit(bytes[0]); - data.WriteBit(bytes[2]); - data.WriteBit(bytes[4]); - data.WriteBit(bytes[5]); - data.WriteBit(bytes[7]); - data.WriteBit(bytes[3]); - data.WriteByteSeq(bytes[7]); - data.WriteByteSeq(bytes[6]); - data.WriteByteSeq(bytes[5]); - data.WriteByteSeq(bytes[0]); - data << uint32(sWorld->GetGameTime()); - data.WriteByteSeq(bytes[3]); - data.WriteByteSeq(bytes[1]); - data.WriteByteSeq(bytes[2]); - data.WriteByteSeq(bytes[4]); - } - SendDirectMessage(&data); -} - bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options) { if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation)) @@ -2316,10 +2291,16 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati { // send transfer packets WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4); - data << uint32(mapid); + data.WriteBit(0); // unknown if (m_transport) - data << m_transport->GetEntry() << GetMapId(); + { + data.WriteBit(1); // has transport + data << GetMapId() << m_transport->GetEntry(); + } + else + data.WriteBit(0); // has transport + data << uint32(mapid); GetSession()->SendPacket(&data); } @@ -2349,17 +2330,11 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (!GetSession()->PlayerLogout()) { WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4); - if (m_transport) - data << m_movementInfo.t_pos.PositionXYZStream(); - else - data << m_teleport_dest.PositionXYZStream(); - + data << float(m_teleport_dest.GetPositionX()); + data << float(m_teleport_dest.GetOrientation()); + data << float(m_teleport_dest.GetPositionZ()); data << uint32(mapid); - - if (m_transport) - data << m_movementInfo.t_pos.GetOrientation(); - else - data << m_teleport_dest.GetOrientation(); + data << float(m_teleport_dest.GetPositionY()); GetSession()->SendPacket(&data); SendSavedInstances(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d6941406145..95f0650ee4f 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2024,7 +2024,6 @@ class Player : public Unit, public GridObject void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr); void SendTeleportPacket(Position &oldPos); - void SendSetFlyPacket(bool apply); Corpse* GetCorpse() const; void SpawnCorpseBones(); diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 6461d31db55..51cb0385a90 100755 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -32,9 +32,9 @@ #include "ObjectMgr.h" #include "MovementStructures.h" -void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket & /*recv_data*/) +void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket& /*recvPacket*/) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got CMSG_WORLD_PORT_RESPONSE."); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got MSG_MOVE_WORLDPORT_ACK."); HandleMoveWorldportAckOpcode(); } @@ -188,20 +188,33 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->ProcessDelayedOperations(); } -void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) +void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_MOVE_TELEPORT_ACK"); - - recv_data.rfinish(); - return; + sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); + ObjectGuid guid; uint32 flags, time; - recv_data >> flags >> time; - - - uint64 guid = 0; - - sLog->outStaticDebug("Guid " UI64FMTD, guid); + recvPacket >> flags >> time; + + guid[5] = recvPacket.ReadBit(); + guid[0] = recvPacket.ReadBit(); + guid[1] = recvPacket.ReadBit(); + guid[6] = recvPacket.ReadBit(); + guid[3] = recvPacket.ReadBit(); + guid[7] = recvPacket.ReadBit(); + guid[2] = recvPacket.ReadBit(); + guid[4] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guid[4]); + recvPacket.ReadByteSeq(guid[2]); + recvPacket.ReadByteSeq(guid[7]); + recvPacket.ReadByteSeq(guid[6]); + recvPacket.ReadByteSeq(guid[5]); + recvPacket.ReadByteSeq(guid[1]); + recvPacket.ReadByteSeq(guid[3]); + recvPacket.ReadByteSeq(guid[0]); + + sLog->outStaticDebug("Guid " UI64FMTD, uint64(guid)); sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS); Player* plMover = _player->m_mover->ToPlayer(); @@ -243,9 +256,9 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) GetPlayer()->ProcessDelayedOperations(); } -void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) +void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) { - uint16 opcode = recvData.GetOpcode(); + uint16 opcode = recvPacket.GetOpcode(); Unit* mover = _player->m_mover; @@ -256,13 +269,13 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck if (plrMover && plrMover->IsBeingTeleported()) { - recvData.rfinish(); // prevent warnings spam + recvPacket.rfinish(); // prevent warnings spam return; } /* extract packet */ MovementInfo movementInfo; - ReadMovementInfo(recvData, &movementInfo); + ReadMovementInfo(recvPacket, &movementInfo); // prevent tampered movement data if (movementInfo.guid != mover->GetGUID()) @@ -283,14 +296,14 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) if (movementInfo.t_pos.GetPositionX() > 50 || movementInfo.t_pos.GetPositionY() > 50 || movementInfo.t_pos.GetPositionZ() > 50) { - recvData.rfinish(); // prevent warnings spam + recvPacket.rfinish(); // prevent warnings spam return; } if (!Trinity::IsValidMapCoord(movementInfo.pos.GetPositionX() + movementInfo.t_pos.GetPositionX(), movementInfo.pos.GetPositionY() + movementInfo.t_pos.GetPositionY(), movementInfo.pos.GetPositionZ() + movementInfo.t_pos.GetPositionZ(), movementInfo.pos.GetOrientation() + movementInfo.t_pos.GetOrientation())) { - recvData.rfinish(); // prevent warnings spam + recvPacket.rfinish(); // prevent warnings spam return; } @@ -364,7 +377,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData) /*----------------------*/ /* process position-change */ - WorldPacket data(SMSG_PLAYER_MOVE, recvData.size()); + WorldPacket data(SMSG_PLAYER_MOVE, recvPacket.size()); movementInfo.time = getMSTime(); movementInfo.guid = mover->GetGUID(); WriteMovementInfo(data, &movementInfo); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 165c57144c5..3fd11c4bd0e 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -455,8 +455,6 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); - //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); //DEFINE_OPCODE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNameQueryOpcode ); @@ -682,7 +680,6 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_WEATHER_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_WHOIS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoisOpcode ); - //DEFINE_OPCODE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleWorldStateUITimerUpdate ); //DEFINE_OPCODE_HANDLER(CMSG_WORLD_TELEPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode ); @@ -750,6 +747,9 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); + DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); + //DEFINE_OPCODE_HANDLER(MSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -757,6 +757,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); //DEFINE_OPCODE_HANDLER(MSG_NOTIFY_PARTY_SQUELCH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_NULL_ACTION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(MSG_PARTY_ASSIGNMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode ); @@ -1129,7 +1130,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_NOTIFICATION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_NOTIFY_DANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1352,7 +1353,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_TRAINER_BUY_SUCCEEDED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index f35d9460dbd..9483e53a11b 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -316,8 +316,6 @@ enum Opcodes CMSG_MOVE_SET_RELATIVE_POSITION = 0x0000, CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x0000, CMSG_MOVE_SPLINE_DONE = 0x790E, - CMSG_MOVE_TELEPORT_ACK = 0x0000, - CMSG_MOVE_TELEPORT_CHEAT = 0x0000, CMSG_MOVE_TIME_SKIPPED = 0x7A0A, CMSG_MOVE_TOGGLE_COLLISION_ACK = 0x0000, CMSG_MOVE_WATER_WALK_ACK = 0x0000, @@ -479,7 +477,6 @@ enum Opcodes CMSG_WARDEN_DATA = 0x25A2, CMSG_WHO = 0x6C15, CMSG_WHOIS = 0x6B05, - CMSG_WORLD_PORT_RESPONSE = 0x2411, CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x4605, CMSG_WORLD_TELEPORT = 0x3330, CMSG_WRAP_ITEM = 0x0000, @@ -550,6 +547,7 @@ enum Opcodes MSG_MOVE_UPDATE_RUN_SPEED = 0x14A6, MSG_MOVE_UPDATE_TELEPORT = 0x50B2, MSG_MOVE_WATER_WALK = 0x0000, + MSG_MOVE_WORLDPORT_ACK = 0x2411, MSG_NOTIFY_PARTY_SQUELCH = 0x0000, MSG_PARTY_ASSIGNMENT = 0x0000, MSG_PETITION_DECLINE = 0x31E0, diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index ba5a7f10d7d..75865d98d8b 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -98,9 +98,9 @@ public: WorldPacket data; if (strncmp(args, "on", 3) == 0) - target->SendSetFlyPacket(true); + target->SendMovementSetCanFly(true); else if (strncmp(args, "off", 4) == 0) - target->SendSetFlyPacket(false); + target->SendMovementSetCanFly(false); else { handler->SendSysMessage(LANG_USE_BOL); -- cgit v1.2.3 From e9e1fb10253956bea67fc197f0d8e1c055173034 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 18 Jul 2012 14:43:55 +0200 Subject: Core/PacketIO: Implemented packet compression for any opcode. --- src/server/game/Achievements/AchievementMgr.cpp | 3 -- .../game/Entities/Object/Updates/UpdateData.cpp | 4 -- src/server/game/Maps/Map.cpp | 2 +- src/server/game/Maps/Map.h | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 20 +++---- src/server/game/Server/Protocol/Opcodes.h | 23 ++++---- src/server/game/Server/WorldPacket.cpp | 62 +++++----------------- src/server/game/Server/WorldPacket.h | 5 +- src/server/game/Server/WorldSession.cpp | 28 +++++++++- src/server/game/Server/WorldSession.h | 3 +- .../IcecrownCitadel/boss_the_lich_king.cpp | 2 +- 11 files changed, 73 insertions(+), 81 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 0ff0ace60c3..d00ff14909f 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2422,9 +2422,6 @@ void AchievementMgr::SendAllAchievementData(Player* /*receiver*/) const data << uint32(secsToTimeBitFields(itr->second.date)); } - if (data.size() > 0x1000) - data.Compress(SMSG_COMPRESSED_ACHIEVEMENT_DATA); - SendPacket(&data); } diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index 1a1b0984f03..afe43ca245c 100755 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -63,10 +63,6 @@ bool UpdateData::BuildPacket(WorldPacket* packet) } packet->append(m_data); - - if (packet->wpos() > 100) - packet->Compress(SMSG_COMPRESSED_UPDATE_OBJECT); - return true; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 8df8feb6cac..6462b721074 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2181,7 +2181,7 @@ uint32 Map::GetPlayersCountExceptGMs() const return count; } -void Map::SendToPlayers(WorldPacket const* data) const +void Map::SendToPlayers(WorldPacket* data) const { for (MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr) itr->getSource()->GetSession()->SendPacket(data); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 5eb11416fdd..2b135059ce4 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -395,7 +395,7 @@ class Map : public GridRefManager void AddWorldObject(WorldObject* obj) { i_worldObjects.insert(obj); } void RemoveWorldObject(WorldObject* obj) { i_worldObjects.erase(obj); } - void SendToPlayers(WorldPacket const* data) const; + void SendToPlayers(WorldPacket* data) const; typedef MapRefManager PlayerList; PlayerList const& GetPlayers() const { return m_mapRefManager; } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 48ea5651f1f..bbc3266cc99 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -27,16 +27,16 @@ OpcodeHandler* opcodeTable[NUM_OPCODE_HANDLERS] = { }; /// Correspondence between opcodes and their names void InitOpcodes() { -#define DEFINE_OPCODE_HANDLER(opcode, status, processing, handler) \ - if (opcode == 0) \ - sLog->outError("Opcode %s got value 0", #opcode); \ - if (opcode < NUM_OPCODE_HANDLERS) { \ - if (opcodeTable[opcode] != NULL) \ - { \ - sLog->outError("Tried to override handler of %s with %s (opcode %u)", \ - opcodeTable[opcode]->name, #opcode, opcode); \ - } \ - else opcodeTable[opcode] = new OpcodeHandler(#opcode, status, processing, handler); \ +#define DEFINE_OPCODE_HANDLER(opcode, status, processing, handler) \ + if (opcode == 0) \ + sLog->outError("Opcode %s got value 0", #opcode); \ + if (opcode < NUM_OPCODE_HANDLERS) { \ + if (opcodeTable[opcode] != NULL) \ + { \ + sLog->outError("Tried to override handler of %s with %s (opcode %u)", \ + opcodeTable[opcode]->name, #opcode, opcode); \ + } \ + else opcodeTable[opcode] = new OpcodeHandler(#opcode, #opcode##"_COMPRESSED", status, processing, handler); \ } memset(opcodeTable, 0, sizeof(opcodeTable)); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 252e9370136..0fd5569bcbd 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -28,9 +28,10 @@ /// List of Opcodes enum Opcodes { - NUM_OPCODE_HANDLERS = (0xFFFF+1), - UNKNOWN_OPCODE = NUM_OPCODE_HANDLERS, + NUM_OPCODE_HANDLERS = (0x7FFF+1), + UNKNOWN_OPCODE = (0xFFFF+1), NULL_OPCODE = 0, + COMPRESSED_OPCODE_MASK = 0x8000, CMSG_ACCEPT_LEVEL_GRANT = 0x0205, CMSG_ACCEPT_TRADE = 0x7110, @@ -1186,10 +1187,11 @@ typedef void(WorldSession::*pOpcodeHandler)(WorldPacket& recvPacket); struct OpcodeHandler { OpcodeHandler() {} - OpcodeHandler(const char* _name, SessionStatus _status, PacketProcessing _processing, pOpcodeHandler _handler) - : name(_name), status(_status), packetProcessing(_processing), handler(_handler) {} + OpcodeHandler(char const* _name, char const* _compressedName, SessionStatus _status, PacketProcessing _processing, pOpcodeHandler _handler) + : name(_name), compressedName(_compressedName), status(_status), packetProcessing(_processing), handler(_handler) {} char const* name; + char const* compressedName; SessionStatus status; PacketProcessing packetProcessing; pOpcodeHandler handler; @@ -1201,13 +1203,16 @@ void InitOpcodes(); /// Lookup opcode name for human understandable logging inline const char* LookupOpcodeName(Opcodes id) { - if (id < NUM_OPCODE_HANDLERS) + if (id < UNKNOWN_OPCODE) { - OpcodeHandler* handler = opcodeTable[uint32(id)]; - return handler ? handler->name : "UNKNOWN OPCODE"; - } - else + bool isCompressed = uint32(id) & COMPRESSED_OPCODE_MASK; + if (OpcodeHandler* handler = opcodeTable[uint32(id) & 0x7FFF]) + return isCompressed ? handler->compressedName : handler->name; + return "UNKNOWN OPCODE"; + } + + return "INVALID OPCODE"; } #endif /// @} diff --git a/src/server/game/Server/WorldPacket.cpp b/src/server/game/Server/WorldPacket.cpp index b6d037d6066..f5d6c8a211c 100644 --- a/src/server/game/Server/WorldPacket.cpp +++ b/src/server/game/Server/WorldPacket.cpp @@ -15,24 +15,20 @@ * with this program. If not, see . */ -#include "WorldPacket.h" #include +#include "WorldPacket.h" #include "World.h" -void WorldPacket::Compress(Opcodes opcode) +void WorldPacket::Compress(z_stream* compressionStream) { - if (opcode == UNKNOWN_OPCODE || opcode == NULL_OPCODE) - { - sLog->outError("Tried to compress packet with unknown opcode (%u)", uint32(opcode)); - return; - } - Opcodes uncompressedOpcode = GetOpcode(); + Opcodes opcode = Opcodes(uncompressedOpcode | COMPRESSED_OPCODE_MASK); uint32 size = wpos(); uint32 destsize = compressBound(size); std::vector storage(destsize); + _compressionStream = compressionStream; Compress(static_cast(&storage[0]), &destsize, static_cast(contents()), size); if (destsize == 0) return; @@ -43,62 +39,30 @@ void WorldPacket::Compress(Opcodes opcode) append(&storage[0], destsize); SetOpcode(opcode); - sLog->outStaticDebug("Successfully compressed opcode %u (len %u) to %u (len %u)", - uncompressedOpcode, size, opcode, destsize); + sLog->outStaticDebug("Successfully compressed opcode %u (len %u) to %u (len %u)", uncompressedOpcode, size, opcode, destsize); } void WorldPacket::Compress(void* dst, uint32 *dst_size, const void* src, int src_size) { - z_stream c_stream; - - c_stream.zalloc = (alloc_func)NULL; - c_stream.zfree = (free_func)NULL; - c_stream.opaque = (voidpf)NULL; + _compressionStream->next_out = (Bytef*)dst; + _compressionStream->avail_out = *dst_size; + _compressionStream->next_in = (Bytef*)src; + _compressionStream->avail_in = (uInt)src_size; - // default Z_BEST_SPEED (1) - int z_res = deflateInit(&c_stream, sWorld->getIntConfig(CONFIG_COMPRESSION)); + int32 z_res = deflate(_compressionStream, Z_SYNC_FLUSH); if (z_res != Z_OK) { - sLog->outError("Can't compress packet (zlib: deflateInit) Error code: %i (%s)",z_res,zError(z_res)); + sLog->outError("Can't compress packet (zlib: deflate) Error code: %i (%s, msg: %s)", z_res, zError(z_res), _compressionStream->msg); *dst_size = 0; return; } - c_stream.next_out = (Bytef*)dst; - c_stream.avail_out = *dst_size; - c_stream.next_in = (Bytef*)src; - c_stream.avail_in = (uInt)src_size; - - z_res = deflate(&c_stream, Z_NO_FLUSH); - if (z_res != Z_OK) - { - sLog->outError("Can't compress packet (zlib: deflate) Error code: %i (%s)",z_res,zError(z_res)); - *dst_size = 0; - return; - } - - if (c_stream.avail_in != 0) + if (_compressionStream->avail_in != 0) { sLog->outError("Can't compress packet (zlib: deflate not greedy)"); *dst_size = 0; return; } - z_res = deflate(&c_stream, Z_FINISH); - if (z_res != Z_STREAM_END) - { - sLog->outError("Can't compress packet (zlib: deflate should report Z_STREAM_END instead %i (%s)",z_res,zError(z_res)); - *dst_size = 0; - return; - } - - z_res = deflateEnd(&c_stream); - if (z_res != Z_OK) - { - sLog->outError("Can't compress packet (zlib: deflateEnd) Error code: %i (%s)",z_res,zError(z_res)); - *dst_size = 0; - return; - } - - *dst_size = c_stream.total_out; + *dst_size -= _compressionStream->avail_out; } diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index f648e905bf9..9f512924d1b 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -23,6 +23,8 @@ #include "Opcodes.h" #include "ByteBuffer.h" +struct z_stream_s; + class WorldPacket : public ByteBuffer { public: @@ -48,11 +50,12 @@ class WorldPacket : public ByteBuffer Opcodes GetOpcode() const { return m_opcode; } void SetOpcode(Opcodes opcode) { m_opcode = opcode; } - void Compress(Opcodes opcode); + void Compress(z_stream_s* compressionStream); protected: Opcodes m_opcode; void Compress(void* dst, uint32 *dst_size, const void* src, int src_size); + z_stream_s* _compressionStream; }; #endif diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 8687549644e..17f1f9dbada 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -21,6 +21,7 @@ */ #include "WorldSocket.h" // must be first to make ACE happy with ACE includes in it +#include #include "Common.h" #include "DatabaseEnv.h" #include "Log.h" @@ -111,6 +112,19 @@ isRecruiter(isARecruiter), timeLastWhoCommand(0) } InitializeQueryCallbackParameters(); + + _compressionStream = new z_stream(); + _compressionStream->zalloc = (alloc_func)NULL; + _compressionStream->zfree = (free_func)NULL; + _compressionStream->opaque = (voidpf)NULL; + _compressionStream->avail_in = 0; + _compressionStream->next_in = NULL; + int32 z_res = deflateInit(_compressionStream, sWorld->getIntConfig(CONFIG_COMPRESSION)); + if (z_res != Z_OK) + { + sLog->outError("Can't initialize packet compression (zlib: deflateInit) Error code: %i (%s)", z_res, zError(z_res)); + return; + } } /// WorldSession destructor @@ -137,6 +151,15 @@ WorldSession::~WorldSession() delete packet; LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = %u;", GetAccountId()); // One-time query + + int32 z_res = deflateEnd(_compressionStream); + if (z_res != Z_OK && z_res != Z_DATA_ERROR) // Z_DATA_ERROR signals that internal state was BUSY + { + sLog->outError("Can't close packet compression stream (zlib: deflateEnd) Error code: %i (%s)", z_res, zError(z_res)); + return; + } + + delete _compressionStream; } void WorldSession::SizeError(WorldPacket const& packet, uint32 size) const @@ -158,7 +181,7 @@ uint32 WorldSession::GetGuidLow() const } /// Send a packet to the client -void WorldSession::SendPacket(WorldPacket const* packet) +void WorldSession::SendPacket(WorldPacket* packet) { if (!m_Socket) return; @@ -175,6 +198,9 @@ void WorldSession::SendPacket(WorldPacket const* packet) return; } + if (packet->size() > 0x400) + packet->Compress(_compressionStream); + #ifdef TRINITY_DEBUG // Code for network use statistic static uint64 sendPacketCount = 0; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index baff1a6a690..990bb5c02b0 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -235,7 +235,7 @@ class WorldSession void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); void WriteMovementInfo(WorldPacket &data, MovementInfo* mi); - void SendPacket(WorldPacket const* packet); + void SendPacket(WorldPacket* packet); void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3); void SendNotification(uint32 string_id, ...); void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName); @@ -994,6 +994,7 @@ class WorldSession bool isRecruiter; ACE_Based::LockedQueue _recvQueue; time_t timeLastWhoCommand; + z_stream_s* _compressionStream; }; #endif /// @} diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index a8657925131..7d191341c6b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1146,7 +1146,7 @@ class boss_the_lich_king : public CreatureScript } // Send packet to all players in The Frozen Throne - void SendPacketToPlayers(WorldPacket const* data) const + void SendPacketToPlayers(WorldPacket* data) const { Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (!players.isEmpty()) -- cgit v1.2.3 From fa3a8363b19ee8417d143b616578544f699c7688 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 18 Jul 2012 20:14:51 +0200 Subject: Core/PacketIO: Zlib compression stream structure is kept per session - compress packets individually for each receiver --- src/server/game/Maps/Map.cpp | 2 +- src/server/game/Maps/Map.h | 2 +- src/server/game/Server/WorldPacket.cpp | 39 ++++++++++++++++++++++ src/server/game/Server/WorldPacket.h | 1 + src/server/game/Server/WorldSession.cpp | 5 +-- src/server/game/Server/WorldSession.h | 4 ++- src/server/game/Server/WorldSocket.cpp | 31 +++++++++++------ .../IcecrownCitadel/boss_the_lich_king.cpp | 2 +- 8 files changed, 67 insertions(+), 19 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 6462b721074..8df8feb6cac 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2181,7 +2181,7 @@ uint32 Map::GetPlayersCountExceptGMs() const return count; } -void Map::SendToPlayers(WorldPacket* data) const +void Map::SendToPlayers(WorldPacket const* data) const { for (MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr) itr->getSource()->GetSession()->SendPacket(data); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 2b135059ce4..5eb11416fdd 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -395,7 +395,7 @@ class Map : public GridRefManager void AddWorldObject(WorldObject* obj) { i_worldObjects.insert(obj); } void RemoveWorldObject(WorldObject* obj) { i_worldObjects.erase(obj); } - void SendToPlayers(WorldPacket* data) const; + void SendToPlayers(WorldPacket const* data) const; typedef MapRefManager PlayerList; PlayerList const& GetPlayers() const { return m_mapRefManager; } diff --git a/src/server/game/Server/WorldPacket.cpp b/src/server/game/Server/WorldPacket.cpp index f5d6c8a211c..f072602a5e6 100644 --- a/src/server/game/Server/WorldPacket.cpp +++ b/src/server/game/Server/WorldPacket.cpp @@ -19,9 +19,16 @@ #include "WorldPacket.h" #include "World.h" +//! Compresses packet in place void WorldPacket::Compress(z_stream* compressionStream) { Opcodes uncompressedOpcode = GetOpcode(); + if (uncompressedOpcode & COMPRESSED_OPCODE_MASK) + { + sLog->outError("Packet with opcode 0x%04X is already compressed!", uncompressedOpcode); + return; + } + Opcodes opcode = Opcodes(uncompressedOpcode | COMPRESSED_OPCODE_MASK); uint32 size = wpos(); uint32 destsize = compressBound(size); @@ -42,6 +49,38 @@ void WorldPacket::Compress(z_stream* compressionStream) sLog->outStaticDebug("Successfully compressed opcode %u (len %u) to %u (len %u)", uncompressedOpcode, size, opcode, destsize); } +//! Compresses another packet and stores it in self (source left intact) +void WorldPacket::Compress(z_stream* compressionStream, WorldPacket const* source) +{ + ASSERT(source != this); + + Opcodes uncompressedOpcode = source->GetOpcode(); + if (uncompressedOpcode & COMPRESSED_OPCODE_MASK) + { + sLog->outError("Packet with opcode 0x%04X is already compressed!", uncompressedOpcode); + return; + } + + Opcodes opcode = Opcodes(uncompressedOpcode | COMPRESSED_OPCODE_MASK); + uint32 size = source->size(); + uint32 destsize = compressBound(size); + + size_t sizePos = 0; + resize(destsize + sizeof(uint32)); + + _compressionStream = compressionStream; + Compress(static_cast(&_storage[0] + sizeof(uint32)), &destsize, static_cast(source->contents()), size); + if (destsize == 0) + return; + + put(sizePos, size); + resize(destsize + sizeof(uint32)); + + SetOpcode(opcode); + + sLog->outStaticDebug("Successfully compressed opcode %u (len %u) to %u (len %u)", uncompressedOpcode, size, opcode, destsize); +} + void WorldPacket::Compress(void* dst, uint32 *dst_size, const void* src, int src_size) { _compressionStream->next_out = (Bytef*)dst; diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index 9f512924d1b..c695c16ed3b 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -51,6 +51,7 @@ class WorldPacket : public ByteBuffer Opcodes GetOpcode() const { return m_opcode; } void SetOpcode(Opcodes opcode) { m_opcode = opcode; } void Compress(z_stream_s* compressionStream); + void Compress(z_stream_s* compressionStream, WorldPacket const* source); protected: Opcodes m_opcode; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 17f1f9dbada..518a3743d66 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -181,7 +181,7 @@ uint32 WorldSession::GetGuidLow() const } /// Send a packet to the client -void WorldSession::SendPacket(WorldPacket* packet) +void WorldSession::SendPacket(WorldPacket const* packet) { if (!m_Socket) return; @@ -198,9 +198,6 @@ void WorldSession::SendPacket(WorldPacket* packet) return; } - if (packet->size() > 0x400) - packet->Compress(_compressionStream); - #ifdef TRINITY_DEBUG // Code for network use statistic static uint64 sendPacketCount = 0; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 990bb5c02b0..65e8d018f96 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -235,7 +235,7 @@ class WorldSession void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); void WriteMovementInfo(WorldPacket &data, MovementInfo* mi); - void SendPacket(WorldPacket* packet); + void SendPacket(WorldPacket const* packet); void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3); void SendNotification(uint32 string_id, ...); void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName); @@ -397,6 +397,8 @@ class WorldSession uint32 GetRecruiterId() const { return recruiterId; } bool IsARecruiter() const { return isRecruiter; } + z_stream_s* GetCompressionStream() { return _compressionStream; } + public: // opcodes handlers void Handle_NULL(WorldPacket& recvPacket); // not used diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 59734364934..faff1468ad3 100755 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -159,26 +159,35 @@ int WorldSocket::SendPacket(WorldPacket const& pct) if (closing_) return -1; - // Dump outgoing packet. + // Dump outgoing packet - uncompressed, easier to parse if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(pct, SERVER_TO_CLIENT); - sLog->outOpCode(uint32(pct.GetOpcode()), LookupOpcodeName(pct.GetOpcode()), true); + WorldPacket const* pkt = &pct; - // Create a copy of the original packet; this is to avoid issues if a hook modifies it. - sScriptMgr->OnPacketSend(this, WorldPacket(pct)); + // Empty buffer used in case packet should be compressed + WorldPacket buff; + if (m_Session && pkt->size() > 0x400) + { + buff.Compress(m_Session->GetCompressionStream(), pkt); + pkt = &buff; + } + + sLog->outOpCode(uint32(pkt->GetOpcode()), LookupOpcodeName(pkt->GetOpcode()), true); + + sScriptMgr->OnPacketSend(this, *pkt); - ServerPktHeader header(pct.size()+2, pct.GetOpcode()); + ServerPktHeader header(pkt->size()+2, pkt->GetOpcode()); m_Crypt.EncryptSend ((uint8*)header.header, header.getHeaderLength()); - if (m_OutBuffer->space() >= pct.size() + header.getHeaderLength() && msg_queue()->is_empty()) + if (m_OutBuffer->space() >= pkt->size() + header.getHeaderLength() && msg_queue()->is_empty()) { // Put the packet on the buffer. if (m_OutBuffer->copy((char*) header.header, header.getHeaderLength()) == -1) ACE_ASSERT (false); - if (!pct.empty()) - if (m_OutBuffer->copy((char*) pct.contents(), pct.size()) == -1) + if (!pkt->empty()) + if (m_OutBuffer->copy((char*) pkt->contents(), pkt->size()) == -1) ACE_ASSERT (false); } else @@ -186,12 +195,12 @@ int WorldSocket::SendPacket(WorldPacket const& pct) // Enqueue the packet. ACE_Message_Block* mb; - ACE_NEW_RETURN(mb, ACE_Message_Block(pct.size() + header.getHeaderLength()), -1); + ACE_NEW_RETURN(mb, ACE_Message_Block(pkt->size() + header.getHeaderLength()), -1); mb->copy((char*) header.header, header.getHeaderLength()); - if (!pct.empty()) - mb->copy((const char*)pct.contents(), pct.size()); + if (!pkt->empty()) + mb->copy((const char*)pkt->contents(), pkt->size()); if (msg_queue()->enqueue_tail(mb, (ACE_Time_Value*)&ACE_Time_Value::zero) == -1) { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 7d191341c6b..a8657925131 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1146,7 +1146,7 @@ class boss_the_lich_king : public CreatureScript } // Send packet to all players in The Frozen Throne - void SendPacketToPlayers(WorldPacket* data) const + void SendPacketToPlayers(WorldPacket const* data) const { Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (!players.isEmpty()) -- cgit v1.2.3 From 0f04b2fc36593526cf1cc86667d37779691e1135 Mon Sep 17 00:00:00 2001 From: Nay Date: Tue, 24 Jul 2012 15:27:42 +0100 Subject: Core/Misc: Update money to 64 bits (from 32), increasing the maximum gold possible This got a bit messy and will be further fixed when all related packets are updated. (Also fixed a typo in atoll msvc macro) --- .../2012_07_24_00_characters_various_434.sql | 3 ++ src/server/game/Chat/Commands/Level2.cpp | 10 +++--- src/server/game/Chat/Commands/Level3.cpp | 3 +- src/server/game/Entities/Player/Player.cpp | 38 +++++++++++----------- src/server/game/Entities/Player/Player.h | 22 ++++++------- src/server/game/Guilds/Guild.cpp | 12 +++---- src/server/game/Handlers/AuctionHouseHandler.cpp | 18 +++++----- src/server/game/Handlers/CharacterHandler.cpp | 8 ++--- src/server/game/Handlers/GuildHandler.cpp | 8 ++--- src/server/game/Handlers/ItemHandler.cpp | 6 ++-- src/server/game/Handlers/MailHandler.cpp | 4 +-- src/server/game/Handlers/NPCHandler.cpp | 4 +-- src/server/game/Handlers/PetitionsHandler.cpp | 2 +- src/server/game/Handlers/TradeHandler.cpp | 6 ++-- src/server/game/Mails/Mail.h | 8 ++--- src/server/game/Scripting/ScriptMgr.cpp | 2 +- src/server/game/Scripting/ScriptMgr.h | 4 +-- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/World/World.cpp | 6 ++-- src/server/scripts/Commands/cs_modify.cpp | 7 ++-- src/server/scripts/World/npc_professions.cpp | 6 ++-- src/server/scripts/World/npcs_special.cpp | 8 ++--- src/server/shared/Common.h | 2 +- 23 files changed, 97 insertions(+), 92 deletions(-) create mode 100644 sql/updates/characters/2012_07_24_00_characters_various_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2012_07_24_00_characters_various_434.sql b/sql/updates/characters/2012_07_24_00_characters_various_434.sql new file mode 100644 index 00000000000..8b2bfd4f131 --- /dev/null +++ b/sql/updates/characters/2012_07_24_00_characters_various_434.sql @@ -0,0 +1,3 @@ +ALTER TABLE `characters` CHANGE `money` `money` bigint(20) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `mail` CHANGE `money` `money` bigint(20) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `mail` CHANGE `cod` `cod` bigint(20) unsigned NOT NULL DEFAULT '0'; diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp index 8fe782a75c1..752ba6bc3ca 100755 --- a/src/server/game/Chat/Commands/Level2.cpp +++ b/src/server/game/Chat/Commands/Level2.cpp @@ -251,7 +251,7 @@ bool ChatHandler::HandlePInfoCommand(const char* args) return false; uint32 accId = 0; - uint32 money = 0; + uint64 money = 0; uint32 total_player_time = 0; uint8 level = 0; uint32 latency = 0; @@ -299,7 +299,7 @@ bool ChatHandler::HandlePInfoCommand(const char* args) Field* fields = result->Fetch(); total_player_time = fields[0].GetUInt32(); level = fields[1].GetUInt8(); - money = fields[2].GetUInt32(); + money = fields[2].GetUInt64(); accId = fields[3].GetUInt32(); race = fields[4].GetUInt8(); Class = fields[5].GetUInt8(); @@ -422,9 +422,9 @@ bool ChatHandler::HandlePInfoCommand(const char* args) } std::string timeStr = secsToTimeString(total_player_time, true, true); - uint32 gold = money /GOLD; - uint32 silv = (money % GOLD) / SILVER; - uint32 copp = (money % GOLD) % SILVER; + uint64 gold = money / GOLD; + uint64 silv = (money % GOLD) / SILVER; + uint64 copp = (money % GOLD) % SILVER; PSendSysMessage(LANG_PINFO_LEVEL, race_s.c_str(), Class_s.c_str(), timeStr.c_str(), level, gold, silv, copp); // Add map, zone, subzone and phase to output diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 5b93b899898..355789b565e 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -63,6 +63,7 @@ #include "SmartAI.h" #include "Group.h" #include "ChannelMgr.h" +#include bool ChatHandler::HandleMaxSkillCommand(const char* /*args*/) { @@ -1388,7 +1389,7 @@ bool ChatHandler::HandleSendMoneyCommand(const char *args) return false; char* money_str = strtok(NULL, ""); - int32 money = money_str ? atoi(money_str) : 0; + int64 money = money_str ? atoll(money_str) : 0; if (money <= 0) return false; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index b2808938b57..9847d22f84e 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -346,7 +346,7 @@ void TradeData::SetSpell(uint32 spell_id, Item* castItem /*= NULL*/) Update(false); // send spell info to caster self } -void TradeData::SetMoney(uint32 money) +void TradeData::SetMoney(uint64 money) { if (m_money == money) return; @@ -4412,7 +4412,7 @@ bool Player::ResetTalents(bool no_cost) { cost = GetNextResetTalentsCost(); - if (!HasEnoughMoney(cost)) + if (!HasEnoughMoney(uint64(cost))) { SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); return false; @@ -5454,13 +5454,13 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g TotalCost = costs; } - else if (!HasEnoughMoney(costs)) + else if (!HasEnoughMoney(uint64(costs))) { sLog->outStaticDebug("You do not have enough money"); return TotalCost; } else - ModifyMoney(-int32(costs)); + ModifyMoney(-int64(costs)); } } @@ -14325,7 +14325,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men return; int32 cost = int32(item->BoxMoney); - if (!HasEnoughMoney(cost)) + if (!HasEnoughMoney(int64(cost))) { SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); PlayerTalkClass->SendCloseGossip(); @@ -14773,7 +14773,7 @@ bool Player::CanCompleteQuest(uint32 quest_id) if (qInfo->GetRewOrReqMoney() < 0) { - if (!HasEnoughMoney(-qInfo->GetRewOrReqMoney())) + if (!HasEnoughMoney(-int64(qInfo->GetRewOrReqMoney()))) return false; } @@ -14836,7 +14836,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg) } // prevent receive reward with low money and GetRewOrReqMoney() < 0 - if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-quest->GetRewOrReqMoney())) + if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-int64(quest->GetRewOrReqMoney()))) return false; return true; @@ -16755,7 +16755,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria) m_achievementMgr.LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS)); - uint32 money = fields[8].GetUInt32(); + uint64 money = fields[8].GetUInt64(); if (money > MAX_MONEY_AMOUNT) money = MAX_MONEY_AMOUNT; SetMoney(money); @@ -18647,7 +18647,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, getGender()); stmt->setUInt8(index++, getLevel()); stmt->setUInt32(index++, GetUInt32Value(PLAYER_XP)); - stmt->setUInt32(index++, GetMoney()); + stmt->setUInt64(index++, GetMoney()); stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES_2)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FLAGS)); @@ -18755,7 +18755,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, getGender()); stmt->setUInt8(index++, getLevel()); stmt->setUInt32(index++, GetUInt32Value(PLAYER_XP)); - stmt->setUInt32(index++, GetMoney()); + stmt->setUInt64(index++, GetMoney()); stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES_2)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FLAGS)); @@ -18921,7 +18921,7 @@ void Player::SaveInventoryAndGoldToDB(SQLTransaction& trans) void Player::SaveGoldToDB(SQLTransaction& trans) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_MONEY); - stmt->setUInt32(0, GetMoney()); + stmt->setUInt64(0, GetMoney()); stmt->setUInt32(1, GetGUIDLow()); trans->Append(stmt); } @@ -20772,7 +20772,7 @@ bool Player::ActivateTaxiPathTo(std::vector const& nodes, Creature* npc return false; } - uint32 money = GetMoney(); + uint64 money = GetMoney(); if (npc) totalcost = (uint32)ceil(totalcost*GetReputationPriceDiscount(npc)); @@ -20785,7 +20785,7 @@ bool Player::ActivateTaxiPathTo(std::vector const& nodes, Creature* npc } //Checks and preparations done, DO FLIGHT - ModifyMoney(-(int32)totalcost); + ModifyMoney(-int64(totalcost)); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, totalcost); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, 1); @@ -21161,7 +21161,7 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 // reputation discount price = uint32(floor(price * GetReputationPriceDiscount(creature))); - if (!HasEnoughMoney(price)) + if (!HasEnoughMoney(uint64(price))) { SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0); return false; @@ -21949,16 +21949,16 @@ void Player::InitPrimaryProfessions() SetFreePrimaryProfessions(sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL)); } -void Player::ModifyMoney(int32 d) +void Player::ModifyMoney(int64 d) { sScriptMgr->OnPlayerMoneyChanged(this, d); if (d < 0) - SetMoney (GetMoney() > uint32(-d) ? GetMoney() + d : 0); + SetMoney (GetMoney() > uint64(-d) ? GetMoney() + d : 0); else { - uint32 newAmount = 0; - if (GetMoney() < uint32(MAX_MONEY_AMOUNT - d)) + uint64 newAmount = 0; + if (GetMoney() < uint64(MAX_MONEY_AMOUNT - d)) newAmount = GetMoney() + d; else { @@ -21967,7 +21967,7 @@ void Player::ModifyMoney(int32 d) if (d) SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL); } - SetMoney (newAmount); + SetMoney(newAmount); } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b9261aaff64..ded63b024b8 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -832,7 +832,7 @@ enum PlayerDelayedOperations // Player summoning auto-decline time (in secs) #define MAX_PLAYER_SUMMON_DELAY (2*MINUTE) -#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1) +#define MAX_MONEY_AMOUNT (UI64LIT(9999999999)) // TODO: Move this restriction to worldserver.conf, default to this value, hardcap at uint64.max struct InstancePlayerBind { @@ -1000,8 +1000,8 @@ class TradeData Item* GetSpellCastItem() const; bool HasSpellCastItem() const { return m_spellCastItem != 0; } - uint32 GetMoney() const { return m_money; } - void SetMoney(uint32 money); + uint64 GetMoney() const { return m_money; } + void SetMoney(uint64 money); bool IsAccepted() const { return m_accepted; } void SetAccepted(bool state, bool crosssend = false); @@ -1021,7 +1021,7 @@ class TradeData bool m_accepted; // m_player press accept for trade list bool m_acceptProccess; // one from player/trader press accept and this processed - uint32 m_money; // m_player place money to trade + uint64 m_money; // m_player place money to trade uint32 m_spell; // m_player apply spell to non-traded slot item uint64 m_spellCastItem; // applied spell casted by item use @@ -1590,19 +1590,19 @@ class Player : public Unit, public GridObject void setRegenTimerCount(uint32 time) {m_regenTimerCount = time;} void setWeaponChangeTimer(uint32 time) {m_weaponChangeTimer = time;} - uint32 GetMoney() const { return GetUInt32Value(PLAYER_FIELD_COINAGE); } - void ModifyMoney(int32 d); - bool HasEnoughMoney(uint32 amount) const { return (GetMoney() >= amount); } - bool HasEnoughMoney(int32 amount) const + uint64 GetMoney() const { return GetUInt64Value(PLAYER_FIELD_COINAGE); } + void ModifyMoney(int64 d); + bool HasEnoughMoney(uint64 amount) const { return GetMoney() >= amount; } + bool HasEnoughMoney(int64 amount) const { if (amount > 0) - return (GetMoney() >= (uint32) amount); + return (GetMoney() >= (uint64)amount); return true; } - void SetMoney(uint32 value) + void SetMoney(uint64 value) { - SetUInt32Value(PLAYER_FIELD_COINAGE, value); + SetUInt64Value(PLAYER_FIELD_COINAGE, value); MoneyChanged(value); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED); } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 8cb0a397b8d..ac4802a3091 100755 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1322,12 +1322,12 @@ void Guild::HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo) if (!_IsLeader(player)) // "Only guild leaders can create emblems." SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTGUILDMASTER); - else if (!player->HasEnoughMoney(EMBLEM_PRICE)) + else if (!player->HasEnoughMoney(uint64(EMBLEM_PRICE))) // "You can't afford to do that." SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTENOUGHMONEY); else { - player->ModifyMoney(-int32(EMBLEM_PRICE)); + player->ModifyMoney(-int64(EMBLEM_PRICE)); m_emblemInfo = emblemInfo; m_emblemInfo.SaveToDB(m_id); @@ -1418,13 +1418,13 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) return; Player* player = session->GetPlayer(); - if (!player->HasEnoughMoney(tabCost)) // Should not happen, this is checked by client + if (!player->HasEnoughMoney(uint64(tabCost))) // Should not happen, this is checked by client return; if (!_CreateNewBankTab()) return; - player->ModifyMoney(-int32(tabCost)); + player->ModifyMoney(-int64(tabCost)); _SetRankBankMoneyPerDay(player->GetRank(), uint32(GUILD_WITHDRAW_MONEY_UNLIMITED)); _SetRankBankTabRightsAndSlots(player->GetRank(), tabId, GuildBankRightsAndSlots(GUILD_BANK_RIGHT_FULL, uint32(GUILD_WITHDRAW_SLOT_UNLIMITED))); HandleRoster(); // Broadcast for tab rights update @@ -1652,13 +1652,13 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount) // Add money to bank _ModifyBankMoney(trans, amount, true); // Remove money from player - player->ModifyMoney(-int32(amount)); + player->ModifyMoney(-int64(amount)); player->SaveGoldToDB(trans); // Log GM action (TODO: move to scripts) if (!AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { sLog->outCommand(player->GetSession()->GetAccountId(), - "GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)", + "GM %s (Account: %u) deposit money (Amount: " UI64FMTD ") to guild bank (Guild ID %u)", player->GetName(), player->GetSession()->GetAccountId(), amount, m_id); } // Log guild bank event diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index c40d3d7964b..52f0793e73c 100755 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -225,7 +225,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); uint32 deposit = sAuctionMgr->GetAuctionDeposit(auctionHouseEntry, etime, item, finalCount); - if (!_player->HasEnoughMoney(deposit)) + if (!_player->HasEnoughMoney((uint64)deposit)) { SendAuctionCommandResult(0, AUCTION_SELL_ITEM, AUCTION_NOT_ENOUGHT_MONEY); return; @@ -412,7 +412,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) return; } - if (!player->HasEnoughMoney((uint32)price)) + if (!player->HasEnoughMoney(price)) { //you don't have enought money!, client tests! //SendAuctionCommandResult(auction->auctionId, AUCTION_PLACE_BID, ???); @@ -426,16 +426,16 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) if (auction->bidder > 0) { if (auction->bidder == player->GetGUIDLow()) - player->ModifyMoney(-int32(price - auction->bid)); + player->ModifyMoney(-int64(price - auction->bid)); else { // mail to last bidder and return money sAuctionMgr->SendAuctionOutbiddedMail(auction, price, GetPlayer(), trans); - player->ModifyMoney(-int32(price)); + player->ModifyMoney(-int64(price)); } } else - player->ModifyMoney(-int32(price)); + player->ModifyMoney(-int64(price)); auction->bidder = player->GetGUIDLow(); auction->bid = price; @@ -453,10 +453,10 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) { //buyout: if (player->GetGUIDLow() == auction->bidder) - player->ModifyMoney(-int32(auction->buyout - auction->bid)); + player->ModifyMoney(-int64(auction->buyout - auction->bid)); else { - player->ModifyMoney(-int32(auction->buyout)); + player->ModifyMoney(-int64(auction->buyout)); if (auction->bidder) //buyout for bidded auction .. sAuctionMgr->SendAuctionOutbiddedMail(auction, auction->buyout, GetPlayer(), trans); } @@ -516,11 +516,11 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) if (auction->bidder > 0) // If we have a bidder, we have to send him the money he paid { uint32 auctionCut = auction->GetAuctionCut(); - if (!player->HasEnoughMoney(auctionCut)) //player doesn't have enough money, maybe message needed + if (!player->HasEnoughMoney((uint64)auctionCut)) //player doesn't have enough money, maybe message needed return; //some auctionBidderNotification would be needed, but don't know that parts.. sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans); - player->ModifyMoney(-int32(auctionCut)); + player->ModifyMoney(-int64(auctionCut)); } // item will deleted or added to received mail list diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 9a77c3da55c..01668314c63 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1387,12 +1387,12 @@ void WorldSession::HandleAlterAppearance(WorldPacket & recv_data) if (bs_skinColor && (bs_skinColor->type != 3 || bs_skinColor->race != _player->getRace() || bs_skinColor->gender != _player->getGender())) return; - uint32 Cost = _player->GetBarberShopCost(bs_hair->hair_id, Color, bs_facialHair->hair_id, bs_skinColor); + uint32 cost = _player->GetBarberShopCost(bs_hair->hair_id, Color, bs_facialHair->hair_id, bs_skinColor); // 0 - ok // 1, 3 - not enough money // 2 - you have to seat on barber chair - if (!_player->HasEnoughMoney(Cost)) + if (!_player->HasEnoughMoney((uint64)cost)) { WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4); data << uint32(1); // no money @@ -1406,8 +1406,8 @@ void WorldSession::HandleAlterAppearance(WorldPacket & recv_data) SendPacket(&data); } - _player->ModifyMoney(-int32(Cost)); // it isn't free - _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, Cost); + _player->ModifyMoney(-int64(cost)); // it isn't free + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, cost); _player->SetByteValue(PLAYER_BYTES, 2, uint8(bs_hair->hair_id)); _player->SetByteValue(PLAYER_BYTES, 3, uint8(Color)); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 9d91feabcf6..53862e99db9 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -396,13 +396,13 @@ void WorldSession::HandleGuildBankDepositMoney(WorldPacket & recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_DEPOSIT_MONEY)"); - uint64 GoGuid; - recv_data >> GoGuid; + uint64 goGuid; + recv_data >> goGuid; - uint32 money; + uint64 money; recv_data >> money; - if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK)) + if (GetPlayer()->GetGameObjectIfCanInteractWith(goGuid, GAMEOBJECT_TYPE_GUILD_BANK)) if (money && GetPlayer()->HasEnoughMoney(money)) if (Guild* guild = _GetPlayerGuild(this)) guild->HandleMemberDepositMoney(this, money); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 6a33238e750..bcb3601ee48 100755 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -624,7 +624,7 @@ void WorldSession::HandleBuybackItem(WorldPacket & recv_data) if (pItem) { uint32 price = _player->GetUInt32Value(PLAYER_FIELD_BUYBACK_PRICE_1 + slot - BUYBACK_SLOT_START); - if (!_player->HasEnoughMoney(price)) + if (!_player->HasEnoughMoney(uint64(price))) { _player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, pItem->GetEntry(), 0); return; @@ -934,7 +934,7 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& recvPacket) uint32 price = slotEntry->price; - if (!_player->HasEnoughMoney(price)) + if (!_player->HasEnoughMoney(uint64(price))) { data << uint32(ERR_BANKSLOT_INSUFFICIENT_FUNDS); SendPacket(&data); @@ -942,7 +942,7 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& recvPacket) } _player->SetBankBagSlotCount(slot); - _player->ModifyMoney(-int32(price)); + _player->ModifyMoney(-int64(price)); data << uint32(ERR_BANKSLOT_OK); SendPacket(&data); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 158fb9b8f55..ba6646a92f9 100755 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -105,7 +105,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data) uint32 cost = items_count ? 30 * items_count : 30; // price hardcoded in client - uint32 reqmoney = cost + money; + uint64 reqmoney = cost + uint64(money); if (!player->HasEnoughMoney(reqmoney) && !player->isGameMaster()) { @@ -439,7 +439,7 @@ void WorldSession::HandleMailTakeItem(WorldPacket & recv_data) } // prevent cheating with skip client money check - if (!player->HasEnoughMoney(m->COD)) + if (!player->HasEnoughMoney(uint64(m->COD))) { player->SendMailResult(mailId, MAIL_ITEM_TAKEN, MAIL_ERR_NOT_ENOUGH_MONEY); return; diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 4da8805614b..e9b070b2aa2 100755 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -277,10 +277,10 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket & recv_data) uint32 nSpellCost = uint32(floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit))); // check money requirement - if (!_player->HasEnoughMoney(nSpellCost)) + if (!_player->HasEnoughMoney(uint64(nSpellCost))) return; - _player->ModifyMoney(-int32(nSpellCost)); + _player->ModifyMoney(-int64(nSpellCost)); unit->SendPlaySpellVisual(179); // 53 SpellCastDirected unit->SendPlaySpellImpact(_player->GetGUID(), 362); // 113 EmoteSalute diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index 0c2f8741b15..b8e275f2990 100755 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -187,7 +187,7 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data) return; } - if (!_player->HasEnoughMoney(cost)) + if (!_player->HasEnoughMoney(uint64(cost))) { //player hasn't got enough money _player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, charterid, 0); return; diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index b2a89ed3021..c42ef3ef94a 100755 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -477,9 +477,9 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) } // update money - _player->ModifyMoney(-int32(my_trade->GetMoney())); + _player->ModifyMoney(-int64(my_trade->GetMoney())); _player->ModifyMoney(his_trade->GetMoney()); - trader->ModifyMoney(-int32(his_trade->GetMoney())); + trader->ModifyMoney(-int64(his_trade->GetMoney())); trader->ModifyMoney(my_trade->GetMoney()); if (my_spell) @@ -676,7 +676,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket) { - uint32 gold; + uint64 gold; recvPacket >> gold; TradeData* my_trade = _player->GetTradeData(); diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h index 63676e20be9..b4e5b9ddf48 100755 --- a/src/server/game/Mails/Mail.h +++ b/src/server/game/Mails/Mail.h @@ -123,8 +123,8 @@ class MailDraft public: // Accessors uint16 GetMailTemplateId() const { return m_mailTemplateId; } std::string const& GetSubject() const { return m_subject; } - uint32 GetMoney() const { return m_money; } - uint32 GetCOD() const { return m_COD; } + uint64 GetMoney() const { return m_money; } + uint64 GetCOD() const { return m_COD; } std::string const& GetBody() const { return m_body; } public: // modifiers @@ -172,8 +172,8 @@ struct Mail std::vector removedItems; time_t expire_time; time_t deliver_time; - uint32 money; - uint32 COD; + uint64 money; + uint64 COD; uint32 checked; MailState state; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 23d18e12097..f567dd2963b 100755 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1224,7 +1224,7 @@ void ScriptMgr::OnPlayerTalentsReset(Player* player, bool noCost) FOREACH_SCRIPT(PlayerScript)->OnTalentsReset(player, noCost); } -void ScriptMgr::OnPlayerMoneyChanged(Player* player, int32& amount) +void ScriptMgr::OnPlayerMoneyChanged(Player* player, int64& amount) { FOREACH_SCRIPT(PlayerScript)->OnMoneyChanged(player, amount); } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index b3d445af0c6..37a26d6e5c2 100755 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -684,7 +684,7 @@ class PlayerScript : public ScriptObject virtual void OnTalentsReset(Player* /*player*/, bool /*noCost*/) { } // Called when a player's money is modified (before the modification is done) - virtual void OnMoneyChanged(Player* /*player*/, int32& /*amount*/) { } + virtual void OnMoneyChanged(Player* /*player*/, int64& /*amount*/) { } // Called when a player gains XP (before anything is given) virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/) { } @@ -990,7 +990,7 @@ class ScriptMgr void OnPlayerLevelChanged(Player* player, uint8 oldLevel); void OnPlayerFreeTalentPointsChanged(Player* player, uint32 newPoints); void OnPlayerTalentsReset(Player* player, bool noCost); - void OnPlayerMoneyChanged(Player* player, int32& amount); + void OnPlayerMoneyChanged(Player* player, int64& amount); void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim); void OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental); void OnPlayerDuelRequest(Player* target, Player* challenger); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c725b6214e0..c2d7a96a397 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1080,7 +1080,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_LOOT_ITEM_NOTIFY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOOT_MASTER_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOOT_RELEASE_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 5b89abe3b24..183602b1124 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -774,11 +774,11 @@ void World::LoadConfigSettings(bool reload) sLog->outError("StartPlayerMoney (%i) must be in range 0..%u. Set to %u.", m_int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, 0); m_int_configs[CONFIG_START_PLAYER_MONEY] = 0; } - else if (m_int_configs[CONFIG_START_PLAYER_MONEY] > MAX_MONEY_AMOUNT) + else if (m_int_configs[CONFIG_START_PLAYER_MONEY] > 0x7FFFFFFF-1) // TODO: (See MAX_MONEY_AMOUNT) { sLog->outError("StartPlayerMoney (%i) must be in range 0..%u. Set to %u.", - m_int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, MAX_MONEY_AMOUNT); - m_int_configs[CONFIG_START_PLAYER_MONEY] = MAX_MONEY_AMOUNT; + m_int_configs[CONFIG_START_PLAYER_MONEY], 0x7FFFFFFF-1, 0x7FFFFFFF-1); + m_int_configs[CONFIG_START_PLAYER_MONEY] = 0x7FFFFFFF-1; } m_int_configs[CONFIG_MAX_HONOR_POINTS] = ConfigMgr::GetIntDefault("MaxHonorPoints", 75000); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 57d13fd2fa1..a227070895c 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -25,6 +25,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ObjectMgr.h" #include "Chat.h" +#include class modify_commandscript : public CommandScript { @@ -1002,13 +1003,13 @@ public: if (handler->HasLowerSecurity(target, 0)) return false; - int32 addmoney = atoi((char*)args); + int64 addmoney = atoll((char*)args); - uint32 moneyuser = target->GetMoney(); + uint64 moneyuser = target->GetMoney(); if (addmoney < 0) { - int32 newmoney = int32(moneyuser) + addmoney; + int64 newmoney = int32(moneyuser) + addmoney; sLog->outDetail(handler->GetTrinityString(LANG_CURRENT_MONEY), moneyuser, addmoney, newmoney); if (newmoney <= 0) diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 2afa80dd42c..a55fe2c7ffa 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -209,7 +209,7 @@ int32 DoLowUnlearnCost(Player* player) //blacksmith void ProcessCastaction(Player* player, Creature* creature, uint32 spellId, uint32 triggeredSpellId, int32 cost) { - if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney(cost)) + if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney((int64)cost)) { player->CastSpell(player, triggeredSpellId, true); player->ModifyMoney(-cost); @@ -347,11 +347,11 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui { if (EquippedOk(player, spellId)) { - if (player->HasEnoughMoney(cost)) + if (player->HasEnoughMoney(int64(cost))) { player->CastSpell(player, spellId, true); ProfessionUnlearnSpells(player, spellId); - player->ModifyMoney(-cost); + player->ModifyMoney(-int64(cost)); if (alternativeSpellId) creature->CastSpell(player, alternativeSpellId, true); } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 57a65423b6f..04b74122955 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1287,7 +1287,7 @@ public: case GOSSIP_OPTION_LEARNDUALSPEC: if (player->GetSpecsCount() == 1 && !(player->getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))) { - if (!player->HasEnoughMoney(10000000)) + if (!player->HasEnoughMoney(UI64LIT(10000000))) { player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); player->PlayerTalkClass->SendCloseGossip(); @@ -1295,7 +1295,7 @@ public: } else { - player->ModifyMoney(-10000000); + player->ModifyMoney(SI64LIT(-10000000)); // Cast spells that teach dual spec // Both are also ImplicitTarget self and must be cast by player @@ -2600,11 +2600,11 @@ public: } if (doSwitch) { - if (!player->HasEnoughMoney(EXP_COST)) + if (!player->HasEnoughMoney(uint64(EXP_COST))) player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); else if (noXPGain) { - player->ModifyMoney(-EXP_COST); + player->ModifyMoney(-int64(EXP_COST)); player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); } else if (!noXPGain) diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h index 259c60ade20..7a16f2a0eb3 100755 --- a/src/server/shared/Common.h +++ b/src/server/shared/Common.h @@ -116,7 +116,7 @@ #define I32FMT "%08I32X" #define I64FMT "%016I64X" #define snprintf _snprintf -#define atoll __atoi64 +#define atoll _atoi64 #define vsnprintf _vsnprintf #define finite(X) _finite(X) #define llabs _abs64 -- cgit v1.2.3 From 3577afcfaf32985ec2cd433d16056db4d2a546b2 Mon Sep 17 00:00:00 2001 From: Nay Date: Fri, 3 Aug 2012 18:54:37 +0100 Subject: Core/WorldSession: Bypass assigned handler restriction if .debug send opcode command is used --- src/server/game/Server/WorldSession.cpp | 11 +++++++---- src/server/game/Server/WorldSession.h | 2 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 518a3743d66..7e7d75b0428 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -181,7 +181,7 @@ uint32 WorldSession::GetGuidLow() const } /// Send a packet to the client -void WorldSession::SendPacket(WorldPacket const* packet) +void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/) { if (!m_Socket) return; @@ -192,10 +192,13 @@ void WorldSession::SendPacket(WorldPacket const* packet) return; } - if (!opcodeTable[packet->GetOpcode()]) + if (!forced) { - sLog->outError("Prevented sending disabled opcode %d (hex 0x%04X)", packet->GetOpcode(), packet->GetOpcode()); - return; + if (!opcodeTable[packet->GetOpcode()]) + { + sLog->outError("Prevented sending disabled opcode %d (hex 0x%04X)", packet->GetOpcode(), packet->GetOpcode()); + return; + } } #ifdef TRINITY_DEBUG diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5a8a8da04aa..c0b2fb7e12b 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -236,7 +236,7 @@ class WorldSession void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); void WriteMovementInfo(WorldPacket &data, MovementInfo* mi); - void SendPacket(WorldPacket const* packet); + void SendPacket(WorldPacket const* packet, bool forced = false); void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3); void SendNotification(uint32 string_id, ...); void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 6accc96260b..874c7ab81b0 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -416,7 +416,7 @@ public: } sLog->outDebug(LOG_FILTER_NETWORKIO, "Sending opcode %u", data.GetOpcode()); data.hexlike(); - player->GetSession()->SendPacket(&data); + player->GetSession()->SendPacket(&data, true); handler->PSendSysMessage(LANG_COMMAND_OPCODESENT, data.GetOpcode(), unit->GetName()); return true; } -- cgit v1.2.3 From 12307c7d06011b3d64271af4bd4dfc08c348d7d2 Mon Sep 17 00:00:00 2001 From: Nay Date: Fri, 3 Aug 2012 22:39:04 +0100 Subject: Whitespace is the root of all evil --- src/server/authserver/Server/AuthSocket.cpp | 4 ++-- src/server/game/AI/EventAI/CreatureEventAIMgr.cpp | 2 +- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 +- .../game/Battlegrounds/Zones/BattlegroundRV.cpp | 2 +- src/server/game/Chat/Chat.h | 2 +- src/server/game/Entities/Creature/GossipDef.cpp | 2 +- src/server/game/Entities/Item/Item.cpp | 6 +++--- src/server/game/Handlers/VoidStorageHandler.cpp | 8 ++++---- src/server/game/Miscellaneous/SharedDefines.h | 2 +- src/server/game/Scripting/ScriptSystem.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/scripts/Commands/cs_cast.cpp | 2 +- src/server/scripts/Commands/cs_guild.cpp | 2 +- .../MagistersTerrace/instance_magisters_terrace.cpp | 20 ++++++++++---------- src/server/scripts/EasternKingdoms/undercity.cpp | 10 +++++----- .../BattleForMountHyjal/hyjal_trash.cpp | 2 +- src/server/scripts/Kalimdor/ashenvale.cpp | 2 +- src/server/scripts/Kalimdor/azshara.cpp | 6 +++--- src/server/scripts/Kalimdor/azuremyst_isle.cpp | 4 ++-- src/server/scripts/Kalimdor/felwood.cpp | 4 ++-- .../SerpentShrine/boss_lady_vashj.cpp | 4 ++-- src/server/shared/AutoPtr.h | 2 +- src/server/worldserver/worldserver.conf.dist | 8 ++++---- 23 files changed, 50 insertions(+), 50 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp index 2537a93fe43..4e4965c526f 100755 --- a/src/server/authserver/Server/AuthSocket.cpp +++ b/src/server/authserver/Server/AuthSocket.cpp @@ -868,10 +868,10 @@ bool AuthSocket::_HandleRealmList() ++RealmListSize; } - + pkt << uint8(0x10); pkt << uint8(0x00); - + // make a ByteBuffer which stores the RealmList's size ByteBuffer RealmListSizeBuffer; diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp index a863f2f89cf..d95074d9052 100755 --- a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp @@ -211,7 +211,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() sLog->outErrorDb("CreatureEventAI: Event %u has script for non-existing creature entry (%u), skipping.", i, creature_id); continue; } - + // Only on the first script if (cInfo->AIName != "EventAI" && m_CreatureEventAI_Event_Map[creature_id].empty()) sLog->outErrorDb("Creature entry %u has EventAI scripts, but its AIName is not 'EventAI' - possible AI-mismatch?", temp.creature_id); diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 0d4fc458faa..8205c30dd1e 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -772,7 +772,7 @@ void BattlegroundMgr::CreateInitialBattlegrounds() } data.StartMaxDist = fields[9].GetFloat(); - + selectionWeight = fields[10].GetUInt8(); data.scriptId = sObjectMgr->GetScriptId(fields[11].GetCString()); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp index 6869a899305..2b8f5925265 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp @@ -245,6 +245,6 @@ void BattlegroundRV::TogglePillarCollision() gob->SendUpdateToPlayer(player); } } - + SetPillarCollision(!apply); } \ No newline at end of file diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index af06b4f760a..95f14bc2a3a 100755 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -123,7 +123,7 @@ class ChatHandler void SetSentErrorMessage(bool val){ sentErrorMessage = val; } static bool LoadCommandTable() { return load_command_table; } static void SetLoadCommandTable(bool val) { load_command_table = val; } - + // cs_character void HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel); diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 21c5aa38a19..e2f5ad99b78 100755 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -339,7 +339,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, uint64 npcGUID, data << uint32(quest->GetRequiredSpell()); // 4.x quest->BuildExtraQuestInfo(data, _session->GetPlayer()); - + data << uint32(QUEST_EMOTE_COUNT); for (uint8 i = 0; i < QUEST_EMOTE_COUNT; ++i) { diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 9c5d03f5440..4dff83ec4a5 100755 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1435,7 +1435,7 @@ uint32 Item::GetTransmogrifyCost() const { bool normalPrice; cost = GetSellPrice(normalPrice); - + if (!normalPrice) { if (proto->BuyCount <= 1) @@ -1452,9 +1452,9 @@ uint32 Item::GetTransmogrifyCost() const else cost = proto->SellPrice; } - + if (cost < 10000) cost = 10000; - + return cost; } diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index 5e3ecc89e21..d937656cf31 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -161,7 +161,7 @@ void WorldSession::HandleVoidStorageQuery(WorldPacket& recvData) itemData.WriteByteSeq(itemId[0]); itemData.WriteByteSeq(itemId[6]); itemData.WriteByteSeq(creatorGuid[0]); - + itemData << uint32(item->ItemRandomPropertyId); itemData.WriteByteSeq(itemId[4]); @@ -196,7 +196,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) npcGuid[1] = recvData.ReadBit(); uint32 countDeposit = recvData.ReadBits(26); - + if (countDeposit > 9) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) wants to deposit more than 9 items (%u).", player->GetGUIDLow(), player->GetName(), countDeposit); @@ -462,7 +462,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) data.WriteByteSeq(itemId[1]); data << uint32(depositItems[i].second); // slot - + data.WriteByteSeq(creatorGuid[2]); data.WriteByteSeq(itemId[7]); @@ -518,7 +518,7 @@ void WorldSession::HandleVoidSwapItem(WorldPacket& recvData) recvData.ReadByteSeq(npcGuid[7]); recvData.ReadByteSeq(npcGuid[4]); recvData.ReadByteSeq(itemId[7]); - + Creature* unit = player->GetNPCIfCanInteractWith(npcGuid, UNIT_NPC_FLAG_VAULTKEEPER); if (!unit) { diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index e17bbc0729f..bd3fffe47e4 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -3530,7 +3530,7 @@ enum TradeStatus // 28 - nonexistent TRADE_STATUS_TARGET_STUNNED = 29, // 30 - nonexistent - TRADE_STATUS_CLOSE_WINDOW = 31, + TRADE_STATUS_CLOSE_WINDOW = 31, }; enum XPColorChar diff --git a/src/server/game/Scripting/ScriptSystem.cpp b/src/server/game/Scripting/ScriptSystem.cpp index c38d559372f..e48404b0643 100755 --- a/src/server/game/Scripting/ScriptSystem.cpp +++ b/src/server/game/Scripting/ScriptSystem.cpp @@ -30,7 +30,7 @@ void SystemMgr::LoadScriptTexts() sLog->outString("TSCR: Loading Script Texts additional data..."); uint32 oldMSTime = getMSTime(); - + // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT entry, sound, type, language, emote FROM script_texts"); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 2e3ccf00e60..b280a59d1b4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1098,7 +1098,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_LOTTERY_RESULT_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_MEETINGSTONE_MEMBER_ADDED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_MEETINGSTONE_SETQUEUE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + //DEFINE_OPCODE_HANDLER(SMSG_MEETINGSTONE_SETQUEUE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_MINIGAME_MOVE_FAILED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index 33983411427..70cfb8cb830 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -33,7 +33,7 @@ public: ChatCommand* GetCommands() const { static ChatCommand castCommandTable[] = - { + { { "back", SEC_ADMINISTRATOR, false, &HandleCastBackCommand, "", NULL }, { "dist", SEC_ADMINISTRATOR, false, &HandleCastDistCommand, "", NULL }, { "self", SEC_ADMINISTRATOR, false, &HandleCastSelfCommand, "", NULL }, diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 65e3daaaebc..a453122aef6 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -51,7 +51,7 @@ public: }; return commandTable; } - + /** \brief GM command level 3 - Create a guild. * * This command allows a GM (level 3) to create a guild. diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index aa43cb3702f..6545509c0f1 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -218,25 +218,25 @@ public: { switch (identifier) { - case DATA_SELIN: + case DATA_SELIN: return SelinGUID; - case DATA_DELRISSA: + case DATA_DELRISSA: return DelrissaGUID; - case DATA_VEXALLUS_DOOR: + case DATA_VEXALLUS_DOOR: return VexallusDoorGUID; - case DATA_SELIN_DOOR: + case DATA_SELIN_DOOR: return SelinDoorGUID; - case DATA_SELIN_ENCOUNTER_DOOR: + case DATA_SELIN_ENCOUNTER_DOOR: return SelinEncounterDoorGUID; - case DATA_DELRISSA_DOOR: + case DATA_DELRISSA_DOOR: return DelrissaDoorGUID; - case DATA_KAEL_DOOR: + case DATA_KAEL_DOOR: return KaelDoorGUID; - case DATA_KAEL_STATUE_LEFT: + case DATA_KAEL_STATUE_LEFT: return KaelStatue[0]; - case DATA_KAEL_STATUE_RIGHT: + case DATA_KAEL_STATUE_RIGHT: return KaelStatue[1]; - case DATA_ESCAPE_ORB: + case DATA_ESCAPE_ORB: return EscapeOrbGUID; case DATA_FEL_CRYSTAL: diff --git a/src/server/scripts/EasternKingdoms/undercity.cpp b/src/server/scripts/EasternKingdoms/undercity.cpp index a9b627ded34..7649be59e40 100644 --- a/src/server/scripts/EasternKingdoms/undercity.cpp +++ b/src/server/scripts/EasternKingdoms/undercity.cpp @@ -173,13 +173,13 @@ public: if (me->GetDistance(victim) > 10.0f) DoCast(victim, SPELL_MULTI_SHOT); } else FadeTimer -= diff; - + if (SummonSkeletonTimer <= diff) { DoCast(me, SPELL_SUMMON_SKELETON); SummonSkeletonTimer = 20000 + rand()%10000; } else SummonSkeletonTimer -= diff; - + if (BlackArrowTimer <= diff) { if (Unit* victim = me->getVictim()) @@ -188,7 +188,7 @@ public: BlackArrowTimer = 15000 + rand()%5000; } } else BlackArrowTimer -= diff; - + if (ShotTimer <= diff) { if (Unit* victim = me->getVictim()) @@ -197,7 +197,7 @@ public: ShotTimer = 8000 + rand()%2000; } } else ShotTimer -= diff; - + if (MultiShotTimer <= diff) { if (Unit* victim = me->getVictim()) @@ -205,7 +205,7 @@ public: DoCast(victim, SPELL_MULTI_SHOT); MultiShotTimer = 10000 + rand()%3000; } - } else MultiShotTimer -= diff; + } else MultiShotTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index d3218e1729e..01c1617aba4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -38,7 +38,7 @@ enum Spells SPELL_BANSHEE_CURSE = 31651, SPELL_BANSHEE_WAIL = 38183, SPELL_ANTI_MAGIC_SHELL = 31662, - SPELL_WEB = 28991, + SPELL_WEB = 28991, SPELL_MANA_BURN = 31729, SPELL_FROST_BREATH = 31688, SPELL_GARGOYLE_STRIKE = 31664, diff --git a/src/server/scripts/Kalimdor/ashenvale.cpp b/src/server/scripts/Kalimdor/ashenvale.cpp index 9e8cdaa8b92..248932ecbb6 100644 --- a/src/server/scripts/Kalimdor/ashenvale.cpp +++ b/src/server/scripts/Kalimdor/ashenvale.cpp @@ -174,7 +174,7 @@ enum RuulSnowhoof NPC_THISTLEFUR_URSA = 3921, NPC_THISTLEFUR_TOTEMIC = 3922, NPC_THISTLEFUR_PATHFINDER = 3926, - + QUEST_FREEDOM_TO_RUUL = 6482, GO_CAGE = 178147 diff --git a/src/server/scripts/Kalimdor/azshara.cpp b/src/server/scripts/Kalimdor/azshara.cpp index eae5baa8db2..8d08c26f0a7 100644 --- a/src/server/scripts/Kalimdor/azshara.cpp +++ b/src/server/scripts/Kalimdor/azshara.cpp @@ -182,9 +182,9 @@ public: enum RizzleSprysprocketData { QUEST_CHASING_THE_MOONSTONE = 10994, - + MOB_DEPTH_CHARGE = 23025, - + SPELL_RIZZLE_BLACKJACK = 39865, SPELL_RIZZLE_ESCAPE = 39871, SPELL_RIZZLE_FROST_GRENADE = 40525, @@ -490,7 +490,7 @@ public: { if (WeMustDieTimer <= diff) me->DespawnOrUnsummon(); - else + else WeMustDieTimer -= diff; } return; diff --git a/src/server/scripts/Kalimdor/azuremyst_isle.cpp b/src/server/scripts/Kalimdor/azuremyst_isle.cpp index 608117ca9af..22686cac4b2 100644 --- a/src/server/scripts/Kalimdor/azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/azuremyst_isle.cpp @@ -549,7 +549,7 @@ public: (*itr)->Respawn(); } } - else + else sLog->outError("SD2 ERROR: FlagList is empty!"); } @@ -560,7 +560,7 @@ public: if (EventStarted) SayTimer = NextStep(Step++); } - else + else SayTimer -= diff; } }; diff --git a/src/server/scripts/Kalimdor/felwood.cpp b/src/server/scripts/Kalimdor/felwood.cpp index 9243ea0017e..1a0aa7b21c0 100644 --- a/src/server/scripts/Kalimdor/felwood.cpp +++ b/src/server/scripts/Kalimdor/felwood.cpp @@ -40,10 +40,10 @@ EndContentData */ enum RiverbreezeAndSilversky { SPELL_CENARION_BEACON = 15120, - + NPC_ARATHANDRIS_SILVERSKY = 9528, NPC_MAYBESS_RIVERBREEZE = 9529, - + QUEST_CLEASING_FELWOOD_A = 4101, QUEST_CLEASING_FELWOOD_H = 4102 }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 18d8b2b5a1e..e70157e5e4f 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -199,7 +199,7 @@ public: JustCreated = false; } else CanAttack = true; - + for (uint8 i = 0; i < 4; ++i) if (Unit* remo = Unit::GetUnit(*me, ShieldGeneratorChannel[i])) remo->setDeathState(JUST_DIED); @@ -353,7 +353,7 @@ public: // Static Charge // Used on random people (only 1 person at any given time) in Phases 1 and 3, it's a debuff doing 2775 to 3225 Nature damage to the target and everybody in about 5 yards around it, every 1 seconds for 30 seconds. It can be removed by Cloak of Shadows, Iceblock, Divine Shield, etc, but not by Cleanse or Dispel Magic. Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true); - if (target && !target->HasAura(SPELL_STATIC_CHARGE_TRIGGER)) + if (target && !target->HasAura(SPELL_STATIC_CHARGE_TRIGGER)) DoCast(target, SPELL_STATIC_CHARGE_TRIGGER); // cast Static Charge every 2 seconds for 20 seconds StaticChargeTimer = 10000+rand()%20000; diff --git a/src/server/shared/AutoPtr.h b/src/server/shared/AutoPtr.h index 988c46cc5a2..19f0680c267 100644 --- a/src/server/shared/AutoPtr.h +++ b/src/server/shared/AutoPtr.h @@ -27,7 +27,7 @@ namespace Trinity { public: AutoPtr() : ACE_Strong_Bound_Ptr() {} - + AutoPtr(Pointer* x) { ACE_Strong_Bound_Ptr::reset(x); diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 65ba2350775..71ec75ea678 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1490,7 +1490,7 @@ Warden.ClientCheckHoldOff = 30 # # Warden.ClientCheckFailAction # Description: Default action being taken if a client check failed. Actions can be -# overwritten for each single check via warden_action table in characters +# overwritten for each single check via warden_action table in characters # database. # Default: 0 - (Disabled, Logging only) # 1 - (Kick) @@ -2253,9 +2253,9 @@ Rate.MoveSpeed = 1 # # Rate.InstanceResetTime -# Description: Multiplier for the rate between global raid/heroic instance resets -# (dbc value). Higher value increases the time between resets, -# lower value lowers the time, you need clean instance_reset in +# Description: Multiplier for the rate between global raid/heroic instance resets +# (dbc value). Higher value increases the time between resets, +# lower value lowers the time, you need clean instance_reset in # characters db in order to let new values work. # Default: 1 -- cgit v1.2.3 From c6c9f7b58fc93b496fc393351b04293c2607a709 Mon Sep 17 00:00:00 2001 From: Nay Date: Sun, 5 Aug 2012 19:49:59 +0100 Subject: Scripts/Commands: remove reload item_set_names and locales_item_set_name --- sql/updates/world/2012_08_05_02_world_command.sql | 2 ++ src/server/scripts/Commands/cs_reload.cpp | 18 ------------------ 2 files changed, 2 insertions(+), 18 deletions(-) create mode 100644 sql/updates/world/2012_08_05_02_world_command.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_05_02_world_command.sql b/sql/updates/world/2012_08_05_02_world_command.sql new file mode 100644 index 00000000000..69fd621c457 --- /dev/null +++ b/sql/updates/world/2012_08_05_02_world_command.sql @@ -0,0 +1,2 @@ +DELETE FROM `command` WHERE `name` = 'reload locales_item_set_name'; +DELETE FROM `command` WHERE `name` = 'reload item_set_names'; diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 1c119fdef4c..db9a7bf7f53 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -102,7 +102,6 @@ public: { "gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadGossipMenuOptionCommand, "", NULL }, { "item_enchantment_template", SEC_ADMINISTRATOR, true, &HandleReloadItemEnchantementsCommand, "", NULL }, { "item_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesItemCommand, "", NULL }, - { "item_set_names", SEC_ADMINISTRATOR, true, &HandleReloadItemSetNamesCommand, "", NULL }, { "lfg_dungeon_rewards", SEC_ADMINISTRATOR, true, &HandleReloadLfgRewardsCommand, "", NULL }, { "locales_achievement_reward", SEC_ADMINISTRATOR, true, &HandleReloadLocalesAchievementRewardCommand, "", NULL }, { "locales_creature", SEC_ADMINISTRATOR, true, &HandleReloadLocalesCreatureCommand, "", NULL }, @@ -110,7 +109,6 @@ public: { "locales_gameobject", SEC_ADMINISTRATOR, true, &HandleReloadLocalesGameobjectCommand, "", NULL }, { "locales_gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadLocalesGossipMenuOptionCommand, "", NULL }, { "locales_item", SEC_ADMINISTRATOR, true, &HandleReloadLocalesItemCommand, "", NULL }, - { "locales_item_set_name", SEC_ADMINISTRATOR, true, &HandleReloadLocalesItemSetNameCommand, "", NULL }, { "locales_npc_text", SEC_ADMINISTRATOR, true, &HandleReloadLocalesNpcTextCommand, "", NULL }, { "locales_page_text", SEC_ADMINISTRATOR, true, &HandleReloadLocalesPageTextCommand, "", NULL }, { "locales_points_of_interest", SEC_ADMINISTRATOR, true, &HandleReloadLocalesPointsOfInterestCommand, "", NULL }, @@ -946,14 +944,6 @@ public: return true; } - static bool HandleReloadItemSetNamesCommand(ChatHandler* handler, const char* /*args*/) - { - sLog->outString("Re-Loading Item set names..."); - LoadRandomEnchantmentsTable(); - handler->SendGlobalGMSysMessage("DB table `item_set_names` reloaded."); - return true; - } - static bool HandleReloadGameObjectScriptsCommand(ChatHandler* handler, const char* args) { if (sScriptMgr->IsScriptScheduled()) @@ -1208,14 +1198,6 @@ public: return true; } - static bool HandleReloadLocalesItemSetNameCommand(ChatHandler* handler, const char* /*args*/) - { - sLog->outString("Re-Loading Locales Item set name... "); - sObjectMgr->LoadItemSetNameLocales(); - handler->SendGlobalGMSysMessage("DB table `locales_item_set_name` reloaded."); - return true; - } - static bool HandleReloadLocalesNpcTextCommand(ChatHandler* handler, const char* /*args*/) { sLog->outString("Re-Loading Locales NPC Text ... "); -- cgit v1.2.3 From 5b7b6e121cb3d1b6ee6ba19409b709fd73e0d80a Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 5 Aug 2012 17:33:29 -0500 Subject: Core/Misc: Fixed a crash in .modify money command. Fixed a mistake in the reforge handler --- src/server/game/Handlers/ItemHandler.cpp | 2 +- src/server/scripts/Commands/cs_modify.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index e961e285821..b17cff78d7d 100755 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1671,7 +1671,7 @@ void WorldSession::HandleReforgeItemOpcode(WorldPacket& recvData) return; } - if (player->HasEnoughMoney(uint64(item->GetSpecialPrice()))) // cheating + if (!player->HasEnoughMoney(uint64(item->GetSpecialPrice()))) // cheating { SendReforgeResult(false); return; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index a227070895c..fba1a9835f5 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1033,9 +1033,9 @@ public: } else { - handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, handler->GetNameLink(target).c_str()); + handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, uint32(addmoney), handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), addmoney); + (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), uint32(addmoney)); if (addmoney >=MAX_MONEY_AMOUNT) target->SetMoney(MAX_MONEY_AMOUNT); @@ -1043,7 +1043,7 @@ public: target->ModifyMoney(addmoney); } - sLog->outDetail(handler->GetTrinityString(LANG_NEW_MONEY), moneyuser, addmoney, target->GetMoney()); + sLog->outDetail(handler->GetTrinityString(LANG_NEW_MONEY), moneyuser, uint32(addmoney), target->GetMoney()); return true; } -- cgit v1.2.3 From b6206866417c83380a447c05221bc6d2796269af Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 6 Aug 2012 18:06:48 +0200 Subject: Compile fix for noob compilers --- src/server/scripts/Commands/cs_modify.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index fba1a9835f5..e602c490f8f 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1027,7 +1027,7 @@ public: handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(addmoney)); + (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), llabs(addmoney)); target->SetMoney(newmoney); } } -- cgit v1.2.3 From 81fc922b2ee239e88a4fb1a7ea16241937eb9d42 Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 6 Aug 2012 12:20:00 -0400 Subject: Core/Commands: change .modify money to only use int32 --- src/server/scripts/Commands/cs_modify.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index e602c490f8f..44b73c30a1b 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1003,7 +1003,7 @@ public: if (handler->HasLowerSecurity(target, 0)) return false; - int64 addmoney = atoll((char*)args); + int32 addmoney = atoi((char*)args); uint64 moneyuser = target->GetMoney(); @@ -1027,7 +1027,7 @@ public: handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), llabs(addmoney)); + (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(addmoney)); target->SetMoney(newmoney); } } -- cgit v1.2.3 From 9795498488852cedd83b0378e85a80ece46aa72f Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 6 Aug 2012 13:55:35 -0400 Subject: Core/Commands: missing change from previous commit --- src/server/scripts/Commands/cs_modify.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 44b73c30a1b..d7b5484ed64 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1040,7 +1040,7 @@ public: if (addmoney >=MAX_MONEY_AMOUNT) target->SetMoney(MAX_MONEY_AMOUNT); else - target->ModifyMoney(addmoney); + target->ModifyMoney(int64(addmoney)); } sLog->outDetail(handler->GetTrinityString(LANG_NEW_MONEY), moneyuser, uint32(addmoney), target->GetMoney()); -- cgit v1.2.3 From b72373f1ee45507c51e275cad185086be2d95655 Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 6 Aug 2012 19:11:30 +0100 Subject: Core/Creature: Add basehp3 to creature_classlevelstats --- sql/updates/world/2012_08_06_00_world_classlevelstats.sql | 7 +++++++ src/server/game/Entities/Creature/Creature.h | 4 ---- src/server/game/Globals/ObjectMgr.cpp | 6 +++--- src/server/game/Miscellaneous/SharedDefines.h | 2 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- 5 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 sql/updates/world/2012_08_06_00_world_classlevelstats.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_06_00_world_classlevelstats.sql b/sql/updates/world/2012_08_06_00_world_classlevelstats.sql new file mode 100644 index 00000000000..e6038374508 --- /dev/null +++ b/sql/updates/world/2012_08_06_00_world_classlevelstats.sql @@ -0,0 +1,7 @@ +ALTER TABLE `creature_classlevelstats` ADD `basehp3` smallint(6) NOT NULL DEFAULT '1' AFTER `basehp2`; + +ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` smallint(6) NOT NULL DEFAULT '1'; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 1824e2c1b44..dc1cee2e28f 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -177,10 +177,6 @@ struct CreatureTemplate // Benchmarked: Faster than std::map (insert/find) typedef UNORDERED_MAP CreatureTemplateContainer; -// Represents max amount of expansions. -// TODO: Update to Cata, if required -#define MAX_CREATURE_BASE_HP MAX_EXPANSION - 1 - // Defines base stats for creatures (used to calculate HP/mana/armor). struct CreatureBaseStats { diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 7c337f22ca0..2bb0b509e93 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -859,13 +859,13 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) const_cast(cInfo)->scale = 1.0f; } - if (cInfo->expansion > MAX_EXPANSION) + if (cInfo->expansion > MAX_CREATURE_BASE_HP) { sLog->outErrorDb("Table `creature_template` lists creature (Entry: %u) with `exp` %u. Ignored and set to 0.", cInfo->Entry, cInfo->expansion); const_cast(cInfo)->expansion = 0; } - if (cInfo->expansionUnknown > MAX_EXPANSION) + if (cInfo->expansionUnknown > MAX_CREATURE_BASE_HP) { sLog->outErrorDb("Table `creature_template` lists creature (Entry: %u) with `exp_unk` %u. Ignored and set to 0.", cInfo->Entry, cInfo->expansionUnknown); const_cast(cInfo)->expansionUnknown = 0; @@ -8489,7 +8489,7 @@ void ObjectMgr::LoadCreatureClassLevelStats() { uint32 oldMSTime = getMSTime(); - QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor FROM creature_classlevelstats"); + QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basehp3, basemana, basearmor FROM creature_classlevelstats"); if (!result) { diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index bd3fffe47e4..13225985644 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -22,7 +22,7 @@ #include "Define.h" #include -#define MAX_EXPANSION 4 +#define MAX_CREATURE_BASE_HP 4 enum SpellEffIndex { diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 874c7ab81b0..c6bbe883a0e 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1325,7 +1325,7 @@ public: { Player* player = handler->GetSession()->GetPlayer(); - sLog->outSQLDev("(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); + sLog->outSQLDev("(@PATH, XX, %.3f, %.3f, %.5f, 0, 0, 0, 100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); handler->PSendSysMessage("Waypoint SQL written to SQL Developer log"); return true; -- cgit v1.2.3 From 7770c820979ef1f49e8b5056efb780cd676e66c8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 6 Aug 2012 23:00:57 +0200 Subject: Core/Items: Finished reforging (mostly by subv) --- src/server/game/DataStores/DBCStructure.h | 4 +- src/server/game/Entities/Item/Item.cpp | 65 ++++++- src/server/game/Entities/Item/Item.h | 2 + src/server/game/Entities/Player/Player.cpp | 274 ++++++++++++++++++++++++++++- src/server/game/Entities/Player/Player.h | 1 + src/server/game/Handlers/ItemHandler.cpp | 18 +- src/server/scripts/Spells/spell_rogue.cpp | 3 + 7 files changed, 355 insertions(+), 12 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 6cb013bec50..5e841a2f78b 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1204,10 +1204,10 @@ struct ItemPriceBaseEntry struct ItemReforgeEntry { uint32 Id; - uint32 FinalStat; - float FinalMultiplier; uint32 SourceStat; float SourceMultiplier; + uint32 FinalStat; + float FinalMultiplier; }; // common struct for: diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index f0cd629b5e3..3dae2aa581c 100755 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -644,8 +644,8 @@ void Item::SetItemRandomProperties(int32 randomPropId) SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, item_rand->ID); SetState(ITEM_CHANGED, GetOwner()); } - for (uint32 i = PROP_ENCHANTMENT_SLOT_2; i < PROP_ENCHANTMENT_SLOT_2 + 3; ++i) - SetEnchantment(EnchantmentSlot(i), item_rand->enchant_id[i - PROP_ENCHANTMENT_SLOT_2], 0, 0); + for (uint32 i = PROP_ENCHANTMENT_SLOT_1; i < PROP_ENCHANTMENT_SLOT_1 + 3; ++i) + SetEnchantment(EnchantmentSlot(i), item_rand->enchant_id[i - PROP_ENCHANTMENT_SLOT_1], 0, 0); } } else @@ -661,7 +661,7 @@ void Item::SetItemRandomProperties(int32 randomPropId) SetState(ITEM_CHANGED, GetOwner()); } - for (uint32 i = PROP_ENCHANTMENT_SLOT_0; i < PROP_ENCHANTMENT_SLOT_0 + 3; ++i) + for (uint32 i = PROP_ENCHANTMENT_SLOT_0; i <= PROP_ENCHANTMENT_SLOT_4; ++i) SetEnchantment(EnchantmentSlot(i), item_rand->enchant_id[i - PROP_ENCHANTMENT_SLOT_0], 0, 0); } } @@ -781,10 +781,15 @@ bool Item::HasEnchantRequiredSkill(const Player* player) const { // Check all enchants for required skill for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + { + if (enchant_slot > PRISMATIC_ENCHANTMENT_SLOT || enchant_slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) if (enchantEntry->requiredSkill && player->GetSkillValue(enchantEntry->requiredSkill) < enchantEntry->requiredSkillValue) return false; + } return true; } @@ -795,10 +800,15 @@ uint32 Item::GetEnchantRequiredLevel() const // Check all enchants for required level for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + { + if (enchant_slot > PRISMATIC_ENCHANTMENT_SLOT || enchant_slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) if (enchantEntry->requiredLevel > level) level = enchantEntry->requiredLevel; + } return level; } @@ -807,10 +817,16 @@ bool Item::IsBoundByEnchant() const { // Check all enchants for soulbound for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + { + if (enchant_slot > PRISMATIC_ENCHANTMENT_SLOT || enchant_slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) if (enchantEntry->slot & ENCHANTMENT_CAN_SOULBOUND) return true; + } + return false; } @@ -1458,3 +1474,46 @@ uint32 Item::GetSpecialPrice(uint32 minimumPrice) const return cost; } + +int32 Item::GetReforgableStat(ItemModType statType) const +{ + ItemTemplate const* proto = GetTemplate(); + for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) + if (proto->ItemStat[i].ItemStatType == statType) + return proto->ItemStat[i].ItemStatValue; + + int32 randomPropId = GetItemRandomPropertyId(); + if (!randomPropId) + return 0; + + if (randomPropId < 0) + { + ItemRandomSuffixEntry const* randomSuffix = sItemRandomSuffixStore.LookupEntry(-randomPropId); + if (!randomSuffix) + return 0; + + for (uint32 e = PROP_ENCHANTMENT_SLOT_0; e <= PROP_ENCHANTMENT_SLOT_4; ++e) + if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(GetEnchantmentId(EnchantmentSlot(e)))) + for (uint32 f = 0; f < MAX_ITEM_ENCHANTMENT_EFFECTS; ++f) + if (enchant->type[f] == ITEM_ENCHANTMENT_TYPE_STAT && enchant->spellid[f] == statType) + for (int k = 0; k < 5; ++k) + if (randomSuffix->enchant_id[k] == enchant->ID) + return int32((randomSuffix->prefix[k] * GetItemSuffixFactor()) / 10000); + } + else + { + ItemRandomPropertiesEntry const* randomProp = sItemRandomPropertiesStore.LookupEntry(randomPropId); + if (!randomProp) + return 0; + + for (uint32 e = PROP_ENCHANTMENT_SLOT_0; e <= PROP_ENCHANTMENT_SLOT_4; ++e) + if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(GetEnchantmentId(EnchantmentSlot(e)))) + for (uint32 f = 0; f < MAX_ITEM_ENCHANTMENT_EFFECTS; ++f) + if (enchant->type[f] == ITEM_ENCHANTMENT_TYPE_STAT && enchant->spellid[f] == statType) + for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k) + if (randomProp->enchant_id[k] == enchant->ID) + return int32(enchant->amount[k]); + } + + return 0; +} diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index e8bf234c591..5b86d55f170 100755 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -361,6 +361,8 @@ class Item : public Object uint32 GetSellPrice(bool& success) const; + int32 GetReforgableStat(ItemModType statType) const; + private: std::string m_text; uint8 m_slot; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3f40b0b5346..412e136d8d2 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8423,6 +8423,9 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 // item combat enchantments for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot) { + if (e_slot > PRISMATIC_ENCHANTMENT_SLOT || e_slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot)); SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); if (!pEnchant) @@ -8545,6 +8548,9 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 // Item enchantments spells casted at use for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot) { + if (e_slot > PRISMATIC_ENCHANTMENT_SLOT || e_slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot)); SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); if (!pEnchant) @@ -13240,6 +13246,9 @@ void Player::AddEnchantmentDurations(Item* item) { for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x) { + if (x > PRISMATIC_ENCHANTMENT_SLOT || x < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + if (!item->GetEnchantmentId(EnchantmentSlot(x))) continue; @@ -13334,10 +13343,257 @@ void Player::AddEnchantmentDuration(Item* item, EnchantmentSlot slot, uint32 dur } } +void Player::ApplyReforgeEnchantment(Item* item, bool apply) +{ + if (!item) + return; + + ItemReforgeEntry const* reforge = sItemReforgeStore.LookupEntry(item->GetEnchantmentId(REFORGE_ENCHANTMENT_SLOT)); + if (!reforge) + return; + + ItemTemplate const* proto = item->GetTemplate(); + + float removeValue = item->GetReforgableStat(ItemModType(reforge->SourceStat)) * reforge->SourceMultiplier; + float addValue = removeValue * reforge->FinalMultiplier; + + switch (reforge->SourceStat) + { + case ITEM_MOD_MANA: + HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, -removeValue, apply); + break; + case ITEM_MOD_HEALTH: + HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, -removeValue, apply); + break; + case ITEM_MOD_AGILITY: + HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, -removeValue, apply); + ApplyStatBuffMod(STAT_AGILITY, -removeValue, apply); + break; + case ITEM_MOD_STRENGTH: + HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, -removeValue, apply); + ApplyStatBuffMod(STAT_STRENGTH, -removeValue, apply); + break; + case ITEM_MOD_INTELLECT: + HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, -removeValue, apply); + ApplyStatBuffMod(STAT_INTELLECT, -removeValue, apply); + break; + case ITEM_MOD_SPIRIT: + HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, -removeValue, apply); + ApplyStatBuffMod(STAT_SPIRIT, -removeValue, apply); + break; + case ITEM_MOD_STAMINA: + HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, -removeValue, apply); + ApplyStatBuffMod(STAT_STAMINA, -removeValue, apply); + break; + case ITEM_MOD_DEFENSE_SKILL_RATING: + ApplyRatingMod(CR_DEFENSE_SKILL, -int32(removeValue), apply); + break; + case ITEM_MOD_DODGE_RATING: + ApplyRatingMod(CR_DODGE, -int32(removeValue), apply); + break; + case ITEM_MOD_PARRY_RATING: + ApplyRatingMod(CR_PARRY, -int32(removeValue), apply); + break; + case ITEM_MOD_BLOCK_RATING: + ApplyRatingMod(CR_BLOCK, -int32(removeValue), apply); + break; + case ITEM_MOD_HIT_MELEE_RATING: + ApplyRatingMod(CR_HIT_MELEE, -int32(removeValue), apply); + break; + case ITEM_MOD_HIT_RANGED_RATING: + ApplyRatingMod(CR_HIT_RANGED, -int32(removeValue), apply); + break; + case ITEM_MOD_HIT_SPELL_RATING: + ApplyRatingMod(CR_HIT_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_CRIT_MELEE_RATING: + ApplyRatingMod(CR_CRIT_MELEE, -int32(removeValue), apply); + break; + case ITEM_MOD_CRIT_RANGED_RATING: + ApplyRatingMod(CR_CRIT_RANGED, -int32(removeValue), apply); + break; + case ITEM_MOD_CRIT_SPELL_RATING: + ApplyRatingMod(CR_CRIT_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_HASTE_SPELL_RATING: + ApplyRatingMod(CR_HASTE_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_HIT_RATING: + ApplyRatingMod(CR_HIT_MELEE, -int32(removeValue), apply); + ApplyRatingMod(CR_HIT_RANGED, -int32(removeValue), apply); + ApplyRatingMod(CR_HIT_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_CRIT_RATING: + ApplyRatingMod(CR_CRIT_MELEE, -int32(removeValue), apply); + ApplyRatingMod(CR_CRIT_RANGED, -int32(removeValue), apply); + ApplyRatingMod(CR_CRIT_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_RESILIENCE_RATING: + ApplyRatingMod(CR_CRIT_TAKEN_MELEE, -int32(removeValue), apply); + ApplyRatingMod(CR_CRIT_TAKEN_RANGED, -int32(removeValue), apply); + ApplyRatingMod(CR_CRIT_TAKEN_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_HASTE_RATING: + ApplyRatingMod(CR_HASTE_MELEE, -int32(removeValue), apply); + ApplyRatingMod(CR_HASTE_RANGED, -int32(removeValue), apply); + ApplyRatingMod(CR_HASTE_SPELL, -int32(removeValue), apply); + break; + case ITEM_MOD_EXPERTISE_RATING: + ApplyRatingMod(CR_EXPERTISE, -int32(removeValue), apply); + break; + case ITEM_MOD_ATTACK_POWER: + HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, -removeValue, apply); + HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, -removeValue, apply); + break; + case ITEM_MOD_RANGED_ATTACK_POWER: + HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, -removeValue, apply); + break; + case ITEM_MOD_MANA_REGENERATION: + ApplyManaRegenBonus(-int32(removeValue), apply); + break; + case ITEM_MOD_ARMOR_PENETRATION_RATING: + ApplyRatingMod(CR_ARMOR_PENETRATION, -int32(removeValue), apply); + break; + case ITEM_MOD_SPELL_POWER: + ApplySpellPowerBonus(-int32(removeValue), apply); + break; + case ITEM_MOD_HEALTH_REGEN: + ApplyHealthRegenBonus(-int32(removeValue), apply); + break; + case ITEM_MOD_SPELL_PENETRATION: + ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, -int32(removeValue), apply); + m_spellPenetrationItemMod += apply ? -int32(removeValue) : int32(removeValue); + break; + case ITEM_MOD_BLOCK_VALUE: + HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, -removeValue, apply); + break; + } + + switch (reforge->FinalStat) + { + case ITEM_MOD_MANA: + HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, addValue, apply); + break; + case ITEM_MOD_HEALTH: + HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, addValue, apply); + break; + case ITEM_MOD_AGILITY: + HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, addValue, apply); + ApplyStatBuffMod(STAT_AGILITY, addValue, apply); + break; + case ITEM_MOD_STRENGTH: + HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, addValue, apply); + ApplyStatBuffMod(STAT_STRENGTH, addValue, apply); + break; + case ITEM_MOD_INTELLECT: + HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, addValue, apply); + ApplyStatBuffMod(STAT_INTELLECT, addValue, apply); + break; + case ITEM_MOD_SPIRIT: + HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, addValue, apply); + ApplyStatBuffMod(STAT_SPIRIT, addValue, apply); + break; + case ITEM_MOD_STAMINA: + HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, addValue, apply); + ApplyStatBuffMod(STAT_STAMINA, addValue, apply); + break; + case ITEM_MOD_DEFENSE_SKILL_RATING: + ApplyRatingMod(CR_DEFENSE_SKILL, int32(addValue), apply); + break; + case ITEM_MOD_DODGE_RATING: + ApplyRatingMod(CR_DODGE, int32(addValue), apply); + break; + case ITEM_MOD_PARRY_RATING: + ApplyRatingMod(CR_PARRY, int32(addValue), apply); + break; + case ITEM_MOD_BLOCK_RATING: + ApplyRatingMod(CR_BLOCK, int32(addValue), apply); + break; + case ITEM_MOD_HIT_MELEE_RATING: + ApplyRatingMod(CR_HIT_MELEE, int32(addValue), apply); + break; + case ITEM_MOD_HIT_RANGED_RATING: + ApplyRatingMod(CR_HIT_RANGED, int32(addValue), apply); + break; + case ITEM_MOD_HIT_SPELL_RATING: + ApplyRatingMod(CR_HIT_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_CRIT_MELEE_RATING: + ApplyRatingMod(CR_CRIT_MELEE, int32(addValue), apply); + break; + case ITEM_MOD_CRIT_RANGED_RATING: + ApplyRatingMod(CR_CRIT_RANGED, int32(addValue), apply); + break; + case ITEM_MOD_CRIT_SPELL_RATING: + ApplyRatingMod(CR_CRIT_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_HASTE_SPELL_RATING: + ApplyRatingMod(CR_HASTE_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_HIT_RATING: + ApplyRatingMod(CR_HIT_MELEE, int32(addValue), apply); + ApplyRatingMod(CR_HIT_RANGED, int32(addValue), apply); + ApplyRatingMod(CR_HIT_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_CRIT_RATING: + ApplyRatingMod(CR_CRIT_MELEE, int32(addValue), apply); + ApplyRatingMod(CR_CRIT_RANGED, int32(addValue), apply); + ApplyRatingMod(CR_CRIT_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_RESILIENCE_RATING: + ApplyRatingMod(CR_CRIT_TAKEN_MELEE, int32(addValue), apply); + ApplyRatingMod(CR_CRIT_TAKEN_RANGED, int32(addValue), apply); + ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_HASTE_RATING: + ApplyRatingMod(CR_HASTE_MELEE, int32(addValue), apply); + ApplyRatingMod(CR_HASTE_RANGED, int32(addValue), apply); + ApplyRatingMod(CR_HASTE_SPELL, int32(addValue), apply); + break; + case ITEM_MOD_EXPERTISE_RATING: + ApplyRatingMod(CR_EXPERTISE, int32(addValue), apply); + break; + case ITEM_MOD_ATTACK_POWER: + HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, addValue, apply); + HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, addValue, apply); + break; + case ITEM_MOD_RANGED_ATTACK_POWER: + HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, addValue, apply); + break; + case ITEM_MOD_MANA_REGENERATION: + ApplyManaRegenBonus(int32(addValue), apply); + break; + case ITEM_MOD_ARMOR_PENETRATION_RATING: + ApplyRatingMod(CR_ARMOR_PENETRATION, int32(addValue), apply); + break; + case ITEM_MOD_SPELL_POWER: + ApplySpellPowerBonus(int32(addValue), apply); + break; + case ITEM_MOD_HEALTH_REGEN: + ApplyHealthRegenBonus(int32(addValue), apply); + break; + case ITEM_MOD_SPELL_PENETRATION: + ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, int32(addValue), apply); + m_spellPenetrationItemMod += apply ? int32(addValue) : -int32(addValue); + break; + case ITEM_MOD_BLOCK_VALUE: + HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, addValue, apply); + break; + } +} + void Player::ApplyEnchantment(Item* item, bool apply) { for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot) + { + // Apply reforge as last enchant + if (slot == REFORGE_ENCHANTMENT_SLOT) + continue; + ApplyEnchantment(item, EnchantmentSlot(slot), apply); + } + + ApplyEnchantment(item, REFORGE_ENCHANTMENT_SLOT, apply); } void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool apply_dur, bool ignore_condition) @@ -13348,6 +13604,15 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool if (slot >= MAX_ENCHANTMENT_SLOT) return; + if (slot == TRANSMOGRIFY_ENCHANTMENT_SLOT) + return; + + if (slot == REFORGE_ENCHANTMENT_SLOT) + { + ApplyReforgeEnchantment(item, apply); + return; + } + uint32 enchant_id = item->GetEnchantmentId(slot); if (!enchant_id) return; @@ -13411,13 +13676,13 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool { int32 basepoints = 0; // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor) - if (item->GetItemRandomPropertyId()) + if (item->GetItemRandomPropertyId() < 0) { ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId())); if (item_rand) { // Search enchant_amount - for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k) + for (int k = 0; k < 5; ++k) { if (item_rand->enchant_id[k] == enchant_id) { @@ -13463,7 +13728,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId())); if (item_rand_suffix) { - for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k) + for (int k = 0; k < 5; ++k) { if (item_rand_suffix->enchant_id[k] == enchant_id) { @@ -13720,6 +13985,9 @@ void Player::UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 { for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot) { + if (slot > PRISMATIC_ENCHANTMENT_SLOT || slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot)); if (!ench_id) continue; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index e8dde100473..e192c88b2c2 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1393,6 +1393,7 @@ class Player : public Unit, public GridObject void AddEnchantmentDuration(Item* item, EnchantmentSlot slot, uint32 duration); void ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool apply_dur = true, bool ignore_condition = false); void ApplyEnchantment(Item* item, bool apply); + void ApplyReforgeEnchantment(Item* item, bool apply); void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value); void SendEnchantmentDurations(); void BuildEnchantmentsInfoData(WorldPacket* data); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 31720266ff0..6a8cc5b1c5f 100755 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -688,7 +688,7 @@ void WorldSession::HandleBuyItemOpcode(WorldPacket& recvData) uint32 item, slot, count; uint8 itemType; // 1 = item, 2 = currency (not implemented) uint8 bagSlot; - + recvData >> vendorguid >> itemType >> item >> slot >> count >> bagGuid >> bagSlot; // client expects count starting at 1, and we send vendorslot+1 to client already @@ -1216,7 +1216,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) // tried to put meta gem in normal socket if (itemProto->Socket[i].Color != SOCKET_COLOR_META && GemProps[i]->color == SOCKET_COLOR_META) return; - + // tried to put normal gem in cogwheel socket if (itemProto->Socket[i].Color == SOCKET_COLOR_COGWHEEL && GemProps[i]->color != SOCKET_COLOR_COGWHEEL) return; @@ -1667,18 +1667,27 @@ void WorldSession::HandleReforgeItemOpcode(WorldPacket& recvData) if (!reforgeEntry) { // Reset the item + if (item->IsEquipped()) + player->ApplyReforgeEnchantment(item, false); item->ClearEnchantment(REFORGE_ENCHANTMENT_SLOT); SendReforgeResult(true); return; } - if (!sItemReforgeStore.LookupEntry(reforgeEntry)) + ItemReforgeEntry const* stats = sItemReforgeStore.LookupEntry(reforgeEntry); + if (!stats) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleReforgeItemOpcode - Player (Guid: %u Name: %s) tried to reforge an item with invalid reforge entry (%u).", player->GetGUIDLow(), player->GetName(), reforgeEntry); SendReforgeResult(false); return; } + if (!item->GetReforgableStat(ItemModType(stats->SourceStat)) || item->GetReforgableStat(ItemModType(stats->FinalStat))) // Cheating, you cant reforge to a stat that the item already has, nor reforge from a stat that the item does not have + { + SendReforgeResult(false); + return; + } + if (!player->HasEnoughMoney(uint64(item->GetSpecialPrice()))) // cheating { SendReforgeResult(false); @@ -1691,5 +1700,6 @@ void WorldSession::HandleReforgeItemOpcode(WorldPacket& recvData) SendReforgeResult(true); - // ToDo: Apply and remove the destination/source stats to the player + if (item->IsEquipped()) + player->ApplyReforgeEnchantment(item, true); } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 3a4132f62fe..0fc30420d35 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -338,6 +338,9 @@ class spell_rog_deadly_poison : public SpellScriptLoader // item combat enchantments for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot) { + if (slot > PRISMATIC_ENCHANTMENT_SLOT || slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id + continue; + SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot))); if (!enchant) continue; -- cgit v1.2.3 From a781555f94623072bf61044ee444fbc7a464d12a Mon Sep 17 00:00:00 2001 From: Nay Date: Wed, 8 Aug 2012 03:11:10 +0100 Subject: Core&DB/NPCs: Add an extra field for mana_mod in creature_template (for proper mana calculations) This field is usually 2 for a small group of creatures with double mana --- .../2012_08_08_00_world_creature_template.sql | 1 + src/server/game/Entities/Creature/Creature.h | 3 ++- src/server/game/Globals/ObjectMgr.cpp | 27 ++++++++++---------- src/server/scripts/Commands/cs_reload.cpp | 29 +++++++++++----------- .../Database/Implementation/WorldDatabase.cpp | 2 +- 5 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 sql/updates/world/2012_08_08_00_world_creature_template.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_08_00_world_creature_template.sql b/sql/updates/world/2012_08_08_00_world_creature_template.sql new file mode 100644 index 00000000000..1e934b9f612 --- /dev/null +++ b/sql/updates/world/2012_08_08_00_world_creature_template.sql @@ -0,0 +1 @@ +ALTER TABLE `creature_template` ADD `Mana_mod_extra` float NOT NULL DEFAULT '1' AFTER `Mana_mod`; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index dc1cee2e28f..f58e49b9e14 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -139,6 +139,7 @@ struct CreatureTemplate float HoverHeight; float ModHealth; float ModMana; + float ModManaExtra; // Added in 4.x, this value is usually 2 for a small group of creatures with double mana float ModArmor; bool RacialLeader; uint32 questItems[MAX_CREATURE_QUEST_ITEMS]; @@ -197,7 +198,7 @@ struct CreatureBaseStats if (!BaseMana) return 0; - return uint32((BaseMana * info->ModMana) + 0.5f); + return uint32((BaseMana * info->ModMana * info->ModManaExtra) + 0.5f); } uint32 GenerateArmor(CreatureTemplate const* info) const diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 81fb8ad9646..c1fe89fa86b 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -380,9 +380,9 @@ void ObjectMgr::LoadCreatureTemplates() "type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, " // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " - // 69 70 71 72 73 74 75 76 77 78 79 - "InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, " - // 80 81 82 83 84 85 86 + // 69 70 71 72 73 74 75 76 77 78 79 80 + "InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, " + // 81 82 83 84 85 86 87 " questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); @@ -472,18 +472,19 @@ void ObjectMgr::LoadCreatureTemplates() creatureTemplate.HoverHeight = fields[70].GetFloat(); creatureTemplate.ModHealth = fields[71].GetFloat(); creatureTemplate.ModMana = fields[72].GetFloat(); - creatureTemplate.ModArmor = fields[73].GetFloat(); - creatureTemplate.RacialLeader = fields[74].GetBool(); + creatureTemplate.ModManaExtra = fields[73].GetFloat(); + creatureTemplate.ModArmor = fields[74].GetFloat(); + creatureTemplate.RacialLeader = fields[75].GetBool(); for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - creatureTemplate.questItems[i] = fields[75 + i].GetUInt32(); - - creatureTemplate.movementId = fields[81].GetUInt32(); - creatureTemplate.RegenHealth = fields[82].GetBool(); - creatureTemplate.equipmentId = fields[83].GetUInt32(); - creatureTemplate.MechanicImmuneMask = fields[84].GetUInt32(); - creatureTemplate.flags_extra = fields[85].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[86].GetCString()); + creatureTemplate.questItems[i] = fields[76 + i].GetUInt32(); + + creatureTemplate.movementId = fields[82].GetUInt32(); + creatureTemplate.RegenHealth = fields[83].GetBool(); + creatureTemplate.equipmentId = fields[84].GetUInt32(); + creatureTemplate.MechanicImmuneMask = fields[85].GetUInt32(); + creatureTemplate.flags_extra = fields[86].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[87].GetCString()); ++count; } diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 93b450bab0f..40b36fb8d52 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -501,20 +501,21 @@ public: cInfo->HoverHeight = fields[67].GetFloat(); cInfo->ModHealth = fields[68].GetFloat(); cInfo->ModMana = fields[69].GetFloat(); - cInfo->ModArmor = fields[70].GetFloat(); - cInfo->RacialLeader = fields[71].GetBool(); - cInfo->questItems[0] = fields[72].GetUInt32(); - cInfo->questItems[1] = fields[73].GetUInt32(); - cInfo->questItems[2] = fields[74].GetUInt32(); - cInfo->questItems[3] = fields[75].GetUInt32(); - cInfo->questItems[4] = fields[76].GetUInt32(); - cInfo->questItems[5] = fields[77].GetUInt32(); - cInfo->movementId = fields[78].GetUInt32(); - cInfo->RegenHealth = fields[79].GetBool(); - cInfo->equipmentId = fields[80].GetUInt32(); - cInfo->MechanicImmuneMask = fields[81].GetUInt32(); - cInfo->flags_extra = fields[82].GetUInt32(); - cInfo->ScriptID = sObjectMgr->GetScriptId(fields[83].GetCString()); + cInfo->ModManaExtra = fields[70].GetFloat(); + cInfo->ModArmor = fields[71].GetFloat(); + cInfo->RacialLeader = fields[72].GetBool(); + cInfo->questItems[0] = fields[73].GetUInt32(); + cInfo->questItems[1] = fields[74].GetUInt32(); + cInfo->questItems[2] = fields[75].GetUInt32(); + cInfo->questItems[3] = fields[76].GetUInt32(); + cInfo->questItems[4] = fields[77].GetUInt32(); + cInfo->questItems[5] = fields[78].GetUInt32(); + cInfo->movementId = fields[79].GetUInt32(); + cInfo->RegenHealth = fields[80].GetBool(); + cInfo->equipmentId = fields[81].GetUInt32(); + cInfo->MechanicImmuneMask = fields[82].GetUInt32(); + cInfo->flags_extra = fields[83].GetUInt32(); + cInfo->ScriptID = sObjectMgr->GetScriptId(fields[84].GetCString()); sObjectMgr->CheckCreatureTemplate(cInfo); } diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index 872d9ec415c..fe2a9f7906c 100755 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -78,7 +78,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); - PREPARE_STATEMENT(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); -- cgit v1.2.3 From 7249992e28c6bf322bdfca9c4f037a22a06a3827 Mon Sep 17 00:00:00 2001 From: Nay Date: Wed, 8 Aug 2012 03:42:48 +0100 Subject: DB: Rename characters' void_storage to character_void_storage Core: Fix build (/slap subv) Also proper names for sql files --- sql/base/characters_database.sql | 60 +++++++++++----------- .../2012_07_10_00_characters_character_glyphs.sql | 4 -- ...12_07_10_00_characters_character_glyphs_434.sql | 4 ++ .../2012_08_07_00_characters_characters.sql | 2 - .../2012_08_07_00_characters_characters_434.sql | 2 + .../2012_08_07_01_characters_void_storage_434.sql | 1 + sql/updates/world/2012_08_05_02_world_command.sql | 2 - .../world/2012_08_05_02_world_command_434.sql | 2 + .../world/2012_08_06_00_world_classlevelstats.sql | 7 --- .../2012_08_06_00_world_classlevelstats_434.sql | 7 +++ sql/updates/world/2012_08_06_00_world_command.sql | 4 -- .../world/2012_08_06_00_world_command_434.sql | 4 ++ .../world/2012_08_06_01_world_classlevelstats.sql | 6 --- .../2012_08_06_01_world_classlevelstats_434.sql | 6 +++ .../2012_08_08_00_world_creature_template.sql | 1 - .../2012_08_08_00_world_creature_template_434.sql | 1 + src/server/game/Entities/Player/Player.cpp | 6 +-- src/server/game/Entities/Player/Player.h | 1 + src/server/game/Globals/ObjectMgr.cpp | 2 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- .../Database/Implementation/CharacterDatabase.cpp | 6 +-- 21 files changed, 66 insertions(+), 64 deletions(-) delete mode 100644 sql/updates/characters/2012_07_10_00_characters_character_glyphs.sql create mode 100644 sql/updates/characters/2012_07_10_00_characters_character_glyphs_434.sql delete mode 100644 sql/updates/characters/2012_08_07_00_characters_characters.sql create mode 100644 sql/updates/characters/2012_08_07_00_characters_characters_434.sql create mode 100644 sql/updates/characters/2012_08_07_01_characters_void_storage_434.sql delete mode 100644 sql/updates/world/2012_08_05_02_world_command.sql create mode 100644 sql/updates/world/2012_08_05_02_world_command_434.sql delete mode 100644 sql/updates/world/2012_08_06_00_world_classlevelstats.sql create mode 100644 sql/updates/world/2012_08_06_00_world_classlevelstats_434.sql delete mode 100644 sql/updates/world/2012_08_06_00_world_command.sql create mode 100644 sql/updates/world/2012_08_06_00_world_command_434.sql delete mode 100644 sql/updates/world/2012_08_06_01_world_classlevelstats.sql create mode 100644 sql/updates/world/2012_08_06_01_world_classlevelstats_434.sql delete mode 100644 sql/updates/world/2012_08_08_00_world_creature_template.sql create mode 100644 sql/updates/world/2012_08_08_00_world_creature_template_434.sql (limited to 'src/server/scripts') diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index e7e68407156..addebff5aa5 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1119,6 +1119,36 @@ LOCK TABLES `character_talent` WRITE; /*!40000 ALTER TABLE `character_talent` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `character_void_storage` +-- + +DROP TABLE IF EXISTS `character_void_storage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `character_void_storage` ( + `itemId` bigint(20) unsigned NOT NULL, + `playerGuid` int(10) unsigned NOT NULL, + `itemEntry` mediumint(8) unsigned NOT NULL, + `slot` tinyint(3) unsigned NOT NULL, + `creatorGuid` int(10) unsigned NOT NULL DEFAULT '0', + `randomProperty` int(10) unsigned NOT NULL DEFAULT '0', + `suffixFactor` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`itemId`), + UNIQUE KEY `idx_player_slot` (`playerGuid`,`slot`), + KEY `idx_player` (`playerGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `character_void_storage` +-- + +LOCK TABLES `void_storage` WRITE; +/*!40000 ALTER TABLE `character_void_storage` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_void_storage` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `characters` -- @@ -2265,36 +2295,6 @@ LOCK TABLES `reserved_name` WRITE; /*!40000 ALTER TABLE `reserved_name` ENABLE KEYS */; UNLOCK TABLES; --- --- Table structure for table `void_storage` --- - -DROP TABLE IF EXISTS `void_storage`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `void_storage` ( - `itemId` bigint(20) unsigned NOT NULL, - `playerGuid` int(10) unsigned NOT NULL, - `itemEntry` mediumint(8) unsigned NOT NULL, - `slot` tinyint(3) unsigned NOT NULL, - `creatorGuid` int(10) unsigned NOT NULL DEFAULT '0', - `randomProperty` int(10) unsigned NOT NULL DEFAULT '0', - `suffixFactor` int(10) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`itemId`), - UNIQUE KEY `idx_player_slot` (`playerGuid`,`slot`), - KEY `idx_player` (`playerGuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `void_storage` --- - -LOCK TABLES `void_storage` WRITE; -/*!40000 ALTER TABLE `void_storage` DISABLE KEYS */; -/*!40000 ALTER TABLE `void_storage` ENABLE KEYS */; -UNLOCK TABLES; - -- -- Table structure for table `warden_action` -- diff --git a/sql/updates/characters/2012_07_10_00_characters_character_glyphs.sql b/sql/updates/characters/2012_07_10_00_characters_character_glyphs.sql deleted file mode 100644 index b8aba4d7798..00000000000 --- a/sql/updates/characters/2012_07_10_00_characters_character_glyphs.sql +++ /dev/null @@ -1,4 +0,0 @@ -ALTER TABLE `character_glyphs` - ADD `glyph7` smallint(5) unsigned DEFAULT '0' AFTER `glyph6`, - ADD `glyph8` smallint(5) unsigned DEFAULT '0' AFTER `glyph7`, - ADD `glyph9` smallint(5) unsigned DEFAULT '0' AFTER `glyph8`; diff --git a/sql/updates/characters/2012_07_10_00_characters_character_glyphs_434.sql b/sql/updates/characters/2012_07_10_00_characters_character_glyphs_434.sql new file mode 100644 index 00000000000..b8aba4d7798 --- /dev/null +++ b/sql/updates/characters/2012_07_10_00_characters_character_glyphs_434.sql @@ -0,0 +1,4 @@ +ALTER TABLE `character_glyphs` + ADD `glyph7` smallint(5) unsigned DEFAULT '0' AFTER `glyph6`, + ADD `glyph8` smallint(5) unsigned DEFAULT '0' AFTER `glyph7`, + ADD `glyph9` smallint(5) unsigned DEFAULT '0' AFTER `glyph8`; diff --git a/sql/updates/characters/2012_08_07_00_characters_characters.sql b/sql/updates/characters/2012_08_07_00_characters_characters.sql deleted file mode 100644 index e9bea82ad4b..00000000000 --- a/sql/updates/characters/2012_08_07_00_characters_characters.sql +++ /dev/null @@ -1,2 +0,0 @@ -UPDATE characters SET drunk = (drunk / 256) & 0xFF; -ALTER TABLE characters CHANGE drunk drunk tinyint(3) unsigned NOT NULL DEFAULT '0'; diff --git a/sql/updates/characters/2012_08_07_00_characters_characters_434.sql b/sql/updates/characters/2012_08_07_00_characters_characters_434.sql new file mode 100644 index 00000000000..e9bea82ad4b --- /dev/null +++ b/sql/updates/characters/2012_08_07_00_characters_characters_434.sql @@ -0,0 +1,2 @@ +UPDATE characters SET drunk = (drunk / 256) & 0xFF; +ALTER TABLE characters CHANGE drunk drunk tinyint(3) unsigned NOT NULL DEFAULT '0'; diff --git a/sql/updates/characters/2012_08_07_01_characters_void_storage_434.sql b/sql/updates/characters/2012_08_07_01_characters_void_storage_434.sql new file mode 100644 index 00000000000..8a68ba3740d --- /dev/null +++ b/sql/updates/characters/2012_08_07_01_characters_void_storage_434.sql @@ -0,0 +1 @@ +RENAME TABLE `void_storage` TO `character_void_storage`; diff --git a/sql/updates/world/2012_08_05_02_world_command.sql b/sql/updates/world/2012_08_05_02_world_command.sql deleted file mode 100644 index 69fd621c457..00000000000 --- a/sql/updates/world/2012_08_05_02_world_command.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM `command` WHERE `name` = 'reload locales_item_set_name'; -DELETE FROM `command` WHERE `name` = 'reload item_set_names'; diff --git a/sql/updates/world/2012_08_05_02_world_command_434.sql b/sql/updates/world/2012_08_05_02_world_command_434.sql new file mode 100644 index 00000000000..69fd621c457 --- /dev/null +++ b/sql/updates/world/2012_08_05_02_world_command_434.sql @@ -0,0 +1,2 @@ +DELETE FROM `command` WHERE `name` = 'reload locales_item_set_name'; +DELETE FROM `command` WHERE `name` = 'reload item_set_names'; diff --git a/sql/updates/world/2012_08_06_00_world_classlevelstats.sql b/sql/updates/world/2012_08_06_00_world_classlevelstats.sql deleted file mode 100644 index e6038374508..00000000000 --- a/sql/updates/world/2012_08_06_00_world_classlevelstats.sql +++ /dev/null @@ -1,7 +0,0 @@ -ALTER TABLE `creature_classlevelstats` ADD `basehp3` smallint(6) NOT NULL DEFAULT '1' AFTER `basehp2`; - -ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` smallint(6) NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` smallint(6) NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` smallint(6) NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` smallint(6) NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` smallint(6) NOT NULL DEFAULT '1'; diff --git a/sql/updates/world/2012_08_06_00_world_classlevelstats_434.sql b/sql/updates/world/2012_08_06_00_world_classlevelstats_434.sql new file mode 100644 index 00000000000..e6038374508 --- /dev/null +++ b/sql/updates/world/2012_08_06_00_world_classlevelstats_434.sql @@ -0,0 +1,7 @@ +ALTER TABLE `creature_classlevelstats` ADD `basehp3` smallint(6) NOT NULL DEFAULT '1' AFTER `basehp2`; + +ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` smallint(6) NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` smallint(6) NOT NULL DEFAULT '1'; diff --git a/sql/updates/world/2012_08_06_00_world_command.sql b/sql/updates/world/2012_08_06_00_world_command.sql deleted file mode 100644 index 50628aaa589..00000000000 --- a/sql/updates/world/2012_08_06_00_world_command.sql +++ /dev/null @@ -1,4 +0,0 @@ -DELETE FROM `command` WHERE `name` IN ('server togglequerylog', 'server set loglevel'); - -INSERT INTO `command` (`name`,`security`,`help`) VALUES -('server set loglevel',4,'Syntax: .server set loglevel $facility $name $loglevel. $facility can take the values: appender (a) or logger (l). $loglevel can take the values: disabled (0), trace (1), debug (2), info (3), warn (4), error (5) or fatal (6)'); diff --git a/sql/updates/world/2012_08_06_00_world_command_434.sql b/sql/updates/world/2012_08_06_00_world_command_434.sql new file mode 100644 index 00000000000..50628aaa589 --- /dev/null +++ b/sql/updates/world/2012_08_06_00_world_command_434.sql @@ -0,0 +1,4 @@ +DELETE FROM `command` WHERE `name` IN ('server togglequerylog', 'server set loglevel'); + +INSERT INTO `command` (`name`,`security`,`help`) VALUES +('server set loglevel',4,'Syntax: .server set loglevel $facility $name $loglevel. $facility can take the values: appender (a) or logger (l). $loglevel can take the values: disabled (0), trace (1), debug (2), info (3), warn (4), error (5) or fatal (6)'); diff --git a/sql/updates/world/2012_08_06_01_world_classlevelstats.sql b/sql/updates/world/2012_08_06_01_world_classlevelstats.sql deleted file mode 100644 index 6fe7ad67994..00000000000 --- a/sql/updates/world/2012_08_06_01_world_classlevelstats.sql +++ /dev/null @@ -1,6 +0,0 @@ -ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` mediumint(8) unsigned NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` mediumint(8) unsigned NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` mediumint(8) unsigned NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basehp3` `basehp3` mediumint(8) unsigned NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` mediumint(8) unsigned NOT NULL DEFAULT '1'; -ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` mediumint(8) unsigned NOT NULL DEFAULT '1'; diff --git a/sql/updates/world/2012_08_06_01_world_classlevelstats_434.sql b/sql/updates/world/2012_08_06_01_world_classlevelstats_434.sql new file mode 100644 index 00000000000..6fe7ad67994 --- /dev/null +++ b/sql/updates/world/2012_08_06_01_world_classlevelstats_434.sql @@ -0,0 +1,6 @@ +ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` mediumint(8) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` mediumint(8) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` mediumint(8) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp3` `basehp3` mediumint(8) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` mediumint(8) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` mediumint(8) unsigned NOT NULL DEFAULT '1'; diff --git a/sql/updates/world/2012_08_08_00_world_creature_template.sql b/sql/updates/world/2012_08_08_00_world_creature_template.sql deleted file mode 100644 index 1e934b9f612..00000000000 --- a/sql/updates/world/2012_08_08_00_world_creature_template.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `creature_template` ADD `Mana_mod_extra` float NOT NULL DEFAULT '1' AFTER `Mana_mod`; diff --git a/sql/updates/world/2012_08_08_00_world_creature_template_434.sql b/sql/updates/world/2012_08_08_00_world_creature_template_434.sql new file mode 100644 index 00000000000..1e934b9f612 --- /dev/null +++ b/sql/updates/world/2012_08_08_00_world_creature_template_434.sql @@ -0,0 +1 @@ +ALTER TABLE `creature_template` ADD `Mana_mod_extra` float NOT NULL DEFAULT '1' AFTER `Mana_mod`; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a337caadd73..bdfb997a1af 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13136,7 +13136,7 @@ void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 void Player::SendSellError(SellResult msg, Creature* creature, uint64 guid) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_SELL_ITEM"); - WorldPacket data(SMSG_SELL_ITEM, (8+8+(param?4:0)+1)); // last check 4.3.4 + WorldPacket data(SMSG_SELL_ITEM, (8+8+1)); // last check 4.3.4 data << uint64(creature ? creature->GetGUID() : 0); data << uint64(guid); data << uint8(msg); @@ -17010,7 +17010,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // set value, including drunk invisibility detection // calculate sobering. after 15 minutes logged out, the player will be sober again uint8 newDrunkValue = 0; - if (time_diff < GetDrunkValue() * 9) + if (time_diff < uint32(GetDrunkValue()) * 9) newDrunkValue = GetDrunkValue() - time_diff / 9; SetDrunkValue(newDrunkValue); @@ -17606,7 +17606,7 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) do { - // SELECT itemid, itemEntry, slot, creatorGuid FROM void_storage WHERE playerGuid = ? + // SELECT itemid, itemEntry, slot, creatorGuid FROM character_void_storage WHERE playerGuid = ? Field* fields = result->Fetch(); uint64 itemId = fields[0].GetUInt64(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 7a5418e8645..50a2de70d33 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -44,6 +44,7 @@ #include struct Mail; +struct ItemExtendedCostEntry; class Channel; class Creature; class DynamicObject; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index c1fe89fa86b..1843a68f095 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6126,7 +6126,7 @@ void ObjectMgr::SetHighestGuids() if (result) sGroupMgr->SetGroupDbStoreSize((*result)[0].GetUInt32()+1); - result = CharacterDatabase.Query("SELECT MAX(itemId) from void_storage"); + result = CharacterDatabase.Query("SELECT MAX(itemId) from character_void_storage"); if (result) _voidItemId = (*result)[0].GetUInt64()+1; } diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index c7b766cacd0..67b4d780942 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -236,7 +236,7 @@ public: return false; SellResult msg = SellResult(atoi(args)); - handler->GetSession()->GetPlayer()->SendSellError(msg, 0, 0, 0); + handler->GetSession()->GetPlayer()->SendSellError(msg, 0, 0); return true; } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 222e212a08f..6c58ee28838 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -556,7 +556,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND slot = ?", CONNECTION_SYNCH); - PREPARE_STATEMENT(CHAR_SEL_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomProperty, suffixFactor FROM void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); - PREPARE_STATEMENT(CHAR_REP_VOID_STORAGE_ITEM, "REPLACE INTO void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomProperty, suffixFactor) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) - PREPARE_STATEMENT(CHAR_DEL_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM void_storage WHERE slot = ? AND playerGuid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SEL_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomProperty, suffixFactor FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_REP_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomProperty, suffixFactor) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) + PREPARE_STATEMENT(CHAR_DEL_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?", CONNECTION_ASYNC); } -- cgit v1.2.3 From 9538fb6d5a508adbebc9dd94ce25cbca6bd48789 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 10 Aug 2012 14:10:57 +0200 Subject: Core/Movement: Ensured object orientation is always within 0-2pi range, this fixes movement. --- src/server/game/Entities/Creature/Creature.cpp | 2 ++ src/server/game/Entities/Creature/Creature.h | 4 ++-- src/server/game/Entities/GameObject/GameObject.cpp | 1 + src/server/game/Entities/Object/Object.cpp | 9 ++++++--- src/server/game/Entities/Transport/Transport.cpp | 4 ++-- src/server/game/Entities/Unit/Unit.cpp | 19 ++++++++++--------- src/server/game/Entities/Unit/Unit.h | 8 +++++++- src/server/game/Movement/Spline/MoveSplineInit.cpp | 5 +++-- .../game/Movement/Spline/MovementPacketBuilder.cpp | 9 ++++----- .../game/Movement/Spline/MovementPacketBuilder.h | 4 ++-- .../Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp | 2 +- 11 files changed, 40 insertions(+), 27 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index c46fc0d91d5..de5d0a0303c 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -249,6 +249,7 @@ void Creature::RemoveCorpse(bool setSpawnTime) float x, y, z, o; GetRespawnPosition(x, y, z, &o); + o = MapManager::NormalizeOrientation(o); SetHomePosition(x, y, z, o); GetMap()->CreatureRelocation(this, x, y, z, o); } @@ -2464,6 +2465,7 @@ void Creature::SetPosition(float x, float y, float z, float o) return; } + o = MapManager::NormalizeOrientation(o); GetMap()->CreatureRelocation(ToCreature(), x, y, z, o); if (IsVehicle()) GetVehicleKit()->RelocatePassengers(x, y, z, o); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index f58e49b9e14..5f933bc6ca1 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -673,8 +673,8 @@ class Creature : public Unit, public GridObject, public MapCreature void SetHomePosition(float x, float y, float z, float o) { m_homePosition.Relocate(x, y, z, o); } void SetHomePosition(const Position &pos) { m_homePosition.Relocate(pos); } - void GetHomePosition(float &x, float &y, float &z, float &ori) { m_homePosition.GetPosition(x, y, z, ori); } - Position GetHomePosition() { return m_homePosition; } + void GetHomePosition(float &x, float &y, float &z, float &ori) const { m_homePosition.GetPosition(x, y, z, ori); } + Position GetHomePosition() const { return m_homePosition; } void SetTransportHomePosition(float x, float y, float z, float o) { m_transportHomePosition.Relocate(x, y, z, o); } void SetTransportHomePosition(const Position &pos) { m_transportHomePosition.Relocate(pos); } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 00b98ce2cc1..a59dcd7d950 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -167,6 +167,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa ASSERT(map); SetMap(map); + ang = MapManager::NormalizeOrientation(ang); Relocate(x, y, z, ang); if (!IsPositionValid()) { diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 264672fc5c9..153dad8e447 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -315,7 +315,6 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(flags & UPDATEFLAG_UNK5); data->WriteBit(0); data->WriteBit(flags & UPDATEFLAG_TRANSPORT); - bool fullSpline = false; if (flags & UPDATEFLAG_LIVING) { @@ -323,6 +322,8 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const ObjectGuid guid = GetGUID(); uint32 movementFlags = self->m_movementInfo.GetMovementFlags(); uint16 movementFlagsExtra = self->m_movementInfo.GetExtraMovementFlags(); + if (GetTypeId() == TYPEID_UNIT) + movementFlags &= MOVEMENTFLAG_MASK_CREATURE_ALLOWED; data->WriteBit(!movementFlags); data->WriteBit(G3D::fuzzyEq(self->GetOrientation(), 0.0f)); // Has Orientation @@ -359,7 +360,7 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(guid[4]); if (self->IsSplineEnabled()) - Movement::PacketBuilder::WriteCreateBits(*self->movespline, *data, fullSpline); + Movement::PacketBuilder::WriteCreateBits(*self->movespline, *data); data->WriteBit(guid[6]); if (movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_TURNING) @@ -421,6 +422,8 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const ObjectGuid guid = GetGUID(); uint32 movementFlags = self->m_movementInfo.GetMovementFlags(); uint16 movementFlagsExtra = self->m_movementInfo.GetExtraMovementFlags(); + if (GetTypeId() == TYPEID_UNIT) + movementFlags &= MOVEMENTFLAG_MASK_CREATURE_ALLOWED; data->WriteByteSeq(guid[4]); *data << self->GetSpeed(MOVE_RUN_BACK); @@ -442,7 +445,7 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const *data << float(self->m_movementInfo.splineElevation); if (self->IsSplineEnabled()) - Movement::PacketBuilder::WriteCreateData(*self->movespline, *data, fullSpline); + Movement::PacketBuilder::WriteCreateData(*self->movespline, *data); *data << float(self->GetPositionZMinusOffset()); data->WriteByteSeq(guid[5]); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index aa5c33d8c67..02a6f261e98 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -711,7 +711,7 @@ void Transport::UpdateNPCPositions() void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float& o) { float inx = x, iny = y, inz = z, ino = o; - o = GetOrientation() + ino; + o = MapManager::NormalizeOrientation(GetOrientation() + ino); x = GetPositionX() + (inx * cos(GetOrientation()) + iny * sin(GetOrientation() + M_PI)); y = GetPositionY() + (iny * cos(GetOrientation()) + inx * sin(GetOrientation())); z = GetPositionZ() + inz; @@ -720,7 +720,7 @@ void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float& //! This method transforms supplied global coordinates into local offsets void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float& o) { - o -= GetOrientation(); + o = MapManager::NormalizeOrientation(o - GetOrientation()); z -= GetPositionZ(); y -= GetPositionY(); // y = searchedY * cos(o) + searchedX * sin(o) x -= GetPositionX(); // x = searchedX * cos(o) + searchedY * sin(o + pi) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index cedf38cb676..9ca0d23006c 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16257,20 +16257,20 @@ void Unit::SendMoveRoot(uint32 value) data.WriteBit(guid[4]); data.WriteBit(guid[1]); data.WriteBit(guid[3]); - + data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[5]); - + data << uint32(value); - - + + data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[6]); - + SendMessageToSet(&data, true); } @@ -16286,19 +16286,19 @@ void Unit::SendMoveUnroot(uint32 value) data.WriteBit(guid[2]); data.WriteBit(guid[4]); data.WriteBit(guid[6]); - + data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[1]); - + data << uint32(value); - + data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[5]); - + SendMessageToSet(&data, true); } @@ -17849,6 +17849,7 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel return false; } + orientation = MapManager::NormalizeOrientation(orientation); bool turn = (GetOrientation() != orientation); bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || GetPositionZ() != z); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index de95b7d9842..7a0b97b90ef 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -711,6 +711,12 @@ enum MovementFlags MOVEMENTFLAG_MASK_MOVING_FLY = MOVEMENTFLAG_FLYING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING, + // Movement flags allowed for creature in CreateObject - we need to keep all other enabled serverside + // to properly calculate all movement + MOVEMENTFLAG_MASK_CREATURE_ALLOWED = + MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_ROOT | MOVEMENTFLAG_SWIMMING | + MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER, + //! TODO if needed: add more flags to this masks that are exclusive to players MOVEMENTFLAG_MASK_PLAYER_ONLY = MOVEMENTFLAG_FLYING, @@ -1407,7 +1413,7 @@ class Unit : public WorldObject MountCapabilityEntry const* GetMountCapability(uint32 mountType) const; void SendDurabilityLoss(Player* receiver, uint32 percent); - + uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; } void DealDamageMods(Unit* victim, uint32 &damage, uint32* absorb); uint32 DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDamage = NULL, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = NULL, bool durabilityLoss = true); diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 780b341f6f2..5b87d9c01b9 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -81,7 +81,7 @@ namespace Movement if (args.path.empty()) return; - // corrent first vertex + // correct first vertex args.path[0] = real_position; args.initialOrientation = real_position.orientation; @@ -114,7 +114,7 @@ namespace Movement } PacketBuilder::WriteMonsterMove(move_spline, data); - unit.SendMessageToSet(&data,true); + unit.SendMessageToSet(&data, true); } MoveSplineInit::MoveSplineInit(Unit& m) : unit(m) @@ -124,6 +124,7 @@ namespace Movement // mix existing state into new args.flags.walkmode = unit.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); args.flags.flying = unit.m_movementInfo.HasMovementFlag(MovementFlags(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY)); + args.flags.smoothGroundPath = true; // enabled by default, CatmullRom mode or client config "pathSmoothing" will disable this } void MoveSplineInit::SetFacing(const Unit * target) diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp index 19a250f7885..aab96a630fa 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp @@ -140,10 +140,9 @@ namespace Movement WriteLinearPath(spline, data); } - void PacketBuilder::WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data, bool& fullData) + void PacketBuilder::WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data) { - fullData = data.WriteBit(!moveSpline.Finalized()); - if (!fullData) + if (!data.WriteBit(!moveSpline.Finalized())) return; data.WriteBits(uint8(moveSpline.spline.mode()), 2); @@ -180,9 +179,9 @@ namespace Movement data.WriteBits(moveSpline.splineflags.raw(), 25); } - void PacketBuilder::WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data, bool fullData) + void PacketBuilder::WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data) { - if (fullData) + if (!moveSpline.Finalized()) { MoveSplineFlag splineFlags = moveSpline.splineflags; diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h index 1b8506c5161..a6e4e4d5d04 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.h +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h @@ -31,8 +31,8 @@ namespace Movement public: static void WriteMonsterMove(const MoveSpline& mov, WorldPacket& data); - static void WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data, bool& fullData); - static void WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data, bool fullData); + static void WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data); + static void WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data); }; } #endif // TRINITYSERVER_PACKET_BUILDER_H diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 0c5cb0aba52..479d234e27c 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -303,7 +303,7 @@ class npc_coldflame : public CreatureScript { Position const* ownerPos = marrowgarAI->GetLastColdflamePosition(); float ang = me->GetAngle(ownerPos) - static_cast(M_PI); - MapManager::NormalizeOrientation(ang); + ang = MapManager::NormalizeOrientation(ang); me->SetOrientation(ang); owner->GetNearPosition(pos, 2.5f, 0.0f); } -- cgit v1.2.3 From 274a54c1529e9cf22778866cf5ddb0e9b919fdb3 Mon Sep 17 00:00:00 2001 From: Nay Date: Fri, 10 Aug 2012 16:58:39 +0100 Subject: Core: Cleanup whitespace, fix build and enable 1 opcode --- src/server/game/Entities/Player/Player.cpp | 46 +++++++++++----------- src/server/game/Entities/Unit/Unit.cpp | 8 ++-- src/server/game/Handlers/ChannelHandler.cpp | 32 +++++++-------- src/server/game/Handlers/GroupHandler.cpp | 10 ++--- src/server/game/Handlers/MailHandler.cpp | 26 ++++++------ src/server/game/Handlers/TaxiHandler.cpp | 2 +- src/server/game/Handlers/VehicleHandler.cpp | 2 +- src/server/game/Movement/MovementStructures.h | 8 ++-- src/server/game/Movement/Spline/MoveSplineInit.cpp | 6 +++ src/server/game/Movement/Spline/MoveSplineInit.h | 6 --- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/scripts/Commands/cs_disable.cpp | 14 +++---- src/server/shared/Logging/AppenderDB.cpp | 2 +- src/server/shared/Logging/Log.cpp | 4 +- 14 files changed, 84 insertions(+), 84 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f1c3299a92f..5178d62bfdf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25415,16 +25415,16 @@ void Player::SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, data << uint32(iece->RequiredCurrencyCount[i]); data << uint32(iece->RequiredCurrency[i]); } - + data << uint32(item->GetPaidMoney()); // money cost - + for (uint8 i = 0; i < MAX_ITEM_EXT_COST_ITEMS; ++i) // item cost data { data << uint32(iece->RequiredItemCount[i]); data << uint32(iece->RequiredItem[i]); } } - + data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[1]); @@ -25433,7 +25433,7 @@ void Player::SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[5]); - + data << uint8(error); // error code GetSession()->SendPacket(&data); } @@ -25735,12 +25735,12 @@ void Player::SendMovementSetCanFly(bool apply) data.WriteBit(guid[4]); data.WriteBit(guid[2]); data.WriteBit(guid[3]); - + data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[3]); - + data << uint32(0); //! movement counter - + data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[4]); @@ -25759,12 +25759,12 @@ void Player::SendMovementSetCanFly(bool apply) data.WriteBit(guid[3]); data.WriteBit(guid[6]); data.WriteBit(guid[7]); - + data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[6]); - + data << uint32(0); //! movement counter - + data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[2]); @@ -25808,13 +25808,13 @@ void Player::SendMovementSetWaterWalking(bool apply) data.WriteBit(guid[3]); data.WriteBit(guid[5]); data.WriteBit(guid[2]); - + data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[2]); - + data << uint32(0); //! movement counter - + data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[4]); @@ -25832,7 +25832,7 @@ void Player::SendMovementSetWaterWalking(bool apply) data.WriteBit(guid[4]); data.WriteBit(guid[0]); data.WriteBit(guid[7]); - + data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[7]); @@ -25841,7 +25841,7 @@ void Player::SendMovementSetWaterWalking(bool apply) data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[2]); - + data << uint32(0); //! movement counter } SendDirectMessage(&data); @@ -25851,7 +25851,7 @@ void Player::SendMovementSetFeatherFall(bool apply) { ObjectGuid guid = GetGUID(); WorldPacket data; - + if (apply) { data.Initialize(SMSG_MOVE_FEATHER_FALL, 1 + 4 + 8); @@ -25863,13 +25863,13 @@ void Player::SendMovementSetFeatherFall(bool apply) data.WriteBit(guid[2]); data.WriteBit(guid[5]); data.WriteBit(guid[6]); - + data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[2]); - + data << uint32(0); //! movement counter - + data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[4]); @@ -25879,9 +25879,9 @@ void Player::SendMovementSetFeatherFall(bool apply) else { data.Initialize(SMSG_MOVE_NORMAL_FALL, 1 + 4 + 8); - + data << uint32(0); //! movement counter - + data.WriteBit(guid[3]); data.WriteBit(guid[0]); data.WriteBit(guid[1]); @@ -25890,7 +25890,7 @@ void Player::SendMovementSetFeatherFall(bool apply) data.WriteBit(guid[4]); data.WriteBit(guid[6]); data.WriteBit(guid[2]); - + data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[1]); @@ -25900,7 +25900,7 @@ void Player::SendMovementSetFeatherFall(bool apply) data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[6]); } - + SendDirectMessage(&data); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 71a277c9f99..984c1899564 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -17147,22 +17147,22 @@ void Unit::SendMoveKnockBack(Player* player, float speedXY, float speedZ, float data.WriteBit(guid[4]); data.WriteByteSeq(guid[1]); - + data << float(vsin); data << uint32(0); - + data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[7]); data << float(speedXY); - + data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[3]); data << float(speedZ); data << float(vcos); - + data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[0]); diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index f940d658530..21f455c4fc8 100755 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -84,7 +84,7 @@ void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) void WorldSession::HandleChannelList(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); - + uint32 length = recvPacket.ReadBits(8); std::string channelname = recvPacket.ReadString(length); @@ -110,13 +110,13 @@ void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); - + uint32 channelLength = recvPacket.ReadBits(8); uint32 nameLength = recvPacket.ReadBits(7); std::string newp = recvPacket.ReadString(nameLength); std::string channelname = recvPacket.ReadString(channelLength); - + if (!normalizePlayerName(newp)) return; @@ -139,13 +139,13 @@ void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); - + uint32 channelLength = recvPacket.ReadBits(8); uint32 nameLength = recvPacket.ReadBits(7); - + std::string otp = recvPacket.ReadString(nameLength); std::string channelname = recvPacket.ReadString(channelLength); - + if (!normalizePlayerName(otp)) return; @@ -157,10 +157,10 @@ void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); - + uint32 nameLength = recvPacket.ReadBits(7); uint32 channelLength = recvPacket.ReadBits(8); - + std::string channelname = recvPacket.ReadString(channelLength); std::string otp = recvPacket.ReadString(nameLength); @@ -177,7 +177,7 @@ void WorldSession::HandleChannelMute(WorldPacket& recvPacket) sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); uint32 channelLength = recvPacket.ReadBits(8); uint32 nameLength = recvPacket.ReadBits(7); - + std::string channelname = recvPacket.ReadString(channelLength); std::string otp = recvPacket.ReadString(nameLength); @@ -198,7 +198,7 @@ void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) std::string otp = recvPacket.ReadString(nameLength); std::string channelname = recvPacket.ReadString(channelLength); - + if (!normalizePlayerName(otp)) return; @@ -229,7 +229,7 @@ void WorldSession::HandleChannelKick(WorldPacket& recvPacket) sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); uint32 channelLength = recvPacket.ReadBits(8); uint32 nameLength = recvPacket.ReadBits(7); - + std::string channelname = recvPacket.ReadString(channelLength); std::string otp = recvPacket.ReadString(nameLength); @@ -246,7 +246,7 @@ void WorldSession::HandleChannelBan(WorldPacket& recvPacket) sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); uint32 channelLength, nameLength; std::string channelname, otp; - + channelLength = recvPacket.ReadBits(8); nameLength = recvPacket.ReadBits(7); @@ -267,10 +267,10 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) uint32 channelLength = recvPacket.ReadBits(7); uint32 nameLength = recvPacket.ReadBits(8); - + std::string otp = recvPacket.ReadString(nameLength); std::string channelname = recvPacket.ReadString(channelLength); - + if (!normalizePlayerName(otp)) return; @@ -282,10 +282,10 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode()); - + uint32 length = recvPacket.ReadBits(8); std::string channelname = recvPacket.ReadString(length); - + if (ChannelMgr* cMgr = channelMgr(_player->GetTeam())) if (Channel* chn = cMgr->GetChannel(channelname, _player)) chn->Announce(_player->GetGUID()); diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 3953550e972..ae549d76b33 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -96,7 +96,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket & recvData) recvData.ReadByteSeq(crossRealmGuid[5]); recvData.ReadByteSeq(crossRealmGuid[3]); recvData.ReadByteSeq(crossRealmGuid[2]); - + // attempt add selected player // cheating @@ -190,10 +190,10 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket & recvData) data.WriteBit(invitedGuid[7]); data.FlushBits(); - + data.WriteByteSeq(invitedGuid[1]); data.WriteByteSeq(invitedGuid[4]); - + data << int32(getMSTime()); data << int32(0); data << int32(0); @@ -212,7 +212,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket & recvData) data.WriteByteSeq(invitedGuid[7]); data.WriteString(player->GetName()); // invited name - + data << int32(0); player->GetSession()->SendPacket(&data); @@ -720,7 +720,7 @@ void WorldSession::HandleGroupChangeSubGroupOpcode(WorldPacket& recvData) Player* movedPlayer = sObjectAccessor->FindPlayerByName(name.c_str()); uint64 guid; - + if (movedPlayer) guid = movedPlayer->GetGUID(); else diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 8762613fc3b..9ee962f4a3d 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -36,23 +36,23 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) std::string receiver, subject, body; uint32 bodyLength, subjectLength, receiverLength; uint32 unk1, unk2; - + recvData >> unk1; recvData >> unk2; // Stationery? - + recvData >> money >> COD; // money and cod bodyLength = recvData.ReadBits(12); subjectLength = recvData.ReadBits(9); uint8 items_count = recvData.ReadBits(5); // attached items count - + if (items_count > MAX_MAIL_ITEMS) // client limit { GetPlayer()->SendMailResult(0, MAIL_SEND, MAIL_ERR_TOO_MANY_ATTACHMENTS); recvData.rfinish(); // set to end to avoid warnings spam return; } - + mailbox[0] = recvData.ReadBit(); ObjectGuid itemGUIDs[MAX_MAIL_ITEMS]; @@ -68,7 +68,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) itemGUIDs[i][4] = recvData.ReadBit(); itemGUIDs[i][5] = recvData.ReadBit(); } - + mailbox[3] = recvData.ReadBit(); mailbox[4] = recvData.ReadBit(); receiverLength = recvData.ReadBits(7); @@ -77,9 +77,9 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) mailbox[1] = recvData.ReadBit(); mailbox[7] = recvData.ReadBit(); mailbox[5] = recvData.ReadBit(); - + recvData.ReadByteSeq(mailbox[4]); - + for (uint8 i = 0; i < items_count; ++i) { recvData.ReadByteSeq(itemGUIDs[i][6]); @@ -92,22 +92,22 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) recvData.ReadByteSeq(itemGUIDs[i][4]); recvData.ReadByteSeq(itemGUIDs[i][5]); } - + recvData.ReadByteSeq(mailbox[7]); recvData.ReadByteSeq(mailbox[3]); recvData.ReadByteSeq(mailbox[6]); recvData.ReadByteSeq(mailbox[5]); - + subject = recvData.ReadString(subjectLength); receiver = recvData.ReadString(receiverLength); - + recvData.ReadByteSeq(mailbox[2]); recvData.ReadByteSeq(mailbox[0]); - + body = recvData.ReadString(bodyLength); - + recvData.ReadByteSeq(mailbox[1]); - + // packet read complete, now do check if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX)) diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index 175ea28a424..2a16efaf88b 100755 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -200,7 +200,7 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recvData) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_MOVE_SPLINE_DONE"); recvData.read_skip(); // unk - + MovementInfo movementInfo; // used only for proper packet read ReadMovementInfo(recvData, &movementInfo); diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index 464af1d03d7..b9603cc7822 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -67,7 +67,7 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData) recvData.GetOpcode(), GetPlayer()->GetGUIDLow(), seat->m_flags); return; } - + switch (recvData.GetOpcode()) { case CMSG_REQUEST_VEHICLE_PREV_SEAT: diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index c75229c75be..8f609e8d076 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -1855,7 +1855,7 @@ MovementStatusElements MoveChngTransport[]= }; // 4.3.4 -MovementStatusElements MoveSplineDone[] = +MovementStatusElements MoveSplineDone[] = { MSEPositionY, MSEPositionX, @@ -1889,11 +1889,11 @@ MovementStatusElements MoveSplineDone[] = MSEHasTransportGuidByte2, MSEHasTransportTime3, MSEHasTransportGuidByte0, - + MSEHasFallDirection, MSEMovementFlags2, MSEMovementFlags, - + MSEGuidByte7, MSEGuidByte4, MSEGuidByte5, @@ -1908,7 +1908,7 @@ MovementStatusElements MoveSplineDone[] = MSEFallCosAngle, MSEFallHorizontalSpeed, MSEFallTime, - + MSEPitch, MSEOrientation, diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 5b87d9c01b9..96b925928a4 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -155,6 +155,12 @@ namespace Movement args.path[1] = transform(dest); } + void MoveSplineInit::SetFall() + { + args.flags.EnableFalling(); + args.flags.fallingSlow = unit.HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); + } + Vector3 TransportPathTransform::operator()(Vector3 input) { if (_transformForTransport) diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 38da7cbbc48..053be4e334a 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -154,12 +154,6 @@ namespace Movement inline void MoveSplineInit::SetTransportExit() { args.flags.EnableTransportExit(); } inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.orientationFixed = enable; } - inline void MoveSplineInit::SetFall() - { - args.flags.EnableFalling(); - args.flags.fallingSlow = unit.HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); - } - inline void MoveSplineInit::MovebyPath(const PointsArray& controls, int32 path_offset) { args.path_Idx_offset = path_offset; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 8c34db04978..d26389249c6 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -74,7 +74,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_AUCTION_REMOVE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionRemoveItem ); //DEFINE_OPCODE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionSellItem ); DEFINE_OPCODE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess ); - //DEFINE_OPCODE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode ); DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode ); diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index a2a80edd43b..0bb376b08dd 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -62,7 +62,7 @@ public: { "add", SEC_ADMINISTRATOR, true, NULL, "", addDisableCommandTable }, { "remove", SEC_ADMINISTRATOR, true, NULL, "", removeDisableCommandTable }, { NULL, 0, false, NULL, "", NULL } - }; + }; static ChatCommand commandTable[] = { { "disable", SEC_ADMINISTRATOR, false, NULL, "", disableCommandTable }, @@ -88,7 +88,7 @@ public: uint32 entry = uint32(atoi(entryStr)); std::string disableTypeStr = ""; - + switch (disableType) { case DISABLE_TYPE_SPELL: @@ -171,12 +171,12 @@ public: default: break; } - + PreparedStatement* stmt = NULL; stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_DISABLES); stmt->setUInt32(0, entry); - stmt->setUInt8(1, disableType); - PreparedQueryResult result = WorldDatabase.Query(stmt); + stmt->setUInt8(1, disableType); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (result) { handler->PSendSysMessage("This %s (Id: %u) is already disabled.", disableTypeStr.c_str(), entry); @@ -290,8 +290,8 @@ public: PreparedStatement* stmt = NULL; stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_DISABLES); stmt->setUInt32(0, entry); - stmt->setUInt8(1, disableType); - PreparedQueryResult result = WorldDatabase.Query(stmt); + stmt->setUInt8(1, disableType); + PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { handler->PSendSysMessage("This %s (Id: %u) is not disabled.", disableTypeStr.c_str(), entry); diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/shared/Logging/AppenderDB.cpp index 76abfca2d85..d85a4db9f7a 100644 --- a/src/server/shared/Logging/AppenderDB.cpp +++ b/src/server/shared/Logging/AppenderDB.cpp @@ -37,7 +37,7 @@ void AppenderDB::_write(LogMessage& message) case LOG_FILTER_SQL_DRIVER: case LOG_FILTER_SQL_DEV: break; // Avoid infinite loop, PExecute triggers Logging with LOG_FILTER_SQL type - default: + default: PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_LOG); stmt->setUInt64(0, message.mtime); stmt->setUInt32(1, realm); diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index 14234dfb155..d68c1c6170c 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -109,7 +109,7 @@ void Log::CreateAppenderFromConfig(const char* name) if (++iter != tokens.end()) flags = AppenderFlags(atoi(*iter)); - + switch (type) { case APPENDER_CONSOLE: @@ -464,7 +464,7 @@ void Log::outOpCode(uint32 op, const char* name, bool smsg) { if (!ShouldLog(LOG_FILTER_OPCODES, LOG_LEVEL_DEBUG)) return; - + outInfo(LOG_FILTER_OPCODES, "%s: %s 0x%.4X (%u)", smsg ? "S->C" : "C->S", name, op, op); } -- cgit v1.2.3 From f61df4d2238d866511ee6caded66ac12091e802f Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sun, 12 Aug 2012 17:22:45 +0200 Subject: Scripts/Some: Cleanup for old scripts, not exist Quest and etc. in Cata. --- sql/updates/world/2012_08_12_00_world_misc_434.sql | 59 ++ src/server/game/Scripting/ScriptLoader.cpp | 2 - src/server/scripts/Kalimdor/CMakeLists.txt | 1 - src/server/scripts/Kalimdor/azshara.cpp | 493 +---------- src/server/scripts/Kalimdor/azuremyst_isle.cpp | 164 +--- src/server/scripts/Kalimdor/boss_azuregos.cpp | 167 ---- src/server/scripts/Kalimdor/darkshore.cpp | 370 +------- src/server/scripts/Kalimdor/desolace.cpp | 104 +-- src/server/scripts/Kalimdor/durotar.cpp | 451 +--------- src/server/scripts/Kalimdor/dustwallow_marsh.cpp | 452 +--------- src/server/scripts/Kalimdor/felwood.cpp | 72 +- src/server/scripts/Kalimdor/feralas.cpp | 185 +--- src/server/scripts/Kalimdor/moonglade.cpp | 545 +----------- src/server/scripts/Kalimdor/mulgore.cpp | 122 +-- src/server/scripts/Kalimdor/orgrimmar.cpp | 222 +---- src/server/scripts/Kalimdor/silithus.cpp | 932 +-------------------- .../scripts/Kalimdor/stonetalon_mountains.cpp | 146 +--- src/server/scripts/Kalimdor/tanaris.cpp | 375 +-------- src/server/scripts/Kalimdor/the_barrens.cpp | 497 +---------- src/server/scripts/Kalimdor/thousand_needles.cpp | 428 +--------- src/server/scripts/Kalimdor/thunder_bluff.cpp | 24 - src/server/scripts/Kalimdor/ungoro_crater.cpp | 321 +------ 22 files changed, 97 insertions(+), 6035 deletions(-) create mode 100644 sql/updates/world/2012_08_12_00_world_misc_434.sql delete mode 100644 src/server/scripts/Kalimdor/boss_azuregos.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_12_00_world_misc_434.sql b/sql/updates/world/2012_08_12_00_world_misc_434.sql new file mode 100644 index 00000000000..740b9c3582c --- /dev/null +++ b/sql/updates/world/2012_08_12_00_world_misc_434.sql @@ -0,0 +1,59 @@ +UPDATE `creature_template` SET `ScriptName`='' WHERE `ScriptName` IN ( +'mobs_spitelashes', +'npc_loramus_thalipedes', +'mob_rizzle_sprysprocket', +'mob_depth_charge', +'npc_geezle', +'boss_azuregos', +'npc_kerlonian', +'npc_prospector_remtravel', +'npc_threshwackonator', +'go_iruxos', +'npc_dalinda', +'npc_tiger_matriarch_credit', +'npc_tiger_matriarch', +'npc_troll_volunteer', +'mobs_risen_husk_spirit', +'npc_lady_jaina_proudmoore', +'npc_nat_pagle', +'npc_private_hendel', +'npc_zelfrax', +'npc_theramore_guard', +'npcs_riverbreeze_and_silversky', +'npc_gregan_brewspewer', +'npc_oox22fe', +'npc_screecher_spirit', +'npc_bunthen_plainswind', +'npc_great_bear_spirit', +'npc_silva_filnaveth', +'npc_clintar_dreamwalker', +'npc_clintar_spirit', +'npc_plains_vision', +'npc_shenthul', +'npc_thrall_warchief', +'go_crystalline_tear', +'npc_anachronos_quest_trigger', +'npc_anachronos_the_ancient', +'mob_qiraj_war_spawn', +'npc_braug_dimspirit', +'npc_kaya_flathoof', +'mob_aquementas', +'npc_marin_noggenfogger', +'npc_stone_watcher_of_norgannon', +'npc_tooga', +'npc_beaten_corpse', +'npc_gilthares', +'npc_sputtervalve', +'npc_taskmaster_fizzule', +'npc_twiggy_flathead', +'npc_kanati', +'npc_lakota_windsong', +'npc_paoka_swiftmountain', +'npc_plucky', +'npc_enraged_panther', +'go_panther_cage', +'npc_ame', +'npc_ringo' +); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_mount_check','spell_voljin_war_drums'); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 319fd1eb702..128d28a9954 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -334,7 +334,6 @@ void AddSC_ashenvale(); void AddSC_azshara(); void AddSC_azuremyst_isle(); void AddSC_bloodmyst_isle(); -void AddSC_boss_azuregos(); void AddSC_darkshore(); void AddSC_desolace(); void AddSC_durotar(); @@ -959,7 +958,6 @@ void AddKalimdorScripts() AddSC_azshara(); AddSC_azuremyst_isle(); AddSC_bloodmyst_isle(); - AddSC_boss_azuregos(); AddSC_darkshore(); AddSC_desolace(); AddSC_durotar(); diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index 7f63c521594..f54c23afb3c 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -101,7 +101,6 @@ set(scripts_STAT_SRCS Kalimdor/WailingCaverns/wailing_caverns.cpp Kalimdor/durotar.cpp Kalimdor/felwood.cpp - Kalimdor/boss_azuregos.cpp Kalimdor/tanaris.cpp Kalimdor/dustwallow_marsh.cpp Kalimdor/winterspring.cpp diff --git a/src/server/scripts/Kalimdor/azshara.cpp b/src/server/scripts/Kalimdor/azshara.cpp index 8d08c26f0a7..740f3d5c7e2 100644 --- a/src/server/scripts/Kalimdor/azshara.cpp +++ b/src/server/scripts/Kalimdor/azshara.cpp @@ -18,507 +18,18 @@ /* ScriptData SDName: Azshara -SD%Complete: 90 -SDComment: Quest support: 2744, 3141, 9364, 10994 +SD%Complete: 0 +SDComment: Quest support: SDCategory: Azshara EndScriptData */ /* ContentData -mobs_spitelashes -npc_loramus_thalipedes -mob_rizzle_sprysprocket -mob_depth_charge EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -/*###### -## mobs_spitelashes -######*/ - -class mobs_spitelashes : public CreatureScript -{ -public: - mobs_spitelashes() : CreatureScript("mobs_spitelashes") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new mobs_spitelashesAI (creature); - } - - struct mobs_spitelashesAI : public ScriptedAI - { - mobs_spitelashesAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 morphtimer; - bool spellhit; - - void Reset() - { - morphtimer = 0; - spellhit = false; - } - - void EnterCombat(Unit* /*who*/) { } - - void SpellHit(Unit* Hitter, const SpellInfo* Spellkind) - { - if (!spellhit && - Hitter->GetTypeId() == TYPEID_PLAYER && - CAST_PLR(Hitter)->GetQuestStatus(9364) == QUEST_STATUS_INCOMPLETE && - (Spellkind->Id == 118 || Spellkind->Id == 12824 || Spellkind->Id == 12825 || Spellkind->Id == 12826)) - { - spellhit=true; - DoCast(me, 29124); //become a sheep - } - } - - void UpdateAI(const uint32 diff) - { - // we mustn't remove the Creature in the same round in which we cast the summon spell, otherwise there will be no summons - if (spellhit && morphtimer >= 5000) - { - me->DespawnOrUnsummon(); - return; - } - // walk 5 seconds before summoning - if (spellhit && morphtimer<5000) - { - morphtimer+=diff; - if (morphtimer >= 5000) - { - DoCast(me, 28406); //summon copies - DoCast(me, 6924); //visual explosion - } - } - if (!UpdateVictim()) - return; - - //TODO: add abilities for the different creatures - DoMeleeAttackIfReady(); - } - }; - -}; - -/*###### -## npc_loramus_thalipedes -######*/ - -#define GOSSIP_HELLO_LT1 "Can you help me?" -#define GOSSIP_HELLO_LT2 "Tell me your story" -#define GOSSIP_SELECT_LT1 "Please continue" -#define GOSSIP_SELECT_LT2 "I do not understand" -#define GOSSIP_SELECT_LT3 "Indeed" -#define GOSSIP_SELECT_LT4 "I will do this with or your help, Loramus" -#define GOSSIP_SELECT_LT5 "Yes" - -class npc_loramus_thalipedes : public CreatureScript -{ -public: - npc_loramus_thalipedes() : CreatureScript("npc_loramus_thalipedes") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(2744); - break; - - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21); - player->SEND_GOSSIP_MENU(1813, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+21: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); - player->SEND_GOSSIP_MENU(1814, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+22: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 23); - player->SEND_GOSSIP_MENU(1815, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+23: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 24); - player->SEND_GOSSIP_MENU(1816, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+24: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 25); - player->SEND_GOSSIP_MENU(1817, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+25: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(3141); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(2744) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_LT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - if (player->GetQuestStatus(3141) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_LT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - -/*#### -# mob_rizzle_sprysprocket -####*/ - -enum RizzleSprysprocketData -{ - QUEST_CHASING_THE_MOONSTONE = 10994, - - MOB_DEPTH_CHARGE = 23025, - - SPELL_RIZZLE_BLACKJACK = 39865, - SPELL_RIZZLE_ESCAPE = 39871, - SPELL_RIZZLE_FROST_GRENADE = 40525, - SPELL_DEPTH_CHARGE_TRAP = 38576, - SPELL_PERIODIC_DEPTH_CHARGE = 39912, - SPELL_GIVE_SOUTHFURY_MOONSTONE = 39886, - - SAY_RIZZLE_START = -1000351, - MSG_ESCAPE_NOTICE = -1000352, - SAY_RIZZLE_GRENADE = -1000353, - SAY_RIZZLE_GRENADE_BACKFIRE = -1000354, // Not used - SAY_RIZZLE_FINAL = -1000355, - SAY_RIZZLE_FINAL2 = -1000356, // Not used -}; - -#define GOSSIP_GET_MOONSTONE "Hand over the Southfury moonstone and I'll let you go." - -Position const WPs[58] = -{ - {3691.97f, -3962.41f, 35.9118f, 3.67f}, - {3675.02f, -3960.49f, 35.9118f, 3.67f}, - {3653.19f, -3958.33f, 33.9118f, 3.59f}, - {3621.12f, -3958.51f, 29.9118f, 3.48f}, - {3604.86f, -3963, 29.9118f, 3.48f}, - {3569.94f, -3970.25f, 29.9118f, 3.44f}, - {3541.03f, -3975.64f, 29.9118f, 3.41f}, - {3510.84f, -3978.71f, 29.9118f, 3.41f}, - {3472.7f, -3997.07f, 29.9118f, 3.35f}, - {3439.15f, -4014.55f, 29.9118f, 3.29f}, - {3412.8f, -4025.87f, 29.9118f, 3.25f}, - {3384.95f, -4038.04f, 29.9118f, 3.24f}, - {3346.77f, -4052.93f, 29.9118f, 3.22f}, - {3299.56f, -4071.59f, 29.9118f, 3.20f}, - {3261.22f, -4080.38f, 30.9118f, 3.19f}, - {3220.68f, -4083.09f, 31.9118f, 3.18f}, - {3187.11f, -4070.45f, 33.9118f, 3.16f}, - {3162.78f, -4062.75f, 33.9118f, 3.15f}, - {3136.09f, -4050.32f, 33.9118f, 3.07f}, - {3119.47f, -4044.51f, 36.0363f, 3.07f}, - {3098.95f, -4019.8f, 33.9118f, 3.07f}, - {3073.07f, -4011.42f, 33.9118f, 3.07f}, - {3051.71f, -3993.37f, 33.9118f, 3.02f}, - {3027.52f, -3978.6f, 33.9118f, 3.00f}, - {3003.78f, -3960.14f, 33.9118f, 2.98f}, - {2977.99f, -3941.98f, 31.9118f, 2.96f}, - {2964.57f, -3932.07f, 30.9118f, 2.96f}, - {2947.9f, -3921.31f, 29.9118f, 2.96f}, - {2924.91f, -3910.8f, 29.9118f, 2.94f}, - {2903.04f, -3896.42f, 29.9118f, 2.93f}, - {2884.75f, -3874.03f, 29.9118f, 2.90f}, - {2868.19f, -3851.48f, 29.9118f, 2.82f}, - {2854.62f, -3819.72f, 29.9118f, 2.80f}, - {2825.53f, -3790.4f, 29.9118f, 2.744f}, - {2804.31f, -3773.05f, 29.9118f, 2.71f}, - {2769.78f, -3763.57f, 29.9118f, 2.70f}, - {2727.23f, -3745.92f, 30.9118f, 2.69f}, - {2680.12f, -3737.49f, 30.9118f, 2.67f}, - {2647.62f, -3739.94f, 30.9118f, 2.66f}, - {2616.6f, -3745.75f, 30.9118f, 2.64f}, - {2589.38f, -3731.97f, 30.9118f, 2.61f}, - {2562.94f, -3722.35f, 31.9118f, 2.56f}, - {2521.05f, -3716.6f, 31.9118f, 2.55f}, - {2485.26f, -3706.67f, 31.9118f, 2.51f}, - {2458.93f, -3696.67f, 31.9118f, 2.51f}, - {2432, -3692.03f, 31.9118f, 2.46f}, - {2399.59f, -3681.97f, 31.9118f, 2.45f}, - {2357.75f, -3666.6f, 31.9118f, 2.44f}, - {2311.99f, -3656.88f, 31.9118f, 2.94f}, - {2263.41f, -3649.55f, 31.9118f, 3.02f}, - {2209.05f, -3641.76f, 31.9118f, 2.99f}, - {2164.83f, -3637.64f, 31.9118f, 3.15f}, - {2122.42f, -3639, 31.9118f, 3.21f}, - {2075.73f, -3643.59f, 31.9118f, 3.22f}, - {2033.59f, -3649.52f, 31.9118f, 3.42f}, - {1985.22f, -3662.99f, 31.9118f, 3.42f}, - {1927.09f, -3679.56f, 33.9118f, 3.42f}, - {1873.57f, -3695.32f, 33.9118f, 3.44f} -}; - -class mob_rizzle_sprysprocket : public CreatureScript -{ -public: - mob_rizzle_sprysprocket() : CreatureScript("mob_rizzle_sprysprocket") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); - CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDieTimer = 3000; - CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDie = true; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE) - return true; - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(10811, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_rizzle_sprysprocketAI (creature); - } - - struct mob_rizzle_sprysprocketAI : public ScriptedAI - { - mob_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 SpellEscapeTimer; - uint32 TeleportTimer; - uint32 CheckTimer; - uint32 GrenadeTimer; - uint32 MustDieTimer; - uint32 CurrWP; - - uint64 PlayerGUID; - - bool MustDie; - bool Escape; - bool ContinueWP; - bool Reached; - - void Reset() - { - SpellEscapeTimer = 1300; - TeleportTimer = 3500; - CheckTimer = 10000; - GrenadeTimer = 30000; - MustDieTimer = 3000; - CurrWP = 0; - - PlayerGUID = 0; - - MustDie = false; - Escape = false; - ContinueWP = false; - Reached = false; - } - - void UpdateAI(const uint32 diff) - { - if (MustDie) - { - if (MustDieTimer <= diff) - { - me->DespawnOrUnsummon(); - return; - } else MustDieTimer -= diff; - } - - if (!Escape) - { - if (!PlayerGUID) - return; - - if (SpellEscapeTimer <= diff) - { - DoCast(me, SPELL_RIZZLE_ESCAPE, false); - SpellEscapeTimer = 10000; - } else SpellEscapeTimer -= diff; - - if (TeleportTimer <= diff) - { - //temp solution - unit can't be teleported by core using spelleffect 5, only players - if (me->GetMap()) - { - me->SetPosition(3706.39f, -3969.15f, 35.9118f, 0); - me->AI_SendMoveToPacket(3706.39f, -3969.15f, 35.9118f, 0, 0, 0); - } - //begin swimming and summon depth charges - Player* player = Unit::GetPlayer(*me, PlayerGUID); - SendText(MSG_ESCAPE_NOTICE, player); - DoCast(me, SPELL_PERIODIC_DEPTH_CHARGE); - me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING); - me->SetSpeed(MOVE_RUN, 0.85f, true); - me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); - Escape = true; - } else TeleportTimer -= diff; - - return; - } - - if (ContinueWP) - { - me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); - ContinueWP = false; - } - - if (GrenadeTimer <= diff) - { - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (player) - { - DoScriptText(SAY_RIZZLE_GRENADE, me, player); - DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); - } - GrenadeTimer = 30000; - } else GrenadeTimer -= diff; - - if (CheckTimer <= diff) - { - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (!player) - { - me->DespawnOrUnsummon(); - return; - } - - if (me->IsWithinDist(player, 10) && me->GetPositionX() > player->GetPositionX() && !Reached) - { - DoScriptText(SAY_RIZZLE_FINAL, me); - me->SetUInt32Value(UNIT_NPC_FLAGS, 1); - me->setFaction(35); - me->GetMotionMaster()->MoveIdle(); - me->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE); - Reached = true; - } - - CheckTimer = 1000; - } else CheckTimer -= diff; - - } - - void SendText(int32 iTextEntry, Player* player) - { - LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - const char* text = sObjectMgr->GetTrinityString(iTextEntry, loc_idx); - sWorld->SendServerMessage(SERVER_MSG_STRING, text, player); - } - - void AttackStart(Unit* who) - { - if (!who || PlayerGUID) - return; - - if (who->GetTypeId() == TYPEID_PLAYER && CAST_PLR(who)->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) - { - PlayerGUID = who->GetGUID(); - DoScriptText(SAY_RIZZLE_START, me); - DoCast(who, SPELL_RIZZLE_BLACKJACK, false); - return; - } - } - - void EnterCombat(Unit* /*who*/) {} - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - - if (id == 57) - { - me->DespawnOrUnsummon(); - return; - } - - ++CurrWP; - ContinueWP = true; - } - }; -}; - -/*#### -# mob_depth_charge -####*/ -class mob_depth_charge : public CreatureScript -{ -public: - mob_depth_charge() : CreatureScript("mob_depth_charge") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_depth_chargeAI (creature); - } - - struct mob_depth_chargeAI : public ScriptedAI - { - mob_depth_chargeAI(Creature* creature) : ScriptedAI(creature) {} - - bool WeMustDie; - uint32 WeMustDieTimer; - - void Reset() - { - me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - WeMustDie = false; - WeMustDieTimer = 1000; - } - - void UpdateAI(const uint32 diff) - { - if (WeMustDie) - { - if (WeMustDieTimer <= diff) - me->DespawnOrUnsummon(); - else - WeMustDieTimer -= diff; - } - return; - } - - void MoveInLineOfSight(Unit* who) - { - if (!who) - return; - - if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 5)) - { - DoCast(who, SPELL_DEPTH_CHARGE_TRAP); - WeMustDie = true; - return; - } - } - - void AttackStart(Unit* /*who*/) {} - - void EnterCombat(Unit* /*who*/) {} - }; -}; - void AddSC_azshara() { - new mobs_spitelashes(); - new npc_loramus_thalipedes(); - new mob_rizzle_sprysprocket(); - new mob_depth_charge(); } diff --git a/src/server/scripts/Kalimdor/azuremyst_isle.cpp b/src/server/scripts/Kalimdor/azuremyst_isle.cpp index 96e67c8de47..6a109cded3b 100644 --- a/src/server/scripts/Kalimdor/azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/azuremyst_isle.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Azuremyst_Isle SD%Complete: 75 -SDComment: Quest support: 9283, 9537, 9582, 9554, 9531, ? (special flight path, proper model for mount missing). Injured Draenei cosmetic only, 9582. +SDComment: Quest support: 9283, 9537, 9582, 9554, ? (special flight path, proper model for mount missing). Injured Draenei cosmetic only, 9582. SDCategory: Azuremyst Isle EndScriptData */ @@ -28,7 +28,6 @@ npc_draenei_survivor npc_engineer_spark_overgrind npc_injured_draenei npc_magwin -npc_geezle go_ravager_cage npc_death_ravager EndContentData */ @@ -407,166 +406,6 @@ public: }; -/*###### -## npc_geezle -######*/ - -enum Geezle -{ - QUEST_TREES_COMPANY = 9531, - - SPELL_TREE_DISGUISE = 30298, - - GEEZLE_SAY_1 = -1000629, - SPARK_SAY_2 = -1000630, - SPARK_SAY_3 = -1000631, - GEEZLE_SAY_4 = -1000632, - SPARK_SAY_5 = -1000633, - SPARK_SAY_6 = -1000634, - GEEZLE_SAY_7 = -1000635, - - EMOTE_SPARK = -1000636, - - MOB_SPARK = 17243, - GO_NAGA_FLAG = 181694 -}; - -Position const SparkPos = {-5029.91f, -11291.79f, 8.096f, 0.0f}; - -class npc_geezle : public CreatureScript -{ -public: - npc_geezle() : CreatureScript("npc_geezle") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_geezleAI(creature); - } - - struct npc_geezleAI : public ScriptedAI - { - npc_geezleAI(Creature* creature) : ScriptedAI(creature) {} - - uint64 SparkGUID; - - uint8 Step; - uint32 SayTimer; - - bool EventStarted; - - void Reset() - { - SparkGUID = 0; - Step = 0; - StartEvent(); - } - - void EnterCombat(Unit* /*who*/){} - - void StartEvent() - { - Step = 0; - EventStarted = true; - if (Creature* Spark = me->SummonCreature(MOB_SPARK, SparkPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000)) - { - SparkGUID = Spark->GetGUID(); - Spark->setActive(true); - Spark->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } - SayTimer = 8000; - } - - uint32 NextStep(uint8 Step) - { - Creature* Spark = Unit::GetCreature(*me, SparkGUID); - - switch (Step) - { - case 0: - if (Spark) - Spark->GetMotionMaster()->MovePoint(0, -5080.70f, -11253.61f, 0.56f); - me->GetMotionMaster()->MovePoint(0, -5092.26f, -11252, 0.71f); - return 9000; // NPCs are walking up to fire - case 1: - DespawnNagaFlag(true); - DoScriptText(EMOTE_SPARK, Spark); - return 1000; - case 2: - DoScriptText(GEEZLE_SAY_1, me, Spark); - if (Spark) - { - Spark->SetInFront(me); - me->SetInFront(Spark); - } - return 5000; - case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000; - case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000; - case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000; - case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000; - case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000; - case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000; - case 9: - me->GetMotionMaster()->MoveTargetedHome(); - if (Spark) - Spark->GetMotionMaster()->MovePoint(0, SparkPos); - CompleteQuest(); - return 9000; - case 10: - if (Spark) - Spark->DisappearAndDie(); - DespawnNagaFlag(false); - me->DisappearAndDie(); - default: return 99999999; - } - } - - // will complete Tree's company quest for all nearby players that are disguised as trees - void CompleteQuest() - { - float radius = 50.0f; - std::list players; - Trinity::AnyPlayerInObjectRangeCheck checker(me, radius); - Trinity::PlayerListSearcher searcher(me, players, checker); - me->VisitNearbyWorldObject(radius, searcher); - - for (std::list::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if ((*itr)->GetQuestStatus(QUEST_TREES_COMPANY) == QUEST_STATUS_INCOMPLETE && (*itr)->HasAura(SPELL_TREE_DISGUISE)) - (*itr)->KilledMonsterCredit(MOB_SPARK, 0); - } - - void DespawnNagaFlag(bool despawn) - { - std::list FlagList; - me->GetGameObjectListWithEntryInGrid(FlagList, GO_NAGA_FLAG, 100.0f); - - if (!FlagList.empty()) - { - for (std::list::const_iterator itr = FlagList.begin(); itr != FlagList.end(); ++itr) - { - if (despawn) - (*itr)->SetLootState(GO_JUST_DEACTIVATED); - else - (*itr)->Respawn(); - } - } - else - sLog->outError(LOG_FILTER_TSCR, "SD2 ERROR: FlagList is empty!"); - } - - void UpdateAI(const uint32 diff) - { - if (SayTimer <= diff) - { - if (EventStarted) - SayTimer = NextStep(Step++); - } - else - SayTimer -= diff; - } - }; - -}; - enum RavegerCage { NPC_DEATH_RAVAGER = 17556, @@ -762,7 +601,6 @@ void AddSC_azuremyst_isle() new npc_engineer_spark_overgrind(); new npc_injured_draenei(); new npc_magwin(); - new npc_geezle(); new npc_death_ravager(); new go_ravager_cage(); new npc_stillpine_capitive(); diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp deleted file mode 100644 index ec098951c03..00000000000 --- a/src/server/scripts/Kalimdor/boss_azuregos.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Azuregos -SD%Complete: 90 -SDComment: Teleport not included, spell reflect not effecting dots (Core problem) -SDCategory: Azshara -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" - -enum Say -{ - SAY_TELEPORT = -1000100 -}; - -enum Spells -{ - SPELL_MARKOFFROST = 23182, - SPELL_MANASTORM = 21097, - SPELL_CHILL = 21098, - SPELL_FROSTBREATH = 21099, - SPELL_REFLECT = 22067, - SPELL_CLEAVE = 8255, //Perhaps not right ID - SPELL_ENRAGE = 23537 -}; - -class boss_azuregos : public CreatureScript -{ -public: - boss_azuregos() : CreatureScript("boss_azuregos") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_azuregosAI (creature); - } - - struct boss_azuregosAI : public ScriptedAI - { - boss_azuregosAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 MarkOfFrostTimer; - uint32 ManaStormTimer; - uint32 ChillTimer; - uint32 BreathTimer; - uint32 TeleportTimer; - uint32 ReflectTimer; - uint32 CleaveTimer; - uint32 EnrageTimer; - bool Enraged; - - void Reset() - { - MarkOfFrostTimer = 35000; - ManaStormTimer = urand(5000, 17000); - ChillTimer = urand(10000, 30000); - BreathTimer = urand(2000, 8000); - TeleportTimer = 30000; - ReflectTimer = urand(15000, 30000); - CleaveTimer = 7000; - EnrageTimer = 0; - Enraged = false; - } - - void EnterCombat(Unit* /*who*/) {} - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (TeleportTimer <= diff) - { - DoScriptText(SAY_TELEPORT, me); - std::list& threatlist = me->getThreatManager().getThreatList(); - std::list::const_iterator i = threatlist.begin(); - for (i = threatlist.begin(); i!= threatlist.end(); ++i) - { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); - if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) - { - DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, unit->GetOrientation()); - } - } - - DoResetThreat(); - TeleportTimer = 30000; - } else TeleportTimer -= diff; - - // //MarkOfFrostTimer - // if (MarkOfFrostTimer <= diff) - // { - // DoCast(me->getVictim(), SPELL_MARKOFFROST); - // MarkOfFrostTimer = 25000; - // } else MarkOfFrostTimer -= diff; - - //ChillTimer - if (ChillTimer <= diff) - { - DoCast(me->getVictim(), SPELL_CHILL); - ChillTimer = urand(13000, 25000); - } else ChillTimer -= diff; - - //BreathTimer - if (BreathTimer <= diff) - { - DoCast(me->getVictim(), SPELL_FROSTBREATH); - BreathTimer = urand(10000, 15000); - } else BreathTimer -= diff; - - //ManaStormTimer - if (ManaStormTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_MANASTORM); - ManaStormTimer = urand(7500, 12500); - } else ManaStormTimer -= diff; - - //ReflectTimer - if (ReflectTimer <= diff) - { - DoCast(me, SPELL_REFLECT); - ReflectTimer = urand(20000, 35000); - } else ReflectTimer -= diff; - - //CleaveTimer - if (CleaveTimer <= diff) - { - DoCast(me->getVictim(), SPELL_CLEAVE); - CleaveTimer = 7000; - } else CleaveTimer -= diff; - - //EnrageTimer - if (HealthBelowPct(26) && !Enraged) - { - DoCast(me, SPELL_ENRAGE); - Enraged = true; - } - - DoMeleeAttackIfReady(); - } - }; - -}; - -void AddSC_boss_azuregos() -{ - new boss_azuregos(); -} diff --git a/src/server/scripts/Kalimdor/darkshore.cpp b/src/server/scripts/Kalimdor/darkshore.cpp index 0e02a77169e..3330898ebe4 100644 --- a/src/server/scripts/Kalimdor/darkshore.cpp +++ b/src/server/scripts/Kalimdor/darkshore.cpp @@ -18,15 +18,12 @@ /* ScriptData SDName: Darkshore -SD%Complete: 100 -SDComment: Quest support: 731, 2078, 5321 +SD%Complete: 0 +SDComment: Quest support: SDCategory: Darkshore EndScriptData */ /* ContentData -npc_kerlonian -npc_prospector_remtravel -npc_threshwackonator EndContentData */ #include "ScriptMgr.h" @@ -35,369 +32,6 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "ScriptedFollowerAI.h" -/*#### -# npc_kerlonian -####*/ - -enum Kerlonian -{ - SAY_KER_START = -1000434, - - EMOTE_KER_SLEEP_1 = -1000435, - EMOTE_KER_SLEEP_2 = -1000436, - EMOTE_KER_SLEEP_3 = -1000437, - - SAY_KER_SLEEP_1 = -1000438, - SAY_KER_SLEEP_2 = -1000439, - SAY_KER_SLEEP_3 = -1000440, - SAY_KER_SLEEP_4 = -1000441, - - EMOTE_KER_AWAKEN = -1000445, - - SAY_KER_ALERT_1 = -1000442, - SAY_KER_ALERT_2 = -1000443, - - SAY_KER_END = -1000444, - - SPELL_SLEEP_VISUAL = 25148, - SPELL_AWAKEN = 17536, - QUEST_SLEEPER_AWAKENED = 5321, - NPC_LILADRIS = 11219, //attackers entries unknown - FACTION_KER_ESCORTEE = 113 -}; - -//TODO: make concept similar as "ringo" -escort. Find a way to run the scripted attacks, _if_ player are choosing road. -class npc_kerlonian : public CreatureScript -{ -public: - npc_kerlonian() : CreatureScript("npc_kerlonian") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED) - { - if (npc_kerlonianAI* pKerlonianAI = CAST_AI(npc_kerlonian::npc_kerlonianAI, creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - DoScriptText(SAY_KER_START, creature, player); - pKerlonianAI->StartFollow(player, FACTION_KER_ESCORTEE, quest); - } - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_kerlonianAI(creature); - } - - struct npc_kerlonianAI : public FollowerAI - { - npc_kerlonianAI(Creature* creature) : FollowerAI(creature) { } - - uint32 FallAsleepTimer; - - void Reset() - { - FallAsleepTimer = urand(10000, 45000); - } - - void MoveInLineOfSight(Unit* who) - { - FollowerAI::MoveInLineOfSight(who); - - if (!me->getVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_LILADRIS) - { - if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE*5)) - { - if (Player* player = GetLeaderForFollower()) - { - if (player->GetQuestStatus(QUEST_SLEEPER_AWAKENED) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_SLEEPER_AWAKENED, me); - - DoScriptText(SAY_KER_END, me); - } - - SetFollowComplete(); - } - } - } - - void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell) - { - if (HasFollowState(STATE_FOLLOW_INPROGRESS | STATE_FOLLOW_PAUSED) && pSpell->Id == SPELL_AWAKEN) - ClearSleeping(); - } - - void SetSleeping() - { - SetFollowPaused(true); - - DoScriptText(RAND(EMOTE_KER_SLEEP_1, EMOTE_KER_SLEEP_2, EMOTE_KER_SLEEP_3), me); - - DoScriptText(RAND(SAY_KER_SLEEP_1, SAY_KER_SLEEP_2, SAY_KER_SLEEP_3, SAY_KER_SLEEP_4), me); - - me->SetStandState(UNIT_STAND_STATE_SLEEP); - DoCast(me, SPELL_SLEEP_VISUAL, false); - } - - void ClearSleeping() - { - me->RemoveAurasDueToSpell(SPELL_SLEEP_VISUAL); - me->SetStandState(UNIT_STAND_STATE_STAND); - - DoScriptText(EMOTE_KER_AWAKEN, me); - - SetFollowPaused(false); - } - - void UpdateFollowerAI(const uint32 Diff) - { - if (!UpdateVictim()) - { - if (!HasFollowState(STATE_FOLLOW_INPROGRESS)) - return; - - if (!HasFollowState(STATE_FOLLOW_PAUSED)) - { - if (FallAsleepTimer <= Diff) - { - SetSleeping(); - FallAsleepTimer = urand(25000, 90000); - } - else - FallAsleepTimer -= Diff; - } - - return; - } - - DoMeleeAttackIfReady(); - } - }; - -}; - -/*#### -# npc_prospector_remtravel -####*/ - -enum Remtravel -{ - SAY_REM_START = -1000327, - SAY_REM_AGGRO = -1000328, - SAY_REM_RAMP1_1 = -1000329, - SAY_REM_RAMP1_2 = -1000330, - SAY_REM_BOOK = -1000331, - SAY_REM_TENT1_1 = -1000332, - SAY_REM_TENT1_2 = -1000333, - SAY_REM_MOSS = -1000334, - EMOTE_REM_MOSS = -1000335, - SAY_REM_MOSS_PROGRESS = -1000336, - SAY_REM_PROGRESS = -1000337, - SAY_REM_REMEMBER = -1000338, - EMOTE_REM_END = -1000339, - - FACTION_ESCORTEE = 10, - QUEST_ABSENT_MINDED_PT2 = 731, - NPC_GRAVEL_SCOUT = 2158, - NPC_GRAVEL_BONE = 2159, - NPC_GRAVEL_GEO = 2160 -}; - -class npc_prospector_remtravel : public CreatureScript -{ -public: - npc_prospector_remtravel() : CreatureScript("npc_prospector_remtravel") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) - { - if (npc_escortAI* pEscortAI = CAST_AI(npc_prospector_remtravel::npc_prospector_remtravelAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); - - creature->setFaction(FACTION_ESCORTEE); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_prospector_remtravelAI(creature); - } - - struct npc_prospector_remtravelAI : public npc_escortAI - { - npc_prospector_remtravelAI(Creature* creature) : npc_escortAI(creature) {} - - void WaypointReached(uint32 waypointId) - { - if (Player* player = GetPlayerForEscort()) - { - switch (waypointId) - { - case 0: - DoScriptText(SAY_REM_START, me, player); - break; - case 5: - DoScriptText(SAY_REM_RAMP1_1, me, player); - break; - case 6: - DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 9: - DoScriptText(SAY_REM_RAMP1_2, me, player); - break; - case 14: - //depend quest rewarded? - DoScriptText(SAY_REM_BOOK, me, player); - break; - case 15: - DoScriptText(SAY_REM_TENT1_1, me, player); - break; - case 16: - DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 17: - DoScriptText(SAY_REM_TENT1_2, me, player); - break; - case 26: - DoScriptText(SAY_REM_MOSS, me, player); - break; - case 27: - DoScriptText(EMOTE_REM_MOSS, me, player); - break; - case 28: - DoScriptText(SAY_REM_MOSS_PROGRESS, me, player); - break; - case 29: - DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 31: - DoScriptText(SAY_REM_PROGRESS, me, player); - break; - case 41: - DoScriptText(SAY_REM_REMEMBER, me, player); - break; - case 42: - DoScriptText(EMOTE_REM_END, me, player); - player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); - break; - } - } - } - - void Reset() {} - - void EnterCombat(Unit* who) - { - if (urand(0, 1)) - DoScriptText(SAY_REM_AGGRO, me, who); - } - - void JustSummoned(Creature* /*pSummoned*/) - { - //unsure if it should be any - //pSummoned->AI()->AttackStart(me); - } - }; - -}; - -/*#### -# npc_threshwackonator -####*/ - -enum Threshwackonator -{ - EMOTE_START = -1000325, //signed for 4966 - SAY_AT_CLOSE = -1000326, //signed for 4966 - QUEST_GYROMAST_REV = 2078, - NPC_GELKAK = 6667, - FACTION_HOSTILE = 14 -}; - -#define GOSSIP_ITEM_INSERT_KEY "[PH] Insert key" - -class npc_threshwackonator : public CreatureScript -{ -public: - npc_threshwackonator() : CreatureScript("npc_threshwackonator") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - player->CLOSE_GOSSIP_MENU(); - - if (npc_threshwackonatorAI* pThreshAI = CAST_AI(npc_threshwackonator::npc_threshwackonatorAI, creature->AI())) - { - DoScriptText(EMOTE_START, creature); - pThreshAI->StartFollow(player); - } - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_threshwackonatorAI(creature); - } - - struct npc_threshwackonatorAI : public FollowerAI - { - npc_threshwackonatorAI(Creature* creature) : FollowerAI(creature) { } - - void Reset() { } - - void MoveInLineOfSight(Unit* who) - { - FollowerAI::MoveInLineOfSight(who); - - if (!me->getVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_GELKAK) - { - if (me->IsWithinDistInMap(who, 10.0f)) - { - DoScriptText(SAY_AT_CLOSE, who); - DoAtEnd(); - } - } - } - - void DoAtEnd() - { - me->setFaction(FACTION_HOSTILE); - - if (Player* pHolder = GetLeaderForFollower()) - me->AI()->AttackStart(pHolder); - - SetFollowComplete(); - } - }; - -}; - void AddSC_darkshore() { - new npc_kerlonian(); - new npc_prospector_remtravel(); - new npc_threshwackonator(); } diff --git a/src/server/scripts/Kalimdor/desolace.cpp b/src/server/scripts/Kalimdor/desolace.cpp index e196c71f681..a3da0019a8b 100644 --- a/src/server/scripts/Kalimdor/desolace.cpp +++ b/src/server/scripts/Kalimdor/desolace.cpp @@ -19,14 +19,12 @@ /* ScriptData SDName: Desolace SD%Complete: 100 -SDComment: Quest support: 5561 +SDComment: Quest support: 5561, 5581 SDCategory: Desolace EndScriptData */ /* ContentData npc_aged_dying_ancient_kodo -go_iruxos -npc_dalinda_malem go_demon_portal EndContentData */ @@ -172,104 +170,6 @@ public: }; -/*###### -## go_iruxos -## Hand of Iruxos -######*/ - -enum Iruxos -{ - QUEST_HAND_IRUXOS = 5381, - NPC_DEMON_SPIRIT = 11876, -}; - -class go_iruxos : public GameObjectScript -{ - public: - go_iruxos() : GameObjectScript("go_iruxos") { } - - bool OnGossipHello(Player* player, GameObject* go) - { - if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true)) - player->SummonCreature(NPC_DEMON_SPIRIT, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); - - return true; - } -}; - -/*###### -## npc_dalinda_malem. Quest 1440 -######*/ - -enum Dalinda -{ - QUEST_RETURN_TO_VAHLARRIEL = 1440 -}; - -class npc_dalinda : public CreatureScript -{ -public: - npc_dalinda() : CreatureScript("npc_dalinda") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL) - { - if (npc_escortAI* pEscortAI = CAST_AI(npc_dalinda::npc_dalindaAI, creature->AI())) - { - pEscortAI->Start(true, false, player->GetGUID()); - creature->setFaction(113); - } - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_dalindaAI(creature); - } - - struct npc_dalindaAI : public npc_escortAI - { - npc_dalindaAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) - { - Player* player = GetPlayerForEscort(); - - switch (waypointId) - { - case 1: - me->IsStandState(); - break; - case 15: - if (player) - player->GroupEventHappens(QUEST_RETURN_TO_VAHLARRIEL, me); - break; - } - } - - void EnterCombat(Unit* /*who*/) { } - - void Reset() {} - - void JustDied(Unit* /*killer*/) - { - if (Player* player = GetPlayerForEscort()) - player->FailQuest(QUEST_RETURN_TO_VAHLARRIEL); - return; - } - - void UpdateAI(const uint32 Diff) - { - npc_escortAI::UpdateAI(Diff); - if (!UpdateVictim()) - return; - DoMeleeAttackIfReady(); - } - }; -}; - /*###### ## go_demon_portal ######*/ @@ -301,7 +201,5 @@ class go_demon_portal : public GameObjectScript void AddSC_desolace() { new npc_aged_dying_ancient_kodo(); - new go_iruxos(); - new npc_dalinda(); new go_demon_portal(); } diff --git a/src/server/scripts/Kalimdor/durotar.cpp b/src/server/scripts/Kalimdor/durotar.cpp index ec06a542b6f..3c66da1917e 100644 --- a/src/server/scripts/Kalimdor/durotar.cpp +++ b/src/server/scripts/Kalimdor/durotar.cpp @@ -17,25 +17,24 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "Vehicle.h" #include "SpellScript.h" /*###### -##Quest 5441: Lazy Peons -##npc_lazy_peon +## Quest 25134: Lazy Peons +## npc_lazy_peon ######*/ enum LazyPeonYells { - SAY_SPELL_HIT = -1000600 //Ow! OK, I''ll get back to work, $N!' + SAY_SPELL_HIT = -1000600 // Ow! OK, I''ll get back to work, $N!' }; enum LazyPeon { - QUEST_LAZY_PEONS = 5441, - GO_LUMBERPILE = 175784, - SPELL_BUFF_SLEEP = 17743, - SPELL_AWAKEN_PEON = 19938 + QUEST_LAZY_PEONS = 25134, + GO_LUMBERPILE = 175784, + SPELL_BUFF_SLEEP = 17743, + SPELL_AWAKEN_PEON = 19938 }; class npc_lazy_peon : public CreatureScript @@ -90,7 +89,7 @@ public: if (RebuffTimer <= Diff) { DoCast(me, SPELL_BUFF_SLEEP); - RebuffTimer = 300000; //Rebuff agian in 5 minutes + RebuffTimer = 300000; //Rebuff agian in 5 minutes } else RebuffTimer -= Diff; @@ -101,431 +100,6 @@ public: }; }; -enum Texts -{ - // Tiger Matriarch Credit - SAY_MATRIARCH_AGGRO = 0, - - // Troll Volunteer - SAY_VOLUNTEER_START = 0, - SAY_VOLUNTEER_END = 1, -}; - -enum Spells -{ - // Tiger Matriarch Credit - SPELL_SUMMON_MATRIARCH = 75187, - SPELL_NO_SUMMON_AURA = 75213, - SPELL_DETECT_INVIS = 75180, - SPELL_SUMMON_ZENTABRA_TRIGGER = 75212, - - // Tiger Matriarch - SPELL_POUNCE = 61184, - SPELL_FURIOUS_BITE = 75164, - SPELL_SUMMON_ZENTABRA = 75181, - SPELL_SPIRIT_OF_THE_TIGER_RIDER = 75166, - SPELL_EJECT_PASSENGERS = 50630, - - // Troll Volunteer - SPELL_VOLUNTEER_AURA = 75076, - SPELL_PETACT_AURA = 74071, - SPELL_QUEST_CREDIT = 75106, - SPELL_MOUNTING_CHECK = 75420, - SPELL_TURNIN = 73953, - SPELL_AOE_TURNIN = 75107, - - // Vol'jin War Drums - SPELL_MOTIVATE_1 = 75088, - SPELL_MOTIVATE_2 = 75086, -}; - -enum Creatures -{ - // Tiger Matriarch Credit - NPC_TIGER_VEHICLE = 40305, - - // Troll Volunteer - NPC_URUZIN = 40253, - NPC_VOLUNTEER_1 = 40264, - NPC_VOLUNTEER_2 = 40260, - - // Vol'jin War Drums - NPC_CITIZEN_1 = 40256, - NPC_CITIZEN_2 = 40257, -}; - -enum Events -{ - // Tiger Matriarch Credit - EVENT_CHECK_SUMMON_AURA = 1, - - // Tiger Matriarch - EVENT_POUNCE = 2, - EVENT_NOSUMMON = 3, -}; - -enum Points -{ - POINT_URUZIN = 4026400, -}; - -class npc_tiger_matriarch_credit : public CreatureScript -{ - public: - npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { } - - struct npc_tiger_matriarch_creditAI : public Scripted_NoMovementAI - { - npc_tiger_matriarch_creditAI(Creature* creature) : Scripted_NoMovementAI(creature) - { - events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000); - } - - void UpdateAI(uint32 const diff) - { - events.Update(diff); - - if (events.ExecuteEvent() == EVENT_CHECK_SUMMON_AURA) - { - std::list tigers; - GetCreatureListWithEntryInGrid(tigers, me, NPC_TIGER_VEHICLE, 15.0f); - if (!tigers.empty()) - { - for (std::list::iterator itr = tigers.begin(); itr != tigers.end(); ++itr) - { - if (!(*itr)->isSummon()) - continue; - - if (Unit* summoner = (*itr)->ToTempSummon()->GetSummoner()) - if (!summoner->HasAura(SPELL_NO_SUMMON_AURA) && !summoner->HasAura(SPELL_SUMMON_ZENTABRA_TRIGGER) - && !summoner->isInCombat()) - { - me->AddAura(SPELL_NO_SUMMON_AURA, summoner); - me->AddAura(SPELL_DETECT_INVIS, summoner); - summoner->CastSpell(summoner, SPELL_SUMMON_MATRIARCH, true); - Talk(SAY_MATRIARCH_AGGRO, summoner->GetGUID()); - } - } - } - - events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 5000); - } - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tiger_matriarch_creditAI(creature); - } -}; - -class npc_tiger_matriarch : public CreatureScript -{ - public: - npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") {} - - struct npc_tiger_matriarchAI : public ScriptedAI - { - npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature), - _tigerGuid(0) - { - } - - void EnterCombat(Unit* /*target*/) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_POUNCE, 100); - _events.ScheduleEvent(EVENT_NOSUMMON, 50000); - } - - void IsSummonedBy(Unit* summoner) - { - if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle()) - return; - - _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID(); - if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) - { - me->AddThreat(tiger, 500000.0f); - DoCast(me, SPELL_FURIOUS_BITE); - } - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() != TYPEID_UNIT || !victim->isSummon()) - return; - - if (Unit* vehSummoner = victim->ToTempSummon()->GetSummoner()) - { - vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA); - vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS); - vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER); - vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); - } - me->DespawnOrUnsummon(); - } - - void DamageTaken(Unit* attacker, uint32& damage) - { - if (!attacker->isSummon()) - return; - - if (HealthBelowPct(20)) - { - damage = 0; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* vehSummoner = attacker->ToTempSummon()->GetSummoner()) - { - vehSummoner->AddAura(SPELL_SUMMON_ZENTABRA_TRIGGER, vehSummoner); - vehSummoner->CastSpell(vehSummoner, SPELL_SUMMON_ZENTABRA, true); - attacker->CastSpell(attacker, SPELL_EJECT_PASSENGERS, true); - vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA); - vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS); - vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER); - vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); - } - - me->DespawnOrUnsummon(); - } - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (!_tigerGuid) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_POUNCE: - DoCastVictim(SPELL_POUNCE); - _events.ScheduleEvent(EVENT_POUNCE, 30000); - break; - case EVENT_NOSUMMON: // Reapply SPELL_NO_SUMMON_AURA - if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) - { - if (tiger->isSummon()) - if (Unit* vehSummoner = tiger->ToTempSummon()->GetSummoner()) - me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner); - } - _events.ScheduleEvent(EVENT_NOSUMMON, 50000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - uint64 _tigerGuid; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tiger_matriarchAI(creature); - } -}; - -// These models was found in sniff. -// TODO: generalize these models with race from dbc -uint32 const trollmodel[] = -{11665, 11734, 11750, 12037, 12038, 12042, 12049, 12849, 13529, 14759, 15570, 15701, -15702, 1882, 1897, 1976, 2025, 27286, 2734, 2735, 4084, 4085, 4087, 4089, 4231, 4357, -4358, 4360, 4361, 4362, 4363, 4370, 4532, 4537, 4540, 4610, 6839, 7037, 9767, 9768}; - -class npc_troll_volunteer : public CreatureScript -{ - public: - npc_troll_volunteer() : CreatureScript("npc_troll_volunteer") { } - - struct npc_troll_volunteerAI : public ScriptedAI - { - npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature) - { - } - - void InitializeAI() - { - if (me->isDead() || !me->GetOwner()) - return; - - Reset(); - - switch (urand(0, 3)) - { - case 0: - _mountModel = 6471; - break; - case 1: - _mountModel = 6473; - break; - case 2: - _mountModel = 6469; - break; - default: - _mountModel = 6472; - break; - } - me->SetDisplayId(trollmodel[urand(0, 39)]); - if (Player* player = me->GetOwner()->ToPlayer()) - me->GetMotionMaster()->MoveFollow(player, 5.0f, float(rand_norm() + 1.0f) * M_PI / 3.0f * 4.0f); - } - - void Reset() - { - _complete = false; - me->AddAura(SPELL_VOLUNTEER_AURA, me); - me->AddAura(SPELL_MOUNTING_CHECK, me); - DoCast(me, SPELL_PETACT_AURA); - me->SetReactState(REACT_PASSIVE); - Talk(SAY_VOLUNTEER_START); - } - - // This is needed for mount check aura to know what mountmodel the npc got stored - uint32 GetMountId() - { - return _mountModel; - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - if (id == POINT_URUZIN) - me->DespawnOrUnsummon(); - } - - void SpellHit(Unit* caster, SpellInfo const* spell) - { - if (spell->Id == SPELL_AOE_TURNIN && caster->GetEntry() == NPC_URUZIN && !_complete) - { - _complete = true; // Preventing from giving credit twice - DoCast(me, SPELL_TURNIN); - DoCast(me, SPELL_QUEST_CREDIT); - me->RemoveAurasDueToSpell(SPELL_MOUNTING_CHECK); - me->Dismount(); - Talk(SAY_VOLUNTEER_END); - me->GetMotionMaster()->MovePoint(POINT_URUZIN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); - } - } - - private: - uint32 _mountModel; - bool _complete; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_troll_volunteerAI(creature); - } -}; - -typedef npc_troll_volunteer::npc_troll_volunteerAI VolunteerAI; - -class spell_mount_check : public SpellScriptLoader -{ - public: - spell_mount_check() : SpellScriptLoader("spell_mount_check") {} - - class spell_mount_check_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mount_check_AuraScript) - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - Unit* owner = target->GetOwner(); - - if (!owner) - return; - - if (owner->IsMounted() && !target->IsMounted()) - { - if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI())) - target->Mount(volunteerAI->GetMountId()); - } - else if (!owner->IsMounted() && target->IsMounted()) - target->Dismount(); - - target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); - target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK)); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mount_check_AuraScript(); - } -}; - -class spell_voljin_war_drums : public SpellScriptLoader -{ - public: - spell_voljin_war_drums() : SpellScriptLoader("spell_voljin_war_drums") {} - - class spell_voljin_war_drums_SpellScript : public SpellScript - { - PrepareSpellScript(spell_voljin_war_drums_SpellScript) - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_2)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - uint32 motivate = 0; - if (target->GetEntry() == NPC_CITIZEN_1) - motivate = SPELL_MOTIVATE_1; - else if (target->GetEntry() == NPC_CITIZEN_2) - motivate = SPELL_MOTIVATE_2; - if (motivate) - caster->CastSpell(target, motivate, false); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_voljin_war_drums_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_voljin_war_drums_SpellScript(); - } -}; - enum VoodooSpells { SPELL_BREW = 16712, // Special Brew @@ -545,9 +119,9 @@ class spell_voodoo : public SpellScriptLoader class spell_voodoo_SpellScript : public SpellScript { - PrepareSpellScript(spell_voodoo_SpellScript) + PrepareSpellScript(spell_voodoo_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) + bool Validate(SpellInfo const* /*spell*/) { if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) || !sSpellMgr->GetSpellInfo(SPELL_HEX1) || !sSpellMgr->GetSpellInfo(SPELL_HEX2) || @@ -579,10 +153,5 @@ class spell_voodoo : public SpellScriptLoader void AddSC_durotar() { new npc_lazy_peon(); - new npc_tiger_matriarch_credit(); - new npc_tiger_matriarch(); - new npc_troll_volunteer(); - new spell_mount_check(); - new spell_voljin_war_drums(); new spell_voodoo(); } diff --git a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp index 5800a6a58a0..c2953ba38ef 100644 --- a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp @@ -19,16 +19,13 @@ /* ScriptData SDName: Dustwallow_Marsh SD%Complete: 95 -SDComment: Quest support: 11180, 558, 11126, 11142, 11174, Vendor Nat Pagle +SDComment: Quest support: 1270, 1222, 27245 SDCategory: Dustwallow Marsh EndScriptData */ /* ContentData -mobs_risen_husk_spirit -npc_lady_jaina_proudmoore -npc_nat_pagle -npc_private_hendel -npc_cassa_crimsonwing - handled by npc_taxi +npc_stinky +go_blackhoof_cage EndContentData */ #include "ScriptMgr.h" @@ -37,443 +34,6 @@ EndContentData */ #include "ScriptedGossip.h" #include "SpellScript.h" -/*###### -## mobs_risen_husk_spirit -######*/ - -enum HauntingWitchHill -{ - // Quest - QUEST_WHATS_HAUNTING_WITCH_HILL = 11180, - - // General spells - SPELL_SUMMON_RESTLESS_APPARITION = 42511, - SPELL_WITCH_HILL_INFORMATION_CREDIT = 42512, - - // Risen Husk specific - SPELL_CONSUME_FLESH = 37933, - NPC_RISEN_HUSK = 23555, - - // Risen Spirit specific - SPELL_INTANGIBLE_PRESENCE = 43127, - NPC_RISEN_SPIRIT = 23554, - - // Events - EVENT_CONSUME_FLESH = 0, - EVENT_INTANGIBLE_PRESENCE = 1, -}; - -class mobs_risen_husk_spirit : public CreatureScript -{ - public: - mobs_risen_husk_spirit() : CreatureScript("mobs_risen_husk_spirit") { } - - struct mobs_risen_husk_spiritAI : public ScriptedAI - { - mobs_risen_husk_spiritAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() - { - events.Reset(); - if (me->GetEntry() == NPC_RISEN_HUSK) - events.ScheduleEvent(EVENT_CONSUME_FLESH, 5000); - else if (me->GetEntry() == NPC_RISEN_SPIRIT) - events.ScheduleEvent(EVENT_INTANGIBLE_PRESENCE, 5000); - } - - void JustDied(Unit* killer) - { - if (killer->GetTypeId() == TYPEID_PLAYER) - { - if (killer->ToPlayer()->GetQuestStatus(QUEST_WHATS_HAUNTING_WITCH_HILL) == QUEST_STATUS_INCOMPLETE) - { - DoCast(me, SPELL_SUMMON_RESTLESS_APPARITION, true); - DoCast(killer, SPELL_WITCH_HILL_INFORMATION_CREDIT, true); - } - } - } - - void UpdateAI(uint32 const diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CONSUME_FLESH: - DoCastVictim(SPELL_CONSUME_FLESH); - events.ScheduleEvent(EVENT_CONSUME_FLESH, 15000); - break; - case EVENT_INTANGIBLE_PRESENCE: - DoCastVictim(SPELL_INTANGIBLE_PRESENCE); - events.ScheduleEvent(EVENT_INTANGIBLE_PRESENCE, 15000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mobs_risen_husk_spiritAI (creature); - } -}; - -/*###### -## npc_theramor_guard -######*/ - -enum TheramoreGuard -{ - SAY_QUEST1 = -1000641, - SAY_QUEST2 = -1000642, - SAY_QUEST3 = -1000643, - SAY_QUEST4 = -1000644, - SAY_QUEST5 = -1000645, - SAY_QUEST6 = -1000646, - SAY_QUEST7 = -1000647, - SAY_QUEST8 = -1000648, - SAY_QUEST9 = -1000649, - - QUEST_DISCREDITING_THE_DESERTERS = 11133, - - NPC_THERAMORE_GUARD = 4979, - - SPELL_DOCTORED_LEAFLET = 42725, - SPELL_PROPAGANDIZED = 42246, -}; - -#define GOSSIP_ITEM_THERAMORE_GUARD "You look like an intelligent person. Why don't you read one of these leaflets and give it some thought?" - -class npc_theramore_guard : public CreatureScript -{ -public: - npc_theramore_guard() : CreatureScript("npc_theramore_guard") { } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->GetQuestStatus(QUEST_DISCREDITING_THE_DESERTERS) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_THERAMORE_GUARD, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - - if (action == GOSSIP_SENDER_INFO) - { - player->CLOSE_GOSSIP_MENU(); - player->KilledMonsterCredit(NPC_THERAMORE_GUARD, 0); - DoScriptText(SAY_QUEST1, creature); - creature->CastSpell(creature, SPELL_DOCTORED_LEAFLET, false); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->YellTimer = 4000; - CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->bYellTimer = true; - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_theramore_guardAI(creature); - } - - struct npc_theramore_guardAI : public ScriptedAI - { - npc_theramore_guardAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 YellTimer; - uint32 Step; - bool bYellTimer; - - void Reset() - { - bYellTimer = false; - Step = 0; - } - - void UpdateAI(const uint32 Diff) - { - if (!me->HasAura(SPELL_PROPAGANDIZED)) - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - if (bYellTimer && YellTimer <= Diff) - { - switch (Step) - { - case 0: - DoScriptText(RAND(SAY_QUEST2, SAY_QUEST3, SAY_QUEST4, SAY_QUEST5, SAY_QUEST6), me); - YellTimer = 3000; - ++Step; - break; - case 1: - DoScriptText(RAND(SAY_QUEST7, SAY_QUEST8, SAY_QUEST9), me); - me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); - Step = 0; - bYellTimer = false; - break; - } - } - else - YellTimer -= Diff; - } - }; -}; - -/*###### -## npc_lady_jaina_proudmoore -######*/ - -enum LadyJaina -{ - QUEST_JAINAS_AUTOGRAPH = 558, - SPELL_JAINAS_AUTOGRAPH = 23122 -}; - -#define GOSSIP_ITEM_JAINA "I know this is rather silly but i have a young ward who is a bit shy and would like your autograph." - -class npc_lady_jaina_proudmoore : public CreatureScript -{ -public: - npc_lady_jaina_proudmoore() : CreatureScript("npc_lady_jaina_proudmoore") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_SENDER_INFO) - { - player->SEND_GOSSIP_MENU(7012, creature->GetGUID()); - player->CastSpell(player, SPELL_JAINAS_AUTOGRAPH, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_JAINAS_AUTOGRAPH) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_JAINA, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - -}; - -/*###### -## npc_nat_pagle -######*/ - -enum NatPagle -{ - QUEST_NATS_MEASURING_TAPE = 8227 -}; - -class npc_nat_pagle : public CreatureScript -{ -public: - npc_nat_pagle() : CreatureScript("npc_nat_pagle") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->isVendor() && player->GetQuestRewardStatus(QUEST_NATS_MEASURING_TAPE)) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - player->SEND_GOSSIP_MENU(7640, creature->GetGUID()); - } - else - player->SEND_GOSSIP_MENU(7638, creature->GetGUID()); - - return true; - } - -}; - -/*###### -## npc_private_hendel -######*/ - -enum Hendel -{ - // looks like all this text ids are wrong. - SAY_PROGRESS_1_TER = -1000411, // signed for 3568 - SAY_PROGRESS_2_HEN = -1000412, // signed for 3568 - SAY_PROGRESS_3_TER = -1000413, - SAY_PROGRESS_4_TER = -1000414, - EMOTE_SURRENDER = -1000415, - - QUEST_MISSING_DIPLO_PT16 = 1324, - FACTION_HOSTILE = 168, //guessed, may be different - - NPC_SENTRY = 5184, //helps hendel - NPC_JAINA = 4968, //appears once hendel gives up - NPC_TERVOSH = 4967 -}; - -//TODO: develop this further, end event not created -class npc_private_hendel : public CreatureScript -{ -public: - npc_private_hendel() : CreatureScript("npc_private_hendel") { } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT16) - creature->setFaction(FACTION_HOSTILE); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_private_hendelAI(creature); - } - - struct npc_private_hendelAI : public ScriptedAI - { - npc_private_hendelAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() - { - me->RestoreFaction(); - } - - void AttackedBy(Unit* pAttacker) - { - if (me->getVictim()) - return; - - if (me->IsFriendlyTo(pAttacker)) - return; - - AttackStart(pAttacker); - } - - void DamageTaken(Unit* pDoneBy, uint32 &Damage) - { - if (Damage > me->GetHealth() || me->HealthBelowPctDamaged(20, Damage)) - { - Damage = 0; - - if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself()) - player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me); - - DoScriptText(EMOTE_SURRENDER, me); - EnterEvadeMode(); - } - } - }; - -}; - -/*###### -## npc_zelfrax -######*/ - -Position const MovePosition = {-2967.030f, -3872.1799f, 35.620f, 0.0f}; - -enum Zelfrax -{ - SAY_ZELFRAX = -1000472, - SAY_ZELFRAX_2 = -1000473 -}; - -class npc_zelfrax : public CreatureScript -{ -public: - npc_zelfrax() : CreatureScript("npc_zelfrax") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_zelfraxAI(creature); - } - - struct npc_zelfraxAI : public ScriptedAI - { - npc_zelfraxAI(Creature* creature) : ScriptedAI(creature) - { - MoveToDock(); - } - - void AttackStart(Unit* who) - { - if (!who) - return; - - if (me->Attack(who, true)) - { - me->SetInCombatWith(who); - who->SetInCombatWith(me); - - if (IsCombatMovementAllowed()) - me->GetMotionMaster()->MoveChase(who); - } - } - - void MovementInform(uint32 Type, uint32 /*Id*/) - { - if (Type != POINT_MOTION_TYPE) - return; - - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - SetCombatMovement(true); - - if (me->isInCombat()) - if (Unit* unit = me->getVictim()) - me->GetMotionMaster()->MoveChase(unit); - } - - void MoveToDock() - { - SetCombatMovement(false); - me->GetMotionMaster()->MovePoint(0, MovePosition); - DoScriptText(SAY_ZELFRAX, me); - DoScriptText(SAY_ZELFRAX_2, me); - } - - void UpdateAI(uint32 const /*Diff*/) - { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; - -}; - /*###### ## npc_stinky ######*/ @@ -771,13 +331,7 @@ public: void AddSC_dustwallow_marsh() { - new mobs_risen_husk_spirit(); - new npc_lady_jaina_proudmoore(); - new npc_nat_pagle(); - new npc_private_hendel(); - new npc_zelfrax(); new npc_stinky(); - new npc_theramore_guard(); new spell_ooze_zap(); new spell_ooze_zap_channel_end(); new spell_energize_aoe(); diff --git a/src/server/scripts/Kalimdor/felwood.cpp b/src/server/scripts/Kalimdor/felwood.cpp index 1a0aa7b21c0..1d504c02149 100644 --- a/src/server/scripts/Kalimdor/felwood.cpp +++ b/src/server/scripts/Kalimdor/felwood.cpp @@ -19,87 +19,17 @@ /* ScriptData SDName: Felwood SD%Complete: 95 -SDComment: Quest support: 4101, 4102 +SDComment: Quest support: SDCategory: Felwood EndScriptData */ /* ContentData -npcs_riverbreeze_and_silversky EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -/*###### -## npcs_riverbreeze_and_silversky -######*/ - -#define GOSSIP_ITEM_BEACON "Please make me a Cenarion Beacon" - -enum RiverbreezeAndSilversky -{ - SPELL_CENARION_BEACON = 15120, - - NPC_ARATHANDRIS_SILVERSKY = 9528, - NPC_MAYBESS_RIVERBREEZE = 9529, - - QUEST_CLEASING_FELWOOD_A = 4101, - QUEST_CLEASING_FELWOOD_H = 4102 -}; - -class npcs_riverbreeze_and_silversky : public CreatureScript -{ -public: - npcs_riverbreeze_and_silversky() : CreatureScript("npcs_riverbreeze_and_silversky") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, SPELL_CENARION_BEACON, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - uint32 creatureId = creature->GetEntry(); - - if (creatureId == NPC_ARATHANDRIS_SILVERSKY) - { - if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A)) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(2848, creature->GetGUID()); - } else if (player->GetTeam() == HORDE) - player->SEND_GOSSIP_MENU(2845, creature->GetGUID()); - else - player->SEND_GOSSIP_MENU(2844, creature->GetGUID()); - } - - if (creatureId == NPC_MAYBESS_RIVERBREEZE) - { - if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H)) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(2849, creature->GetGUID()); - } else if (player->GetTeam() == ALLIANCE) - player->SEND_GOSSIP_MENU(2843, creature->GetGUID()); - else - player->SEND_GOSSIP_MENU(2842, creature->GetGUID()); - } - - return true; - } -}; - void AddSC_felwood() { - new npcs_riverbreeze_and_silversky(); } diff --git a/src/server/scripts/Kalimdor/feralas.cpp b/src/server/scripts/Kalimdor/feralas.cpp index 4fcd20951c9..79aa25cea71 100644 --- a/src/server/scripts/Kalimdor/feralas.cpp +++ b/src/server/scripts/Kalimdor/feralas.cpp @@ -18,8 +18,8 @@ /* ScriptData SDName: Feralas -SD%Complete: 100 -SDComment: Quest support: 3520, 2767, Special vendor Gregan Brewspewer +SD%Complete: 0 +SDComment: Quest support: SDCategory: Feralas EndScriptData */ @@ -28,187 +28,6 @@ EndScriptData */ #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" -/*###### -## npc_gregan_brewspewer -######*/ - -#define GOSSIP_HELLO "Buy somethin', will ya?" - -class npc_gregan_brewspewer : public CreatureScript -{ -public: - npc_gregan_brewspewer() : CreatureScript("npc_gregan_brewspewer") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - player->SEND_GOSSIP_MENU(2434, creature->GetGUID()); - } - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->isVendor() && player->GetQuestStatus(3909) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(2433, creature->GetGUID()); - return true; - } - -}; - -/*###### -## npc_oox22fe -######*/ - -enum OOX -{ - //signed for 7806 - SAY_OOX_START = -1000287, - SAY_OOX_AGGRO1 = -1000288, - SAY_OOX_AGGRO2 = -1000289, - SAY_OOX_AMBUSH = -1000290, - SAY_OOX_END = -1000292, - - NPC_YETI = 7848, - NPC_GORILLA = 5260, - NPC_WOODPAW_REAVER = 5255, - NPC_WOODPAW_BRUTE = 5253, - NPC_WOODPAW_ALPHA = 5258, - NPC_WOODPAW_MYSTIC = 5254, - - QUEST_RESCUE_OOX22FE = 2767, - FACTION_ESCORTEE_A = 774, - FACTION_ESCORTEE_H = 775 -}; - -class npc_oox22fe : public CreatureScript -{ -public: - npc_oox22fe() : CreatureScript("npc_oox22fe") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE) - { - DoScriptText(SAY_OOX_START, creature); - //change that the npc is not lying dead on the ground - creature->SetStandState(UNIT_STAND_STATE_STAND); - - if (player->GetTeam() == ALLIANCE) - creature->setFaction(FACTION_ESCORTEE_A); - - if (player->GetTeam() == HORDE) - creature->setFaction(FACTION_ESCORTEE_H); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_oox22fe::npc_oox22feAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_oox22feAI(creature); - } - - struct npc_oox22feAI : public npc_escortAI - { - npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - // First Ambush(3 Yetis) - case 11: - DoScriptText(SAY_OOX_AMBUSH, me); - me->SummonCreature(NPC_YETI, -4841.01f, 1593.91f, 73.42f, 3.98f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_YETI, -4837.61f, 1568.58f, 78.21f, 3.13f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_YETI, -4841.89f, 1569.95f, 76.53f, 0.68f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - break; - //Second Ambush(3 Gorillas) - case 21: - DoScriptText(SAY_OOX_AMBUSH, me); - me->SummonCreature(NPC_GORILLA, -4595.81f, 2005.99f, 53.08f, 3.74f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_GORILLA, -4597.53f, 2008.31f, 52.70f, 3.78f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_GORILLA, -4599.37f, 2010.59f, 52.77f, 3.84f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - break; - //Third Ambush(4 Gnolls) - case 30: - DoScriptText(SAY_OOX_AMBUSH, me); - me->SummonCreature(NPC_WOODPAW_REAVER, -4425.14f, 2075.87f, 47.77f, 3.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_WOODPAW_BRUTE, -4426.68f, 2077.98f, 47.57f, 3.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_WOODPAW_MYSTIC, -4428.33f, 2080.24f, 47.43f, 3.87f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_WOODPAW_ALPHA, -4430.04f, 2075.54f, 46.83f, 3.81f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - break; - case 37: - DoScriptText(SAY_OOX_END, me); - // Award quest credit - if (Player* player = GetPlayerForEscort()) - player->GroupEventHappens(QUEST_RESCUE_OOX22FE, me); - break; - } - } - - void Reset() - { - if (!HasEscortState(STATE_ESCORT_ESCORTING)) - me->SetStandState(UNIT_STAND_STATE_DEAD); - } - - void EnterCombat(Unit* /*who*/) - { - //For an small probability the npc says something when he get aggro - if (urand(0, 9) > 7) - DoScriptText(RAND(SAY_OOX_AGGRO1, SAY_OOX_AGGRO2), me); - } - - void JustSummoned(Creature* summoned) - { - summoned->AI()->AttackStart(me); - } - }; - -}; - -/*###### -## npc_screecher_spirit -######*/ - -class npc_screecher_spirit : public CreatureScript -{ -public: - npc_screecher_spirit() : CreatureScript("npc_screecher_spirit") { } - - bool OnGossipHello(Player* player, Creature* creature) - { - player->SEND_GOSSIP_MENU(2039, creature->GetGUID()); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - return true; - } - -}; - -/*###### -## AddSC -######*/ - void AddSC_feralas() { - new npc_gregan_brewspewer(); - new npc_oox22fe(); - new npc_screecher_spirit(); } diff --git a/src/server/scripts/Kalimdor/moonglade.cpp b/src/server/scripts/Kalimdor/moonglade.cpp index 9df208d2578..3afed715c09 100644 --- a/src/server/scripts/Kalimdor/moonglade.cpp +++ b/src/server/scripts/Kalimdor/moonglade.cpp @@ -18,17 +18,13 @@ /* ScriptData SDName: Moonglade -SD%Complete: 100 -SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class. +SD%Complete: 0 +SDComment: Quest support: SDCategory: Moonglade EndScriptData */ /* ContentData -npc_bunthen_plainswind -npc_great_bear_spirit -npc_silva_filnaveth -npc_clintar_spirit -npc_clintar_dreamwalker +npc_omen EndContentData */ #include "ScriptMgr.h" @@ -36,536 +32,6 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" -/*###### -## npc_bunthen_plainswind -######*/ - -enum Bunthen -{ - QUEST_SEA_LION_HORDE = 30, - QUEST_SEA_LION_ALLY = 272, - TAXI_PATH_ID_ALLY = 315, - TAXI_PATH_ID_HORDE = 316 -}; - -#define GOSSIP_ITEM_THUNDER "I'd like to fly to Thunder Bluff." -#define GOSSIP_ITEM_AQ_END "Do you know where I can find Half Pendant of Aquatic Endurance?" - -class npc_bunthen_plainswind : public CreatureScript -{ -public: - npc_bunthen_plainswind() : CreatureScript("npc_bunthen_plainswind") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - player->CLOSE_GOSSIP_MENU(); - if (player->getClass() == CLASS_DRUID && player->GetTeam() == HORDE) - player->ActivateTaxiPathTo(TAXI_PATH_ID_HORDE); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - player->SEND_GOSSIP_MENU(5373, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - player->SEND_GOSSIP_MENU(5376, creature->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->getClass() != CLASS_DRUID) - player->SEND_GOSSIP_MENU(4916, creature->GetGUID()); - else if (player->GetTeam() != HORDE) - { - if (player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_END, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - - player->SEND_GOSSIP_MENU(4917, creature->GetGUID()); - } - else if (player->getClass() == CLASS_DRUID && player->GetTeam() == HORDE) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_THUNDER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_END, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - - player->SEND_GOSSIP_MENU(4918, creature->GetGUID()); - } - return true; - } - -}; - -/*###### -## npc_great_bear_spirit -######*/ - -#define GOSSIP_BEAR1 "What do you represent, spirit?" -#define GOSSIP_BEAR2 "I seek to understand the importance of strength of the body." -#define GOSSIP_BEAR3 "I seek to understand the importance of strength of the heart." -#define GOSSIP_BEAR4 "I have heard your words, Great Bear Spirit, and I understand. I now seek your blessings to fully learn the way of the Claw." - -class npc_great_bear_spirit : public CreatureScript -{ -public: - npc_great_bear_spirit() : CreatureScript("npc_great_bear_spirit") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(4721, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(4733, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(4734, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - player->SEND_GOSSIP_MENU(4735, creature->GetGUID()); - if (player->GetQuestStatus(5929) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(5929); - if (player->GetQuestStatus(5930) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(5930); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - //ally or horde quest - if (player->GetQuestStatus(5929) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(5930) == QUEST_STATUS_INCOMPLETE) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - player->SEND_GOSSIP_MENU(4719, creature->GetGUID()); - } - else - player->SEND_GOSSIP_MENU(4718, creature->GetGUID()); - - return true; - } - -}; - -/*###### -## npc_silva_filnaveth -######*/ - -#define GOSSIP_ITEM_RUTHERAN "I'd like to fly to Rut'theran Village." -#define GOSSIP_ITEM_AQ_AGI "Do you know where I can find Half Pendant of Aquatic Agility?" - -class npc_silva_filnaveth : public CreatureScript -{ -public: - npc_silva_filnaveth() : CreatureScript("npc_silva_filnaveth") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - player->CLOSE_GOSSIP_MENU(); - if (player->getClass() == CLASS_DRUID && player->GetTeam() == ALLIANCE) - player->ActivateTaxiPathTo(TAXI_PATH_ID_ALLY); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - player->SEND_GOSSIP_MENU(5374, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - player->SEND_GOSSIP_MENU(5375, creature->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->getClass() != CLASS_DRUID) - player->SEND_GOSSIP_MENU(4913, creature->GetGUID()); - else if (player->GetTeam() != ALLIANCE) - { - if (player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_AGI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - - player->SEND_GOSSIP_MENU(4915, creature->GetGUID()); - } - else if (player->getClass() == CLASS_DRUID && player->GetTeam() == ALLIANCE) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_RUTHERAN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_AGI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - - player->SEND_GOSSIP_MENU(4914, creature->GetGUID()); - } - return true; - } - -}; - -/*###### -## npc_clintar_spirit -######*/ - -float const Clintar_spirit_WP[41][5] = -{ - //pos_x pos_y pos_z orien waitTime - {7465.28f, -3115.46f, 439.327f, 0.83f, 4000}, - {7476.49f, -3101, 443.457f, 0.89f, 0}, - {7486.57f, -3085.59f, 439.478f, 1.07f, 0}, - {7472.19f, -3085.06f, 443.142f, 3.07f, 0}, - {7456.92f, -3085.91f, 438.862f, 3.24f, 0}, - {7446.68f, -3083.43f, 438.245f, 2.40f, 0}, - {7446.17f, -3080.21f, 439.826f, 1.10f, 6000}, - {7452.41f, -3085.8f, 438.984f, 5.78f, 0}, - {7469.11f, -3084.94f, 443.048f, 6.25f, 0}, - {7483.79f, -3085.44f, 439.607f, 6.25f, 0}, - {7491.14f, -3090.96f, 439.983f, 5.44f, 0}, - {7497.62f, -3098.22f, 436.854f, 5.44f, 0}, - {7498.72f, -3113.41f, 434.596f, 4.84f, 0}, - {7500.06f, -3122.51f, 434.749f, 5.17f, 0}, - {7504.96f, -3131.53f, 434.475f, 4.74f, 0}, - {7504.31f, -3133.53f, 435.693f, 3.84f, 6000}, - {7504.55f, -3133.27f, 435.476f, 0.68f, 15000}, - {7501.99f, -3126.01f, 434.93f, 1.83f, 0}, - {7490.76f, -3114.97f, 434.431f, 2.51f, 0}, - {7479.64f, -3105.51f, 431.123f, 1.83f, 0}, - {7474.63f, -3086.59f, 428.994f, 1.83f, 2000}, - {7472.96f, -3074.18f, 427.566f, 1.57f, 0}, - {7472.25f, -3063, 428.268f, 1.55f, 0}, - {7473.46f, -3054.22f, 427.588f, 0.36f, 0}, - {7475.08f, -3053.6f, 428.653f, 0.36f, 6000}, - {7474.66f, -3053.56f, 428.433f, 3.19f, 4000}, - {7471.81f, -3058.84f, 427.073f, 4.29f, 0}, - {7472.16f, -3064.91f, 427.772f, 4.95f, 0}, - {7471.56f, -3085.36f, 428.924f, 4.72f, 0}, - {7473.56f, -3093.48f, 429.294f, 5.04f, 0}, - {7478.94f, -3104.29f, 430.638f, 5.23f, 0}, - {7484.46f, -3109.61f, 432.769f, 5.79f, 0}, - {7490.23f, -3111.08f, 434.431f, 0.02f, 0}, - {7496.29f, -3108, 434.783f, 1.15f, 0}, - {7497.46f, -3100.66f, 436.191f, 1.50f, 0}, - {7495.64f, -3093.39f, 438.349f, 2.10f, 0}, - {7492.44f, -3086.01f, 440.267f, 1.38f, 0}, - {7498.26f, -3076.44f, 440.808f, 0.71f, 0}, - {7506.4f, -3067.35f, 443.64f, 0.77f, 0}, - {7518.37f, -3057.42f, 445.584f, 0.74f, 0}, - {7517.51f, -3056.3f, 444.568f, 2.49f, 4500} -}; - -Position const AspectRavenSummon = {7472.96f, -3074.18f, 427.566f, 0.0f}; -Position const ClintarSpiritSummon = {7459.2275f, -3122.5632f, 438.9842f, 0.8594f}; - -enum ClintarSpirit -{ - ASPECT_RAVEN = 22915, - - //from -1000292 to -1000287 are signed for 7806. but all this texts ids wrong. - CLINTAR_SPIRIT_SAY_START = -1000286, - CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 = -1000287, - CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 = -1000288, - CLINTAR_SPIRIT_SAY_GET_ONE = -1000289, - CLINTAR_SPIRIT_SAY_GET_TWO = -1000290, - CLINTAR_SPIRIT_SAY_GET_THREE = -1000291, - CLINTAR_SPIRIT_SAY_GET_FINAL = -1000292 -}; - -class npc_clintar_spirit : public CreatureScript -{ -public: - npc_clintar_spirit() : CreatureScript("npc_clintar_spirit") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_clintar_spiritAI (creature); - } - - struct npc_clintar_spiritAI : public npc_escortAI - { - public: - npc_clintar_spiritAI(Creature* creature) : npc_escortAI(creature) {} - - uint8 Step; - uint32 CurrWP; - uint32 EventTimer; - uint32 checkPlayerTimer; - - uint64 PlayerGUID; - - bool EventOnWait; - - void Reset() - { - if (!PlayerGUID) - { - Step = 0; - CurrWP = 0; - EventTimer = 0; - PlayerGUID = 0; - checkPlayerTimer = 1000; - EventOnWait = false; - } - } - - void JustDied(Unit* /*killer*/) - { - if (!PlayerGUID) - return; - - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) - { - player->FailQuest(10965); - PlayerGUID = 0; - Reset(); - } - } - - void EnterEvadeMode() - { - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (player && player->isInCombat() && player->getAttackerForHelper()) - { - AttackStart(player->getAttackerForHelper()); - return; - } - npc_escortAI::EnterEvadeMode(); - } - - void EnterCombat(Unit* who) - { - switch (urand(0, 1)) - { - case 0: DoScriptText(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1, me, who); break; - case 1: DoScriptText(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2, me, who); break; - } - } - - void StartEvent(Player* player) - { - if (player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) - { - for (uint8 i = 0; i < 41; ++i) - { - AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]); - } - PlayerGUID = player->GetGUID(); - Start(true, false, PlayerGUID); - } - return; - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - - if (!PlayerGUID) - { - me->setDeathState(JUST_DIED); - return; - } - - if (!me->isInCombat() && !EventOnWait) - { - if (checkPlayerTimer <= diff) - { - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (player && player->isInCombat() && player->getAttackerForHelper()) - AttackStart(player->getAttackerForHelper()); - checkPlayerTimer = 1000; - } else checkPlayerTimer -= diff; - } - - if (EventOnWait && EventTimer <= diff) - { - - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (!player || (player && player->GetQuestStatus(10965) == QUEST_STATUS_NONE)) - { - me->setDeathState(JUST_DIED); - return; - } - - switch (CurrWP) - { - case 0: - switch (Step) - { - case 0: - me->Say(CLINTAR_SPIRIT_SAY_START, 0, PlayerGUID); - EventTimer = 8000; - Step = 1; - break; - case 1: - EventOnWait = false; - break; - } - break; - case 6: - switch (Step) - { - case 0: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); - EventTimer = 5000; - Step = 1; - break; - case 1: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - DoScriptText(CLINTAR_SPIRIT_SAY_GET_ONE, me, player); - EventOnWait = false; - break; - } - break; - case 15: - switch (Step) - { - case 0: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); - EventTimer = 5000; - Step = 1; - break; - case 1: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - EventOnWait = false; - break; - } - break; - case 16: - switch (Step) - { - case 0: - DoScriptText(CLINTAR_SPIRIT_SAY_GET_TWO, me, player); - EventTimer = 15000; - Step = 1; - break; - case 1: - EventOnWait = false; - break; - } - break; - case 20: - switch (Step) - { - case 0: - if (Creature* mob = me->SummonCreature(ASPECT_RAVEN, AspectRavenSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) - { - mob->AddThreat(me, 10000.0f); - mob->AI()->AttackStart(me); - } - EventTimer = 2000; - Step = 1; - break; - case 1: - EventOnWait = false; - break; - } - break; - case 24: - switch (Step) - { - case 0: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); - EventTimer = 5000; - Step = 1; - break; - case 1: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - EventOnWait = false; - break; - } - break; - case 25: - switch (Step) - { - case 0: - DoScriptText(CLINTAR_SPIRIT_SAY_GET_THREE, me, player); - EventTimer = 4000; - Step = 1; - break; - case 1: - EventOnWait = false; - break; - } - break; - case 40: - switch (Step) - { - case 0: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2); - DoScriptText(CLINTAR_SPIRIT_SAY_GET_FINAL, me, player); - player->CompleteQuest(10965); - EventTimer = 1500; - Step = 1; - break; - case 1: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - EventTimer = 3000; - Step = 2; - break; - case 2: - player->TalkedToCreature(me->GetEntry(), me->GetGUID()); - PlayerGUID = 0; - Reset(); - me->setDeathState(JUST_DIED); - break; - } - break; - default: - EventOnWait = false; - break; - } - - } else if (EventOnWait) EventTimer -= diff; - } - - void WaypointReached(uint32 waypointId) - { - CurrWP = waypointId; - EventTimer = 0; - Step = 0; - EventOnWait = true; - } - }; - -}; - -/*#### -# npc_clintar_dreamwalker -####*/ - -enum Clintar -{ - CLINTAR_SPIRIT = 22916 -}; - -class npc_clintar_dreamwalker : public CreatureScript -{ -public: - npc_clintar_dreamwalker() : CreatureScript("npc_clintar_dreamwalker") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == 10965) - if (Creature* clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, ClintarSpiritSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000)) - CAST_AI(npc_clintar_spirit::npc_clintar_spiritAI, clintar_spirit->AI())->StartEvent(player); - return true; - } - -}; - /*#### # npc_omen ####*/ @@ -714,11 +180,6 @@ public: void AddSC_moonglade() { - new npc_bunthen_plainswind(); - new npc_great_bear_spirit(); - new npc_silva_filnaveth(); - new npc_clintar_dreamwalker(); - new npc_clintar_spirit(); new npc_omen(); new npc_giant_spotlight(); } diff --git a/src/server/scripts/Kalimdor/mulgore.cpp b/src/server/scripts/Kalimdor/mulgore.cpp index 5b35688c2b8..9aea03de09d 100644 --- a/src/server/scripts/Kalimdor/mulgore.cpp +++ b/src/server/scripts/Kalimdor/mulgore.cpp @@ -19,14 +19,13 @@ /* ScriptData SDName: Mulgore SD%Complete: 100 -SDComment: Support for quest: 11129, 772 +SDComment: Support for quest: 11129, 861 SDCategory: Mulgore EndScriptData */ /* ContentData npc_skorn_whitecloud npc_kyle_frenzied -npc_plains_vision EndContentData */ #include "ScriptMgr.h" @@ -200,127 +199,8 @@ public: }; -/*##### -# npc_plains_vision -######*/ - -Position const wpPlainVision[50] = -{ - {-2226.32f, -408.095f, -9.36235f, 0.0f}, - {-2203.04f, -437.212f, -5.72498f, 0.0f}, - {-2163.91f, -457.851f, -7.09049f, 0.0f}, - {-2123.87f, -448.137f, -9.29591f, 0.0f}, - {-2104.66f, -427.166f, -6.49513f, 0.0f}, - {-2101.48f, -422.826f, -5.3567f, 0.0f}, - {-2097.56f, -417.083f, -7.16716f, 0.0f}, - {-2084.87f, -398.626f, -9.88973f, 0.0f}, - {-2072.71f, -382.324f, -10.2488f, 0.0f}, - {-2054.05f, -356.728f, -6.22468f, 0.0f}, - {-2051.8f, -353.645f, -5.35791f, 0.0f}, - {-2049.08f, -349.912f, -6.15723f, 0.0f}, - {-2030.6f, -310.724f, -9.59302f, 0.0f}, - {-2002.15f, -249.308f, -10.8124f, 0.0f}, - {-1972.85f, -195.811f, -10.6316f, 0.0f}, - {-1940.93f, -147.652f, -11.7055f, 0.0f}, - {-1888.06f, -81.943f, -11.4404f, 0.0f}, - {-1837.05f, -34.0109f, -12.258f, 0.0f}, - {-1796.12f, -14.6462f, -10.3581f, 0.0f}, - {-1732.61f, -4.27746f, -10.0213f, 0.0f}, - {-1688.94f, -0.829945f, -11.7103f, 0.0f}, - {-1681.32f, 13.0313f, -9.48056f, 0.0f}, - {-1677.04f, 36.8349f, -7.10318f, 0.0f}, - {-1675.2f, 68.559f, -8.95384f, 0.0f}, - {-1676.57f, 89.023f, -9.65104f, 0.0f}, - {-1678.16f, 110.939f, -10.1782f, 0.0f}, - {-1677.86f, 128.681f, -5.73869f, 0.0f}, - {-1675.27f, 144.324f, -3.47916f, 0.0f}, - {-1671.7f, 163.169f, -1.23098f, 0.0f}, - {-1666.61f, 181.584f, 5.26145f, 0.0f}, - {-1661.51f, 196.154f, 8.95252f, 0.0f}, - {-1655.47f, 210.811f, 8.38727f, 0.0f}, - {-1647.07f, 226.947f, 5.27755f, 0.0f}, - {-1621.65f, 232.91f, 2.69579f, 0.0f}, - {-1600.23f, 237.641f, 2.98539f, 0.0f}, - {-1576.07f, 242.546f, 4.66541f, 0.0f}, - {-1554.57f, 248.494f, 6.60377f, 0.0f}, - {-1547.53f, 259.302f, 10.6741f, 0.0f}, - {-1541.7f, 269.847f, 16.4418f, 0.0f}, - {-1539.83f, 278.989f, 21.0597f, 0.0f}, - {-1540.16f, 290.219f, 27.8247f, 0.0f}, - {-1538.99f, 298.983f, 34.0032f, 0.0f}, - {-1540.38f, 307.337f, 41.3557f, 0.0f}, - {-1536.61f, 314.884f, 48.0179f, 0.0f}, - {-1532.42f, 323.277f, 55.6667f, 0.0f}, - {-1528.77f, 329.774f, 61.1525f, 0.0f}, - {-1525.65f, 333.18f, 63.2161f, 0.0f}, - {-1517.01f, 350.713f, 62.4286f, 0.0f}, - {-1511.39f, 362.537f, 62.4539f, 0.0f}, - {-1508.68f, 366.822f, 62.733f, 0.0f} -}; - -class npc_plains_vision : public CreatureScript -{ -public: - npc_plains_vision() : CreatureScript("npc_plains_vision") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_plains_visionAI (creature); - } - - struct npc_plains_visionAI : public ScriptedAI - { - npc_plains_visionAI(Creature* creature) : ScriptedAI(creature) {} - - bool newWaypoint; - uint8 WayPointId; - uint8 amountWP; - - void Reset() - { - WayPointId = 0; - newWaypoint = true; - amountWP = 49; - } - - void EnterCombat(Unit* /*who*/){} - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - - if (id < amountWP) - { - ++WayPointId; - newWaypoint = true; - } - else - { - me->setDeathState(JUST_DIED); - me->RemoveCorpse(); - } - } - - void UpdateAI(const uint32 /*diff*/) - { - if (newWaypoint) - { - me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]); - newWaypoint = false; - } - } - }; - -}; - -/*##### -# -######*/ - void AddSC_mulgore() { new npc_skorn_whitecloud(); new npc_kyle_frenzied(); - new npc_plains_vision(); } diff --git a/src/server/scripts/Kalimdor/orgrimmar.cpp b/src/server/scripts/Kalimdor/orgrimmar.cpp index fca8d0f5fc5..48f0396c5fb 100644 --- a/src/server/scripts/Kalimdor/orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/orgrimmar.cpp @@ -18,236 +18,18 @@ /* ScriptData SDName: Orgrimmar -SD%Complete: 100 -SDComment: Quest support: 2460, 6566 +SD%Complete: 0 +SDComment: Quest support: SDCategory: Orgrimmar EndScriptData */ /* ContentData -npc_shenthul -npc_thrall_warchief EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -/*###### -## npc_shenthul -######*/ - -enum Shenthul -{ - QUEST_SHATTERED_SALUTE = 2460 -}; - -class npc_shenthul : public CreatureScript -{ -public: - npc_shenthul() : CreatureScript("npc_shenthul") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE) - { - CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true; - CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID(); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_shenthulAI (creature); - } - - struct npc_shenthulAI : public ScriptedAI - { - npc_shenthulAI(Creature* creature) : ScriptedAI(creature) {} - - bool CanTalk; - bool CanEmote; - uint32 SaluteTimer; - uint32 ResetTimer; - uint64 PlayerGUID; - - void Reset() - { - CanTalk = false; - CanEmote = false; - SaluteTimer = 6000; - ResetTimer = 0; - PlayerGUID = 0; - } - - void EnterCombat(Unit* /*who*/) {} - - void UpdateAI(const uint32 diff) - { - if (CanEmote) - { - if (ResetTimer <= diff) - { - if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) - { - if (player->GetTypeId() == TYPEID_PLAYER && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE) - player->FailQuest(QUEST_SHATTERED_SALUTE); - } - Reset(); - } else ResetTimer -= diff; - } - - if (CanTalk && !CanEmote) - { - if (SaluteTimer <= diff) - { - me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); - CanEmote = true; - ResetTimer = 60000; - } else SaluteTimer -= diff; - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - - void ReceiveEmote(Player* player, uint32 emote) - { - if (emote == TEXT_EMOTE_SALUTE && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE) - { - if (CanEmote) - { - player->AreaExploredOrEventHappens(QUEST_SHATTERED_SALUTE); - Reset(); - } - } - } - }; - -}; - -/*###### -## npc_thrall_warchief -######*/ - -enum ThrallWarchief -{ - QUEST_6566 = 6566, - - SPELL_CHAIN_LIGHTNING = 16033, - SPELL_SHOCK = 16034 -}; - -#define GOSSIP_HTW "Please share your wisdom with me, Warchief." -#define GOSSIP_STW1 "What discoveries?" -#define GOSSIP_STW2 "Usurper?" -#define GOSSIP_STW3 "With all due respect, Warchief - why not allow them to be destroyed? Does this not strengthen our position?" -#define GOSSIP_STW4 "I... I did not think of it that way, Warchief." -#define GOSSIP_STW5 "I live only to serve, Warchief! My life is empty and meaningless without your guidance." -#define GOSSIP_STW6 "Of course, Warchief!" - -//TODO: verify abilities/timers -class npc_thrall_warchief : public CreatureScript -{ -public: - npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(5733, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->SEND_GOSSIP_MENU(5734, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - player->SEND_GOSSIP_MENU(5735, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - player->SEND_GOSSIP_MENU(5736, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); - player->SEND_GOSSIP_MENU(5737, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); - player->SEND_GOSSIP_MENU(5738, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(QUEST_6566); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_6566) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HTW, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_thrall_warchiefAI (creature); - } - - struct npc_thrall_warchiefAI : public ScriptedAI - { - npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 ChainLightningTimer; - uint32 ShockTimer; - - void Reset() - { - ChainLightningTimer = 2000; - ShockTimer = 8000; - } - - void EnterCombat(Unit* /*who*/) {} - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (ChainLightningTimer <= diff) - { - DoCast(me->getVictim(), SPELL_CHAIN_LIGHTNING); - ChainLightningTimer = 9000; - } else ChainLightningTimer -= diff; - - if (ShockTimer <= diff) - { - DoCast(me->getVictim(), SPELL_SHOCK); - ShockTimer = 15000; - } else ShockTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; - -}; - void AddSC_orgrimmar() { - new npc_shenthul(); - new npc_thrall_warchief(); } diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp index 639de3dc3b2..1636c867b30 100644 --- a/src/server/scripts/Kalimdor/silithus.cpp +++ b/src/server/scripts/Kalimdor/silithus.cpp @@ -19,14 +19,14 @@ /* ScriptData SDName: Silithus SD%Complete: 100 -SDComment: Quest support: 7785, 8304, 8507. +SDComment: Quest support: 7785, 8304. SDCategory: Silithus EndScriptData */ /* ContentData npc_highlord_demitrian npcs_rutgar_and_frankal -quest_a_pawn_on_the_eternal_pawn +go_wind_stone EndContentData */ #include "ScriptMgr.h" @@ -224,930 +224,6 @@ public: }; -/*#### -# quest_a_pawn_on_the_eternal_board (Defines) -####*/ -enum EternalBoard -{ - QUEST_A_PAWN_ON_THE_ETERNAL_BOARD = 8519, - - FACTION_HOSTILE = 14, - FACTION_FRIENDLY = 35, - - C_ANACHRONOS = 15381, - C_FANDRAL_STAGHELM = 15382, - C_ARYGOS = 15380, - C_MERITHRA = 15378, - C_CAELESTRASZ = 15379, - - ANACHRONOS_SAY_1 = -1350000, - ANACHRONOS_SAY_2 = -1350001, - ANACHRONOS_SAY_3 = -1350002, - ANACHRONOS_SAY_4 = -1350003, - ANACHRONOS_SAY_5 = -1350004, - ANACHRONOS_SAY_6 = -1350005, - ANACHRONOS_SAY_7 = -1350006, - ANACHRONOS_SAY_8 = -1350007, - ANACHRONOS_SAY_9 = -1350008, - ANACHRONOS_SAY_10 = -1350009, - ANACHRONOS_EMOTE_1 = -1350010, - ANACHRONOS_EMOTE_2 = -1350011, - ANACHRONOS_EMOTE_3 = -1350012, - - FANDRAL_SAY_1 = -1350013, - FANDRAL_SAY_2 = -1350014, - FANDRAL_SAY_3 = -1350015, - FANDRAL_SAY_4 = -1350016, - FANDRAL_SAY_5 = -1350017, - FANDRAL_SAY_6 = -1350018, - FANDRAL_EMOTE_1 = -1350019, - FANDRAL_EMOTE_2 = -1350020, - - CAELESTRASZ_SAY_1 = -1350021, - CAELESTRASZ_SAY_2 = -1350022, - CAELESTRASZ_YELL_1 = -1350023, - - ARYGOS_SAY_1 = -1350024, - ARYGOS_YELL_1 = -1350025, - ARYGOS_EMOTE_1 = -1350026, - - MERITHRA_SAY_1 = -1350027, - MERITHRA_SAY_2 = -1350028, - MERITHRA_YELL_1 = -1350029, - MERITHRA_EMOTE_1 = -1350030, - - GO_GATE_OF_AHN_QIRAJ = 176146, - GO_GLYPH_OF_AHN_QIRAJ = 176148, - GO_ROOTS_OF_AHN_QIRAJ = 176147 -}; -/*##### -# Quest: A Pawn on the Eternal Board -#####*/ - -/* ContentData -A Pawn on the Eternal Board - creatures, gameobjects and defines -mob_qiraj_war_spawn : Adds that are summoned in the Qiraj gates battle. -npc_anachronos_the_ancient : Creature that controls the event. -npc_anachronos_quest_trigger: controls the spawning of the BG War mobs. -go_crystalline_tear : GameObject that begins the event and hands out quest -TO DO: get correct spell IDs and timings for spells cast upon dragon transformations -TO DO: Dragons should use the HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF) after transformation, but for some unknown reason it doesnt work. -EndContentData */ - -#define EVENT_AREA_RADIUS 65 //65yds -#define EVENT_COOLDOWN 500000 //in ms. appear after event completed or failed (should be = Adds despawn time) - -struct QuestCinematic -{ - int32 TextId; - uint32 Creature, Timer; -}; - -// Creature 0 - Anachronos, 1 - Fandral, 2 - Arygos, 3 - Merithra, 4 - Caelestrasz -static QuestCinematic EventAnim[]= -{ - {ANACHRONOS_SAY_1, 0, 2000}, - {FANDRAL_SAY_1, 1, 4000}, - {MERITHRA_EMOTE_1, 3, 500}, - {MERITHRA_SAY_1, 3, 500}, - {ARYGOS_EMOTE_1, 2, 2000}, - {CAELESTRASZ_SAY_1, 4, 8000}, - {MERITHRA_SAY_2, 3, 6000}, - {0, 3, 2000}, - {MERITHRA_YELL_1, 3, 2500}, - {0, 3, 3000}, //Morph - {0, 3, 4000}, //EmoteLiftoff - {0, 3, 4000}, // spell - {0, 3, 1250}, //fly - {0, 3, 250}, //remove flags - {ARYGOS_SAY_1, 2, 3000}, - {0, 3, 2000}, - {ARYGOS_YELL_1, 2, 3000}, - {0, 3, 3000}, //Morph - {0, 3, 4000}, //EmoteLiftoff - {0, 3, 4000}, // spell - {0, 3, 1000}, //fly - {0, 3, 1000}, //remove flags - {CAELESTRASZ_SAY_2, 4, 5000}, - {0, 3, 3000}, - {CAELESTRASZ_YELL_1, 4, 3000}, - {0, 3, 3000}, //Morph - {0, 3, 4000}, //EmoteLiftoff - {0, 3, 2500}, // spell - {ANACHRONOS_SAY_2, 0, 2000}, - {0, 3, 250}, //fly - {0, 3, 25}, //remove flags - {FANDRAL_SAY_2, 1, 3000}, - {ANACHRONOS_SAY_3, 0, 10000}, //Both run through the armies - {0, 3, 2000}, // Sands will stop - {0, 3, 8000}, // Summon Gate - {ANACHRONOS_SAY_4, 0, 4000}, - {0, 0, 2000}, //spell 1-> Arcane cosmetic (Mobs freeze) - {0, 0, 5000}, //Spell 2-> Arcane long cosmetic (barrier appears) (Barrier -> Glyphs) - {0, 0, 7000}, //BarrieR - {0, 0, 4000}, //Glyphs - {ANACHRONOS_SAY_5, 0, 2000}, - {0, 0, 4000}, // Roots - {FANDRAL_SAY_3, 1, 3000}, //Root Text - {FANDRAL_EMOTE_1, 1, 3000}, //falls knee - {ANACHRONOS_SAY_6, 0, 3000}, - {ANACHRONOS_SAY_7, 0, 3000}, - {ANACHRONOS_SAY_8, 0, 8000}, - {ANACHRONOS_EMOTE_1, 0, 1000}, //Give Scepter - {FANDRAL_SAY_4, 1, 3000}, - {FANDRAL_SAY_5, 1, 3000}, //->Equip hammer~Scepter, throw it at door - {FANDRAL_EMOTE_2, 1, 3000}, //Throw hammer at door. - {ANACHRONOS_SAY_9, 0, 3000}, - {FANDRAL_SAY_6, 1, 3000}, //fandral goes away - {ANACHRONOS_EMOTE_2, 0, 3000}, - {ANACHRONOS_EMOTE_3, 0, 3000}, - {0, 0, 2000}, - {0, 0, 2000}, - {0, 0, 4000}, - {ANACHRONOS_SAY_10, 0, 3000}, - {0, 0, 2000}, - {0, 0, 3000}, - {0, 0, 15000}, - {0, 0, 5000}, - {0, 0, 3500}, - {0, 0, 5000}, - {0, 0, 3500}, - {0, 0, 5000}, - {0, 0, 0} -}; - -//Cordinates for Spawns -Position const SpawnLocation[] = -{ - {-8085.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8085.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8085.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - - {-8085.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8085.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8085.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - - {-8085.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8080.0f, 1424.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8085.0f, 1422.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - // 2 waves of warriors - {-8082.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1525.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1527.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - - {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - - {-8082.0f, 1523.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1521.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1519.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - - {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8078.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - {-8082.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry - - {-8088.0f, 1510.0f, 2.61f, 0.0f}, //Anubisath Conqueror - {-8084.0f, 1520.0f, 2.61f, 0.0f}, //Anubisath Conqueror - {-8088.0f, 1530.0f, 2.61f, 0.0f}, //Anubisath Conqueror - - {-8080.0f, 1513.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8082.0f, 1523.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8085.0f, 1518.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8082.0f, 1516.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8085.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8080.0f, 1528.0f, 2.61f, 0.0f}, //Qiraj Wasp - - {-8082.0f, 1513.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8079.0f, 1523.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8080.0f, 1531.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8079.0f, 1516.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8082.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Wasp - {-8080.0f, 1518.0f, 2.61f, 0.0f}, //Qiraj Wasp - - {-8081.0f, 1514.0f, 2.61f, 0.0f}, //Qiraj Tank - {-8081.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Tank - {-8081.0f, 1526.0f, 2.61f, 0.0f}, //Qiraj Tank - {-8081.0f, 1512.0f, 2.61f, 0.0f}, //Qiraj Tank - {-8082.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Tank - {-8081.0f, 1528.0f, 2.61f, 0.0f}, //Qiraj Tank - - {-8082.0f, 1513.0f, 2.61f, 3.141592f}, //Anubisath Conqueror - {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Anubisath Conqueror - {-8082.0f, 1527.0f, 2.61f, 3.141592f}, //Anubisath Conqueror -}; - -struct WaveData -{ - uint8 SpawnCount, UsedSpawnPoint; - uint32 CreatureId, SpawnTimer, YellTimer, DespTimer; - int32 WaveTextId; -}; - -static WaveData WavesInfo[5] = -{ - {30, 0, 15423, 0, 0, 24000, 0}, // Kaldorei Soldier - { 3, 35, 15424, 0, 0, 24000, 0}, // Anubisath Conqueror - {12, 38, 15414, 0, 0, 24000, 0}, // Qiraji Wasps - { 6, 50, 15422, 0, 0, 24000, 0}, // Qiraji Tanks - {15, 15, 15423, 0, 0, 24000, 0} // Kaldorei Soldier - -}; - -struct SpawnSpells -{ - uint32 Timer1, Timer2, SpellId; -}; - -static SpawnSpells SpawnCast[4] = -{ - {100000, 2000, 33652}, // Stop Time - {38500, 300000, 28528}, // Poison Cloud - {58000, 300000, 35871}, // Frost Debuff (need correct spell) - {80950, 300000, 42075}, // Fire Explosion (need correct spell however this one looks cool) -}; -/*##### -# npc_anachronos_the_ancient -######*/ -class npc_anachronos_the_ancient : public CreatureScript -{ -public: - npc_anachronos_the_ancient() : CreatureScript("npc_anachronos_the_ancient") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_anachronos_the_ancientAI(creature); - } - - struct npc_anachronos_the_ancientAI : public ScriptedAI - { - npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 AnimationTimer; - uint8 AnimationCount; - - uint64 AnachronosQuestTriggerGUID; - uint64 MerithraGUID; - uint64 ArygosGUID; - uint64 CaelestraszGUID; - uint64 FandralGUID; - uint64 PlayerGUID; - bool eventEnd; - - void Reset() - { - AnimationTimer = 1500; - AnimationCount = 0; - AnachronosQuestTriggerGUID = 0; - MerithraGUID = 0; - ArygosGUID = 0; - CaelestraszGUID = 0; - FandralGUID = 0; - PlayerGUID = 0; - eventEnd = false; - - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - - void HandleAnimation() - { - Player* player = Unit::GetPlayer(*me, PlayerGUID); - if (!player) - return; - - Unit* Fandral = player->FindNearestCreature(C_FANDRAL_STAGHELM, 100.0f, me); - Unit* Arygos = player->FindNearestCreature(C_ARYGOS, 100.0f, me); - Unit* Caelestrasz = player->FindNearestCreature(C_CAELESTRASZ, 100.0f, me); - Unit* Merithra = player->FindNearestCreature(C_MERITHRA, 100.0f, me); - - if (!Fandral || !Arygos || !Caelestrasz || !Merithra) - return; - - Unit* mob = NULL; - AnimationTimer = EventAnim[AnimationCount].Timer; - if (eventEnd == false) - { - switch (AnimationCount) - { - case 0: - DoScriptText(ANACHRONOS_SAY_1, me, Fandral); - break; - case 1: - Fandral->SetTarget(me->GetGUID()); - DoScriptText(FANDRAL_SAY_1, Fandral, me); - break; - case 2: - Fandral->SetTarget(0); - DoScriptText(MERITHRA_EMOTE_1, Merithra); - break; - case 3: - DoScriptText(MERITHRA_SAY_1, Merithra); - break; - case 4: - DoScriptText(ARYGOS_EMOTE_1, Arygos); - break; - case 5: - Caelestrasz->SetTarget(Fandral->GetGUID()); - DoScriptText(CAELESTRASZ_SAY_1, Caelestrasz); - break; - case 6: - DoScriptText(MERITHRA_SAY_2, Merithra); - break; - case 7: - Caelestrasz->SetTarget(0); - Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10); - break; - case 8: - DoScriptText(MERITHRA_YELL_1, Merithra); - break; - case 9: - Merithra->CastSpell(Merithra, 25105, true); - break; - case 10: - Merithra->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - Merithra->SetDisableGravity(true); - Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 3); - break; - case 11: - Merithra->CastSpell(Merithra, 24818, false); - break; - case 12: - Merithra->GetMotionMaster()->MoveCharge(-8100, 1530, 50, 42); - break; - case 13: - break; - case 14: - DoScriptText(ARYGOS_SAY_1, Arygos); - Merithra->SetVisible(false); - break; - case 15: - Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10); - Merithra->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42); - break; - case 16: - DoScriptText(ARYGOS_YELL_1, Arygos); - break; - case 17: - Arygos->CastSpell(Arygos, 25107, true); - break; - case 18: - Arygos->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - Arygos->SetDisableGravity(true); - Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 42); - break; - case 19: - Arygos->CastSpell(Arygos, 50505, false); - break; - case 20: - Arygos->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42); - break; - case 21: - break; - case 22: - DoScriptText(CAELESTRASZ_SAY_2, Caelestrasz, Fandral); - break; - case 23: - Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10); - Arygos->SetVisible(false); - Arygos->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 10); - break; - case 24: - DoScriptText(CAELESTRASZ_YELL_1, Caelestrasz); - break; - case 25: - Caelestrasz->CastSpell(Caelestrasz, 25106, true); - break; - case 26: - Caelestrasz->HandleEmoteCommand(254); - Caelestrasz->SetDisableGravity(true); - Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 7.61f, 4); - break; - case 27: - Caelestrasz->CastSpell(Caelestrasz, 54293, false); - break; - case 28: - DoScriptText(ANACHRONOS_SAY_2, me, Fandral); - break; - case 29: - Caelestrasz->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42); - DoScriptText(FANDRAL_SAY_2, Fandral, me); - break; - case 30: - break; - case 31: - DoScriptText(ANACHRONOS_SAY_3, me, Fandral); - break; - case 32: - Caelestrasz->SetVisible(false); - Caelestrasz->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42); - Fandral->GetMotionMaster()->MoveCharge(-8108, 1529, 2.77f, 8); - me->GetMotionMaster()->MoveCharge(-8113, 1525, 2.77f, 8); - break;//both run to the gate - case 33: - DoScriptText(ANACHRONOS_SAY_4, me); - Caelestrasz->GetMotionMaster()->MoveCharge(-8050, 1473, 65, 15); - break; //Text: sands will stop - case 34: - DoCast(player, 23017, true);//Arcane Channeling - break; - case 35: - me->CastSpell(-8088, 1520.43f, 2.67f, 25158, true); - break; - case 36: - DoCast(player, 25159, true); - break; - case 37: - me->SummonGameObject(GO_GATE_OF_AHN_QIRAJ, -8130, 1525, 17.5f, 0, 0, 0, 0, 0, 0); - break; - case 38: - DoCast(player, 25166, true); - me->SummonGameObject(GO_GLYPH_OF_AHN_QIRAJ, -8130, 1525, 17.5f, 0, 0, 0, 0, 0, 0); - break; - case 39: - DoScriptText(ANACHRONOS_SAY_5, me, Fandral); - break; - case 40: - Fandral->CastSpell(me, 25167, true); - break; - case 41: - Fandral->SummonGameObject(GO_ROOTS_OF_AHN_QIRAJ, -8130, 1525, 17.5f, 0, 0, 0, 0, 0, 0); - DoScriptText(FANDRAL_SAY_3, Fandral); - break; - case 42: - me->CastStop(); - DoScriptText(FANDRAL_EMOTE_1, Fandral); - break; - case 43: - Fandral->CastStop(); - break; - case 44: - DoScriptText(ANACHRONOS_SAY_6, me); - break; - case 45: - DoScriptText(ANACHRONOS_SAY_7, me); - break; - case 46: - DoScriptText(ANACHRONOS_SAY_8, me); - me->GetMotionMaster()->MoveCharge(-8110, 1527, 2.77f, 4); - break; - case 47: - DoScriptText(ANACHRONOS_EMOTE_1, me); - break; - case 48: - DoScriptText(FANDRAL_SAY_4, Fandral, me); - break; - case 49: - DoScriptText(FANDRAL_SAY_5, Fandral, me); - break; - case 50: - DoScriptText(FANDRAL_EMOTE_2, Fandral); - Fandral->CastSpell(-8127, 1525, 17.5f, 33806, true); - break; - case 51: - { - uint32 entries[4] = { 15423, 15424, 15414, 15422 }; - for (uint8 i = 0; i < 4; ++i) - { - mob = player->FindNearestCreature(entries[i], 50, me); - while (mob) - { - mob->RemoveFromWorld(); - mob = player->FindNearestCreature(15423, 50, me); - } - } - break; - } - case 52: - Fandral->GetMotionMaster()->MoveCharge(-8028.75f, 1538.795f, 2.61f, 4); - DoScriptText(ANACHRONOS_SAY_9, me, Fandral); - break; - case 53: - DoScriptText(FANDRAL_SAY_6, Fandral); - break; - case 54: - DoScriptText(ANACHRONOS_EMOTE_2, me); - break; - case 55: - Fandral->SetVisible(false); - break; - case 56: - DoScriptText(ANACHRONOS_EMOTE_3, me); - me->GetMotionMaster()->MoveCharge(-8116, 1522, 3.65f, 4); - break; - case 57: - me->GetMotionMaster()->MoveCharge(-8116.7f, 1527, 3.7f, 4); - break; - case 58: - me->GetMotionMaster()->MoveCharge(-8112.67f, 1529.9f, 2.86f, 4); - break; - case 59: - me->GetMotionMaster()->MoveCharge(-8117.99f, 1532.24f, 3.94f, 4); - break; - case 60: - if (player) - DoScriptText(ANACHRONOS_SAY_10, me, player); - me->GetMotionMaster()->MoveCharge(-8113.46f, 1524.16f, 2.89f, 4); - break; - case 61: - me->GetMotionMaster()->MoveCharge(-8057.1f, 1470.32f, 2.61f, 6); - if (player->IsInRange(me, 0, 15)) - player->GroupEventHappens(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD, me); - break; - case 62: - me->SetDisplayId(15500); - break; - case 63: - me->HandleEmoteCommand(254); - me->SetDisableGravity(true); - break; - case 64: - me->GetMotionMaster()->MoveCharge(-8000, 1400, 150, 9); - break; - case 65: - me->SetVisible(false); - if (Creature* AnachronosQuestTrigger = (Unit::GetCreature(*me, AnachronosQuestTriggerGUID))) - { - DoScriptText(ARYGOS_YELL_1, me); - AnachronosQuestTrigger->AI()->EnterEvadeMode(); - eventEnd=true; - } - break; - } - } - ++AnimationCount; - } - void UpdateAI(const uint32 diff) - { - if (AnimationTimer) - { - if (AnimationTimer <= diff) - HandleAnimation(); - else AnimationTimer -= diff; - } - if (AnimationCount < 65) - me->CombatStop(); - if (AnimationCount == 65 || eventEnd) - me->AI()->EnterEvadeMode(); - } - }; - -}; - -/*###### -# mob_qiraj_war_spawn -######*/ - -class mob_qiraj_war_spawn : public CreatureScript -{ -public: - mob_qiraj_war_spawn() : CreatureScript("mob_qiraj_war_spawn") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_qiraj_war_spawnAI(creature); - } - - struct mob_qiraj_war_spawnAI : public ScriptedAI - { - mob_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature) {} - - uint64 MobGUID; - uint64 PlayerGUID; - uint32 SpellTimer1, SpellTimer2, SpellTimer3, SpellTimer4; - bool Timers; - bool hasTarget; - - void Reset() - { - MobGUID = 0; - PlayerGUID = 0; - Timers = false; - hasTarget = false; - } - - void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* /*slayer*/); - - void UpdateAI(const uint32 diff) - { - Unit* target = NULL; - //Player* player = me->GetPlayer(PlayerGUID); - - if (!Timers) - { - if (me->GetEntry() == 15424 || me->GetEntry() == 15422 || me->GetEntry() == 15414) //all but Kaldorei Soldiers - { - SpellTimer1 = SpawnCast[1].Timer1; - SpellTimer2 = SpawnCast[2].Timer1; - SpellTimer3 = SpawnCast[3].Timer1; - } - if (me->GetEntry() == 15423 || me->GetEntry() == 15424 || me->GetEntry() == 15422 || me->GetEntry() == 15414) - SpellTimer4 = SpawnCast[0].Timer1; - Timers = true; - } - if (me->GetEntry() == 15424 || me->GetEntry() == 15422|| me->GetEntry() == 15414) - { - if (SpellTimer1 <= diff) - { - DoCast(me, SpawnCast[1].SpellId); - DoCast(me, 24319); - SpellTimer1 = SpawnCast[1].Timer2; - } else SpellTimer1 -= diff; - if (SpellTimer2 <= diff) - { - DoCast(me, SpawnCast[2].SpellId); - SpellTimer2 = SpawnCast[2].Timer2; - } else SpellTimer2 -= diff; - if (SpellTimer3 <= diff) - { - DoCast(me, SpawnCast[3].SpellId); - SpellTimer3 = SpawnCast[3].Timer2; - } else SpellTimer3 -= diff; - } - if (me->GetEntry() == 15423 || me->GetEntry() == 15424 || me->GetEntry() == 15422 || me->GetEntry() == 15414) - { - if (SpellTimer4 <= diff) - { - me->RemoveAllAttackers(); - me->AttackStop(); - DoCast(me, 15533); - SpellTimer4 = SpawnCast[0].Timer2; - } else SpellTimer4 -= diff; - } - if (!hasTarget) - { - if (me->GetEntry() == 15424 || me->GetEntry() == 15422 || me->GetEntry() == 15414) - target = me->FindNearestCreature(15423, 20, true); - if (me->GetEntry() == 15423) - { - uint8 tar = urand(0, 2); - - if (tar == 0) - target = me->FindNearestCreature(15422, 20, true); - else if (tar == 1) - target = me->FindNearestCreature(15424, 20, true); - else if (tar == 2) - target = me->FindNearestCreature(15414, 20, true); - } - hasTarget = true; - if (target) - me->AI()->AttackStart(target); - } - if (!(me->FindNearestCreature(15379, 60))) - DoCast(me, 33652); - - if (!UpdateVictim()) - { - hasTarget = false; - return; - } - - DoMeleeAttackIfReady(); - } - }; - -}; - -/*##### -# npc_anachronos_quest_trigger -#####*/ - -class npc_anachronos_quest_trigger : public CreatureScript -{ -public: - npc_anachronos_quest_trigger() : CreatureScript("npc_anachronos_quest_trigger") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_anachronos_quest_triggerAI(creature); - } - - struct npc_anachronos_quest_triggerAI : public ScriptedAI - { - npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature) {} - - uint64 PlayerGUID; - - uint32 WaveTimer; - uint32 AnnounceTimer; - - int8 LiveCount; - uint8 WaveCount; - - bool EventStarted; - bool Announced; - bool Failed; - - void Reset() - { - PlayerGUID = 0; - - WaveTimer = 2000; - AnnounceTimer = 1000; - LiveCount = 0; - WaveCount = 0; - - EventStarted = false; - Announced = false; - Failed = false; - - me->SetVisible(false); - } - - void SummonNextWave() - { - uint8 locIndex = WavesInfo[WaveCount].UsedSpawnPoint; - uint8 count = locIndex + WavesInfo[WaveCount].SpawnCount; - - for (uint8 i = locIndex; i <= count; ++i) - { - uint32 desptimer = WavesInfo[WaveCount].DespTimer; - - if (Creature* spawn = me->SummonCreature(WavesInfo[WaveCount].CreatureId, SpawnLocation[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, desptimer)) - { - if (spawn->GetEntry() == 15423) - spawn->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15427+rand()%4); - if (i >= 30) WaveCount = 1; - if (i >= 33) WaveCount = 2; - if (i >= 45) WaveCount = 3; - if (i >= 51) WaveCount = 4; - - if (WaveCount < 5) //1-4 Wave - { - if (mob_qiraj_war_spawn::mob_qiraj_war_spawnAI* spawnAI = CAST_AI(mob_qiraj_war_spawn::mob_qiraj_war_spawnAI, spawn->AI())) - { - spawnAI->MobGUID = me->GetGUID(); - spawnAI->PlayerGUID = PlayerGUID; - } - } - } - } - - WaveTimer = WavesInfo[WaveCount].SpawnTimer; - AnnounceTimer = WavesInfo[WaveCount].YellTimer; - } - - void CheckEventFail() - { - Player* player = Unit::GetPlayer(*me, PlayerGUID); - - if (!player) - return; - - if (Group* EventGroup = player->GetGroup()) - { - Player* groupMember; - - uint8 GroupMemberCount = 0; - uint8 DeadMemberCount = 0; - uint8 FailedMemberCount = 0; - - Group::MemberSlotList const members = EventGroup->GetMemberSlots(); - - for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr) - { - groupMember = (Unit::GetPlayer(*me, itr->guid)); - if (!groupMember) - continue; - if (!groupMember->IsWithinDistInMap(me, EVENT_AREA_RADIUS) && groupMember->GetQuestStatus(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) == QUEST_STATUS_INCOMPLETE) - { - groupMember->FailQuest(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD); - ++FailedMemberCount; - } - ++GroupMemberCount; - - if (groupMember->isDead()) - ++DeadMemberCount; - } - - if (GroupMemberCount == FailedMemberCount || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS)) - Failed = true; //only so event can restart - } - } - - void LiveCounter() - { - --LiveCount; - if (!LiveCount) - Announced = false; - } - - void UpdateAI(const uint32 diff) - { - if (!PlayerGUID || !EventStarted) - return; - - if (WaveCount < 4) - { - if (!Announced && AnnounceTimer <= diff) - { - DoScriptText(WavesInfo[WaveCount].WaveTextId, me); - Announced = true; - } else AnnounceTimer -= diff; - - if (WaveTimer <= diff) - SummonNextWave(); - else WaveTimer -= diff; - } - CheckEventFail(); - if (WaveCount == 4 || Failed) - EnterEvadeMode(); - }; - }; - -}; - -void mob_qiraj_war_spawn::mob_qiraj_war_spawnAI::JustDied(Unit* /*slayer*/) -{ - me->RemoveCorpse(); - - if (!MobGUID) - return; - - if (Creature* mob = Unit::GetCreature(*me, MobGUID)) - if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, mob->AI())) - triggerAI->LiveCounter(); - -}; - -/*##### -# go_crystalline_tear -######*/ - -class go_crystalline_tear : public GameObjectScript -{ -public: - go_crystalline_tear() : GameObjectScript("go_crystalline_tear") { } - - bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) - { - if (Creature* trigger = go->FindNearestCreature(15454, 100, player)) - { - Unit* Merithra = trigger->SummonCreature(15378, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Caelestrasz = trigger->SummonCreature(15379, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Arygos = trigger->SummonCreature(15380, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - /* Unit* Fandral = */ trigger->SummonCreature(15382, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Creature* Anachronos = trigger->SummonCreature(15381, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - - if (Merithra) - { - Merithra->SetUInt32Value(UNIT_NPC_FLAGS, 0); - Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15420); - Merithra->setFaction(35); - } - - if (Caelestrasz) - { - Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, 0); - Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15419); - Caelestrasz->setFaction(35); - } - - if (Arygos) - { - Arygos->SetUInt32Value(UNIT_NPC_FLAGS, 0); - Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15418); - Arygos->setFaction(35); - } - - if (Anachronos) - { - if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())) - anachronosAI->PlayerGUID = player->GetGUID(); - - if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) - { - triggerAI->Failed = false; - triggerAI->PlayerGUID = player->GetGUID(); - triggerAI->EventStarted = true; - triggerAI->Announced = true; - } - } - } - } - return true; - } - -}; /*### ## go_wind_stone @@ -1506,10 +582,6 @@ class go_wind_stone : public GameObjectScript void AddSC_silithus() { - new go_crystalline_tear(); - new npc_anachronos_quest_trigger(); - new npc_anachronos_the_ancient(); - new mob_qiraj_war_spawn(); new npc_highlord_demitrian(); new npcs_rutgar_and_frankal(); new go_wind_stone(); diff --git a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/stonetalon_mountains.cpp index d38395c7b37..2ac9903aa18 100644 --- a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/stonetalon_mountains.cpp @@ -18,14 +18,12 @@ /* ScriptData SDName: Stonetalon_Mountains -SD%Complete: 95 -SDComment: Quest support: 6627, 6523 +SD%Complete: 0 +SDComment: Quest support: SDCategory: Stonetalon Mountains EndScriptData */ /* ContentData -npc_braug_dimspirit -npc_kaya_flathoof EndContentData */ #include "ScriptMgr.h" @@ -33,146 +31,6 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -/*###### -## npc_braug_dimspirit -######*/ - -#define GOSSIP_HBD1 "Ysera" -#define GOSSIP_HBD2 "Neltharion" -#define GOSSIP_HBD3 "Nozdormu" -#define GOSSIP_HBD4 "Alexstrasza" -#define GOSSIP_HBD5 "Malygos" - -class npc_braug_dimspirit : public CreatureScript -{ -public: - npc_braug_dimspirit() : CreatureScript("npc_braug_dimspirit") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, 6766, false); - - } - if (action == GOSSIP_ACTION_INFO_DEF+2) - { - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(6627); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(6627) == QUEST_STATUS_INCOMPLETE) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(5820, creature->GetGUID()); - } - else - player->SEND_GOSSIP_MENU(5819, creature->GetGUID()); - - return true; - } - -}; - -/*###### -## npc_kaya_flathoof -######*/ - -enum Kaya -{ - FACTION_ESCORTEE_H = 775, - - NPC_GRIMTOTEM_RUFFIAN = 11910, - NPC_GRIMTOTEM_BRUTE = 11912, - NPC_GRIMTOTEM_SORCERER = 11913, - - SAY_START = -1000357, - SAY_AMBUSH = -1000358, - SAY_END = -1000359, - - QUEST_PROTECT_KAYA = 6523 -}; - -class npc_kaya_flathoof : public CreatureScript -{ -public: - npc_kaya_flathoof() : CreatureScript("npc_kaya_flathoof") { } - - struct npc_kaya_flathoofAI : public npc_escortAI - { - npc_kaya_flathoofAI(Creature* creature) : npc_escortAI(creature) {} - - void WaypointReached(uint32 waypointId) - { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (waypointId) - { - case 16: - DoScriptText(SAY_AMBUSH, me); - me->SummonCreature(NPC_GRIMTOTEM_BRUTE, -48.53f, -503.34f, -46.31f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_GRIMTOTEM_RUFFIAN, -38.85f, -503.77f, -45.90f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_GRIMTOTEM_SORCERER, -36.37f, -496.23f, -45.71f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 18: - me->SetInFront(player); - DoScriptText(SAY_END, me, player); - player->GroupEventHappens(QUEST_PROTECT_KAYA, me); - break; - } - } - - void JustSummoned(Creature* summoned) - { - summoned->AI()->AttackStart(me); - } - - void Reset(){} - }; - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_PROTECT_KAYA) - { - if (npc_escortAI* pEscortAI = CAST_AI(npc_kaya_flathoof::npc_kaya_flathoofAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - - DoScriptText(SAY_START, creature); - creature->setFaction(113); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_kaya_flathoofAI(creature); - } - -}; - -/*###### -## AddSC -######*/ - void AddSC_stonetalon_mountains() { - new npc_braug_dimspirit(); - new npc_kaya_flathoof(); } diff --git a/src/server/scripts/Kalimdor/tanaris.cpp b/src/server/scripts/Kalimdor/tanaris.cpp index 9b742b495bb..45fbb15e582 100644 --- a/src/server/scripts/Kalimdor/tanaris.cpp +++ b/src/server/scripts/Kalimdor/tanaris.cpp @@ -19,18 +19,14 @@ /* ScriptData SDName: Tanaris SD%Complete: 80 -SDComment: Quest support: 648, 1560, 2954, 4005, 10277, 10279(Special flight path). Noggenfogger vendor +SDComment: Quest support: 648, 10277, 10279(Special flight path). SDCategory: Tanaris EndScriptData */ /* ContentData -mob_aquementas npc_custodian_of_time -npc_marin_noggenfogger npc_steward_of_time -npc_stone_watcher_of_norgannon npc_OOX17 -npc_tooga EndContentData */ #include "ScriptMgr.h" @@ -39,111 +35,6 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "ScriptedFollowerAI.h" -/*###### -## mob_aquementas -######*/ - -enum Aquementas -{ - AGGRO_YELL_AQUE = -1000350, - - SPELL_AQUA_JET = 13586, - SPELL_FROST_SHOCK = 15089 -}; - -class mob_aquementas : public CreatureScript -{ -public: - mob_aquementas() : CreatureScript("mob_aquementas") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_aquementasAI (creature); - } - - struct mob_aquementasAI : public ScriptedAI - { - mob_aquementasAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 SendItemTimer; - uint32 SwitchFactionTimer; - bool isFriendly; - - uint32 FrostShockTimer; - uint32 AquaJetTimer; - - void Reset() - { - SendItemTimer = 0; - SwitchFactionTimer = 10000; - me->setFaction(35); - isFriendly = true; - - AquaJetTimer = 5000; - FrostShockTimer = 1000; - } - - void SendItem(Unit* receiver) - { - if (CAST_PLR(receiver)->HasItemCount(11169, 1, false) && - CAST_PLR(receiver)->HasItemCount(11172, 11, false) && - CAST_PLR(receiver)->HasItemCount(11173, 1, false) && - !CAST_PLR(receiver)->HasItemCount(11522, 1, true)) - { - ItemPosCountVec dest; - uint8 msg = CAST_PLR(receiver)->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 11522, 1, NULL); - if (msg == EQUIP_ERR_OK) - CAST_PLR(receiver)->StoreNewItem(dest, 11522, 1, true); - } - } - - void EnterCombat(Unit* who) - { - DoScriptText(AGGRO_YELL_AQUE, me, who); - } - - void UpdateAI(const uint32 diff) - { - if (isFriendly) - { - if (SwitchFactionTimer <= diff) - { - me->setFaction(91); - isFriendly = false; - } else SwitchFactionTimer -= diff; - } - - if (!UpdateVictim()) - return; - - if (!isFriendly) - { - if (SendItemTimer <= diff) - { - if (me->getVictim()->GetTypeId() == TYPEID_PLAYER) - SendItem(me->getVictim()); - SendItemTimer = 5000; - } else SendItemTimer -= diff; - } - - if (FrostShockTimer <= diff) - { - DoCast(me->getVictim(), SPELL_FROST_SHOCK); - FrostShockTimer = 15000; - } else FrostShockTimer -= diff; - - if (AquaJetTimer <= diff) - { - DoCast(me, SPELL_AQUA_JET); - AquaJetTimer = 15000; - } else AquaJetTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; - -}; - /*###### ## npc_custodian_of_time ######*/ @@ -276,39 +167,6 @@ public: }; -/*###### -## npc_marin_noggenfogger -######*/ - -class npc_marin_noggenfogger : public CreatureScript -{ -public: - npc_marin_noggenfogger() : CreatureScript("npc_marin_noggenfogger") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->isVendor() && player->GetQuestRewardStatus(2662)) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - -}; - /*###### ## npc_steward_of_time ######*/ @@ -355,70 +213,6 @@ public: }; -/*###### -## npc_stone_watcher_of_norgannon -######*/ - -#define GOSSIP_ITEM_NORGANNON_1 "What function do you serve?" -#define GOSSIP_ITEM_NORGANNON_2 "What are the Plates of Uldum?" -#define GOSSIP_ITEM_NORGANNON_3 "Where are the Plates of Uldum?" -#define GOSSIP_ITEM_NORGANNON_4 "Excuse me? We've been \"reschedueled for visitations\"? What does that mean?!" -#define GOSSIP_ITEM_NORGANNON_5 "So, what's inside Uldum?" -#define GOSSIP_ITEM_NORGANNON_6 "I will return when i have the Plates of Uldum." - -class npc_stone_watcher_of_norgannon : public CreatureScript -{ -public: - npc_stone_watcher_of_norgannon() : CreatureScript("npc_stone_watcher_of_norgannon") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(1675, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(1676, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->SEND_GOSSIP_MENU(1677, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - player->SEND_GOSSIP_MENU(1678, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - player->SEND_GOSSIP_MENU(1679, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(2954); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(2954) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(1674, creature->GetGUID()); - - return true; - } - -}; - /*###### ## npc_OOX17 ######*/ @@ -511,176 +305,9 @@ public: }; }; -/*#### -# npc_tooga -####*/ - -enum Tooga -{ - SAY_TOOG_THIRST = -1000391, - SAY_TOOG_WORRIED = -1000392, - SAY_TOOG_POST_1 = -1000393, - SAY_TORT_POST_2 = -1000394, - SAY_TOOG_POST_3 = -1000395, - SAY_TORT_POST_4 = -1000396, - SAY_TOOG_POST_5 = -1000397, - SAY_TORT_POST_6 = -1000398, - - QUEST_TOOGA = 1560, - NPC_TORTA = 6015, - - POINT_ID_TO_WATER = 1, - FACTION_TOOG_ESCORTEE = 113 -}; - -Position const ToWaterLoc = {-7032.664551f, -4906.199219f, -1.606446f, 0.0f}; - -class npc_tooga : public CreatureScript -{ -public: - npc_tooga() : CreatureScript("npc_tooga") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_TOOGA) - { - if (npc_toogaAI* pToogaAI = CAST_AI(npc_tooga::npc_toogaAI, creature->AI())) - pToogaAI->StartFollow(player, FACTION_TOOG_ESCORTEE, quest); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_toogaAI(creature); - } - - struct npc_toogaAI : public FollowerAI - { - npc_toogaAI(Creature* creature) : FollowerAI(creature) { } - - uint32 CheckSpeechTimer; - uint32 PostEventTimer; - uint32 PhasePostEvent; - - uint64 TortaGUID; - - void Reset() - { - CheckSpeechTimer = 2500; - PostEventTimer = 1000; - PhasePostEvent = 0; - - TortaGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - FollowerAI::MoveInLineOfSight(who); - - if (!me->getVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE | STATE_FOLLOW_POSTEVENT) && who->GetEntry() == NPC_TORTA) - { - if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) - { - Player* player = GetLeaderForFollower(); - if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_TOOGA, me); - - TortaGUID = who->GetGUID(); - SetFollowComplete(true); - } - } - } - - void MovementInform(uint32 MotionType, uint32 PointId) - { - FollowerAI::MovementInform(MotionType, PointId); - - if (MotionType != POINT_MOTION_TYPE) - return; - - if (PointId == POINT_ID_TO_WATER) - SetFollowComplete(); - } - - void UpdateFollowerAI(const uint32 Diff) - { - if (!UpdateVictim()) - { - //we are doing the post-event, or... - if (HasFollowState(STATE_FOLLOW_POSTEVENT)) - { - if (PostEventTimer <= Diff) - { - PostEventTimer = 5000; - - Unit* pTorta = Unit::GetUnit(*me, TortaGUID); - if (!pTorta || !pTorta->isAlive()) - { - //something happened, so just complete - SetFollowComplete(); - return; - } - - switch (PhasePostEvent) - { - case 1: - DoScriptText(SAY_TOOG_POST_1, me); - break; - case 2: - DoScriptText(SAY_TORT_POST_2, pTorta); - break; - case 3: - DoScriptText(SAY_TOOG_POST_3, me); - break; - case 4: - DoScriptText(SAY_TORT_POST_4, pTorta); - break; - case 5: - DoScriptText(SAY_TOOG_POST_5, me); - break; - case 6: - DoScriptText(SAY_TORT_POST_6, pTorta); - me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc); - break; - } - - ++PhasePostEvent; - } - else - PostEventTimer -= Diff; - } - //...we are doing regular speech check - else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) - { - if (CheckSpeechTimer <= Diff) - { - CheckSpeechTimer = 5000; - - if (urand(0, 9) > 8) - DoScriptText(RAND(SAY_TOOG_THIRST, SAY_TOOG_WORRIED), me); - } - else - CheckSpeechTimer -= Diff; - } - - return; - } - - DoMeleeAttackIfReady(); - } - }; - -}; - void AddSC_tanaris() { - new mob_aquementas(); new npc_custodian_of_time(); - new npc_marin_noggenfogger(); new npc_steward_of_time(); - new npc_stone_watcher_of_norgannon(); new npc_OOX17(); - new npc_tooga(); } diff --git a/src/server/scripts/Kalimdor/the_barrens.cpp b/src/server/scripts/Kalimdor/the_barrens.cpp index f4983558b67..5b13fe9591f 100644 --- a/src/server/scripts/Kalimdor/the_barrens.cpp +++ b/src/server/scripts/Kalimdor/the_barrens.cpp @@ -19,16 +19,11 @@ /* ScriptData SDName: The_Barrens SD%Complete: 90 -SDComment: Quest support: 863, 898, 1719, 2458, 4921, 6981, +SDComment: Quest support: 863 SDCategory: Barrens EndScriptData */ /* ContentData -npc_beaten_corpse -npc_gilthares -npc_sputtervalve -npc_taskmaster_fizzule -npc_twiggy_flathead npc_wizzlecrank_shredder EndContentData */ @@ -37,491 +32,6 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -/*###### -## npc_beaten_corpse -######*/ - -#define GOSSIP_CORPSE "Examine corpse in detail..." - -enum BeatenCorpse -{ - QUEST_LOST_IN_BATTLE = 4921 -}; - -class npc_beaten_corpse : public CreatureScript -{ -public: - npc_beaten_corpse() : CreatureScript("npc_beaten_corpse") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF +1) - { - player->SEND_GOSSIP_MENU(3558, creature->GetGUID()); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_COMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(3557, creature->GetGUID()); - return true; - } - -}; - -/*###### -# npc_gilthares -######*/ - -enum Gilthares -{ - SAY_GIL_START = -1000370, - SAY_GIL_AT_LAST = -1000371, - SAY_GIL_PROCEED = -1000372, - SAY_GIL_FREEBOOTERS = -1000373, - SAY_GIL_AGGRO_1 = -1000374, - SAY_GIL_AGGRO_2 = -1000375, - SAY_GIL_AGGRO_3 = -1000376, - SAY_GIL_AGGRO_4 = -1000377, - SAY_GIL_ALMOST = -1000378, - SAY_GIL_SWEET = -1000379, - SAY_GIL_FREED = -1000380, - - QUEST_FREE_FROM_HOLD = 898, - AREA_MERCHANT_COAST = 391, - FACTION_ESCORTEE = 232 //guessed, possible not needed for this quest -}; - -class npc_gilthares : public CreatureScript -{ -public: - npc_gilthares() : CreatureScript("npc_gilthares") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD) - { - creature->setFaction(FACTION_ESCORTEE); - creature->SetStandState(UNIT_STAND_STATE_STAND); - - DoScriptText(SAY_GIL_START, creature, player); - - if (npc_giltharesAI* pEscortAI = CAST_AI(npc_gilthares::npc_giltharesAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_giltharesAI(creature); - } - - struct npc_giltharesAI : public npc_escortAI - { - npc_giltharesAI(Creature* creature) : npc_escortAI(creature) { } - - void Reset() { } - - void WaypointReached(uint32 waypointId) - { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (waypointId) - { - case 16: - DoScriptText(SAY_GIL_AT_LAST, me, player); - break; - case 17: - DoScriptText(SAY_GIL_PROCEED, me, player); - break; - case 18: - DoScriptText(SAY_GIL_FREEBOOTERS, me, player); - break; - case 37: - DoScriptText(SAY_GIL_ALMOST, me, player); - break; - case 47: - DoScriptText(SAY_GIL_SWEET, me, player); - break; - case 53: - DoScriptText(SAY_GIL_FREED, me, player); - player->GroupEventHappens(QUEST_FREE_FROM_HOLD, me); - break; - } - } - - void EnterCombat(Unit* who) - { - //not always use - if (rand()%4) - return; - - //only aggro text if not player and only in this area - if (who->GetTypeId() != TYPEID_PLAYER && me->GetAreaId() == AREA_MERCHANT_COAST) - { - //appears to be pretty much random (possible only if escorter not in combat with who yet?) - DoScriptText(RAND(SAY_GIL_AGGRO_1, SAY_GIL_AGGRO_2, SAY_GIL_AGGRO_3, SAY_GIL_AGGRO_4), me, who); - } - } - }; - -}; - -/*###### -## npc_sputtervalve -######*/ - -#define GOSSIP_SPUTTERVALVE "Can you tell me about this shard?" - -class npc_sputtervalve : public CreatureScript -{ -public: - npc_sputtervalve() : CreatureScript("npc_sputtervalve") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) - { - player->SEND_GOSSIP_MENU(2013, creature->GetGUID()); - player->AreaExploredOrEventHappens(6981); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(6981) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SPUTTERVALVE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - -}; - -/*###### -## npc_taskmaster_fizzule -######*/ - -enum TaskmasterFizzule -{ - FACTION_FRIENDLY_F = 35, - SPELL_FLARE = 10113, - SPELL_FOLLY = 10137, -}; - -class npc_taskmaster_fizzule : public CreatureScript -{ -public: - npc_taskmaster_fizzule() : CreatureScript("npc_taskmaster_fizzule") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_taskmaster_fizzuleAI(creature); - } - - struct npc_taskmaster_fizzuleAI : public ScriptedAI - { - npc_taskmaster_fizzuleAI(Creature* creature) : ScriptedAI(creature) - { - factionNorm = creature->getFaction(); - } - - uint32 factionNorm; - bool IsFriend; - uint32 ResetTimer; - uint8 FlareCount; - - void Reset() - { - IsFriend = false; - ResetTimer = 120000; - FlareCount = 0; - me->setFaction(factionNorm); - } - - void DoFriend() - { - me->RemoveAllAuras(); - me->DeleteThreatList(); - me->CombatStop(true); - - me->StopMoving(); - me->GetMotionMaster()->MoveIdle(); - - me->setFaction(FACTION_FRIENDLY_F); - me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spell) - { - if (spell->Id == SPELL_FLARE || spell->Id == SPELL_FOLLY) - { - ++FlareCount; - - if (FlareCount >= 2) - IsFriend = true; - } - } - - void EnterCombat(Unit* /*who*/) {} - - void UpdateAI(const uint32 diff) - { - if (IsFriend) - { - if (ResetTimer <= diff) - { - EnterEvadeMode(); - return; - } else ResetTimer -= diff; - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - - void ReceiveEmote(Player* /*player*/, uint32 emote) - { - if (emote == TEXT_EMOTE_SALUTE) - { - if (FlareCount >= 2) - { - if (me->getFaction() == FACTION_FRIENDLY_F) - return; - - DoFriend(); - } - } - } - }; - -}; - -/*##### -## npc_twiggy_flathead -#####*/ - -enum TwiggyFlathead -{ - NPC_BIG_WILL = 6238, - NPC_AFFRAY_CHALLENGER = 6240, - - SAY_BIG_WILL_READY = -1000123, - SAY_TWIGGY_FLATHEAD_BEGIN = -1000124, - SAY_TWIGGY_FLATHEAD_FRAY = -1000125, - SAY_TWIGGY_FLATHEAD_DOWN = -1000126, - SAY_TWIGGY_FLATHEAD_OVER = -1000127, -}; - -Position const AffrayChallengerLoc[6] = -{ - {-1683.0f, -4326.0f, 2.79f, 0.0f}, - {-1682.0f, -4329.0f, 2.79f, 0.0f}, - {-1683.0f, -4330.0f, 2.79f, 0.0f}, - {-1680.0f, -4334.0f, 2.79f, 1.49f}, - {-1674.0f, -4326.0f, 2.79f, 3.49f}, - {-1677.0f, -4334.0f, 2.79f, 1.66f} -}; - -class npc_twiggy_flathead : public CreatureScript -{ -public: - npc_twiggy_flathead() : CreatureScript("npc_twiggy_flathead") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_twiggy_flatheadAI (creature); - } - - struct npc_twiggy_flatheadAI : public ScriptedAI - { - npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature) {} - - bool EventInProgress; - bool EventGrate; - bool EventBigWill; - bool ChallengerDown[6]; - uint8 Wave; - uint32 WaveTimer; - uint32 ChallengerChecker; - uint64 PlayerGUID; - uint64 AffrayChallenger[6]; - uint64 BigWill; - - void Reset() - { - EventInProgress = false; - EventGrate = false; - EventBigWill = false; - WaveTimer = 600000; - ChallengerChecker = 0; - Wave = 0; - PlayerGUID = 0; - - for (uint8 i = 0; i < 6; ++i) - { - AffrayChallenger[i] = 0; - ChallengerDown[i] = false; - } - BigWill = 0; - } - - void EnterCombat(Unit* /*who*/) { } - - void MoveInLineOfSight(Unit* who) - { - if (!who || (!who->isAlive())) - return; - - if (me->IsWithinDistInMap(who, 10.0f) && (who->GetTypeId() == TYPEID_PLAYER) && CAST_PLR(who)->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE && !EventInProgress) - { - PlayerGUID = who->GetGUID(); - EventInProgress = true; - } - } - - void KilledUnit(Unit* /*victim*/) { } - - void UpdateAI(const uint32 diff) - { - if (EventInProgress) { - Player* pWarrior = NULL; - - if (PlayerGUID) - pWarrior = Unit::GetPlayer(*me, PlayerGUID); - - if (!pWarrior) - return; - - if (!pWarrior->isAlive() && pWarrior->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) { - DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me); - pWarrior->FailQuest(1719); - - for (uint8 i = 0; i < 6; ++i) // unsummon challengers - { - if (AffrayChallenger[i]) - { - Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]); - if (creature && creature->isAlive()) - creature->DisappearAndDie(); - } - } - - if (BigWill) // unsummon bigWill - { - Creature* creature = Unit::GetCreature((*me), BigWill); - if (creature && creature->isAlive()) - creature->DisappearAndDie(); - } - Reset(); - } - - if (!EventGrate && EventInProgress) - { - float x, y, z; - pWarrior->GetPosition(x, y, z); - - if (x >= -1684 && x <= -1674 && y >= -4334 && y <= -4324) { - pWarrior->AreaExploredOrEventHappens(1719); - DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, me, pWarrior); - - for (uint8 i = 0; i < 6; ++i) - { - Creature* creature = me->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); - if (!creature) - continue; - creature->setFaction(35); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - creature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - AffrayChallenger[i] = creature->GetGUID(); - } - WaveTimer = 5000; - ChallengerChecker = 1000; - EventGrate = true; - } - } - else if (EventInProgress) - { - if (ChallengerChecker <= diff) - { - for (uint8 i = 0; i < 6; ++i) - { - if (AffrayChallenger[i]) - { - Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]); - if ((!creature || (!creature->isAlive())) && !ChallengerDown[i]) - { - DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me); - ChallengerDown[i] = true; - } - } - } - ChallengerChecker = 1000; - } else ChallengerChecker -= diff; - - if (WaveTimer <= diff) - { - if (Wave < 6 && AffrayChallenger[Wave] && !EventBigWill) - { - DoScriptText(SAY_TWIGGY_FLATHEAD_FRAY, me); - Creature* creature = Unit::GetCreature((*me), AffrayChallenger[Wave]); - if (creature && (creature->isAlive())) - { - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - creature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - creature->setFaction(14); - creature->AI()->AttackStart(pWarrior); - ++Wave; - WaveTimer = 20000; - } - } - else if (Wave >= 6 && !EventBigWill) { - if (Creature* creature = me->SummonCreature(NPC_BIG_WILL, -1722, -4341, 6.12f, 6.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 480000)) - { - BigWill = creature->GetGUID(); - //creature->GetMotionMaster()->MovePoint(0, -1693, -4343, 4.32f); - //creature->GetMotionMaster()->MovePoint(1, -1684, -4333, 2.78f); - creature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79f); - creature->HandleEmoteCommand(EMOTE_STATE_READY_UNARMED); - EventBigWill = true; - WaveTimer = 1000; - } - } - else if (Wave >= 6 && EventBigWill && BigWill) - { - Creature* creature = Unit::GetCreature((*me), BigWill); - if (!creature || !creature->isAlive()) - { - DoScriptText(SAY_TWIGGY_FLATHEAD_OVER, me); - Reset(); - } - } - } else WaveTimer -= diff; - } - } - } - }; - -}; - /*##### ## npc_wizzlecrank_shredder #####*/ @@ -687,10 +197,5 @@ public: void AddSC_the_barrens() { - new npc_beaten_corpse(); - new npc_gilthares(); - new npc_sputtervalve(); - new npc_taskmaster_fizzule(); - new npc_twiggy_flathead(); new npc_wizzlecrank_shredder(); } diff --git a/src/server/scripts/Kalimdor/thousand_needles.cpp b/src/server/scripts/Kalimdor/thousand_needles.cpp index b9ae356ddf1..2abef548a94 100644 --- a/src/server/scripts/Kalimdor/thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/thousand_needles.cpp @@ -18,18 +18,12 @@ /* ScriptData SDName: Thousand Needles -SD%Complete: 100 -SDComment: Support for Quest: 1950, 4770, 4904, 4966, 5151. +SD%Complete: 0 +SDComment: Support for Quest: SDCategory: Thousand Needles EndScriptData */ /* ContentData -npc_kanati -npc_lakota_windsong -npc_swiftmountain -npc_plucky -npc_enraged_panther -go_panther_cage EndContentData */ #include "ScriptMgr.h" @@ -37,425 +31,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -/*##### -# npc_kanati -######*/ - -enum Kanati -{ - SAY_KAN_START = -1000410, - - QUEST_PROTECT_KANATI = 4966, - NPC_GALAK_ASS = 10720 -}; - -Position const GalakLoc = {-4867.387695f, -1357.353760f, -48.226f, 0.0f}; - -class npc_kanati : public CreatureScript -{ -public: - npc_kanati() : CreatureScript("npc_kanati") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_PROTECT_KANATI) - if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest, true); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_kanatiAI(creature); - } - - struct npc_kanatiAI : public npc_escortAI - { - npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { } - - void Reset() {} - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - case 0: - DoScriptText(SAY_KAN_START, me); - DoSpawnGalak(); - break; - case 1: - if (Player* player = GetPlayerForEscort()) - player->GroupEventHappens(QUEST_PROTECT_KANATI, me); - break; - } - } - - void DoSpawnGalak() - { - for (int i = 0; i < 3; ++i) - me->SummonCreature(NPC_GALAK_ASS, GalakLoc, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - } - - void JustSummoned(Creature* summoned) - { - summoned->AI()->AttackStart(me); - } - }; - -}; - -/*###### -# npc_lakota_windsong -######*/ - -enum Lakota -{ - SAY_LAKO_START = -1000365, - SAY_LAKO_LOOK_OUT = -1000366, - SAY_LAKO_HERE_COME = -1000367, - SAY_LAKO_MORE = -1000368, - SAY_LAKO_END = -1000369, - - QUEST_FREE_AT_LAST = 4904, - NPC_GRIM_BANDIT = 10758, - FACTION_ESCORTEE_LAKO = 232, //guessed - - ID_AMBUSH_1 = 0, - ID_AMBUSH_2 = 2, - ID_AMBUSH_3 = 4 -}; - -Position const BanditLoc[6] = -{ - {-4905.479492f, -2062.732666f, 84.352f, 0.0f}, - {-4915.201172f, -2073.528320f, 84.733f, 0.0f}, - {-4878.883301f, -1986.947876f, 91.966f, 0.0f}, - {-4877.503906f, -1966.113403f, 91.859f, 0.0f}, - {-4767.985352f, -1873.169189f, 90.192f, 0.0f}, - {-4788.861328f, -1888.007813f, 89.888f, 0.0f} -}; - -class npc_lakota_windsong : public CreatureScript -{ -public: - npc_lakota_windsong() : CreatureScript("npc_lakota_windsong") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_FREE_AT_LAST) - { - DoScriptText(SAY_LAKO_START, creature, player); - creature->setFaction(FACTION_ESCORTEE_LAKO); - - if (npc_lakota_windsongAI* pEscortAI = CAST_AI(npc_lakota_windsong::npc_lakota_windsongAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_lakota_windsongAI(creature); - } - - struct npc_lakota_windsongAI : public npc_escortAI - { - npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { } - - void Reset() {} - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - case 8: - DoScriptText(SAY_LAKO_LOOK_OUT, me); - DoSpawnBandits(ID_AMBUSH_1); - break; - case 14: - DoScriptText(SAY_LAKO_HERE_COME, me); - DoSpawnBandits(ID_AMBUSH_2); - break; - case 21: - DoScriptText(SAY_LAKO_MORE, me); - DoSpawnBandits(ID_AMBUSH_3); - break; - case 45: - if (Player* player = GetPlayerForEscort()) - player->GroupEventHappens(QUEST_FREE_AT_LAST, me); - break; - } - } - - void DoSpawnBandits(int AmbushId) - { - for (int i = 0; i < 2; ++i) - me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - } - }; - -}; - -/*###### -# npc_paoka_swiftmountain -######*/ - -enum Packa -{ - SAY_START = -1000362, - SAY_WYVERN = -1000363, - SAY_COMPLETE = -1000364, - - QUEST_HOMEWARD = 4770, - NPC_WYVERN = 4107, - FACTION_ESCORTEE = 232 //guessed -}; - -Position const WyvernLoc[3] = -{ - {-4990.606f, -906.057f, -5.343f, 0.0f}, - {-4970.241f, -927.378f, -4.951f, 0.0f}, - {-4985.364f, -952.528f, -5.199f, 0.0f} -}; - -class npc_paoka_swiftmountain : public CreatureScript -{ -public: - npc_paoka_swiftmountain() : CreatureScript("npc_paoka_swiftmountain") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_HOMEWARD) - { - DoScriptText(SAY_START, creature, player); - creature->setFaction(FACTION_ESCORTEE); - - if (npc_paoka_swiftmountainAI* pEscortAI = CAST_AI(npc_paoka_swiftmountain::npc_paoka_swiftmountainAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_paoka_swiftmountainAI(creature); - } - - struct npc_paoka_swiftmountainAI : public npc_escortAI - { - npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { } - - void Reset() {} - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - case 15: - DoScriptText(SAY_WYVERN, me); - DoSpawnWyvern(); - break; - case 26: - DoScriptText(SAY_COMPLETE, me); - break; - case 27: - if (Player* player = GetPlayerForEscort()) - player->GroupEventHappens(QUEST_HOMEWARD, me); - break; - } - } - - void DoSpawnWyvern() - { - for (int i = 0; i < 3; ++i) - me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - } - }; -}; - -/*##### -# npc_plucky -######*/ - -#define GOSSIP_P "Please tell me the Phrase.." - -enum Plucky -{ - FACTION_FRIENDLY = 35, - QUEST_SCOOP = 1950, - SPELL_PLUCKY_HUMAN = 9192, - SPELL_PLUCKY_CHICKEN = 9220 -}; - -class npc_plucky : public CreatureScript -{ -public: - npc_plucky() : CreatureScript("npc_plucky") { } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->CLOSE_GOSSIP_MENU(); - player->CompleteQuest(QUEST_SCOOP); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_P, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(738, creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pluckyAI(creature); - } - - struct npc_pluckyAI : public ScriptedAI - { - npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { NormFaction = creature->getFaction(); } - - uint32 NormFaction; - uint32 ResetTimer; - - void Reset() - { - ResetTimer = 120000; - - if (me->getFaction() != NormFaction) - me->setFaction(NormFaction); - - if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - DoCast(me, SPELL_PLUCKY_CHICKEN, false); - } - - void ReceiveEmote(Player* player, uint32 TextEmote) - { - if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) - { - if (TextEmote == TEXT_EMOTE_BECKON) - { - me->setFaction(FACTION_FRIENDLY); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - DoCast(me, SPELL_PLUCKY_HUMAN, false); - } - } - - if (TextEmote == TEXT_EMOTE_CHICKEN) - { - if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - return; - else - { - me->setFaction(FACTION_FRIENDLY); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - DoCast(me, SPELL_PLUCKY_HUMAN, false); - me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); - } - } - } - - void UpdateAI(const uint32 Diff) - { - if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - { - if (ResetTimer <= Diff) - { - if (!me->getVictim()) - EnterEvadeMode(); - else - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - return; - } - else - ResetTimer -= Diff; - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; - -}; - -enum PantherCage -{ - ENRAGED_PANTHER = 10992 -}; - -class go_panther_cage : public GameObjectScript -{ -public: - go_panther_cage() : GameObjectScript("go_panther_cage") { } - - bool OnGossipHello(Player* player, GameObject* go) - { - if (player->GetQuestStatus(5151) == QUEST_STATUS_INCOMPLETE) - { - if (Creature* panther = go->FindNearestCreature(ENRAGED_PANTHER, 5, true)) - { - panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - panther->SetReactState(REACT_AGGRESSIVE); - panther->AI()->AttackStart(player); - } - } - - return true; - } -}; - -class npc_enraged_panther : public CreatureScript -{ -public: - npc_enraged_panther() : CreatureScript("npc_enraged_panther") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_enraged_pantherAI(creature); - } - - struct npc_enraged_pantherAI : public ScriptedAI - { - npc_enraged_pantherAI(Creature* creature) : ScriptedAI(creature) {} - - void Reset() - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); - } - - void UpdateAI(const uint32 /*diff*/) - { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; - -}; void AddSC_thousand_needles() { - new npc_kanati(); - new npc_lakota_windsong(); - new npc_paoka_swiftmountain(); - new npc_plucky(); - new npc_enraged_panther(); - new go_panther_cage(); } diff --git a/src/server/scripts/Kalimdor/thunder_bluff.cpp b/src/server/scripts/Kalimdor/thunder_bluff.cpp index b8b05b9692f..4feca5929b5 100644 --- a/src/server/scripts/Kalimdor/thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/thunder_bluff.cpp @@ -47,30 +47,6 @@ class npc_cairne_bloodhoof : public CreatureScript public: npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_SENDER_INFO) - { - player->CastSpell(player, 23123, false); - player->SEND_GOSSIP_MENU(7014, creature->GetGUID()); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); - - player->SEND_GOSSIP_MENU(7013, creature->GetGUID()); - - return true; - } - CreatureAI* GetAI(Creature* creature) const { return new npc_cairne_bloodhoofAI (creature); diff --git a/src/server/scripts/Kalimdor/ungoro_crater.cpp b/src/server/scripts/Kalimdor/ungoro_crater.cpp index 786d2fc0cd3..d8d6acf3605 100644 --- a/src/server/scripts/Kalimdor/ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/ungoro_crater.cpp @@ -18,14 +18,12 @@ /* ScriptData SDName: Ungoro Crater -SD%Complete: 100 -SDComment: Support for Quest: 4245, 4491 +SD%Complete: 0 +SDComment: Support for Quest: SDCategory: Ungoro Crater EndScriptData */ /* ContentData -npc_a-me -npc_ringo EndContentData */ #include "ScriptMgr.h" @@ -33,321 +31,6 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "ScriptedFollowerAI.h" -enum AmeData -{ - SAY_READY = -1000517, - SAY_AGGRO1 = -1000518, - SAY_SEARCH = -1000519, - SAY_AGGRO2 = -1000520, - SAY_AGGRO3 = -1000521, - SAY_FINISH = -1000522, - - SPELL_DEMORALIZINGSHOUT = 13730, - - QUEST_CHASING_AME = 4245, - ENTRY_TARLORD = 6519, - ENTRY_TARLORD1 = 6519, - ENTRY_STOMPER = 6513, -}; - -class npc_ame : public CreatureScript -{ -public: - npc_ame() : CreatureScript("npc_ame") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_CHASING_AME) - { - CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); - DoScriptText(SAY_READY, creature, player); - creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - // Change faction so mobs attack - creature->setFaction(113); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_ameAI(creature); - } - - struct npc_ameAI : public npc_escortAI - { - npc_ameAI(Creature* creature) : npc_escortAI(creature) {} - - uint32 DemoralizingShoutTimer; - - void WaypointReached(uint32 waypointId) - { - if (Player* player = GetPlayerForEscort()) - { - switch (waypointId) - { - case 19: - me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_AGGRO1, me, player); - break; - case 28: - DoScriptText(SAY_SEARCH, me, player); - break; - case 38: - me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_AGGRO2, me, player); - break; - case 49: - me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - DoScriptText(SAY_AGGRO3, me, player); - break; - case 55: - DoScriptText(SAY_FINISH, me, player); - player->GroupEventHappens(QUEST_CHASING_AME, me); - break; - } - } - } - - void Reset() - { - DemoralizingShoutTimer = 5000; - } - - void JustSummoned(Creature* summoned) - { - summoned->AI()->AttackStart(me); - } - - void JustDied(Unit* /*killer*/) - { - if (Player* player = GetPlayerForEscort()) - player->FailQuest(QUEST_CHASING_AME); - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - if (!UpdateVictim()) - return; - - if (DemoralizingShoutTimer <= diff) - { - DoCast(me->getVictim(), SPELL_DEMORALIZINGSHOUT); - DemoralizingShoutTimer = 70000; - } else DemoralizingShoutTimer -= diff; - } - }; -}; - -/*#### -# npc_ringo -####*/ - -enum Ringo -{ - SAY_RIN_START_1 = -1000416, - SAY_RIN_START_2 = -1000417, - - SAY_FAINT_1 = -1000418, - SAY_FAINT_2 = -1000419, - SAY_FAINT_3 = -1000420, - SAY_FAINT_4 = -1000421, - - SAY_WAKE_1 = -1000422, - SAY_WAKE_2 = -1000423, - SAY_WAKE_3 = -1000424, - SAY_WAKE_4 = -1000425, - - SAY_RIN_END_1 = -1000426, - SAY_SPR_END_2 = -1000427, - SAY_RIN_END_3 = -1000428, - EMOTE_RIN_END_4 = -1000429, - EMOTE_RIN_END_5 = -1000430, - SAY_RIN_END_6 = -1000431, // signed for 6784 - SAY_SPR_END_7 = -1000432, - EMOTE_RIN_END_8 = -1000433, - - SPELL_REVIVE_RINGO = 15591, - QUEST_A_LITTLE_HELP = 4491, - NPC_SPRAGGLE = 9997, - FACTION_ESCORTEE = 113 -}; - -class npc_ringo : public CreatureScript -{ -public: - npc_ringo() : CreatureScript("npc_ringo") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_A_LITTLE_HELP) - { - if (npc_ringoAI* pRingoAI = CAST_AI(npc_ringo::npc_ringoAI, creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - pRingoAI->StartFollow(player, FACTION_ESCORTEE, quest); - } - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_ringoAI(creature); - } - - struct npc_ringoAI : public FollowerAI - { - npc_ringoAI(Creature* creature) : FollowerAI(creature) { } - - uint32 FaintTimer; - uint32 EndEventProgress; - uint32 EndEventTimer; - - uint64 SpraggleGUID; - - void Reset() - { - FaintTimer = urand(30000, 60000); - EndEventProgress = 0; - EndEventTimer = 1000; - SpraggleGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - FollowerAI::MoveInLineOfSight(who); - - if (!me->getVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_SPRAGGLE) - { - if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) - { - if (Player* player = GetLeaderForFollower()) - { - if (player->GetQuestStatus(QUEST_A_LITTLE_HELP) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_A_LITTLE_HELP, me); - } - - SpraggleGUID = who->GetGUID(); - SetFollowComplete(true); - } - } - } - - void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell) - { - if (HasFollowState(STATE_FOLLOW_INPROGRESS | STATE_FOLLOW_PAUSED) && pSpell->Id == SPELL_REVIVE_RINGO) - ClearFaint(); - } - - void SetFaint() - { - if (!HasFollowState(STATE_FOLLOW_POSTEVENT)) - { - SetFollowPaused(true); - - DoScriptText(RAND(SAY_FAINT_1, SAY_FAINT_2, SAY_FAINT_3, SAY_FAINT_4), me); - } - - //what does actually happen here? Emote? Aura? - me->SetStandState(UNIT_STAND_STATE_SLEEP); - } - - void ClearFaint() - { - me->SetStandState(UNIT_STAND_STATE_STAND); - - if (HasFollowState(STATE_FOLLOW_POSTEVENT)) - return; - - DoScriptText(RAND(SAY_WAKE_1, SAY_WAKE_2, SAY_WAKE_3, SAY_WAKE_4), me); - - SetFollowPaused(false); - } - - void UpdateFollowerAI(const uint32 Diff) - { - if (!UpdateVictim()) - { - if (HasFollowState(STATE_FOLLOW_POSTEVENT)) - { - if (EndEventTimer <= Diff) - { - Unit* pSpraggle = Unit::GetUnit(*me, SpraggleGUID); - if (!pSpraggle || !pSpraggle->isAlive()) - { - SetFollowComplete(); - return; - } - - switch (EndEventProgress) - { - case 1: - DoScriptText(SAY_RIN_END_1, me); - EndEventTimer = 3000; - break; - case 2: - DoScriptText(SAY_SPR_END_2, pSpraggle); - EndEventTimer = 5000; - break; - case 3: - DoScriptText(SAY_RIN_END_3, me); - EndEventTimer = 1000; - break; - case 4: - DoScriptText(EMOTE_RIN_END_4, me); - SetFaint(); - EndEventTimer = 9000; - break; - case 5: - DoScriptText(EMOTE_RIN_END_5, me); - ClearFaint(); - EndEventTimer = 1000; - break; - case 6: - DoScriptText(SAY_RIN_END_6, me); - EndEventTimer = 3000; - break; - case 7: - DoScriptText(SAY_SPR_END_7, pSpraggle); - EndEventTimer = 10000; - break; - case 8: - DoScriptText(EMOTE_RIN_END_8, me); - EndEventTimer = 5000; - break; - case 9: - SetFollowComplete(); - break; - } - - ++EndEventProgress; - } - else - EndEventTimer -= Diff; - } - else if (HasFollowState(STATE_FOLLOW_INPROGRESS) && !HasFollowState(STATE_FOLLOW_PAUSED)) - { - if (FaintTimer <= Diff) - { - SetFaint(); - FaintTimer = urand(60000, 120000); - } - else - FaintTimer -= Diff; - } - - return; - } - - DoMeleeAttackIfReady(); - } - }; -}; - void AddSC_ungoro_crater() { - new npc_ame(); - new npc_ringo(); } -- cgit v1.2.3 From 7d75c2818df5545e1633d20403be1c640fcde410 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 12 Aug 2012 12:18:02 -0500 Subject: Scripts/Quests: Removed some deprecated scripts and fixed quest 26050 --- sql/updates/world/2012_08_17_00_world_misc_434.sql | 38 +++++ src/server/game/Scripting/ScriptLoader.cpp | 2 - src/server/scripts/EasternKingdoms/CMakeLists.txt | 1 - .../scripts/EasternKingdoms/arathi_highlands.cpp | 63 +++++--- src/server/scripts/EasternKingdoms/boss_kruul.cpp | 160 --------------------- .../scripts/EasternKingdoms/burning_steppes.cpp | 128 +---------------- 6 files changed, 82 insertions(+), 310 deletions(-) create mode 100644 sql/updates/world/2012_08_17_00_world_misc_434.sql delete mode 100644 src/server/scripts/EasternKingdoms/boss_kruul.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_17_00_world_misc_434.sql b/sql/updates/world/2012_08_17_00_world_misc_434.sql new file mode 100644 index 00000000000..aa6c11ee1f8 --- /dev/null +++ b/sql/updates/world/2012_08_17_00_world_misc_434.sql @@ -0,0 +1,38 @@ +DELETE FROM `creature_text` WHERE `entry`=2768; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(2768,0,0,'Ok, $N. Follow me to the cave where I''ll attempt to harness the power of the rune stone into these goggles.',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_1'), +(2768,1,0,'I discovered this cave on our first day here. I believe the energy in the stone can be used to our advantage.',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_2'), +(2768,2,0,'I''ll begin drawing energy from the stone. Your job, $N, is to defend me. This place is cursed... trust me.',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_3'), +(2768,3,0,'%s begins tinkering with the goggles before the stone.',16,0,100,0,0,0,'Professor Phizzlethorpe - EMOTE_PROGRESS_4'), +(2768,4,0,'Help!!! Get these things off me so I can get my work done!',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_AGGRO'), +(2768,5,0,'Almost done! Just a little longer!',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_5'), +(2768,6,0,'I''ve done it! I have harnessed the power of the stone into the goggles! Let''s get out of here!',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_6'), +(2768,7,0,'Phew! Glad to be back from that creepy cave.',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_7'), +(2768,8,0,'%s hands one glowing goggles over to Doctor Draxlegauge.',16,0,100,0,0,0,'Professor Phizzlethorpe - EMOTE_PROGRESS_8'), +(2768,9,0,'Doctor Draxlegauge will give you further instructions, $N. Many thanks for your help!',12,0,100,0,0,0,'Professor Phizzlethorpe - SAY_PROGRESS_9'); + +DELETE FROM `script_waypoint` WHERE `entry`=2768; +INSERT INTO `script_waypoint` (`entry`, `pointid`, `location_x`, `location_y`, `location_z`, `waittime`, `point_comment`) VALUES +(2768,1,-2072.32,-2089.59,9.14603,0,''), +(2768,2,-2078.18,-2096.31,10.8916,0,''), +(2768,3,-2079.21,-2105.22,13.3174,0,''), +(2768,4,-2074.81,-2108.72,14.1485,0,''), +(2768,5,-2076,-2116.21,16.3934,0,''), +(2768,6,-2073.31,-2123.92,18.6202,4000,''), +(2768,7,-2064.41,-2133.33,21.5776,0,''), +(2768,8,-2044.08,-2153.12,20.121,18000,''), +(2768,9,-2044.08,-2153.12,20.121,3000,''), +(2768,10,-2044.08,-2153.12,20.121,0,''), +(2768,11,-2044.08,-2153.12,20.121,14000,''), +(2768,12,-2063.89,-2133.33,21.5648,0,''), +(2768,13,-2075,-2121.98,17.8443,0,''), +(2768,14,-2074.83,-2108.53,14.1036,0,''), +(2768,15,-2079.59,-2091.61,9.80862,0,''), +(2768,16,-2071.29,-2086.44,8.5181,0,''), +(2768,17,-2066.46,-2085.97,8.9241,7000,''); + +DELETE FROM `creature_questrelation` WHERE `id`=2768 AND `quest`=26050; +INSERT INTO `creature_questrelation` (`id`, `quest`) +VALUES (2768, 26050); + +UPDATE `creature_template` SET `ScriptName`='npc_professor_phizzlethorpe' WHERE `entry`=2768; \ No newline at end of file diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 128d28a9954..2db840bf39a 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -245,7 +245,6 @@ void AddSC_instance_zulgurub(); //void AddSC_alterac_mountains(); void AddSC_arathi_highlands(); void AddSC_blasted_lands(); -void AddSC_boss_kruul(); void AddSC_burning_steppes(); void AddSC_duskwood(); void AddSC_eastern_plaguelands(); @@ -865,7 +864,6 @@ void AddEasternKingdomsScripts() //AddSC_alterac_mountains(); AddSC_arathi_highlands(); AddSC_blasted_lands(); - AddSC_boss_kruul(); AddSC_burning_steppes(); AddSC_duskwood(); AddSC_eastern_plaguelands(); diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 5dc3b52dec1..de3e6ae32a6 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -32,7 +32,6 @@ set(scripts_STAT_SRCS EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp EasternKingdoms/isle_of_queldanas.cpp - EasternKingdoms/boss_kruul.cpp EasternKingdoms/ZulGurub/boss_hakkar.cpp EasternKingdoms/ZulGurub/boss_mandokir.cpp EasternKingdoms/ZulGurub/boss_marli.cpp diff --git a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp index b0d59fe8b5a..9db03971756 100644 --- a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp @@ -47,8 +47,12 @@ enum eEnums SAY_PROGRESS_7 = 7, EMOTE_PROGRESS_8 = 8, SAY_PROGRESS_9 = 9, + + EVENT_SAY_3 = 1, + EVENT_SAY_6 = 2, + EVENT_SAY_8 = 3, - QUEST_SUNKEN_TREASURE = 665, + QUEST_GOGGLE_BOGGLE = 26050, MOB_VENGEFUL_SURGE = 2776 }; @@ -73,33 +77,22 @@ class npc_professor_phizzlethorpe : public CreatureScript switch (waypointId) { - case 4: + case 6: Talk(SAY_PROGRESS_2, player->GetGUID()); - break; - case 5: - Talk(SAY_PROGRESS_3, player->GetGUID()); + events.ScheduleEvent(EVENT_SAY_3, 3000); break; case 8: Talk(EMOTE_PROGRESS_4); - break; - case 9: - me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - break; - case 10: - Talk(SAY_PROGRESS_5, player->GetGUID()); + me->SummonCreature(MOB_VENGEFUL_SURGE, -2065.505f, -2136.88f, 22.20362f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); + me->SummonCreature(MOB_VENGEFUL_SURGE, -2059.249f, -2134.88f, 21.51582f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); break; case 11: - Talk(SAY_PROGRESS_6, player->GetGUID()); - SetRun(); + Talk(SAY_PROGRESS_5, player->GetGUID()); + events.ScheduleEvent(EVENT_SAY_6, 11000); break; - case 19: + case 17: Talk(SAY_PROGRESS_7, player->GetGUID()); - break; - case 20: - Talk(EMOTE_PROGRESS_8); - Talk(SAY_PROGRESS_9, player->GetGUID()); - player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); + events.ScheduleEvent(EVENT_SAY_8, 6000); break; } } @@ -116,8 +109,34 @@ class npc_professor_phizzlethorpe : public CreatureScript void UpdateAI(const uint32 diff) { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + events.Update(diff); + + while (uint32 event = events.ExecuteEvent()) + { + switch (event) + { + case EVENT_SAY_3: + Talk(SAY_PROGRESS_3, player->GetGUID()); + break; + case EVENT_SAY_6: + Talk(SAY_PROGRESS_6, player->GetGUID()); + SetRun(); + break; + case EVENT_SAY_8: + Talk(EMOTE_PROGRESS_8); + Talk(SAY_PROGRESS_9, player->GetGUID()); + player->GroupEventHappens(QUEST_GOGGLE_BOGGLE, me); + break; + } + } npc_escortAI::UpdateAI(diff); } + + EventMap events; }; CreatureAI* GetAI(Creature* creature) const @@ -127,13 +146,13 @@ class npc_professor_phizzlethorpe : public CreatureScript bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) { - if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) + if (quest->GetQuestId() == QUEST_GOGGLE_BOGGLE) { creature->AI()->Talk(SAY_PROGRESS_1, player->GetGUID()); if (npc_escortAI* pEscortAI = CAST_AI(npc_professor_phizzlethorpeAI, (creature->AI()))) pEscortAI->Start(false, false, player->GetGUID(), quest); - creature->setFaction(113); + creature->setFaction(42); } return true; } diff --git a/src/server/scripts/EasternKingdoms/boss_kruul.cpp b/src/server/scripts/EasternKingdoms/boss_kruul.cpp deleted file mode 100644 index 6a1ba633660..00000000000 --- a/src/server/scripts/EasternKingdoms/boss_kruul.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Kruul -SD%Complete: 100 -SDComment: Highlord Kruul are presumably no longer in-game on regular bases, however future events could bring him back. -SDCategory: Bosses -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" - -#define SPELL_SHADOWVOLLEY 21341 -#define SPELL_CLEAVE 20677 -#define SPELL_THUNDERCLAP 23931 -#define SPELL_TWISTEDREFLECTION 21063 -#define SPELL_VOIDBOLT 21066 -#define SPELL_RAGE 21340 -#define SPELL_CAPTURESOUL 21054 - -class boss_kruul : public CreatureScript -{ -public: - boss_kruul() : CreatureScript("boss_kruul") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_kruulAI (creature); - } - - struct boss_kruulAI : public ScriptedAI - { - boss_kruulAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 ShadowVolley_Timer; - uint32 Cleave_Timer; - uint32 ThunderClap_Timer; - uint32 TwistedReflection_Timer; - uint32 VoidBolt_Timer; - uint32 Rage_Timer; - uint32 Hound_Timer; - - void Reset() - { - ShadowVolley_Timer = 10000; - Cleave_Timer = 14000; - ThunderClap_Timer = 20000; - TwistedReflection_Timer = 25000; - VoidBolt_Timer = 30000; - Rage_Timer = 60000; //Cast rage after 1 minute - Hound_Timer = 8000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void KilledUnit(Unit* /*victim*/) - { - // When a player, pet or totem gets killed, Lord Kazzak casts this spell to instantly regenerate 70, 000 health. - DoCast(me, SPELL_CAPTURESOUL); - } - - void SummonHounds(Unit* victim) - { - if (Creature* Hound = DoSpawnCreature(19207, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) - Hound->AI()->AttackStart(victim); - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //ShadowVolley_Timer - if (ShadowVolley_Timer <= diff) - { - if (urand(0, 99) < 45) - DoCast(me->getVictim(), SPELL_SHADOWVOLLEY); - - ShadowVolley_Timer = 5000; - } else ShadowVolley_Timer -= diff; - - //Cleave_Timer - if (Cleave_Timer <= diff) - { - if (urand(0, 1)) - DoCast(me->getVictim(), SPELL_CLEAVE); - - Cleave_Timer = 10000; - } else Cleave_Timer -= diff; - - //ThunderClap_Timer - if (ThunderClap_Timer <= diff) - { - if (urand(0, 9) < 2) - DoCast(me->getVictim(), SPELL_THUNDERCLAP); - - ThunderClap_Timer = 12000; - } else ThunderClap_Timer -= diff; - - //TwistedReflection_Timer - if (TwistedReflection_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_TWISTEDREFLECTION); - TwistedReflection_Timer = 30000; - } else TwistedReflection_Timer -= diff; - - //VoidBolt_Timer - if (VoidBolt_Timer <= diff) - { - if (urand(0, 9) < 4) - DoCast(me->getVictim(), SPELL_VOIDBOLT); - - VoidBolt_Timer = 18000; - } else VoidBolt_Timer -= diff; - - //Rage_Timer - if (Rage_Timer <= diff) - { - DoCast(me, SPELL_RAGE); - Rage_Timer = 70000; - } else Rage_Timer -= diff; - - //Hound_Timer - if (Hound_Timer <= diff) - { - SummonHounds(me->getVictim()); - SummonHounds(me->getVictim()); - SummonHounds(me->getVictim()); - - Hound_Timer = 45000; - } else Hound_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; -}; - -void AddSC_boss_kruul() -{ - new boss_kruul(); -} diff --git a/src/server/scripts/EasternKingdoms/burning_steppes.cpp b/src/server/scripts/EasternKingdoms/burning_steppes.cpp index eec747d6d73..3f8e86753dd 100644 --- a/src/server/scripts/EasternKingdoms/burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/burning_steppes.cpp @@ -18,140 +18,18 @@ /* ScriptData SDName: Burning_Steppes -SD%Complete: 100 -SDComment: Quest support: 4224, 4866 +SD%Complete: 0 +SDComment: SDCategory: Burning Steppes EndScriptData */ -/* ContentData -npc_ragged_john -EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -/*###### -## npc_ragged_john -######*/ - -#define GOSSIP_HELLO "Official buisness, John. I need some information about Marsha Windsor. Tell me about the last time you saw him." -#define GOSSIP_SELECT1 "So what did you do?" -#define GOSSIP_SELECT2 "Start making sense, dwarf. I don't want to have anything to do with your cracker, your pappy, or any sort of 'discreditin'." -#define GOSSIP_SELECT3 "Ironfoe?" -#define GOSSIP_SELECT4 "Interesting... continue John." -#define GOSSIP_SELECT5 "So that's how Windsor died..." -#define GOSSIP_SELECT6 "So how did he die?" -#define GOSSIP_SELECT7 "Ok so where the hell is he? Wait a minute! Are you drunk?" -#define GOSSIP_SELECT8 "WHY is he in Blackrock Depths?" -#define GOSSIP_SELECT9 "300? So the Dark Irons killed him and dragged him into the Depths?" -#define GOSSIP_SELECT10 "Ahh... Ironfoe" -#define GOSSIP_SELECT11 "Thanks, Ragged John. Your story was very uplifting and informative" - -class npc_ragged_john : public CreatureScript -{ -public: - npc_ragged_john() : CreatureScript("npc_ragged_john") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2714, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2715, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2716, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(2717, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - player->SEND_GOSSIP_MENU(2718, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - player->SEND_GOSSIP_MENU(2719, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - player->SEND_GOSSIP_MENU(2720, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - player->SEND_GOSSIP_MENU(2721, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+8: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - player->SEND_GOSSIP_MENU(2722, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+9: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - player->SEND_GOSSIP_MENU(2723, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+10: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - player->SEND_GOSSIP_MENU(2725, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+11: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(4224); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(4224) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(2713, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_ragged_johnAI (creature); - } - - struct npc_ragged_johnAI : public ScriptedAI - { - npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) {} - - void Reset() {} - - void MoveInLineOfSight(Unit* who) - { - if (who->HasAura(16468)) - { - if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me)) - { - DoCast(who, 16472); - CAST_PLR(who)->AreaExploredOrEventHappens(4866); - } - } - - ScriptedAI::MoveInLineOfSight(who); - } - - void EnterCombat(Unit* /*who*/) {} - }; -}; void AddSC_burning_steppes() { - new npc_ragged_john(); + } -- cgit v1.2.3 From 75af5ac3535e8726a03f9575357f44f3981989a0 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 12 Aug 2012 13:14:54 -0500 Subject: Scripts/Quests: Removed more deprecated quest scripts in Eastern Kingdoms --- src/server/scripts/EasternKingdoms/ghostlands.cpp | 40 +- src/server/scripts/EasternKingdoms/hinterlands.cpp | 201 +------ src/server/scripts/EasternKingdoms/ironforge.cpp | 67 +-- src/server/scripts/EasternKingdoms/loch_modan.cpp | 74 +-- .../scripts/EasternKingdoms/redridge_mountains.cpp | 146 +---- .../scripts/EasternKingdoms/silverpine_forest.cpp | 189 +------ .../scripts/EasternKingdoms/stormwind_city.cpp | 613 +-------------------- .../scripts/EasternKingdoms/swamp_of_sorrows.cpp | 130 ----- .../scripts/EasternKingdoms/tirisfal_glades.cpp | 185 +------ 9 files changed, 13 insertions(+), 1632 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ghostlands.cpp b/src/server/scripts/EasternKingdoms/ghostlands.cpp index 9793c6fd31c..dcc938f35fe 100644 --- a/src/server/scripts/EasternKingdoms/ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/ghostlands.cpp @@ -19,13 +19,11 @@ /* ScriptData SDName: Ghostlands SD%Complete: 100 -SDComment: Quest support: 9692, 9212. Obtain Budd's Guise of Zul'aman. Vendor Rathis Tomber +SDComment: SDCategory: Ghostlands EndScriptData */ /* ContentData -npc_blood_knight_dawnstar -npc_budd_nedreck npc_rathis_tomber npc_ranger_lilatha EndContentData */ @@ -35,41 +33,6 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -/*###### -## npc_budd_nedreck -######*/ - -#define GOSSIP_HBN "You gave the crew disguises?" - -class npc_budd_nedreck : public CreatureScript -{ -public: - npc_budd_nedreck() : CreatureScript("npc_budd_nedreck") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, 42540, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(11166) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } -}; - /*###### ## npc_rathis_tomber ######*/ @@ -218,7 +181,6 @@ public: void AddSC_ghostlands() { - new npc_budd_nedreck(); new npc_rathis_tomber(); new npc_ranger_lilatha(); } diff --git a/src/server/scripts/EasternKingdoms/hinterlands.cpp b/src/server/scripts/EasternKingdoms/hinterlands.cpp index a6d01f0ca93..096c0f2e2a6 100644 --- a/src/server/scripts/EasternKingdoms/hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/hinterlands.cpp @@ -19,13 +19,12 @@ /* ScriptData SDName: Hinterlands SD%Complete: 100 -SDComment: Quest support: 863, 2742 +SDComment: Quest support: 836 SDCategory: The Hinterlands EndScriptData */ /* ContentData npc_00x09hl -npc_rinji EndContentData */ #include "ScriptMgr.h" @@ -149,205 +148,7 @@ public: }; }; -/*###### -## npc_rinji -######*/ - -enum eRinji -{ - SAY_RIN_FREE = -1000403, //from here - SAY_RIN_BY_OUTRUNNER = -1000404, - SAY_RIN_HELP_1 = -1000405, - SAY_RIN_HELP_2 = -1000406, //to here, are used also by 6182 but this is wrong... - SAY_RIN_COMPLETE = -1000407, - SAY_RIN_PROGRESS_1 = -1000408, - SAY_RIN_PROGRESS_2 = -1000409, - - QUEST_RINJI_TRAPPED = 2742, - NPC_RANGER = 2694, - NPC_OUTRUNNER = 2691, - GO_RINJI_CAGE = 142036 -}; - -struct Location -{ - float m_fX, m_fY, m_fZ; -}; - -Location m_afAmbushSpawn[] = -{ - {191.296204f, -2839.329346f, 107.388f}, - {70.972466f, -2848.674805f, 109.459f} -}; - -Location m_afAmbushMoveTo[] = -{ - {166.630386f, -2824.780273f, 108.153f}, - {70.886589f, -2874.335449f, 116.675f} -}; - -class npc_rinji : public CreatureScript -{ -public: - npc_rinji() : CreatureScript("npc_rinji") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_RINJI_TRAPPED) - { - if (GameObject* go = creature->FindNearestGameObject(GO_RINJI_CAGE, INTERACTION_DISTANCE)) - go->UseDoorOrButton(); - - if (npc_rinjiAI* pEscortAI = CAST_AI(npc_rinji::npc_rinjiAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_rinjiAI(creature); - } - - struct npc_rinjiAI : public npc_escortAI - { - npc_rinjiAI(Creature* creature) : npc_escortAI(creature) - { - m_bIsByOutrunner = false; - m_iSpawnId = 0; - } - - bool m_bIsByOutrunner; - uint32 m_uiPostEventCount; - uint32 m_uiPostEventTimer; - int m_iSpawnId; - - void Reset() - { - m_uiPostEventCount = 0; - m_uiPostEventTimer = 3000; - } - - void JustRespawned() - { - m_bIsByOutrunner = false; - m_iSpawnId = 0; - - npc_escortAI::JustRespawned(); - } - - void EnterCombat(Unit* who) - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - { - if (who->GetEntry() == NPC_OUTRUNNER && !m_bIsByOutrunner) - { - DoScriptText(SAY_RIN_BY_OUTRUNNER, who); - m_bIsByOutrunner = true; - } - - if (rand()%4) - return; - - //only if attacked and escorter is not in combat? - DoScriptText(RAND(SAY_RIN_HELP_1, SAY_RIN_HELP_2), me); - } - } - - void DoSpawnAmbush(bool bFirst) - { - if (!bFirst) - m_iSpawnId = 1; - - me->SummonCreature(NPC_RANGER, - m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f, - TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); - - for (int i = 0; i < 2; ++i) - { - me->SummonCreature(NPC_OUTRUNNER, - m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f, - TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); - } - } - - void JustSummoned(Creature* summoned) - { - summoned->SetWalk(false); - summoned->GetMotionMaster()->MovePoint(0, m_afAmbushMoveTo[m_iSpawnId].m_fX, m_afAmbushMoveTo[m_iSpawnId].m_fY, m_afAmbushMoveTo[m_iSpawnId].m_fZ); - } - - void WaypointReached(uint32 waypointId) - { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (waypointId) - { - case 1: - DoScriptText(SAY_RIN_FREE, me, player); - break; - case 7: - DoSpawnAmbush(true); - break; - case 13: - DoSpawnAmbush(false); - break; - case 17: - DoScriptText(SAY_RIN_COMPLETE, me, player); - player->GroupEventHappens(QUEST_RINJI_TRAPPED, me); - SetRun(); - m_uiPostEventCount = 1; - break; - } - } - - void UpdateEscortAI(const uint32 uiDiff) - { - //Check if we have a current target - if (!UpdateVictim()) - { - if (HasEscortState(STATE_ESCORT_ESCORTING) && m_uiPostEventCount) - { - if (m_uiPostEventTimer <= uiDiff) - { - m_uiPostEventTimer = 3000; - - if (Player* player = GetPlayerForEscort()) - { - switch (m_uiPostEventCount) - { - case 1: - DoScriptText(SAY_RIN_PROGRESS_1, me, player); - ++m_uiPostEventCount; - break; - case 2: - DoScriptText(SAY_RIN_PROGRESS_2, me, player); - m_uiPostEventCount = 0; - break; - } - } - else - { - me->DespawnOrUnsummon(); - return; - } - } - else - m_uiPostEventTimer -= uiDiff; - } - - return; - } - - DoMeleeAttackIfReady(); - } - }; -}; - void AddSC_hinterlands() { new npc_00x09hl(); - new npc_rinji(); } diff --git a/src/server/scripts/EasternKingdoms/ironforge.cpp b/src/server/scripts/EasternKingdoms/ironforge.cpp index 2915ee1f3cb..98a4d780058 100644 --- a/src/server/scripts/EasternKingdoms/ironforge.cpp +++ b/src/server/scripts/EasternKingdoms/ironforge.cpp @@ -18,81 +18,18 @@ /* ScriptData SDName: Ironforge -SD%Complete: 100 -SDComment: Quest support: 3702 +SD%Complete: 0 +SDComment: SDCategory: Ironforge EndScriptData */ /* ContentData -npc_royal_historian_archesonus EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -/*###### -## npc_royal_historian_archesonus -######*/ - -#define GOSSIP_ITEM_ROYAL "I am ready to listen" -#define GOSSIP_ITEM_ROYAL_1 "That is tragic. How did this happen?" -#define GOSSIP_ITEM_ROYAL_2 "Interesting, continue please." -#define GOSSIP_ITEM_ROYAL_3 "Unbelievable! How dare they??" -#define GOSSIP_ITEM_ROYAL_4 "Of course I will help!" - -class npc_royal_historian_archesonus : public CreatureScript -{ -public: - npc_royal_historian_archesonus() : CreatureScript("npc_royal_historian_archesonus") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2236, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2237, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2238, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(2239, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(3702); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(3702) == QUEST_STATUS_INCOMPLETE) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - player->SEND_GOSSIP_MENU(2235, creature->GetGUID()); - } - else - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - void AddSC_ironforge() { - new npc_royal_historian_archesonus(); } diff --git a/src/server/scripts/EasternKingdoms/loch_modan.cpp b/src/server/scripts/EasternKingdoms/loch_modan.cpp index 4e3aaae71a1..32862a2d7b0 100644 --- a/src/server/scripts/EasternKingdoms/loch_modan.cpp +++ b/src/server/scripts/EasternKingdoms/loch_modan.cpp @@ -18,88 +18,18 @@ /* ScriptData SDName: Loch_Modan -SD%Complete: 100 -SDComment: Quest support: 3181 +SD%Complete: 0 +SDComment: SDCategory: Loch Modan EndScriptData */ /* ContentData -npc_mountaineer_pebblebitty EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -/*###### -## npc_mountaineer_pebblebitty -######*/ - -#define GOSSIP_MP "Open the gate please, i need to get to Searing Gorge" - -#define GOSSIP_MP1 "But i need to get there, now open the gate!" -#define GOSSIP_MP2 "Ok, so what is this other way?" -#define GOSSIP_MP3 "Doesn't matter, i'm invulnerable." -#define GOSSIP_MP4 "Yes..." -#define GOSSIP_MP5 "Ok, i'll try to remember that." -#define GOSSIP_MP6 "A key? Ok!" - -class npc_mountaineer_pebblebitty : public CreatureScript -{ -public: - npc_mountaineer_pebblebitty() : CreatureScript("npc_mountaineer_pebblebitty") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(1833, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(1834, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(1835, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - player->SEND_GOSSIP_MENU(1836, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - player->SEND_GOSSIP_MENU(1837, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - player->SEND_GOSSIP_MENU(1838, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - player->CLOSE_GOSSIP_MENU(); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (!player->GetQuestRewardStatus(3181) == 1) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - void AddSC_loch_modan() { - new npc_mountaineer_pebblebitty(); } diff --git a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp index 2473fec899a..81223dad1d3 100644 --- a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp @@ -17,156 +17,14 @@ /* Script Data Start SDName: Redridge Mountains -SD%Complete: 100% -SDComment: Support for quest 219. +SD%Complete: 0 +SDComment: Script Data End */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" -enum eCorporalKeeshan -{ - QUEST_MISSING_IN_ACTION = 219, - - SAY_CORPORAL_1 = -1000464, - SAY_CORPORAL_2 = -1000465, - SAY_CORPORAL_3 = -1000466, - SAY_CORPORAL_4 = -1000467, - SAY_CORPORAL_5 = -1000468, - - SPELL_MOCKING_BLOW = 21008, - SPELL_SHIELD_BASH = 11972, -}; - -class npc_corporal_keeshan : public CreatureScript -{ -public: - npc_corporal_keeshan() : CreatureScript("npc_corporal_keeshan") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION) - { - CAST_AI(npc_corporal_keeshan::npc_corporal_keeshanAI, creature->AI())->Start(true, false, player->GetGUID(), quest); - DoScriptText(SAY_CORPORAL_1, creature); - } - - return false; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_corporal_keeshanAI(creature); - } - - struct npc_corporal_keeshanAI : public npc_escortAI - { - npc_corporal_keeshanAI(Creature* creature) : npc_escortAI(creature) {} - - uint32 uiPhase; - uint32 uiTimer; - uint32 uiMockingBlowTimer; - uint32 uiShieldBashTimer; - - void Reset() - { - uiTimer = 0; - uiPhase = 0; - uiMockingBlowTimer = 5000; - uiShieldBashTimer = 8000; - } - - void WaypointReached(uint32 waypointId) - { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - if (waypointId >= 65 && me->GetUnitMovementFlags() == MOVEMENTFLAG_WALKING) - me->SetWalk(false); - - switch (waypointId) - { - case 39: - SetEscortPaused(true); - uiTimer = 2000; - uiPhase = 1; - break; - case 65: - me->SetWalk(false); - break; - case 115: - player->AreaExploredOrEventHappens(QUEST_MISSING_IN_ACTION); - uiTimer = 2000; - uiPhase = 4; - break; - } - } - - void UpdateAI(const uint32 uiDiff) - { - if (HasEscortState(STATE_ESCORT_NONE)) - return; - - npc_escortAI::UpdateAI(uiDiff); - - if (uiPhase) - { - if (uiTimer <= uiDiff) - { - switch (uiPhase) - { - case 1: - me->SetStandState(UNIT_STAND_STATE_SIT); - uiTimer = 1000; - uiPhase = 2; - break; - case 2: - DoScriptText(SAY_CORPORAL_2, me); - uiTimer = 15000; - uiPhase = 3; - break; - case 3: - DoScriptText(SAY_CORPORAL_3, me); - me->SetStandState(UNIT_STAND_STATE_STAND); - SetEscortPaused(false); - uiTimer = 0; - uiPhase = 0; - break; - case 4: - DoScriptText(SAY_CORPORAL_4, me); - uiTimer = 2500; - uiPhase = 5; - case 5: - DoScriptText(SAY_CORPORAL_5, me); - uiTimer = 0; - uiPhase = 0; - } - } else uiTimer -= uiDiff; - } - - if (!UpdateVictim()) - return; - - if (uiMockingBlowTimer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_MOCKING_BLOW); - uiMockingBlowTimer = 5000; - } else uiMockingBlowTimer -= uiDiff; - - if (uiShieldBashTimer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_MOCKING_BLOW); - uiShieldBashTimer = 8000; - } else uiShieldBashTimer -= uiDiff; - - DoMeleeAttackIfReady(); - } - }; -}; - void AddSC_redridge_mountains() { - new npc_corporal_keeshan(); } diff --git a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/silverpine_forest.cpp index 870cb29c28d..8f5925405ec 100644 --- a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/silverpine_forest.cpp @@ -19,13 +19,12 @@ /* ScriptData SDName: Silverpine_Forest SD%Complete: 100 -SDComment: Quest support: 435, 452 +SDComment: Quest support: 435 SDCategory: Silverpine Forest EndScriptData */ /* ContentData npc_deathstalker_erland -pyrewood_ambush EndContentData */ #include "ScriptMgr.h" @@ -135,191 +134,6 @@ public: } }; -/*###### -## pyrewood_ambush -#######*/ - -#define QUEST_PYREWOOD_AMBUSH 452 - -#define NPCSAY_INIT "Get ready, they'll be arriving any minute..." //not blizzlike -#define NPCSAY_END "Thanks for your help!" //not blizzlike - -static float PyrewoodSpawnPoints[3][4] = -{ - //pos_x pos_y pos_z orien - //outside - /* - {-400.85f, 1513.64f, 18.67f, 0}, - {-397.32f, 1514.12f, 18.67f, 0}, - {-397.44f, 1511.09f, 18.67f, 0}, - */ - //door - {-396.17f, 1505.86f, 19.77f, 0}, - {-396.91f, 1505.77f, 19.77f, 0}, - {-397.94f, 1504.74f, 19.77f, 0}, -}; - -#define WAIT_SECS 6000 - -class pyrewood_ambush : public CreatureScript -{ -public: - pyrewood_ambush() : CreatureScript("pyrewood_ambush") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) - { - if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) - { - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true; - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0; - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0; - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID(); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new pyrewood_ambushAI (creature); - } - - struct pyrewood_ambushAI : public ScriptedAI - { - pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me) - { - QuestInProgress = false; - } - - uint32 Phase; - int8 KillCount; - uint32 WaitTimer; - uint64 PlayerGUID; - SummonList Summons; - - bool QuestInProgress; - - void Reset() - { - WaitTimer = WAIT_SECS; - - if (!QuestInProgress) //fix reset values (see UpdateVictim) - { - Phase = 0; - KillCount = 0; - PlayerGUID = 0; - Summons.DespawnAll(); - } - } - - void EnterCombat(Unit* /*who*/){} - - void JustSummoned(Creature* summoned) - { - Summons.Summon(summoned); - ++KillCount; - } - - void SummonedCreatureDespawn(Creature* summoned) - { - Summons.Despawn(summoned); - --KillCount; - } - - void SummonCreatureWithRandomTarget(uint32 creatureId, int position) - { - if (Creature* summoned = me->SummonCreature(creatureId, PyrewoodSpawnPoints[position][0], PyrewoodSpawnPoints[position][1], PyrewoodSpawnPoints[position][2], PyrewoodSpawnPoints[position][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000)) - { - Player* player = NULL; - Unit* target = NULL; - if (PlayerGUID) - { - player = Unit::GetPlayer(*me, PlayerGUID); - if (player) - target = RAND((Unit*)me, (Unit*)player); - } else - target = me; - - if (target) - { - summoned->setFaction(168); - summoned->AddThreat(target, 32.0f); - summoned->AI()->AttackStart(target); - } - } - } - - void JustDied(Unit* /*killer*/) - { - if (PlayerGUID) - if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) - if (player->GetQuestStatus(QUEST_PYREWOOD_AMBUSH) == QUEST_STATUS_INCOMPLETE) - player->FailQuest(QUEST_PYREWOOD_AMBUSH); - } - - void UpdateAI(const uint32 diff) - { - //sLog->outInfo(LOG_FILTER_TSCR, "DEBUG: p(%i) k(%i) d(%u) W(%i)", Phase, KillCount, diff, WaitTimer); - - if (!QuestInProgress) - return; - - if (KillCount && Phase < 6) - { - if (!UpdateVictim()) //reset() on target Despawn... - return; - - DoMeleeAttackIfReady(); - return; - } - - switch (Phase) - { - case 0: - if (WaitTimer == WAIT_SECS) - me->MonsterSay(NPCSAY_INIT, LANG_UNIVERSAL, 0); //no blizzlike - - if (WaitTimer <= diff) - { - WaitTimer -= diff; - return; - } - break; - case 1: - SummonCreatureWithRandomTarget(2060, 1); - break; - case 2: - SummonCreatureWithRandomTarget(2061, 2); - SummonCreatureWithRandomTarget(2062, 0); - break; - case 3: - SummonCreatureWithRandomTarget(2063, 1); - SummonCreatureWithRandomTarget(2064, 2); - SummonCreatureWithRandomTarget(2065, 0); - break; - case 4: - SummonCreatureWithRandomTarget(2066, 1); - SummonCreatureWithRandomTarget(2067, 0); - SummonCreatureWithRandomTarget(2068, 2); - break; - case 5: //end - if (PlayerGUID) - { - if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) - { - me->MonsterSay(NPCSAY_END, LANG_UNIVERSAL, 0); //not blizzlike - player->GroupEventHappens(QUEST_PYREWOOD_AMBUSH, me); - } - } - QuestInProgress = false; - Reset(); - break; - } - ++Phase; //prepare next phase - } - }; -}; - /*###### ## AddSC ######*/ @@ -327,5 +141,4 @@ public: void AddSC_silverpine_forest() { new npc_deathstalker_erland(); - new pyrewood_ambush(); } diff --git a/src/server/scripts/EasternKingdoms/stormwind_city.cpp b/src/server/scripts/EasternKingdoms/stormwind_city.cpp index 560214d4085..f5ade53202a 100644 --- a/src/server/scripts/EasternKingdoms/stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/stormwind_city.cpp @@ -18,19 +18,12 @@ /* ScriptData SDName: Stormwind_City -SD%Complete: 100 -SDComment: Quest support: 1640, 1447, 4185, 11223, 434. +SD%Complete: 0 +SDComment: SDCategory: Stormwind City EndScriptData */ /* ContentData -npc_archmage_malin -npc_bartleby -npc_lady_katrana_prestor -npc_tyrion -npc_tyrion_spybot -npc_marzon_silent_blade -npc_lord_gregor_lescovar EndContentData */ #include "ScriptMgr.h" @@ -38,609 +31,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -/*###### -## npc_archmage_malin -######*/ - -#define GOSSIP_ITEM_MALIN "Can you send me to Theramore? I have an urgent message for Lady Jaina from Highlord Bolvar." - -class npc_archmage_malin : public CreatureScript -{ -public: - npc_archmage_malin() : CreatureScript("npc_archmage_malin") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, 42711, true); - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(11223) == QUEST_STATUS_COMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MALIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - -/*###### -## npc_bartleby -######*/ - -enum eBartleby -{ - FACTION_ENEMY = 168, - QUEST_BEAT = 1640 -}; - -class npc_bartleby : public CreatureScript -{ -public: - npc_bartleby() : CreatureScript("npc_bartleby") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_BEAT) - { - creature->setFaction(FACTION_ENEMY); - creature->AI()->AttackStart(player); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_bartlebyAI(creature); - } - - struct npc_bartlebyAI : public ScriptedAI - { - npc_bartlebyAI(Creature* creature) : ScriptedAI(creature) - { - m_uiNormalFaction = creature->getFaction(); - } - - uint32 m_uiNormalFaction; - - void Reset() - { - if (me->getFaction() != m_uiNormalFaction) - me->setFaction(m_uiNormalFaction); - } - - void AttackedBy(Unit* pAttacker) - { - if (me->getVictim()) - return; - - if (me->IsFriendlyTo(pAttacker)) - return; - - AttackStart(pAttacker); - } - - void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) - { - if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage)) - { - //Take 0 damage - uiDamage = 0; - - if (pDoneBy->GetTypeId() == TYPEID_PLAYER) - CAST_PLR(pDoneBy)->AreaExploredOrEventHappens(QUEST_BEAT); - EnterEvadeMode(); - } - } - }; -}; - -/*###### -## npc_lady_katrana_prestor -######*/ - -#define GOSSIP_ITEM_KAT_1 "Pardon the intrusion, Lady Prestor, but Highlord Bolvar suggested that I seek your advice." -#define GOSSIP_ITEM_KAT_2 "My apologies, Lady Prestor." -#define GOSSIP_ITEM_KAT_3 "Begging your pardon, Lady Prestor. That was not my intent." -#define GOSSIP_ITEM_KAT_4 "Thank you for your time, Lady Prestor." - -class npc_lady_katrana_prestor : public CreatureScript -{ -public: - npc_lady_katrana_prestor() : CreatureScript("npc_lady_katrana_prestor") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2694, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2695, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2696, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(4185); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (creature->isQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(4185) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(2693, creature->GetGUID()); - - return true; - } -}; - -/*###### -## npc_lord_gregor_lescovar -######*/ - -enum eLordGregorLescovar -{ - SAY_LESCOVAR_2 = -1000457, - SAY_GUARD_2 = -1000458, - SAY_LESCOVAR_3 = -1000459, - SAY_MARZON_1 = -1000460, - SAY_LESCOVAR_4 = -1000461, - SAY_TYRION_2 = -1000462, - SAY_MARZON_2 = -1000463, - - NPC_STORMWIND_ROYAL = 1756, - NPC_MARZON_BLADE = 1755, - NPC_TYRION = 7766, - - QUEST_THE_ATTACK = 434 -}; - -class npc_lord_gregor_lescovar : public CreatureScript -{ -public: - npc_lord_gregor_lescovar() : CreatureScript("npc_lord_gregor_lescovar") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_lord_gregor_lescovarAI(creature); - } - - struct npc_lord_gregor_lescovarAI : public npc_escortAI - { - npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature) - { - creature->RestoreFaction(); - } - - uint32 uiTimer; - uint32 uiPhase; - - uint64 MarzonGUID; - - void Reset() - { - uiTimer = 0; - uiPhase = 0; - - MarzonGUID = 0; - } - - void EnterEvadeMode() - { - me->DisappearAndDie(); - - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) - { - if (pMarzon->isAlive()) - pMarzon->DisappearAndDie(); - } - } - - void EnterCombat(Unit* who) - { - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) - { - if (pMarzon->isAlive() && !pMarzon->isInCombat()) - pMarzon->AI()->AttackStart(who); - } - } - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - case 14: - SetEscortPaused(true); - DoScriptText(SAY_LESCOVAR_2, me); - uiTimer = 3000; - uiPhase = 1; - break; - case 16: - SetEscortPaused(true); - if (Creature* pMarzon = me->SummonCreature(NPC_MARZON_BLADE, -8411.360352f, 480.069733f, 123.760895f, 4.941504f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000)) - { - pMarzon->GetMotionMaster()->MovePoint(0, -8408.000977f, 468.611450f, 123.759903f); - MarzonGUID = pMarzon->GetGUID(); - } - uiTimer = 2000; - uiPhase = 4; - break; - } - } - //TO-DO: We don't have movemaps, also we can't make 2 npcs walks to one point propperly (and we can not use escort ai, because they are 2 different spawns and with same entry), because of it we make them, disappear. - void DoGuardsDisappearAndDie() - { - std::list GuardList; - me->GetCreatureListWithEntryInGrid(GuardList, NPC_STORMWIND_ROYAL, 8.0f); - if (!GuardList.empty()) - { - for (std::list::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) - { - if (Creature* pGuard = *itr) - pGuard->DisappearAndDie(); - } - } - } - - void UpdateAI(const uint32 uiDiff) - { - if (uiPhase) - { - if (uiTimer <= uiDiff) - { - switch (uiPhase) - { - case 1: - if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 8.0f, true)) - DoScriptText(SAY_GUARD_2, pGuard); - uiTimer = 3000; - uiPhase = 2; - break; - case 2: - DoGuardsDisappearAndDie(); - uiTimer = 2000; - uiPhase = 3; - break; - case 3: - SetEscortPaused(false); - uiTimer = 0; - uiPhase = 0; - break; - case 4: - DoScriptText(SAY_LESCOVAR_3, me); - uiTimer = 0; - uiPhase = 0; - break; - case 5: - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) - DoScriptText(SAY_MARZON_1, pMarzon); - uiTimer = 3000; - uiPhase = 6; - break; - case 6: - DoScriptText(SAY_LESCOVAR_4, me); - if (Player* player = GetPlayerForEscort()) - player->AreaExploredOrEventHappens(QUEST_THE_ATTACK); - uiTimer = 2000; - uiPhase = 7; - break; - case 7: - if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 20.0f, true)) - DoScriptText(SAY_TYRION_2, pTyrion); - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) - pMarzon->setFaction(14); - me->setFaction(14); - uiTimer = 0; - uiPhase = 0; - break; - } - } else uiTimer -= uiDiff; - } - npc_escortAI::UpdateAI(uiDiff); - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; -}; - -/*###### -## npc_marzon_silent_blade -######*/ - -class npc_marzon_silent_blade : public CreatureScript -{ -public: - npc_marzon_silent_blade() : CreatureScript("npc_marzon_silent_blade") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_marzon_silent_bladeAI(creature); - } - - struct npc_marzon_silent_bladeAI : public ScriptedAI - { - npc_marzon_silent_bladeAI(Creature* creature) : ScriptedAI(creature) - { - me->SetWalk(true); - } - - void Reset() - { - me->RestoreFaction(); - } - - void EnterCombat(Unit* who) - { - DoScriptText(SAY_MARZON_2, me); - - if (me->isSummon()) - { - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - { - if (summoner->GetTypeId() == TYPEID_UNIT && summoner->isAlive() && !summoner->isInCombat()) - summoner->ToCreature()->AI()->AttackStart(who); - } - } - } - - void EnterEvadeMode() - { - me->DisappearAndDie(); - - if (me->isSummon()) - { - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - { - if (summoner->GetTypeId() == TYPEID_UNIT && summoner->isAlive()) - summoner->ToCreature()->DisappearAndDie(); - } - } - } - - void MovementInform(uint32 uiType, uint32 /*uiId*/) - { - if (uiType != POINT_MOTION_TYPE) - return; - - if (me->isSummon()) - { - Unit* summoner = me->ToTempSummon()->GetSummoner(); - if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled) - { - npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai = - CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI()); - if (ai) - { - ai->uiTimer = 2000; - ai->uiPhase = 5; - } - //me->ChangeOrient(0.0f, summoner); - } - } - } - - void UpdateAI(const uint32 /*diff*/) - { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; -}; - -/*###### -## npc_tyrion_spybot -######*/ - -enum eTyrionSpybot -{ - SAY_QUEST_ACCEPT_ATTACK = -1000499, - SAY_TYRION_1 = -1000450, - SAY_SPYBOT_1 = -1000451, - SAY_GUARD_1 = -1000452, - SAY_SPYBOT_2 = -1000453, - SAY_SPYBOT_3 = -1000454, - SAY_LESCOVAR_1 = -1000455, - SAY_SPYBOT_4 = -1000456, - - NPC_PRIESTESS_TYRIONA = 7779, - NPC_LORD_GREGOR_LESCOVAR = 1754, -}; - -class npc_tyrion_spybot : public CreatureScript -{ -public: - npc_tyrion_spybot() : CreatureScript("npc_tyrion_spybot") { } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tyrion_spybotAI(creature); - } - - struct npc_tyrion_spybotAI : public npc_escortAI - { - npc_tyrion_spybotAI(Creature* creature) : npc_escortAI(creature) {} - - uint32 uiTimer; - uint32 uiPhase; - - void Reset() - { - uiTimer = 0; - uiPhase = 0; - } - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - case 1: - SetEscortPaused(true); - uiTimer = 2000; - uiPhase = 1; - break; - case 5: - SetEscortPaused(true); - DoScriptText(SAY_SPYBOT_1, me); - uiTimer = 2000; - uiPhase = 5; - break; - case 17: - SetEscortPaused(true); - DoScriptText(SAY_SPYBOT_3, me); - uiTimer = 3000; - uiPhase = 8; - break; - } - } - - void UpdateAI(const uint32 uiDiff) - { - if (uiPhase) - { - if (uiTimer <= uiDiff) - { - switch (uiPhase) - { - case 1: - DoScriptText(SAY_QUEST_ACCEPT_ATTACK, me); - uiTimer = 3000; - uiPhase = 2; - break; - case 2: - if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 10.0f)) - DoScriptText(SAY_TYRION_1, pTyrion); - uiTimer = 3000; - uiPhase = 3; - break; - case 3: - me->UpdateEntry(NPC_PRIESTESS_TYRIONA, ALLIANCE); - uiTimer = 2000; - uiPhase = 4; - break; - case 4: - SetEscortPaused(false); - uiPhase = 0; - uiTimer = 0; - break; - case 5: - if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 10.0f, true)) - DoScriptText(SAY_GUARD_1, pGuard); - uiTimer = 3000; - uiPhase = 6; - break; - case 6: - DoScriptText(SAY_SPYBOT_2, me); - uiTimer = 3000; - uiPhase = 7; - break; - case 7: - SetEscortPaused(false); - uiTimer = 0; - uiPhase = 0; - break; - case 8: - if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f)) - DoScriptText(SAY_LESCOVAR_1, pLescovar); - uiTimer = 3000; - uiPhase = 9; - break; - case 9: - DoScriptText(SAY_SPYBOT_4, me); - uiTimer = 3000; - uiPhase = 10; - break; - case 10: - if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f)) - { - if (Player* player = GetPlayerForEscort()) - { - CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); - CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f); - } - } - me->DisappearAndDie(); - uiTimer = 0; - uiPhase = 0; - break; - } - } else uiTimer -= uiDiff; - } - npc_escortAI::UpdateAI(uiDiff); - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; -}; - -/*###### -## npc_tyrion -######*/ - -enum eTyrion -{ - NPC_TYRION_SPYBOT = 8856 -}; - -class npc_tyrion : public CreatureScript -{ -public: - npc_tyrion() : CreatureScript("npc_tyrion") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_THE_ATTACK) - { - if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) - { - CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); - CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f); - } - return true; - } - return false; - } -}; void AddSC_stormwind_city() { - new npc_archmage_malin(); - new npc_bartleby(); - new npc_lady_katrana_prestor(); - new npc_tyrion(); - new npc_tyrion_spybot(); - new npc_lord_gregor_lescovar(); - new npc_marzon_silent_blade(); } diff --git a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp index 4c81380fb60..9724588039f 100644 --- a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp +++ b/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp @@ -20,136 +20,6 @@ #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" -/*###### -## npc_galen_goodward -######*/ - -enum Galen -{ - QUEST_GALENS_ESCAPE = 1393, - - GO_GALENS_CAGE = 37118, - - SAY_PERIODIC = -1000500, - SAY_QUEST_ACCEPTED = -1000501, - SAY_ATTACKED_1 = -1000502, - SAY_ATTACKED_2 = -1000503, - SAY_QUEST_COMPLETE = -1000504, - EMOTE_WHISPER = -1000505, - EMOTE_DISAPPEAR = -1000506 -}; - -class npc_galen_goodward : public CreatureScript -{ -public: - - npc_galen_goodward() : CreatureScript("npc_galen_goodward") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_GALENS_ESCAPE) - { - CAST_AI(npc_galen_goodward::npc_galen_goodwardAI, creature->AI())->Start(false, false, player->GetGUID()); - creature->setFaction(FACTION_ESCORT_N_NEUTRAL_ACTIVE); - DoScriptText(SAY_QUEST_ACCEPTED, creature); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_galen_goodwardAI(creature); - } - - struct npc_galen_goodwardAI : public npc_escortAI - { - npc_galen_goodwardAI(Creature* creature) : npc_escortAI(creature) - { - m_uiGalensCageGUID = 0; - Reset(); - } - - uint64 m_uiGalensCageGUID; - uint32 m_uiPeriodicSay; - - void Reset() - { - m_uiPeriodicSay = 6000; - } - - void EnterCombat(Unit* who) - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - DoScriptText(RAND(SAY_ATTACKED_1, SAY_ATTACKED_2), me, who); - } - - void WaypointStart(uint32 uiPointId) - { - switch (uiPointId) - { - case 0: - { - GameObject* pCage = NULL; - if (m_uiGalensCageGUID) - pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID); - else - pCage = GetClosestGameObjectWithEntry(me, GO_GALENS_CAGE, INTERACTION_DISTANCE); - if (pCage) - { - pCage->UseDoorOrButton(); - m_uiGalensCageGUID = pCage->GetGUID(); - } - break; - } - case 21: - DoScriptText(EMOTE_DISAPPEAR, me); - break; - } - } - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - case 0: - if (GameObject* pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID)) - pCage->ResetDoorOrButton(); - break; - case 20: - if (Player* player = GetPlayerForEscort()) - { - me->SetFacingToObject(player); - DoScriptText(SAY_QUEST_COMPLETE, me, player); - DoScriptText(EMOTE_WHISPER, me, player); - player->GroupEventHappens(QUEST_GALENS_ESCAPE, me); - } - SetRun(true); - break; - } - } - - void UpdateAI(const uint32 uiDiff) - { - npc_escortAI::UpdateAI(uiDiff); - - if (HasEscortState(STATE_ESCORT_NONE)) - return; - - if (m_uiPeriodicSay < uiDiff) - { - if (!HasEscortState(STATE_ESCORT_ESCORTING)) - DoScriptText(SAY_PERIODIC, me); - m_uiPeriodicSay = 15000; - } - else - m_uiPeriodicSay -= uiDiff; - - DoMeleeAttackIfReady(); - } - }; -}; - void AddSC_swamp_of_sorrows() { - new npc_galen_goodward(); } diff --git a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp index 70f9f93c7a7..cbefd115739 100644 --- a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp @@ -18,199 +18,18 @@ /* ScriptData SDName: Tirisfal_Glades -SD%Complete: 100 -SDComment: Quest support: 590, 1819 +SD%Complete: 0 +SDComment: SDCategory: Tirisfal Glades EndScriptData */ /* ContentData -npc_calvin_montague -go_mausoleum_door -go_mausoleum_trigger EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" -/*###### -## npc_calvin_montague -######*/ - -enum eCalvin -{ - SAY_COMPLETE = -1000431, - SPELL_DRINK = 2639, // possibly not correct spell (but iconId is correct) - QUEST_590 = 590, - FACTION_HOSTILE = 168 -}; - -class npc_calvin_montague : public CreatureScript -{ -public: - npc_calvin_montague() : CreatureScript("npc_calvin_montague") { } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_590) - { - creature->setFaction(FACTION_HOSTILE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - CAST_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_calvin_montagueAI (creature); - } - - struct npc_calvin_montagueAI : public ScriptedAI - { - npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 m_uiPhase; - uint32 m_uiPhaseTimer; - uint64 m_uiPlayerGUID; - - void Reset() - { - m_uiPhase = 0; - m_uiPhaseTimer = 5000; - m_uiPlayerGUID = 0; - - me->RestoreFaction(); - - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - } - - void EnterCombat(Unit* /*who*/) {} - - void AttackedBy(Unit* pAttacker) - { - if (me->getVictim() || me->IsFriendlyTo(pAttacker)) - return; - - AttackStart(pAttacker); - } - - void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) - { - if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage)) - { - uiDamage = 0; - - me->RestoreFaction(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->CombatStop(true); - - m_uiPhase = 1; - - if (pDoneBy->GetTypeId() == TYPEID_PLAYER) - m_uiPlayerGUID = pDoneBy->GetGUID(); - } - } - - void UpdateAI(const uint32 uiDiff) - { - if (m_uiPhase) - { - if (m_uiPhaseTimer <= uiDiff) - m_uiPhaseTimer = 7500; - else - { - m_uiPhaseTimer -= uiDiff; - return; - } - - switch (m_uiPhase) - { - case 1: - DoScriptText(SAY_COMPLETE, me); - ++m_uiPhase; - break; - case 2: - if (Player* player = Unit::GetPlayer(*me, m_uiPlayerGUID)) - player->AreaExploredOrEventHappens(QUEST_590); - - DoCast(me, SPELL_DRINK, true); - ++m_uiPhase; - break; - case 3: - EnterEvadeMode(); - break; - } - - return; - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; -}; - -/*###### -## go_mausoleum_door -## go_mausoleum_trigger -######*/ - -enum eMausoleum -{ - QUEST_ULAG = 1819, - NPC_ULAG = 6390, - GO_TRIGGER = 104593, - GO_DOOR = 176594 -}; - -class go_mausoleum_door : public GameObjectScript -{ -public: - go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { } - - bool OnGossipHello(Player* player, GameObject* /*go*/) - { - if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) - return false; - - if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f)) - { - pTrigger->SetGoState(GO_STATE_READY); - player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); - return false; - } - - return false; - } -}; - -class go_mausoleum_trigger : public GameObjectScript -{ -public: - go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { } - - bool OnGossipHello(Player* player, GameObject* go) - { - if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) - return false; - - if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f)) - { - go->SetGoState(GO_STATE_ACTIVE); - pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - return true; - } - - return false; - } -}; void AddSC_tirisfal_glades() { - new npc_calvin_montague(); - new go_mausoleum_door(); - new go_mausoleum_trigger(); } -- cgit v1.2.3 From f7fd5da96353f73c57ef295998fcdf9f7ca8dd41 Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 13 Aug 2012 14:46:37 +0100 Subject: Core: Fix a few compile errors with some "weird" compilers --- src/server/game/Handlers/ItemHandler.cpp | 2 +- src/server/game/Handlers/VoidStorageHandler.cpp | 8 ++++---- src/server/scripts/World/npcs_special.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 616309c49a0..765adbda101 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1529,7 +1529,7 @@ void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) itemTransmogrifier = player->GetItemByGuid(itemGuids[i]); if (!itemTransmogrifier) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify with an invalid item (guid: "UI64FMTD").", player->GetGUIDLow(), player->GetName(), itemGuids[i]); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify with an invalid item (lowguid: %u).", player->GetGUIDLow(), player->GetName(), GUID_LOPART(itemGuids[i])); return; } } diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index f89bcf6e0d0..0e40b0faf15 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -332,7 +332,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) Item* item = player->GetItemByGuid(*itr); if (!item) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) wants to deposit an invalid item (item guid: %u).", player->GetGUIDLow(), player->GetName(), *itr); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) wants to deposit an invalid item (item guid: %u).", player->GetGUIDLow(), player->GetName(), uint64(*itr)); continue; } @@ -357,7 +357,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) VoidStorageItem* itemVS = player->GetVoidStorageItem(*itr, slot); if (!itemVS) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) tried to withdraw an invalid item (id: %u)", player->GetGUIDLow(), player->GetName(), *itr); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) tried to withdraw an invalid item (id: %u)", player->GetGUIDLow(), player->GetName(), uint64(*itr)); continue; } @@ -366,7 +366,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) if (msg != EQUIP_ERR_OK) { SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) couldn't withdraw item id %u because inventory was full.", player->GetGUIDLow(), player->GetName(), *itr); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) couldn't withdraw item id %u because inventory was full.", player->GetGUIDLow(), player->GetName(), uint64(*itr)); return; } @@ -535,7 +535,7 @@ void WorldSession::HandleVoidSwapItem(WorldPacket& recvData) uint8 oldSlot; if (!player->GetVoidStorageItem(itemId, oldSlot)) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidSwapItem - Player (GUID: %u, name: %s) requested swapping an invalid item (slot: %u, itemid: %u).", player->GetGUIDLow(), player->GetName(), newSlot, itemId); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidSwapItem - Player (GUID: %u, name: %s) requested swapping an invalid item (slot: %u, itemid: %u).", player->GetGUIDLow(), player->GetName(), newSlot, uint64(itemId)); return; } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 2d0198bfb0e..2830a050d42 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1297,7 +1297,7 @@ public: case GOSSIP_OPTION_LEARNDUALSPEC: if (player->GetSpecsCount() == 1 && !(player->getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))) { - if (!player->HasEnoughMoney(UI64LIT(10000000))) + if (!player->HasEnoughMoney(uint64(10000000))) { player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); player->PlayerTalkClass->SendCloseGossip(); @@ -1305,7 +1305,7 @@ public: } else { - player->ModifyMoney(SI64LIT(-10000000)); + player->ModifyMoney(int64(-10000000)); // Cast spells that teach dual spec // Both are also ImplicitTarget self and must be cast by player -- cgit v1.2.3 From c8eeb1f9e6d804c2b87843436fb132f9ebd75c8d Mon Sep 17 00:00:00 2001 From: Venugh Date: Tue, 14 Aug 2012 01:57:42 +0200 Subject: Core/AI: Removed EventAI handling. is not needed more for cataclysm... move a sql to correct place. --- sql/updates/2012_08_13_00_world_quest_template.sql | 1 - .../world/2012_08_13_00_world_quest_template.sql | 1 + sql/updates/world/2012_08_14_00_world_event_ai.sql | 3 + sql/updates/world/2012_08_14_01_world_commands.sql | 1 + src/server/game/AI/CreatureAIRegistry.cpp | 2 - src/server/game/AI/EventAI/CreatureEventAI.cpp | 1386 -------------------- src/server/game/AI/EventAI/CreatureEventAI.h | 645 --------- src/server/game/AI/EventAI/CreatureEventAIMgr.cpp | 743 ----------- src/server/game/AI/EventAI/CreatureEventAIMgr.h | 49 - src/server/game/CMakeLists.txt | 1 - src/server/game/Conditions/ConditionMgr.cpp | 2 +- src/server/game/World/World.cpp | 10 - src/server/scripts/CMakeLists.txt | 1 - src/server/scripts/Commands/cs_reload.cpp | 39 - src/server/shared/Logging/Appender.h | 2 +- src/server/worldserver/CMakeLists.txt | 1 - 16 files changed, 7 insertions(+), 2880 deletions(-) delete mode 100644 sql/updates/2012_08_13_00_world_quest_template.sql create mode 100644 sql/updates/world/2012_08_13_00_world_quest_template.sql create mode 100644 sql/updates/world/2012_08_14_00_world_event_ai.sql create mode 100644 sql/updates/world/2012_08_14_01_world_commands.sql delete mode 100755 src/server/game/AI/EventAI/CreatureEventAI.cpp delete mode 100755 src/server/game/AI/EventAI/CreatureEventAI.h delete mode 100755 src/server/game/AI/EventAI/CreatureEventAIMgr.cpp delete mode 100755 src/server/game/AI/EventAI/CreatureEventAIMgr.h (limited to 'src/server/scripts') diff --git a/sql/updates/2012_08_13_00_world_quest_template.sql b/sql/updates/2012_08_13_00_world_quest_template.sql deleted file mode 100644 index b3c5a45a668..00000000000 --- a/sql/updates/2012_08_13_00_world_quest_template.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `quest_template` CHANGE `MinLevel` `MinLevel` tinyint(4) NOT NULL DEFAULT '0'; diff --git a/sql/updates/world/2012_08_13_00_world_quest_template.sql b/sql/updates/world/2012_08_13_00_world_quest_template.sql new file mode 100644 index 00000000000..b3c5a45a668 --- /dev/null +++ b/sql/updates/world/2012_08_13_00_world_quest_template.sql @@ -0,0 +1 @@ +ALTER TABLE `quest_template` CHANGE `MinLevel` `MinLevel` tinyint(4) NOT NULL DEFAULT '0'; diff --git a/sql/updates/world/2012_08_14_00_world_event_ai.sql b/sql/updates/world/2012_08_14_00_world_event_ai.sql new file mode 100644 index 00000000000..3fe49aa4059 --- /dev/null +++ b/sql/updates/world/2012_08_14_00_world_event_ai.sql @@ -0,0 +1,3 @@ +DROP TABLE `creature_ai_scripts`; +DROP TABLE `creature_ai_summons`; +DROP TABLE `creature_ai_texts`; diff --git a/sql/updates/world/2012_08_14_01_world_commands.sql b/sql/updates/world/2012_08_14_01_world_commands.sql new file mode 100644 index 00000000000..aa030e01adb --- /dev/null +++ b/sql/updates/world/2012_08_14_01_world_commands.sql @@ -0,0 +1 @@ +DELETE FROM `command` WHERE `name`='reload all eventai'; diff --git a/src/server/game/AI/CreatureAIRegistry.cpp b/src/server/game/AI/CreatureAIRegistry.cpp index e5c689da339..564eb7209f1 100755 --- a/src/server/game/AI/CreatureAIRegistry.cpp +++ b/src/server/game/AI/CreatureAIRegistry.cpp @@ -22,7 +22,6 @@ #include "GuardAI.h" #include "PetAI.h" #include "TotemAI.h" -#include "CreatureEventAI.h" #include "RandomMovementGenerator.h" #include "MovementGeneratorImpl.h" #include "CreatureAIRegistry.h" @@ -46,7 +45,6 @@ namespace AIRegistry (new CreatureAIFactory("CombatAI"))->RegisterSelf(); (new CreatureAIFactory("ArcherAI"))->RegisterSelf(); (new CreatureAIFactory("TurretAI"))->RegisterSelf(); - (new CreatureAIFactory("EventAI"))->RegisterSelf(); (new CreatureAIFactory("VehicleAI"))->RegisterSelf(); (new CreatureAIFactory("SmartAI"))->RegisterSelf(); diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp deleted file mode 100755 index 82abfc0454c..00000000000 --- a/src/server/game/AI/EventAI/CreatureEventAI.cpp +++ /dev/null @@ -1,1386 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "Common.h" -#include "CreatureEventAI.h" -#include "CreatureEventAIMgr.h" -#include "ObjectMgr.h" -#include "Spell.h" -#include "World.h" -#include "Cell.h" -#include "CellImpl.h" -#include "GameEventMgr.h" -#include "GridNotifiers.h" -#include "GridNotifiersImpl.h" -#include "InstanceScript.h" -#include "SpellMgr.h" -#include "CreatureAIImpl.h" -#include "ConditionMgr.h" - -bool CreatureEventAIHolder::UpdateRepeatTimer(Creature* creature, uint32 repeatMin, uint32 repeatMax) -{ - if (repeatMin == repeatMax) - Time = repeatMin; - else if (repeatMax > repeatMin) - Time = urand(repeatMin, repeatMax); - else - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using Event %u (Type = %u) has RandomMax < RandomMin. Event repeating disabled.", creature->GetEntry(), Event.event_id, Event.event_type); - Enabled = false; - return false; - } - - return true; -} - -int CreatureEventAI::Permissible(const Creature* creature) -{ - if (creature->GetAIName() == "EventAI") - return PERMIT_BASE_SPECIAL; - return PERMIT_BASE_NO; -} - -CreatureEventAI::CreatureEventAI(Creature* c) : CreatureAI(c) -{ - // Need make copy for filter unneeded steps and safe in case table reload - CreatureEventAI_Event_Map::const_iterator CreatureEvents = sEventAIMgr->GetCreatureEventAIMap().find(me->GetEntry()); - if (CreatureEvents != sEventAIMgr->GetCreatureEventAIMap().end()) - { - std::vector::const_iterator i; - for (i = (*CreatureEvents).second.begin(); i != (*CreatureEvents).second.end(); ++i) - { - //Debug check - #ifndef TRINITY_DEBUG - if ((*i).event_flags & EFLAG_DEBUG_ONLY) - continue; - #endif - if (me->GetMap()->IsDungeon()) - { - if ((1 << (me->GetMap()->GetSpawnMode()+1)) & (*i).event_flags) - { - //event flagged for instance mode - m_CreatureEventAIList.push_back(CreatureEventAIHolder(*i)); - } - continue; - } - m_CreatureEventAIList.push_back(CreatureEventAIHolder(*i)); - } - //EventMap had events but they were not added because they must be for instance - if (m_CreatureEventAIList.empty()) - sLog->outError(LOG_FILTER_GENERAL, "CreatureEventAI: Creature %u has events but no events added to list because of instance flags.", me->GetEntry()); - } - else - sLog->outError(LOG_FILTER_GENERAL, "CreatureEventAI: EventMap for Creature %u is empty but creature is using CreatureEventAI.", me->GetEntry()); - - m_bEmptyList = m_CreatureEventAIList.empty(); - m_Phase = 0; - m_CombatMovementEnabled = true; - m_MeleeEnabled = true; - m_AttackDistance = 0.0f; - m_AttackAngle = 0.0f; - - m_InvincibilityHpLevel = 0; - - //Handle Spawned Events - if (!m_bEmptyList) - { - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - if (SpawnedEventConditionsCheck((*i).Event)) - ProcessEvent(*i); - } -} - -bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& holder, Unit* actionInvoker /*=NULL*/) -{ - if (!holder.Enabled || holder.Time) - return false; - - //Check the inverse phase mask (event doesn't trigger if current phase bit is set in mask) - if (holder.Event.event_inverse_phase_mask & (1 << m_Phase)) - return false; - - CreatureEventAI_Event const& event = holder.Event; - - //Check event conditions based on the event type, also reset events - switch (event.event_type) - { - case EVENT_T_TIMER: - if (!me->isInCombat()) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.timer.repeatMin, event.timer.repeatMax); - break; - case EVENT_T_TIMER_OOC: - if (me->isInCombat()) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.timer.repeatMin, event.timer.repeatMax); - break; - case EVENT_T_HP: - { - if (!me->isInCombat() || !me->GetMaxHealth()) - return false; - - uint32 perc = uint32(me->GetHealthPct()); - - if (perc > event.percent_range.percentMax || perc < event.percent_range.percentMin) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax); - break; - } - case EVENT_T_MANA: - { - if (!me->isInCombat() || !me->GetMaxPower(POWER_MANA)) - return false; - - uint32 perc = (me->GetPower(POWER_MANA)*100) / me->GetMaxPower(POWER_MANA); - - if (perc > event.percent_range.percentMax || perc < event.percent_range.percentMin) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax); - break; - } - case EVENT_T_AGGRO: - break; - case EVENT_T_KILL: - //Repeat Timers - holder.UpdateRepeatTimer(me, event.kill.repeatMin, event.kill.repeatMax); - break; - case EVENT_T_DEATH: - case EVENT_T_EVADE: - break; - case EVENT_T_SPELLHIT: - //Spell hit is special case, param1 and param2 handled within CreatureEventAI::SpellHit - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.spell_hit.repeatMin, event.spell_hit.repeatMax); - break; - case EVENT_T_RANGE: - //Repeat Timers - holder.UpdateRepeatTimer(me, event.range.repeatMin, event.range.repeatMax); - break; - case EVENT_T_OOC_LOS: - //Repeat Timers - holder.UpdateRepeatTimer(me, event.ooc_los.repeatMin, event.ooc_los.repeatMax); - break; - case EVENT_T_RESET: - case EVENT_T_SPAWNED: - break; - case EVENT_T_TARGET_HP: - { - if (!me->isInCombat() || !me->getVictim() || !me->getVictim()->GetMaxHealth()) - return false; - - uint32 perc = uint32(me->getVictim()->GetHealthPct()); - - if (perc > event.percent_range.percentMax || perc < event.percent_range.percentMin) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax); - break; - } - case EVENT_T_TARGET_CASTING: - if (!me->isInCombat() || !me->getVictim() || !me->getVictim()->IsNonMeleeSpellCasted(false, false, true)) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.target_casting.repeatMin, event.target_casting.repeatMax); - break; - case EVENT_T_FRIENDLY_HP: - { - if (!me->isInCombat()) - return false; - - Unit* unit = DoSelectLowestHpFriendly((float)event.friendly_hp.radius, event.friendly_hp.hpDeficit); - if (!unit) - return false; - - actionInvoker = unit; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.friendly_hp.repeatMin, event.friendly_hp.repeatMax); - break; - } - case EVENT_T_FRIENDLY_IS_CC: - { - if (!me->isInCombat()) - return false; - - std::list pList; - DoFindFriendlyCC(pList, (float)event.friendly_is_cc.radius); - - //List is empty - if (pList.empty()) - return false; - - //We don't really care about the whole list, just return first available - actionInvoker = *(pList.begin()); - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.friendly_is_cc.repeatMin, event.friendly_is_cc.repeatMax); - break; - } - case EVENT_T_FRIENDLY_MISSING_BUFF: - { - std::list pList; - DoFindFriendlyMissingBuff(pList, (float)event.friendly_buff.radius, event.friendly_buff.spellId); - - //List is empty - if (pList.empty()) - return false; - - //We don't really care about the whole list, just return first available - actionInvoker = *(pList.begin()); - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.friendly_buff.repeatMin, event.friendly_buff.repeatMax); - break; - } - case EVENT_T_SUMMONED_UNIT: - { - //Prevent event from occuring on no unit or non creatures - if (!actionInvoker || actionInvoker->GetTypeId() != TYPEID_UNIT) - return false; - - //Creature id doesn't match up - if (actionInvoker->ToCreature()->GetEntry() != event.summon_unit.creatureId) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.summon_unit.repeatMin, event.summon_unit.repeatMax); - break; - } - case EVENT_T_TARGET_MANA: - { - if (!me->isInCombat() || !me->getVictim() || !me->getVictim()->GetMaxPower(POWER_MANA)) - return false; - - uint32 perc = (me->getVictim()->GetPower(POWER_MANA)*100) / me->getVictim()->GetMaxPower(POWER_MANA); - - if (perc > event.percent_range.percentMax || perc < event.percent_range.percentMin) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax); - break; - } - case EVENT_T_REACHED_HOME: - case EVENT_T_RECEIVE_EMOTE: - break; - case EVENT_T_BUFFED: - { - //Note: checked only aura for effect 0, if need check aura for effect 1/2 then - // possible way: pack in event.buffed.amount 2 uint16 (ammount+effectIdx) - Aura const* aura = me->GetAura(event.buffed.spellId); - if (!aura || aura->GetStackAmount() < event.buffed.amount) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.buffed.repeatMin, event.buffed.repeatMax); - break; - } - case EVENT_T_TARGET_BUFFED: - { - //Prevent event from occuring on no unit - if (!actionInvoker) - return false; - - //Note: checked only aura for effect 0, if need check aura for effect 1/2 then - // possible way: pack in event.buffed.amount 2 uint16 (ammount+effectIdx) - Aura const* aura = actionInvoker->GetAura(event.buffed.spellId); - if (!aura || aura->GetStackAmount() < event.buffed.amount) - return false; - - //Repeat Timers - holder.UpdateRepeatTimer(me, event.buffed.repeatMin, event.buffed.repeatMax); - break; - } - default: - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using Event %u has invalid Event Type(%u), missing from ProcessEvent() Switch.", me->GetEntry(), holder.Event.event_id, holder.Event.event_type); - break; - } - - //Disable non-repeatable events - if (!(holder.Event.event_flags & EFLAG_REPEATABLE)) - holder.Enabled = false; - - //Store random here so that all random actions match up - uint32 rnd = rand(); - - //Return if chance for event is not met - if (holder.Event.event_chance <= rnd % 100) - return false; - - //Process actions - for (uint8 j = 0; j < MAX_ACTIONS; ++j) - ProcessAction(holder.Event.action[j], rnd, holder.Event.event_id, actionInvoker); - - return true; -} - -void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 rnd, uint32 eventId, Unit* actionInvoker) -{ - switch (action.type) - { - case ACTION_T_TEXT: - { - if (!action.text.TextId1) - return; - - int32 temp = action.text.TextId1; - - if (action.text.TextId2 && action.text.TextId3) - temp = RAND(action.text.TextId1, action.text.TextId2, action.text.TextId3); - else if (action.text.TextId2 && urand(0, 1)) - temp = action.text.TextId2; - - if (temp) - { - Unit* target = NULL; - - if (actionInvoker) - { - if (actionInvoker->GetTypeId() == TYPEID_PLAYER) - target = actionInvoker; - else if (Unit* owner = actionInvoker->GetOwner()) - { - if (owner->GetTypeId() == TYPEID_PLAYER) - target = owner; - } - } - else - { - target = me->getVictim(); - if (target && target->GetTypeId() != TYPEID_PLAYER) - if (Unit* owner = target->GetOwner()) - if (owner->GetTypeId() == TYPEID_PLAYER) - target = owner; - } - - DoScriptText(temp, me, target); - } - break; - } - case ACTION_T_SET_FACTION: - { - if (action.set_faction.factionId) - me->setFaction(action.set_faction.factionId); - else - { - if (CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(me->GetEntry())) - { - //if no id provided, assume reset and then use default - if (me->getFaction() != ci->faction_A) - me->setFaction(ci->faction_A); - } - } - break; - } - case ACTION_T_MORPH_TO_ENTRY_OR_MODEL: - { - if (action.morph.creatureId || action.morph.modelId) - { - //set model based on entry from creature_template - if (action.morph.creatureId) - { - if (CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(action.morph.creatureId)) - { - uint32 display_id = sObjectMgr->ChooseDisplayId(0, ci); - me->SetDisplayId(display_id); - } - } - //if no param1, then use value from param2 (modelId) - else - me->SetDisplayId(action.morph.modelId); - } - else - me->DeMorph(); - break; - } - case ACTION_T_SOUND: - me->PlayDirectSound(action.sound.soundId); - break; - case ACTION_T_EMOTE: - me->HandleEmoteCommand(action.emote.emoteId); - break; - case ACTION_T_RANDOM_SOUND: - { - int32 temp = GetRandActionParam(rnd, action.random_sound.soundId1, action.random_sound.soundId2, action.random_sound.soundId3); - if (temp >= 0) - me->PlayDirectSound(temp); - break; - } - case ACTION_T_RANDOM_EMOTE: - { - int32 temp = GetRandActionParam(rnd, action.random_emote.emoteId1, action.random_emote.emoteId2, action.random_emote.emoteId3); - if (temp >= 0) - me->HandleEmoteCommand(temp); - break; - } - case ACTION_T_CAST: - { - Unit* target = GetTargetByType(action.cast.target, actionInvoker); - Unit* caster = me; - - if (!target) - return; - - if (action.cast.castFlags & CAST_FORCE_TARGET_SELF) - caster = target; - - //Allowed to cast only if not casting (unless we interrupt ourself) or if spell is triggered - bool canCast = !caster->IsNonMeleeSpellCasted(false) || (action.cast.castFlags & (CAST_TRIGGERED | CAST_INTERRUPT_PREVIOUS)); - - // If cast flag CAST_AURA_NOT_PRESENT is active, check if target already has aura on them - if (action.cast.castFlags & CAST_AURA_NOT_PRESENT) - { - if (target->HasAura(action.cast.spellId)) - return; - } - - if (canCast) - { - const SpellInfo* tSpell = sSpellMgr->GetSpellInfo(action.cast.spellId); - - //Verify that spell exists - if (tSpell) - { - //Check if cannot cast spell - if (!(action.cast.castFlags & (CAST_FORCE_TARGET_SELF | CAST_FORCE_CAST)) && - !CanCast(target, tSpell, (action.cast.castFlags & CAST_TRIGGERED))) - { - //Melee current victim if flag not set - if (!(action.cast.castFlags & CAST_NO_MELEE_IF_OOM)) - { - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) - { - m_AttackDistance = 0.0f; - m_AttackAngle = 0.0f; - - me->GetMotionMaster()->MoveChase(me->getVictim(), m_AttackDistance, m_AttackAngle); - } - } - } - else - { - //Interrupt any previous spell - if (caster->IsNonMeleeSpellCasted(false) && action.cast.castFlags & CAST_INTERRUPT_PREVIOUS) - caster->InterruptNonMeleeSpells(false); - - caster->CastSpell(target, action.cast.spellId, (action.cast.castFlags & CAST_TRIGGERED)); - } - } - else - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: event %d creature %d attempt to cast spell that doesn't exist %d", eventId, me->GetEntry(), action.cast.spellId); - } - break; - } - case ACTION_T_SUMMON: - { - Unit* target = GetTargetByType(action.summon.target, actionInvoker); - - Creature* creature = NULL; - - if (action.summon.duration) - creature = me->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, action.summon.duration); - else - creature = me->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0); - - if (!creature) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: failed to spawn creature %u. Spawn event %d is on creature %d", action.summon.creatureId, eventId, me->GetEntry()); - else if (action.summon.target != TARGET_T_SELF && target) - creature->AI()->AttackStart(target); - break; - } - case ACTION_T_THREAT_SINGLE_PCT: - if (Unit* target = GetTargetByType(action.threat_single_pct.target, actionInvoker)) - me->getThreatManager().modifyThreatPercent(target, action.threat_single_pct.percent); - break; - case ACTION_T_THREAT_ALL_PCT: - { - std::list& threatList = me->getThreatManager().getThreatList(); - for (std::list::iterator i = threatList.begin(); i != threatList.end(); ++i) - if (Unit* Temp = Unit::GetUnit(*me, (*i)->getUnitGuid())) - me->getThreatManager().modifyThreatPercent(Temp, action.threat_all_pct.percent); - break; - } - case ACTION_T_QUEST_EVENT: - if (Unit* target = GetTargetByType(action.quest_event.target, actionInvoker)) - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->AreaExploredOrEventHappens(action.quest_event.questId); - break; - case ACTION_T_CAST_EVENT: - if (Unit* target = GetTargetByType(action.cast_event.target, actionInvoker)) - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->CastedCreatureOrGO(action.cast_event.creatureId, me->GetGUID(), action.cast_event.spellId); - break; - case ACTION_T_SET_UNIT_FIELD: - { - Unit* target = GetTargetByType(action.set_unit_field.target, actionInvoker); - - // not allow modify important for integrity object fields - if (action.set_unit_field.field < OBJECT_END || action.set_unit_field.field >= UNIT_END) - return; - - if (target) - target->SetUInt32Value(action.set_unit_field.field, action.set_unit_field.value); - - break; - } - case ACTION_T_SET_UNIT_FLAG: - if (Unit* target = GetTargetByType(action.unit_flag.target, actionInvoker)) - target->SetFlag(UNIT_FIELD_FLAGS, action.unit_flag.value); - break; - case ACTION_T_REMOVE_UNIT_FLAG: - if (Unit* target = GetTargetByType(action.unit_flag.target, actionInvoker)) - target->RemoveFlag(UNIT_FIELD_FLAGS, action.unit_flag.value); - break; - case ACTION_T_AUTO_ATTACK: - m_MeleeEnabled = action.auto_attack.state != 0; - break; - case ACTION_T_COMBAT_MOVEMENT: - // ignore no affect case - if (m_CombatMovementEnabled == (action.combat_movement.state != 0)) - return; - - m_CombatMovementEnabled = action.combat_movement.state != 0; - - //Allow movement (create new targeted movement gen only if idle) - if (m_CombatMovementEnabled) - { - Unit* victim = me->getVictim(); - if (me->isInCombat() && victim) - { - if (action.combat_movement.melee) - { - me->AddUnitState(UNIT_STATE_MELEE_ATTACKING); - me->SendMeleeAttackStart(victim); - } - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE) - me->GetMotionMaster()->MoveChase(victim, m_AttackDistance, m_AttackAngle); // Targeted movement generator will start melee automatically, no need to send it explicitly - } - } - else - { - if (me->isInCombat()) - { - Unit* victim = me->getVictim(); - if (action.combat_movement.melee && victim) - { - me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); - me->SendMeleeAttackStop(victim); - } - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) - me->GetMotionMaster()->MoveIdle(); - } - } - break; - case ACTION_T_SET_PHASE: - m_Phase = action.set_phase.phase; - break; - case ACTION_T_INC_PHASE: - { - int32 new_phase = int32(m_Phase)+action.set_inc_phase.step; - if (new_phase < 0) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d decrease m_Phase under 0. CreatureEntry = %d", eventId, me->GetEntry()); - m_Phase = 0; - } - else if (new_phase >= MAX_PHASE) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d incremented m_Phase above %u. m_Phase mask cannot be used with phases past %u. CreatureEntry = %d", eventId, MAX_PHASE-1, MAX_PHASE-1, me->GetEntry()); - m_Phase = MAX_PHASE-1; - } - else - m_Phase = new_phase; - - break; - } - case ACTION_T_EVADE: - EnterEvadeMode(); - break; - case ACTION_T_FLEE_FOR_ASSIST: - me->DoFleeToGetAssistance(); - break; - case ACTION_T_QUEST_EVENT_ALL: - if (actionInvoker && actionInvoker->GetTypeId() == TYPEID_PLAYER) - { - if (Unit* Temp = Unit::GetUnit(*me, actionInvoker->GetGUID())) - if (Temp->GetTypeId() == TYPEID_PLAYER) - Temp->ToPlayer()->GroupEventHappens(action.quest_event_all.questId, me); - } - break; - case ACTION_T_CAST_EVENT_ALL: - { - std::list& threatList = me->getThreatManager().getThreatList(); - for (std::list::iterator i = threatList.begin(); i != threatList.end(); ++i) - if (Unit* Temp = Unit::GetUnit(*me, (*i)->getUnitGuid())) - if (Temp->GetTypeId() == TYPEID_PLAYER) - Temp->ToPlayer()->CastedCreatureOrGO(action.cast_event_all.creatureId, me->GetGUID(), action.cast_event_all.spellId); - break; - } - case ACTION_T_REMOVEAURASFROMSPELL: - if (Unit* target = GetTargetByType(action.remove_aura.target, actionInvoker)) - target->RemoveAurasDueToSpell(action.remove_aura.spellId); - break; - case ACTION_T_RANGED_MOVEMENT: - m_AttackDistance = (float)action.ranged_movement.distance; - m_AttackAngle = action.ranged_movement.angle/180.0f*M_PI; - - if (m_CombatMovementEnabled) - { - me->GetMotionMaster()->MoveChase(me->getVictim(), m_AttackDistance, m_AttackAngle); - } - break; - case ACTION_T_RANDOM_PHASE: - m_Phase = GetRandActionParam(rnd, action.random_phase.phase1, action.random_phase.phase2, action.random_phase.phase3); - break; - case ACTION_T_RANDOM_PHASE_RANGE: - if (action.random_phase_range.phaseMin <= action.random_phase_range.phaseMax) - m_Phase = urand(action.random_phase_range.phaseMin, action.random_phase_range.phaseMax); - else - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: ACTION_T_RANDOM_PHASE_RANGE cannot have Param2 < Param1. Event = %d. CreatureEntry = %d", eventId, me->GetEntry()); - break; - case ACTION_T_SUMMON_ID: - { - Unit* target = GetTargetByType(action.summon_id.target, actionInvoker); - - CreatureEventAI_Summon_Map::const_iterator i = sEventAIMgr->GetCreatureEventAISummonMap().find(action.summon_id.spawnId); - if (i == sEventAIMgr->GetCreatureEventAISummonMap().end()) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: failed to spawn creature %u. Summon map index %u does not exist. EventID %d. CreatureID %d", action.summon_id.creatureId, action.summon_id.spawnId, eventId, me->GetEntry()); - return; - } - - Creature* creature = NULL; - if ((*i).second.SpawnTimeSecs) - creature = me->SummonCreature(action.summon_id.creatureId, (*i).second.position_x, (*i).second.position_y, (*i).second.position_z, (*i).second.orientation, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, (*i).second.SpawnTimeSecs); - else - creature = me->SummonCreature(action.summon_id.creatureId, (*i).second.position_x, (*i).second.position_y, (*i).second.position_z, (*i).second.orientation, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0); - - if (!creature) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: failed to spawn creature %u. EventId %d.Creature %d", action.summon_id.creatureId, eventId, me->GetEntry()); - else if (action.summon_id.target != TARGET_T_SELF && target) - creature->AI()->AttackStart(target); - - break; - } - case ACTION_T_KILLED_MONSTER: - //first attempt player who tapped creature - if (Player* player = me->GetLootRecipient()) - player->RewardPlayerAndGroupAtEvent(action.killed_monster.creatureId, player); // player as param is a hacky solution not to use GUID - else - { - //if not available, use actionInvoker - if (Unit* target = GetTargetByType(action.killed_monster.target, actionInvoker)) - if (Player* player2 = target->GetCharmerOrOwnerPlayerOrPlayerItself()) - player2->RewardPlayerAndGroupAtEvent(action.killed_monster.creatureId, player2); - } - break; - case ACTION_T_SET_INST_DATA: - { - InstanceScript* instance = me->GetInstanceScript(); - if (!instance) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d attempt to set instance data without instance script. Creature %d", eventId, me->GetEntry()); - return; - } - - instance->SetData(action.set_inst_data.field, action.set_inst_data.value); - break; - } - case ACTION_T_SET_INST_DATA64: - { - Unit* target = GetTargetByType(action.set_inst_data64.target, actionInvoker); - if (!target) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d attempt to set instance data64 but Target == NULL. Creature %d", eventId, me->GetEntry()); - return; - } - - InstanceScript* instance = me->GetInstanceScript(); - if (!instance) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d attempt to set instance data64 without instance script. Creature %d", eventId, me->GetEntry()); - return; - } - - instance->SetData64(action.set_inst_data64.field, target->GetGUID()); - break; - } - case ACTION_T_UPDATE_TEMPLATE: - if (me->GetEntry() == action.update_template.creatureId) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d ACTION_T_UPDATE_TEMPLATE call with param1 == current entry. Creature %d", eventId, me->GetEntry()); - return; - } - - me->UpdateEntry(action.update_template.creatureId, action.update_template.team ? HORDE : ALLIANCE); - break; - case ACTION_T_DIE: - if (me->isDead()) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %d ACTION_T_DIE on dead creature. Creature %d", eventId, me->GetEntry()); - return; - } - me->Kill(me); - break; - case ACTION_T_ZONE_COMBAT_PULSE: - { - me->SetInCombatWithZone(); - break; - } - case ACTION_T_CALL_FOR_HELP: - { - me->CallForHelp((float)action.call_for_help.radius); - break; - } - break; - - // TRINITY ONLY - case ACTION_T_MOVE_RANDOM_POINT: //dosen't work in combat - { - float x, y, z; - me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, (float)action.raw.param1); - me->GetMotionMaster()->MovePoint(0, x, y, z); - break; - } - case ACTION_T_SET_STAND_STATE: - me->SetStandState(UnitStandStateType(action.raw.param1)); - break; - case ACTION_T_SET_PHASE_MASK: - me->SetPhaseMask(action.raw.param1, true); - break; - case ACTION_T_SET_VISIBILITY: - me->SetVisible(bool(action.raw.param1)); - break; - case ACTION_T_SET_ACTIVE: - me->setActive(action.raw.param1 ? true : false); - break; - case ACTION_T_SET_AGGRESSIVE: - me->SetReactState(ReactStates(action.raw.param1)); - break; - case ACTION_T_ATTACK_START_PULSE: - AttackStart(me->SelectNearestTarget((float)action.raw.param1)); - break; - case ACTION_T_SUMMON_GO: - { - GameObject* object = NULL; - - float x, y, z; - me->GetPosition(x, y, z); - object = me->SummonGameObject(action.raw.param1, x, y, z, 0, 0, 0, 0, 0, action.raw.param2); - if (!object) - { - sLog->outError(LOG_FILTER_TSCR, "EventAI failed to spawn object %u. Spawn event %d is on creature %d", action.raw.param1, eventId, me->GetEntry()); - } - break; - } - - case ACTION_T_SET_SHEATH: - { - me->SetSheath(SheathState(action.set_sheath.sheath)); - break; - } - case ACTION_T_FORCE_DESPAWN: - { - me->DespawnOrUnsummon(action.forced_despawn.msDelay); - break; - } - case ACTION_T_SET_INVINCIBILITY_HP_LEVEL: - { - if (action.invincibility_hp_level.is_percent) - m_InvincibilityHpLevel = me->CountPctFromMaxHealth(action.invincibility_hp_level.hp_level); - else - m_InvincibilityHpLevel = action.invincibility_hp_level.hp_level; - break; - } - case ACTION_T_MOUNT_TO_ENTRY_OR_MODEL: - { - if (action.mount.creatureId || action.mount.modelId) - { - // set model based on entry from creature_template - if (action.mount.creatureId) - { - if (CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(action.mount.creatureId)) - { - uint32 display_id = sObjectMgr->ChooseDisplayId(0, cInfo); - me->Mount(display_id); - } - } - //if no param1, then use value from param2 (modelId) - else - me->Mount(action.mount.modelId); - } - else - me->Dismount(); - - break; - } - default: - break; - } -} - -void CreatureEventAI::JustRespawned() -{ - Reset(); - - if (m_bEmptyList) - return; - - //Handle Spawned Events - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - if (SpawnedEventConditionsCheck((*i).Event)) - ProcessEvent(*i); -} - -void CreatureEventAI::Reset() -{ - m_EventUpdateTime = EVENT_UPDATE_TIME; - m_EventDiff = 0; - - if (m_bEmptyList) - return; - - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - if ((*i).Event.event_type == EVENT_T_RESET) - ProcessEvent(*i); - } - - //Reset all events to enabled - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - CreatureEventAI_Event const& event = (*i).Event; - switch (event.event_type) - { - //Reset all out of combat timers - case EVENT_T_TIMER_OOC: - { - if ((*i).UpdateRepeatTimer(me, event.timer.initialMin, event.timer.initialMax)) - (*i).Enabled = true; - break; - } - //default: - //TODO: enable below code line / verify this is correct to enable events previously disabled (ex. aggro yell), instead of enable this in void EnterCombat() - //(*i).Enabled = true; - //(*i).Time = 0; - //break; - } - } -} - -void CreatureEventAI::JustReachedHome() -{ - if (!m_bEmptyList) - { - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - if ((*i).Event.event_type == EVENT_T_REACHED_HOME) - ProcessEvent(*i); - } - } - - Reset(); -} - -void CreatureEventAI::EnterEvadeMode() -{ - CreatureAI::EnterEvadeMode(); - - if (m_bEmptyList) - return; - - //Handle Evade events - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - if ((*i).Event.event_type == EVENT_T_EVADE) - ProcessEvent(*i); - } -} - -void CreatureEventAI::JustDied(Unit* killer) -{ - Reset(); - - if (m_bEmptyList) - return; - - //Handle Evade events - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - if ((*i).Event.event_type == EVENT_T_DEATH) - ProcessEvent(*i, killer); - } - - // reset phase after any death state events - m_Phase = 0; -} - -void CreatureEventAI::KilledUnit(Unit* victim) -{ - if (m_bEmptyList || victim->GetTypeId() != TYPEID_PLAYER) - return; - - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - if ((*i).Event.event_type == EVENT_T_KILL) - ProcessEvent(*i, victim); - } -} - -void CreatureEventAI::JustSummoned(Creature* unit) -{ - if (m_bEmptyList || !unit) - return; - - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - if ((*i).Event.event_type == EVENT_T_SUMMONED_UNIT) - ProcessEvent(*i, unit); - } -} - -void CreatureEventAI::EnterCombat(Unit* enemy) -{ - //Check for on combat start events - if (!m_bEmptyList) - { - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - CreatureEventAI_Event const& event = (*i).Event; - switch (event.event_type) - { - case EVENT_T_AGGRO: - (*i).Enabled = true; - ProcessEvent(*i, enemy); - break; - //Reset all in combat timers - case EVENT_T_TIMER: - if ((*i).UpdateRepeatTimer(me, event.timer.initialMin, event.timer.initialMax)) - (*i).Enabled = true; - break; - //All normal events need to be re-enabled and their time set to 0 - default: - (*i).Enabled = true; - (*i).Time = 0; - break; - } - } - } - - m_EventUpdateTime = EVENT_UPDATE_TIME; - m_EventDiff = 0; -} - -void CreatureEventAI::AttackStart(Unit* who) -{ - if (!who) - return; - - if (me->Attack(who, m_MeleeEnabled)) - { - if (m_CombatMovementEnabled) - { - me->GetMotionMaster()->MoveChase(who, m_AttackDistance, m_AttackAngle); - } - else - { - me->GetMotionMaster()->MoveIdle(); - } - } -} - -void CreatureEventAI::MoveInLineOfSight(Unit* who) -{ - if (me->getVictim()) - return; - - //Check for OOC LOS Event - if (!m_bEmptyList) - { - for (CreatureEventAIList::iterator itr = m_CreatureEventAIList.begin(); itr != m_CreatureEventAIList.end(); ++itr) - { - if ((*itr).Event.event_type == EVENT_T_OOC_LOS) - { - //can trigger if closer than fMaxAllowedRange - float fMaxAllowedRange = (float)((*itr).Event.ooc_los.maxRange); - - //if range is ok and we are actually in LOS - if (me->IsWithinDistInMap(who, fMaxAllowedRange) && me->IsWithinLOSInMap(who)) - { - //if friendly event&&who is not hostile OR hostile event&&who is hostile - if (((*itr).Event.ooc_los.noHostile && !me->IsHostileTo(who)) || - ((!(*itr).Event.ooc_los.noHostile) && me->IsHostileTo(who))) - ProcessEvent(*itr, who); - } - } - } - } - - CreatureAI::MoveInLineOfSight(who); -} - -void CreatureEventAI::SpellHit(Unit* unit, const SpellInfo* spell) -{ - if (m_bEmptyList) - return; - - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - if ((*i).Event.event_type == EVENT_T_SPELLHIT) - //If spell id matches (or no spell id) & if spell school matches (or no spell school) - if (!(*i).Event.spell_hit.spellId || spell->Id == (*i).Event.spell_hit.spellId) - if (spell->SchoolMask & (*i).Event.spell_hit.schoolMask) - ProcessEvent(*i, unit); -} - -void CreatureEventAI::UpdateAI(const uint32 diff) -{ - //Check if we are in combat (also updates calls threat update code) - bool Combat = UpdateVictim(); - - if (!m_bEmptyList) - { - //Events are only updated once every EVENT_UPDATE_TIME ms to prevent lag with large amount of events - if (m_EventUpdateTime <= diff) - { - m_EventDiff += diff; - - //Check for time based events - for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i) - { - //Decrement Timers - if ((*i).Time) - { - if (m_EventDiff <= (*i).Time) - { - //Do not decrement timers if event cannot trigger in this phase - if (!((*i).Event.event_inverse_phase_mask & (1 << m_Phase))) - (*i).Time -= m_EventDiff; - - //Skip processing of events that have time remaining - continue; - } - else (*i).Time = 0; - } - - //Events that are updated every EVENT_UPDATE_TIME - switch ((*i).Event.event_type) - { - case EVENT_T_TIMER_OOC: - ProcessEvent(*i); - break; - case EVENT_T_TIMER: - case EVENT_T_MANA: - case EVENT_T_HP: - case EVENT_T_TARGET_HP: - case EVENT_T_TARGET_CASTING: - case EVENT_T_FRIENDLY_HP: - if (me->getVictim()) - ProcessEvent(*i); - break; - case EVENT_T_RANGE: - if (me->getVictim()) - if (me->IsInMap(me->getVictim()) && me->InSamePhase(me->getVictim())) - if (me->IsInRange(me->getVictim(), (float)(*i).Event.range.minDist, (float)(*i).Event.range.maxDist)) - ProcessEvent(*i); - break; - default: - break; - } - } - - m_EventDiff = 0; - m_EventUpdateTime = EVENT_UPDATE_TIME; - } - else - { - m_EventDiff += diff; - m_EventUpdateTime -= diff; - } - } - - //Melee Auto-Attack - if (Combat && m_MeleeEnabled) - DoMeleeAttackIfReady(); -} - -inline uint32 CreatureEventAI::GetRandActionParam(uint32 rnd, uint32 param1, uint32 param2, uint32 param3) -{ - switch (rnd % 3) - { - case 0: return param1; - case 1: return param2; - case 2: return param3; - } - return 0; -} - -inline int32 CreatureEventAI::GetRandActionParam(uint32 rnd, int32 param1, int32 param2, int32 param3) -{ - switch (rnd % 3) - { - case 0: return param1; - case 1: return param2; - case 2: return param3; - } - return 0; -} - -inline Unit* CreatureEventAI::GetTargetByType(uint32 target, Unit* actionInvoker) -{ - switch (target) - { - case TARGET_T_SELF: - return me; - case TARGET_T_HOSTILE: - return me->getVictim(); - case TARGET_T_HOSTILE_SECOND_AGGRO: - return SelectTarget(SELECT_TARGET_TOPAGGRO, 1); - case TARGET_T_HOSTILE_LAST_AGGRO: - return SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0); - case TARGET_T_HOSTILE_RANDOM: - return SelectTarget(SELECT_TARGET_RANDOM, 0); - case TARGET_T_HOSTILE_RANDOM_NOT_TOP: - return SelectTarget(SELECT_TARGET_RANDOM, 1); - case TARGET_T_ACTION_INVOKER: - return actionInvoker; - default: - return NULL; - }; -} - -Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 minHPDiff) -{ - CellCoord p(Trinity::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Unit* unit = NULL; - - Trinity::MostHPMissingInRange u_check(me, range, minHPDiff); - Trinity::UnitLastSearcher searcher(me, unit, u_check); - - /* - typedef TYPELIST_4(GameObject, Creature*except pets*, DynamicObject, Corpse*Bones*) AllGridObjectTypes; - This means that if we only search grid then we cannot possibly return pets or players so this is safe - */ - TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); - - cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, range); - return unit; -} - -void CreatureEventAI::DoFindFriendlyCC(std::list& _list, float range) -{ - CellCoord p(Trinity::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Trinity::FriendlyCCedInRange u_check(me, range); - Trinity::CreatureListSearcher searcher(me, _list, u_check); - - TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); - - cell.Visit(p, grid_creature_searcher, *me->GetMap(), *me, range); -} - -void CreatureEventAI::DoFindFriendlyMissingBuff(std::list& _list, float range, uint32 spellid) -{ - CellCoord p(Trinity::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Trinity::FriendlyMissingBuffInRange u_check(me, range, spellid); - Trinity::CreatureListSearcher searcher(me, _list, u_check); - - TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); - - cell.Visit(p, grid_creature_searcher, *me->GetMap(), *me, range); -} - -// ********************************* -// *** Functions used globally *** - -void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* source, Unit* target) -{ - if (!source) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText entry %i, invalid Source pointer.", textEntry); - return; - } - - if (textEntry >= 0) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText with source entry %u (TypeId=%u, guid=%u) attempts to process text entry %i, but text entry must be negative.", source->GetEntry(), source->GetTypeId(), source->GetGUIDLow(), textEntry); - return; - } - - CreatureEventAI_TextMap::const_iterator i = sEventAIMgr->GetCreatureEventAITextMap().find(textEntry); - - if (i == sEventAIMgr->GetCreatureEventAITextMap().end()) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText with source entry %u (TypeId=%u, guid=%u) could not find text entry %i.", source->GetEntry(), source->GetTypeId(), source->GetGUIDLow(), textEntry); - return; - } - - sLog->outDebug(LOG_FILTER_DATABASE_AI, "CreatureEventAI: DoScriptText: text entry=%i, Sound=%u, Type=%u, Language=%u, Emote=%u", textEntry, (*i).second.SoundId, (*i).second.Type, (*i).second.Language, (*i).second.Emote); - - if ((*i).second.SoundId) - { - if (sSoundEntriesStore.LookupEntry((*i).second.SoundId)) - source->PlayDirectSound((*i).second.SoundId); - else - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText entry %i tried to process invalid sound id %u.", textEntry, (*i).second.SoundId); - } - - if ((*i).second.Emote) - { - if (source->GetTypeId() == TYPEID_UNIT || source->GetTypeId() == TYPEID_PLAYER) - { - ((Unit*)source)->HandleEmoteCommand((*i).second.Emote); - } - else - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText entry %i tried to process emote for invalid TypeId (%u).", textEntry, source->GetTypeId()); - } - - switch ((*i).second.Type) - { - case CHAT_TYPE_SAY: - source->MonsterSay(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); - break; - case CHAT_TYPE_YELL: - source->MonsterYell(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); - break; - case CHAT_TYPE_TEXT_EMOTE: - source->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0); - break; - case CHAT_TYPE_BOSS_EMOTE: - source->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0, true); - break; - case CHAT_TYPE_WHISPER: - { - if (target && target->GetTypeId() == TYPEID_PLAYER) - source->MonsterWhisper(textEntry, target->GetGUID()); - else sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry); - }break; - case CHAT_TYPE_BOSS_WHISPER: - { - if (target && target->GetTypeId() == TYPEID_PLAYER) - source->MonsterWhisper(textEntry, target->GetGUID(), true); - else sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry); - }break; - case CHAT_TYPE_ZONE_YELL: - source->MonsterYellToZone(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); - break; - } -} - -bool CreatureEventAI::CanCast(Unit* target, SpellInfo const* spell, bool triggered) -{ - //No target so we can't cast - if (!target || !spell) - return false; - - //Silenced so we can't cast - if (!triggered && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED)) - return false; - - //Check for power - if (!triggered && (uint32)me->GetPower((Powers)spell->PowerType) < spell->CalcPowerCost(me, spell->GetSchoolMask())) - return false; - - //Unit is out of range of this spell - if (!me->IsInRange(target, spell->GetMinRange(false), spell->GetMaxRange(false))) - return false; - - return true; -} - -void CreatureEventAI::ReceiveEmote(Player* player, uint32 textEmote) -{ - if (m_bEmptyList) - return; - - for (CreatureEventAIList::iterator itr = m_CreatureEventAIList.begin(); itr != m_CreatureEventAIList.end(); ++itr) - { - if ((*itr).Event.event_type == EVENT_T_RECEIVE_EMOTE) - { - if ((*itr).Event.receive_emote.emoteId != textEmote) - return; - - Condition cond; - cond.ConditionType = ConditionTypes((*itr).Event.receive_emote.condition); - cond.ConditionValue1 = (*itr).Event.receive_emote.conditionValue1; - cond.ConditionValue2 = (*itr).Event.receive_emote.conditionValue2; - - ConditionSourceInfo srcInfo = ConditionSourceInfo(player); - if (cond.Meets(srcInfo)) - { - sLog->outDebug(LOG_FILTER_DATABASE_AI, "CreatureEventAI: ReceiveEmote CreatureEventAI: Condition ok, processing"); - ProcessEvent(*itr, player); - } - } - } -} - -void CreatureEventAI::DamageTaken(Unit* /*done_by*/, uint32& damage) -{ - if (m_InvincibilityHpLevel > 0 && me->GetHealth() < m_InvincibilityHpLevel+damage) - { - if (me->GetHealth() <= m_InvincibilityHpLevel) - damage = 0; - else - damage = me->GetHealth() - m_InvincibilityHpLevel; - } -} - -bool CreatureEventAI::SpawnedEventConditionsCheck(CreatureEventAI_Event const& event) -{ - if (event.event_type != EVENT_T_SPAWNED) - return false; - - switch (event.spawned.condition) - { - case SPAWNED_EVENT_ALWAY: - // always - return true; - case SPAWNED_EVENT_MAP: - // map ID check - return me->GetMapId() == event.spawned.conditionValue1; - case SPAWNED_EVENT_ZONE: - { - // zone ID check - uint32 zone, area; - me->GetZoneAndAreaId(zone, area); - return zone == event.spawned.conditionValue1 || area == event.spawned.conditionValue1; - } - default: - break; - } - - return false; -} diff --git a/src/server/game/AI/EventAI/CreatureEventAI.h b/src/server/game/AI/EventAI/CreatureEventAI.h deleted file mode 100755 index b9e1ae32be4..00000000000 --- a/src/server/game/AI/EventAI/CreatureEventAI.h +++ /dev/null @@ -1,645 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TRINITY_CREATURE_EAI_H -#define TRINITY_CREATURE_EAI_H - -#include "Common.h" -#include "Creature.h" -#include "CreatureAI.h" -#include "Unit.h" - -class Player; -class WorldObject; - -#define EVENT_UPDATE_TIME 500 -#define MAX_ACTIONS 3 -#define MAX_PHASE 32 - -enum EventAI_Type -{ - EVENT_T_TIMER = 0, // InitialMin, InitialMax, RepeatMin, RepeatMax - EVENT_T_TIMER_OOC = 1, // InitialMin, InitialMax, RepeatMin, RepeatMax - EVENT_T_HP = 2, // HPMax%, HPMin%, RepeatMin, RepeatMax - EVENT_T_MANA = 3, // ManaMax%, ManaMin% RepeatMin, RepeatMax - EVENT_T_AGGRO = 4, // NONE - EVENT_T_KILL = 5, // RepeatMin, RepeatMax - EVENT_T_DEATH = 6, // NONE - EVENT_T_EVADE = 7, // NONE - EVENT_T_SPELLHIT = 8, // SpellID, School, RepeatMin, RepeatMax - EVENT_T_RANGE = 9, // MinDist, MaxDist, RepeatMin, RepeatMax - EVENT_T_OOC_LOS = 10, // NoHostile, MaxRnage, RepeatMin, RepeatMax - EVENT_T_SPAWNED = 11, // Condition, CondValue1 - EVENT_T_TARGET_HP = 12, // HPMax%, HPMin%, RepeatMin, RepeatMax - EVENT_T_TARGET_CASTING = 13, // RepeatMin, RepeatMax - EVENT_T_FRIENDLY_HP = 14, // HPDeficit, Radius, RepeatMin, RepeatMax - EVENT_T_FRIENDLY_IS_CC = 15, // DispelType, Radius, RepeatMin, RepeatMax - EVENT_T_FRIENDLY_MISSING_BUFF = 16, // SpellId, Radius, RepeatMin, RepeatMax - EVENT_T_SUMMONED_UNIT = 17, // CreatureId, RepeatMin, RepeatMax - EVENT_T_TARGET_MANA = 18, // ManaMax%, ManaMin%, RepeatMin, RepeatMax - EVENT_T_QUEST_ACCEPT = 19, // QuestID - EVENT_T_QUEST_COMPLETE = 20, // - EVENT_T_REACHED_HOME = 21, // NONE - EVENT_T_RECEIVE_EMOTE = 22, // EmoteId, Condition, CondValue1, CondValue2 - EVENT_T_BUFFED = 23, // Param1 = SpellID, Param2 = Number of Time STacked, Param3/4 Repeat Min/Max - EVENT_T_TARGET_BUFFED = 24, // Param1 = SpellID, Param2 = Number of Time STacked, Param3/4 Repeat Min/Max - EVENT_T_RESET = 35, // Is it called after combat, when the creature respawn and spawn. -- TRINITY ONLY - - EVENT_T_END, -}; - -enum EventAI_ActionType -{ - ACTION_T_NONE = 0, // No action - ACTION_T_TEXT = 1, // TextId1, optionally -TextId2, optionally -TextId3(if -TextId2 exist). If more than just -TextId1 is defined, randomize. Negative values. - ACTION_T_SET_FACTION = 2, // FactionId (or 0 for default) - ACTION_T_MORPH_TO_ENTRY_OR_MODEL = 3, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to demorph) - ACTION_T_SOUND = 4, // SoundId - ACTION_T_EMOTE = 5, // EmoteId - ACTION_T_RANDOM_SAY = 6, // UNUSED - ACTION_T_RANDOM_YELL = 7, // UNUSED - ACTION_T_RANDOM_TEXTEMOTE = 8, // UNUSED - ACTION_T_RANDOM_SOUND = 9, // SoundId1, SoundId2, SoundId3 (-1 in any field means no output if randomed that field) - ACTION_T_RANDOM_EMOTE = 10, // EmoteId1, EmoteId2, EmoteId3 (-1 in any field means no output if randomed that field) - ACTION_T_CAST = 11, // SpellId, Target, CastFlags - ACTION_T_SUMMON = 12, // CreatureID, Target, Duration in ms - ACTION_T_THREAT_SINGLE_PCT = 13, // Threat%, Target - ACTION_T_THREAT_ALL_PCT = 14, // Threat% - ACTION_T_QUEST_EVENT = 15, // QuestID, Target - ACTION_T_CAST_EVENT = 16, // QuestID, SpellId, Target - must be removed as hack? - ACTION_T_SET_UNIT_FIELD = 17, // Field_Number, Value, Target - ACTION_T_SET_UNIT_FLAG = 18, // Flags (may be more than one field OR'd together), Target - ACTION_T_REMOVE_UNIT_FLAG = 19, // Flags (may be more than one field OR'd together), Target - ACTION_T_AUTO_ATTACK = 20, // AllowAttackState (0 = stop attack, anything else means continue attacking) - ACTION_T_COMBAT_MOVEMENT = 21, // AllowCombatMovement (0 = stop combat based movement, anything else continue attacking) - ACTION_T_SET_PHASE = 22, // Phase - ACTION_T_INC_PHASE = 23, // Value (may be negative to decrement phase, should not be 0) - ACTION_T_EVADE = 24, // No Params - ACTION_T_FLEE_FOR_ASSIST = 25, // No Params - ACTION_T_QUEST_EVENT_ALL = 26, // QuestID - ACTION_T_CAST_EVENT_ALL = 27, // CreatureId, SpellId - ACTION_T_REMOVEAURASFROMSPELL = 28, // Target, Spellid - ACTION_T_RANGED_MOVEMENT = 29, // Distance, Angle - ACTION_T_RANDOM_PHASE = 30, // PhaseId1, PhaseId2, PhaseId3 - ACTION_T_RANDOM_PHASE_RANGE = 31, // PhaseMin, PhaseMax - ACTION_T_SUMMON_ID = 32, // CreatureId, Target, SpawnId - ACTION_T_KILLED_MONSTER = 33, // CreatureId, Target - ACTION_T_SET_INST_DATA = 34, // Field, Data - ACTION_T_SET_INST_DATA64 = 35, // Field, Target - ACTION_T_UPDATE_TEMPLATE = 36, // Entry, Team - ACTION_T_DIE = 37, // No Params - ACTION_T_ZONE_COMBAT_PULSE = 38, // No Params - ACTION_T_CALL_FOR_HELP = 39, // Radius - ACTION_T_SET_SHEATH = 40, // Sheath (0-passive, 1-melee, 2-ranged) - ACTION_T_FORCE_DESPAWN = 41, // No Params - ACTION_T_SET_INVINCIBILITY_HP_LEVEL = 42, // MinHpValue, format(0-flat, 1-percent from max health) - ACTION_T_MOUNT_TO_ENTRY_OR_MODEL = 43, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to dismount) - - ACTION_T_SET_PHASE_MASK = 97, - ACTION_T_SET_STAND_STATE = 98, - ACTION_T_MOVE_RANDOM_POINT = 99, - ACTION_T_SET_VISIBILITY = 100, - ACTION_T_SET_ACTIVE = 101, //Apply - ACTION_T_SET_AGGRESSIVE = 102, //Apply - ACTION_T_ATTACK_START_PULSE = 103, //Distance - ACTION_T_SUMMON_GO = 104, //GameObjectID, DespawnTime in ms - - ACTION_T_END = 105, -}; - -enum Target -{ - //Self (me) - TARGET_T_SELF = 0, //Self cast - - //Hostile targets (if pet then returns pet owner) - TARGET_T_HOSTILE, //Our current target (ie: highest aggro) - TARGET_T_HOSTILE_SECOND_AGGRO, //Second highest aggro (generaly used for cleaves and some special attacks) - TARGET_T_HOSTILE_LAST_AGGRO, //Dead last on aggro (no idea what this could be used for) - TARGET_T_HOSTILE_RANDOM, //Just any random target on our threat list - TARGET_T_HOSTILE_RANDOM_NOT_TOP, //Any random target except top threat - - //Invoker targets (if pet then returns pet owner) - TARGET_T_ACTION_INVOKER, //Unit who caused this Event to occur (only works for EVENT_T_AGGRO, EVENT_T_KILL, EVENT_T_DEATH, EVENT_T_SPELLHIT, EVENT_T_OOC_LOS, EVENT_T_FRIENDLY_HP, EVENT_T_FRIENDLY_IS_CC, EVENT_T_FRIENDLY_MISSING_BUFF) - - //Hostile targets (including pets) - TARGET_T_HOSTILE_WPET, //Current target (can be a pet) - TARGET_T_HOSTILE_WPET_SECOND_AGGRO, //Second highest aggro (generaly used for cleaves and some special attacks) - TARGET_T_HOSTILE_WPET_LAST_AGGRO, //Dead last on aggro (no idea what this could be used for) - TARGET_T_HOSTILE_WPET_RANDOM, //Just any random target on our threat list - TARGET_T_HOSTILE_WPET_RANDOM_NOT_TOP, //Any random target except top threat - - TARGET_T_ACTION_INVOKER_WPET, - - TARGET_T_END -}; - -enum CastFlags -{ - CAST_INTERRUPT_PREVIOUS = 0x01, //Interrupt any spell casting - CAST_TRIGGERED = 0x02, //Triggered (this makes spell cost zero mana and have no cast time) - CAST_FORCE_CAST = 0x04, //Forces cast even if creature is out of mana or out of range - CAST_NO_MELEE_IF_OOM = 0x08, //Prevents creature from entering melee if out of mana or out of range - CAST_FORCE_TARGET_SELF = 0x10, //Forces the target to cast this spell on itself - CAST_AURA_NOT_PRESENT = 0x20, //Only casts the spell if the target does not have an aura from the spell -}; - -enum EventFlags -{ - EFLAG_REPEATABLE = 0x01, //Event repeats - EFLAG_DIFFICULTY_0 = 0x02, //Event only occurs in instance difficulty 0 - EFLAG_DIFFICULTY_1 = 0x04, //Event only occurs in instance difficulty 1 - EFLAG_DIFFICULTY_2 = 0x08, //Event only occurs in instance difficulty 2 - EFLAG_DIFFICULTY_3 = 0x10, //Event only occurs in instance difficulty 3 - EFLAG_RESERVED_5 = 0x20, - EFLAG_RESERVED_6 = 0x40, - EFLAG_DEBUG_ONLY = 0x80, //Event only occurs in debug build - - EFLAG_DIFFICULTY_ALL = (EFLAG_DIFFICULTY_0|EFLAG_DIFFICULTY_1|EFLAG_DIFFICULTY_2|EFLAG_DIFFICULTY_3) -}; - -enum SpawnedEventMode -{ - SPAWNED_EVENT_ALWAY = 0, - SPAWNED_EVENT_MAP = 1, - SPAWNED_EVENT_ZONE = 2 -}; - -// String text additional data, used in (CreatureEventAI) -struct StringTextData -{ - uint32 SoundId; - uint8 Type; - uint32 Language; - uint32 Emote; -}; -// Text Maps -typedef UNORDERED_MAP CreatureEventAI_TextMap; - -struct CreatureEventAI_Action -{ - EventAI_ActionType type: 16; - union - { - // ACTION_T_TEXT = 1 - struct - { - int32 TextId1; - int32 TextId2; - int32 TextId3; - } text; - // ACTION_T_SET_FACTION = 2 - struct - { - uint32 factionId; // faction or 0 for default) - } set_faction; - // ACTION_T_MORPH_TO_ENTRY_OR_MODEL = 3 - struct - { - uint32 creatureId; // set one from fields (or 0 for both to demorph) - uint32 modelId; - } morph; - // ACTION_T_SOUND = 4 - struct - { - uint32 soundId; - } sound; - // ACTION_T_EMOTE = 5 - struct - { - uint32 emoteId; - } emote; - // ACTION_T_RANDOM_SOUND = 9 - struct - { - int32 soundId1; // (-1 in any field means no output if randomed that field) - int32 soundId2; - int32 soundId3; - } random_sound; - // ACTION_T_RANDOM_EMOTE = 10 - struct - { - int32 emoteId1; // (-1 in any field means no output if randomed that field) - int32 emoteId2; - int32 emoteId3; - } random_emote; - // ACTION_T_CAST = 11 - struct - { - uint32 spellId; - uint32 target; - uint32 castFlags; - } cast; - // ACTION_T_SUMMON = 12 - struct - { - uint32 creatureId; - uint32 target; - uint32 duration; - } summon; - // ACTION_T_THREAT_SINGLE_PCT = 13 - struct - { - int32 percent; - uint32 target; - } threat_single_pct; - // ACTION_T_THREAT_ALL_PCT = 14 - struct - { - int32 percent; - } threat_all_pct; - // ACTION_T_QUEST_EVENT = 15 - struct - { - uint32 questId; - uint32 target; - } quest_event; - // ACTION_T_CAST_EVENT = 16 - struct - { - uint32 creatureId; - uint32 spellId; - uint32 target; - } cast_event; - // ACTION_T_SET_UNIT_FIELD = 17 - struct - { - uint32 field; - uint32 value; - uint32 target; - } set_unit_field; - // ACTION_T_SET_UNIT_FLAG = 18, // value provided mask bits that will be set - // ACTION_T_REMOVE_UNIT_FLAG = 19, // value provided mask bits that will be clear - struct - { - uint32 value; - uint32 target; - } unit_flag; - // ACTION_T_AUTO_ATTACK = 20 - struct - { - uint32 state; // 0 = stop attack, anything else means continue attacking - } auto_attack; - // ACTION_T_COMBAT_MOVEMENT = 21 - struct - { - uint32 state; // 0 = stop combat based movement, anything else continue attacking - uint32 melee; // if set: at stop send melee combat stop if in combat, use for terminate melee fighting state for switch to ranged - } combat_movement; - // ACTION_T_SET_PHASE = 22 - struct - { - uint32 phase; - } set_phase; - // ACTION_T_INC_PHASE = 23 - struct - { - int32 step; - } set_inc_phase; - // ACTION_T_QUEST_EVENT_ALL = 26 - struct - { - uint32 questId; - } quest_event_all; - // ACTION_T_CAST_EVENT_ALL = 27 - struct - { - uint32 creatureId; - uint32 spellId; - } cast_event_all; - // ACTION_T_REMOVEAURASFROMSPELL = 28 - struct - { - uint32 target; - uint32 spellId; - } remove_aura; - // ACTION_T_RANGED_MOVEMENT = 29 - struct - { - uint32 distance; - int32 angle; - } ranged_movement; - // ACTION_T_RANDOM_PHASE = 30 - struct - { - uint32 phase1; - uint32 phase2; - uint32 phase3; - } random_phase; - // ACTION_T_RANDOM_PHASE_RANGE = 31 - struct - { - uint32 phaseMin; - uint32 phaseMax; - } random_phase_range; - // ACTION_T_SUMMON_ID = 32 - struct - { - uint32 creatureId; - uint32 target; - uint32 spawnId; - } summon_id; - // ACTION_T_KILLED_MONSTER = 33 - struct - { - uint32 creatureId; - uint32 target; - } killed_monster; - // ACTION_T_SET_INST_DATA = 34 - struct - { - uint32 field; - uint32 value; - } set_inst_data; - // ACTION_T_SET_INST_DATA64 = 35 - struct - { - uint32 field; - uint32 target; - } set_inst_data64; - // ACTION_T_UPDATE_TEMPLATE = 36 - struct - { - uint32 creatureId; - uint32 team; - } update_template; - // ACTION_T_CALL_FOR_HELP = 39 - struct - { - uint32 radius; - } call_for_help; - // ACTION_T_SET_SHEATH = 40 - struct - { - uint32 sheath; - } set_sheath; - // ACTION_T_FORCE_DESPAWN = 41 - struct - { - uint32 msDelay; - } forced_despawn; - // ACTION_T_SET_INVINCIBILITY_HP_LEVEL = 42 - struct - { - uint32 hp_level; - uint32 is_percent; - } invincibility_hp_level; - // ACTION_T_MOUNT_TO_ENTRY_OR_MODEL = 43 - struct - { - uint32 creatureId; // set one from fields (or 0 for both to dismount) - uint32 modelId; - } mount; - // RAW - struct - { - uint32 param1; - uint32 param2; - uint32 param3; - } raw; - }; -}; - -struct CreatureEventAI_Event -{ - uint32 event_id; - - uint32 creature_id; - - uint32 event_inverse_phase_mask; - - EventAI_Type event_type : 16; - uint8 event_chance : 8; - uint8 event_flags : 8; - - union - { - // EVENT_T_TIMER = 0 - // EVENT_T_TIMER_OOC = 1 - struct - { - uint32 initialMin; - uint32 initialMax; - uint32 repeatMin; - uint32 repeatMax; - } timer; - // EVENT_T_HP = 2 - // EVENT_T_MANA = 3 - // EVENT_T_TARGET_HP = 12 - // EVENT_T_TARGET_MANA = 18 - struct - { - uint32 percentMax; - uint32 percentMin; - uint32 repeatMin; - uint32 repeatMax; - } percent_range; - // EVENT_T_KILL = 5 - struct - { - uint32 repeatMin; - uint32 repeatMax; - } kill; - // EVENT_T_SPELLHIT = 8 - struct - { - uint32 spellId; - uint32 schoolMask; // -1 ( == 0xffffffff) is ok value for full mask, or must be more limited mask like (0 < 1) = 1 for normal/physical school - uint32 repeatMin; - uint32 repeatMax; - } spell_hit; - // EVENT_T_RANGE = 9 - struct - { - uint32 minDist; - uint32 maxDist; - uint32 repeatMin; - uint32 repeatMax; - } range; - // EVENT_T_OOC_LOS = 10 - struct - { - uint32 noHostile; - uint32 maxRange; - uint32 repeatMin; - uint32 repeatMax; - } ooc_los; - // EVENT_T_SPAWNED = 11 - struct - { - uint32 condition; - uint32 conditionValue1; - } spawned; - // EVENT_T_TARGET_CASTING = 13 - struct - { - uint32 repeatMin; - uint32 repeatMax; - } target_casting; - // EVENT_T_FRIENDLY_HP = 14 - struct - { - uint32 hpDeficit; - uint32 radius; - uint32 repeatMin; - uint32 repeatMax; - } friendly_hp; - // EVENT_T_FRIENDLY_IS_CC = 15 - struct - { - uint32 dispelType; // unused ? - uint32 radius; - uint32 repeatMin; - uint32 repeatMax; - } friendly_is_cc; - // EVENT_T_FRIENDLY_MISSING_BUFF = 16 - struct - { - uint32 spellId; - uint32 radius; - uint32 repeatMin; - uint32 repeatMax; - } friendly_buff; - // EVENT_T_SUMMONED_UNIT = 17 - struct - { - uint32 creatureId; - uint32 repeatMin; - uint32 repeatMax; - } summon_unit; - // EVENT_T_QUEST_ACCEPT = 19 - // EVENT_T_QUEST_COMPLETE = 20 - struct - { - uint32 questId; - } quest; - // EVENT_T_RECEIVE_EMOTE = 22 - struct - { - uint32 emoteId; - uint32 condition; - uint32 conditionValue1; - uint32 conditionValue2; - } receive_emote; - // EVENT_T_BUFFED = 23 - // EVENT_T_TARGET_BUFFED = 24 - struct - { - uint32 spellId; - uint32 amount; - uint32 repeatMin; - uint32 repeatMax; - } buffed; - - // RAW - struct - { - uint32 param1; - uint32 param2; - uint32 param3; - uint32 param4; - } raw; - }; - - CreatureEventAI_Action action[MAX_ACTIONS]; -}; -//Event_Map -typedef UNORDERED_MAP > CreatureEventAI_Event_Map; - -struct CreatureEventAI_Summon -{ - //uint32 id; - - float position_x; - float position_y; - float position_z; - float orientation; - uint32 SpawnTimeSecs; -}; - -//EventSummon_Map -typedef UNORDERED_MAP CreatureEventAI_Summon_Map; - -struct CreatureEventAIHolder -{ - CreatureEventAIHolder(CreatureEventAI_Event const& p) : Event(p), Time(0), Enabled(true){} - - CreatureEventAI_Event Event; - uint32 Time; - bool Enabled; - - // helper - bool UpdateRepeatTimer(Creature* creature, uint32 repeatMin, uint32 repeatMax); -}; - -class CreatureEventAI : public CreatureAI -{ - public: - explicit CreatureEventAI(Creature* c); - ~CreatureEventAI() - { - m_CreatureEventAIList.clear(); - } - void JustRespawned(); - void Reset(); - void JustReachedHome(); - void EnterCombat(Unit* enemy); - void EnterEvadeMode(); - void JustDied(Unit* /*killer*/); - void KilledUnit(Unit* victim); - void JustSummoned(Creature* unit); - void AttackStart(Unit* who); - void MoveInLineOfSight(Unit* who); - void SpellHit(Unit* unit, const SpellInfo* spell); - void DamageTaken(Unit* done_by, uint32& damage); - void HealReceived(Unit* /*done_by*/, uint32& /*addhealth*/) {} - void UpdateAI(const uint32 diff); - void ReceiveEmote(Player* player, uint32 textEmote); - static int Permissible(const Creature*); - - bool ProcessEvent(CreatureEventAIHolder& holder, Unit* actionInvoker = NULL); - void ProcessAction(CreatureEventAI_Action const& action, uint32 rnd, uint32 eventId, Unit* actionInvoker); - inline uint32 GetRandActionParam(uint32 rnd, uint32 param1, uint32 param2, uint32 param3); - inline int32 GetRandActionParam(uint32 rnd, int32 param1, int32 param2, int32 param3); - inline Unit* GetTargetByType(uint32 target, Unit* actionInvoker); - - void DoScriptText(int32 textEntry, WorldObject* source, Unit* target); - bool CanCast(Unit* target, SpellInfo const* spell, bool triggered); - - bool SpawnedEventConditionsCheck(CreatureEventAI_Event const& event); - - Unit* DoSelectLowestHpFriendly(float range, uint32 minHPDiff); - void DoFindFriendlyMissingBuff(std::list& _list, float range, uint32 spellid); - void DoFindFriendlyCC(std::list& _list, float range); - - protected: - uint32 m_EventUpdateTime; // Time between event updates - uint32 m_EventDiff; // Time between the last event call - bool m_bEmptyList; - - typedef std::vector CreatureEventAIList; - CreatureEventAIList m_CreatureEventAIList; // Holder for events (stores enabled, time, and eventid) - // Variables used by Events themselves - uint8 m_Phase; // Current phase, max 32 phases - bool m_CombatMovementEnabled; // If we allow targeted movment gen (movement twoards top threat) - bool m_MeleeEnabled; // If we allow melee auto attack - float m_AttackDistance; // Distance to attack from - float m_AttackAngle; // Angle of attack - uint32 m_InvincibilityHpLevel; // Minimal health level allowed at damage apply -}; -#endif diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp deleted file mode 100755 index af25ba6af1d..00000000000 --- a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp +++ /dev/null @@ -1,743 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "Common.h" -#include "DatabaseEnv.h" -#include "CreatureEventAI.h" -#include "CreatureEventAIMgr.h" -#include "ObjectMgr.h" -#include "ObjectDefines.h" -#include "GridDefines.h" -#include "ConditionMgr.h" -#include "SpellMgr.h" -#include "SpellInfo.h" - -// ------------------- -void CreatureEventAIMgr::LoadCreatureEventAI_Texts() -{ - uint32 oldMSTime = getMSTime(); - - // Drop Existing Text Map, only done once and we are ready to add data from multiple sources. - m_CreatureEventAI_TextMap.clear(); - - // Load EventAI Text - sObjectMgr->LoadTrinityStrings("creature_ai_texts", MIN_CREATURE_AI_TEXT_STRING_ID, MAX_CREATURE_AI_TEXT_STRING_ID); - - // Gather Additional data from EventAI Texts 0 1 2 3 4 - QueryResult result = WorldDatabase.Query("SELECT entry, sound, type, language, emote FROM creature_ai_texts"); - - if (!result) - { - sLog->outInfo(LOG_FILTER_GENERAL, ">> Loaded 0 additional CreatureEventAI Texts data. DB table `creature_ai_texts` is empty."); - - return; - } - - uint32 count = 0; - - do - { - Field* fields = result->Fetch(); - StringTextData temp; - - int32 i = fields[0].GetInt32(); - temp.SoundId = fields[1].GetUInt32(); - temp.Type = fields[2].GetUInt8(); - temp.Language = fields[3].GetUInt8(); - temp.Emote = fields[4].GetUInt16(); - - // range negative - if (i > MIN_CREATURE_AI_TEXT_STRING_ID || i <= MAX_CREATURE_AI_TEXT_STRING_ID) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Entry %i in table `creature_ai_texts` is not in valid range(%d-%d)", i, MIN_CREATURE_AI_TEXT_STRING_ID, MAX_CREATURE_AI_TEXT_STRING_ID); - continue; - } - - // range negative (must not happen, loaded from same table) - if (!sObjectMgr->GetTrinityStringLocale(i)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Entry %i in table `creature_ai_texts` not found", i); - continue; - } - - if (temp.SoundId) - { - if (!sSoundEntriesStore.LookupEntry(temp.SoundId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Entry %i in table `creature_ai_texts` has Sound %u but sound does not exist.", i, temp.SoundId); - } - - if (!GetLanguageDescByID(temp.Language)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Entry %i in table `creature_ai_texts` using Language %u but Language does not exist.", i, temp.Language); - - if (temp.Type > CHAT_TYPE_ZONE_YELL) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Entry %i in table `creature_ai_texts` has Type %u but this Chat Type does not exist.", i, temp.Type); - - if (temp.Emote) - { - if (!sEmotesStore.LookupEntry(temp.Emote)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Entry %i in table `creature_ai_texts` has Emote %u but emote does not exist.", i, temp.Emote); - } - - m_CreatureEventAI_TextMap[i] = temp; - ++count; - } - while (result->NextRow()); - - sLog->outInfo(LOG_FILTER_GENERAL, ">> Loaded %u additional CreatureEventAI Texts data in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - -} - -void CreatureEventAIMgr::LoadCreatureEventAI_Summons() -{ - uint32 oldMSTime = getMSTime(); - - //Drop Existing EventSummon Map - m_CreatureEventAI_Summon_Map.clear(); - - // Gather additional data for EventAI - QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, spawntimesecs FROM creature_ai_summons"); - - if (!result) - { - sLog->outInfo(LOG_FILTER_GENERAL, ">> Loaded 0 CreatureEventAI Summon definitions. DB table `creature_ai_summons` is empty."); - - return; - } - - uint32 count = 0; - - do - { - Field* fields = result->Fetch(); - - CreatureEventAI_Summon temp; - - uint32 i = fields[0].GetUInt32(); - temp.position_x = fields[1].GetFloat(); - temp.position_y = fields[2].GetFloat(); - temp.position_z = fields[3].GetFloat(); - temp.orientation = fields[4].GetFloat(); - temp.SpawnTimeSecs = fields[5].GetUInt32(); - - if (!Trinity::IsValidMapCoord(temp.position_x, temp.position_y, temp.position_z, temp.orientation)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Summon id %u have wrong coordinates (%f, %f, %f, %f), skipping.", i, temp.position_x, temp.position_y, temp.position_z, temp.orientation); - continue; - } - - //Add to map - m_CreatureEventAI_Summon_Map[i] = temp; - ++count; - } - while (result->NextRow()); - - sLog->outInfo(LOG_FILTER_GENERAL, ">> Loaded %u CreatureEventAI summon definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - -} - -void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() -{ - uint32 oldMSTime = getMSTime(); - - //Drop Existing EventAI List - m_CreatureEventAI_Event_Map.clear(); - - // Gather event data - QueryResult result = WorldDatabase.Query("SELECT id, creature_id, event_type, event_inverse_phase_mask, event_chance, event_flags, " - "event_param1, event_param2, event_param3, event_param4, " - "action1_type, action1_param1, action1_param2, action1_param3, " - "action2_type, action2_param1, action2_param2, action2_param3, " - "action3_type, action3_param1, action3_param2, action3_param3 " - "FROM creature_ai_scripts"); - - if (!result) - { - sLog->outInfo(LOG_FILTER_GENERAL, ">> Loaded 0 CreatureEventAI scripts. DB table `creature_ai_scripts` is empty."); - - return; - } - - uint32 count = 0; - - do - { - Field* fields = result->Fetch(); - - CreatureEventAI_Event temp; - temp.event_id = EventAI_Type(fields[0].GetUInt32()); - uint32 i = temp.event_id; - - temp.creature_id = fields[1].GetUInt32(); - uint32 creature_id = temp.creature_id; - - uint32 e_type = fields[2].GetUInt8(); - //Report any errors in event - if (e_type >= EVENT_T_END) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u have wrong type (%u), skipping.", i, e_type); - continue; - } - temp.event_type = EventAI_Type(e_type); - - temp.event_inverse_phase_mask = fields[3].GetInt32(); - temp.event_chance = fields[4].GetUInt32(); - temp.event_flags = fields[5].GetUInt32(); - temp.raw.param1 = fields[6].GetInt32(); - temp.raw.param2 = fields[7].GetInt32(); - temp.raw.param3 = fields[8].GetInt32(); - temp.raw.param4 = fields[9].GetInt32(); - - CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(creature_id); - //Creature does not exist in database - if (!cInfo) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u has script for non-existing creature entry (%u), skipping.", i, creature_id); - continue; - } - - // Only on the first script - if (cInfo->AIName != "EventAI" && m_CreatureEventAI_Event_Map[creature_id].empty()) - sLog->outError(LOG_FILTER_SQL, "Creature entry %u has EventAI scripts, but its AIName is not 'EventAI' - possible AI-mismatch?", temp.creature_id); - - //No chance of this event occuring - if (temp.event_chance == 0) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u has 0 percent chance. Event will never trigger!", i); - //Chance above 100, force it to be 100 - else if (temp.event_chance > 100) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event %u with more than 100 percent chance. Adjusting to 100 percent.", temp.creature_id, i); - temp.event_chance = 100; - } - - //Individual event checks - switch (temp.event_type) - { - case EVENT_T_TIMER: - case EVENT_T_TIMER_OOC: - if (temp.timer.initialMax < temp.timer.initialMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using timed event(%u) with param2 < param1 (InitialMax < InitialMin). Event will never repeat.", temp.creature_id, i); - if (temp.timer.repeatMax < temp.timer.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_HP: - case EVENT_T_MANA: - case EVENT_T_TARGET_HP: - case EVENT_T_TARGET_MANA: - if (temp.percent_range.percentMax > 100) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using percentage event(%u) with param2 (MinPercent) > 100. Event will never trigger! ", temp.creature_id, i); - - if (temp.percent_range.percentMax <= temp.percent_range.percentMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using percentage event(%u) with param1 <= param2 (MaxPercent <= MinPercent). Event will never trigger! ", temp.creature_id, i); - - if (temp.event_flags & EFLAG_REPEATABLE && !temp.percent_range.repeatMin && !temp.percent_range.repeatMax) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u has param3 and param4=0 (RepeatMin/RepeatMax) but cannot be repeatable without timers. Removing EFLAG_REPEATABLE for event %u.", temp.creature_id, i); - temp.event_flags &= ~EFLAG_REPEATABLE; - } - break; - case EVENT_T_SPELLHIT: - if (temp.spell_hit.spellId) - { - SpellInfo const* spell = sSpellMgr->GetSpellInfo(temp.spell_hit.spellId); - if (!spell) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.spell_hit.spellId, i); - continue; - } - - if ((temp.spell_hit.schoolMask & spell->SchoolMask) != spell->SchoolMask) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u has param1(spellId %u) but param2 is not -1 and not equal to spell's school mask. Event %u can never trigger.", temp.creature_id, temp.spell_hit.schoolMask, i); - } - - if (!temp.spell_hit.schoolMask) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u is using invalid SpellSchoolMask(%u) defined in event %u.", temp.creature_id, temp.spell_hit.schoolMask, i); - - if (temp.spell_hit.repeatMax < temp.spell_hit.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_RANGE: - if (temp.range.maxDist < temp.range.minDist) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event(%u) with param2 < param1 (MaxDist < MinDist). Event will never repeat.", temp.creature_id, i); - if (temp.range.repeatMax < temp.range.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_OOC_LOS: - if (temp.ooc_los.repeatMax < temp.ooc_los.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_SPAWNED: - switch (temp.spawned.condition) - { - case SPAWNED_EVENT_ALWAY: - break; - case SPAWNED_EVENT_MAP: - if (!sMapStore.LookupEntry(temp.spawned.conditionValue1)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using spawned event(%u) with param1 = %u 'map specific' but with not existed map (%u) in param2. Event will never repeat.", temp.creature_id, i, temp.spawned.condition, temp.spawned.conditionValue1); - break; - case SPAWNED_EVENT_ZONE: - if (!GetAreaEntryByAreaID(temp.spawned.conditionValue1)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using spawned event(%u) with param1 = %u 'area specific' but with not existed area (%u) in param2. Event will never repeat.", temp.creature_id, i, temp.spawned.condition, temp.spawned.conditionValue1); - default: - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using invalid spawned event %u mode (%u) in param1", temp.creature_id, i, temp.spawned.condition); - break; - } - break; - case EVENT_T_FRIENDLY_HP: - if (temp.friendly_hp.repeatMax < temp.friendly_hp.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_FRIENDLY_IS_CC: - if (temp.friendly_is_cc.repeatMax < temp.friendly_is_cc.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_FRIENDLY_MISSING_BUFF: - { - SpellInfo const* spell = sSpellMgr->GetSpellInfo(temp.spell_hit.spellId); - if (!spell) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.spell_hit.spellId, i); - continue; - } - if (temp.friendly_buff.repeatMax < temp.friendly_buff.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - } - case EVENT_T_KILL: - if (temp.kill.repeatMax < temp.kill.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_TARGET_CASTING: - if (temp.target_casting.repeatMax < temp.target_casting.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_SUMMONED_UNIT: - if (!sObjectMgr->GetCreatureTemplate(temp.summon_unit.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event(%u) with not existed creature template id (%u) in param1, skipped.", temp.creature_id, i, temp.summon_unit.creatureId); - if (temp.summon_unit.repeatMax < temp.summon_unit.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - case EVENT_T_QUEST_ACCEPT: - case EVENT_T_QUEST_COMPLETE: - if (!sObjectMgr->GetQuestTemplate(temp.quest.questId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using event(%u) with not existed qyest id (%u) in param1, skipped.", temp.creature_id, i, temp.quest.questId); - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using not implemented event (%u) in event %u.", temp.creature_id, temp.event_id, i); - continue; - - case EVENT_T_AGGRO: - case EVENT_T_DEATH: - case EVENT_T_EVADE: - case EVENT_T_REACHED_HOME: - { - if (temp.event_flags & EFLAG_REPEATABLE) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u has EFLAG_REPEATABLE set. Event can never be repeatable. Removing flag for event %u.", temp.creature_id, i); - temp.event_flags &= ~EFLAG_REPEATABLE; - } - - break; - } - - case EVENT_T_RECEIVE_EMOTE: - { - if (!sEmotesTextStore.LookupEntry(temp.receive_emote.emoteId)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using event %u: param1 (EmoteTextId: %u) are not valid.", temp.creature_id, i, temp.receive_emote.emoteId); - continue; - } - if (temp.receive_emote.condition) - { - Condition cond; - cond.ConditionType = ConditionTypes(temp.receive_emote.condition); - cond.ConditionValue1 = temp.receive_emote.conditionValue1; - cond.ConditionValue2 = temp.receive_emote.conditionValue2; - if (!sConditionMgr->isConditionTypeValid(&cond)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using event %u: param2 (Condition: %u) are not valid.", temp.creature_id, i, temp.receive_emote.condition); - continue; - } - } - - if (!(temp.event_flags & EFLAG_REPEATABLE)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using event %u: EFLAG_REPEATABLE not set. Event must always be repeatable. Flag applied.", temp.creature_id, i); - temp.event_flags |= EFLAG_REPEATABLE; - } - - break; - } - - case EVENT_T_BUFFED: - case EVENT_T_TARGET_BUFFED: - { - SpellInfo const* spell = sSpellMgr->GetSpellInfo(temp.buffed.spellId); - if (!spell) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.spell_hit.spellId, i); - continue; - } - if (temp.buffed.repeatMax < temp.buffed.repeatMin) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); - break; - } - - default: - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Creature %u using not checked at load event (%u) in event %u. Need check code update?", temp.creature_id, temp.event_id, i); - break; - } - - for (uint32 j = 0; j < MAX_ACTIONS; j++) - { - uint16 action_type = fields[10+(j*4)].GetUInt8(); - if (action_type >= ACTION_T_END) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u has incorrect action type (%u), replace by ACTION_T_NONE.", i, j+1, action_type); - temp.action[j].type = ACTION_T_NONE; - continue; - } - - CreatureEventAI_Action& action = temp.action[j]; - - action.type = EventAI_ActionType(action_type); - action.raw.param1 = fields[11+(j*4)].GetInt32(); - action.raw.param2 = fields[12+(j*4)].GetInt32(); - action.raw.param3 = fields[13+(j*4)].GetInt32(); - - //Report any errors in actions - switch (action.type) - { - case ACTION_T_NONE: - break; - case ACTION_T_TEXT: - { - if (action.text.TextId1 < 0) - { - if (m_CreatureEventAI_TextMap.find(action.text.TextId1) == m_CreatureEventAI_TextMap.end()) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param1 refrences non-existing entry in texts table.", i, j+1); - } - if (action.text.TextId2 < 0) - { - if (m_CreatureEventAI_TextMap.find(action.text.TextId2) == m_CreatureEventAI_TextMap.end()) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param2 refrences non-existing entry in texts table.", i, j+1); - - if (!action.text.TextId1) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u has param2, but param1 is not set. Required for randomized text.", i, j+1); - } - if (action.text.TextId3 < 0) - { - if (m_CreatureEventAI_TextMap.find(action.text.TextId3) == m_CreatureEventAI_TextMap.end()) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param3 refrences non-existing entry in texts table.", i, j+1); - - if (!action.text.TextId1 || !action.text.TextId2) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u has param3, but param1 and/or param2 is not set. Required for randomized text.", i, j+1); - } - break; - } - case ACTION_T_SET_FACTION: - if (action.set_faction.factionId !=0 && !sFactionStore.LookupEntry(action.set_faction.factionId)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent FactionId %u.", i, j+1, action.set_faction.factionId); - action.set_faction.factionId = 0; - } - break; - case ACTION_T_MORPH_TO_ENTRY_OR_MODEL: - if (action.morph.creatureId !=0 || action.morph.modelId !=0) - { - if (action.morph.creatureId && !sObjectMgr->GetCreatureTemplate(action.morph.creatureId)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existant Creature entry %u.", i, j+1, action.morph.creatureId); - action.morph.creatureId = 0; - } - - if (action.morph.modelId) - { - if (action.morph.creatureId) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u have unused ModelId %u with also set creature id %u.", i, j+1, action.morph.modelId, action.morph.creatureId); - action.morph.modelId = 0; - } - else if (!sCreatureDisplayInfoStore.LookupEntry(action.morph.modelId)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existant ModelId %u.", i, j+1, action.morph.modelId); - action.morph.modelId = 0; - } - } - } - break; - case ACTION_T_SOUND: - if (!sSoundEntriesStore.LookupEntry(action.sound.soundId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existant SoundID %u.", i, j+1, action.sound.soundId); - break; - case ACTION_T_EMOTE: - if (!sEmotesStore.LookupEntry(action.emote.emoteId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param1 (EmoteId: %u) are not valid.", i, j+1, action.emote.emoteId); - break; - case ACTION_T_RANDOM_SOUND: - if (!sSoundEntriesStore.LookupEntry(action.random_sound.soundId1)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param1 uses non-existant SoundID %u.", i, j+1, action.random_sound.soundId1); - if (action.random_sound.soundId2 >= 0 && !sSoundEntriesStore.LookupEntry(action.random_sound.soundId2)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param2 uses non-existant SoundID %u.", i, j+1, action.random_sound.soundId2); - if (action.random_sound.soundId3 >= 0 && !sSoundEntriesStore.LookupEntry(action.random_sound.soundId3)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param3 uses non-existant SoundID %u.", i, j+1, action.random_sound.soundId3); - break; - case ACTION_T_RANDOM_EMOTE: - if (!sEmotesStore.LookupEntry(action.random_emote.emoteId1)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param1 (EmoteId: %u) are not valid.", i, j+1, action.random_emote.emoteId1); - if (action.random_emote.emoteId2 >= 0 && !sEmotesStore.LookupEntry(action.random_emote.emoteId2)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param2 (EmoteId: %u) are not valid.", i, j+1, action.random_emote.emoteId2); - if (action.random_emote.emoteId3 >= 0 && !sEmotesStore.LookupEntry(action.random_emote.emoteId3)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param3 (EmoteId: %u) are not valid.", i, j+1, action.random_emote.emoteId3); - break; - case ACTION_T_CAST: - { - const SpellInfo* spell = sSpellMgr->GetSpellInfo(action.cast.spellId); - if (!spell) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent SpellID %u.", i, j+1, action.cast.spellId); - /* FIXME: temp.raw.param3 not have event tipes with recovery time in it.... - else - { - if (spell->RecoveryTime > 0 && temp.event_flags & EFLAG_REPEATABLE) - { - //output as debug for now, also because there's no general rule all spells have RecoveryTime - if (temp.event_param3 < spell->RecoveryTime) - sLog->outDebug(LOG_FILTER_NETWORKIO, "CreatureEventAI: Event %u Action %u uses SpellID %u but cooldown is longer(%u) than minumum defined in event param3(%u).", i, j+1, action.cast.spellId, spell->RecoveryTime, temp.event_param3); - } - } - */ - - //Cast is always triggered if target is forced to cast on self - if (action.cast.castFlags & CAST_FORCE_TARGET_SELF) - action.cast.castFlags |= CAST_TRIGGERED; - - if (action.cast.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - } - case ACTION_T_SUMMON: - if (!sObjectMgr->GetCreatureTemplate(action.summon.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent creature entry %u.", i, j+1, action.summon.creatureId); - - if (action.summon.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_THREAT_SINGLE_PCT: - if (std::abs(action.threat_single_pct.percent) > 100) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses invalid percent value %u.", i, j+1, action.threat_single_pct.percent); - if (action.threat_single_pct.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_THREAT_ALL_PCT: - if (std::abs(action.threat_all_pct.percent) > 100) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses invalid percent value %u.", i, j+1, action.threat_all_pct.percent); - break; - case ACTION_T_QUEST_EVENT: - if (Quest const* qid = sObjectMgr->GetQuestTemplate(action.quest_event.questId)) - { - if (!qid->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j+1, action.quest_event.questId); - } - else - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent Quest entry %u.", i, j+1, action.quest_event.questId); - - if (action.quest_event.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - - break; - case ACTION_T_CAST_EVENT: - if (!sObjectMgr->GetCreatureTemplate(action.cast_event.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent creature entry %u.", i, j+1, action.cast_event.creatureId); - if (!sSpellMgr->GetSpellInfo(action.cast_event.spellId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent SpellID %u.", i, j+1, action.cast_event.spellId); - if (action.cast_event.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_SET_UNIT_FIELD: - if (action.set_unit_field.field < OBJECT_END || action.set_unit_field.field >= UNIT_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u param1 (UNIT_FIELD*). Index out of range for intended use.", i, j+1); - if (action.set_unit_field.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_SET_UNIT_FLAG: - case ACTION_T_REMOVE_UNIT_FLAG: - if (action.unit_flag.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_SET_PHASE: - if (action.set_phase.phase >= MAX_PHASE) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phase >= %u. Phase mask cannot be used past phase %u.", i, j+1, MAX_PHASE, MAX_PHASE-1); - break; - case ACTION_T_INC_PHASE: - if (action.set_inc_phase.step == 0) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u is incrementing phase by 0. Was this intended?", i, j+1); - else if (std::abs(action.set_inc_phase.step) > MAX_PHASE-1) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u is change phase by too large for any use %i.", i, j+1, action.set_inc_phase.step); - break; - case ACTION_T_QUEST_EVENT_ALL: - if (Quest const* qid = sObjectMgr->GetQuestTemplate(action.quest_event_all.questId)) - { - if (!qid->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j+1, action.quest_event_all.questId); - } - else - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent Quest entry %u.", i, j+1, action.quest_event_all.questId); - break; - case ACTION_T_CAST_EVENT_ALL: - if (!sObjectMgr->GetCreatureTemplate(action.cast_event_all.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent creature entry %u.", i, j+1, action.cast_event_all.creatureId); - if (!sSpellMgr->GetSpellInfo(action.cast_event_all.spellId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent SpellID %u.", i, j+1, action.cast_event_all.spellId); - break; - case ACTION_T_REMOVEAURASFROMSPELL: - if (!sSpellMgr->GetSpellInfo(action.remove_aura.spellId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existent SpellID %u.", i, j+1, action.remove_aura.spellId); - if (action.remove_aura.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_RANDOM_PHASE: //PhaseId1, PhaseId2, PhaseId3 - if (action.random_phase.phase1 >= MAX_PHASE) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phase1 >= %u. Phase mask cannot be used past phase %u.", i, j+1, MAX_PHASE, MAX_PHASE-1); - if (action.random_phase.phase2 >= MAX_PHASE) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phase2 >= %u. Phase mask cannot be used past phase %u.", i, j+1, MAX_PHASE, MAX_PHASE-1); - if (action.random_phase.phase3 >= MAX_PHASE) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phase3 >= %u. Phase mask cannot be used past phase %u.", i, j+1, MAX_PHASE, MAX_PHASE-1); - break; - case ACTION_T_RANDOM_PHASE_RANGE: //PhaseMin, PhaseMax - if (action.random_phase_range.phaseMin >= MAX_PHASE) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phaseMin >= %u. Phase mask cannot be used past phase %u.", i, j+1, MAX_PHASE, MAX_PHASE-1); - if (action.random_phase_range.phaseMin >= MAX_PHASE) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phaseMax >= %u. Phase mask cannot be used past phase %u.", i, j+1, MAX_PHASE, MAX_PHASE-1); - if (action.random_phase_range.phaseMin >= action.random_phase_range.phaseMax) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set phaseMax <= phaseMin.", i, j+1); - std::swap(action.random_phase_range.phaseMin, action.random_phase_range.phaseMax); - // equal case processed at call - } - break; - case ACTION_T_SUMMON_ID: - if (!sObjectMgr->GetCreatureTemplate(action.summon_id.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existant creature entry %u.", i, j+1, action.summon_id.creatureId); - if (action.summon_id.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - if (m_CreatureEventAI_Summon_Map.find(action.summon_id.spawnId) == m_CreatureEventAI_Summon_Map.end()) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u summons missing CreatureEventAI_Summon %u", i, j+1, action.summon_id.spawnId); - break; - case ACTION_T_KILLED_MONSTER: - if (!sObjectMgr->GetCreatureTemplate(action.killed_monster.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existant creature entry %u.", i, j+1, action.killed_monster.creatureId); - if (action.killed_monster.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_SET_INST_DATA: - if (!(temp.event_flags & EFLAG_DIFFICULTY_ALL)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u. Cannot set instance data without difficulty event flags.", i, j+1); - if (action.set_inst_data.value > 4/*SPECIAL*/) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u attempts to set instance data above encounter state 4. Custom case?", i, j+1); - break; - case ACTION_T_SET_INST_DATA64: - if (!(temp.event_flags & EFLAG_DIFFICULTY_ALL)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u. Cannot set instance data without difficulty event flags.", i, j+1); - if (action.set_inst_data64.target >= TARGET_T_END) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses incorrect Target type", i, j+1); - break; - case ACTION_T_UPDATE_TEMPLATE: - if (!sObjectMgr->GetCreatureTemplate(action.update_template.creatureId)) - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses non-existant creature entry %u.", i, j+1, action.update_template.creatureId); - break; - case ACTION_T_SET_SHEATH: - if (action.set_sheath.sheath >= MAX_SHEATH_STATE) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses wrong sheath state %u.", i, j+1, action.set_sheath.sheath); - action.set_sheath.sheath = SHEATH_STATE_UNARMED; - } - break; - case ACTION_T_SET_INVINCIBILITY_HP_LEVEL: - if (action.invincibility_hp_level.is_percent) - { - if (action.invincibility_hp_level.hp_level > 100) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses wrong percent value %u.", i, j+1, action.invincibility_hp_level.hp_level); - action.invincibility_hp_level.hp_level = 100; - } - } - break; - case ACTION_T_MOUNT_TO_ENTRY_OR_MODEL: - if (action.mount.creatureId != 0 || action.mount.modelId != 0) - { - if (action.mount.creatureId && !sObjectMgr->GetCreatureTemplate(action.mount.creatureId)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses nonexistent Creature entry %u.", i, j+1, action.mount.creatureId); - action.morph.creatureId = 0; - } - - if (action.mount.modelId) - { - if (action.mount.creatureId) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u have unused ModelId %u with also set creature id %u.", i, j+1, action.mount.modelId, action.mount.creatureId); - action.mount.modelId = 0; - } - else if (!sCreatureDisplayInfoStore.LookupEntry(action.mount.modelId)) - { - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u uses nonexistent ModelId %u.", i, j+1, action.mount.modelId); - action.mount.modelId = 0; - } - } - } - break; - case ACTION_T_EVADE: //No Params - case ACTION_T_FLEE_FOR_ASSIST: //No Params - case ACTION_T_DIE: //No Params - case ACTION_T_ZONE_COMBAT_PULSE: //No Params - case ACTION_T_FORCE_DESPAWN: //No Params - case ACTION_T_AUTO_ATTACK: //AllowAttackState (0 = stop attack, anything else means continue attacking) - case ACTION_T_COMBAT_MOVEMENT: //AllowCombatMovement (0 = stop combat based movement, anything else continue attacking) - case ACTION_T_RANGED_MOVEMENT: //Distance, Angle - case ACTION_T_CALL_FOR_HELP: //Distance - break; - - case ACTION_T_RANDOM_SAY: - case ACTION_T_RANDOM_YELL: - case ACTION_T_RANDOM_TEXTEMOTE: - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u currently unused ACTION type. Did you forget to update database?", i, j+1); - break; - - case ACTION_T_MOVE_RANDOM_POINT: - case ACTION_T_SET_STAND_STATE: - case ACTION_T_SET_PHASE_MASK: - case ACTION_T_SET_VISIBILITY: - case ACTION_T_SET_ACTIVE: - case ACTION_T_SET_AGGRESSIVE: - case ACTION_T_ATTACK_START_PULSE: - case ACTION_T_SUMMON_GO: - break; - - default: - sLog->outError(LOG_FILTER_SQL, "CreatureEventAI: Event %u Action %u have currently not checked at load action type (%u). Need check code update?", i, j+1, action.type); - break; - } - } - - //Add to list - m_CreatureEventAI_Event_Map[creature_id].push_back(temp); - ++count; - - } - while (result->NextRow()); - - sLog->outInfo(LOG_FILTER_GENERAL, ">> Loaded %u CreatureEventAI scripts in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - -} diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.h b/src/server/game/AI/EventAI/CreatureEventAIMgr.h deleted file mode 100755 index 93e953681b6..00000000000 --- a/src/server/game/AI/EventAI/CreatureEventAIMgr.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TRINITY_CREATURE_EAI_MGR_H -#define TRINITY_CREATURE_EAI_MGR_H - -#include "Common.h" -#include "CreatureEventAI.h" - -class CreatureEventAIMgr -{ - friend class ACE_Singleton; - - private: - CreatureEventAIMgr(){}; - ~CreatureEventAIMgr(){}; - - public: - void LoadCreatureEventAI_Texts(); - void LoadCreatureEventAI_Summons(); - void LoadCreatureEventAI_Scripts(); - - CreatureEventAI_Event_Map const& GetCreatureEventAIMap() const { return m_CreatureEventAI_Event_Map; } - CreatureEventAI_Summon_Map const& GetCreatureEventAISummonMap() const { return m_CreatureEventAI_Summon_Map; } - CreatureEventAI_TextMap const& GetCreatureEventAITextMap() const { return m_CreatureEventAI_TextMap; } - - private: - CreatureEventAI_Event_Map m_CreatureEventAI_Event_Map; - CreatureEventAI_Summon_Map m_CreatureEventAI_Summon_Map; - CreatureEventAI_TextMap m_CreatureEventAI_TextMap; -}; - -#define sEventAIMgr ACE_Singleton::instance() -#endif diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index a83e77e6632..f41cd75d127 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -132,7 +132,6 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Addons ${CMAKE_CURRENT_SOURCE_DIR}/AI ${CMAKE_CURRENT_SOURCE_DIR}/AI/CoreAI - ${CMAKE_CURRENT_SOURCE_DIR}/AI/EventAI ${CMAKE_CURRENT_SOURCE_DIR}/AI/ScriptedAI ${CMAKE_CURRENT_SOURCE_DIR}/AI/SmartScripts ${CMAKE_CURRENT_SOURCE_DIR}/AuctionHouse diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 67ba643dd97..d4668142b3b 100755 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -28,7 +28,7 @@ #include "Spell.h" // Checks if object meets the condition -// Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: eventAI) +// Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: SmartAI) bool Condition::Meets(ConditionSourceInfo& sourceInfo) { ASSERT(ConditionTarget < MAX_CONDITION_TARGETS); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index aa48dcca787..7cf02eea8df 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -40,7 +40,6 @@ #include "ArenaTeamMgr.h" #include "GuildMgr.h" #include "TicketMgr.h" -#include "CreatureEventAIMgr.h" #include "SpellMgr.h" #include "GroupMgr.h" #include "Chat.h" @@ -1628,15 +1627,6 @@ void World::SetInitialWorldSettings() sLog->outInfo(LOG_FILTER_GENERAL, "Loading Scripts text locales..."); // must be after Load*Scripts calls sObjectMgr->LoadDbScriptStrings(); - sLog->outInfo(LOG_FILTER_GENERAL, "Loading CreatureEventAI Texts..."); - sEventAIMgr->LoadCreatureEventAI_Texts(); - - sLog->outInfo(LOG_FILTER_GENERAL, "Loading CreatureEventAI Summons..."); - sEventAIMgr->LoadCreatureEventAI_Summons(); - - sLog->outInfo(LOG_FILTER_GENERAL, "Loading CreatureEventAI Scripts..."); - sEventAIMgr->LoadCreatureEventAI_Scripts(); - sLog->outInfo(LOG_FILTER_GENERAL, "Loading spell script names..."); sObjectMgr->LoadSpellScriptNames(); diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 792fdeb3e7b..6d0d8ec8189 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -76,7 +76,6 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Addons ${CMAKE_SOURCE_DIR}/src/server/game/AI ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/EventAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 40b36fb8d52..77f6316c881 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -27,7 +27,6 @@ EndScriptData */ #include "SpellMgr.h" #include "TicketMgr.h" #include "MapManager.h" -#include "CreatureEventAIMgr.h" #include "DisableMgr.h" #include "LFGMgr.h" #include "AuctionHouseMgr.h" @@ -50,7 +49,6 @@ public: { { "achievement", SEC_ADMINISTRATOR, true, &HandleReloadAllAchievementCommand, "", NULL }, { "area", SEC_ADMINISTRATOR, true, &HandleReloadAllAreaCommand, "", NULL }, - { "eventai", SEC_ADMINISTRATOR, true, &HandleReloadAllEventAICommand, "", NULL }, { "gossips", SEC_ADMINISTRATOR, true, &HandleReloadAllGossipsCommand, "", NULL }, { "item", SEC_ADMINISTRATOR, true, &HandleReloadAllItemCommand, "", NULL }, { "locales", SEC_ADMINISTRATOR, true, &HandleReloadAllLocalesCommand, "", NULL }, @@ -77,9 +75,6 @@ public: { "conditions", SEC_ADMINISTRATOR, true, &HandleReloadConditions, "", NULL }, { "config", SEC_ADMINISTRATOR, true, &HandleReloadConfigCommand, "", NULL }, { "creature_text", SEC_ADMINISTRATOR, true, &HandleReloadCreatureText, "", NULL }, - { "creature_ai_scripts", SEC_ADMINISTRATOR, true, &HandleReloadEventAIScriptsCommand, "", NULL }, - { "creature_ai_summons", SEC_ADMINISTRATOR, true, &HandleReloadEventAISummonsCommand, "", NULL }, - { "creature_ai_texts", SEC_ADMINISTRATOR, true, &HandleReloadEventAITextsCommand, "", NULL }, { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestInvRelationsCommand, "", NULL }, { "creature_linked_respawn", SEC_GAMEMASTER, true, &HandleReloadLinkedRespawnCommand, "", NULL }, { "creature_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL }, @@ -179,7 +174,6 @@ public: HandleReloadAllAchievementCommand(handler, ""); HandleReloadAllAreaCommand(handler, ""); - HandleReloadAllEventAICommand(handler, ""); HandleReloadAllLootCommand(handler, ""); HandleReloadAllNpcCommand(handler, ""); HandleReloadAllQuestCommand(handler, ""); @@ -271,14 +265,6 @@ public: return true; } - static bool HandleReloadAllEventAICommand(ChatHandler* handler, const char* /*args*/) - { - HandleReloadEventAITextsCommand(handler, "a"); - HandleReloadEventAISummonsCommand(handler, "a"); - HandleReloadEventAIScriptsCommand(handler, "a"); - return true; - } - static bool HandleReloadAllSpellCommand(ChatHandler* handler, const char* /*args*/) { HandleReloadSkillDiscoveryTemplateCommand(handler, "a"); @@ -1018,31 +1004,6 @@ public: return true; } - static bool HandleReloadEventAITextsCommand(ChatHandler* handler, const char* /*args*/) - { - - sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Texts from `creature_ai_texts`..."); - sEventAIMgr->LoadCreatureEventAI_Texts(); - handler->SendGlobalGMSysMessage("DB table `creature_ai_texts` reloaded."); - return true; - } - - static bool HandleReloadEventAISummonsCommand(ChatHandler* handler, const char* /*args*/) - { - sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Summons from `creature_ai_summons`..."); - sEventAIMgr->LoadCreatureEventAI_Summons(); - handler->SendGlobalGMSysMessage("DB table `creature_ai_summons` reloaded."); - return true; - } - - static bool HandleReloadEventAIScriptsCommand(ChatHandler* handler, const char* /*args*/) - { - sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Scripts from `creature_ai_scripts`..."); - sEventAIMgr->LoadCreatureEventAI_Scripts(); - handler->SendGlobalGMSysMessage("DB table `creature_ai_scripts` reloaded."); - return true; - } - static bool HandleReloadQuestEndScriptsCommand(ChatHandler* handler, const char* args) { if (sScriptMgr->IsScriptScheduled()) diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index 4b5b4edb0ac..b95a72c6713 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -30,7 +30,7 @@ enum LogFilterType LOG_FILTER_PETS, LOG_FILTER_VEHICLES, LOG_FILTER_TSCR, // C++ AI, instance scripts, etc. - LOG_FILTER_DATABASE_AI, // SmartAI, EventAI, Creature* * AI + LOG_FILTER_DATABASE_AI, // SmartAI, Creature* * AI LOG_FILTER_MAPSCRIPTS, LOG_FILTER_NETWORKIO, LOG_FILTER_SPELLS_AURAS, diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index eb5bb04d766..b23e15e50a1 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -70,7 +70,6 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Addons ${CMAKE_SOURCE_DIR}/src/server/game/AI ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/EventAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse -- cgit v1.2.3 From c0adf370e5ac3166bb74abb6d824556fbae54f6f Mon Sep 17 00:00:00 2001 From: Nay Date: Tue, 14 Aug 2012 18:11:06 +0100 Subject: Core/Vendors: Add currencies to vendors npc_vendor table gets a new field, type (1 is item, 2 is currency) for type 1 fields still mean the same, for type 2 maxcount is buycount (without any "precision") changed structure of SMSG_UPDATE_CURRENCY(_WEEK_LIMIT) but not enabled, wrong values are being wrongly calculated --- .../world/2012_08_14_02_world_npc_vendor.sql | 6 + src/server/game/Entities/Creature/Creature.cpp | 8 +- src/server/game/Entities/Creature/Creature.h | 15 +- src/server/game/Entities/Item/ItemPrototype.h | 6 + src/server/game/Entities/Player/Player.cpp | 233 ++++++++++++++------- src/server/game/Entities/Player/Player.h | 5 +- src/server/game/Entities/Unit/Unit.cpp | 4 +- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Events/GameEventMgr.cpp | 14 +- src/server/game/Events/GameEventMgr.h | 1 + src/server/game/Globals/ObjectMgr.cpp | 83 ++++---- src/server/game/Globals/ObjectMgr.h | 10 +- src/server/game/Handlers/ItemHandler.cpp | 125 +++++++---- src/server/scripts/Commands/cs_npc.cpp | 10 +- .../Database/Implementation/WorldDatabase.cpp | 6 +- .../shared/Database/Implementation/WorldDatabase.h | 2 +- 16 files changed, 345 insertions(+), 185 deletions(-) create mode 100644 sql/updates/world/2012_08_14_02_world_npc_vendor.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_14_02_world_npc_vendor.sql b/sql/updates/world/2012_08_14_02_world_npc_vendor.sql new file mode 100644 index 00000000000..de00be694fc --- /dev/null +++ b/sql/updates/world/2012_08_14_02_world_npc_vendor.sql @@ -0,0 +1,6 @@ +ALTER TABLE `npc_vendor` ADD `type` tinyint(3) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `game_event_npc_vendor` ADD `type` tinyint(3) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `npc_vendor` CHANGE `maxcount` `maxcount` mediumint(8) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `game_event_npc_vendor` CHANGE `maxcount` `maxcount` mediumint(8) unsigned NOT NULL DEFAULT '0'; +UPDATE `trinity_string` SET `content_default` = 'Item \'%u\' (type %u) not found in database.' WHERE `entry`=207; +UPDATE `trinity_string` SET `content_default` = 'Item \'%u\' (with extended cost %u, type %u) already in vendor list' WHERE `entry`=210; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index de5d0a0303c..642c7e45a74 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -61,12 +61,12 @@ TrainerSpell const* TrainerSpellData::Find(uint32 spell_id) const return NULL; } -bool VendorItemData::RemoveItem(uint32 item_id) +bool VendorItemData::RemoveItem(uint32 item_id, uint8 type) { bool found = false; for (VendorItemList::iterator i = m_items.begin(); i != m_items.end();) { - if ((*i)->item == item_id) + if ((*i)->item == item_id && (*i)->Type == type) { i = m_items.erase(i++); found = true; @@ -77,10 +77,10 @@ bool VendorItemData::RemoveItem(uint32 item_id) return found; } -VendorItem const* VendorItemData::FindItemCostPair(uint32 item_id, uint32 extendedCost) const +VendorItem const* VendorItemData::FindItemCostPair(uint32 item_id, uint32 extendedCost, uint8 type) const { for (VendorItemList::const_iterator i = m_items.begin(); i != m_items.end(); ++i) - if ((*i)->item == item_id && (*i)->ExtendedCost == extendedCost) + if ((*i)->item == item_id && (*i)->ExtendedCost == extendedCost && (*i)->Type == type) return *i; return NULL; } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 61982026933..14a680d62d1 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -317,13 +317,14 @@ enum ChatType // Vendors struct VendorItem { - VendorItem(uint32 _item, int32 _maxcount, uint32 _incrtime, uint32 _ExtendedCost) - : item(_item), maxcount(_maxcount), incrtime(_incrtime), ExtendedCost(_ExtendedCost) {} + VendorItem(uint32 _item, int32 _maxcount, uint32 _incrtime, uint32 _ExtendedCost, uint8 _Type) + : item(_item), maxcount(_maxcount), incrtime(_incrtime), ExtendedCost(_ExtendedCost), Type(_Type) {} uint32 item; - uint32 maxcount; // 0 for infinity item amount + uint32 maxcount; // 0 for infinity item amount uint32 incrtime; // time for restore items amount if maxcount != 0 uint32 ExtendedCost; + uint8 Type; //helpers bool IsGoldRequired(ItemTemplate const* pProto) const { return pProto->Flags2 & ITEM_FLAGS_EXTRA_EXT_COST_REQUIRES_GOLD || !ExtendedCost; } @@ -343,12 +344,12 @@ struct VendorItemData } bool Empty() const { return m_items.empty(); } uint8 GetItemCount() const { return m_items.size(); } - void AddItem(uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost) + void AddItem(uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, uint8 type) { - m_items.push_back(new VendorItem(item, maxcount, ptime, ExtendedCost)); + m_items.push_back(new VendorItem(item, maxcount, ptime, ExtendedCost, type)); } - bool RemoveItem(uint32 item_id); - VendorItem const* FindItemCostPair(uint32 item_id, uint32 extendedCost) const; + bool RemoveItem(uint32 item_id, uint8 type); + VendorItem const* FindItemCostPair(uint32 item_id, uint32 extendedCost, uint8 type) const; void Clear() { for (VendorItemList::const_iterator itr = m_items.begin(); itr != m_items.end(); ++itr) diff --git a/src/server/game/Entities/Item/ItemPrototype.h b/src/server/game/Entities/Item/ItemPrototype.h index 1fd46a2d879..87647a36f70 100755 --- a/src/server/game/Entities/Item/ItemPrototype.h +++ b/src/server/game/Entities/Item/ItemPrototype.h @@ -218,6 +218,12 @@ enum CurrencyFlags // ... }; +enum ItemVendorType +{ + ITEM_VENDOR_TYPE_ITEM = 1, + ITEM_VENDOR_TYPE_CURRENCY = 2, +}; + enum BAG_FAMILY_MASK { BAG_FAMILY_MASK_NONE = 0x00000000, diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bd835db1ca6..6f948c774fb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7281,96 +7281,105 @@ void Player::SendCurrencies() const uint32 Player::GetCurrency(uint32 id) const { - PlayerCurrenciesMap::const_iterator itr = m_currencies.find(id); - return itr != m_currencies.end() ? itr->second.totalCount : 0; + PlayerCurrenciesMap::const_iterator itr = m_currencies.find(id); + return itr != m_currencies.end() ? itr->second.totalCount : 0; } bool Player::HasCurrency(uint32 id, uint32 count) const { - PlayerCurrenciesMap::const_iterator itr = m_currencies.find(id); - return itr != m_currencies.end() && itr->second.totalCount >= count; + PlayerCurrenciesMap::const_iterator itr = m_currencies.find(id); + return itr != m_currencies.end() && itr->second.totalCount >= count; } -void Player::ModifyCurrency(uint32 id, int32 count) +void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/) { - if (!count) - return; + if (!count) + return; - CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id); - ASSERT(currency); + CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id); + ASSERT(currency); - int32 precision = currency->Flags & CURRENCY_FLAG_HIGH_PRECISION ? 100 : 1; - uint32 oldTotalCount = 0; - uint32 oldWeekCount = 0; - PlayerCurrenciesMap::iterator itr = m_currencies.find(id); - if (itr == m_currencies.end()) - { - PlayerCurrency cur; - cur.state = PLAYERCURRENCY_NEW; - cur.totalCount = 0; - cur.weekCount = 0; - m_currencies[id] = cur; - itr = m_currencies.find(id); - } - else - { - oldTotalCount = itr->second.totalCount; - oldWeekCount = itr->second.weekCount; - } + int32 precision = currency->Flags & CURRENCY_FLAG_HIGH_PRECISION ? 100 : 1; + uint32 oldTotalCount = 0; + uint32 oldWeekCount = 0; + PlayerCurrenciesMap::iterator itr = m_currencies.find(id); + if (itr == m_currencies.end()) + { + PlayerCurrency cur; + cur.state = PLAYERCURRENCY_NEW; + cur.totalCount = 0; + cur.weekCount = 0; + m_currencies[id] = cur; + itr = m_currencies.find(id); + } + else + { + oldTotalCount = itr->second.totalCount; + oldWeekCount = itr->second.weekCount; + } - int32 newTotalCount = int32(oldTotalCount) + count; - if (newTotalCount < 0) - newTotalCount = 0; + int32 newTotalCount = int32(oldTotalCount) + count; + if (newTotalCount < 0) + newTotalCount = 0; - int32 newWeekCount = int32(oldWeekCount) + (count > 0 ? count : 0); - if (newWeekCount < 0) - newWeekCount = 0; + int32 newWeekCount = int32(oldWeekCount) + (count > 0 ? count : 0); + if (newWeekCount < 0) + newWeekCount = 0; - if (currency->TotalCap && int32(currency->TotalCap) < newTotalCount) - { - int32 delta = newTotalCount - int32(currency->TotalCap); - newTotalCount = int32(currency->TotalCap); - newWeekCount -= delta; - } + if (currency->TotalCap && int32(currency->TotalCap) < newTotalCount) + { + int32 delta = newTotalCount - int32(currency->TotalCap); + newTotalCount = int32(currency->TotalCap); + newWeekCount -= delta; + } - // TODO: fix conquest points - uint32 weekCap = _GetCurrencyWeekCap(currency); - if (weekCap && int32(weekCap) < newTotalCount) - { - int32 delta = newWeekCount - int32(weekCap); - newWeekCount = int32(weekCap); - newTotalCount -= delta; - } + // TODO: fix conquest points + uint32 weekCap = _GetCurrencyWeekCap(currency); + if (weekCap && int32(weekCap) < newTotalCount) + { + int32 delta = newWeekCount - int32(weekCap); + newWeekCount = int32(weekCap); + newTotalCount -= delta; + } - // if we change total, we must change week - ASSERT(((newTotalCount-oldTotalCount) != 0) == ((newWeekCount-oldWeekCount) != 0)); + // if we change total, we must change week + ASSERT(((newTotalCount-oldTotalCount) != 0) == ((newWeekCount-oldWeekCount) != 0)); - if (newTotalCount != oldTotalCount) - { - if(itr->second.state != PLAYERCURRENCY_NEW) - itr->second.state = PLAYERCURRENCY_CHANGED; + if (newTotalCount != oldTotalCount) + { + if (itr->second.state != PLAYERCURRENCY_NEW) + itr->second.state = PLAYERCURRENCY_CHANGED; - itr->second.totalCount = newTotalCount; - itr->second.weekCount = newWeekCount; + itr->second.totalCount = newTotalCount; + itr->second.weekCount = newWeekCount; - // probably excessive checks - if (IsInWorld() && !GetSession()->PlayerLoading()) - { - if (count > 0) - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count); - - WorldPacket packet(SMSG_UPDATE_CURRENCY, 12); - packet << uint32(id); - packet << uint32(weekCap ? (newWeekCount / precision) : 0); - packet << uint32(newTotalCount / precision); - GetSession()->SendPacket(&packet); - } - } + // probably excessive checks + if (IsInWorld() && !GetSession()->PlayerLoading()) + { + if (count > 0) + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count); + + WorldPacket packet(SMSG_UPDATE_CURRENCY, 12); + + packet.WriteBit(weekCap != 0); + packet.WriteBit(0); // hasSeasonCount + packet.WriteBit(printLog); // print in log + + // if hasSeasonCount packet << uint32(seasontotalearned); TODO: save this in character DB and use it + + packet << uint32(newTotalCount / precision); + packet << uint32(id); + if (weekCap) + packet << uint32(newWeekCount / precision); + + GetSession()->SendPacket(&packet); + } + } } -void Player::SetCurrency(uint32 id, uint32 count) +void Player::SetCurrency(uint32 id, uint32 count, bool printLog /*= true*/) { - ModifyCurrency(id, int32(count) - GetCurrency(id)); + ModifyCurrency(id, int32(count) - GetCurrency(id), printLog); } uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const @@ -20991,6 +21000,90 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c return true; } +bool Player::BuyCurrencyFromVendorSlot(uint64 vendorGuid, uint32 vendorSlot, uint32 currency, uint32 count) +{ + vendorSlot += 1; + + // cheating attempt + if (count < 1) count = 1; + + if (!isAlive()) + return false; + + CurrencyTypesEntry const* proto = sCurrencyTypesStore.LookupEntry(currency); + if (!proto) + { + SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, currency, 0); + return false; + } + + Creature* creature = GetNPCIfCanInteractWith(vendorGuid, UNIT_NPC_FLAG_VENDOR); + if (!creature) + { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: BuyCurrencyFromVendorSlot - Unit (GUID: %u) not found or you can't interact with him.", GUID_LOPART(vendorGuid)); + SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, NULL, currency, 0); + return false; + } + + VendorItemData const* vItems = creature->GetVendorItems(); + if (!vItems || vItems->Empty()) + { + SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, currency, 0); + return false; + } + + if (vendorSlot >= vItems->GetItemCount()) + { + SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, currency, 0); + return false; + } + + VendorItem const* crItem = vItems->GetItem(vendorSlot); + // store diff item (cheating) + if (!crItem || crItem->item != currency || crItem->Type != 2) + { + SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, currency, 0); + return false; + } + + if (crItem->ExtendedCost) + { + ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); + if (!iece) + { + sLog->outError(LOG_FILTER_PLAYER, "Currency %u have wrong ExtendedCost field value %u", currency, crItem->ExtendedCost); + return false; + } + + // item base price + for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) + { + if (iece->RequiredItem[i] && !HasItemCount(iece->RequiredItem[i], (iece->RequiredItemCount[i] * count))) + { + SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, NULL, NULL); + return false; + } + } + + // check for personal arena rating requirement + if (GetMaxPersonalArenaRatingRequirement(iece->RequiredArenaSlot) < iece->RequiredPersonalArenaRating) + { + // probably not the proper equip err + SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, NULL, NULL); + return false; + } + } + else // currencies have no price defined, can only be bought with ExtendedCost + { + SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, currency, 0); + return false; + } + + ModifyCurrency(currency, crItem->maxcount); + + return true; +} + // Return true is the bought item has a max count to force refresh of window by caller bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index a8e9e5ed407..933c702a5aa 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1328,8 +1328,8 @@ class Player : public Unit, public GridObject void SendCurrencies() const; uint32 GetCurrency(uint32 id) const; bool HasCurrency(uint32 id, uint32 count) const; - void SetCurrency(uint32 id, uint32 count); - void ModifyCurrency(uint32 id, int32 count); + void SetCurrency(uint32 id, uint32 count, bool printLog = true); + void ModifyCurrency(uint32 id, int32 count, bool printLog = true); void ApplyEquipCooldown(Item* pItem); void QuickEquipItem(uint16 pos, Item* pItem); @@ -1375,6 +1375,7 @@ class Player : public Unit, public GridObject } void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false); bool BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot); + bool BuyCurrencyFromVendorSlot(uint64 vendorGuid, uint32 vendorSlot, uint32 currency, uint32 count); bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore); float GetReputationPriceDiscount(Creature const* creature) const; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 03de01795f7..eda39dcefd1 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5628,7 +5628,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1); if (!counter) return true; - + // Count spell criticals in a row in second aura if (procEx & PROC_EX_CRITICAL_HIT) { @@ -6935,7 +6935,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // custom cooldown processing case if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->HasSpellCooldown(spell)) ToPlayer()->RemoveSpellCooldown(spell); - + CastSpell(target, spell, true, castItem, triggeredByAura); return true; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 57b56ff6e55..addf99a03ac 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1483,7 +1483,7 @@ class Unit : public WorldObject } virtual uint32 GetBlockPercent() { return 30; } - + uint32 GetUnitMeleeSkill(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; } uint32 GetDefenseSkillValue(Unit const* target = NULL) const; uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const* target = NULL) const; diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 0936275e90c..6af90dd85eb 100755 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -808,14 +808,11 @@ void GameEventMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 - QueryResult result = WorldDatabase.Query("SELECT eventEntry, guid, item, maxcount, incrtime, ExtendedCost FROM game_event_npc_vendor ORDER BY guid, slot ASC"); + // 0 1 2 3 4 5 6 + QueryResult result = WorldDatabase.Query("SELECT eventEntry, guid, item, maxcount, incrtime, ExtendedCost, type FROM game_event_npc_vendor ORDER BY guid, slot ASC"); if (!result) - { sLog->outInfo(LOG_FILTER_GAMEEVENTS, ">> Loaded 0 vendor additions in game events. DB table `game_event_npc_vendor` is empty."); - - } else { uint32 count = 0; @@ -838,6 +835,7 @@ void GameEventMgr::LoadFromDB() newEntry.maxcount = fields[3].GetUInt32(); newEntry.incrtime = fields[4].GetUInt32(); newEntry.ExtendedCost = fields[5].GetUInt32(); + newEntry.Type = fields[6].GetUInt8(); // get the event npc flag for checking if the npc will be vendor during the event or not uint32 event_npc_flag = 0; NPCFlagList& flist = mGameEventNPCFlags[event_id]; @@ -856,7 +854,7 @@ void GameEventMgr::LoadFromDB() newEntry.entry = data->id; // check validity with event's npcflag - if (!sObjectMgr->IsVendorItemValid(newEntry.entry, newEntry.item, newEntry.maxcount, newEntry.incrtime, newEntry.ExtendedCost, NULL, NULL, event_npc_flag)) + if (!sObjectMgr->IsVendorItemValid(newEntry.entry, newEntry.item, newEntry.maxcount, newEntry.incrtime, newEntry.ExtendedCost, newEntry.Type, NULL, NULL, event_npc_flag)) continue; vendors.push_back(newEntry); @@ -1199,9 +1197,9 @@ void GameEventMgr::UpdateEventNPCVendor(uint16 event_id, bool activate) for (NPCVendorList::iterator itr = mGameEventVendors[event_id].begin(); itr != mGameEventVendors[event_id].end(); ++itr) { if (activate) - sObjectMgr->AddVendorItem(itr->entry, itr->item, itr->maxcount, itr->incrtime, itr->ExtendedCost, false); + sObjectMgr->AddVendorItem(itr->entry, itr->item, itr->maxcount, itr->incrtime, itr->ExtendedCost, itr->Type, false); else - sObjectMgr->RemoveVendorItem(itr->entry, itr->item, false); + sObjectMgr->RemoveVendorItem(itr->entry, itr->item, itr->Type, false); } } diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h index d9b5890bfe5..ce1d10e327a 100755 --- a/src/server/game/Events/GameEventMgr.h +++ b/src/server/game/Events/GameEventMgr.h @@ -85,6 +85,7 @@ struct NPCVendorEntry int32 maxcount; // 0 for infinite uint32 incrtime; // time for restore items amount if maxcount != 0 uint32 ExtendedCost; + uint8 Type; // 1 item, 2 currency }; class Player; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6dbe7574cd2..ab78566ae0e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8026,11 +8026,12 @@ void ObjectMgr::LoadTrainerSpell() } -int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set *skip_vendors) +int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, uint8 type, std::set *skip_vendors) { // find all items from the reference vendor PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_NPC_VENDOR_REF); stmt->setUInt32(0, uint32(item)); + stmt->setUInt8(1, type); PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) @@ -8045,19 +8046,20 @@ int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set *s // if item is a negative, its a reference if (item_id < 0) - count += LoadReferenceVendor(vendor, -item_id, skip_vendors); + count += LoadReferenceVendor(vendor, -item_id, type, skip_vendors); else { - int32 maxcount = fields[1].GetUInt8(); + int32 maxcount = fields[1].GetUInt32(); uint32 incrtime = fields[2].GetUInt32(); uint32 ExtendedCost = fields[3].GetUInt32(); + uint8 type = fields[4].GetUInt8(); - if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, NULL, skip_vendors)) + if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, type, NULL, skip_vendors)) continue; VendorItemData& vList = _cacheVendorItemStore[vendor]; - vList.AddItem(item_id, maxcount, incrtime, ExtendedCost); + vList.AddItem(item_id, maxcount, incrtime, ExtendedCost, type); ++count; } } while (result->NextRow()); @@ -8076,7 +8078,7 @@ void ObjectMgr::LoadVendors() std::set skip_vendors; - QueryResult result = WorldDatabase.Query("SELECT entry, item, maxcount, incrtime, ExtendedCost FROM npc_vendor ORDER BY entry, slot ASC"); + QueryResult result = WorldDatabase.Query("SELECT entry, item, maxcount, incrtime, ExtendedCost, type FROM npc_vendor ORDER BY entry, slot ASC"); if (!result) { @@ -8095,19 +8097,20 @@ void ObjectMgr::LoadVendors() // if item is a negative, its a reference if (item_id < 0) - count += LoadReferenceVendor(entry, -item_id, &skip_vendors); + count += LoadReferenceVendor(entry, -item_id, 0, &skip_vendors); else { - uint32 maxcount = fields[2].GetUInt8(); + uint32 maxcount = fields[2].GetUInt32(); uint32 incrtime = fields[3].GetUInt32(); uint32 ExtendedCost = fields[4].GetUInt32(); + uint8 type = fields[5].GetUInt8(); - if (!IsVendorItemValid(entry, item_id, maxcount, incrtime, ExtendedCost, NULL, &skip_vendors)) + if (!IsVendorItemValid(entry, item_id, maxcount, incrtime, ExtendedCost, type, NULL, &skip_vendors)) continue; VendorItemData& vList = _cacheVendorItemStore[entry]; - vList.AddItem(item_id, maxcount, incrtime, ExtendedCost); + vList.AddItem(item_id, maxcount, incrtime, ExtendedCost, type); ++count; } } @@ -8223,32 +8226,33 @@ void ObjectMgr::LoadGossipMenuItems() } -void ObjectMgr::AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist /*= true*/) +void ObjectMgr::AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, uint8 type, bool persist /*= true*/) { VendorItemData& vList = _cacheVendorItemStore[entry]; - vList.AddItem(item, maxcount, incrtime, extendedCost); + vList.AddItem(item, maxcount, incrtime, extendedCost, type); if (persist) { - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_NPC_VENODR); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_NPC_VENDOR); stmt->setUInt32(0, entry); stmt->setUInt32(1, item); stmt->setUInt8(2, maxcount); stmt->setUInt32(3, incrtime); stmt->setUInt32(4, extendedCost); + stmt->setUInt8(5, type); WorldDatabase.Execute(stmt); } } -bool ObjectMgr::RemoveVendorItem(uint32 entry, uint32 item, bool persist /*= true*/) +bool ObjectMgr::RemoveVendorItem(uint32 entry, uint32 item, uint8 type, bool persist /*= true*/) { CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry); if (iter == _cacheVendorItemStore.end()) return false; - if (!iter->second.RemoveItem(item)) + if (!iter->second.RemoveItem(item, type)) return false; if (persist) @@ -8257,6 +8261,7 @@ bool ObjectMgr::RemoveVendorItem(uint32 entry, uint32 item, bool persist /*= tru stmt->setUInt32(0, entry); stmt->setUInt32(1, item); + stmt->setUInt8(2, type); WorldDatabase.Execute(stmt); } @@ -8264,7 +8269,7 @@ bool ObjectMgr::RemoveVendorItem(uint32 entry, uint32 item, bool persist /*= tru return true; } -bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 maxcount, uint32 incrtime, uint32 ExtendedCost, Player* player, std::set* skip_vendors, uint32 ORnpcflag) const +bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 incrtime, uint32 ExtendedCost, uint8 type, Player* player, std::set* skip_vendors, uint32 ORnpcflag) const { CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(vendor_entry); if (!cInfo) @@ -8291,12 +8296,13 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max return false; } - if (!sObjectMgr->GetItemTemplate(item_id)) + if ((type == ITEM_VENDOR_TYPE_ITEM && !sObjectMgr->GetItemTemplate(id)) || + (type == ITEM_VENDOR_TYPE_CURRENCY && !sCurrencyTypesStore.LookupEntry(id))) { if (player) - ChatHandler(player).PSendSysMessage(LANG_ITEM_NOT_FOUND, item_id); + ChatHandler(player).PSendSysMessage(LANG_ITEM_NOT_FOUND, id, type); else - sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` for Vendor (Entry: %u) have in item list non-existed item (%u), ignore", vendor_entry, item_id); + sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` for Vendor (Entry: %u) have in item list non-existed item (%u, type %u), ignore", vendor_entry, id, type); return false; } @@ -8305,37 +8311,40 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max if (player) ChatHandler(player).PSendSysMessage(LANG_EXTENDED_COST_NOT_EXIST, ExtendedCost); else - sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` have Item (Entry: %u) with wrong ExtendedCost (%u) for vendor (%u), ignore", item_id, ExtendedCost, vendor_entry); + sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` have Item (Entry: %u) with wrong ExtendedCost (%u) for vendor (%u), ignore", id, ExtendedCost, vendor_entry); return false; } - if (maxcount > 0 && incrtime == 0) + if (type == ITEM_VENDOR_TYPE_ITEM) // not applicable to currencies { - if (player) - ChatHandler(player).PSendSysMessage("MaxCount != 0 (%u) but IncrTime == 0", maxcount); - else - sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` has `maxcount` (%u) for item %u of vendor (Entry: %u) but `incrtime`=0, ignore", maxcount, item_id, vendor_entry); - return false; - } - else if (maxcount == 0 && incrtime > 0) - { - if (player) - ChatHandler(player).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0"); - else - sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` has `maxcount`=0 for item %u of vendor (Entry: %u) but `incrtime`<>0, ignore", item_id, vendor_entry); - return false; + if (maxcount > 0 && incrtime == 0) + { + if (player) + ChatHandler(player).PSendSysMessage("MaxCount != 0 (%u) but IncrTime == 0", maxcount); + else + sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` has `maxcount` (%u) for item %u of vendor (Entry: %u) but `incrtime`=0, ignore", maxcount, id, vendor_entry); + return false; + } + else if (maxcount == 0 && incrtime > 0) + { + if (player) + ChatHandler(player).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0"); + else + sLog->outError(LOG_FILTER_SQL, "Table `(game_event_)npc_vendor` has `maxcount`=0 for item %u of vendor (Entry: %u) but `incrtime`<>0, ignore", id, vendor_entry); + return false; + } } VendorItemData const* vItems = GetNpcVendorItemList(vendor_entry); if (!vItems) return true; // later checks for non-empty lists - if (vItems->FindItemCostPair(item_id, ExtendedCost)) + if (vItems->FindItemCostPair(id, ExtendedCost, type)) { if (player) - ChatHandler(player).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost); + ChatHandler(player).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, id, ExtendedCost, type); else - sLog->outError(LOG_FILTER_SQL, "Table `npc_vendor` has duplicate items %u (with extended cost %u) for vendor (Entry: %u), ignoring", item_id, ExtendedCost, vendor_entry); + sLog->outError(LOG_FILTER_SQL, "Table `npc_vendor` has duplicate items %u (with extended cost %u, type %u) for vendor (Entry: %u), ignoring", id, ExtendedCost, type, vendor_entry); return false; } diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 7850eda6c83..0456b800a29 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -622,7 +622,7 @@ class ObjectMgr GameObjectTemplate const* GetGameObjectTemplate(uint32 entry); GameObjectTemplateContainer const* GetGameObjectTemplates() const { return &_gameObjectTemplateStore; } - int LoadReferenceVendor(int32 vendor, int32 item_id, std::set *skip_vendors); + int LoadReferenceVendor(int32 vendor, int32 item, uint8 type, std::set *skip_vendors); void LoadGameObjectTemplate(); void AddGameobjectInfo(GameObjectTemplate* goinfo); @@ -1075,15 +1075,15 @@ class ObjectMgr VendorItemData const* GetNpcVendorItemList(uint32 entry) const { - CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry); + CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry); if (iter == _cacheVendorItemStore.end()) return NULL; return &iter->second; } - void AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist = true); // for event - bool RemoveVendorItem(uint32 entry, uint32 item, bool persist = true); // for event - bool IsVendorItemValid(uint32 vendor_entry, uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* player = NULL, std::set* skip_vendors = NULL, uint32 ORnpcflag = 0) const; + void AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, uint8 type, bool persist = true); // for event + bool RemoveVendorItem(uint32 entry, uint32 item, uint8 type, bool persist = true); // for event + bool IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 ptime, uint32 ExtendedCost, uint8 type, Player* player = NULL, std::set* skip_vendors = NULL, uint32 ORnpcflag = 0) const; void LoadScriptNames(); ScriptNameContainer &GetScriptNames() { return _scriptNamesStore; } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 765adbda101..640d6996bdf 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -673,7 +673,7 @@ void WorldSession::HandleBuyItemOpcode(WorldPacket& recvData) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_BUY_ITEM"); uint64 vendorguid, bagGuid; uint32 item, slot, count; - uint8 itemType; // 1 = item, 2 = currency (not implemented) + uint8 itemType; // 1 = item, 2 = currency uint8 bagSlot; recvData >> vendorguid >> itemType >> item >> slot >> count >> bagGuid >> bagSlot; @@ -684,13 +684,20 @@ void WorldSession::HandleBuyItemOpcode(WorldPacket& recvData) else return; // cheating - Item* bagItem = _player->GetItemByGuid(bagGuid); + if (itemType == ITEM_VENDOR_TYPE_ITEM) + { + Item* bagItem = _player->GetItemByGuid(bagGuid); - uint8 bag = NULL_BAG; - if (bagItem && bagItem->IsBag()) - bag = bagItem->GetSlot(); + uint8 bag = NULL_BAG; + if (bagItem && bagItem->IsBag()) + bag = bagItem->GetSlot(); - GetPlayer()->BuyItemFromVendorSlot(vendorguid, slot, item, count, bag, bagSlot); + GetPlayer()->BuyItemFromVendorSlot(vendorguid, slot, item, count, bag, bagSlot); + } + else if (itemType == ITEM_VENDOR_TYPE_CURRENCY) + GetPlayer()->BuyCurrencyFromVendorSlot(vendorguid, slot, item, count); + else + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: received wrong itemType (%u) in HandleBuyItemOpcode", itemType); } void WorldSession::HandleListInventoryOpcode(WorldPacket & recvData) @@ -744,52 +751,86 @@ void WorldSession::SendListInventory(uint64 vendorGuid) VendorItem const* vendorItem = vendorItems->GetItem(slot); if (!vendorItem) continue; - ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(vendorItem->item); - if (!itemTemplate) continue; - - if (!_player->isGameMaster()) // ignore conditions if GM on + if (vendorItem->Type == ITEM_VENDOR_TYPE_ITEM) { - // Respect allowed class - if (!(itemTemplate->AllowableClass & _player->getClassMask())) - continue; + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(vendorItem->item); + if (!itemTemplate) continue; + + if (!_player->isGameMaster()) // ignore conditions if GM on + { + // Respect allowed class + if (!(itemTemplate->AllowableClass & _player->getClassMask())) + continue; - // Do not sell BOP items - if (itemTemplate->Bonding == BIND_WHEN_PICKED_UP) - continue; + // Do not sell BOP items + if (itemTemplate->Bonding == BIND_WHEN_PICKED_UP) + continue; - // Only display items in vendor lists for the team the player is on - if ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeam() == ALLIANCE) || - (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeam() == HORDE)) - continue; + // Only display items in vendor lists for the team the player is on + if ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeam() == ALLIANCE) || + (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeam() == HORDE)) + continue; + + // Items sold out are not displayed in list + uint32 leftInStock = !vendorItem->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(vendorItem); + if (leftInStock == 0) + continue; + } - // Items sold out are not displayed in list + int32 price = vendorItem->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; uint32 leftInStock = !vendorItem->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(vendorItem); - if (leftInStock == 0) - continue; + + itemsData << uint32(count++ + 1); // client expects counting to start at 1 + itemsData << uint32(itemTemplate->MaxDurability); + + if (vendorItem->ExtendedCost != 0) + { + enablers.push_back(0); + itemsData << uint32(vendorItem->ExtendedCost); + } + else + enablers.push_back(1); + enablers.push_back(1); // unk bit + + itemsData << uint32(vendorItem->item); + itemsData << uint32(vendorItem->Type); // 1 is items, 2 is currency + itemsData << uint32(price); + itemsData << uint32(itemTemplate->DisplayInfoID); + // if (!unk "enabler") data << uint32(something); + itemsData << int32(leftInStock); + itemsData << uint32(itemTemplate->BuyCount); } + else if (vendorItem->Type == ITEM_VENDOR_TYPE_CURRENCY) + { + CurrencyTypesEntry const* currencyTemplate = sCurrencyTypesStore.LookupEntry(vendorItem->item); - int32 price = vendorItem->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; - uint32 leftInStock = !vendorItem->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(vendorItem); + if (!currencyTemplate) continue; - itemsData << uint32(count++ + 1); // client expects counting to start at 1 - itemsData << uint32(itemTemplate->MaxDurability); + if (vendorItem->ExtendedCost == 0) continue; // there's no price defined for currencies, only extendedcost is used - if (vendorItem->ExtendedCost != 0) - { - enablers.push_back(0); - itemsData << uint32(vendorItem->ExtendedCost); + uint32 precision = (currencyTemplate->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1; + + itemsData << uint32(count++ + 1); // client expects counting to start at 1 + itemsData << uint32(0); // max durability + + if (vendorItem->ExtendedCost != 0) + { + enablers.push_back(0); + itemsData << uint32(vendorItem->ExtendedCost); + } + else + enablers.push_back(1); + enablers.push_back(1); // unk bit + + itemsData << uint32(vendorItem->item); + itemsData << uint32(vendorItem->Type); // 1 is items, 2 is currency + itemsData << uint32(0); // price, only seen currency types that have Extended cost + itemsData << uint32(0); // displayId + // if (!unk "enabler") data << uint32(something); + itemsData << int32(-1); + itemsData << uint32(vendorItem->maxcount * precision); } - else - enablers.push_back(1); - enablers.push_back(1); // unk bit - - itemsData << uint32(vendorItem->item); - itemsData << uint32(1); // 1 is items, 2 is currency (FIXME: currency isn't implemented) - itemsData << uint32(price); - itemsData << uint32(itemTemplate->DisplayInfoID); - // if (!unk "enabler") data << uint32(something); - itemsData << int32(leftInStock); - itemsData << uint32(itemTemplate->BuyCount); + // else error } uint8* guidBytes = (uint8*)&vendorGuid; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 77fc2918e0b..e43760191df 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -178,6 +178,8 @@ public: if (!*args) return false; + const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument + char* pitem = handler->extractKeyFromLink((char*)args, "Hitem"); if (!pitem) { @@ -214,13 +216,13 @@ public: uint32 vendor_entry = vendor ? vendor->GetEntry() : 0; - if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, handler->GetSession()->GetPlayer())) + if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, type, handler->GetSession()->GetPlayer())) { handler->SetSentErrorMessage(true); return false; } - sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, extendedcost); + sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, type, extendedcost); ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); @@ -435,7 +437,9 @@ public: } uint32 itemId = atol(pitem); - if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId)) + const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument + + if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId, type)) { handler->PSendSysMessage(LANG_ITEM_NOT_IN_LIST, itemId); handler->SetSentErrorMessage(true); diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index fe2a9f7906c..74cd57f74c0 100755 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -34,9 +34,9 @@ void WorldDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(WORLD_DEL_GRAVEYARD_ZONE, "DELETE FROM game_graveyard_zone WHERE id = ? AND ghost_zone = ? AND faction = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?", CONNECTION_ASYNC); - PREPARE_STATEMENT(WORLD_INS_NPC_VENODR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PREPARE_STATEMENT(WORLD_DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ?", CONNECTION_ASYNC); - PREPARE_STATEMENT(WORLD_SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry = ? ORDER BY slot ASC", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost, type) VALUES(?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ? AND type = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(WORLD_SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost, type FROM npc_vendor WHERE entry = ? AND type = ? ORDER BY slot ASC", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_UPD_CREATURE_MOVEMENT_TYPE, "UPDATE creature SET MovementType = ? WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_CREATURE_FACTION, "UPDATE creature_template SET faction_A = ?, faction_H = ? WHERE entry = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_UPD_CREATURE_NPCFLAG, "UPDATE creature_template SET npcflag = ? WHERE entry = ?", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h index 6d7df87cc80..ceaad6f68e3 100755 --- a/src/server/shared/Database/Implementation/WorldDatabase.h +++ b/src/server/shared/Database/Implementation/WorldDatabase.h @@ -54,7 +54,7 @@ enum WorldDatabaseStatements WORLD_DEL_GRAVEYARD_ZONE, WORLD_INS_GAME_TELE, WORLD_DEL_GAME_TELE, - WORLD_INS_NPC_VENODR, + WORLD_INS_NPC_VENDOR, WORLD_DEL_NPC_VENDOR, WORLD_SEL_NPC_VENDOR_REF, WORLD_UPD_CREATURE_MOVEMENT_TYPE, -- cgit v1.2.3 From ca879e96b08347076f539f74d0725f13322b5606 Mon Sep 17 00:00:00 2001 From: Nay Date: Wed, 15 Aug 2012 21:22:29 +0100 Subject: Core/Loading: Fix a field type when loading reputation_spillover_template Also whitespace cleanup --- .../2012_08_15_03_world_rep_spillover_template.sql | 1 + src/server/game/Globals/ObjectMgr.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 5758 ++++++++++---------- .../scripts/EasternKingdoms/arathi_highlands.cpp | 8 +- .../scripts/EasternKingdoms/burning_steppes.cpp | 4 +- src/server/scripts/EasternKingdoms/ghostlands.cpp | 2 +- src/server/scripts/EasternKingdoms/ironforge.cpp | 2 +- src/server/scripts/EasternKingdoms/loch_modan.cpp | 2 +- .../scripts/EasternKingdoms/redridge_mountains.cpp | 2 +- .../scripts/EasternKingdoms/stormwind_city.cpp | 2 +- src/server/scripts/Kalimdor/azshara.cpp | 2 +- src/server/worldserver/worldserver.conf.dist | 1 - 12 files changed, 2893 insertions(+), 2893 deletions(-) create mode 100644 sql/updates/world/2012_08_15_03_world_rep_spillover_template.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_15_03_world_rep_spillover_template.sql b/sql/updates/world/2012_08_15_03_world_rep_spillover_template.sql new file mode 100644 index 00000000000..08469f1b59e --- /dev/null +++ b/sql/updates/world/2012_08_15_03_world_rep_spillover_template.sql @@ -0,0 +1 @@ +ALTER TABLE `reputation_spillover_template` CHANGE `faction5` `faction5` smallint(5) unsigned NOT NULL DEFAULT '0'; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index cf5de46a418..1ab4fb907c3 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6836,7 +6836,7 @@ void ObjectMgr::LoadReputationSpilloverTemplate() repTemplate.faction_rank[3] = fields[12].GetUInt8(); repTemplate.faction[4] = fields[13].GetUInt16(); repTemplate.faction_rate[4] = fields[14].GetFloat(); - repTemplate.faction_rank[4] = fields[15].GetUInt16(); + repTemplate.faction_rank[4] = fields[15].GetUInt8(); FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index d8026ccd10a..ba0dc5667db 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1,2879 +1,2879 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "Chat.h" -#include "ScriptMgr.h" -#include "AccountMgr.h" -#include "ArenaTeamMgr.h" -#include "CellImpl.h" -#include "GridNotifiers.h" -#include "Group.h" -#include "InstanceSaveMgr.h" -#include "MovementGenerator.h" -#include "ObjectAccessor.h" -#include "SpellAuras.h" -#include "TargetedMovementGenerator.h" -#include "WeatherMgr.h" -#include "ace/INET_Addr.h" - -class misc_commandscript : public CommandScript -{ -public: - misc_commandscript() : CommandScript("misc_commandscript") { } - - ChatCommand* GetCommands() const - { - static ChatCommand groupCommandTable[] = - { - { "leader", SEC_ADMINISTRATOR, false, &HandleGroupLeaderCommand, "", NULL }, - { "disband", SEC_ADMINISTRATOR, false, &HandleGroupDisbandCommand, "", NULL }, - { "remove", SEC_ADMINISTRATOR, false, &HandleGroupRemoveCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - static ChatCommand petCommandTable[] = - { - { "create", SEC_GAMEMASTER, false, &HandleCreatePetCommand, "", NULL }, - { "learn", SEC_GAMEMASTER, false, &HandlePetLearnCommand, "", NULL }, - { "unlearn", SEC_GAMEMASTER, false, &HandlePetUnlearnCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - static ChatCommand sendCommandTable[] = - { - { "items", SEC_ADMINISTRATOR, true, &HandleSendItemsCommand, "", NULL }, - { "mail", SEC_MODERATOR, true, &HandleSendMailCommand, "", NULL }, - { "message", SEC_ADMINISTRATOR, true, &HandleSendMessageCommand, "", NULL }, - { "money", SEC_ADMINISTRATOR, true, &HandleSendMoneyCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - static ChatCommand commandTable[] = - { - { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL }, - { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL }, - { "aura", SEC_ADMINISTRATOR, false, &HandleAuraCommand, "", NULL }, - { "unaura", SEC_ADMINISTRATOR, false, &HandleUnAuraCommand, "", NULL }, - { "appear", SEC_MODERATOR, false, &HandleAppearCommand, "", NULL }, - { "summon", SEC_MODERATOR, false, &HandleSummonCommand, "", NULL }, - { "groupsummon", SEC_MODERATOR, false, &HandleGroupSummonCommand, "", NULL }, - { "commands", SEC_PLAYER, true, &HandleCommandsCommand, "", NULL }, - { "die", SEC_ADMINISTRATOR, false, &HandleDieCommand, "", NULL }, - { "revive", SEC_ADMINISTRATOR, true, &HandleReviveCommand, "", NULL }, - { "dismount", SEC_PLAYER, false, &HandleDismountCommand, "", NULL }, - { "guid", SEC_GAMEMASTER, false, &HandleGUIDCommand, "", NULL }, - { "help", SEC_PLAYER, true, &HandleHelpCommand, "", NULL }, - { "itemmove", SEC_GAMEMASTER, false, &HandleItemMoveCommand, "", NULL }, - { "cooldown", SEC_ADMINISTRATOR, false, &HandleCooldownCommand, "", NULL }, - { "distance", SEC_ADMINISTRATOR, false, &HandleGetDistanceCommand, "", NULL }, - { "recall", SEC_MODERATOR, false, &HandleRecallCommand, "", NULL }, - { "save", SEC_PLAYER, false, &HandleSaveCommand, "", NULL }, - { "saveall", SEC_MODERATOR, true, &HandleSaveAllCommand, "", NULL }, - { "kick", SEC_GAMEMASTER, true, &HandleKickPlayerCommand, "", NULL }, - { "start", SEC_PLAYER, false, &HandleStartCommand, "", NULL }, - { "taxicheat", SEC_MODERATOR, false, &HandleTaxiCheatCommand, "", NULL }, - { "linkgrave", SEC_ADMINISTRATOR, false, &HandleLinkGraveCommand, "", NULL }, - { "neargrave", SEC_ADMINISTRATOR, false, &HandleNearGraveCommand, "", NULL }, - { "explorecheat", SEC_ADMINISTRATOR, false, &HandleExploreCheatCommand, "", NULL }, - { "showarea", SEC_ADMINISTRATOR, false, &HandleShowAreaCommand, "", NULL }, - { "hidearea", SEC_ADMINISTRATOR, false, &HandleHideAreaCommand, "", NULL }, - { "additem", SEC_ADMINISTRATOR, false, &HandleAddItemCommand, "", NULL }, - { "additemset", SEC_ADMINISTRATOR, false, &HandleAddItemSetCommand, "", NULL }, - { "bank", SEC_ADMINISTRATOR, false, &HandleBankCommand, "", NULL }, - { "wchange", SEC_ADMINISTRATOR, false, &HandleChangeWeather, "", NULL }, - { "maxskill", SEC_ADMINISTRATOR, false, &HandleMaxSkillCommand, "", NULL }, - { "setskill", SEC_ADMINISTRATOR, false, &HandleSetSkillCommand, "", NULL }, - { "pinfo", SEC_GAMEMASTER, true, &HandlePInfoCommand, "", NULL }, - { "respawn", SEC_ADMINISTRATOR, false, &HandleRespawnCommand, "", NULL }, - { "send", SEC_MODERATOR, true, NULL, "", sendCommandTable }, - { "pet", SEC_GAMEMASTER, false, NULL, "", petCommandTable }, - { "mute", SEC_MODERATOR, true, &HandleMuteCommand, "", NULL }, - { "unmute", SEC_MODERATOR, true, &HandleUnmuteCommand, "", NULL }, - { "movegens", SEC_ADMINISTRATOR, false, &HandleMovegensCommand, "", NULL }, - { "cometome", SEC_ADMINISTRATOR, false, &HandleComeToMeCommand, "", NULL }, - { "damage", SEC_ADMINISTRATOR, false, &HandleDamageCommand, "", NULL }, - { "combatstop", SEC_GAMEMASTER, true, &HandleCombatStopCommand, "", NULL }, - { "flusharenapoints", SEC_ADMINISTRATOR, false, &HandleFlushArenaPointsCommand, "", NULL }, - { "repairitems", SEC_GAMEMASTER, true, &HandleRepairitemsCommand, "", NULL }, - { "waterwalk", SEC_GAMEMASTER, false, &HandleWaterwalkCommand, "", NULL }, - { "freeze", SEC_MODERATOR, false, &HandleFreezeCommand, "", NULL }, - { "unfreeze", SEC_MODERATOR, false, &HandleUnFreezeCommand, "", NULL }, - { "listfreeze", SEC_MODERATOR, false, &HandleListFreezeCommand, "", NULL }, - { "group", SEC_ADMINISTRATOR, false, NULL, "", groupCommandTable }, - { "possess", SEC_ADMINISTRATOR, false, HandlePossessCommand, "", NULL }, - { "unpossess", SEC_ADMINISTRATOR, false, HandleUnPossessCommand, "", NULL }, - { "bindsight", SEC_ADMINISTRATOR, false, HandleBindSightCommand, "", NULL }, - { "unbindsight", SEC_ADMINISTRATOR, false, HandleUnbindSightCommand, "", NULL }, - { "playall", SEC_GAMEMASTER, false, HandlePlayAllCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - return commandTable; - } - - static bool HandleDevCommand(ChatHandler* handler, char const* args) - { - if (!*args) - { - if (handler->GetSession()->GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER)) - handler->GetSession()->SendNotification(LANG_DEV_ON); - else - handler->GetSession()->SendNotification(LANG_DEV_OFF); - return true; - } - - std::string argstr = (char*)args; - - if (argstr == "on") - { - handler->GetSession()->GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER); - handler->GetSession()->SendNotification(LANG_DEV_ON); - return true; - } - - if (argstr == "off") - { - handler->GetSession()->GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER); - handler->GetSession()->SendNotification(LANG_DEV_OFF); - return true; - } - - handler->SendSysMessage(LANG_USE_BOL); - handler->SetSentErrorMessage(true); - return false; - } - - static bool HandleGPSCommand(ChatHandler* handler, char const* args) - { - WorldObject* object = NULL; - if (*args) - { - uint64 guid = handler->extractGuidFromLink((char*)args); - if (guid) - object = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); - - if (!object) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - } - else - { - object = handler->getSelectedUnit(); - - if (!object) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - } - - CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY()); - Cell cell(cellCoord); - - uint32 zoneId, areaId; - object->GetZoneAndAreaId(zoneId, areaId); - - MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId()); - AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId); - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); - - float zoneX = object->GetPositionX(); - float zoneY = object->GetPositionY(); - - Map2ZoneCoordinates(zoneX, zoneY, zoneId); - - Map const* map = object->GetMap(); - float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT); - float floorZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()); - - GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY()); - - // 63? WHY? - int gridX = 63 - gridCoord.x_coord; - int gridY = 63 - gridCoord.y_coord; - - uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0; - uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0; - - if (haveVMap) - { - if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ())) - handler->PSendSysMessage("You are outdoors"); - else - handler->PSendSysMessage("You are indoors"); - } - else - handler->PSendSysMessage("no VMAP available for area info"); - - handler->PSendSysMessage(LANG_MAP_POSITION, - object->GetMapId(), (mapEntry ? mapEntry->name : ""), - zoneId, (zoneEntry ? zoneEntry->area_name : ""), - areaId, (areaEntry ? areaEntry->area_name : ""), - object->GetPhaseMask(), - object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), - cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), - zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); - - LiquidData liquidStatus; - ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); - - if (status) - handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); - - return true; - } - - static bool HandleAuraCommand(ChatHandler* handler, char const* args) - { - Unit* target = handler->getSelectedUnit(); - if (!target) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId)) - Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, target, target); - - return true; - } - - static bool HandleUnAuraCommand(ChatHandler* handler, char const* args) - { - Unit* target = handler->getSelectedUnit(); - if (!target) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - std::string argstr = args; - if (argstr == "all") - { - target->RemoveAllAuras(); - return true; - } - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - if (!spellId) - return false; - - target->RemoveAurasDueToSpell(spellId); - - return true; - } - // Teleport to Player - static bool HandleAppearCommand(ChatHandler* handler, char const* args) - { - Player* target; - uint64 targetGuid; - std::string targetName; - if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) - return false; - - Player* _player = handler->GetSession()->GetPlayer(); - if (target == _player || targetGuid == _player->GetGUID()) - { - handler->SendSysMessage(LANG_CANT_TELEPORT_SELF); - handler->SetSentErrorMessage(true); - return false; - } - - if (target) - { - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - std::string chrNameLink = handler->playerLink(targetName); - - Map* map = target->GetMap(); - if (map->IsBattlegroundOrArena()) - { - // only allow if gm mode is on - if (!_player->isGameMaster()) - { - handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, chrNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - // if both players are in different bgs - else if (_player->GetBattlegroundId() && _player->GetBattlegroundId() != target->GetBattlegroundId()) - _player->LeaveBattleground(false); // Note: should be changed so _player gets no Deserter debuff - - // all's well, set bg id - // when porting out from the bg, it will be reset to 0 - _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); - // remember current position as entry point for return at bg end teleportation - if (!_player->GetMap()->IsBattlegroundOrArena()) - _player->SetBattlegroundEntryPoint(); - } - else if (map->IsDungeon()) - { - // we have to go to instance, and can go to player only if: - // 1) we are in his group (either as leader or as member) - // 2) we are not bound to any group and have GM mode on - if (_player->GetGroup()) - { - // we are in group, we can go only if we are in the player group - if (_player->GetGroup() != target->GetGroup()) - { - handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY, chrNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - } - else - { - // we are not in group, let's verify our GM mode - if (!_player->isGameMaster()) - { - handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM, chrNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - } - - // if the player or the player's group is bound to another instance - // the player will not be bound to another one - InstancePlayerBind* bind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty(map->IsRaid())); - if (!bind) - { - Group* group = _player->GetGroup(); - // if no bind exists, create a solo bind - InstanceGroupBind* gBind = group ? group->GetBoundInstance(target) : NULL; // if no bind exists, create a solo bind - if (!gBind) - if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(target->GetInstanceId())) - _player->BindToInstance(save, !save->CanReset()); - } - - if (map->IsRaid()) - _player->SetRaidDifficulty(target->GetRaidDifficulty()); - else - _player->SetDungeonDifficulty(target->GetDungeonDifficulty()); - } - - handler->PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str()); - - // stop flight if need - if (_player->isInFlight()) - { - _player->GetMotionMaster()->MovementExpired(); - _player->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - _player->SaveRecallPosition(); - - // to point to see at target with same orientation - float x, y, z; - target->GetContactPoint(_player, x, y, z); - - _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE); - _player->SetPhaseMask(target->GetPhaseMask(), true); - } - else - { - // check offline security - if (handler->HasLowerSecurity(NULL, targetGuid)) - return false; - - std::string nameLink = handler->playerLink(targetName); - - handler->PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str()); - - // to point where player stay (if loaded) - float x, y, z, o; - uint32 map; - bool in_flight; - if (!Player::LoadPositionFromDB(map, x, y, z, o, in_flight, targetGuid)) - return false; - - // stop flight if need - if (_player->isInFlight()) - { - _player->GetMotionMaster()->MovementExpired(); - _player->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - _player->SaveRecallPosition(); - - _player->TeleportTo(map, x, y, z, _player->GetOrientation()); - } - - return true; - } - // Summon Player - static bool HandleSummonCommand(ChatHandler* handler, char const* args) - { - Player* target; - uint64 targetGuid; - std::string targetName; - if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) - return false; - - Player* _player = handler->GetSession()->GetPlayer(); - if (target == _player || targetGuid == _player->GetGUID()) - { - handler->PSendSysMessage(LANG_CANT_TELEPORT_SELF); - handler->SetSentErrorMessage(true); - return false; - } - - if (target) - { - std::string nameLink = handler->playerLink(targetName); - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - if (target->IsBeingTeleported()) - { - handler->PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - Map* map = handler->GetSession()->GetPlayer()->GetMap(); - - if (map->IsBattlegroundOrArena()) - { - // only allow if gm mode is on - if (!_player->isGameMaster()) - { - handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - // if both players are in different bgs - else if (target->GetBattlegroundId() && handler->GetSession()->GetPlayer()->GetBattlegroundId() != target->GetBattlegroundId()) - target->LeaveBattleground(false); // Note: should be changed so target gets no Deserter debuff - - // all's well, set bg id - // when porting out from the bg, it will be reset to 0 - target->SetBattlegroundId(handler->GetSession()->GetPlayer()->GetBattlegroundId(), handler->GetSession()->GetPlayer()->GetBattlegroundTypeId()); - // remember current position as entry point for return at bg end teleportation - if (!target->GetMap()->IsBattlegroundOrArena()) - target->SetBattlegroundEntryPoint(); - } - else if (map->IsDungeon()) - { - Map* map = target->GetMap(); - - if (map->Instanceable() && map->GetInstanceId() != map->GetInstanceId()) - target->UnbindInstance(map->GetInstanceId(), target->GetDungeonDifficulty(), true); - - // we are in instance, and can summon only player in our group with us as lead - if (!handler->GetSession()->GetPlayer()->GetGroup() || !target->GetGroup() || - (target->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || - (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())) - // the last check is a bit excessive, but let it be, just in case - { - handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, nameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - } - - handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), ""); - if (handler->needReportToTarget(target)) - ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, handler->playerLink(_player->GetName()).c_str()); - - // stop flight if need - if (target->isInFlight()) - { - target->GetMotionMaster()->MovementExpired(); - target->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - target->SaveRecallPosition(); - - // before GM - float x, y, z; - handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize()); - target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation()); - target->SetPhaseMask(handler->GetSession()->GetPlayer()->GetPhaseMask(), true); - } - else - { - // check offline security - if (handler->HasLowerSecurity(NULL, targetGuid)) - return false; - - std::string nameLink = handler->playerLink(targetName); - - handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE)); - - // in point where GM stay - Player::SavePositionInDB(handler->GetSession()->GetPlayer()->GetMapId(), - handler->GetSession()->GetPlayer()->GetPositionX(), - handler->GetSession()->GetPlayer()->GetPositionY(), - handler->GetSession()->GetPlayer()->GetPositionZ(), - handler->GetSession()->GetPlayer()->GetOrientation(), - handler->GetSession()->GetPlayer()->GetZoneId(), - targetGuid); - } - - return true; - } - // Summon group of player - static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args) - { - Player* target; - if (!handler->extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - Group* group = target->GetGroup(); - - std::string nameLink = handler->GetNameLink(target); - - if (!group) - { - handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - Map* gmMap = handler->GetSession()->GetPlayer()->GetMap(); - bool toInstance = gmMap->Instanceable(); - - // we are in instance, and can summon only player in our group with us as lead - if (toInstance && ( - !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || - (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()))) - // the last check is a bit excessive, but let it be, just in case - { - handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST); - handler->SetSentErrorMessage(true); - return false; - } - - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) - { - Player* player = itr->getSource(); - - if (!player || player == handler->GetSession()->GetPlayer() || !player->GetSession()) - continue; - - // check online security - if (handler->HasLowerSecurity(player, 0)) - return false; - - std::string plNameLink = handler->GetNameLink(player); - - if (player->IsBeingTeleported() == true) - { - handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - if (toInstance) - { - Map* playerMap = player->GetMap(); - - if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId()) - { - // cannot summon from instance to instance - handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - } - - handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), ""); - if (handler->needReportToTarget(player)) - ChatHandler(player).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str()); - - // stop flight if need - if (player->isInFlight()) - { - player->GetMotionMaster()->MovementExpired(); - player->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - player->SaveRecallPosition(); - - // before GM - float x, y, z; - handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize()); - player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation()); - } - - return true; - } - - static bool HandleCommandsCommand(ChatHandler* handler, char const* /*args*/) - { - handler->ShowHelpForCommand(handler->getCommandTable(), ""); - return true; - } - - static bool HandleDieCommand(ChatHandler* handler, char const* /*args*/) - { - Unit* target = handler->getSelectedUnit(); - - if (!target || !handler->GetSession()->GetPlayer()->GetSelection()) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - if (target->GetTypeId() == TYPEID_PLAYER) - { - if (handler->HasLowerSecurity((Player*)target, 0, false)) - return false; - } - - if (target->isAlive()) - { - if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE)) - handler->GetSession()->GetPlayer()->Kill(target); - else - handler->GetSession()->GetPlayer()->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } - - return true; - } - - static bool HandleReviveCommand(ChatHandler* handler, char const* args) - { - Player* target; - uint64 targetGuid; - if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid)) - return false; - - if (target) - { - target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f); - target->SpawnCorpseBones(); - target->SaveToDB(); - } - else - // will resurrected at login without corpse - sObjectAccessor->ConvertCorpseForPlayer(targetGuid); - - return true; - } - - static bool HandleDismountCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - - // If player is not mounted, so go out :) - if (!player->IsMounted()) - { - handler->SendSysMessage(LANG_CHAR_NON_MOUNTED); - handler->SetSentErrorMessage(true); - return false; - } - - if (player->isInFlight()) - { - handler->SendSysMessage(LANG_YOU_IN_FLIGHT); - handler->SetSentErrorMessage(true); - return false; - } - - player->Dismount(); - player->RemoveAurasByType(SPELL_AURA_MOUNTED); - return true; - } - - static bool HandleGUIDCommand(ChatHandler* handler, char const* /*args*/) - { - uint64 guid = handler->GetSession()->GetPlayer()->GetSelection(); - - if (guid == 0) - { - handler->SendSysMessage(LANG_NO_SELECTION); - handler->SetSentErrorMessage(true); - return false; - } - - handler->PSendSysMessage(LANG_OBJECT_GUID, GUID_LOPART(guid), GUID_HIPART(guid)); - return true; - } - - static bool HandleHelpCommand(ChatHandler* handler, char const* args) - { - char const* cmd = strtok((char*)args, " "); - if (!cmd) - { - handler->ShowHelpForCommand(handler->getCommandTable(), "help"); - handler->ShowHelpForCommand(handler->getCommandTable(), ""); - } - else - { - if (!handler->ShowHelpForCommand(handler->getCommandTable(), cmd)) - handler->SendSysMessage(LANG_NO_HELP_CMD); - } - - return true; - } - // move item to other slot - static bool HandleItemMoveCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - char const* param1 = strtok((char*)args, " "); - if (!param1) - return false; - - char const* param2 = strtok(NULL, " "); - if (!param2) - return false; - - uint8 srcSlot = uint8(atoi(param1)); - uint8 dstSlot = uint8(atoi(param2)); - - if (srcSlot == dstSlot) - return true; - - if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, srcSlot, true)) - return false; - - if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, dstSlot, false)) - return false; - - uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcSlot); - uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstSlot); - - handler->GetSession()->GetPlayer()->SwapItem(src, dst); - - return true; - } - - static bool HandleCooldownCommand(ChatHandler* handler, char const* args) - { - Player* target = handler->getSelectedPlayer(); - if (!target) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - - std::string nameLink = handler->GetNameLink(target); - - if (!*args) - { - target->RemoveAllSpellCooldown(); - handler->PSendSysMessage(LANG_REMOVEALL_COOLDOWN, nameLink.c_str()); - } - else - { - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellIid = handler->extractSpellIdFromLink((char*)args); - if (!spellIid) - return false; - - if (!sSpellMgr->GetSpellInfo(spellIid)) - { - handler->PSendSysMessage(LANG_UNKNOWN_SPELL, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - target->RemoveSpellCooldown(spellIid, true); - handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); - } - return true; - } - - static bool HandleGetDistanceCommand(ChatHandler* handler, char const* args) - { - WorldObject* obj = NULL; - - if (*args) - { - uint64 guid = handler->extractGuidFromLink((char*)args); - if (guid) - obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); - - if (!obj) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - } - else - { - obj = handler->getSelectedUnit(); - - if (!obj) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - } - - handler->PSendSysMessage(LANG_DISTANCE, handler->GetSession()->GetPlayer()->GetDistance(obj), handler->GetSession()->GetPlayer()->GetDistance2d(obj), handler->GetSession()->GetPlayer()->GetExactDist(obj), handler->GetSession()->GetPlayer()->GetExactDist2d(obj)); - return true; - } - // Teleport player to last position - static bool HandleRecallCommand(ChatHandler* handler, char const* args) - { - Player* target; - if (!handler->extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - if (target->IsBeingTeleported()) - { - handler->PSendSysMessage(LANG_IS_TELEPORTED, handler->GetNameLink(target).c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - // stop flight if need - if (target->isInFlight()) - { - target->GetMotionMaster()->MovementExpired(); - target->CleanupAfterTaxiFlight(); - } - - target->TeleportTo(target->m_recallMap, target->m_recallX, target->m_recallY, target->m_recallZ, target->m_recallO); - return true; - } - - static bool HandleSaveCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - - // save GM account without delay and output message - if (!AccountMgr::IsPlayerAccount(handler->GetSession()->GetSecurity())) - { - if (Player* target = handler->getSelectedPlayer()) - target->SaveToDB(); - else - player->SaveToDB(); - handler->SendSysMessage(LANG_PLAYER_SAVED); - return true; - } - - // save if the player has last been saved over 20 seconds ago - uint32 saveInterval = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); - if (saveInterval == 0 || (saveInterval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= saveInterval - 20 * IN_MILLISECONDS)) - player->SaveToDB(); - - return true; - } - - // Save all players in the world - static bool HandleSaveAllCommand(ChatHandler* handler, char const* /*args*/) - { - sObjectAccessor->SaveAllPlayers(); - handler->SendSysMessage(LANG_PLAYERS_SAVED); - return true; - } - - // kick player - static bool HandleKickPlayerCommand(ChatHandler* handler, char const* args) - { - Player* target = NULL; - std::string playerName; - if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName)) - return false; - - if (handler->GetSession() && target == handler->GetSession()->GetPlayer()) - { - handler->SendSysMessage(LANG_COMMAND_KICKSELF); - handler->SetSentErrorMessage(true); - return false; - } - - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD)) - sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); - else - handler->PSendSysMessage(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); - - target->GetSession()->KickPlayer(); - - return true; - } - - static bool HandleStartCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - - if (player->isInFlight()) - { - handler->SendSysMessage(LANG_YOU_IN_FLIGHT); - handler->SetSentErrorMessage(true); - return false; - } - - if (player->isInCombat()) - { - handler->SendSysMessage(LANG_YOU_IN_COMBAT); - handler->SetSentErrorMessage(true); - return false; - } - - if (player->isDead() || player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) - { - // if player is dead and stuck, send ghost to graveyard - player->RepopAtGraveyard(); - return true; - } - - // cast spell Stuck - player->CastSpell(player, 7355, false); - return true; - } - // Enable on\off all taxi paths - static bool HandleTaxiCheatCommand(ChatHandler* handler, char const* args) - { - if (!*args) - { - handler->SendSysMessage(LANG_USE_BOL); - handler->SetSentErrorMessage(true); - return false; - } - - std::string argStr = (char*)args; - - Player* chr = handler->getSelectedPlayer(); - - if (!chr) - chr = handler->GetSession()->GetPlayer(); - else if (handler->HasLowerSecurity(chr, 0)) // check online security - return false; - - if (argStr == "on") - { - chr->SetTaxiCheater(true); - handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str()); - if (handler->needReportToTarget(chr)) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str()); - return true; - } - - if (argStr == "off") - { - chr->SetTaxiCheater(false); - handler->PSendSysMessage(LANG_YOU_REMOVE_TAXIS, handler->GetNameLink(chr).c_str()); - if (handler->needReportToTarget(chr)) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, handler->GetNameLink().c_str()); - - return true; - } - - handler->SendSysMessage(LANG_USE_BOL); - handler->SetSentErrorMessage(true); - - return false; - } - - static bool HandleLinkGraveCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - char* px = strtok((char*)args, " "); - if (!px) - return false; - - uint32 graveyardId = uint32(atoi(px)); - - uint32 team; - - char* px2 = strtok(NULL, " "); - - if (!px2) - team = 0; - else if (strncmp(px2, "horde", 6) == 0) - team = HORDE; - else if (strncmp(px2, "alliance", 9) == 0) - team = ALLIANCE; - else - return false; - - WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(graveyardId); - - if (!graveyard) - { - handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, graveyardId); - handler->SetSentErrorMessage(true); - return false; - } - - Player* player = handler->GetSession()->GetPlayer(); - - uint32 zoneId = player->GetZoneId(); - - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId); - if (!areaEntry || areaEntry->zone !=0) - { - handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId); - handler->SetSentErrorMessage(true); - return false; - } - - if (sObjectMgr->AddGraveYardLink(graveyardId, zoneId, team)) - handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, graveyardId, zoneId); - else - handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDALRLINKED, graveyardId, zoneId); - - return true; - } - - static bool HandleNearGraveCommand(ChatHandler* handler, char const* args) - { - uint32 team; - - size_t argStr = strlen(args); - - if (!*args) - team = 0; - else if (strncmp((char*)args, "horde", argStr) == 0) - team = HORDE; - else if (strncmp((char*)args, "alliance", argStr) == 0) - team = ALLIANCE; - else - return false; - - Player* player = handler->GetSession()->GetPlayer(); - uint32 zone_id = player->GetZoneId(); - - WorldSafeLocsEntry const* graveyard = sObjectMgr->GetClosestGraveYard( - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), team); - - if (graveyard) - { - uint32 graveyardId = graveyard->ID; - - GraveYardData const* data = sObjectMgr->FindGraveYardData(graveyardId, zone_id); - if (!data) - { - handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR, graveyardId); - handler->SetSentErrorMessage(true); - return false; - } - - team = data->team; - - std::string team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_NOTEAM); - - if (team == 0) - team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY); - else if (team == HORDE) - team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE); - else if (team == ALLIANCE) - team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE); - - handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, graveyardId, team_name.c_str(), zone_id); - } - else - { - std::string team_name; - - if (team == 0) - team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY); - else if (team == HORDE) - team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE); - else if (team == ALLIANCE) - team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE); - - if (team == ~uint32(0)) - handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAVEYARDS, zone_id); - else - handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id, team_name.c_str()); - } - - return true; - } - - static bool HandleExploreCheatCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - int32 flag = int32(atoi((char*)args)); - - Player* playerTarget = handler->getSelectedPlayer(); - if (!playerTarget) - { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; - } - - if (flag != 0) - { - handler->PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, handler->GetNameLink(playerTarget).c_str()); - if (handler->needReportToTarget(playerTarget)) - ChatHandler(playerTarget).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL, handler->GetNameLink().c_str()); - } - else - { - handler->PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, handler->GetNameLink(playerTarget).c_str()); - if (handler->needReportToTarget(playerTarget)) - ChatHandler(playerTarget).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING, handler->GetNameLink().c_str()); - } - - for (uint8 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i) - { - if (flag != 0) - handler->GetSession()->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0xFFFFFFFF); - else - handler->GetSession()->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0); - } - - return true; - } - - static bool HandleShowAreaCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - Player* playerTarget = handler->getSelectedPlayer(); - if (!playerTarget) - { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; - } - - int32 area = GetAreaFlagByAreaID(atoi((char*)args)); - int32 offset = area / 32; - uint32 val = uint32((1 << (area % 32))); - - if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - - uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); - playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields | val))); - - handler->SendSysMessage(LANG_EXPLORE_AREA); - return true; - } - - static bool HandleHideAreaCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - Player* playerTarget = handler->getSelectedPlayer(); - if (!playerTarget) - { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; - } - - int32 area = GetAreaFlagByAreaID(atoi((char*)args)); - int32 offset = area / 32; - uint32 val = uint32((1 << (area % 32))); - - if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - - uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); - playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields ^ val))); - - handler->SendSysMessage(LANG_UNEXPLORE_AREA); - return true; - } - - static bool HandleAddItemCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - uint32 itemId = 0; - - if (args[0] == '[') // [name] manual form - { - char const* itemNameStr = strtok((char*)args, "]"); - - if (itemNameStr && itemNameStr[0]) - { - std::string itemName = itemNameStr+1; - WorldDatabase.EscapeString(itemName); - - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME); - stmt->setString(0, itemName); - PreparedQueryResult result = WorldDatabase.Query(stmt); - - if (!result) - { - handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr+1); - handler->SetSentErrorMessage(true); - return false; - } - itemId = result->Fetch()->GetUInt32(); - } - else - return false; - } - else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r - { - char const* id = handler->extractKeyFromLink((char*)args, "Hitem"); - if (!id) - return false; - itemId = uint32(atol(id)); - } - - char const* ccount = strtok(NULL, " "); - - int32 count = 1; - - if (ccount) - count = strtol(ccount, NULL, 10); - - if (count == 0) - count = 1; - - Player* player = handler->GetSession()->GetPlayer(); - Player* playerTarget = handler->getSelectedPlayer(); - if (!playerTarget) - playerTarget = player; - - sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_ADDITEM), itemId, count); - - ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); - if (!itemTemplate) - { - handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); - handler->SetSentErrorMessage(true); - return false; - } - - // Subtract - if (count < 0) - { - playerTarget->DestroyItemCount(itemId, -count, true, false); - handler->PSendSysMessage(LANG_REMOVEITEM, itemId, -count, handler->GetNameLink(playerTarget).c_str()); - return true; - } - - // Adding items - uint32 noSpaceForCount = 0; - - // check space and find places - ItemPosCountVec dest; - InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount); - if (msg != EQUIP_ERR_OK) // convert to possible store amount - count -= noSpaceForCount; - - if (count == 0 || dest.empty()) // can't add any - { - handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); - handler->SetSentErrorMessage(true); - return false; - } - - Item* item = playerTarget->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId)); - - // remove binding (let GM give it to another player later) - if (player == playerTarget) - for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr) - if (Item* item1 = player->GetItemByPos(itr->pos)) - item1->SetBinding(false); - - if (count > 0 && item) - { - player->SendNewItem(item, count, false, true); - if (player != playerTarget) - playerTarget->SendNewItem(item, count, true, false); - } - - if (noSpaceForCount > 0) - handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); - - return true; - } - - static bool HandleAddItemSetCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - char const* id = handler->extractKeyFromLink((char*)args, "Hitemset"); // number or [name] Shift-click form |color|Hitemset:itemset_id|h[name]|h|r - if (!id) - return false; - - uint32 itemSetId = atol(id); - - // prevent generation all items with itemset field value '0' - if (itemSetId == 0) - { - handler->PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemSetId); - handler->SetSentErrorMessage(true); - return false; - } - - Player* player = handler->GetSession()->GetPlayer(); - Player* playerTarget = handler->getSelectedPlayer(); - if (!playerTarget) - playerTarget = player; - - sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_ADDITEMSET), itemSetId); - - bool found = false; - ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); - for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) - { - if (itr->second.ItemSet == itemSetId) - { - found = true; - ItemPosCountVec dest; - InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itr->second.ItemId, 1); - if (msg == EQUIP_ERR_OK) - { - Item* item = playerTarget->StoreNewItem(dest, itr->second.ItemId, true); - - // remove binding (let GM give it to another player later) - if (player == playerTarget) - item->SetBinding(false); - - player->SendNewItem(item, 1, false, true); - if (player != playerTarget) - playerTarget->SendNewItem(item, 1, true, false); - } - else - { - player->SendEquipError(msg, NULL, NULL, itr->second.ItemId); - handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itr->second.ItemId, 1); - } - } - } - - if (!found) - { - handler->PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemSetId); - handler->SetSentErrorMessage(true); - return false; - } - - return true; - } - - static bool HandleBankCommand(ChatHandler* handler, char const* /*args*/) - { - handler->GetSession()->SendShowBank(handler->GetSession()->GetPlayer()->GetGUID()); - return true; - } - - static bool HandleChangeWeather(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - // Weather is OFF - if (!sWorld->getBoolConfig(CONFIG_WEATHER)) - { - handler->SendSysMessage(LANG_WEATHER_DISABLED); - handler->SetSentErrorMessage(true); - return false; - } - - // *Change the weather of a cell - char const* px = strtok((char*)args, " "); - char const* py = strtok(NULL, " "); - - if (!px || !py) - return false; - - uint32 type = uint32(atoi(px)); //0 to 3, 0: fine, 1: rain, 2: snow, 3: sand - float grade = float(atof(py)); //0 to 1, sending -1 is instand good weather - - Player* player = handler->GetSession()->GetPlayer(); - uint32 zoneid = player->GetZoneId(); - - Weather* weather = WeatherMgr::FindWeather(zoneid); - - if (!weather) - weather = WeatherMgr::AddWeather(zoneid); - if (!weather) - { - handler->SendSysMessage(LANG_NO_WEATHER); - handler->SetSentErrorMessage(true); - return false; - } - - weather->SetWeather(WeatherType(type), grade); - - return true; - } - - - static bool HandleMaxSkillCommand(ChatHandler* handler, char const* /*args*/) - { - Player* SelectedPlayer = handler->getSelectedPlayer(); - if (!SelectedPlayer) - { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; - } - - // each skills that have max skill value dependent from level seted to current level max skill value - SelectedPlayer->UpdateSkillsToMaxSkillsForLevel(); - return true; - } - - static bool HandleSetSkillCommand(ChatHandler* handler, char const* args) - { - // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r - char const* skillStr = handler->extractKeyFromLink((char*)args, "Hskill"); - if (!skillStr) - return false; - - char const* levelStr = strtok(NULL, " "); - if (!levelStr) - return false; - - char const* maxPureSkill = strtok(NULL, " "); - - int32 skill = atoi(skillStr); - if (skill <= 0) - { - handler->PSendSysMessage(LANG_INVALID_SKILL_ID, skill); - handler->SetSentErrorMessage(true); - return false; - } - - int32 level = uint32(atol(levelStr)); - - Player* target = handler->getSelectedPlayer(); - if (!target) - { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; - } - - SkillLineEntry const* skillLine = sSkillLineStore.LookupEntry(skill); - if (!skillLine) - { - handler->PSendSysMessage(LANG_INVALID_SKILL_ID, skill); - handler->SetSentErrorMessage(true); - return false; - } - - std::string tNameLink = handler->GetNameLink(target); - - if (!target->GetSkillValue(skill)) - { - handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]); - handler->SetSentErrorMessage(true); - return false; - } - - uint16 max = maxPureSkill ? atol (maxPureSkill) : target->GetPureMaxSkillValue(skill); - - if (level <= 0 || level > max || max <= 0) - return false; - - target->SetSkill(skill, target->GetSkillStep(skill), level, max); - handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max); - - return true; - } - // show info of player - static bool HandlePInfoCommand(ChatHandler* handler, char const* args) - { - Player* target; - uint64 targetGuid; - std::string targetName; - - uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER); - - if (sObjectMgr->GetPlayerNameByGUID(parseGUID, targetName)) - { - target = sObjectMgr->GetPlayerByLowGUID(parseGUID); - targetGuid = parseGUID; - } - else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) - return false; - - uint32 accId = 0; - uint32 money = 0; - uint32 totalPlayerTime = 0; - uint8 level = 0; - uint32 latency = 0; - uint8 race; - uint8 Class; - int64 muteTime = 0; - int64 banTime = -1; - uint32 mapId; - uint32 areaId; - uint32 phase = 0; - - // get additional information from Player object - if (target) - { - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - accId = target->GetSession()->GetAccountId(); - money = target->GetMoney(); - totalPlayerTime = target->GetTotalPlayedTime(); - level = target->getLevel(); - latency = target->GetSession()->GetLatency(); - race = target->getRace(); - Class = target->getClass(); - muteTime = target->GetSession()->m_muteTime; - mapId = target->GetMapId(); - areaId = target->GetAreaId(); - phase = target->GetPhaseMask(); - } - // get additional information from DB - else - { - // check offline security - if (handler->HasLowerSecurity(NULL, targetGuid)) - return false; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO); - stmt->setUInt32(0, GUID_LOPART(targetGuid)); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - return false; - - Field* fields = result->Fetch(); - totalPlayerTime = fields[0].GetUInt32(); - level = fields[1].GetUInt8(); - money = fields[2].GetUInt32(); - accId = fields[3].GetUInt32(); - race = fields[4].GetUInt8(); - Class = fields[5].GetUInt8(); - mapId = fields[6].GetUInt16(); - areaId = fields[7].GetUInt16(); - } - - std::string userName = handler->GetTrinityString(LANG_ERROR); - std::string eMail = handler->GetTrinityString(LANG_ERROR); - std::string lastIp = handler->GetTrinityString(LANG_ERROR); - uint32 security = 0; - std::string lastLogin = handler->GetTrinityString(LANG_ERROR); - - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO); - stmt->setInt32(0, int32(realmID)); - stmt->setUInt32(1, accId); - PreparedQueryResult result = LoginDatabase.Query(stmt); - - if (result) - { - Field* fields = result->Fetch(); - userName = fields[0].GetString(); - security = fields[1].GetUInt8(); - eMail = fields[2].GetString(); - muteTime = fields[5].GetUInt64(); - - if (eMail.empty()) - eMail = "-"; - - if (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security)) - { - lastIp = fields[3].GetString(); - lastLogin = fields[4].GetString(); - - uint32 ip = inet_addr(lastIp.c_str()); -#if TRINITY_ENDIAN == BIGENDIAN - EndianConvertReverse(ip); -#endif - - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_IP2NATION_COUNTRY); - - stmt->setUInt32(0, ip); - - PreparedQueryResult result2 = WorldDatabase.Query(stmt); - - if (result2) - { - Field* fields2 = result2->Fetch(); - lastIp.append(" ("); - lastIp.append(fields2[0].GetString()); - lastIp.append(")"); - } - } - else - { - lastIp = "-"; - lastLogin = "-"; - } - } - - std::string nameLink = handler->playerLink(targetName); - - handler->PSendSysMessage(LANG_PINFO_ACCOUNT, (target ? "" : handler->GetTrinityString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(targetGuid), userName.c_str(), accId, eMail.c_str(), security, lastIp.c_str(), lastLogin.c_str(), latency); - - std::string bannedby = "unknown"; - std::string banreason = ""; - - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS); - stmt->setUInt32(0, accId); - PreparedQueryResult result2 = LoginDatabase.Query(stmt); - if (!result2) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS); - stmt->setUInt32(0, GUID_LOPART(targetGuid)); - result2 = CharacterDatabase.Query(stmt); - } - - if (result2) - { - Field* fields = result2->Fetch(); - banTime = int64(fields[1].GetBool() ? 0 : fields[0].GetUInt32()); - bannedby = fields[2].GetString(); - banreason = fields[3].GetString(); - } - - if (muteTime > 0) - handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str()); - - if (banTime >= 0) - handler->PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str()); - - std::string raceStr, ClassStr; - switch (race) - { - case RACE_HUMAN: - raceStr = "Human"; - break; - case RACE_ORC: - raceStr = "Orc"; - break; - case RACE_DWARF: - raceStr = "Dwarf"; - break; - case RACE_NIGHTELF: - raceStr = "Night Elf"; - break; - case RACE_UNDEAD_PLAYER: - raceStr = "Undead"; - break; - case RACE_TAUREN: - raceStr = "Tauren"; - break; - case RACE_GNOME: - raceStr = "Gnome"; - break; - case RACE_TROLL: - raceStr = "Troll"; - break; - case RACE_BLOODELF: - raceStr = "Blood Elf"; - break; - case RACE_DRAENEI: - raceStr = "Draenei"; - break; - } - - switch (Class) - { - case CLASS_WARRIOR: - ClassStr = "Warrior"; - break; - case CLASS_PALADIN: - ClassStr = "Paladin"; - break; - case CLASS_HUNTER: - ClassStr = "Hunter"; - break; - case CLASS_ROGUE: - ClassStr = "Rogue"; - break; - case CLASS_PRIEST: - ClassStr = "Priest"; - break; - case CLASS_DEATH_KNIGHT: - ClassStr = "Death Knight"; - break; - case CLASS_SHAMAN: - ClassStr = "Shaman"; - break; - case CLASS_MAGE: - ClassStr = "Mage"; - break; - case CLASS_WARLOCK: - ClassStr = "Warlock"; - break; - case CLASS_DRUID: - ClassStr = "Druid"; - break; - } - - std::string timeStr = secsToTimeString(totalPlayerTime, true, true); - uint32 gold = money /GOLD; - uint32 silv = (money % GOLD) / SILVER; - uint32 copp = (money % GOLD) % SILVER; - handler->PSendSysMessage(LANG_PINFO_LEVEL, raceStr.c_str(), ClassStr.c_str(), timeStr.c_str(), level, gold, silv, copp); - - // Add map, zone, subzone and phase to output - int locale = handler->GetSessionDbcLocale(); - std::string areaName = ""; - std::string zoneName = ""; - - MapEntry const* map = sMapStore.LookupEntry(mapId); - - AreaTableEntry const* area = GetAreaEntryByAreaID(areaId); - if (area) - { - areaName = area->area_name[locale]; - - AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); - if (zone) - zoneName = zone->area_name[locale]; - } - - if (target) - { - if (!zoneName.empty()) - handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], zoneName.c_str(), areaName.c_str(), phase); - else - handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], areaName.c_str(), "", phase); - } - else - handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str()); - - return true; - } - - static bool HandleRespawnCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - - // accept only explicitly selected target (not implicitly self targeting case) - Unit* target = handler->getSelectedUnit(); - if (player->GetSelection() && target) - { - if (target->GetTypeId() != TYPEID_UNIT || target->isPet()) - { - handler->SendSysMessage(LANG_SELECT_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - if (target->isDead()) - target->ToCreature()->Respawn(); - return true; - } - - CellCoord p(Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Trinity::RespawnDo u_do; - Trinity::WorldObjectWorker worker(player, u_do); - - TypeContainerVisitor, GridTypeMapContainer > obj_worker(worker); - cell.Visit(p, obj_worker, *player->GetMap(), *player, player->GetGridActivationRange()); - - return true; - } - // mute player for some times - static bool HandleMuteCommand(ChatHandler* handler, char const* args) - { - char* nameStr; - char* delayStr; - handler->extractOptFirstArg((char*)args, &nameStr, &delayStr); - if (!delayStr) - return false; - - char const* muteReason = strtok(NULL, "\r"); - std::string muteReasonStr = "No reason"; - if (muteReason != NULL) - muteReasonStr = muteReason; - - Player* target; - uint64 targetGuid; - std::string targetName; - if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) - return false; - - uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); - - // find only player from same account if any - if (!target) - if (WorldSession* session = sWorld->FindSession(accountId)) - target = session->GetPlayer(); - - uint32 notSpeakTime = uint32(atoi(delayStr)); - - // must have strong lesser security level - if (handler->HasLowerSecurity (target, targetGuid, true)) - return false; - - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); - - if (target) - { - // Target is online, mute will be in effect right away. - int64 muteTime = time(NULL) + notSpeakTime * MINUTE; - target->GetSession()->m_muteTime = muteTime; - stmt->setInt64(0, muteTime); - ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteReasonStr.c_str()); - } - else - { - // Target is offline, mute will be in effect starting from the next login. - int32 muteTime = -int32(notSpeakTime * MINUTE); - stmt->setInt64(0, muteTime); - } - - stmt->setUInt32(1, accountId); - LoginDatabase.Execute(stmt); - std::string nameLink = handler->playerLink(targetName); - - handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); - - return true; - } - - // unmute player - static bool HandleUnmuteCommand(ChatHandler* handler, char const* args) - { - Player* target; - uint64 targetGuid; - std::string targetName; - if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) - return false; - - uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); - - // find only player from same account if any - if (!target) - if (WorldSession* session = sWorld->FindSession(accountId)) - target = session->GetPlayer(); - - // must have strong lesser security level - if (handler->HasLowerSecurity (target, targetGuid, true)) - return false; - - if (target) - { - if (target->CanSpeak()) - { - handler->SendSysMessage(LANG_CHAT_ALREADY_ENABLED); - handler->SetSentErrorMessage(true); - return false; - } - - target->GetSession()->m_muteTime = 0; - } - - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); - stmt->setInt64(0, 0); - stmt->setUInt32(1, accountId); - LoginDatabase.Execute(stmt); - - if (target) - ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED); - - std::string nameLink = handler->playerLink(targetName); - - handler->PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str()); - - return true; - } - - - static bool HandleMovegensCommand(ChatHandler* handler, char const* /*args*/) - { - Unit* unit = handler->getSelectedUnit(); - if (!unit) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - handler->PSendSysMessage(LANG_MOVEGENS_LIST, (unit->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), unit->GetGUIDLow()); - - MotionMaster* motionMaster = unit->GetMotionMaster(); - float x, y, z; - motionMaster->GetDestination(x, y, z); - - for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i) - { - MovementGenerator* movementGenerator = motionMaster->GetMotionSlot(i); - if (!movementGenerator) - { - handler->SendSysMessage("Empty"); - continue; - } - - switch (movementGenerator->GetMovementGeneratorType()) - { - case IDLE_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_IDLE); - break; - case RANDOM_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_RANDOM); - break; - case WAYPOINT_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_WAYPOINT); - break; - case ANIMAL_RANDOM_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_ANIMAL_RANDOM); - break; - case CONFUSED_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_CONFUSED); - break; - case CHASE_MOTION_TYPE: - { - Unit* target = NULL; - if (unit->GetTypeId() == TYPEID_PLAYER) - target = static_cast const*>(movementGenerator)->GetTarget(); - else - target = static_cast const*>(movementGenerator)->GetTarget(); - - if (!target) - handler->SendSysMessage(LANG_MOVEGENS_CHASE_NULL); - else if (target->GetTypeId() == TYPEID_PLAYER) - handler->PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, target->GetName(), target->GetGUIDLow()); - else - handler->PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, target->GetName(), target->GetGUIDLow()); - break; - } - case FOLLOW_MOTION_TYPE: - { - Unit* target = NULL; - if (unit->GetTypeId() == TYPEID_PLAYER) - target = static_cast const*>(movementGenerator)->GetTarget(); - else - target = static_cast const*>(movementGenerator)->GetTarget(); - - if (!target) - handler->SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL); - else if (target->GetTypeId() == TYPEID_PLAYER) - handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, target->GetName(), target->GetGUIDLow()); - else - handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, target->GetName(), target->GetGUIDLow()); - break; - } - case HOME_MOTION_TYPE: - { - if (unit->GetTypeId() == TYPEID_UNIT) - handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); - else - handler->SendSysMessage(LANG_MOVEGENS_HOME_PLAYER); - break; - } - case FLIGHT_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_FLIGHT); - break; - case POINT_MOTION_TYPE: - { - handler->PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z); - break; - } - case FLEEING_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_FEAR); - break; - case DISTRACT_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_DISTRACT); - break; - case EFFECT_MOTION_TYPE: - handler->SendSysMessage(LANG_MOVEGENS_EFFECT); - break; - default: - handler->PSendSysMessage(LANG_MOVEGENS_UNKNOWN, movementGenerator->GetMovementGeneratorType()); - break; - } - } - return true; - } - /* - ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator - Without this function 3rd party scripting library will get linking errors (unresolved external) - when attempting to use the PointMovementGenerator - */ - static bool HandleComeToMeCommand(ChatHandler* handler, char const* args) - { - char const* newFlagStr = strtok((char*)args, " "); - if (!newFlagStr) - return false; - - Creature* caster = handler->getSelectedCreature(); - if (!caster) - { - handler->SendSysMessage(LANG_SELECT_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - Player* player = handler->GetSession()->GetPlayer(); - - caster->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); - - return true; - } - - static bool HandleDamageCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - Unit* target = handler->getSelectedUnit(); - if (!target || !handler->GetSession()->GetPlayer()->GetSelection()) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - if (target->GetTypeId() == TYPEID_PLAYER) - { - if (handler->HasLowerSecurity((Player*)target, 0, false)) - return false; - } - - if (!target->isAlive()) - return true; - - char* damageStr = strtok((char*)args, " "); - if (!damageStr) - return false; - - int32 damage_int = atoi((char*)damageStr); - if (damage_int <= 0) - return true; - - uint32 damage = damage_int; - - char* schoolStr = strtok((char*)NULL, " "); - - // flat melee damage without resistence/etc reduction - if (!schoolStr) - { - handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - if (target != handler->GetSession()->GetPlayer()) - handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0); - return true; - } - - uint32 school = schoolStr ? atoi((char*)schoolStr) : SPELL_SCHOOL_NORMAL; - if (school >= MAX_SPELL_SCHOOL) - return false; - - SpellSchoolMask schoolmask = SpellSchoolMask(1 << school); - - if (Unit::IsDamageReducedByArmor(schoolmask)) - damage = handler->GetSession()->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK); - - char* spellStr = strtok((char*)NULL, " "); - - // melee damage by specific school - if (!spellStr) - { - uint32 absorb = 0; - uint32 resist = 0; - - handler->GetSession()->GetPlayer()->CalcAbsorbResist(target, schoolmask, SPELL_DIRECT_DAMAGE, damage, &absorb, &resist); - - if (damage <= absorb + resist) - return true; - - damage -= absorb + resist; - - handler->GetSession()->GetPlayer()->DealDamageMods(target, damage, &absorb); - handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false); - handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); - return true; - } - - // non-melee damage - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellid = handler->extractSpellIdFromLink((char*)args); - if (!spellid || !sSpellMgr->GetSpellInfo(spellid)) - return false; - - handler->GetSession()->GetPlayer()->SpellNonMeleeDamageLog(target, spellid, damage); - return true; - } - - static bool HandleCombatStopCommand(ChatHandler* handler, char const* args) - { - Player* target = NULL; - - if (args && strlen(args) > 0) - { - target = sObjectAccessor->FindPlayerByName(args); - if (!target) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - } - - if (!target) - { - if (!handler->extractPlayerTarget((char*)args, &target)) - return false; - } - - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - target->CombatStop(); - target->getHostileRefManager().deleteReferences(); - return true; - } - - static bool HandleFlushArenaPointsCommand(ChatHandler* /*handler*/, char const* /*args*/) - { - sArenaTeamMgr->DistributeArenaPoints(); - return true; - } - - static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args) - { - Player* target; - if (!handler->extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (handler->HasLowerSecurity(target, 0)) - return false; - - // Repair items - target->DurabilityRepairAll(false, 0, false); - - handler->PSendSysMessage(LANG_YOU_REPAIR_ITEMS, handler->GetNameLink(target).c_str()); - if (handler->needReportToTarget(target)) - ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, handler->GetNameLink().c_str()); - - return true; - } - - static bool HandleWaterwalkCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - Player* player = handler->getSelectedPlayer(); - if (!player) - { - handler->PSendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; - } - - // check online security - if (handler->HasLowerSecurity(player, 0)) - return false; - - if (strncmp(args, "on", 3) == 0) - player->SendMovementSetWaterWalking(true); - else if (strncmp(args, "off", 4) == 0) - player->SendMovementSetWaterWalking(false); - else - { - handler->SendSysMessage(LANG_USE_BOL); - return false; - } - - handler->PSendSysMessage(LANG_YOU_SET_WATERWALK, args, handler->GetNameLink(player).c_str()); - if (handler->needReportToTarget(player)) - ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, handler->GetNameLink().c_str()); - return true; - } - - // Send mail by command - static bool HandleSendMailCommand(ChatHandler* handler, char const* args) - { - // format: name "subject text" "mail text" - Player* target; - uint64 targetGuid; - std::string targetName; - if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) - return false; - - char* tail1 = strtok(NULL, ""); - if (!tail1) - return false; - - char const* msgSubject = handler->extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(NULL, ""); - if (!tail2) - return false; - - char const* msgText = handler->extractQuotedArg(tail2); - if (!msgText) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - - // from console show not existed sender - MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); - - //- TODO: Fix poor design - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - MailDraft(subject, text) - .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender); - - CharacterDatabase.CommitTransaction(trans); - - std::string nameLink = handler->playerLink(targetName); - handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); - return true; - } - // Send items by mail - static bool HandleSendItemsCommand(ChatHandler* handler, char const* args) - { - // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12] - Player* receiver; - uint64 receiverGuid; - std::string receiverName; - if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName)) - return false; - - char* tail1 = strtok(NULL, ""); - if (!tail1) - return false; - - char const* msgSubject = handler->extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(NULL, ""); - if (!tail2) - return false; - - char const* msgText = handler->extractQuotedArg(tail2); - if (!msgText) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - - // extract items - typedef std::pair ItemPair; - typedef std::list< ItemPair > ItemPairs; - ItemPairs items; - - // get all tail string - char* tail = strtok(NULL, ""); - - // get from tail next item str - while (char* itemStr = strtok(tail, " ")) - { - // and get new tail - tail = strtok(NULL, ""); - - // parse item str - char const* itemIdStr = strtok(itemStr, ":"); - char const* itemCountStr = strtok(NULL, " "); - - uint32 itemId = atoi(itemIdStr); - if (!itemId) - return false; - - ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(itemId); - if (!item_proto) - { - handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); - handler->SetSentErrorMessage(true); - return false; - } - - uint32 itemCount = itemCountStr ? atoi(itemCountStr) : 1; - if (itemCount < 1 || (item_proto->MaxCount > 0 && itemCount > uint32(item_proto->MaxCount))) - { - handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemId); - handler->SetSentErrorMessage(true); - return false; - } - - while (itemCount > item_proto->GetMaxStackSize()) - { - items.push_back(ItemPair(itemId, item_proto->GetMaxStackSize())); - itemCount -= item_proto->GetMaxStackSize(); - } - - items.push_back(ItemPair(itemId, itemCount)); - - if (items.size() > MAX_MAIL_ITEMS) - { - handler->PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS); - handler->SetSentErrorMessage(true); - return false; - } - } - - // from console show not existed sender - MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); - - // fill mail - MailDraft draft(subject, text); - - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr) - { - if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0)) - { - item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted - draft.AddItem(item); - } - } - - draft.SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender); - CharacterDatabase.CommitTransaction(trans); - - std::string nameLink = handler->playerLink(receiverName); - handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); - return true; - } - /// Send money by mail - static bool HandleSendMoneyCommand(ChatHandler* handler, char const* args) - { - /// format: name "subject text" "mail text" money - - Player* receiver; - uint64 receiverGuid; - std::string receiverName; - if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName)) - return false; - - char* tail1 = strtok(NULL, ""); - if (!tail1) - return false; - - char* msgSubject = handler->extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(NULL, ""); - if (!tail2) - return false; - - char* msgText = handler->extractQuotedArg(tail2); - if (!msgText) - return false; - - char* moneyStr = strtok(NULL, ""); - int32 money = moneyStr ? atoi(moneyStr) : 0; - if (money <= 0) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - - // from console show not existed sender - MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); - - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - MailDraft(subject, text) - .AddMoney(money) - .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender); - - CharacterDatabase.CommitTransaction(trans); - - std::string nameLink = handler->playerLink(receiverName); - handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); - return true; - } - /// Send a message to a player in game - static bool HandleSendMessageCommand(ChatHandler* handler, char const* args) - { - /// - Find the player - Player* player; - if (!handler->extractPlayerTarget((char*)args, &player)) - return false; - - char* msgStr = strtok(NULL, ""); - if (!msgStr) - return false; - - ///- Check that he is not logging out. - if (player->GetSession()->isLogingOut()) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - - /// - Send the message - // Use SendAreaTriggerMessage for fastest delivery. - player->GetSession()->SendAreaTriggerMessage("%s", msgStr); - player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r"); - - // Confirmation message - std::string nameLink = handler->GetNameLink(player); - handler->PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), msgStr); - - return true; - } - - static bool HandleCreatePetCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - Creature* creatureTarget = handler->getSelectedCreature(); - - if (!creatureTarget || creatureTarget->isPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER) - { - handler->PSendSysMessage(LANG_SELECT_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry()); - // Creatures with family 0 crashes the server - if (!creatrueTemplate->family) - { - handler->PSendSysMessage("This creature cannot be tamed. (family id: 0)."); - handler->SetSentErrorMessage(true); - return false; - } - - if (player->GetPetGUID()) - { - handler->PSendSysMessage("You already have a pet"); - handler->SetSentErrorMessage(true); - return false; - } - - // Everything looks OK, create new pet - Pet* pet = new Pet(player, HUNTER_PET); - if (!pet->CreateBaseAtCreature(creatureTarget)) - { - delete pet; - handler->PSendSysMessage("Error 1"); - return false; - } - - creatureTarget->setDeathState(JUST_DIED); - creatureTarget->RemoveCorpse(); - creatureTarget->SetHealth(0); // just for nice GM-mode view - - pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID()); - pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction()); - - if (!pet->InitStatsForLevel(creatureTarget->getLevel())) - { - sLog->outError(LOG_FILTER_GENERAL, "InitStatsForLevel() in EffectTameCreature failed! Pet deleted."); - handler->PSendSysMessage("Error 2"); - delete pet; - return false; - } - - // prepare visual effect for levelup - pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1); - - pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); - // this enables pet details window (Shift+P) - pet->InitPetCreateSpells(); - pet->SetFullHealth(); - - pet->GetMap()->AddToMap(pet->ToCreature()); - - // visual effect for levelup - pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()); - - player->SetMinion(pet, true); - pet->SavePetToDB(PET_SAVE_AS_CURRENT); - player->PetSpellInitialize(); - - return true; - } - - static bool HandlePetLearnCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - Player* player = handler->GetSession()->GetPlayer(); - Pet* pet = player->GetPet(); - - if (!pet) - { - handler->PSendSysMessage("You have no pet"); - handler->SetSentErrorMessage(true); - return false; - } - - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - - if (!spellId || !sSpellMgr->GetSpellInfo(spellId)) - return false; - - // Check if pet already has it - if (pet->HasSpell(spellId)) - { - handler->PSendSysMessage("Pet already has spell: %u", spellId); - handler->SetSentErrorMessage(true); - return false; - } - - // Check if spell is valid - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - pet->learnSpell(spellId); - - handler->PSendSysMessage("Pet has learned spell %u", spellId); - return true; - } - - static bool HandlePetUnlearnCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - Player* player = handler->GetSession()->GetPlayer(); - Pet* pet = player->GetPet(); - if (!pet) - { - handler->PSendSysMessage("You have no pet"); - handler->SetSentErrorMessage(true); - return false; - } - - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - - if (pet->HasSpell(spellId)) - pet->removeSpell(spellId, false); - else - handler->PSendSysMessage("Pet doesn't have that spell"); - - return true; - } - - static bool HandleFreezeCommand(ChatHandler* handler, char const* args) - { - std::string name; - Player* player; - char const* TargetName = strtok((char*)args, " "); // get entered name - if (!TargetName) // if no name entered use target - { - player = handler->getSelectedPlayer(); - if (player) //prevent crash with creature as target - { - name = player->GetName(); - normalizePlayerName(name); - } - } - else // if name entered - { - name = TargetName; - normalizePlayerName(name); - player = sObjectAccessor->FindPlayerByName(name.c_str()); - } - - if (!player) - { - handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); - return true; - } - - if (player == handler->GetSession()->GetPlayer()) - { - handler->SendSysMessage(LANG_COMMAND_FREEZE_ERROR); - return true; - } - - // effect - if (player && (player != handler->GetSession()->GetPlayer())) - { - handler->PSendSysMessage(LANG_COMMAND_FREEZE, name.c_str()); - - // stop combat + make player unattackable + duel stop + stop some spells - player->setFaction(35); - player->CombatStop(); - if (player->IsNonMeleeSpellCasted(true)) - player->InterruptNonMeleeSpells(true); - player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - // if player class = hunter || warlock remove pet if alive - if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK)) - { - if (Pet* pet = player->GetPet()) - { - pet->SavePetToDB(PET_SAVE_AS_CURRENT); - // not let dismiss dead pet - if (pet && pet->isAlive()) - player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); - } - } - - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(9454)) - Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, player, player); - - // save player - player->SaveToDB(); - } - - return true; - } - - static bool HandleUnFreezeCommand(ChatHandler* handler, char const*args) - { - std::string name; - Player* player; - char* targetName = strtok((char*)args, " "); // Get entered name - - if (targetName) - { - name = targetName; - normalizePlayerName(name); - player = sObjectAccessor->FindPlayerByName(name.c_str()); - } - else // If no name was entered - use target - { - player = handler->getSelectedPlayer(); - if (player) - name = player->GetName(); - } - - if (player) - { - handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); - - // Reset player faction + allow combat + allow duels - player->setFactionForRace(player->getRace()); - player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - // Remove Freeze spell (allowing movement and spells) - player->RemoveAurasDueToSpell(9454); - - // Save player - player->SaveToDB(); - } - else - { - if (targetName) - { - // Check for offline players - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_GUID_BY_NAME); - stmt->setString(0, name); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - { - handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); - return true; - } - - // If player found: delete his freeze aura - Field* fields = result->Fetch(); - uint32 lowGuid = fields[0].GetUInt32(); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN); - stmt->setUInt32(0, lowGuid); - CharacterDatabase.Execute(stmt); - - handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); - return true; - } - else - { - handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); - return true; - } - } - - return true; - } - - static bool HandleListFreezeCommand(ChatHandler* handler, char const* /*args*/) - { - // Get names from DB - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AURA_FROZEN); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (!result) - { - handler->SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS); - return true; - } - - // Header of the names - handler->PSendSysMessage(LANG_COMMAND_LIST_FREEZE); - - // Output of the results - do - { - Field* fields = result->Fetch(); - std::string player = fields[0].GetString(); - handler->PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS, player.c_str()); - } - while (result->NextRow()); - - return true; - } - - static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args) - { - Player* player = NULL; - Group* group = NULL; - uint64 guid = 0; - char* nameStr = strtok((char*)args, " "); - - if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid)) - if (group && group->GetLeaderGUID() != guid) - { - group->ChangeLeader(guid); - group->SendUpdate(); - } - - return true; - } - - static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args) - { - Player* player = NULL; - Group* group = NULL; - uint64 guid = 0; - char* nameStr = strtok((char*)args, " "); - - if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid)) - if (group) - group->Disband(); - - return true; - } - - static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args) - { - Player* player = NULL; - Group* group = NULL; - uint64 guid = 0; - char* nameStr = strtok((char*)args, " "); - - if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid, true)) - if (group) - group->RemoveMember(guid); - - return true; - } - - static bool HandlePlayAllCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - uint32 soundId = atoi((char*)args); - - if (!sSoundEntriesStore.LookupEntry(soundId)) - { - handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); - handler->SetSentErrorMessage(true); - return false; - } - - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << uint32(soundId) << handler->GetSession()->GetPlayer()->GetGUID(); - sWorld->SendGlobalMessage(&data); - - handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId); - return true; - } - - static bool HandlePossessCommand(ChatHandler* handler, char const* /*args*/) - { - Unit* unit = handler->getSelectedUnit(); - if (!unit) - return false; - - handler->GetSession()->GetPlayer()->CastSpell(unit, 530, true); - return true; - } - - static bool HandleUnPossessCommand(ChatHandler* handler, char const* /*args*/) - { - Unit* unit = handler->getSelectedUnit(); - if (!unit) - unit = handler->GetSession()->GetPlayer(); - - unit->RemoveCharmAuras(); - - return true; - } - - static bool HandleBindSightCommand(ChatHandler* handler, char const* /*args*/) - { - Unit* unit = handler->getSelectedUnit(); - if (!unit) - return false; - - handler->GetSession()->GetPlayer()->CastSpell(unit, 6277, true); - return true; - } - - static bool HandleUnbindSightCommand(ChatHandler* handler, char const* /*args*/) - { - Player* player = handler->GetSession()->GetPlayer(); - - if (player->isPossessing()) - return false; - - player->StopCastingBindSight(); - return true; - } -}; - -void AddSC_misc_commandscript() -{ - new misc_commandscript(); -} +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "Chat.h" +#include "ScriptMgr.h" +#include "AccountMgr.h" +#include "ArenaTeamMgr.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "Group.h" +#include "InstanceSaveMgr.h" +#include "MovementGenerator.h" +#include "ObjectAccessor.h" +#include "SpellAuras.h" +#include "TargetedMovementGenerator.h" +#include "WeatherMgr.h" +#include "ace/INET_Addr.h" + +class misc_commandscript : public CommandScript +{ +public: + misc_commandscript() : CommandScript("misc_commandscript") { } + + ChatCommand* GetCommands() const + { + static ChatCommand groupCommandTable[] = + { + { "leader", SEC_ADMINISTRATOR, false, &HandleGroupLeaderCommand, "", NULL }, + { "disband", SEC_ADMINISTRATOR, false, &HandleGroupDisbandCommand, "", NULL }, + { "remove", SEC_ADMINISTRATOR, false, &HandleGroupRemoveCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand petCommandTable[] = + { + { "create", SEC_GAMEMASTER, false, &HandleCreatePetCommand, "", NULL }, + { "learn", SEC_GAMEMASTER, false, &HandlePetLearnCommand, "", NULL }, + { "unlearn", SEC_GAMEMASTER, false, &HandlePetUnlearnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand sendCommandTable[] = + { + { "items", SEC_ADMINISTRATOR, true, &HandleSendItemsCommand, "", NULL }, + { "mail", SEC_MODERATOR, true, &HandleSendMailCommand, "", NULL }, + { "message", SEC_ADMINISTRATOR, true, &HandleSendMessageCommand, "", NULL }, + { "money", SEC_ADMINISTRATOR, true, &HandleSendMoneyCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand commandTable[] = + { + { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL }, + { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL }, + { "aura", SEC_ADMINISTRATOR, false, &HandleAuraCommand, "", NULL }, + { "unaura", SEC_ADMINISTRATOR, false, &HandleUnAuraCommand, "", NULL }, + { "appear", SEC_MODERATOR, false, &HandleAppearCommand, "", NULL }, + { "summon", SEC_MODERATOR, false, &HandleSummonCommand, "", NULL }, + { "groupsummon", SEC_MODERATOR, false, &HandleGroupSummonCommand, "", NULL }, + { "commands", SEC_PLAYER, true, &HandleCommandsCommand, "", NULL }, + { "die", SEC_ADMINISTRATOR, false, &HandleDieCommand, "", NULL }, + { "revive", SEC_ADMINISTRATOR, true, &HandleReviveCommand, "", NULL }, + { "dismount", SEC_PLAYER, false, &HandleDismountCommand, "", NULL }, + { "guid", SEC_GAMEMASTER, false, &HandleGUIDCommand, "", NULL }, + { "help", SEC_PLAYER, true, &HandleHelpCommand, "", NULL }, + { "itemmove", SEC_GAMEMASTER, false, &HandleItemMoveCommand, "", NULL }, + { "cooldown", SEC_ADMINISTRATOR, false, &HandleCooldownCommand, "", NULL }, + { "distance", SEC_ADMINISTRATOR, false, &HandleGetDistanceCommand, "", NULL }, + { "recall", SEC_MODERATOR, false, &HandleRecallCommand, "", NULL }, + { "save", SEC_PLAYER, false, &HandleSaveCommand, "", NULL }, + { "saveall", SEC_MODERATOR, true, &HandleSaveAllCommand, "", NULL }, + { "kick", SEC_GAMEMASTER, true, &HandleKickPlayerCommand, "", NULL }, + { "start", SEC_PLAYER, false, &HandleStartCommand, "", NULL }, + { "taxicheat", SEC_MODERATOR, false, &HandleTaxiCheatCommand, "", NULL }, + { "linkgrave", SEC_ADMINISTRATOR, false, &HandleLinkGraveCommand, "", NULL }, + { "neargrave", SEC_ADMINISTRATOR, false, &HandleNearGraveCommand, "", NULL }, + { "explorecheat", SEC_ADMINISTRATOR, false, &HandleExploreCheatCommand, "", NULL }, + { "showarea", SEC_ADMINISTRATOR, false, &HandleShowAreaCommand, "", NULL }, + { "hidearea", SEC_ADMINISTRATOR, false, &HandleHideAreaCommand, "", NULL }, + { "additem", SEC_ADMINISTRATOR, false, &HandleAddItemCommand, "", NULL }, + { "additemset", SEC_ADMINISTRATOR, false, &HandleAddItemSetCommand, "", NULL }, + { "bank", SEC_ADMINISTRATOR, false, &HandleBankCommand, "", NULL }, + { "wchange", SEC_ADMINISTRATOR, false, &HandleChangeWeather, "", NULL }, + { "maxskill", SEC_ADMINISTRATOR, false, &HandleMaxSkillCommand, "", NULL }, + { "setskill", SEC_ADMINISTRATOR, false, &HandleSetSkillCommand, "", NULL }, + { "pinfo", SEC_GAMEMASTER, true, &HandlePInfoCommand, "", NULL }, + { "respawn", SEC_ADMINISTRATOR, false, &HandleRespawnCommand, "", NULL }, + { "send", SEC_MODERATOR, true, NULL, "", sendCommandTable }, + { "pet", SEC_GAMEMASTER, false, NULL, "", petCommandTable }, + { "mute", SEC_MODERATOR, true, &HandleMuteCommand, "", NULL }, + { "unmute", SEC_MODERATOR, true, &HandleUnmuteCommand, "", NULL }, + { "movegens", SEC_ADMINISTRATOR, false, &HandleMovegensCommand, "", NULL }, + { "cometome", SEC_ADMINISTRATOR, false, &HandleComeToMeCommand, "", NULL }, + { "damage", SEC_ADMINISTRATOR, false, &HandleDamageCommand, "", NULL }, + { "combatstop", SEC_GAMEMASTER, true, &HandleCombatStopCommand, "", NULL }, + { "flusharenapoints", SEC_ADMINISTRATOR, false, &HandleFlushArenaPointsCommand, "", NULL }, + { "repairitems", SEC_GAMEMASTER, true, &HandleRepairitemsCommand, "", NULL }, + { "waterwalk", SEC_GAMEMASTER, false, &HandleWaterwalkCommand, "", NULL }, + { "freeze", SEC_MODERATOR, false, &HandleFreezeCommand, "", NULL }, + { "unfreeze", SEC_MODERATOR, false, &HandleUnFreezeCommand, "", NULL }, + { "listfreeze", SEC_MODERATOR, false, &HandleListFreezeCommand, "", NULL }, + { "group", SEC_ADMINISTRATOR, false, NULL, "", groupCommandTable }, + { "possess", SEC_ADMINISTRATOR, false, HandlePossessCommand, "", NULL }, + { "unpossess", SEC_ADMINISTRATOR, false, HandleUnPossessCommand, "", NULL }, + { "bindsight", SEC_ADMINISTRATOR, false, HandleBindSightCommand, "", NULL }, + { "unbindsight", SEC_ADMINISTRATOR, false, HandleUnbindSightCommand, "", NULL }, + { "playall", SEC_GAMEMASTER, false, HandlePlayAllCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + return commandTable; + } + + static bool HandleDevCommand(ChatHandler* handler, char const* args) + { + if (!*args) + { + if (handler->GetSession()->GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER)) + handler->GetSession()->SendNotification(LANG_DEV_ON); + else + handler->GetSession()->SendNotification(LANG_DEV_OFF); + return true; + } + + std::string argstr = (char*)args; + + if (argstr == "on") + { + handler->GetSession()->GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER); + handler->GetSession()->SendNotification(LANG_DEV_ON); + return true; + } + + if (argstr == "off") + { + handler->GetSession()->GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER); + handler->GetSession()->SendNotification(LANG_DEV_OFF); + return true; + } + + handler->SendSysMessage(LANG_USE_BOL); + handler->SetSentErrorMessage(true); + return false; + } + + static bool HandleGPSCommand(ChatHandler* handler, char const* args) + { + WorldObject* object = NULL; + if (*args) + { + uint64 guid = handler->extractGuidFromLink((char*)args); + if (guid) + object = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); + + if (!object) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + } + else + { + object = handler->getSelectedUnit(); + + if (!object) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + } + + CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY()); + Cell cell(cellCoord); + + uint32 zoneId, areaId; + object->GetZoneAndAreaId(zoneId, areaId); + + MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId()); + AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId); + AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); + + float zoneX = object->GetPositionX(); + float zoneY = object->GetPositionY(); + + Map2ZoneCoordinates(zoneX, zoneY, zoneId); + + Map const* map = object->GetMap(); + float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT); + float floorZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()); + + GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY()); + + // 63? WHY? + int gridX = 63 - gridCoord.x_coord; + int gridY = 63 - gridCoord.y_coord; + + uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0; + uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0; + + if (haveVMap) + { + if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ())) + handler->PSendSysMessage("You are outdoors"); + else + handler->PSendSysMessage("You are indoors"); + } + else + handler->PSendSysMessage("no VMAP available for area info"); + + handler->PSendSysMessage(LANG_MAP_POSITION, + object->GetMapId(), (mapEntry ? mapEntry->name : ""), + zoneId, (zoneEntry ? zoneEntry->area_name : ""), + areaId, (areaEntry ? areaEntry->area_name : ""), + object->GetPhaseMask(), + object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), + cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), + zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); + + LiquidData liquidStatus; + ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); + + if (status) + handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); + + return true; + } + + static bool HandleAuraCommand(ChatHandler* handler, char const* args) + { + Unit* target = handler->getSelectedUnit(); + if (!target) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form + uint32 spellId = handler->extractSpellIdFromLink((char*)args); + + if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId)) + Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, target, target); + + return true; + } + + static bool HandleUnAuraCommand(ChatHandler* handler, char const* args) + { + Unit* target = handler->getSelectedUnit(); + if (!target) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + std::string argstr = args; + if (argstr == "all") + { + target->RemoveAllAuras(); + return true; + } + + // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form + uint32 spellId = handler->extractSpellIdFromLink((char*)args); + if (!spellId) + return false; + + target->RemoveAurasDueToSpell(spellId); + + return true; + } + // Teleport to Player + static bool HandleAppearCommand(ChatHandler* handler, char const* args) + { + Player* target; + uint64 targetGuid; + std::string targetName; + if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) + return false; + + Player* _player = handler->GetSession()->GetPlayer(); + if (target == _player || targetGuid == _player->GetGUID()) + { + handler->SendSysMessage(LANG_CANT_TELEPORT_SELF); + handler->SetSentErrorMessage(true); + return false; + } + + if (target) + { + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + std::string chrNameLink = handler->playerLink(targetName); + + Map* map = target->GetMap(); + if (map->IsBattlegroundOrArena()) + { + // only allow if gm mode is on + if (!_player->isGameMaster()) + { + handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, chrNameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + // if both players are in different bgs + else if (_player->GetBattlegroundId() && _player->GetBattlegroundId() != target->GetBattlegroundId()) + _player->LeaveBattleground(false); // Note: should be changed so _player gets no Deserter debuff + + // all's well, set bg id + // when porting out from the bg, it will be reset to 0 + _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); + // remember current position as entry point for return at bg end teleportation + if (!_player->GetMap()->IsBattlegroundOrArena()) + _player->SetBattlegroundEntryPoint(); + } + else if (map->IsDungeon()) + { + // we have to go to instance, and can go to player only if: + // 1) we are in his group (either as leader or as member) + // 2) we are not bound to any group and have GM mode on + if (_player->GetGroup()) + { + // we are in group, we can go only if we are in the player group + if (_player->GetGroup() != target->GetGroup()) + { + handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY, chrNameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + } + else + { + // we are not in group, let's verify our GM mode + if (!_player->isGameMaster()) + { + handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM, chrNameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + } + + // if the player or the player's group is bound to another instance + // the player will not be bound to another one + InstancePlayerBind* bind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty(map->IsRaid())); + if (!bind) + { + Group* group = _player->GetGroup(); + // if no bind exists, create a solo bind + InstanceGroupBind* gBind = group ? group->GetBoundInstance(target) : NULL; // if no bind exists, create a solo bind + if (!gBind) + if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(target->GetInstanceId())) + _player->BindToInstance(save, !save->CanReset()); + } + + if (map->IsRaid()) + _player->SetRaidDifficulty(target->GetRaidDifficulty()); + else + _player->SetDungeonDifficulty(target->GetDungeonDifficulty()); + } + + handler->PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str()); + + // stop flight if need + if (_player->isInFlight()) + { + _player->GetMotionMaster()->MovementExpired(); + _player->CleanupAfterTaxiFlight(); + } + // save only in non-flight case + else + _player->SaveRecallPosition(); + + // to point to see at target with same orientation + float x, y, z; + target->GetContactPoint(_player, x, y, z); + + _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE); + _player->SetPhaseMask(target->GetPhaseMask(), true); + } + else + { + // check offline security + if (handler->HasLowerSecurity(NULL, targetGuid)) + return false; + + std::string nameLink = handler->playerLink(targetName); + + handler->PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str()); + + // to point where player stay (if loaded) + float x, y, z, o; + uint32 map; + bool in_flight; + if (!Player::LoadPositionFromDB(map, x, y, z, o, in_flight, targetGuid)) + return false; + + // stop flight if need + if (_player->isInFlight()) + { + _player->GetMotionMaster()->MovementExpired(); + _player->CleanupAfterTaxiFlight(); + } + // save only in non-flight case + else + _player->SaveRecallPosition(); + + _player->TeleportTo(map, x, y, z, _player->GetOrientation()); + } + + return true; + } + // Summon Player + static bool HandleSummonCommand(ChatHandler* handler, char const* args) + { + Player* target; + uint64 targetGuid; + std::string targetName; + if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) + return false; + + Player* _player = handler->GetSession()->GetPlayer(); + if (target == _player || targetGuid == _player->GetGUID()) + { + handler->PSendSysMessage(LANG_CANT_TELEPORT_SELF); + handler->SetSentErrorMessage(true); + return false; + } + + if (target) + { + std::string nameLink = handler->playerLink(targetName); + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + if (target->IsBeingTeleported()) + { + handler->PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + Map* map = handler->GetSession()->GetPlayer()->GetMap(); + + if (map->IsBattlegroundOrArena()) + { + // only allow if gm mode is on + if (!_player->isGameMaster()) + { + handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + // if both players are in different bgs + else if (target->GetBattlegroundId() && handler->GetSession()->GetPlayer()->GetBattlegroundId() != target->GetBattlegroundId()) + target->LeaveBattleground(false); // Note: should be changed so target gets no Deserter debuff + + // all's well, set bg id + // when porting out from the bg, it will be reset to 0 + target->SetBattlegroundId(handler->GetSession()->GetPlayer()->GetBattlegroundId(), handler->GetSession()->GetPlayer()->GetBattlegroundTypeId()); + // remember current position as entry point for return at bg end teleportation + if (!target->GetMap()->IsBattlegroundOrArena()) + target->SetBattlegroundEntryPoint(); + } + else if (map->IsDungeon()) + { + Map* map = target->GetMap(); + + if (map->Instanceable() && map->GetInstanceId() != map->GetInstanceId()) + target->UnbindInstance(map->GetInstanceId(), target->GetDungeonDifficulty(), true); + + // we are in instance, and can summon only player in our group with us as lead + if (!handler->GetSession()->GetPlayer()->GetGroup() || !target->GetGroup() || + (target->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || + (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())) + // the last check is a bit excessive, but let it be, just in case + { + handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, nameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + } + + handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), ""); + if (handler->needReportToTarget(target)) + ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, handler->playerLink(_player->GetName()).c_str()); + + // stop flight if need + if (target->isInFlight()) + { + target->GetMotionMaster()->MovementExpired(); + target->CleanupAfterTaxiFlight(); + } + // save only in non-flight case + else + target->SaveRecallPosition(); + + // before GM + float x, y, z; + handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize()); + target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation()); + target->SetPhaseMask(handler->GetSession()->GetPlayer()->GetPhaseMask(), true); + } + else + { + // check offline security + if (handler->HasLowerSecurity(NULL, targetGuid)) + return false; + + std::string nameLink = handler->playerLink(targetName); + + handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE)); + + // in point where GM stay + Player::SavePositionInDB(handler->GetSession()->GetPlayer()->GetMapId(), + handler->GetSession()->GetPlayer()->GetPositionX(), + handler->GetSession()->GetPlayer()->GetPositionY(), + handler->GetSession()->GetPlayer()->GetPositionZ(), + handler->GetSession()->GetPlayer()->GetOrientation(), + handler->GetSession()->GetPlayer()->GetZoneId(), + targetGuid); + } + + return true; + } + // Summon group of player + static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args) + { + Player* target; + if (!handler->extractPlayerTarget((char*)args, &target)) + return false; + + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + Group* group = target->GetGroup(); + + std::string nameLink = handler->GetNameLink(target); + + if (!group) + { + handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + Map* gmMap = handler->GetSession()->GetPlayer()->GetMap(); + bool toInstance = gmMap->Instanceable(); + + // we are in instance, and can summon only player in our group with us as lead + if (toInstance && ( + !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || + (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()))) + // the last check is a bit excessive, but let it be, just in case + { + handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST); + handler->SetSentErrorMessage(true); + return false; + } + + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + { + Player* player = itr->getSource(); + + if (!player || player == handler->GetSession()->GetPlayer() || !player->GetSession()) + continue; + + // check online security + if (handler->HasLowerSecurity(player, 0)) + return false; + + std::string plNameLink = handler->GetNameLink(player); + + if (player->IsBeingTeleported() == true) + { + handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + if (toInstance) + { + Map* playerMap = player->GetMap(); + + if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId()) + { + // cannot summon from instance to instance + handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + } + + handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), ""); + if (handler->needReportToTarget(player)) + ChatHandler(player).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str()); + + // stop flight if need + if (player->isInFlight()) + { + player->GetMotionMaster()->MovementExpired(); + player->CleanupAfterTaxiFlight(); + } + // save only in non-flight case + else + player->SaveRecallPosition(); + + // before GM + float x, y, z; + handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize()); + player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation()); + } + + return true; + } + + static bool HandleCommandsCommand(ChatHandler* handler, char const* /*args*/) + { + handler->ShowHelpForCommand(handler->getCommandTable(), ""); + return true; + } + + static bool HandleDieCommand(ChatHandler* handler, char const* /*args*/) + { + Unit* target = handler->getSelectedUnit(); + + if (!target || !handler->GetSession()->GetPlayer()->GetSelection()) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + if (target->GetTypeId() == TYPEID_PLAYER) + { + if (handler->HasLowerSecurity((Player*)target, 0, false)) + return false; + } + + if (target->isAlive()) + { + if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE)) + handler->GetSession()->GetPlayer()->Kill(target); + else + handler->GetSession()->GetPlayer()->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } + + return true; + } + + static bool HandleReviveCommand(ChatHandler* handler, char const* args) + { + Player* target; + uint64 targetGuid; + if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid)) + return false; + + if (target) + { + target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f); + target->SpawnCorpseBones(); + target->SaveToDB(); + } + else + // will resurrected at login without corpse + sObjectAccessor->ConvertCorpseForPlayer(targetGuid); + + return true; + } + + static bool HandleDismountCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + // If player is not mounted, so go out :) + if (!player->IsMounted()) + { + handler->SendSysMessage(LANG_CHAR_NON_MOUNTED); + handler->SetSentErrorMessage(true); + return false; + } + + if (player->isInFlight()) + { + handler->SendSysMessage(LANG_YOU_IN_FLIGHT); + handler->SetSentErrorMessage(true); + return false; + } + + player->Dismount(); + player->RemoveAurasByType(SPELL_AURA_MOUNTED); + return true; + } + + static bool HandleGUIDCommand(ChatHandler* handler, char const* /*args*/) + { + uint64 guid = handler->GetSession()->GetPlayer()->GetSelection(); + + if (guid == 0) + { + handler->SendSysMessage(LANG_NO_SELECTION); + handler->SetSentErrorMessage(true); + return false; + } + + handler->PSendSysMessage(LANG_OBJECT_GUID, GUID_LOPART(guid), GUID_HIPART(guid)); + return true; + } + + static bool HandleHelpCommand(ChatHandler* handler, char const* args) + { + char const* cmd = strtok((char*)args, " "); + if (!cmd) + { + handler->ShowHelpForCommand(handler->getCommandTable(), "help"); + handler->ShowHelpForCommand(handler->getCommandTable(), ""); + } + else + { + if (!handler->ShowHelpForCommand(handler->getCommandTable(), cmd)) + handler->SendSysMessage(LANG_NO_HELP_CMD); + } + + return true; + } + // move item to other slot + static bool HandleItemMoveCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char const* param1 = strtok((char*)args, " "); + if (!param1) + return false; + + char const* param2 = strtok(NULL, " "); + if (!param2) + return false; + + uint8 srcSlot = uint8(atoi(param1)); + uint8 dstSlot = uint8(atoi(param2)); + + if (srcSlot == dstSlot) + return true; + + if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, srcSlot, true)) + return false; + + if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, dstSlot, false)) + return false; + + uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcSlot); + uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstSlot); + + handler->GetSession()->GetPlayer()->SwapItem(src, dst); + + return true; + } + + static bool HandleCooldownCommand(ChatHandler* handler, char const* args) + { + Player* target = handler->getSelectedPlayer(); + if (!target) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + std::string nameLink = handler->GetNameLink(target); + + if (!*args) + { + target->RemoveAllSpellCooldown(); + handler->PSendSysMessage(LANG_REMOVEALL_COOLDOWN, nameLink.c_str()); + } + else + { + // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form + uint32 spellIid = handler->extractSpellIdFromLink((char*)args); + if (!spellIid) + return false; + + if (!sSpellMgr->GetSpellInfo(spellIid)) + { + handler->PSendSysMessage(LANG_UNKNOWN_SPELL, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + target->RemoveSpellCooldown(spellIid, true); + handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); + } + return true; + } + + static bool HandleGetDistanceCommand(ChatHandler* handler, char const* args) + { + WorldObject* obj = NULL; + + if (*args) + { + uint64 guid = handler->extractGuidFromLink((char*)args); + if (guid) + obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + + if (!obj) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + } + else + { + obj = handler->getSelectedUnit(); + + if (!obj) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + } + + handler->PSendSysMessage(LANG_DISTANCE, handler->GetSession()->GetPlayer()->GetDistance(obj), handler->GetSession()->GetPlayer()->GetDistance2d(obj), handler->GetSession()->GetPlayer()->GetExactDist(obj), handler->GetSession()->GetPlayer()->GetExactDist2d(obj)); + return true; + } + // Teleport player to last position + static bool HandleRecallCommand(ChatHandler* handler, char const* args) + { + Player* target; + if (!handler->extractPlayerTarget((char*)args, &target)) + return false; + + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + if (target->IsBeingTeleported()) + { + handler->PSendSysMessage(LANG_IS_TELEPORTED, handler->GetNameLink(target).c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + // stop flight if need + if (target->isInFlight()) + { + target->GetMotionMaster()->MovementExpired(); + target->CleanupAfterTaxiFlight(); + } + + target->TeleportTo(target->m_recallMap, target->m_recallX, target->m_recallY, target->m_recallZ, target->m_recallO); + return true; + } + + static bool HandleSaveCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + // save GM account without delay and output message + if (!AccountMgr::IsPlayerAccount(handler->GetSession()->GetSecurity())) + { + if (Player* target = handler->getSelectedPlayer()) + target->SaveToDB(); + else + player->SaveToDB(); + handler->SendSysMessage(LANG_PLAYER_SAVED); + return true; + } + + // save if the player has last been saved over 20 seconds ago + uint32 saveInterval = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); + if (saveInterval == 0 || (saveInterval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= saveInterval - 20 * IN_MILLISECONDS)) + player->SaveToDB(); + + return true; + } + + // Save all players in the world + static bool HandleSaveAllCommand(ChatHandler* handler, char const* /*args*/) + { + sObjectAccessor->SaveAllPlayers(); + handler->SendSysMessage(LANG_PLAYERS_SAVED); + return true; + } + + // kick player + static bool HandleKickPlayerCommand(ChatHandler* handler, char const* args) + { + Player* target = NULL; + std::string playerName; + if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName)) + return false; + + if (handler->GetSession() && target == handler->GetSession()->GetPlayer()) + { + handler->SendSysMessage(LANG_COMMAND_KICKSELF); + handler->SetSentErrorMessage(true); + return false; + } + + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD)) + sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); + else + handler->PSendSysMessage(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); + + target->GetSession()->KickPlayer(); + + return true; + } + + static bool HandleStartCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + if (player->isInFlight()) + { + handler->SendSysMessage(LANG_YOU_IN_FLIGHT); + handler->SetSentErrorMessage(true); + return false; + } + + if (player->isInCombat()) + { + handler->SendSysMessage(LANG_YOU_IN_COMBAT); + handler->SetSentErrorMessage(true); + return false; + } + + if (player->isDead() || player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) + { + // if player is dead and stuck, send ghost to graveyard + player->RepopAtGraveyard(); + return true; + } + + // cast spell Stuck + player->CastSpell(player, 7355, false); + return true; + } + // Enable on\off all taxi paths + static bool HandleTaxiCheatCommand(ChatHandler* handler, char const* args) + { + if (!*args) + { + handler->SendSysMessage(LANG_USE_BOL); + handler->SetSentErrorMessage(true); + return false; + } + + std::string argStr = (char*)args; + + Player* chr = handler->getSelectedPlayer(); + + if (!chr) + chr = handler->GetSession()->GetPlayer(); + else if (handler->HasLowerSecurity(chr, 0)) // check online security + return false; + + if (argStr == "on") + { + chr->SetTaxiCheater(true); + handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str()); + if (handler->needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str()); + return true; + } + + if (argStr == "off") + { + chr->SetTaxiCheater(false); + handler->PSendSysMessage(LANG_YOU_REMOVE_TAXIS, handler->GetNameLink(chr).c_str()); + if (handler->needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, handler->GetNameLink().c_str()); + + return true; + } + + handler->SendSysMessage(LANG_USE_BOL); + handler->SetSentErrorMessage(true); + + return false; + } + + static bool HandleLinkGraveCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* px = strtok((char*)args, " "); + if (!px) + return false; + + uint32 graveyardId = uint32(atoi(px)); + + uint32 team; + + char* px2 = strtok(NULL, " "); + + if (!px2) + team = 0; + else if (strncmp(px2, "horde", 6) == 0) + team = HORDE; + else if (strncmp(px2, "alliance", 9) == 0) + team = ALLIANCE; + else + return false; + + WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(graveyardId); + + if (!graveyard) + { + handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, graveyardId); + handler->SetSentErrorMessage(true); + return false; + } + + Player* player = handler->GetSession()->GetPlayer(); + + uint32 zoneId = player->GetZoneId(); + + AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId); + if (!areaEntry || areaEntry->zone !=0) + { + handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId); + handler->SetSentErrorMessage(true); + return false; + } + + if (sObjectMgr->AddGraveYardLink(graveyardId, zoneId, team)) + handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, graveyardId, zoneId); + else + handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDALRLINKED, graveyardId, zoneId); + + return true; + } + + static bool HandleNearGraveCommand(ChatHandler* handler, char const* args) + { + uint32 team; + + size_t argStr = strlen(args); + + if (!*args) + team = 0; + else if (strncmp((char*)args, "horde", argStr) == 0) + team = HORDE; + else if (strncmp((char*)args, "alliance", argStr) == 0) + team = ALLIANCE; + else + return false; + + Player* player = handler->GetSession()->GetPlayer(); + uint32 zone_id = player->GetZoneId(); + + WorldSafeLocsEntry const* graveyard = sObjectMgr->GetClosestGraveYard( + player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), team); + + if (graveyard) + { + uint32 graveyardId = graveyard->ID; + + GraveYardData const* data = sObjectMgr->FindGraveYardData(graveyardId, zone_id); + if (!data) + { + handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR, graveyardId); + handler->SetSentErrorMessage(true); + return false; + } + + team = data->team; + + std::string team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_NOTEAM); + + if (team == 0) + team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY); + else if (team == HORDE) + team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE); + else if (team == ALLIANCE) + team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE); + + handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, graveyardId, team_name.c_str(), zone_id); + } + else + { + std::string team_name; + + if (team == 0) + team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY); + else if (team == HORDE) + team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE); + else if (team == ALLIANCE) + team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE); + + if (team == ~uint32(0)) + handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAVEYARDS, zone_id); + else + handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id, team_name.c_str()); + } + + return true; + } + + static bool HandleExploreCheatCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + int32 flag = int32(atoi((char*)args)); + + Player* playerTarget = handler->getSelectedPlayer(); + if (!playerTarget) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + if (flag != 0) + { + handler->PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, handler->GetNameLink(playerTarget).c_str()); + if (handler->needReportToTarget(playerTarget)) + ChatHandler(playerTarget).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL, handler->GetNameLink().c_str()); + } + else + { + handler->PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, handler->GetNameLink(playerTarget).c_str()); + if (handler->needReportToTarget(playerTarget)) + ChatHandler(playerTarget).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING, handler->GetNameLink().c_str()); + } + + for (uint8 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i) + { + if (flag != 0) + handler->GetSession()->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0xFFFFFFFF); + else + handler->GetSession()->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0); + } + + return true; + } + + static bool HandleShowAreaCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + Player* playerTarget = handler->getSelectedPlayer(); + if (!playerTarget) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + int32 area = GetAreaFlagByAreaID(atoi((char*)args)); + int32 offset = area / 32; + uint32 val = uint32((1 << (area % 32))); + + if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); + playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields | val))); + + handler->SendSysMessage(LANG_EXPLORE_AREA); + return true; + } + + static bool HandleHideAreaCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + Player* playerTarget = handler->getSelectedPlayer(); + if (!playerTarget) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + int32 area = GetAreaFlagByAreaID(atoi((char*)args)); + int32 offset = area / 32; + uint32 val = uint32((1 << (area % 32))); + + if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); + playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields ^ val))); + + handler->SendSysMessage(LANG_UNEXPLORE_AREA); + return true; + } + + static bool HandleAddItemCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 itemId = 0; + + if (args[0] == '[') // [name] manual form + { + char const* itemNameStr = strtok((char*)args, "]"); + + if (itemNameStr && itemNameStr[0]) + { + std::string itemName = itemNameStr+1; + WorldDatabase.EscapeString(itemName); + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME); + stmt->setString(0, itemName); + PreparedQueryResult result = WorldDatabase.Query(stmt); + + if (!result) + { + handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr+1); + handler->SetSentErrorMessage(true); + return false; + } + itemId = result->Fetch()->GetUInt32(); + } + else + return false; + } + else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r + { + char const* id = handler->extractKeyFromLink((char*)args, "Hitem"); + if (!id) + return false; + itemId = uint32(atol(id)); + } + + char const* ccount = strtok(NULL, " "); + + int32 count = 1; + + if (ccount) + count = strtol(ccount, NULL, 10); + + if (count == 0) + count = 1; + + Player* player = handler->GetSession()->GetPlayer(); + Player* playerTarget = handler->getSelectedPlayer(); + if (!playerTarget) + playerTarget = player; + + sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_ADDITEM), itemId, count); + + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); + if (!itemTemplate) + { + handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); + handler->SetSentErrorMessage(true); + return false; + } + + // Subtract + if (count < 0) + { + playerTarget->DestroyItemCount(itemId, -count, true, false); + handler->PSendSysMessage(LANG_REMOVEITEM, itemId, -count, handler->GetNameLink(playerTarget).c_str()); + return true; + } + + // Adding items + uint32 noSpaceForCount = 0; + + // check space and find places + ItemPosCountVec dest; + InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount); + if (msg != EQUIP_ERR_OK) // convert to possible store amount + count -= noSpaceForCount; + + if (count == 0 || dest.empty()) // can't add any + { + handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); + handler->SetSentErrorMessage(true); + return false; + } + + Item* item = playerTarget->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId)); + + // remove binding (let GM give it to another player later) + if (player == playerTarget) + for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr) + if (Item* item1 = player->GetItemByPos(itr->pos)) + item1->SetBinding(false); + + if (count > 0 && item) + { + player->SendNewItem(item, count, false, true); + if (player != playerTarget) + playerTarget->SendNewItem(item, count, true, false); + } + + if (noSpaceForCount > 0) + handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); + + return true; + } + + static bool HandleAddItemSetCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char const* id = handler->extractKeyFromLink((char*)args, "Hitemset"); // number or [name] Shift-click form |color|Hitemset:itemset_id|h[name]|h|r + if (!id) + return false; + + uint32 itemSetId = atol(id); + + // prevent generation all items with itemset field value '0' + if (itemSetId == 0) + { + handler->PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemSetId); + handler->SetSentErrorMessage(true); + return false; + } + + Player* player = handler->GetSession()->GetPlayer(); + Player* playerTarget = handler->getSelectedPlayer(); + if (!playerTarget) + playerTarget = player; + + sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_ADDITEMSET), itemSetId); + + bool found = false; + ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); + for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) + { + if (itr->second.ItemSet == itemSetId) + { + found = true; + ItemPosCountVec dest; + InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itr->second.ItemId, 1); + if (msg == EQUIP_ERR_OK) + { + Item* item = playerTarget->StoreNewItem(dest, itr->second.ItemId, true); + + // remove binding (let GM give it to another player later) + if (player == playerTarget) + item->SetBinding(false); + + player->SendNewItem(item, 1, false, true); + if (player != playerTarget) + playerTarget->SendNewItem(item, 1, true, false); + } + else + { + player->SendEquipError(msg, NULL, NULL, itr->second.ItemId); + handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itr->second.ItemId, 1); + } + } + } + + if (!found) + { + handler->PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemSetId); + handler->SetSentErrorMessage(true); + return false; + } + + return true; + } + + static bool HandleBankCommand(ChatHandler* handler, char const* /*args*/) + { + handler->GetSession()->SendShowBank(handler->GetSession()->GetPlayer()->GetGUID()); + return true; + } + + static bool HandleChangeWeather(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + // Weather is OFF + if (!sWorld->getBoolConfig(CONFIG_WEATHER)) + { + handler->SendSysMessage(LANG_WEATHER_DISABLED); + handler->SetSentErrorMessage(true); + return false; + } + + // *Change the weather of a cell + char const* px = strtok((char*)args, " "); + char const* py = strtok(NULL, " "); + + if (!px || !py) + return false; + + uint32 type = uint32(atoi(px)); //0 to 3, 0: fine, 1: rain, 2: snow, 3: sand + float grade = float(atof(py)); //0 to 1, sending -1 is instand good weather + + Player* player = handler->GetSession()->GetPlayer(); + uint32 zoneid = player->GetZoneId(); + + Weather* weather = WeatherMgr::FindWeather(zoneid); + + if (!weather) + weather = WeatherMgr::AddWeather(zoneid); + if (!weather) + { + handler->SendSysMessage(LANG_NO_WEATHER); + handler->SetSentErrorMessage(true); + return false; + } + + weather->SetWeather(WeatherType(type), grade); + + return true; + } + + + static bool HandleMaxSkillCommand(ChatHandler* handler, char const* /*args*/) + { + Player* SelectedPlayer = handler->getSelectedPlayer(); + if (!SelectedPlayer) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + // each skills that have max skill value dependent from level seted to current level max skill value + SelectedPlayer->UpdateSkillsToMaxSkillsForLevel(); + return true; + } + + static bool HandleSetSkillCommand(ChatHandler* handler, char const* args) + { + // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r + char const* skillStr = handler->extractKeyFromLink((char*)args, "Hskill"); + if (!skillStr) + return false; + + char const* levelStr = strtok(NULL, " "); + if (!levelStr) + return false; + + char const* maxPureSkill = strtok(NULL, " "); + + int32 skill = atoi(skillStr); + if (skill <= 0) + { + handler->PSendSysMessage(LANG_INVALID_SKILL_ID, skill); + handler->SetSentErrorMessage(true); + return false; + } + + int32 level = uint32(atol(levelStr)); + + Player* target = handler->getSelectedPlayer(); + if (!target) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + SkillLineEntry const* skillLine = sSkillLineStore.LookupEntry(skill); + if (!skillLine) + { + handler->PSendSysMessage(LANG_INVALID_SKILL_ID, skill); + handler->SetSentErrorMessage(true); + return false; + } + + std::string tNameLink = handler->GetNameLink(target); + + if (!target->GetSkillValue(skill)) + { + handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]); + handler->SetSentErrorMessage(true); + return false; + } + + uint16 max = maxPureSkill ? atol (maxPureSkill) : target->GetPureMaxSkillValue(skill); + + if (level <= 0 || level > max || max <= 0) + return false; + + target->SetSkill(skill, target->GetSkillStep(skill), level, max); + handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max); + + return true; + } + // show info of player + static bool HandlePInfoCommand(ChatHandler* handler, char const* args) + { + Player* target; + uint64 targetGuid; + std::string targetName; + + uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER); + + if (sObjectMgr->GetPlayerNameByGUID(parseGUID, targetName)) + { + target = sObjectMgr->GetPlayerByLowGUID(parseGUID); + targetGuid = parseGUID; + } + else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) + return false; + + uint32 accId = 0; + uint32 money = 0; + uint32 totalPlayerTime = 0; + uint8 level = 0; + uint32 latency = 0; + uint8 race; + uint8 Class; + int64 muteTime = 0; + int64 banTime = -1; + uint32 mapId; + uint32 areaId; + uint32 phase = 0; + + // get additional information from Player object + if (target) + { + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + accId = target->GetSession()->GetAccountId(); + money = target->GetMoney(); + totalPlayerTime = target->GetTotalPlayedTime(); + level = target->getLevel(); + latency = target->GetSession()->GetLatency(); + race = target->getRace(); + Class = target->getClass(); + muteTime = target->GetSession()->m_muteTime; + mapId = target->GetMapId(); + areaId = target->GetAreaId(); + phase = target->GetPhaseMask(); + } + // get additional information from DB + else + { + // check offline security + if (handler->HasLowerSecurity(NULL, targetGuid)) + return false; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO); + stmt->setUInt32(0, GUID_LOPART(targetGuid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (!result) + return false; + + Field* fields = result->Fetch(); + totalPlayerTime = fields[0].GetUInt32(); + level = fields[1].GetUInt8(); + money = fields[2].GetUInt32(); + accId = fields[3].GetUInt32(); + race = fields[4].GetUInt8(); + Class = fields[5].GetUInt8(); + mapId = fields[6].GetUInt16(); + areaId = fields[7].GetUInt16(); + } + + std::string userName = handler->GetTrinityString(LANG_ERROR); + std::string eMail = handler->GetTrinityString(LANG_ERROR); + std::string lastIp = handler->GetTrinityString(LANG_ERROR); + uint32 security = 0; + std::string lastLogin = handler->GetTrinityString(LANG_ERROR); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO); + stmt->setInt32(0, int32(realmID)); + stmt->setUInt32(1, accId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (result) + { + Field* fields = result->Fetch(); + userName = fields[0].GetString(); + security = fields[1].GetUInt8(); + eMail = fields[2].GetString(); + muteTime = fields[5].GetUInt64(); + + if (eMail.empty()) + eMail = "-"; + + if (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security)) + { + lastIp = fields[3].GetString(); + lastLogin = fields[4].GetString(); + + uint32 ip = inet_addr(lastIp.c_str()); +#if TRINITY_ENDIAN == BIGENDIAN + EndianConvertReverse(ip); +#endif + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_IP2NATION_COUNTRY); + + stmt->setUInt32(0, ip); + + PreparedQueryResult result2 = WorldDatabase.Query(stmt); + + if (result2) + { + Field* fields2 = result2->Fetch(); + lastIp.append(" ("); + lastIp.append(fields2[0].GetString()); + lastIp.append(")"); + } + } + else + { + lastIp = "-"; + lastLogin = "-"; + } + } + + std::string nameLink = handler->playerLink(targetName); + + handler->PSendSysMessage(LANG_PINFO_ACCOUNT, (target ? "" : handler->GetTrinityString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(targetGuid), userName.c_str(), accId, eMail.c_str(), security, lastIp.c_str(), lastLogin.c_str(), latency); + + std::string bannedby = "unknown"; + std::string banreason = ""; + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS); + stmt->setUInt32(0, accId); + PreparedQueryResult result2 = LoginDatabase.Query(stmt); + if (!result2) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS); + stmt->setUInt32(0, GUID_LOPART(targetGuid)); + result2 = CharacterDatabase.Query(stmt); + } + + if (result2) + { + Field* fields = result2->Fetch(); + banTime = int64(fields[1].GetBool() ? 0 : fields[0].GetUInt32()); + bannedby = fields[2].GetString(); + banreason = fields[3].GetString(); + } + + if (muteTime > 0) + handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str()); + + if (banTime >= 0) + handler->PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str()); + + std::string raceStr, ClassStr; + switch (race) + { + case RACE_HUMAN: + raceStr = "Human"; + break; + case RACE_ORC: + raceStr = "Orc"; + break; + case RACE_DWARF: + raceStr = "Dwarf"; + break; + case RACE_NIGHTELF: + raceStr = "Night Elf"; + break; + case RACE_UNDEAD_PLAYER: + raceStr = "Undead"; + break; + case RACE_TAUREN: + raceStr = "Tauren"; + break; + case RACE_GNOME: + raceStr = "Gnome"; + break; + case RACE_TROLL: + raceStr = "Troll"; + break; + case RACE_BLOODELF: + raceStr = "Blood Elf"; + break; + case RACE_DRAENEI: + raceStr = "Draenei"; + break; + } + + switch (Class) + { + case CLASS_WARRIOR: + ClassStr = "Warrior"; + break; + case CLASS_PALADIN: + ClassStr = "Paladin"; + break; + case CLASS_HUNTER: + ClassStr = "Hunter"; + break; + case CLASS_ROGUE: + ClassStr = "Rogue"; + break; + case CLASS_PRIEST: + ClassStr = "Priest"; + break; + case CLASS_DEATH_KNIGHT: + ClassStr = "Death Knight"; + break; + case CLASS_SHAMAN: + ClassStr = "Shaman"; + break; + case CLASS_MAGE: + ClassStr = "Mage"; + break; + case CLASS_WARLOCK: + ClassStr = "Warlock"; + break; + case CLASS_DRUID: + ClassStr = "Druid"; + break; + } + + std::string timeStr = secsToTimeString(totalPlayerTime, true, true); + uint32 gold = money /GOLD; + uint32 silv = (money % GOLD) / SILVER; + uint32 copp = (money % GOLD) % SILVER; + handler->PSendSysMessage(LANG_PINFO_LEVEL, raceStr.c_str(), ClassStr.c_str(), timeStr.c_str(), level, gold, silv, copp); + + // Add map, zone, subzone and phase to output + int locale = handler->GetSessionDbcLocale(); + std::string areaName = ""; + std::string zoneName = ""; + + MapEntry const* map = sMapStore.LookupEntry(mapId); + + AreaTableEntry const* area = GetAreaEntryByAreaID(areaId); + if (area) + { + areaName = area->area_name[locale]; + + AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); + if (zone) + zoneName = zone->area_name[locale]; + } + + if (target) + { + if (!zoneName.empty()) + handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], zoneName.c_str(), areaName.c_str(), phase); + else + handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], areaName.c_str(), "", phase); + } + else + handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str()); + + return true; + } + + static bool HandleRespawnCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + // accept only explicitly selected target (not implicitly self targeting case) + Unit* target = handler->getSelectedUnit(); + if (player->GetSelection() && target) + { + if (target->GetTypeId() != TYPEID_UNIT || target->isPet()) + { + handler->SendSysMessage(LANG_SELECT_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + if (target->isDead()) + target->ToCreature()->Respawn(); + return true; + } + + CellCoord p(Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY())); + Cell cell(p); + cell.SetNoCreate(); + + Trinity::RespawnDo u_do; + Trinity::WorldObjectWorker worker(player, u_do); + + TypeContainerVisitor, GridTypeMapContainer > obj_worker(worker); + cell.Visit(p, obj_worker, *player->GetMap(), *player, player->GetGridActivationRange()); + + return true; + } + // mute player for some times + static bool HandleMuteCommand(ChatHandler* handler, char const* args) + { + char* nameStr; + char* delayStr; + handler->extractOptFirstArg((char*)args, &nameStr, &delayStr); + if (!delayStr) + return false; + + char const* muteReason = strtok(NULL, "\r"); + std::string muteReasonStr = "No reason"; + if (muteReason != NULL) + muteReasonStr = muteReason; + + Player* target; + uint64 targetGuid; + std::string targetName; + if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) + return false; + + uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); + + // find only player from same account if any + if (!target) + if (WorldSession* session = sWorld->FindSession(accountId)) + target = session->GetPlayer(); + + uint32 notSpeakTime = uint32(atoi(delayStr)); + + // must have strong lesser security level + if (handler->HasLowerSecurity (target, targetGuid, true)) + return false; + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); + + if (target) + { + // Target is online, mute will be in effect right away. + int64 muteTime = time(NULL) + notSpeakTime * MINUTE; + target->GetSession()->m_muteTime = muteTime; + stmt->setInt64(0, muteTime); + ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteReasonStr.c_str()); + } + else + { + // Target is offline, mute will be in effect starting from the next login. + int32 muteTime = -int32(notSpeakTime * MINUTE); + stmt->setInt64(0, muteTime); + } + + stmt->setUInt32(1, accountId); + LoginDatabase.Execute(stmt); + std::string nameLink = handler->playerLink(targetName); + + handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + + return true; + } + + // unmute player + static bool HandleUnmuteCommand(ChatHandler* handler, char const* args) + { + Player* target; + uint64 targetGuid; + std::string targetName; + if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) + return false; + + uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); + + // find only player from same account if any + if (!target) + if (WorldSession* session = sWorld->FindSession(accountId)) + target = session->GetPlayer(); + + // must have strong lesser security level + if (handler->HasLowerSecurity (target, targetGuid, true)) + return false; + + if (target) + { + if (target->CanSpeak()) + { + handler->SendSysMessage(LANG_CHAT_ALREADY_ENABLED); + handler->SetSentErrorMessage(true); + return false; + } + + target->GetSession()->m_muteTime = 0; + } + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); + stmt->setInt64(0, 0); + stmt->setUInt32(1, accountId); + LoginDatabase.Execute(stmt); + + if (target) + ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED); + + std::string nameLink = handler->playerLink(targetName); + + handler->PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str()); + + return true; + } + + + static bool HandleMovegensCommand(ChatHandler* handler, char const* /*args*/) + { + Unit* unit = handler->getSelectedUnit(); + if (!unit) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + handler->PSendSysMessage(LANG_MOVEGENS_LIST, (unit->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), unit->GetGUIDLow()); + + MotionMaster* motionMaster = unit->GetMotionMaster(); + float x, y, z; + motionMaster->GetDestination(x, y, z); + + for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i) + { + MovementGenerator* movementGenerator = motionMaster->GetMotionSlot(i); + if (!movementGenerator) + { + handler->SendSysMessage("Empty"); + continue; + } + + switch (movementGenerator->GetMovementGeneratorType()) + { + case IDLE_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_IDLE); + break; + case RANDOM_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_RANDOM); + break; + case WAYPOINT_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_WAYPOINT); + break; + case ANIMAL_RANDOM_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_ANIMAL_RANDOM); + break; + case CONFUSED_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_CONFUSED); + break; + case CHASE_MOTION_TYPE: + { + Unit* target = NULL; + if (unit->GetTypeId() == TYPEID_PLAYER) + target = static_cast const*>(movementGenerator)->GetTarget(); + else + target = static_cast const*>(movementGenerator)->GetTarget(); + + if (!target) + handler->SendSysMessage(LANG_MOVEGENS_CHASE_NULL); + else if (target->GetTypeId() == TYPEID_PLAYER) + handler->PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, target->GetName(), target->GetGUIDLow()); + else + handler->PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, target->GetName(), target->GetGUIDLow()); + break; + } + case FOLLOW_MOTION_TYPE: + { + Unit* target = NULL; + if (unit->GetTypeId() == TYPEID_PLAYER) + target = static_cast const*>(movementGenerator)->GetTarget(); + else + target = static_cast const*>(movementGenerator)->GetTarget(); + + if (!target) + handler->SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL); + else if (target->GetTypeId() == TYPEID_PLAYER) + handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, target->GetName(), target->GetGUIDLow()); + else + handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, target->GetName(), target->GetGUIDLow()); + break; + } + case HOME_MOTION_TYPE: + { + if (unit->GetTypeId() == TYPEID_UNIT) + handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); + else + handler->SendSysMessage(LANG_MOVEGENS_HOME_PLAYER); + break; + } + case FLIGHT_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_FLIGHT); + break; + case POINT_MOTION_TYPE: + { + handler->PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z); + break; + } + case FLEEING_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_FEAR); + break; + case DISTRACT_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_DISTRACT); + break; + case EFFECT_MOTION_TYPE: + handler->SendSysMessage(LANG_MOVEGENS_EFFECT); + break; + default: + handler->PSendSysMessage(LANG_MOVEGENS_UNKNOWN, movementGenerator->GetMovementGeneratorType()); + break; + } + } + return true; + } + /* + ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator + Without this function 3rd party scripting library will get linking errors (unresolved external) + when attempting to use the PointMovementGenerator + */ + static bool HandleComeToMeCommand(ChatHandler* handler, char const* args) + { + char const* newFlagStr = strtok((char*)args, " "); + if (!newFlagStr) + return false; + + Creature* caster = handler->getSelectedCreature(); + if (!caster) + { + handler->SendSysMessage(LANG_SELECT_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + Player* player = handler->GetSession()->GetPlayer(); + + caster->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); + + return true; + } + + static bool HandleDamageCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + Unit* target = handler->getSelectedUnit(); + if (!target || !handler->GetSession()->GetPlayer()->GetSelection()) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + if (target->GetTypeId() == TYPEID_PLAYER) + { + if (handler->HasLowerSecurity((Player*)target, 0, false)) + return false; + } + + if (!target->isAlive()) + return true; + + char* damageStr = strtok((char*)args, " "); + if (!damageStr) + return false; + + int32 damage_int = atoi((char*)damageStr); + if (damage_int <= 0) + return true; + + uint32 damage = damage_int; + + char* schoolStr = strtok((char*)NULL, " "); + + // flat melee damage without resistence/etc reduction + if (!schoolStr) + { + handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + if (target != handler->GetSession()->GetPlayer()) + handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0); + return true; + } + + uint32 school = schoolStr ? atoi((char*)schoolStr) : SPELL_SCHOOL_NORMAL; + if (school >= MAX_SPELL_SCHOOL) + return false; + + SpellSchoolMask schoolmask = SpellSchoolMask(1 << school); + + if (Unit::IsDamageReducedByArmor(schoolmask)) + damage = handler->GetSession()->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK); + + char* spellStr = strtok((char*)NULL, " "); + + // melee damage by specific school + if (!spellStr) + { + uint32 absorb = 0; + uint32 resist = 0; + + handler->GetSession()->GetPlayer()->CalcAbsorbResist(target, schoolmask, SPELL_DIRECT_DAMAGE, damage, &absorb, &resist); + + if (damage <= absorb + resist) + return true; + + damage -= absorb + resist; + + handler->GetSession()->GetPlayer()->DealDamageMods(target, damage, &absorb); + handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false); + handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); + return true; + } + + // non-melee damage + + // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form + uint32 spellid = handler->extractSpellIdFromLink((char*)args); + if (!spellid || !sSpellMgr->GetSpellInfo(spellid)) + return false; + + handler->GetSession()->GetPlayer()->SpellNonMeleeDamageLog(target, spellid, damage); + return true; + } + + static bool HandleCombatStopCommand(ChatHandler* handler, char const* args) + { + Player* target = NULL; + + if (args && strlen(args) > 0) + { + target = sObjectAccessor->FindPlayerByName(args); + if (!target) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + } + + if (!target) + { + if (!handler->extractPlayerTarget((char*)args, &target)) + return false; + } + + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + target->CombatStop(); + target->getHostileRefManager().deleteReferences(); + return true; + } + + static bool HandleFlushArenaPointsCommand(ChatHandler* /*handler*/, char const* /*args*/) + { + sArenaTeamMgr->DistributeArenaPoints(); + return true; + } + + static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args) + { + Player* target; + if (!handler->extractPlayerTarget((char*)args, &target)) + return false; + + // check online security + if (handler->HasLowerSecurity(target, 0)) + return false; + + // Repair items + target->DurabilityRepairAll(false, 0, false); + + handler->PSendSysMessage(LANG_YOU_REPAIR_ITEMS, handler->GetNameLink(target).c_str()); + if (handler->needReportToTarget(target)) + ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, handler->GetNameLink().c_str()); + + return true; + } + + static bool HandleWaterwalkCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + Player* player = handler->getSelectedPlayer(); + if (!player) + { + handler->PSendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + // check online security + if (handler->HasLowerSecurity(player, 0)) + return false; + + if (strncmp(args, "on", 3) == 0) + player->SendMovementSetWaterWalking(true); + else if (strncmp(args, "off", 4) == 0) + player->SendMovementSetWaterWalking(false); + else + { + handler->SendSysMessage(LANG_USE_BOL); + return false; + } + + handler->PSendSysMessage(LANG_YOU_SET_WATERWALK, args, handler->GetNameLink(player).c_str()); + if (handler->needReportToTarget(player)) + ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, handler->GetNameLink().c_str()); + return true; + } + + // Send mail by command + static bool HandleSendMailCommand(ChatHandler* handler, char const* args) + { + // format: name "subject text" "mail text" + Player* target; + uint64 targetGuid; + std::string targetName; + if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) + return false; + + char* tail1 = strtok(NULL, ""); + if (!tail1) + return false; + + char const* msgSubject = handler->extractQuotedArg(tail1); + if (!msgSubject) + return false; + + char* tail2 = strtok(NULL, ""); + if (!tail2) + return false; + + char const* msgText = handler->extractQuotedArg(tail2); + if (!msgText) + return false; + + // msgSubject, msgText isn't NUL after prev. check + std::string subject = msgSubject; + std::string text = msgText; + + // from console show not existed sender + MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); + + //- TODO: Fix poor design + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + MailDraft(subject, text) + .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender); + + CharacterDatabase.CommitTransaction(trans); + + std::string nameLink = handler->playerLink(targetName); + handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); + return true; + } + // Send items by mail + static bool HandleSendItemsCommand(ChatHandler* handler, char const* args) + { + // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12] + Player* receiver; + uint64 receiverGuid; + std::string receiverName; + if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName)) + return false; + + char* tail1 = strtok(NULL, ""); + if (!tail1) + return false; + + char const* msgSubject = handler->extractQuotedArg(tail1); + if (!msgSubject) + return false; + + char* tail2 = strtok(NULL, ""); + if (!tail2) + return false; + + char const* msgText = handler->extractQuotedArg(tail2); + if (!msgText) + return false; + + // msgSubject, msgText isn't NUL after prev. check + std::string subject = msgSubject; + std::string text = msgText; + + // extract items + typedef std::pair ItemPair; + typedef std::list< ItemPair > ItemPairs; + ItemPairs items; + + // get all tail string + char* tail = strtok(NULL, ""); + + // get from tail next item str + while (char* itemStr = strtok(tail, " ")) + { + // and get new tail + tail = strtok(NULL, ""); + + // parse item str + char const* itemIdStr = strtok(itemStr, ":"); + char const* itemCountStr = strtok(NULL, " "); + + uint32 itemId = atoi(itemIdStr); + if (!itemId) + return false; + + ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(itemId); + if (!item_proto) + { + handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 itemCount = itemCountStr ? atoi(itemCountStr) : 1; + if (itemCount < 1 || (item_proto->MaxCount > 0 && itemCount > uint32(item_proto->MaxCount))) + { + handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemId); + handler->SetSentErrorMessage(true); + return false; + } + + while (itemCount > item_proto->GetMaxStackSize()) + { + items.push_back(ItemPair(itemId, item_proto->GetMaxStackSize())); + itemCount -= item_proto->GetMaxStackSize(); + } + + items.push_back(ItemPair(itemId, itemCount)); + + if (items.size() > MAX_MAIL_ITEMS) + { + handler->PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS); + handler->SetSentErrorMessage(true); + return false; + } + } + + // from console show not existed sender + MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); + + // fill mail + MailDraft draft(subject, text); + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr) + { + if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0)) + { + item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted + draft.AddItem(item); + } + } + + draft.SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender); + CharacterDatabase.CommitTransaction(trans); + + std::string nameLink = handler->playerLink(receiverName); + handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); + return true; + } + /// Send money by mail + static bool HandleSendMoneyCommand(ChatHandler* handler, char const* args) + { + /// format: name "subject text" "mail text" money + + Player* receiver; + uint64 receiverGuid; + std::string receiverName; + if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName)) + return false; + + char* tail1 = strtok(NULL, ""); + if (!tail1) + return false; + + char* msgSubject = handler->extractQuotedArg(tail1); + if (!msgSubject) + return false; + + char* tail2 = strtok(NULL, ""); + if (!tail2) + return false; + + char* msgText = handler->extractQuotedArg(tail2); + if (!msgText) + return false; + + char* moneyStr = strtok(NULL, ""); + int32 money = moneyStr ? atoi(moneyStr) : 0; + if (money <= 0) + return false; + + // msgSubject, msgText isn't NUL after prev. check + std::string subject = msgSubject; + std::string text = msgText; + + // from console show not existed sender + MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + MailDraft(subject, text) + .AddMoney(money) + .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender); + + CharacterDatabase.CommitTransaction(trans); + + std::string nameLink = handler->playerLink(receiverName); + handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); + return true; + } + /// Send a message to a player in game + static bool HandleSendMessageCommand(ChatHandler* handler, char const* args) + { + /// - Find the player + Player* player; + if (!handler->extractPlayerTarget((char*)args, &player)) + return false; + + char* msgStr = strtok(NULL, ""); + if (!msgStr) + return false; + + ///- Check that he is not logging out. + if (player->GetSession()->isLogingOut()) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + /// - Send the message + // Use SendAreaTriggerMessage for fastest delivery. + player->GetSession()->SendAreaTriggerMessage("%s", msgStr); + player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r"); + + // Confirmation message + std::string nameLink = handler->GetNameLink(player); + handler->PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), msgStr); + + return true; + } + + static bool HandleCreatePetCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + Creature* creatureTarget = handler->getSelectedCreature(); + + if (!creatureTarget || creatureTarget->isPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER) + { + handler->PSendSysMessage(LANG_SELECT_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry()); + // Creatures with family 0 crashes the server + if (!creatrueTemplate->family) + { + handler->PSendSysMessage("This creature cannot be tamed. (family id: 0)."); + handler->SetSentErrorMessage(true); + return false; + } + + if (player->GetPetGUID()) + { + handler->PSendSysMessage("You already have a pet"); + handler->SetSentErrorMessage(true); + return false; + } + + // Everything looks OK, create new pet + Pet* pet = new Pet(player, HUNTER_PET); + if (!pet->CreateBaseAtCreature(creatureTarget)) + { + delete pet; + handler->PSendSysMessage("Error 1"); + return false; + } + + creatureTarget->setDeathState(JUST_DIED); + creatureTarget->RemoveCorpse(); + creatureTarget->SetHealth(0); // just for nice GM-mode view + + pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID()); + pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction()); + + if (!pet->InitStatsForLevel(creatureTarget->getLevel())) + { + sLog->outError(LOG_FILTER_GENERAL, "InitStatsForLevel() in EffectTameCreature failed! Pet deleted."); + handler->PSendSysMessage("Error 2"); + delete pet; + return false; + } + + // prepare visual effect for levelup + pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1); + + pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); + // this enables pet details window (Shift+P) + pet->InitPetCreateSpells(); + pet->SetFullHealth(); + + pet->GetMap()->AddToMap(pet->ToCreature()); + + // visual effect for levelup + pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()); + + player->SetMinion(pet, true); + pet->SavePetToDB(PET_SAVE_AS_CURRENT); + player->PetSpellInitialize(); + + return true; + } + + static bool HandlePetLearnCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + Player* player = handler->GetSession()->GetPlayer(); + Pet* pet = player->GetPet(); + + if (!pet) + { + handler->PSendSysMessage("You have no pet"); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 spellId = handler->extractSpellIdFromLink((char*)args); + + if (!spellId || !sSpellMgr->GetSpellInfo(spellId)) + return false; + + // Check if pet already has it + if (pet->HasSpell(spellId)) + { + handler->PSendSysMessage("Pet already has spell: %u", spellId); + handler->SetSentErrorMessage(true); + return false; + } + + // Check if spell is valid + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo)) + { + handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); + handler->SetSentErrorMessage(true); + return false; + } + + pet->learnSpell(spellId); + + handler->PSendSysMessage("Pet has learned spell %u", spellId); + return true; + } + + static bool HandlePetUnlearnCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + Player* player = handler->GetSession()->GetPlayer(); + Pet* pet = player->GetPet(); + if (!pet) + { + handler->PSendSysMessage("You have no pet"); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 spellId = handler->extractSpellIdFromLink((char*)args); + + if (pet->HasSpell(spellId)) + pet->removeSpell(spellId, false); + else + handler->PSendSysMessage("Pet doesn't have that spell"); + + return true; + } + + static bool HandleFreezeCommand(ChatHandler* handler, char const* args) + { + std::string name; + Player* player; + char const* TargetName = strtok((char*)args, " "); // get entered name + if (!TargetName) // if no name entered use target + { + player = handler->getSelectedPlayer(); + if (player) //prevent crash with creature as target + { + name = player->GetName(); + normalizePlayerName(name); + } + } + else // if name entered + { + name = TargetName; + normalizePlayerName(name); + player = sObjectAccessor->FindPlayerByName(name.c_str()); + } + + if (!player) + { + handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); + return true; + } + + if (player == handler->GetSession()->GetPlayer()) + { + handler->SendSysMessage(LANG_COMMAND_FREEZE_ERROR); + return true; + } + + // effect + if (player && (player != handler->GetSession()->GetPlayer())) + { + handler->PSendSysMessage(LANG_COMMAND_FREEZE, name.c_str()); + + // stop combat + make player unattackable + duel stop + stop some spells + player->setFaction(35); + player->CombatStop(); + if (player->IsNonMeleeSpellCasted(true)) + player->InterruptNonMeleeSpells(true); + player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + // if player class = hunter || warlock remove pet if alive + if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK)) + { + if (Pet* pet = player->GetPet()) + { + pet->SavePetToDB(PET_SAVE_AS_CURRENT); + // not let dismiss dead pet + if (pet && pet->isAlive()) + player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); + } + } + + if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(9454)) + Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, player, player); + + // save player + player->SaveToDB(); + } + + return true; + } + + static bool HandleUnFreezeCommand(ChatHandler* handler, char const*args) + { + std::string name; + Player* player; + char* targetName = strtok((char*)args, " "); // Get entered name + + if (targetName) + { + name = targetName; + normalizePlayerName(name); + player = sObjectAccessor->FindPlayerByName(name.c_str()); + } + else // If no name was entered - use target + { + player = handler->getSelectedPlayer(); + if (player) + name = player->GetName(); + } + + if (player) + { + handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); + + // Reset player faction + allow combat + allow duels + player->setFactionForRace(player->getRace()); + player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + // Remove Freeze spell (allowing movement and spells) + player->RemoveAurasDueToSpell(9454); + + // Save player + player->SaveToDB(); + } + else + { + if (targetName) + { + // Check for offline players + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_GUID_BY_NAME); + stmt->setString(0, name); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (!result) + { + handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); + return true; + } + + // If player found: delete his freeze aura + Field* fields = result->Fetch(); + uint32 lowGuid = fields[0].GetUInt32(); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN); + stmt->setUInt32(0, lowGuid); + CharacterDatabase.Execute(stmt); + + handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); + return true; + } + else + { + handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); + return true; + } + } + + return true; + } + + static bool HandleListFreezeCommand(ChatHandler* handler, char const* /*args*/) + { + // Get names from DB + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AURA_FROZEN); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) + { + handler->SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS); + return true; + } + + // Header of the names + handler->PSendSysMessage(LANG_COMMAND_LIST_FREEZE); + + // Output of the results + do + { + Field* fields = result->Fetch(); + std::string player = fields[0].GetString(); + handler->PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS, player.c_str()); + } + while (result->NextRow()); + + return true; + } + + static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args) + { + Player* player = NULL; + Group* group = NULL; + uint64 guid = 0; + char* nameStr = strtok((char*)args, " "); + + if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid)) + if (group && group->GetLeaderGUID() != guid) + { + group->ChangeLeader(guid); + group->SendUpdate(); + } + + return true; + } + + static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args) + { + Player* player = NULL; + Group* group = NULL; + uint64 guid = 0; + char* nameStr = strtok((char*)args, " "); + + if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid)) + if (group) + group->Disband(); + + return true; + } + + static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args) + { + Player* player = NULL; + Group* group = NULL; + uint64 guid = 0; + char* nameStr = strtok((char*)args, " "); + + if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid, true)) + if (group) + group->RemoveMember(guid); + + return true; + } + + static bool HandlePlayAllCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 soundId = atoi((char*)args); + + if (!sSoundEntriesStore.LookupEntry(soundId)) + { + handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); + handler->SetSentErrorMessage(true); + return false; + } + + WorldPacket data(SMSG_PLAY_SOUND, 4); + data << uint32(soundId) << handler->GetSession()->GetPlayer()->GetGUID(); + sWorld->SendGlobalMessage(&data); + + handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId); + return true; + } + + static bool HandlePossessCommand(ChatHandler* handler, char const* /*args*/) + { + Unit* unit = handler->getSelectedUnit(); + if (!unit) + return false; + + handler->GetSession()->GetPlayer()->CastSpell(unit, 530, true); + return true; + } + + static bool HandleUnPossessCommand(ChatHandler* handler, char const* /*args*/) + { + Unit* unit = handler->getSelectedUnit(); + if (!unit) + unit = handler->GetSession()->GetPlayer(); + + unit->RemoveCharmAuras(); + + return true; + } + + static bool HandleBindSightCommand(ChatHandler* handler, char const* /*args*/) + { + Unit* unit = handler->getSelectedUnit(); + if (!unit) + return false; + + handler->GetSession()->GetPlayer()->CastSpell(unit, 6277, true); + return true; + } + + static bool HandleUnbindSightCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + if (player->isPossessing()) + return false; + + player->StopCastingBindSight(); + return true; + } +}; + +void AddSC_misc_commandscript() +{ + new misc_commandscript(); +} diff --git a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp index 9db03971756..1847de91d14 100644 --- a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp @@ -47,7 +47,7 @@ enum eEnums SAY_PROGRESS_7 = 7, EMOTE_PROGRESS_8 = 8, SAY_PROGRESS_9 = 9, - + EVENT_SAY_3 = 1, EVENT_SAY_6 = 2, EVENT_SAY_8 = 3, @@ -112,9 +112,9 @@ class npc_professor_phizzlethorpe : public CreatureScript Player* player = GetPlayerForEscort(); if (!player) return; - + events.Update(diff); - + while (uint32 event = events.ExecuteEvent()) { switch (event) @@ -135,7 +135,7 @@ class npc_professor_phizzlethorpe : public CreatureScript } npc_escortAI::UpdateAI(diff); } - + EventMap events; }; diff --git a/src/server/scripts/EasternKingdoms/burning_steppes.cpp b/src/server/scripts/EasternKingdoms/burning_steppes.cpp index 3f8e86753dd..2ef43ee67ed 100644 --- a/src/server/scripts/EasternKingdoms/burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/burning_steppes.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Burning_Steppes SD%Complete: 0 -SDComment: +SDComment: SDCategory: Burning Steppes EndScriptData */ @@ -31,5 +31,5 @@ EndScriptData */ void AddSC_burning_steppes() { - + } diff --git a/src/server/scripts/EasternKingdoms/ghostlands.cpp b/src/server/scripts/EasternKingdoms/ghostlands.cpp index dcc938f35fe..93141f2d82c 100644 --- a/src/server/scripts/EasternKingdoms/ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/ghostlands.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Ghostlands SD%Complete: 100 -SDComment: +SDComment: SDCategory: Ghostlands EndScriptData */ diff --git a/src/server/scripts/EasternKingdoms/ironforge.cpp b/src/server/scripts/EasternKingdoms/ironforge.cpp index 98a4d780058..9cb9ef63693 100644 --- a/src/server/scripts/EasternKingdoms/ironforge.cpp +++ b/src/server/scripts/EasternKingdoms/ironforge.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Ironforge SD%Complete: 0 -SDComment: +SDComment: SDCategory: Ironforge EndScriptData */ diff --git a/src/server/scripts/EasternKingdoms/loch_modan.cpp b/src/server/scripts/EasternKingdoms/loch_modan.cpp index 32862a2d7b0..c5571560b54 100644 --- a/src/server/scripts/EasternKingdoms/loch_modan.cpp +++ b/src/server/scripts/EasternKingdoms/loch_modan.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Loch_Modan SD%Complete: 0 -SDComment: +SDComment: SDCategory: Loch Modan EndScriptData */ diff --git a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp index 81223dad1d3..3d47a8e8ed6 100644 --- a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp @@ -18,7 +18,7 @@ /* Script Data Start SDName: Redridge Mountains SD%Complete: 0 -SDComment: +SDComment: Script Data End */ #include "ScriptMgr.h" diff --git a/src/server/scripts/EasternKingdoms/stormwind_city.cpp b/src/server/scripts/EasternKingdoms/stormwind_city.cpp index f5ade53202a..f6afed67dff 100644 --- a/src/server/scripts/EasternKingdoms/stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/stormwind_city.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Stormwind_City SD%Complete: 0 -SDComment: +SDComment: SDCategory: Stormwind City EndScriptData */ diff --git a/src/server/scripts/Kalimdor/azshara.cpp b/src/server/scripts/Kalimdor/azshara.cpp index 740f3d5c7e2..fdc00e04a09 100644 --- a/src/server/scripts/Kalimdor/azshara.cpp +++ b/src/server/scripts/Kalimdor/azshara.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Azshara SD%Complete: 0 -SDComment: Quest support: +SDComment: Quest support: SDCategory: Azshara EndScriptData */ diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 376de2ac97c..2089b969e1a 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2735,7 +2735,6 @@ Logger.CharDump=38,5,CharDump Logger.Battlefield=39,3,Console Server Logger.Opcodes=40,2,Console Server - # LogLevel # 0 - (Disabled) # 1 - (Trace) -- cgit v1.2.3 From 21b1b72a6b0867d0ea5d1c9fbfeeac3240054b8d Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 16 Aug 2012 13:27:54 +0200 Subject: Scripts/Commands: Fixed remaining crashes caused by removal of dbc locales --- src/server/game/Entities/Player/Player.cpp | 6 ++---- src/server/scripts/Commands/cs_go.cpp | 2 +- src/server/scripts/Commands/cs_learn.cpp | 25 +++---------------------- src/server/scripts/Commands/cs_misc.cpp | 15 +++++++-------- src/server/scripts/Commands/cs_modify.cpp | 2 +- src/server/scripts/Commands/cs_titles.cpp | 2 +- 6 files changed, 15 insertions(+), 37 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ffa15d665be..ff25ff3b7f6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2538,7 +2538,7 @@ void Player::RegenerateAll() m_regenTimerCount -= 2000; } - + if (m_holyPowerRegenTimerCount >= 10000 && getClass() == CLASS_PALADIN) { Regenerate(POWER_HOLY_POWER); @@ -13107,7 +13107,7 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint GetSession()->SendPacket(&data); } -void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param) +void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 /*param*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_BUY_FAILED"); WorldPacket data(SMSG_BUY_FAILED, (8+4+4+1)); @@ -13332,8 +13332,6 @@ void Player::ApplyReforgeEnchantment(Item* item, bool apply) if (!reforge) return; - ItemTemplate const* proto = item->GetTemplate(); - float removeValue = item->GetReforgableStat(ItemModType(reforge->SourceStat)) * reforge->SourceMultiplier; float addValue = removeValue * reforge->FinalMultiplier; diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index f7371884da2..b0f1eed5d5c 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -444,7 +444,7 @@ public: if (map->Instanceable()) { - handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name[handler->GetSessionDbcLocale()], map->GetId(), map->GetMapName()); + handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name, map->GetId(), map->GetMapName()); handler->SetSentErrorMessage(true); return false; } diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index cfdfc66f991..dcfa6b6b04c 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -394,33 +394,14 @@ public: !skillInfo->canLink) // only prof with recipes have set continue; - int locale = handler->GetSessionDbcLocale(); - name = skillInfo->name[locale]; + name = skillInfo->name; if (name.empty()) continue; if (!Utf8FitTo(name, namePart)) - { - locale = 0; - for (; locale < TOTAL_LOCALES; ++locale) - { - if (locale == handler->GetSessionDbcLocale()) - continue; - - name = skillInfo->name[locale]; - if (name.empty()) - continue; - - if (Utf8FitTo(name, namePart)) - break; - } - } + continue; - if (locale < TOTAL_LOCALES) - { - targetSkillInfo = skillInfo; - break; - } + targetSkillInfo = skillInfo; } if (!targetSkillInfo) diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index ba0dc5667db..7ea681170b4 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1505,7 +1505,7 @@ public: if (!target->GetSkillValue(skill)) { - handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]); + handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name); handler->SetSentErrorMessage(true); return false; } @@ -1516,7 +1516,7 @@ public: return false; target->SetSkill(skill, target->GetSkillStep(skill), level, max); - handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max); + handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name, tNameLink.c_str(), level, max); return true; } @@ -1754,7 +1754,6 @@ public: handler->PSendSysMessage(LANG_PINFO_LEVEL, raceStr.c_str(), ClassStr.c_str(), timeStr.c_str(), level, gold, silv, copp); // Add map, zone, subzone and phase to output - int locale = handler->GetSessionDbcLocale(); std::string areaName = ""; std::string zoneName = ""; @@ -1763,22 +1762,22 @@ public: AreaTableEntry const* area = GetAreaEntryByAreaID(areaId); if (area) { - areaName = area->area_name[locale]; + areaName = area->area_name; AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); if (zone) - zoneName = zone->area_name[locale]; + zoneName = zone->area_name; } if (target) { if (!zoneName.empty()) - handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], zoneName.c_str(), areaName.c_str(), phase); + handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name, zoneName.c_str(), areaName.c_str(), phase); else - handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], areaName.c_str(), "", phase); + handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name, areaName.c_str(), "", phase); } else - handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str()); + handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name, areaName.c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index dee8a52debd..beb5db62dfa 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1231,7 +1231,7 @@ public: if (factionEntry->reputationListID < 0) { - handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[handler->GetSessionDbcLocale()], factionId); + handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name, factionId); handler->SetSentErrorMessage(true); return false; } diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index 0a3b430ab2c..cb52844c626 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -94,7 +94,7 @@ public: target->SetTitle(titleInfo); // to be sure that title now known target->SetUInt32Value(PLAYER_CHOSEN_TITLE, titleInfo->bit_index); - handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, titleInfo->name[handler->GetSessionDbcLocale()], tNameLink.c_str()); + handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, titleInfo->name, tNameLink.c_str()); return true; } -- cgit v1.2.3 From 759e73c78f138094a28068286d2f44c9e1162bb6 Mon Sep 17 00:00:00 2001 From: Greymane Date: Thu, 16 Aug 2012 19:55:01 +0100 Subject: Core/Spells: * Implemented aura 328 SPELL_AURA_PROC_ON_POWER_AMOUNT. * Added eclipse power energize handling. Closes #7417 --- .../2012_08_15_01_world_spell_script_names_434.sql | 5 + src/server/game/Entities/Player/Player.cpp | 16 +++ src/server/game/Entities/Unit/Unit.cpp | 159 +++++++++++++++++---- src/server/game/Entities/Unit/Unit.h | 4 +- src/server/game/Spells/Auras/SpellAuraDefines.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 +- src/server/game/Spells/Auras/SpellAuras.cpp | 4 + src/server/game/Spells/SpellMgr.cpp | 6 + src/server/scripts/Spells/spell_druid.cpp | 125 ++++++++++++++++ 9 files changed, 296 insertions(+), 27 deletions(-) create mode 100644 sql/updates/world/2012_08_15_01_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_15_01_world_spell_script_names_434.sql b/sql/updates/world/2012_08_15_01_world_spell_script_names_434.sql new file mode 100644 index 00000000000..b280367c811 --- /dev/null +++ b/sql/updates/world/2012_08_15_01_world_spell_script_names_434.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (2912,5176,78674); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(2912, 'spell_dru_eclipse_energize'), +(5176, 'spell_dru_eclipse_energize'), +(78674, 'spell_dru_eclipse_energize'); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3d204eaec6a..5fad57c3b0d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2391,6 +2391,7 @@ void Player::ProcessDelayedOperations() SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); + SetPower(POWER_ECLIPSE, 0); SpawnCorpseBones(); } @@ -2741,6 +2742,9 @@ void Player::ResetAllPowers() case POWER_RUNIC_POWER: SetPower(POWER_RUNIC_POWER, 0); break; + case POWER_ECLIPSE: + SetPower(POWER_ECLIPSE, 0); + break; default: break; } @@ -5147,6 +5151,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, uint32(GetMaxPower(POWER_ENERGY)*restore_percent)); SetPower(POWER_FOCUS, uint32(GetMaxPower(POWER_FOCUS)*restore_percent)); + SetPower(POWER_ECLIPSE, 0); } // trigger update zone for alive state zone updates @@ -18652,7 +18657,12 @@ void Player::SaveToDB(bool create /*=false*/) { if (GetPowerIndexByClass(Powers(i), getClass()) != MAX_POWERS) { + // Eclipse Power isnt saved. + if (i == POWER_ECLIPSE) + continue; + stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_POWER1 + storedPowers)); + if (++storedPowers >= MAX_STORED_POWERS) break; } @@ -18774,7 +18784,12 @@ void Player::SaveToDB(bool create /*=false*/) { if (GetPowerIndexByClass(Powers(i), getClass()) != MAX_POWERS) { + // Eclipse Power isnt saved. + if (i == POWER_ECLIPSE) + continue; + stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_POWER1 + storedPowers)); + if (++storedPowers >= MAX_STORED_POWERS) break; } @@ -23175,6 +23190,7 @@ void Player::ResurectUsingRequestData() SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); SetPower(POWER_FOCUS, GetMaxPower(POWER_FOCUS)); + SetPower(POWER_ECLIPSE, 0); SpawnCorpseBones(); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5ce424738b2..5a4cba9d58b 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4978,6 +4978,127 @@ bool Unit::HandleSpellCritChanceAuraProc(Unit* victim, uint32 /*damage*/, AuraEf return true; } +bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown) +{ + // Get triggered aura spell info + SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo(); + + // Get effect index used for the proc + uint32 effIndex = triggeredByAura->GetEffIndex(); + + // Power amount required to proc the spell + int32 powerAmountRequired = triggeredByAura->GetAmount(); + // Power type required to proc + Powers powerRequired = Powers(auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].MiscValue); + + // Set trigger spell id, target, custom basepoints + uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell; + + Unit* target = NULL; + int32 basepoints0 = 0; + + Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && GetTypeId() == TYPEID_PLAYER + ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : NULL; + + /* Try handle unknown trigger spells or with invalid power amount or misc value + if (sSpellMgr->GetSpellInfo(trigger_spell_id) == NULL || powerAmountRequired == NULL || powerRequired >= MAX_POWER) + { + switch (auraSpellInfo->SpellFamilyName) + { + case SPELLFAMILY_GENERIC: + { + break; + } + } + }*/ + + // All ok. Check current trigger spell + SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id); + if (triggerEntry == NULL) + { + // Not cast unknown spell + // sLog->outError("Unit::HandleAuraProcOnPowerAmount: Spell %u have 0 in EffectTriggered[%d], not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex()); + return false; + } + + // not allow proc extra attack spell at extra attack + if (m_extraAttacks && triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + return false; + + if (powerRequired == NULL || powerAmountRequired == NULL) + { + sLog->outError(LOG_FILTER_SPELLS_AURAS, "Unit::HandleAuraProcOnPowerAmount: Spell %u have 0 powerAmountRequired in EffectAmount[%d] or 0 powerRequired in EffectMiscValue, not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex()); + return false; + } + + if (GetPower(powerRequired) != powerAmountRequired) + return false; + + // Custom requirements (not listed in procEx) Warning! damage dealing after this + // Custom triggered spells + switch (auraSpellInfo->SpellFamilyName) + { + case SPELLFAMILY_DRUID: + { + // Eclipse Mastery Driver Passive + if (auraSpellInfo->Id == 79577) + { + uint32 solarEclipseMarker = 67483; + uint32 lunarEclipseMarker = 67484; + + switch(effIndex) + { + case 0: + { + // Do not proc if proc spell isnt starfire and starsurge + if (procSpell->Id != 2912 && procSpell->Id != 78674) + return false; + + if (HasAura(solarEclipseMarker)) + { + RemoveAurasDueToSpell(solarEclipseMarker); + CastSpell(this,lunarEclipseMarker,true); + } + break; + } + case 1: + { + // Do not proc if proc spell isnt wrath and starsurge + if (procSpell->Id != 5176 && procSpell->Id != 78674) + return false; + + if (HasAura(lunarEclipseMarker)) + { + RemoveAurasDueToSpell(lunarEclipseMarker); + CastSpell(this,solarEclipseMarker,true); + } + + break; + } + } + } + break; + } + } + + if (cooldown && GetTypeId() == TYPEID_PLAYER && ToPlayer()->HasSpellCooldown(trigger_spell_id)) + return false; + + // try detect target manually if not set + if (target == NULL) + target = !(procFlag & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry && triggerEntry->IsPositive() ? this : victim; + + if (basepoints0) + CastCustomSpell(target, trigger_spell_id, &basepoints0, NULL, NULL, true, castItem, triggeredByAura); + else + CastSpell(target, trigger_spell_id, true, castItem, triggeredByAura); + + if (cooldown && GetTypeId() == TYPEID_PLAYER) + ToPlayer()->AddSpellCooldown(trigger_spell_id, 0, time(NULL) + cooldown); + + return true; +} + //victim may be NULL bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown) { @@ -6218,26 +6339,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere return true; } } - // Eclipse - if (dummySpell->SpellIconID == 2856 && GetTypeId() == TYPEID_PLAYER) - { - if (!procSpell || effIndex != 0) - return false; - - bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1); - - if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f))) - return false; - - target = this; - if (target->HasAura(isWrathSpell ? 48517 : 48518)) - return false; - - triggered_spell_id = isWrathSpell ? 48518 : 48517; - break; - } // Living Seed - else if (dummySpell->SpellIconID == 2860) + if (dummySpell->SpellIconID == 2860) { triggered_spell_id = 48504; basepoints0 = CalculatePctN(int32(damage), triggerAmount); @@ -9639,7 +9742,7 @@ void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellID, uint32 damage, Pow SendMessageToSet(&data, true); } -void Unit::EnergizeBySpell(Unit* victim, uint32 spellID, uint32 damage, Powers powerType) +void Unit::EnergizeBySpell(Unit* victim, uint32 spellID, int32 damage, Powers powerType) { SendEnergizeSpellLog(victim, spellID, damage, powerType); // needs to be called after sending spell log @@ -11732,9 +11835,9 @@ int32 Unit::ModifyPower(Powers power, int32 dVal) int32 curPower = (int32)GetPower(power); int32 val = dVal + curPower; - if (val <= 0) + if (val <= GetMinPower(power)) { - SetPower(power, 0); + SetPower(power, GetMinPower(power)); return -curPower; } @@ -13315,7 +13418,7 @@ void Unit::SetPower(Powers power, int32 val) if (maxPower < val) val = maxPower; - SetStatInt32Value(UNIT_FIELD_POWER1 + powerIndex, val); + SetInt32Value(UNIT_FIELD_POWER1 + powerIndex, val); if (IsInWorld()) { @@ -13351,7 +13454,7 @@ void Unit::SetMaxPower(Powers power, int32 val) return; int32 cur_power = GetPower(power); - SetStatInt32Value(UNIT_FIELD_MAXPOWER1 + powerIndex, val); + SetInt32Value(UNIT_FIELD_MAXPOWER1 + powerIndex, val); // group update if (GetTypeId() == TYPEID_PLAYER) @@ -13808,6 +13911,7 @@ bool InitTriggerAuraData() isNonTriggerAura[i] = false; isAlwaysTriggeredAura[i] = false; } + isTriggerAura[SPELL_AURA_PROC_ON_POWER_AMOUNT] = true; isTriggerAura[SPELL_AURA_DUMMY] = true; isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true; isTriggerAura[SPELL_AURA_MOD_THREAT] = true; @@ -14095,6 +14199,13 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u takeCharges = true; break; } + case SPELL_AURA_PROC_ON_POWER_AMOUNT: + { + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); + if (HandleAuraProcOnPowerAmount(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + takeCharges = true; + break; + } case SPELL_AURA_OBS_MOD_POWER: sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); if (HandleObsModEnergyAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index addf99a03ac..cafbfaac5b1 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1344,6 +1344,7 @@ class Unit : public WorldObject Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); } void setPowerType(Powers power); int32 GetPower(Powers power) const; + int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; } uint32 GetMaxPower(Powers power) const; void SetPower(Powers power, int32 val); void SetMaxPower(Powers power, int32 val); @@ -1555,7 +1556,7 @@ class Unit : public WorldObject void SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical = false); int32 HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHealth, bool critical = false); void SendEnergizeSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, Powers powertype); - void EnergizeBySpell(Unit* victim, uint32 SpellID, uint32 Damage, Powers powertype); + void EnergizeBySpell(Unit* victim, uint32 SpellID, int32 Damage, Powers powertype); uint32 SpellNonMeleeDamageLog(Unit* victim, uint32 spellID, uint32 damage); void CastSpell(SpellCastTargets const& targets, SpellInfo const* spellInfo, CustomSpellValues const* value, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0); @@ -2306,6 +2307,7 @@ class Unit : public WorldObject void DisableSpline(); private: bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent); + bool HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleHasteAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleSpellCritChanceAuraProc(Unit* victim, uint32 damage, AuraEffect* triggredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 04809277eb4..c261636e5b6 100755 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -387,7 +387,7 @@ enum AuraType SPELL_AURA_325 = 325, SPELL_AURA_326 = 326, // phase related SPELL_AURA_327 = 327, - SPELL_AURA_328 = 328, + SPELL_AURA_PROC_ON_POWER_AMOUNT = 328, SPELL_AURA_MOD_RUNE_REGEN_SPEED = 329, // NYI SPELL_AURA_CAST_WHILE_WALKING = 330, // NYI SPELL_AURA_331 = 331, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e1b152735b9..edfc55dec44 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -381,7 +381,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //325 SPELL_AURA_325 &AuraEffect::HandleNULL, //326 SPELL_AURA_326 &AuraEffect::HandleNULL, //327 SPELL_AURA_327 - &AuraEffect::HandleNULL, //328 SPELL_AURA_328 + &AuraEffect::HandleNoImmediateEffect, //328 SPELL_AURA_PROC_ON_POWER_AMOUNT implemented in Unit::HandleAuraProcOnPowerAmount &AuraEffect::HandleNULL, //329 SPELL_AURA_MOD_RUNE_REGEN_SPEED &AuraEffect::HandleNULL, //330 SPELL_AURA_CAST_WHILE_WALKING &AuraEffect::HandleNULL, //331 SPELL_AURA_331 diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index f5b9c5b2cf2..3409d135849 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -921,6 +921,10 @@ bool Aura::CanBeSaved() const if (GetId() == 44413) return false; + // When a druid logins, he doesnt have either eclipse power, nor the marker auras, nor the eclipse buffs. Dont save them. + if (GetId() == 67483 || GetId() == 67484 || GetId() == 48517 || GetId() == 48518) + return false; + // don't save auras removed by proc system if (IsUsingCharges() && !GetCharges()) return false; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index fda59f27e0e..9f8e0943b1e 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3226,6 +3226,12 @@ void SpellMgr::LoadDbcDataCorrections() case 53246: // Marked for Death (Rank 5) spellInfo->EffectSpellClassMask[0] = flag96(0x00067801, 0x10820001, 0x00000801); break; + case 5176: // Wrath + case 2912: // Starfire + case 78674: // Starsurge + spellInfo->Effects[1].Effect = SPELL_EFFECT_DUMMY; + spellInfo->Effects[1].TargetA = TARGET_UNIT_CASTER; + break; case 70728: // Exploit Weakness (needs target selection script) case 70840: // Devious Minds (needs target selection script) spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER; diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 0bd7397f1d4..cdfb62bd55c 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -644,6 +644,130 @@ class spell_dru_insect_swarm : public SpellScriptLoader } }; +enum EclipseSpells +{ + SPELL_DRUID_WRATH = 5176, + SPELL_DRUID_STARFIRE = 2912, + SPELL_DRUID_STARSURGE = 78674, + SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE = 89265, + SPELL_DRUID_STARSURGE_ENERGIZE = 86605, + SPELL_DRUID_LUNAR_ECLIPSE_MARKER = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar) + SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) + SPELL_DRUID_SOLAR_ECLIPSE = 48517, + SPELL_DRUID_LUNAR_ECLIPSE = 48518, + TALENT_TREE_BALANCE = 752, +}; + +// Wrath, Starfire, and Starsurge +class spell_dru_eclipse_energize : public SpellScriptLoader +{ +public: + spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { } + + class spell_dru_eclipse_energize_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); + + int32 energizeAmount; + + bool Load() + { + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + return false; + + if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) + return false; + + energizeAmount = 0; + + return true; + } + + void HandleEnergize(SpellEffIndex effIndex) + { + Player* caster = GetCaster()->ToPlayer(); + + // No boomy, no deal. + if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_BALANCE) + return; + + switch(GetSpellInfo()->Id) + { + case SPELL_DRUID_WRATH: + { + energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 + // If we are set to fill the lunar side or we've just logged in with 0 power.. + if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + caster->CastSpell(caster,SPELL_DRUID_LUNAR_ECLIPSE_MARKER,true); + } + // The energizing effect brought us out of the solar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); + break; + } + case SPELL_DRUID_STARFIRE: + { + energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 + // If we are set to fill the solar side or we've just logged in with 0 power.. + if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); + } + // The energizing effect brought us out of the lunar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); + break; + } + case SPELL_DRUID_STARSURGE: + { + // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) + if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 + caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); + } + else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + { + energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 + caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + } + // The energizing effect brought us out of the lunar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); + // The energizing effect brought us out of the solar eclipse, remove the aura + else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); + break; + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_eclipse_energize_SpellScript; + } +}; + void AddSC_druid_spell_scripts() { new spell_dru_glyph_of_starfire(); @@ -659,4 +783,5 @@ void AddSC_druid_spell_scripts() new spell_dru_savage_roar(); new spell_dru_survival_instincts(); new spell_dru_insect_swarm(); + new spell_dru_eclipse_energize(); } -- cgit v1.2.3 From 8da0bbdbb3d841c4f2d22839b4dd819ee201e4d5 Mon Sep 17 00:00:00 2001 From: Spp Date: Fri, 17 Aug 2012 10:25:29 +0200 Subject: Core: Fix compile (Thanks to Sovak for reporting). Remove many warnings and Fix possible out of bounds access to Void storage --- src/server/game/Achievements/AchievementMgr.cpp | 20 +++++++++++++++ src/server/game/Achievements/AchievementMgr.h | 2 ++ src/server/game/Chat/Chat.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 30 +++++++++++----------- src/server/game/Entities/Unit/Unit.cpp | 18 +++++++------ src/server/game/Globals/ObjectMgr.cpp | 6 ++--- src/server/game/Guilds/Guild.cpp | 4 +-- src/server/game/Handlers/ChatHandler.cpp | 2 ++ src/server/game/Handlers/MailHandler.cpp | 4 +-- src/server/game/Handlers/SkillHandler.cpp | 2 +- src/server/game/Handlers/TradeHandler.cpp | 4 +-- src/server/game/Handlers/VoidStorageHandler.cpp | 8 +++--- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 +-- src/server/game/Spells/Spell.cpp | 2 +- src/server/game/World/World.cpp | 4 +-- .../scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp | 2 +- .../IcecrownCitadel/boss_deathbringer_saurfang.cpp | 8 +++--- 17 files changed, 74 insertions(+), 48 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 14895ae3165..2118b4cf42c 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1825,6 +1825,26 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS: + case ACHIEVEMENT_CRITERIA_TYPE_UNK118: + case ACHIEVEMENT_CRITERIA_TYPE_UNK120: + case ACHIEVEMENT_CRITERIA_TYPE_UNK121: + case ACHIEVEMENT_CRITERIA_TYPE_UNK122: + case ACHIEVEMENT_CRITERIA_TYPE_UNK123: + case ACHIEVEMENT_CRITERIA_TYPE_UNK137: + case ACHIEVEMENT_CRITERIA_TYPE_UNK138: + case ACHIEVEMENT_CRITERIA_TYPE_UNK139: + case ACHIEVEMENT_CRITERIA_TYPE_UNK140: + case ACHIEVEMENT_CRITERIA_TYPE_UNK141: + case ACHIEVEMENT_CRITERIA_TYPE_UNK142: + case ACHIEVEMENT_CRITERIA_TYPE_UNK143: + case ACHIEVEMENT_CRITERIA_TYPE_UNK144: + case ACHIEVEMENT_CRITERIA_TYPE_UNK145: + case ACHIEVEMENT_CRITERIA_TYPE_UNK146: + case ACHIEVEMENT_CRITERIA_TYPE_UNK147: + case ACHIEVEMENT_CRITERIA_TYPE_UNK148: + case ACHIEVEMENT_CRITERIA_TYPE_UNK149: + case ACHIEVEMENT_CRITERIA_TYPE_UNK150: break; // Not implemented yet :( } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 1a1cc217c28..bcedbd09901 100755 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -333,6 +333,8 @@ class AchievementGlobalMgr case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: // NYI case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND: // NYI return true; + default: + break; } return false; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index b8d4234b2a0..c4ea71f7c4e 100755 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -699,7 +699,7 @@ void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint *data << channelName; *data << uint64(target_guid); } - else if (type == CHAT_MSG_ADDON) + else if (type == uint8(CHAT_MSG_ADDON)) { ASSERT(addonPrefix); *data << addonPrefix; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d0c0a887ddb..1db057ce4a8 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1867,7 +1867,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* dataBuffer, B float y = fields[11].GetFloat(); float z = fields[12].GetFloat(); uint32 guildId = fields[13].GetUInt32(); - ObjectGuid guildGuid = MAKE_NEW_GUID(guildId, 0, guildId ? HIGHGUID_GUILD : 0); + ObjectGuid guildGuid = MAKE_NEW_GUID(guildId, 0, guildId ? uint32(HIGHGUID_GUILD) : 0); uint32 playerFlags = fields[14].GetUInt32(); uint32 atLoginFlags = fields[15].GetUInt16(); Tokens equipment(fields[19].GetString(), ' '); @@ -7394,7 +7394,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/) // if we change total, we must change week ASSERT(((newTotalCount-oldTotalCount) != 0) == ((newWeekCount-oldWeekCount) != 0)); - if (newTotalCount != oldTotalCount) + if (uint32(newTotalCount) != oldTotalCount) { if (itr->second.state != PLAYERCURRENCY_NEW) itr->second.state = PLAYERCURRENCY_CHANGED; @@ -17584,25 +17584,25 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) if (!itemId) { - sLog->outError(LOG_FILTER_GENERAL, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid id (item id: %u, entry: %u).", GetGUIDLow(), GetName(), itemId, itemEntry); + sLog->outError(LOG_FILTER_PLAYER, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid id (item id: " UI64FMTD ", entry: %u).", GetGUIDLow(), GetName(), itemId, itemEntry); continue; } if (!sObjectMgr->GetItemTemplate(itemEntry)) { - sLog->outError(LOG_FILTER_GENERAL, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid entry (item id: %u, entry: %u).", GetGUIDLow(), GetName(), itemId, itemEntry); + sLog->outError(LOG_FILTER_PLAYER, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid entry (item id: " UI64FMTD ", entry: %u).", GetGUIDLow(), GetName(), itemId, itemEntry); continue; } - if (slot < 0 || slot > VOID_STORAGE_MAX_SLOT) + if (slot >= VOID_STORAGE_MAX_SLOT) { - sLog->outError(LOG_FILTER_GENERAL, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid slot (item id: %u, entry: %u, slot: %u).", GetGUIDLow(), GetName(), itemId, itemEntry, slot); + sLog->outError(LOG_FILTER_PLAYER, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid slot (item id: " UI64FMTD ", entry: %u, slot: %u).", GetGUIDLow(), GetName(), itemId, itemEntry, slot); continue; } if (!sObjectMgr->GetPlayerByLowGUID(creatorGuid)) { - sLog->outError(LOG_FILTER_GENERAL, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid creator guid, set to 0 (item id: %u, entry: %u, creatorGuid: %u).", GetGUIDLow(), GetName(), itemId, itemEntry, creatorGuid); + sLog->outError(LOG_FILTER_PLAYER, "Player::_LoadVoidStorage - Player (GUID: %u, name: %s) has an item with an invalid creator guid, set to 0 (item id: " UI64FMTD ", entry: %u, creatorGuid: %u).", GetGUIDLow(), GetName(), itemId, itemEntry, creatorGuid); creatorGuid = 0; } @@ -25710,7 +25710,7 @@ uint8 Player::GetNextVoidStorageFreeSlot() const if (!_voidStorageItems[i]) // unused item return i; - return -1; + return VOID_STORAGE_MAX_SLOT; } uint8 Player::GetNumOfVoidStorageFreeSlots() const @@ -25726,9 +25726,9 @@ uint8 Player::GetNumOfVoidStorageFreeSlots() const uint8 Player::AddVoidStorageItem(const VoidStorageItem& item) { - uint8 slot = GetNextVoidStorageFreeSlot(); + int8 slot = GetNextVoidStorageFreeSlot(); - if (slot < 0 || slot > VOID_STORAGE_MAX_SLOT) + if (slot >= VOID_STORAGE_MAX_SLOT) { GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); return -1; @@ -25741,7 +25741,7 @@ uint8 Player::AddVoidStorageItem(const VoidStorageItem& item) void Player::AddVoidStorageItemAtSlot(uint8 slot, const VoidStorageItem& item) { - if (slot < 0 || slot > VOID_STORAGE_MAX_SLOT) + if (slot >= VOID_STORAGE_MAX_SLOT) { GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); return; @@ -25749,7 +25749,7 @@ void Player::AddVoidStorageItemAtSlot(uint8 slot, const VoidStorageItem& item) if (_voidStorageItems[slot]) { - sLog->outError(LOG_FILTER_GENERAL, "Player::AddVoidStorageItemAtSlot - Player (GUID: %u, name: %s) tried to add an item to an used slot (item id: %u, entry: %u, slot: %u).", GetGUIDLow(), GetName(), _voidStorageItems[slot]->ItemId, _voidStorageItems[slot]->ItemEntry, slot); + sLog->outError(LOG_FILTER_GENERAL, "Player::AddVoidStorageItemAtSlot - Player (GUID: %u, name: %s) tried to add an item to an used slot (item id: " UI64FMTD ", entry: %u, slot: %u).", GetGUIDLow(), GetName(), _voidStorageItems[slot]->ItemId, _voidStorageItems[slot]->ItemEntry, slot); GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); return; } @@ -25760,7 +25760,7 @@ void Player::AddVoidStorageItemAtSlot(uint8 slot, const VoidStorageItem& item) void Player::DeleteVoidStorageItem(uint8 slot) { - if (slot < 0 || slot > VOID_STORAGE_MAX_SLOT) + if (slot >= VOID_STORAGE_MAX_SLOT) { GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); return; @@ -25772,7 +25772,7 @@ void Player::DeleteVoidStorageItem(uint8 slot) bool Player::SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot) { - if (oldSlot < 0 || oldSlot > VOID_STORAGE_MAX_SLOT || newSlot < 0 || newSlot > VOID_STORAGE_MAX_SLOT || oldSlot == newSlot) + if (oldSlot >= VOID_STORAGE_MAX_SLOT || newSlot >= VOID_STORAGE_MAX_SLOT || oldSlot == newSlot) return false; std::swap(_voidStorageItems[newSlot], _voidStorageItems[oldSlot]); @@ -25781,7 +25781,7 @@ bool Player::SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot) VoidStorageItem* Player::GetVoidStorageItem(uint8 slot) const { - if (slot < 0 || slot > VOID_STORAGE_MAX_SLOT) + if (slot >= VOID_STORAGE_MAX_SLOT) { GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); return NULL; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index bffbfb665ef..beb02ede95c 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -599,6 +599,8 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam case BASE_ATTACK: RewardRage(rage, true); break; + default: + break; } } @@ -2142,7 +2144,7 @@ void Unit::SendMeleeAttackStop(Unit* victim) sLog->outInfo(LOG_FILTER_UNITS, "%s %u stopped attacking", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUIDLow()); } -bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType attackType) +bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType /*attackType*/) { // These spells can't be blocked if (spellProto && spellProto->Attributes & SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK) @@ -4978,7 +4980,7 @@ bool Unit::HandleSpellCritChanceAuraProc(Unit* victim, uint32 /*damage*/, AuraEf return true; } -bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown) +bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 /*procEx*/, uint32 cooldown) { // Get triggered aura spell info SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo(); @@ -5025,7 +5027,7 @@ bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* if (m_extraAttacks && triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) return false; - if (powerRequired == NULL || powerAmountRequired == NULL) + if (!powerRequired || !powerAmountRequired) { sLog->outError(LOG_FILTER_SPELLS_AURAS, "Unit::HandleAuraProcOnPowerAmount: Spell %u have 0 powerAmountRequired in EffectAmount[%d] or 0 powerRequired in EffectMiscValue, not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex()); return false; @@ -7028,7 +7030,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (dummySpell->SpellIconID == 3059) { // Lightning Shield - if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0x400, 0, 0)) + if (GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0x400, 0, 0)) { uint32 spell = 26364; @@ -7312,7 +7314,7 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit* victim, uint32 /*damage*/, Aura // Used in case when access to whole aura is needed // All procs should be handled like this... -bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 /*procFlag*/, uint32 procEx, uint32 cooldown, bool * handled) +bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 /*procFlag*/, uint32 /*procEx*/, uint32 cooldown, bool * handled) { SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo(); @@ -7864,7 +7866,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case SPELLFAMILY_DEATHKNIGHT: { // Item - Death Knight T10 Melee 4P Bonus - else if (auraSpellInfo->Id == 70656) + if (auraSpellInfo->Id == 70656) { if (GetTypeId() != TYPEID_PLAYER || getClass() != CLASS_DEATH_KNIGHT) return false; @@ -8207,7 +8209,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg return true; } -bool Unit::HandleOverrideClassScriptAuraProc(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 cooldown) +bool Unit::HandleOverrideClassScriptAuraProc(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const* /*procSpell*/, uint32 cooldown) { int32 scriptId = triggeredByAura->GetMiscValue(); @@ -10047,7 +10049,7 @@ uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage return crit_bonus; } -uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* spellProto, uint32 damage, Unit* victim) +uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* /*spellProto*/, uint32 damage, Unit* victim) { // Calculate critical bonus int32 crit_bonus = damage; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f8c139ddfed..a8319ee274f 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -231,9 +231,9 @@ bool SpellClickInfo::IsFitToRequirements(Unit const* clicker, Unit const* clicke } ObjectMgr::ObjectMgr(): _auctionId(1), _equipmentSetGuid(1), - _itemTextId(1), _mailId(1), _hiPetNumber(1), _hiCharGuid(1), + _itemTextId(1), _mailId(1), _hiPetNumber(1), _voidItemId(1), _hiCharGuid(1), _hiCreatureGuid(1), _hiPetGuid(1), _hiVehicleGuid(1), _hiItemGuid(1), - _hiGoGuid(1), _hiDoGuid(1), _hiCorpseGuid(1), _hiMoTransGuid(1), _voidItemId(1) + _hiGoGuid(1), _hiDoGuid(1), _hiCorpseGuid(1), _hiMoTransGuid(1) {} ObjectMgr::~ObjectMgr() @@ -8259,7 +8259,7 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount return false; } - if (vItems->GetItemCount() >= MAX_VENDOR_ITEMS) + if (vItems->GetItemCount() >= MAX_VENDOR_ITEMS) // FIXME: GetItemCount range 0...255 MAX_VENDOR_ITEMS = 300 { if (player) ChatHandler(player).SendSysMessage(LANG_COMMAND_ADDVENDORITEMITEMS); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index c589480a517..e843191832e 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1551,7 +1551,7 @@ void Guild::HandleInviteMember(WorldSession* session, const std::string& name) data << uint32(m_emblemInfo.GetBackgroundColor()); data << uint32(m_emblemInfo.GetColor()); - ObjectGuid oldGuildGuid = MAKE_NEW_GUID(pInvitee->GetGuildId(), 0, pInvitee->GetGuildId() ? HIGHGUID_GUILD : 0); + ObjectGuid oldGuildGuid = MAKE_NEW_GUID(pInvitee->GetGuildId(), 0, pInvitee->GetGuildId() ? uint32(HIGHGUID_GUILD) : 0); ObjectGuid newGuildGuid = GetGUID(); data.WriteBit(newGuildGuid[3]); @@ -1814,7 +1814,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount) if (!AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { sLog->outCommand(player->GetSession()->GetAccountId(), - "GM %s (Account: %u) deposit money (Amount: " UI64FMTD ") to guild bank (Guild ID %u)", + "GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)", player->GetName(), player->GetSession()->GetAccountId(), amount, m_id); } // Log guild bank event diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 837e074044a..28f15a7377d 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -575,6 +575,8 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) prefix = recvData.ReadString(prefixLen); break; } + default: + break; } // Logging enabled? diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 9ee962f4a3d..0722a9c1e00 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -324,7 +324,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (money > 0 && !AccountMgr::IsPlayerAccount(GetSecurity()) && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { - sLog->outCommand(GetAccountId(), "GM %s (Account: %u) mail money: %u to player: %s (Account: %u)", + sLog->outCommand(GetAccountId(), "GM %s (Account: %u) mail money: " UI64FMTD " to player: %s (Account: %u)", GetPlayerName(), GetAccountId(), money, receiver.c_str(), rc_account); } } @@ -519,7 +519,7 @@ void WorldSession::HandleMailTakeItem(WorldPacket& recvData) if (!sObjectMgr->GetPlayerNameByGUID(sender_guid, sender_name)) sender_name = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); } - sLog->outCommand(GetAccountId(), "GM %s (Account: %u) receive mail item: %s (Entry: %u Count: %u) and send COD money: %u to player: %s (Account: %u)", + sLog->outCommand(GetAccountId(), "GM %s (Account: %u) receive mail item: %s (Entry: %u Count: %u) and send COD money: " UI64FMTD " to player: %s (Account: %u)", GetPlayerName(), GetAccountId(), it->GetTemplate()->Name1.c_str(), it->GetEntry(), it->GetCount(), m->COD, sender_name.c_str(), sender_accId); } else if (!receive) diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index bc02822c09d..f2199e26055 100755 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -48,7 +48,7 @@ void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket) { if (TalentTabEntry const* talentTabEntry = sTalentTabStore.LookupEntry(_player->GetPrimaryTalentTree(_player->GetActiveSpec()))) { - if (talentTabEntry->tabpage != tabPage) + if (talentTabEntry->tabpage != uint32(tabPage)) { recvPacket.rfinish(); return; diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 13881d919f7..13cddaff7ea 100755 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -523,14 +523,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) { if (!AccountMgr::IsPlayerAccount(_player->GetSession()->GetSecurity()) && my_trade->GetMoney() > 0) { - sLog->outCommand(_player->GetSession()->GetAccountId(), "GM %s (Account: %u) give money (Amount: %u) to player: %s (Account: %u)", + sLog->outCommand(_player->GetSession()->GetAccountId(), "GM %s (Account: %u) give money (Amount: " UI64FMTD ") to player: %s (Account: %u)", _player->GetName(), _player->GetSession()->GetAccountId(), my_trade->GetMoney(), trader->GetName(), trader->GetSession()->GetAccountId()); } if (!AccountMgr::IsPlayerAccount(trader->GetSession()->GetSecurity()) && his_trade->GetMoney() > 0) { - sLog->outCommand(trader->GetSession()->GetAccountId(), "GM %s (Account: %u) give money (Amount: %u) to player: %s (Account: %u)", + sLog->outCommand(trader->GetSession()->GetAccountId(), "GM %s (Account: %u) give money (Amount: " UI64FMTD ") to player: %s (Account: %u)", trader->GetName(), trader->GetSession()->GetAccountId(), his_trade->GetMoney(), _player->GetName(), _player->GetSession()->GetAccountId()); diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index 0e40b0faf15..8171a30cc3a 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -332,7 +332,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) Item* item = player->GetItemByGuid(*itr); if (!item) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) wants to deposit an invalid item (item guid: %u).", player->GetGUIDLow(), player->GetName(), uint64(*itr)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) wants to deposit an invalid item (item guid: " UI64FMTD ").", player->GetGUIDLow(), player->GetName(), uint64(*itr)); continue; } @@ -357,7 +357,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) VoidStorageItem* itemVS = player->GetVoidStorageItem(*itr, slot); if (!itemVS) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) tried to withdraw an invalid item (id: %u)", player->GetGUIDLow(), player->GetName(), uint64(*itr)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) tried to withdraw an invalid item (id: " UI64FMTD ")", player->GetGUIDLow(), player->GetName(), uint64(*itr)); continue; } @@ -366,7 +366,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPacket& recvData) if (msg != EQUIP_ERR_OK) { SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) couldn't withdraw item id %u because inventory was full.", player->GetGUIDLow(), player->GetName(), uint64(*itr)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidStorageTransfer - Player (GUID: %u, name: %s) couldn't withdraw item id " UI64FMTD " because inventory was full.", player->GetGUIDLow(), player->GetName(), uint64(*itr)); return; } @@ -535,7 +535,7 @@ void WorldSession::HandleVoidSwapItem(WorldPacket& recvData) uint8 oldSlot; if (!player->GetVoidStorageItem(itemId, oldSlot)) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidSwapItem - Player (GUID: %u, name: %s) requested swapping an invalid item (slot: %u, itemid: %u).", player->GetGUIDLow(), player->GetName(), newSlot, uint64(itemId)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleVoidSwapItem - Player (GUID: %u, name: %s) requested swapping an invalid item (slot: %u, itemid: " UI64FMTD ").", player->GetGUIDLow(), player->GetName(), newSlot, uint64(itemId)); return; } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 38afbc28417..e65a116373d 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6613,7 +6613,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const } // don't regen when permanent aura target has full power - if (GetBase()->IsPermanent() && target->GetPower(powerType) == target->GetMaxPower(powerType)) + if (GetBase()->IsPermanent() && uint32(target->GetPower(powerType)) == target->GetMaxPower(powerType)) return; // ignore negative values (can be result apply spellmods to aura damage @@ -6644,7 +6644,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons } // don't regen when permanent aura target has full power - if (GetBase()->IsPermanent() && target->GetPower(powerType) == target->GetMaxPower(powerType)) + if (GetBase()->IsPermanent() && uint32(target->GetPower(powerType)) == target->GetMaxPower(powerType)) return; // ignore negative values (can be result apply spellmods to aura damage diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 771da8162f9..58326fcf384 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5874,7 +5874,7 @@ SpellCastResult Spell::CheckItems() } Powers power = Powers(m_spellInfo->Effects[i].MiscValue); - if (m_targets.GetUnitTarget()->GetPower(power) == m_targets.GetUnitTarget()->GetMaxPower(power)) + if (uint32(m_targets.GetUnitTarget()->GetPower(power)) == m_targets.GetUnitTarget()->GetMaxPower(power)) { failReason = SPELL_FAILED_ALREADY_AT_FULL_POWER; continue; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 0c748204ad2..02bcd91b5ad 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -769,7 +769,7 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_START_PLAYER_MONEY] = ConfigMgr::GetIntDefault("StartPlayerMoney", 0); if (int32(m_int_configs[CONFIG_START_PLAYER_MONEY]) < 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartPlayerMoney (%i) must be in range 0..%u. Set to %u.", m_int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, 0); + sLog->outError(LOG_FILTER_SERVER_LOADING, "StartPlayerMoney (%i) must be in range 0.." UI64FMTD ". Set to %u.", m_int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, 0); m_int_configs[CONFIG_START_PLAYER_MONEY] = 0; } else if (m_int_configs[CONFIG_START_PLAYER_MONEY] > 0x7FFFFFFF-1) // TODO: (See MAX_MONEY_AMOUNT) @@ -1256,7 +1256,7 @@ void World::SetInitialWorldSettings() //No SQL injection as values are treated as integers // not send custom type REALM_FFA_PVP to realm list - uint32 server_type = IsFFAPvPRealm() ? REALM_TYPE_PVP : getIntConfig(CONFIG_GAME_TYPE); + uint32 server_type = IsFFAPvPRealm() ? uint32(REALM_TYPE_PVP) : getIntConfig(CONFIG_GAME_TYPE); uint32 realm_zone = getIntConfig(CONFIG_REALM_ZONE); LoginDatabase.PExecute("UPDATE realmlist SET icon = %u, timezone = %u WHERE id = '%d'", server_type, realm_zone, realmID); // One-time query diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index c05613d387f..4e95b3e981b 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -112,7 +112,7 @@ class boss_moam : public CreatureScript events.Update(diff); - if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) + if (uint32(me->GetPower(POWER_MANA)) == me->GetMaxPower(POWER_MANA)) { if (_isStonePhase) DoAction(ACTION_STONE_PHASE_END); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 9017509781f..2a65c241168 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -406,7 +406,7 @@ class boss_deathbringer_saurfang : public CreatureScript case 72444: case 72445: case 72446: - if (me->GetPower(POWER_ENERGY) != me->GetMaxPower(POWER_ENERGY)) + if (uint32(me->GetPower(POWER_ENERGY)) != me->GetMaxPower(POWER_ENERGY)) target->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, me, true); break; default: @@ -1039,7 +1039,7 @@ class spell_deathbringer_blood_link_aura : public SpellScriptLoader void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); - if (GetUnitOwner()->getPowerType() == POWER_ENERGY && GetUnitOwner()->GetPower(POWER_ENERGY) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) + if (GetUnitOwner()->getPowerType() == POWER_ENERGY && uint32(GetUnitOwner()->GetPower(POWER_ENERGY)) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) if (Creature* saurfang = GetUnitOwner()->ToCreature()) saurfang->AI()->DoAction(ACTION_MARK_OF_THE_FALLEN_CHAMPION); } @@ -1131,7 +1131,7 @@ class spell_deathbringer_rune_of_blood : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - if (GetCaster()->GetPower(POWER_ENERGY) != GetCaster()->GetMaxPower(POWER_ENERGY)) + if (uint32(GetCaster()->GetPower(POWER_ENERGY)) != GetCaster()->GetMaxPower(POWER_ENERGY)) GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, GetCaster(), true); } @@ -1166,7 +1166,7 @@ class spell_deathbringer_blood_nova : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - if (GetCaster()->GetPower(POWER_ENERGY) != GetCaster()->GetMaxPower(POWER_ENERGY)) + if (uint32(GetCaster()->GetPower(POWER_ENERGY)) != GetCaster()->GetMaxPower(POWER_ENERGY)) GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 2, GetCaster(), true); } -- cgit v1.2.3 From 9749fe55f823503cb7ca8511a67deeddc247a414 Mon Sep 17 00:00:00 2001 From: Spp Date: Fri, 17 Aug 2012 14:30:10 +0200 Subject: Better way to fix some of the warnings of the previous commit --- src/server/game/Entities/Pet/Pet.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 4 ++-- src/server/game/Entities/Unit/Unit.cpp | 12 ++++++------ src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 ++-- src/server/game/Spells/Spell.cpp | 2 +- src/server/game/World/World.cpp | 2 +- src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp | 2 +- .../Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp | 8 ++++---- 9 files changed, 19 insertions(+), 19 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 8392fbb9e49..71a68fdba3c 100755 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -253,7 +253,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c else { SetHealth(savedhealth > GetMaxHealth() ? GetMaxHealth() : savedhealth); - SetPower(POWER_MANA, savedmana > GetMaxPower(POWER_MANA) ? GetMaxPower(POWER_MANA) : savedmana); + SetPower(POWER_MANA, savedmana > uint32(GetMaxPower(POWER_MANA)) ? GetMaxPower(POWER_MANA) : savedmana); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1db057ce4a8..e8333f8e2c2 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2384,7 +2384,7 @@ void Player::ProcessDelayedOperations() else SetFullHealth(); - if (GetMaxPower(POWER_MANA) > m_resurrectMana) + if (uint32(GetMaxPower(POWER_MANA)) > m_resurrectMana) SetPower(POWER_MANA, m_resurrectMana); else SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); @@ -23174,7 +23174,7 @@ void Player::ResurectUsingRequestData() else SetFullHealth(); - if (GetMaxPower(POWER_MANA) > m_resurrectMana) + if (uint32(GetMaxPower(POWER_MANA)) > m_resurrectMana) SetPower(POWER_MANA, m_resurrectMana); else SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index beb02ede95c..25cac647666 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5701,7 +5701,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere return false; // mana reward - basepoints0 = CalculatePctN(int32(GetMaxPower(POWER_MANA)), triggerAmount); + basepoints0 = CalculatePctN(GetMaxPower(POWER_MANA), triggerAmount); target = this; triggered_spell_id = 29442; break; @@ -11440,7 +11440,7 @@ int32 Unit::ModifyPower(Powers power, int32 dVal) if (dVal == 0) return 0; - int32 curPower = (int32)GetPower(power); + int32 curPower = GetPower(power); int32 val = dVal + curPower; if (val <= GetMinPower(power)) @@ -11449,7 +11449,7 @@ int32 Unit::ModifyPower(Powers power, int32 dVal) return -curPower; } - int32 maxPower = (int32)GetMaxPower(power); + int32 maxPower = GetMaxPower(power); if (val < maxPower) { @@ -11471,7 +11471,7 @@ int32 Unit::ModifyPowerPct(Powers power, float pct, bool apply) float amount = (float)GetMaxPower(power); ApplyPercentModFloatVar(amount, pct, apply); - return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power)); + return ModifyPower(power, (int32)amount - GetMaxPower(power)); } bool Unit::IsAlwaysVisibleFor(WorldObject const* seer) const @@ -13007,13 +13007,13 @@ int32 Unit::GetPower(Powers power) const return GetUInt32Value(UNIT_FIELD_POWER1 + powerIndex); } -uint32 Unit::GetMaxPower(Powers power) const +int32 Unit::GetMaxPower(Powers power) const { uint32 powerIndex = GetPowerIndexByClass(power, getClass()); if (powerIndex == MAX_POWERS) return 0; - return GetUInt32Value(UNIT_FIELD_MAXPOWER1 + powerIndex); + return GetInt32Value(UNIT_FIELD_MAXPOWER1 + powerIndex); } void Unit::SetPower(Powers power, int32 val) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index cafbfaac5b1..74212e0f309 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1345,7 +1345,7 @@ class Unit : public WorldObject void setPowerType(Powers power); int32 GetPower(Powers power) const; int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; } - uint32 GetMaxPower(Powers power) const; + int32 GetMaxPower(Powers power) const; void SetPower(Powers power, int32 val); void SetMaxPower(Powers power, int32 val); // returns the change in power diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e65a116373d..38afbc28417 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6613,7 +6613,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const } // don't regen when permanent aura target has full power - if (GetBase()->IsPermanent() && uint32(target->GetPower(powerType)) == target->GetMaxPower(powerType)) + if (GetBase()->IsPermanent() && target->GetPower(powerType) == target->GetMaxPower(powerType)) return; // ignore negative values (can be result apply spellmods to aura damage @@ -6644,7 +6644,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons } // don't regen when permanent aura target has full power - if (GetBase()->IsPermanent() && uint32(target->GetPower(powerType)) == target->GetMaxPower(powerType)) + if (GetBase()->IsPermanent() && target->GetPower(powerType) == target->GetMaxPower(powerType)) return; // ignore negative values (can be result apply spellmods to aura damage diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 58326fcf384..771da8162f9 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5874,7 +5874,7 @@ SpellCastResult Spell::CheckItems() } Powers power = Powers(m_spellInfo->Effects[i].MiscValue); - if (uint32(m_targets.GetUnitTarget()->GetPower(power)) == m_targets.GetUnitTarget()->GetMaxPower(power)) + if (m_targets.GetUnitTarget()->GetPower(power) == m_targets.GetUnitTarget()->GetMaxPower(power)) { failReason = SPELL_FAILED_ALREADY_AT_FULL_POWER; continue; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 02bcd91b5ad..05a67a2090e 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -770,7 +770,7 @@ void World::LoadConfigSettings(bool reload) if (int32(m_int_configs[CONFIG_START_PLAYER_MONEY]) < 0) { sLog->outError(LOG_FILTER_SERVER_LOADING, "StartPlayerMoney (%i) must be in range 0.." UI64FMTD ". Set to %u.", m_int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, 0); - m_int_configs[CONFIG_START_PLAYER_MONEY] = 0; + m_int_configs[CONFIG_START_PLAYER_MONEY] = 0; } else if (m_int_configs[CONFIG_START_PLAYER_MONEY] > 0x7FFFFFFF-1) // TODO: (See MAX_MONEY_AMOUNT) { diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index 4e95b3e981b..c05613d387f 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -112,7 +112,7 @@ class boss_moam : public CreatureScript events.Update(diff); - if (uint32(me->GetPower(POWER_MANA)) == me->GetMaxPower(POWER_MANA)) + if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) { if (_isStonePhase) DoAction(ACTION_STONE_PHASE_END); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 2a65c241168..9017509781f 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -406,7 +406,7 @@ class boss_deathbringer_saurfang : public CreatureScript case 72444: case 72445: case 72446: - if (uint32(me->GetPower(POWER_ENERGY)) != me->GetMaxPower(POWER_ENERGY)) + if (me->GetPower(POWER_ENERGY) != me->GetMaxPower(POWER_ENERGY)) target->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, me, true); break; default: @@ -1039,7 +1039,7 @@ class spell_deathbringer_blood_link_aura : public SpellScriptLoader void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); - if (GetUnitOwner()->getPowerType() == POWER_ENERGY && uint32(GetUnitOwner()->GetPower(POWER_ENERGY)) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) + if (GetUnitOwner()->getPowerType() == POWER_ENERGY && GetUnitOwner()->GetPower(POWER_ENERGY) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) if (Creature* saurfang = GetUnitOwner()->ToCreature()) saurfang->AI()->DoAction(ACTION_MARK_OF_THE_FALLEN_CHAMPION); } @@ -1131,7 +1131,7 @@ class spell_deathbringer_rune_of_blood : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - if (uint32(GetCaster()->GetPower(POWER_ENERGY)) != GetCaster()->GetMaxPower(POWER_ENERGY)) + if (GetCaster()->GetPower(POWER_ENERGY) != GetCaster()->GetMaxPower(POWER_ENERGY)) GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, GetCaster(), true); } @@ -1166,7 +1166,7 @@ class spell_deathbringer_blood_nova : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - if (uint32(GetCaster()->GetPower(POWER_ENERGY)) != GetCaster()->GetMaxPower(POWER_ENERGY)) + if (GetCaster()->GetPower(POWER_ENERGY) != GetCaster()->GetMaxPower(POWER_ENERGY)) GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 2, GetCaster(), true); } -- cgit v1.2.3 From c43bba98a3f674d81887ea9751c233e98c58326d Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 18 Aug 2012 17:56:09 +0100 Subject: Core: Fix build and cleanup whitespace and double semicolon --- src/server/game/Entities/Player/Player.cpp | 16 +++++++++++----- src/server/game/Entities/Unit/StatSystem.cpp | 14 +++++++------- src/server/game/Entities/Unit/Unit.cpp | 10 +++++----- src/server/game/Groups/Group.cpp | 2 +- src/server/game/Spells/Auras/SpellAuraDefines.h | 2 +- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 2 +- .../Ulduar/Ulduar/boss_algalon_the_observer.cpp | 2 +- src/server/scripts/Spells/spell_pet.cpp | 2 +- 8 files changed, 28 insertions(+), 22 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 62d5af6a598..40f124812b8 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21113,18 +21113,21 @@ bool Player::BuyCurrencyFromVendorSlot(uint64 vendorGuid, uint32 vendorSlot, uin for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) { + if (!iece->RequiredCurrency[i]) + continue; + CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(iece->RequiredCurrency[i]); if (!entry) { - SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, currency, 0); + SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, currency, 0); // Find correct error return false; } uint32 precision = (entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1; - if (iece->RequiredCurrency[i] && HasCurrency(iece->RequiredCurrency[i], (iece->RequiredCurrencyCount[i] * count) / precision)) + if (HasCurrency(iece->RequiredCurrency[i], (iece->RequiredCurrencyCount[i] * count) / precision)) { - SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, NULL, NULL); // error not verified for currencies + SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, NULL, NULL); // Find correct error return false; } } @@ -21233,16 +21236,19 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) { + if (!iece->RequiredCurrency[i]) + continue; + CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(iece->RequiredCurrency[i]); if (!entry) { - SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, currency, 0); + SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0); return false; } uint32 precision = (entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1; - if (iece->RequiredCurrency[i] && HasCurrency(iece->RequiredCurrency[i], (iece->RequiredCurrencyCount[i] * count) / precision)) + if (HasCurrency(iece->RequiredCurrency[i], (iece->RequiredCurrencyCount[i] * count) / precision)) { SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, NULL, NULL); // error not verified for currencies return false; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index f89a0a6b2fe..aa14d11d2f3 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -227,11 +227,11 @@ float Player::GetHealthBonusFromStamina() { // Taken from PaperDollFrame.lua - 4.3.4.15595 gtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.LookupEntry((getClass() - 1) * GT_MAX_LEVEL + getLevel() - 1); - + float stamina = GetStat(STAT_STAMINA); - float baseStam = std::min(20, stamina); + float baseStam = std::min(20.0f, stamina); float moreStam = stamina - baseStam; - + return baseStam + moreStam * hpBase->ratio; } @@ -240,7 +240,7 @@ float Player::GetManaBonusFromIntellect() // Taken from PaperDollFrame.lua - 4.3.4.15595 float intellect = GetStat(STAT_INTELLECT); - float baseInt = std::min(20, intellect); + float baseInt = std::min(20.0f, intellect); float moreInt = intellect - baseInt; return baseInt + (moreInt * 15.0f); @@ -303,12 +303,12 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) { float strengthValue = std::max((GetStat(STAT_STRENGTH) - 10.0f) * entry->APPerStrenth, 0.0f); float agilityValue = std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerAgility, 0.0f); - + SpellShapeshiftFormEntry const* form = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm()); // Directly taken from client, SHAPESHIFT_FLAG_AP_FROM_STRENGTH ? if (form && form->flags1 & 0x20) - agilityValue += std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerStrenth, 0.0f);; - + agilityValue += std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerStrenth, 0.0f); + val2 = strengthValue + agilityValue; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 3b94508b643..fff1722e9b2 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7219,7 +7219,7 @@ bool Unit::HandleObsModEnergyAuraProc(Unit* victim, uint32 /*damage*/, AuraEffec /* switch (dummySpell->SpellFamilyName) { - + } */ // processed charge only counting case @@ -7262,10 +7262,10 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit* victim, uint32 /*damage*/, Aura /* switch (dummySpell->SpellFamilyName) { - + } */ - + // processed charge only counting case if (!triggered_spell_id) return true; @@ -9431,7 +9431,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin // Add SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC percent bonus AddPctN(DoneTotalMod, GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC, spellProto->Mechanic)); - + // done scripted mod (take it from owner) Unit* owner = GetOwner() ? GetOwner() : this; AuraEffectList const& mOverrideClassScript= owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); @@ -10555,7 +10555,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType // Add SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC percent bonus if (spellProto) AddPctN(DoneTotalMod, GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC, spellProto->Mechanic)); - + // done scripted mod (take it from owner) Unit* owner = GetOwner() ? GetOwner() : this; // AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index a6b63ac37da..120de2199c2 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -279,7 +279,7 @@ void Group::ConvertToGroup() if (m_subGroupsCounts) { delete[] m_subGroupsCounts; - m_subGroupsCounts = NULL;; + m_subGroupsCounts = NULL; } if (!isBGGroup()) diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 7cf22d196cc..bbe0435946b 100755 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -296,7 +296,7 @@ enum AuraType SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK = 234, SPELL_AURA_MOD_DISPEL_RESIST = 235, SPELL_AURA_CONTROL_VEHICLE = 236, - SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER = 237, + SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER = 237, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER = 238, SPELL_AURA_MOD_SCALE_2 = 239, SPELL_AURA_MOD_EXPERTISE = 240, diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 8dd4f7dad3e..db9bc3581ea 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -139,7 +139,7 @@ public: { m_uiImpaleTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS); m_uiStaggeringStompTimer = 15*IN_MILLISECONDS; - m_uiSummonTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);; + m_uiSummonTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS); if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL || GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 7ee67060f97..9a3c8985371 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -373,7 +373,7 @@ class boss_algalon_the_observer : public CreatureScript case ACTION_INIT_ALGALON: _firstPull = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - break;; + break; } } diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp index 4928ec40abd..8dff17b1c30 100644 --- a/src/server/scripts/Spells/spell_pet.cpp +++ b/src/server/scripts/Spells/spell_pet.cpp @@ -1688,7 +1688,7 @@ public: if (pet->isGuardian()) ((Guardian*)pet)->SetBonusDamage(owner->GetTotalAttackPowerValue(BASE_ATTACK)); - amount += owner->CalculateDamage(BASE_ATTACK, true, true);; + amount += owner->CalculateDamage(BASE_ATTACK, true, true); } } -- cgit v1.2.3 From 1be45d1a0a759dbdb817ff3812015ecc1ea916ca Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sat, 18 Aug 2012 22:16:41 +0200 Subject: Scripts/Zul Gurub: cleanup for cata --- src/server/game/Scripting/ScriptLoader.cpp | 41 +- src/server/scripts/EasternKingdoms/CMakeLists.txt | 18 +- .../EasternKingdoms/ZulGurub/boss_arlokk.cpp | 293 ---------- .../EasternKingdoms/ZulGurub/boss_gahzranka.cpp | 99 ---- .../EasternKingdoms/ZulGurub/boss_grilek.cpp | 74 ++- .../EasternKingdoms/ZulGurub/boss_hakkar.cpp | 259 --------- .../EasternKingdoms/ZulGurub/boss_hazzarah.cpp | 87 ++- .../EasternKingdoms/ZulGurub/boss_jeklik.cpp | 306 ----------- .../EasternKingdoms/ZulGurub/boss_jindo.cpp | 283 ---------- .../ZulGurub/boss_jindo_the_godbreaker.cpp | 91 ++++ .../EasternKingdoms/ZulGurub/boss_kilnara.cpp | 92 ++++ .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 307 +---------- .../EasternKingdoms/ZulGurub/boss_marli.cpp | 275 ---------- .../EasternKingdoms/ZulGurub/boss_renataki.cpp | 134 ++--- .../EasternKingdoms/ZulGurub/boss_thekal.cpp | 588 --------------------- .../EasternKingdoms/ZulGurub/boss_venoxis.cpp | 205 +------ .../EasternKingdoms/ZulGurub/boss_wushoolay.cpp | 72 ++- .../EasternKingdoms/ZulGurub/boss_zanzil.cpp | 91 ++++ .../EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 239 +++++---- .../scripts/EasternKingdoms/ZulGurub/zulgurub.h | 51 +- 20 files changed, 644 insertions(+), 2961 deletions(-) delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp create mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp create mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp create mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp (limited to 'src/server/scripts') diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 2db840bf39a..47e09222211 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -227,21 +227,16 @@ void AddSC_boss_nalorakk(); void AddSC_boss_zuljin(); void AddSC_instance_zulaman(); void AddSC_zulaman(); -void AddSC_boss_jeklik(); //Zul'Gurub -void AddSC_boss_venoxis(); -void AddSC_boss_marli(); -void AddSC_boss_mandokir(); -void AddSC_boss_gahzranka(); -void AddSC_boss_thekal(); -void AddSC_boss_arlokk(); -void AddSC_boss_jindo(); -void AddSC_boss_hakkar(); -void AddSC_boss_grilek(); +void AddSC_boss_grilek(); // Zul'Gurub void AddSC_boss_hazzarah(); +void AddSC_boss_jindo_the_godbreaker(); +void AddSC_boss_kilnara(); +void AddSC_boss_mandokir(); void AddSC_boss_renataki(); +void AddSC_boss_venoxis(); void AddSC_boss_wushoolay(); +void AddSC_boss_zanzil(); void AddSC_instance_zulgurub(); - //void AddSC_alterac_mountains(); void AddSC_arathi_highlands(); void AddSC_blasted_lands(); @@ -846,20 +841,16 @@ void AddEasternKingdomsScripts() AddSC_boss_zuljin(); AddSC_instance_zulaman(); AddSC_zulaman(); - AddSC_boss_jeklik(); //Zul'Gurub - AddSC_boss_venoxis(); - AddSC_boss_marli(); - AddSC_boss_mandokir(); - AddSC_boss_gahzranka(); - AddSC_boss_thekal(); - AddSC_boss_arlokk(); - AddSC_boss_jindo(); - AddSC_boss_hakkar(); - AddSC_boss_grilek(); - AddSC_boss_hazzarah(); - AddSC_boss_renataki(); - AddSC_boss_wushoolay(); - AddSC_instance_zulgurub(); + AddSC_boss_grilek(); // Zul'Gurub + AddSC_boss_hazzarah(); + AddSC_boss_jindo_the_godbreaker(); + AddSC_boss_kilnara(); + AddSC_boss_mandokir(); + AddSC_boss_renataki(); + AddSC_boss_venoxis(); + AddSC_boss_wushoolay(); + AddSC_boss_zanzil(); + AddSC_instance_zulgurub(); //AddSC_alterac_mountains(); AddSC_arathi_highlands(); diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index de3e6ae32a6..3db2545e2c1 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -32,21 +32,17 @@ set(scripts_STAT_SRCS EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp EasternKingdoms/isle_of_queldanas.cpp - EasternKingdoms/ZulGurub/boss_hakkar.cpp - EasternKingdoms/ZulGurub/boss_mandokir.cpp - EasternKingdoms/ZulGurub/boss_marli.cpp - EasternKingdoms/ZulGurub/boss_hazzarah.cpp - EasternKingdoms/ZulGurub/boss_jeklik.cpp EasternKingdoms/ZulGurub/boss_grilek.cpp - EasternKingdoms/ZulGurub/zulgurub.h + EasternKingdoms/ZulGurub/boss_hazzarah.cpp + EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp + EasternKingdoms/ZulGurub/boss_kilnara.cpp + EasternKingdoms/ZulGurub/boss_mandokir.cpp EasternKingdoms/ZulGurub/boss_renataki.cpp - EasternKingdoms/ZulGurub/boss_arlokk.cpp - EasternKingdoms/ZulGurub/boss_gahzranka.cpp EasternKingdoms/ZulGurub/boss_venoxis.cpp - EasternKingdoms/ZulGurub/instance_zulgurub.cpp - EasternKingdoms/ZulGurub/boss_jindo.cpp EasternKingdoms/ZulGurub/boss_wushoolay.cpp - EasternKingdoms/ZulGurub/boss_thekal.cpp + EasternKingdoms/ZulGurub/boss_zanzil.cpp + EasternKingdoms/ZulGurub/instance_zulgurub.cpp + EasternKingdoms/ZulGurub/zulgurub.h EasternKingdoms/wetlands.cpp EasternKingdoms/arathi_highlands.cpp EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp deleted file mode 100644 index 17c3f5e8ff4..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Arlokk -SD%Complete: 95 -SDComment: Wrong cleave and red aura is missing. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum eYells -{ - SAY_AGGRO = -1309011, - SAY_FEAST_PANTHER = -1309012, - SAY_DEATH = -1309013, -}; - -enum eSpells -{ - SPELL_SHADOWWORDPAIN = 23952, - SPELL_GOUGE = 24698, - SPELL_MARK = 24210, - SPELL_CLEAVE = 26350, //Perhaps not right. Not a red aura... - SPELL_PANTHER_TRANSFORM = 24190, - - MODEL_ID_NORMAL = 15218, - MODEL_ID_PANTHER = 15215, - MODEL_ID_BLANK = 11686, - - NPC_ZULIAN_PROWLER = 15101 -}; - -class boss_arlokk : public CreatureScript -{ - public: - - boss_arlokk() - : CreatureScript("boss_arlokk") - { - } - - struct boss_arlokkAI : public ScriptedAI - { - boss_arlokkAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 m_uiShadowWordPain_Timer; - uint32 m_uiGouge_Timer; - uint32 m_uiMark_Timer; - uint32 m_uiCleave_Timer; - uint32 m_uiVanish_Timer; - uint32 m_uiVisible_Timer; - - uint32 m_uiSummon_Timer; - uint32 m_uiSummonCount; - - Unit* m_pMarkedTarget; - uint64 MarkedTargetGUID; - - bool m_bIsPhaseTwo; - bool m_bIsVanished; - - void Reset() - { - m_uiShadowWordPain_Timer = 8000; - m_uiGouge_Timer = 14000; - m_uiMark_Timer = 35000; - m_uiCleave_Timer = 4000; - m_uiVanish_Timer = 60000; - m_uiVisible_Timer = 6000; - - m_uiSummon_Timer = 5000; - m_uiSummonCount = 0; - - m_bIsPhaseTwo = false; - m_bIsVanished = false; - - MarkedTargetGUID = 0; - - me->SetDisplayId(MODEL_ID_NORMAL); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) - { - DoScriptText(SAY_AGGRO, me); - } - - void JustReachedHome() - { - if (instance) - instance->SetData(DATA_ARLOKK, NOT_STARTED); - - //we should be summoned, so despawn - me->DespawnOrUnsummon(); - } - - void JustDied(Unit* /*killer*/) - { - DoScriptText(SAY_DEATH, me); - - me->SetDisplayId(MODEL_ID_NORMAL); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - if (instance) - instance->SetData(DATA_ARLOKK, DONE); - } - - void DoSummonPhanters() - { - if (Unit* pMarkedTarget = Unit::GetUnit(*me, MarkedTargetGUID)) - DoScriptText(SAY_FEAST_PANTHER, me, pMarkedTarget); - - me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998f, -1649.6734f, 41.4800f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970f, -1606.4840f, 41.2979f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - } - - void JustSummoned(Creature* summoned) - { - if (Unit* pMarkedTarget = Unit::GetUnit(*me, MarkedTargetGUID)) - summoned->AI()->AttackStart(pMarkedTarget); - - ++m_uiSummonCount; - } - - void UpdateAI(const uint32 uiDiff) - { - if (!UpdateVictim()) - return; - - if (!m_bIsPhaseTwo) - { - if (m_uiShadowWordPain_Timer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN); - m_uiShadowWordPain_Timer = 15000; - } - else - m_uiShadowWordPain_Timer -= uiDiff; - - if (m_uiMark_Timer <= uiDiff) - { - Unit* pMarkedTarget = SelectTarget(SELECT_TARGET_RANDOM, 0); - - if (pMarkedTarget) - { - DoCast(pMarkedTarget, SPELL_MARK); - MarkedTargetGUID = pMarkedTarget->GetGUID(); - } - else - sLog->outError(LOG_FILTER_TSCR, "boss_arlokk could not accuire pMarkedTarget."); - - m_uiMark_Timer = 15000; - } - else - m_uiMark_Timer -= uiDiff; - } - else - { - //Cleave_Timer - if (m_uiCleave_Timer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_CLEAVE); - m_uiCleave_Timer = 16000; - } - else - m_uiCleave_Timer -= uiDiff; - - //Gouge_Timer - if (m_uiGouge_Timer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_GOUGE); - - DoModifyThreatPercent(me->getVictim(), -80); - - m_uiGouge_Timer = 17000+rand()%10000; - } - else - m_uiGouge_Timer -= uiDiff; - } - - if (m_uiSummonCount <= 30) - { - if (m_uiSummon_Timer <= uiDiff) - { - DoSummonPhanters(); - m_uiSummon_Timer = 5000; - } - else - m_uiSummon_Timer -= uiDiff; - } - - if (m_uiVanish_Timer <= uiDiff) - { - //Invisble Model - me->SetDisplayId(MODEL_ID_BLANK); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - me->AttackStop(); - DoResetThreat(); - - m_bIsVanished = true; - - m_uiVanish_Timer = 45000; - m_uiVisible_Timer = 6000; - } - else - m_uiVanish_Timer -= uiDiff; - - if (m_bIsVanished) - { - if (m_uiVisible_Timer <= uiDiff) - { - //The Panther Model - me->SetDisplayId(MODEL_ID_PANTHER); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); - me->UpdateDamagePhysical(BASE_ATTACK); - - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - - m_bIsPhaseTwo = true; - m_bIsVanished = false; - } - else - m_uiVisible_Timer -= uiDiff; - } - else - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_arlokkAI(creature); - } -}; - -class go_gong_of_bethekk : public GameObjectScript -{ - public: - go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") - { - } - - bool OnGossipHello(Player* /*player*/, GameObject* go) - { - if (InstanceScript* instance = go->GetInstanceScript()) - { - if (instance->GetData(DATA_ARLOKK) == DONE || instance->GetData(DATA_ARLOKK) == IN_PROGRESS) - return true; - - instance->SetData(DATA_ARLOKK, IN_PROGRESS); - return true; - } - - return true; - } -}; - -void AddSC_boss_arlokk() -{ - new boss_arlokk(); - new go_gong_of_bethekk(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp deleted file mode 100644 index 5e553c7396f..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Gahz'ranka -SD%Complete: 85 -SDComment: Massive Geyser with knockback not working. Spell buggy. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" - -#define SPELL_FROSTBREATH 16099 -#define SPELL_MASSIVEGEYSER 22421 //Not working. Cause its a summon... -#define SPELL_SLAM 24326 - -class boss_gahzranka : public CreatureScript -{ - public: - boss_gahzranka() : CreatureScript("boss_gahzranka") { } - - struct boss_gahzrankaAI : public ScriptedAI - { - boss_gahzrankaAI(Creature* creature) : ScriptedAI(creature) { } - uint32 Frostbreath_Timer; - uint32 MassiveGeyser_Timer; - uint32 Slam_Timer; - - void Reset() - { - Frostbreath_Timer = 8000; - MassiveGeyser_Timer = 25000; - Slam_Timer = 17000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //Frostbreath_Timer - if (Frostbreath_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_FROSTBREATH); - Frostbreath_Timer = urand(7000, 11000); - } else Frostbreath_Timer -= diff; - - //MassiveGeyser_Timer - if (MassiveGeyser_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MASSIVEGEYSER); - DoResetThreat(); - - MassiveGeyser_Timer = urand(22000, 32000); - } else MassiveGeyser_Timer -= diff; - - //Slam_Timer - if (Slam_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SLAM); - Slam_Timer = urand(12000, 20000); - } else Slam_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_gahzrankaAI(creature); - } -}; - -void AddSC_boss_gahzranka() -{ - new boss_gahzranka(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index 8c71ea6d48d..f015f08f082 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,71 +15,65 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Grilek -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "zulgurub.h" -#define SPELL_AVARTAR 24646 //The Enrage Spell -#define SPELL_GROUNDTREMOR 6524 +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +}; class boss_grilek : public CreatureScript { public: boss_grilek() : CreatureScript("boss_grilek") { } - struct boss_grilekAI : public ScriptedAI + struct boss_grilekAI : public BossAI { - boss_grilekAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 Avartar_Timer; - uint32 GroundTremor_Timer; + boss_grilekAI(Creature* creature) : BossAI(creature, DATA_GRILEK) + { + } void Reset() { - Avartar_Timer = urand(15000, 25000); - GroundTremor_Timer = urand(8000, 16000); } void EnterCombat(Unit* /*who*/) { } - void UpdateAI(const uint32 diff) + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) { - //Return since we have no target if (!UpdateVictim()) return; - //Avartar_Timer - if (Avartar_Timer <= diff) - { - - DoCast(me, SPELL_AVARTAR); - Unit* target = NULL; + events.Update(diff); - target = SelectTarget(SELECT_TARGET_RANDOM, 1); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -50); - if (target) - AttackStart(target); - - Avartar_Timer = urand(25000, 35000); - } else Avartar_Timer -= diff; - - //GroundTremor_Timer - if (GroundTremor_Timer <= diff) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) { - DoCast(me->getVictim(), SPELL_GROUNDTREMOR); - GroundTremor_Timer = urand(12000, 16000); - } else GroundTremor_Timer -= diff; + switch (eventId) + { + default: + break; + } + } + */ DoMeleeAttackIfReady(); } @@ -96,4 +89,3 @@ void AddSC_boss_grilek() { new boss_grilek(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp deleted file mode 100644 index 6cb657f4cff..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Hakkar -SD%Complete: 95 -SDComment: Blood siphon spell buggy cause of Core Issue. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -#define SAY_AGGRO -1309020 -#define SAY_FLEEING -1309021 -#define SAY_MINION_DESTROY -1309022 //where does it belong? -#define SAY_PROTECT_ALTAR -1309023 //where does it belong? - -#define SPELL_BLOODSIPHON 24322 -#define SPELL_CORRUPTEDBLOOD 24328 -#define SPELL_CAUSEINSANITY 24327 //Not working disabled. -#define SPELL_WILLOFHAKKAR 24178 -#define SPELL_ENRAGE 24318 - -// The Aspects of all High Priests -#define SPELL_ASPECT_OF_JEKLIK 24687 -#define SPELL_ASPECT_OF_VENOXIS 24688 -#define SPELL_ASPECT_OF_MARLI 24686 -#define SPELL_ASPECT_OF_THEKAL 24689 -#define SPELL_ASPECT_OF_ARLOKK 24690 - -class boss_hakkar : public CreatureScript -{ - public: - - boss_hakkar() - : CreatureScript("boss_hakkar") - { - } - - struct boss_hakkarAI : public ScriptedAI - { - boss_hakkarAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 BloodSiphon_Timer; - uint32 CorruptedBlood_Timer; - uint32 CauseInsanity_Timer; - uint32 WillOfHakkar_Timer; - uint32 Enrage_Timer; - - uint32 CheckJeklik_Timer; - uint32 CheckVenoxis_Timer; - uint32 CheckMarli_Timer; - uint32 CheckThekal_Timer; - uint32 CheckArlokk_Timer; - - uint32 AspectOfJeklik_Timer; - uint32 AspectOfVenoxis_Timer; - uint32 AspectOfMarli_Timer; - uint32 AspectOfThekal_Timer; - uint32 AspectOfArlokk_Timer; - - bool Enraged; - - void Reset() - { - BloodSiphon_Timer = 90000; - CorruptedBlood_Timer = 25000; - CauseInsanity_Timer = 17000; - WillOfHakkar_Timer = 17000; - Enrage_Timer = 600000; - - CheckJeklik_Timer = 1000; - CheckVenoxis_Timer = 2000; - CheckMarli_Timer = 3000; - CheckThekal_Timer = 4000; - CheckArlokk_Timer = 5000; - - AspectOfJeklik_Timer = 4000; - AspectOfVenoxis_Timer = 7000; - AspectOfMarli_Timer = 12000; - AspectOfThekal_Timer = 8000; - AspectOfArlokk_Timer = 18000; - - Enraged = false; - } - - void EnterCombat(Unit* /*who*/) - { - DoScriptText(SAY_AGGRO, me); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - //BloodSiphon_Timer - if (BloodSiphon_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_BLOODSIPHON); - BloodSiphon_Timer = 90000; - } else BloodSiphon_Timer -= diff; - - //CorruptedBlood_Timer - if (CorruptedBlood_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_CORRUPTEDBLOOD); - CorruptedBlood_Timer = urand(30000, 45000); - } else CorruptedBlood_Timer -= diff; - - //CauseInsanity_Timer - /*if (CauseInsanity_Timer <= diff) - { - if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_CAUSEINSANITY); - - CauseInsanity_Timer = urand(35000, 43000); - } else CauseInsanity_Timer -= diff;*/ - - //WillOfHakkar_Timer - if (WillOfHakkar_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_WILLOFHAKKAR); - - WillOfHakkar_Timer = urand(25000, 35000); - } else WillOfHakkar_Timer -= diff; - - if (!Enraged && Enrage_Timer <= diff) - { - DoCast(me, SPELL_ENRAGE); - Enraged = true; - } else Enrage_Timer -= diff; - - //Checking if Jeklik is dead. If not we cast her Aspect - if (CheckJeklik_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_JEKLIK) != DONE) - { - if (AspectOfJeklik_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_JEKLIK); - AspectOfJeklik_Timer = urand(10000, 14000); - } else AspectOfJeklik_Timer -= diff; - } - } - CheckJeklik_Timer = 1000; - } else CheckJeklik_Timer -= diff; - - //Checking if Venoxis is dead. If not we cast his Aspect - if (CheckVenoxis_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_VENOXIS) != DONE) - { - if (AspectOfVenoxis_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_VENOXIS); - AspectOfVenoxis_Timer = 8000; - } else AspectOfVenoxis_Timer -= diff; - } - } - CheckVenoxis_Timer = 1000; - } else CheckVenoxis_Timer -= diff; - - //Checking if Marli is dead. If not we cast her Aspect - if (CheckMarli_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_MARLI) != DONE) - { - if (AspectOfMarli_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); - AspectOfMarli_Timer = 10000; - } else AspectOfMarli_Timer -= diff; - - } - } - CheckMarli_Timer = 1000; - } else CheckMarli_Timer -= diff; - - //Checking if Thekal is dead. If not we cast his Aspect - if (CheckThekal_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_THEKAL) != DONE) - { - if (AspectOfThekal_Timer <= diff) - { - DoCast(me, SPELL_ASPECT_OF_THEKAL); - AspectOfThekal_Timer = 15000; - } else AspectOfThekal_Timer -= diff; - } - } - CheckThekal_Timer = 1000; - } else CheckThekal_Timer -= diff; - - //Checking if Arlokk is dead. If yes we cast her Aspect - if (CheckArlokk_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_ARLOKK) != DONE) - { - if (AspectOfArlokk_Timer <= diff) - { - DoCast(me, SPELL_ASPECT_OF_ARLOKK); - DoResetThreat(); - - AspectOfArlokk_Timer = urand(10000, 15000); - } else AspectOfArlokk_Timer -= diff; - } - } - CheckArlokk_Timer = 1000; - } else CheckArlokk_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_hakkarAI(creature); - } -}; - -void AddSC_boss_hakkar() -{ - new boss_hakkar(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index bb3e0b14e0e..12bc4289a7d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,86 +15,65 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Hazzarah -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "zulgurub.h" -#define SPELL_MANABURN 26046 -#define SPELL_SLEEP 24664 +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +}; class boss_hazzarah : public CreatureScript { public: + boss_hazzarah() : CreatureScript("boss_hazzarah") { } - boss_hazzarah() - : CreatureScript("boss_hazzarah") - { - } - - struct boss_hazzarahAI : public ScriptedAI + struct boss_hazzarahAI : public BossAI { - boss_hazzarahAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 ManaBurn_Timer; - uint32 Sleep_Timer; - uint32 Illusions_Timer; + boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH) + { + } void Reset() { - ManaBurn_Timer = urand(4000, 10000); - Sleep_Timer = urand(10000, 18000); - Illusions_Timer = urand(10000, 18000); } void EnterCombat(Unit* /*who*/) { } - void UpdateAI(const uint32 diff) + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; - //ManaBurn_Timer - if (ManaBurn_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MANABURN); - ManaBurn_Timer = urand(8000, 16000); - } else ManaBurn_Timer -= diff; - - //Sleep_Timer - if (Sleep_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SLEEP); - Sleep_Timer = urand(12000, 20000); - } else Sleep_Timer -= diff; + events.Update(diff); - //Illusions_Timer - if (Illusions_Timer <= diff) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) { - //We will summon 3 illusions that will spawn on a random gamer and attack this gamer - //We will just use one model for the beginning - Unit* target = NULL; - for (uint8 i = 0; i < 3; ++i) + switch (eventId) { - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* Illusion = me->SummonCreature(15163, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if (Illusion) - Illusion->AI()->AttackStart(target); + default: + break; } - - Illusions_Timer = urand(15000, 25000); - } else Illusions_Timer -= diff; + } + */ DoMeleeAttackIfReady(); } @@ -111,4 +89,3 @@ void AddSC_boss_hazzarah() { new boss_hazzarah(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp deleted file mode 100644 index 156ccab5eae..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Jeklik -SD%Complete: 85 -SDComment: Problem in finding the right flying batriders for spawning and making them fly. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -#define SAY_AGGRO -1309002 -#define SAY_RAIN_FIRE -1309003 -#define SAY_DEATH -1309004 - -#define SPELL_CHARGE 22911 -#define SPELL_SONICBURST 23918 -#define SPELL_SCREECH 6605 -#define SPELL_SHADOW_WORD_PAIN 23952 -#define SPELL_MIND_FLAY 23953 -#define SPELL_CHAIN_MIND_FLAY 26044 //Right ID unknown. So disabled -#define SPELL_GREATERHEAL 23954 -#define SPELL_BAT_FORM 23966 - -// Batriders Spell - -#define SPELL_BOMB 40332 //Wrong ID but Magmadars bomb is not working... - -class boss_jeklik : public CreatureScript -{ - public: - - boss_jeklik() - : CreatureScript("boss_jeklik") - { - } - - struct boss_jeklikAI : public ScriptedAI - { - boss_jeklikAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 Charge_Timer; - uint32 SonicBurst_Timer; - uint32 Screech_Timer; - uint32 SpawnBats_Timer; - uint32 ShadowWordPain_Timer; - uint32 MindFlay_Timer; - uint32 ChainMindFlay_Timer; - uint32 GreaterHeal_Timer; - uint32 SpawnFlyingBats_Timer; - - bool PhaseTwo; - - void Reset() - { - Charge_Timer = 20000; - SonicBurst_Timer = 8000; - Screech_Timer = 13000; - SpawnBats_Timer = 60000; - ShadowWordPain_Timer = 6000; - MindFlay_Timer = 11000; - ChainMindFlay_Timer = 26000; - GreaterHeal_Timer = 50000; - SpawnFlyingBats_Timer = 10000; - - PhaseTwo = false; - } - - void EnterCombat(Unit* /*who*/) - { - DoScriptText(SAY_AGGRO, me); - DoCast(me, SPELL_BAT_FORM); - } - - void JustDied(Unit* /*killer*/) - { - DoScriptText(SAY_DEATH, me); - - if (instance) - instance->SetData(DATA_JEKLIK, DONE); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->getVictim() && me->isAlive()) - { - if (HealthAbovePct(50)) - { - if (Charge_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_CHARGE); - AttackStart(target); - } - - Charge_Timer = urand(15000, 30000); - } else Charge_Timer -= diff; - - if (SonicBurst_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SONICBURST); - SonicBurst_Timer = urand(8000, 13000); - } else SonicBurst_Timer -= diff; - - if (Screech_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SCREECH); - Screech_Timer = urand(18000, 26000); - } else Screech_Timer -= diff; - - if (SpawnBats_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - - Creature* Bat = NULL; - Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - SpawnBats_Timer = 60000; - } else SpawnBats_Timer -= diff; - } - else - { - if (PhaseTwo) - { - if (PhaseTwo && ShadowWordPain_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_SHADOW_WORD_PAIN); - ShadowWordPain_Timer = urand(12000, 18000); - } - }ShadowWordPain_Timer -=diff; - - if (MindFlay_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MIND_FLAY); - MindFlay_Timer = 16000; - }MindFlay_Timer -=diff; - - if (ChainMindFlay_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - DoCast(me->getVictim(), SPELL_CHAIN_MIND_FLAY); - ChainMindFlay_Timer = urand(15000, 30000); - }ChainMindFlay_Timer -=diff; - - if (GreaterHeal_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_GREATERHEAL); - GreaterHeal_Timer = urand(25000, 35000); - }GreaterHeal_Timer -=diff; - - if (SpawnFlyingBats_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (FlyingBat) - FlyingBat->AI()->AttackStart(target); - - SpawnFlyingBats_Timer = urand(10000, 15000); - } else SpawnFlyingBats_Timer -=diff; - } - else - { - me->SetDisplayId(15219); - DoResetThreat(); - PhaseTwo = true; - } - } - - DoMeleeAttackIfReady(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_jeklikAI(creature); - } -}; - -//Flying Bat -class mob_batrider : public CreatureScript -{ - public: - - mob_batrider() - : CreatureScript("mob_batrider") - { - } - - struct mob_batriderAI : public ScriptedAI - { - mob_batriderAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 Bomb_Timer; - uint32 Check_Timer; - - void Reset() - { - Bomb_Timer = 2000; - Check_Timer = 1000; - - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) {} - - void UpdateAI (const uint32 diff) - { - if (!UpdateVictim()) - return; - - //Bomb_Timer - if (Bomb_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_BOMB); - Bomb_Timer = 5000; - } - } else Bomb_Timer -= diff; - - //Check_Timer - if (Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_JEKLIK) == DONE) - { - me->setDeathState(JUST_DIED); - me->RemoveCorpse(); - return; - } - } - - Check_Timer = 1000; - } else Check_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_batriderAI(creature); - } -}; - -void AddSC_boss_jeklik() -{ - new boss_jeklik(); - new mob_batrider(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp deleted file mode 100644 index f8d23947e9c..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Jin'do the Hexxer -SD%Complete: 85 -SDComment: Mind Control not working because of core bug. Shades visible for all. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -#define SAY_AGGRO -1309014 - -#define SPELL_BRAINWASHTOTEM 24262 -#define SPELL_POWERFULLHEALINGWARD 24309 //We will not use this spell. We will summon a totem by script cause the spell totems will not cast. -#define SPELL_HEX 24053 -#define SPELL_DELUSIONSOFJINDO 24306 -#define SPELL_SHADEOFJINDO 24308 //We will not use this spell. We will summon a shade by script. - -//Healing Ward Spell -#define SPELL_HEAL 38588 //Totems are not working right. Right heal spell ID is 24311 but this spell is not casting... - -//Shade of Jindo Spell -#define SPELL_SHADOWSHOCK 19460 -#define SPELL_INVISIBLE 24699 - -class boss_jindo : public CreatureScript -{ - public: - - boss_jindo() - : CreatureScript("boss_jindo") - { - } - - struct boss_jindoAI : public ScriptedAI - { - boss_jindoAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 BrainWashTotem_Timer; - uint32 HealingWard_Timer; - uint32 Hex_Timer; - uint32 Delusions_Timer; - uint32 Teleport_Timer; - - void Reset() - { - BrainWashTotem_Timer = 20000; - HealingWard_Timer = 16000; - Hex_Timer = 8000; - Delusions_Timer = 10000; - Teleport_Timer = 5000; - } - - void EnterCombat(Unit* /*who*/) - { - DoScriptText(SAY_AGGRO, me); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - //BrainWashTotem_Timer - if (BrainWashTotem_Timer <= diff) - { - DoCast(me, SPELL_BRAINWASHTOTEM); - BrainWashTotem_Timer = urand(18000, 26000); - } else BrainWashTotem_Timer -= diff; - - //HealingWard_Timer - if (HealingWard_Timer <= diff) - { - //DoCast(me, SPELL_POWERFULLHEALINGWARD); - me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); - HealingWard_Timer = urand(14000, 20000); - } else HealingWard_Timer -= diff; - - //Hex_Timer - if (Hex_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_HEX); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -80); - - Hex_Timer = urand(12000, 20000); - } else Hex_Timer -= diff; - - //Casting the delusion curse with a shade. So shade will attack the same target with the curse. - if (Delusions_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_DELUSIONSOFJINDO); - - Creature* Shade = me->SummonCreature(14986, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Shade) - Shade->AI()->AttackStart(target); - } - - Delusions_Timer = urand(4000, 12000); - } else Delusions_Timer -= diff; - - //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer - if (Teleport_Timer <= diff) - { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target && target->GetTypeId() == TYPEID_PLAYER) - { - DoTeleportPlayer(target, -11583.7783f, -1249.4278f, 77.5471f, 4.745f); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(target, -100); - - Creature* Skeletons; - Skeletons = me->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - } - - Teleport_Timer = urand(15000, 23000); - } else Teleport_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_jindoAI(creature); - } -}; - -//Healing Ward -class mob_healing_ward : public CreatureScript -{ - public: - - mob_healing_ward() - : CreatureScript("mob_healing_ward") - { - } - - struct mob_healing_wardAI : public ScriptedAI - { - mob_healing_wardAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 Heal_Timer; - - InstanceScript* instance; - - void Reset() - { - Heal_Timer = 2000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - //Heal_Timer - if (Heal_Timer <= diff) - { - if (instance) - { - Unit* pJindo = Unit::GetUnit(*me, instance->GetData64(DATA_JINDO)); - if (pJindo) - DoCast(pJindo, SPELL_HEAL); - } - Heal_Timer = 3000; - } else Heal_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_healing_wardAI(creature); - } -}; - -//Shade of Jindo -class mob_shade_of_jindo : public CreatureScript -{ - public: - - mob_shade_of_jindo() - : CreatureScript("mob_shade_of_jindo") - { - } - - struct mob_shade_of_jindoAI : public ScriptedAI - { - mob_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 ShadowShock_Timer; - - void Reset() - { - ShadowShock_Timer = 1000; - DoCast(me, SPELL_INVISIBLE, true); - } - - void EnterCombat(Unit* /*who*/){} - - void UpdateAI (const uint32 diff) - { - - //ShadowShock_Timer - if (ShadowShock_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SHADOWSHOCK); - ShadowShock_Timer = 2000; - } else ShadowShock_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_shade_of_jindoAI(creature); - } -}; - -void AddSC_boss_jindo() -{ - new boss_jindo(); - new mob_healing_ward(); - new mob_shade_of_jindo(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp new file mode 100644 index 00000000000..204db428bf0 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "zulgurub.h" + +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +}; + +class boss_jindo_the_godbreaker : public CreatureScript +{ + public: + boss_jindo_the_godbreaker() : CreatureScript("boss_jindo_the_godbreaker") { } + + struct boss_jindo_the_godbreakerAI : public BossAI + { + boss_jindo_the_godbreakerAI(Creature* creature) : BossAI(creature, DATA_JINDO) + { + } + + void Reset() + { + } + + void EnterCombat(Unit* /*who*/) + { + } + + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + default: + break; + } + } + */ + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_jindo_the_godbreakerAI(creature); + } +}; + +void AddSC_boss_jindo_the_godbreaker() +{ + new boss_jindo_the_godbreaker(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp new file mode 100644 index 00000000000..17c73ae96bd --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "Spell.h" +#include "zulgurub.h" + +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +}; + +class boss_kilnara : public CreatureScript +{ + public: + boss_kilnara() : CreatureScript("boss_kilnara") { } + + struct boss_kilnaraAI : public BossAI + { + boss_kilnaraAI(Creature* creature) : BossAI(creature, DATA_KILNARA) + { + } + + void Reset() + { + } + + void EnterCombat(Unit* /*who*/) + { + } + + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + default: + break; + } + } + */ + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_kilnaraAI(creature); + } +}; + +void AddSC_boss_kilnara() +{ + new boss_kilnara(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 83cd0b46fb8..108d2118a25 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -16,318 +16,67 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Mandokir -SD%Complete: 90 -SDComment: Ohgan function needs improvements. -SDCategory: Zul'Gurub -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "zulgurub.h" -#define SAY_AGGRO -1309015 -#define SAY_DING_KILL -1309016 -#define SAY_GRATS_JINDO -1309017 -#define SAY_WATCH -1309018 -#define SAY_WATCH_WHISPER -1309019 //is this text for real? easter egg? +enum Yells +{ +}; -#define SPELL_CHARGE 24408 -#define SPELL_CLEAVE 7160 -#define SPELL_FEAR 29321 -#define SPELL_WHIRLWIND 15589 -#define SPELL_MORTAL_STRIKE 16856 -#define SPELL_ENRAGE 24318 -#define SPELL_WATCH 24314 -#define SPELL_LEVEL_UP 24312 +enum Spells +{ +}; -//Ohgans Spells -#define SPELL_SUNDERARMOR 24317 +enum Events +{ +}; class boss_mandokir : public CreatureScript { public: - boss_mandokir() - : CreatureScript("boss_mandokir") - { - } + boss_mandokir() : CreatureScript("boss_mandokir") { } - struct boss_mandokirAI : public ScriptedAI + struct boss_mandokirAI : public BossAI { - boss_mandokirAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 KillCount; - uint32 Watch_Timer; - uint32 TargetInRange; - uint32 Cleave_Timer; - uint32 Whirlwind_Timer; - uint32 Fear_Timer; - uint32 MortalStrike_Timer; - uint32 Check_Timer; - float targetX; - float targetY; - float targetZ; - - InstanceScript* instance; - - bool endWatch; - bool someWatched; - bool RaptorDead; - bool CombatStart; - - uint64 WatchTarget; + boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { } void Reset() { - KillCount = 0; - Watch_Timer = 33000; - Cleave_Timer = 7000; - Whirlwind_Timer = 20000; - Fear_Timer = 1000; - MortalStrike_Timer = 1000; - Check_Timer = 1000; - - targetX = 0.0f; - targetY = 0.0f; - targetZ = 0.0f; - TargetInRange = 0; - - WatchTarget = 0; - - someWatched = false; - endWatch = false; - RaptorDead = false; - CombatStart = false; - - DoCast(me, 23243); } void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER) - { - ++KillCount; - - if (KillCount == 3) - { - DoScriptText(SAY_DING_KILL, me); - - if (instance) - { - uint64 JindoGUID = instance->GetData64(DATA_JINDO); - if (JindoGUID) - { - if (Unit* jTemp = Unit::GetUnit(*me, JindoGUID)) - { - if (jTemp->isAlive()) - DoScriptText(SAY_GRATS_JINDO, jTemp); - } - } - } - DoCast(me, SPELL_LEVEL_UP, true); - KillCount = 0; - } - } } void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); } - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->getVictim() && me->isAlive()) - { - if (!CombatStart) - { - //At combat Start Mandokir is mounted so we must unmount it first - me->Dismount(); - - //And summon his raptor - me->SummonCreature(14988, me->getVictim()->GetPositionX(), me->getVictim()->GetPositionY(), me->getVictim()->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000); - CombatStart = true; - } - - if (Watch_Timer <= diff) //Every 20 Sec Mandokir will check this - { - if (WatchTarget) //If someone is watched and If the Position of the watched target is different from the one stored, or are attacking, mandokir will charge him - { - Unit* unit = Unit::GetUnit(*me, WatchTarget); - - if (unit && ( - targetX != unit->GetPositionX() || - targetY != unit->GetPositionY() || - targetZ != unit->GetPositionZ() || - unit->isInCombat())) - { - if (me->IsWithinMeleeRange(unit)) - { - DoCast(unit, 24316); - } - else - { - DoCast(unit, SPELL_CHARGE); - //me->SendMonsterMove(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), 0, true, 1); - AttackStart(unit); - } - } - } - someWatched = false; - Watch_Timer = 20000; - } else Watch_Timer -= diff; - - if ((Watch_Timer < 8000) && !someWatched) //8 sec(cast time + expire time) before the check for the watch effect mandokir will cast watch debuff on a random target - { - if (Unit* p = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoScriptText(SAY_WATCH, me, p); - DoCast(p, SPELL_WATCH); - WatchTarget = p->GetGUID(); - someWatched = true; - endWatch = true; - } - } - - if ((Watch_Timer < 1000) && endWatch) //1 sec before the debuf expire, store the target position - { - Unit* unit = Unit::GetUnit(*me, WatchTarget); - if (unit) - { - targetX = unit->GetPositionX(); - targetY = unit->GetPositionY(); - targetZ = unit->GetPositionZ(); - } - endWatch = false; - } - - if (!someWatched) - { - //Cleave - if (Cleave_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_CLEAVE); - Cleave_Timer = 7000; - } else Cleave_Timer -= diff; - - //Whirlwind - if (Whirlwind_Timer <= diff) - { - DoCast(me, SPELL_WHIRLWIND); - Whirlwind_Timer = 18000; - } else Whirlwind_Timer -= diff; - - //If more then 3 targets in melee range mandokir will cast fear - if (Fear_Timer <= diff) - { - TargetInRange = 0; - - std::list::const_iterator i = me->getThreatManager().getThreatList().begin(); - for (; i != me->getThreatManager().getThreatList().end(); ++i) - { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); - if (unit && me->IsWithinMeleeRange(unit)) - ++TargetInRange; - } - - if (TargetInRange > 3) - DoCast(me->getVictim(), SPELL_FEAR); - - Fear_Timer = 4000; - } else Fear_Timer -=diff; - - //Mortal Strike if target below 50% hp - if (me->getVictim() && me->getVictim()->HealthBelowPct(50)) - { - if (MortalStrike_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MORTAL_STRIKE); - MortalStrike_Timer = 15000; - } else MortalStrike_Timer -= diff; - } - } - //Checking if Ohgan is dead. If yes Mandokir will enrage. - if (Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_OHGAN) == DONE) - { - if (!RaptorDead) - { - DoCast(me, SPELL_ENRAGE); - RaptorDead = true; - } - } - } - - Check_Timer = 1000; - } else Check_Timer -= diff; - - DoMeleeAttackIfReady(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_mandokirAI(creature); - } -}; - -//Ohgan -class mob_ohgan : public CreatureScript -{ - public: - - mob_ohgan() - : CreatureScript("mob_ohgan") - { - } - - struct mob_ohganAI : public ScriptedAI - { - mob_ohganAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 SunderArmor_Timer; - InstanceScript* instance; - - void Reset() - { - SunderArmor_Timer = 5000; - } - - void EnterCombat(Unit* /*who*/) {} - void JustDied(Unit* /*killer*/) { - if (instance) - instance->SetData(DATA_OHGAN, DONE); } - void UpdateAI (const uint32 diff) + void UpdateAI(uint32 const diff) { - //Return since we have no target if (!UpdateVictim()) return; - //SunderArmor_Timer - if (SunderArmor_Timer <= diff) + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) { - DoCast(me->getVictim(), SPELL_SUNDERARMOR); - SunderArmor_Timer = urand(10000, 15000); - } else SunderArmor_Timer -= diff; + switch (eventId) + { + default: + break; + } + } + */ DoMeleeAttackIfReady(); } @@ -335,13 +84,11 @@ class mob_ohgan : public CreatureScript CreatureAI* GetAI(Creature* creature) const { - return new mob_ohganAI(creature); + return new boss_mandokirAI(creature); } }; void AddSC_boss_mandokir() { new boss_mandokir(); - new mob_ohgan(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp deleted file mode 100644 index 8e0deda1d0b..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Marli -SD%Complete: 80 -SDComment: Charging healers and casters not working. Perhaps wrong Spell Timers. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -#define SAY_AGGRO -1309005 -#define SAY_TRANSFORM -1309006 -#define SAY_SPIDER_SPAWN -1309007 -#define SAY_DEATH -1309008 - -#define SPELL_CHARGE 22911 -#define SPELL_ASPECT_OF_MARLI 24686 // A stun spell -#define SPELL_ENVOLWINGWEB 24110 -#define SPELL_POISONVOLLEY 24099 -#define SPELL_SPIDER_FORM 24084 - -//The Spider Spells -#define SPELL_LEVELUP 24312 //Not right Spell. - -class boss_marli : public CreatureScript -{ - public: - - boss_marli() - : CreatureScript("boss_marli") - { - } - - struct boss_marliAI : public ScriptedAI - { - boss_marliAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 SpawnStartSpiders_Timer; - uint32 PoisonVolley_Timer; - uint32 SpawnSpider_Timer; - uint32 Charge_Timer; - uint32 Aspect_Timer; - uint32 Transform_Timer; - uint32 TransformBack_Timer; - - bool Spawned; - bool PhaseTwo; - - void Reset() - { - SpawnStartSpiders_Timer = 1000; - PoisonVolley_Timer = 15000; - SpawnSpider_Timer = 30000; - Charge_Timer = 1500; - Aspect_Timer = 12000; - Transform_Timer = 45000; - TransformBack_Timer = 25000; - - Spawned = false; - PhaseTwo = false; - } - - void EnterCombat(Unit* /*who*/) - { - DoScriptText(SAY_AGGRO, me); - } - - void JustDied(Unit* /*killer*/) - { - DoScriptText(SAY_DEATH, me); - if (instance) - instance->SetData(DATA_MARLI, DONE); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->getVictim() && me->isAlive()) - { - if (PoisonVolley_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_POISONVOLLEY); - PoisonVolley_Timer = urand(10000, 20000); - } else PoisonVolley_Timer -= diff; - - if (!PhaseTwo && Aspect_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); - Aspect_Timer = urand(13000, 18000); - } else Aspect_Timer -= diff; - - if (!Spawned && SpawnStartSpiders_Timer <= diff) - { - DoScriptText(SAY_SPIDER_SPAWN, me); - - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* Spider = NULL; - - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - - Spawned = true; - } else SpawnStartSpiders_Timer -= diff; - - if (SpawnSpider_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - SpawnSpider_Timer = urand(12000, 17000); - } else SpawnSpider_Timer -= diff; - - if (!PhaseTwo && Transform_Timer <= diff) - { - DoScriptText(SAY_TRANSFORM, me); - DoCast(me, SPELL_SPIDER_FORM); - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); - me->UpdateDamagePhysical(BASE_ATTACK); - DoCast(me->getVictim(), SPELL_ENVOLWINGWEB); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -100); - - PhaseTwo = true; - Transform_Timer = urand(35000, 60000); - } else Transform_Timer -= diff; - - if (PhaseTwo) - { - if (Charge_Timer <= diff) - { - Unit* target = NULL; - int i = 0; - while (i < 3) // max 3 tries to get a random target with power_mana - { - ++i; - target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); // not aggro leader - if (target && target->getPowerType() == POWER_MANA) - i = 3; - } - if (target) - { - DoCast(target, SPELL_CHARGE); - //me->SetPosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0); - //me->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true, 1); - AttackStart(target); - } - - Charge_Timer = 8000; - } else Charge_Timer -= diff; - - if (TransformBack_Timer <= diff) - { - me->SetDisplayId(15220); - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); - me->UpdateDamagePhysical(BASE_ATTACK); - - PhaseTwo = false; - TransformBack_Timer = urand(25000, 40000); - } else TransformBack_Timer -= diff; - - } - - DoMeleeAttackIfReady(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_marliAI(creature); - } -}; - -//Spawn of Marli -class mob_spawn_of_marli : public CreatureScript -{ - public: - - mob_spawn_of_marli() - : CreatureScript("mob_spawn_of_marli") - { - } - - struct mob_spawn_of_marliAI : public ScriptedAI - { - mob_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 LevelUp_Timer; - - void Reset() - { - LevelUp_Timer = 3000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //LevelUp_Timer - if (LevelUp_Timer <= diff) - { - DoCast(me, SPELL_LEVELUP); - LevelUp_Timer = 3000; - } else LevelUp_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_spawn_of_marliAI(creature); - } -}; - -void AddSC_boss_marli() -{ - new boss_marli(); - new mob_spawn_of_marli(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index 32a8f209917..4b4cfa1bd45 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,135 +15,65 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Renataki -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "zulgurub.h" -#define SPELL_AMBUSH 24337 -#define SPELL_THOUSANDBLADES 24649 +enum Yells +{ +}; -#define EQUIP_ID_MAIN_HAND 0 //was item display id 31818, but this id does not exist +enum Spells +{ +}; + +enum Events +{ +}; class boss_renataki : public CreatureScript { public: + boss_renataki() : CreatureScript("boss_renataki") { } - boss_renataki() - : CreatureScript("boss_renataki") - { - } - - struct boss_renatakiAI : public ScriptedAI + struct boss_renatakiAI : public BossAI { - boss_renatakiAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 Invisible_Timer; - uint32 Ambush_Timer; - uint32 Visible_Timer; - uint32 Aggro_Timer; - uint32 ThousandBlades_Timer; - - bool Invisible; - bool Ambushed; + boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_RENATAKI) + { + } void Reset() { - Invisible_Timer = urand(8000, 18000); - Ambush_Timer = 3000; - Visible_Timer = 4000; - Aggro_Timer = urand(15000, 25000); - ThousandBlades_Timer = urand(4000, 8000); - - Invisible = false; - Ambushed = false; } void EnterCombat(Unit* /*who*/) { } - void UpdateAI(const uint32 diff) + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; - //Invisible_Timer - if (Invisible_Timer <= diff) - { - me->InterruptSpell(CURRENT_GENERIC_SPELL); - - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->SetDisplayId(11686); + events.Update(diff); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Invisible = true; - - Invisible_Timer = urand(15000, 30000); - } else Invisible_Timer -= diff; - - if (Invisible) - { - if (Ambush_Timer <= diff) - { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - { - DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); - DoCast(target, SPELL_AMBUSH); - } - - Ambushed = true; - Ambush_Timer = 3000; - } else Ambush_Timer -= diff; - } - - if (Ambushed) - { - if (Visible_Timer <= diff) - { - me->InterruptSpell(CURRENT_GENERIC_SPELL); - - me->SetDisplayId(15268); - SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Invisible = false; - - Visible_Timer = 4000; - } else Visible_Timer -= diff; - } - - //Resetting some aggro so he attacks other gamers - if (!Invisible) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) { - if (Aggro_Timer <= diff) - { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 1); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -50); - - if (target) - AttackStart(target); - - Aggro_Timer = urand(7000, 20000); - } else Aggro_Timer -= diff; - - if (ThousandBlades_Timer <= diff) + switch (eventId) { - DoCast(me->getVictim(), SPELL_THOUSANDBLADES); - ThousandBlades_Timer = urand(7000, 12000); - } else ThousandBlades_Timer -= diff; + default: + break; + } } + */ DoMeleeAttackIfReady(); } @@ -160,4 +89,3 @@ void AddSC_boss_renataki() { new boss_renataki(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp deleted file mode 100644 index 29495f77f2a..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ /dev/null @@ -1,588 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Thekal -SD%Complete: 95 -SDComment: Almost finished. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -#define SAY_AGGRO -1309009 -#define SAY_DEATH -1309010 - -enum eSpells -{ - SPELL_MORTALCLEAVE = 22859, - SPELL_SILENCE = 22666, - SPELL_FRENZY = 8269, - SPELL_FORCEPUNCH = 24189, - SPELL_CHARGE = 24193, - SPELL_ENRAGE = 8269, - SPELL_SUMMONTIGERS = 24183, - SPELL_TIGER_FORM = 24169, - SPELL_RESURRECT = 24173, //We will not use this spell. - -//Zealot Lor'Khan Spells - SPELL_SHIELD = 20545, - SPELL_BLOODLUST = 24185, - SPELL_GREATERHEAL = 24208, - SPELL_DISARM = 6713, - -//Zealot Zath Spells - SPELL_SWEEPINGSTRIKES = 18765, - SPELL_SINISTERSTRIKE = 15581, - SPELL_GOUGE = 12540, - SPELL_KICK = 15614, - SPELL_BLIND = 21060, -}; - -class boss_thekal : public CreatureScript -{ - public: - - boss_thekal() - : CreatureScript("boss_thekal") - { - } - - struct boss_thekalAI : public ScriptedAI - { - boss_thekalAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 MortalCleave_Timer; - uint32 Silence_Timer; - uint32 Frenzy_Timer; - uint32 ForcePunch_Timer; - uint32 Charge_Timer; - uint32 Enrage_Timer; - uint32 SummonTigers_Timer; - uint32 Check_Timer; - uint32 Resurrect_Timer; - - InstanceScript* instance; - bool Enraged; - bool PhaseTwo; - bool WasDead; - - void Reset() - { - MortalCleave_Timer = 4000; - Silence_Timer = 9000; - Frenzy_Timer = 30000; - ForcePunch_Timer = 4000; - Charge_Timer = 12000; - Enrage_Timer = 32000; - SummonTigers_Timer = 25000; - Check_Timer = 10000; - Resurrect_Timer = 10000; - - Enraged = false; - PhaseTwo = false; - WasDead = false; - } - - void EnterCombat(Unit* /*who*/) - { - DoScriptText(SAY_AGGRO, me); - } - - void JustDied(Unit* /*killer*/) - { - DoScriptText(SAY_DEATH, me); - if (instance) - instance->SetData(DATA_THEKAL, DONE); - } - - void JustReachedHome() - { - if (instance) - instance->SetData(DATA_THEKAL, NOT_STARTED); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - //Check_Timer for the death of LorKhan and Zath. - if (!WasDead && Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_LORKHAN) == SPECIAL) - { - //Resurrect LorKhan - if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) - { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->setFaction(14); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->SetFullHealth(); - - instance->SetData(DATA_LORKHAN, DONE); - } - } - - if (instance->GetData(DATA_ZATH) == SPECIAL) - { - //Resurrect Zath - Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); - if (pZath) - { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->setFaction(14); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->SetFullHealth(); - - instance->SetData(DATA_ZATH, DONE); - } - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!PhaseTwo && MortalCleave_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MORTALCLEAVE); - MortalCleave_Timer = urand(15000, 20000); - } else MortalCleave_Timer -= diff; - - if (!PhaseTwo && Silence_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SILENCE); - Silence_Timer = urand(20000, 25000); - } else Silence_Timer -= diff; - - if (!PhaseTwo && !WasDead && !HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->AttackStop(); - - if (instance) - instance->SetData(DATA_THEKAL, SPECIAL); - - WasDead=true; - } - - //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. - if (!PhaseTwo && WasDead) - { - if (Resurrect_Timer <= diff) - { - DoCast(me, SPELL_TIGER_FORM); - me->SetObjectScale(2.00f); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFullHealth(); - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40))); - me->UpdateDamagePhysical(BASE_ATTACK); - DoResetThreat(); - PhaseTwo = true; - } else Resurrect_Timer -= diff; - } - - if (me->IsFullHealth() && WasDead) - { - WasDead = false; - } - - if (PhaseTwo) - { - if (Charge_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_CHARGE); - DoResetThreat(); - AttackStart(target); - } - - Charge_Timer = urand(15000, 22000); - } else Charge_Timer -= diff; - - if (Frenzy_Timer <= diff) - { - DoCast(me, SPELL_FRENZY); - Frenzy_Timer = 30000; - } else Frenzy_Timer -= diff; - - if (ForcePunch_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SILENCE); - ForcePunch_Timer = urand(16000, 21000); - } else ForcePunch_Timer -= diff; - - if (SummonTigers_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SUMMONTIGERS); - SummonTigers_Timer = urand(10000, 14000); - } else SummonTigers_Timer -= diff; - - if (HealthBelowPct(11) && !Enraged) - { - DoCast(me, SPELL_ENRAGE); - Enraged = true; - } - } - - DoMeleeAttackIfReady(); - - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_thekalAI(creature); - } -}; - -//Zealot Lor'Khan -class mob_zealot_lorkhan : public CreatureScript -{ - public: - - mob_zealot_lorkhan() - : CreatureScript("mob_zealot_lorkhan") - { - } - - struct mob_zealot_lorkhanAI : public ScriptedAI - { - mob_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 Shield_Timer; - uint32 BloodLust_Timer; - uint32 GreaterHeal_Timer; - uint32 Disarm_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - - void Reset() - { - Shield_Timer = 1000; - BloodLust_Timer = 16000; - GreaterHeal_Timer = 32000; - Disarm_Timer = 6000; - Check_Timer = 10000; - - FakeDeath = false; - - if (instance) - instance->SetData(DATA_LORKHAN, NOT_STARTED); - - me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - if (!UpdateVictim()) - return; - - //Shield_Timer - if (Shield_Timer <= diff) - { - DoCast(me, SPELL_SHIELD); - Shield_Timer = 61000; - } else Shield_Timer -= diff; - - //BloodLust_Timer - if (BloodLust_Timer <= diff) - { - DoCast(me, SPELL_BLOODLUST); - BloodLust_Timer = 20000+rand()%8000; - } else BloodLust_Timer -= diff; - - //Casting Greaterheal to Thekal or Zath if they are in meele range. - if (GreaterHeal_Timer <= diff) - { - if (instance) - { - Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)); - Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); - - if (!pThekal || !pZath) - return; - - switch (urand(0, 1)) - { - case 0: - if (me->IsWithinMeleeRange(pThekal)) - DoCast(pThekal, SPELL_GREATERHEAL); - break; - case 1: - if (me->IsWithinMeleeRange(pZath)) - DoCast(pZath, SPELL_GREATERHEAL); - break; - } - } - - GreaterHeal_Timer = 15000+rand()%5000; - } else GreaterHeal_Timer -= diff; - - //Disarm_Timer - if (Disarm_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_DISARM); - Disarm_Timer = 15000+rand()%10000; - } else Disarm_Timer -= diff; - - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_THEKAL) == SPECIAL) - { - //Resurrect Thekal - if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) - { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->setFaction(14); - pThekal->SetFullHealth(); - } - } - - if (instance->GetData(DATA_ZATH) == SPECIAL) - { - //Resurrect Zath - if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH))) - { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->setFaction(14); - pZath->SetFullHealth(); - } - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->setFaction(35); - me->AttackStop(); - - if (instance) - instance->SetData(DATA_LORKHAN, SPECIAL); - - FakeDeath = true; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_zealot_lorkhanAI(creature); - } -}; - -//Zealot Zath -class mob_zealot_zath : public CreatureScript -{ - public: - - mob_zealot_zath() - : CreatureScript("mob_zealot_zath") - { - } - - struct mob_zealot_zathAI : public ScriptedAI - { - mob_zealot_zathAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 SweepingStrikes_Timer; - uint32 SinisterStrike_Timer; - uint32 Gouge_Timer; - uint32 Kick_Timer; - uint32 Blind_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - - void Reset() - { - SweepingStrikes_Timer = 13000; - SinisterStrike_Timer = 8000; - Gouge_Timer = 25000; - Kick_Timer = 18000; - Blind_Timer = 5000; - Check_Timer = 10000; - - FakeDeath = false; - - if (instance) - instance->SetData(DATA_ZATH, NOT_STARTED); - - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - if (!UpdateVictim()) - return; - - //SweepingStrikes_Timer - if (SweepingStrikes_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SWEEPINGSTRIKES); - SweepingStrikes_Timer = 22000+rand()%4000; - } else SweepingStrikes_Timer -= diff; - - //SinisterStrike_Timer - if (SinisterStrike_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SINISTERSTRIKE); - SinisterStrike_Timer = 8000+rand()%8000; - } else SinisterStrike_Timer -= diff; - - //Gouge_Timer - if (Gouge_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_GOUGE); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -100); - - Gouge_Timer = 17000+rand()%10000; - } else Gouge_Timer -= diff; - - //Kick_Timer - if (Kick_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_KICK); - Kick_Timer = 15000+rand()%10000; - } else Kick_Timer -= diff; - - //Blind_Timer - if (Blind_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_BLIND); - Blind_Timer = 10000+rand()%10000; - } else Blind_Timer -= diff; - - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_LORKHAN) == SPECIAL) - { - //Resurrect LorKhan - if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) - { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->setFaction(14); - pLorKhan->SetFullHealth(); - } - } - - if (instance->GetData(DATA_THEKAL) == SPECIAL) - { - //Resurrect Thekal - if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) - { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->setFaction(14); - pThekal->SetFullHealth(); - } - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->setFaction(35); - me->AttackStop(); - - if (instance) - instance->SetData(DATA_ZATH, SPECIAL); - - FakeDeath = true; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_zealot_zathAI(creature); - } -}; - -void AddSC_boss_thekal() -{ - new boss_thekal(); - new mob_zealot_lorkhan(); - new mob_zealot_zath(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 06448032dff..83815d17d2e 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -22,75 +22,22 @@ #include "Spell.h" #include "zulgurub.h" -/* - * TODO: - * - Fix timers (research some more) - */ - -enum Texts +enum Yells { - SAY_VENOXIS_TRANSFORM = 1, // Let the coils of hate unfurl! - SAY_VENOXIS_DEATH = 2, // Ssserenity.. at lassst! }; enum Spells { - // troll form - SPELL_THRASH = 3391, - SPELL_DISPEL_MAGIC = 23859, - SPELL_RENEW = 23895, - SPELL_HOLY_NOVA = 23858, - SPELL_HOLY_FIRE = 23860, - SPELL_HOLY_WRATH = 23979, - - // snake form - SPELL_POISON_CLOUD = 23861, - SPELL_VENOM_SPIT = 23862, - - SPELL_PARASITIC_SERPENT = 23865, - SPELL_SUMMON_PARASITIC_SERPENT = 23866, - SPELL_PARASITIC_SERPENT_TRIGGER = 23867, - - // used when swapping event-stages - SPELL_VENOXIS_TRANSFORM = 23849, // 50% health - shapechange to cobra - SPELL_FRENZY = 8269, // 20% health - frenzy -}; - -enum NPCs -{ - NPC_PARASITIC_SERPENT = 14884, }; enum Events { - // troll form - EVENT_THRASH = 1, - EVENT_DISPEL_MAGIC = 2, - EVENT_RENEW = 3, - EVENT_HOLY_NOVA = 4, - EVENT_HOLY_FIRE = 5, - EVENT_HOLY_WRATH = 6, - - // phase-changing - EVENT_TRANSFORM = 7, - - // snake form events - EVENT_POISON_CLOUD = 8, - EVENT_VENOM_SPIT = 9, - EVENT_PARASITIC_SERPENT = 10, - EVENT_FRENZY = 11, -}; - -enum Phases -{ - PHASE_ONE = 1, // troll form - PHASE_TWO = 2, // snake form }; class boss_venoxis : public CreatureScript { public: - boss_venoxis() : CreatureScript("boss_venoxis") {} + boss_venoxis() : CreatureScript("boss_venoxis") { } struct boss_venoxisAI : public BossAI { @@ -100,184 +47,42 @@ class boss_venoxis : public CreatureScript void Reset() { - events.Reset(); - summons.DespawnAll(); - - // make sure this boss is properly reset - instance->SetBossState(DATA_VENOXIS, NOT_STARTED); - - // remove all spells and auras from previous attempts - me->RemoveAllAuras(); - me->SetReactState(REACT_PASSIVE); - - // set some internally used variables to their defaults - _inMeleeRange = 0; - _transformed = false; - _frenzied = false; - - events.SetPhase(PHASE_ONE); } void EnterCombat(Unit* /*who*/) { - me->SetReactState(REACT_AGGRESSIVE); - - instance->SetBossState(DATA_VENOXIS, IN_PROGRESS); - - // Always running events - events.ScheduleEvent(EVENT_THRASH, 5000); - - // Phase one events (regular form) - events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE); - - events.SetPhase(PHASE_ONE); - - // Set zone in combat - DoZoneInCombat(); } void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) { - // check if venoxis is ready to transform - if (!_transformed && !HealthAbovePct(50)) - { - _transformed = true; - // schedule the event that changes our phase - events.ScheduleEvent(EVENT_TRANSFORM, 100); - } - // we're losing health, bad, go frenzy - else if (!_frenzied && !HealthAbovePct(20)) - { - _frenzied = true; - events.ScheduleEvent(EVENT_FRENZY, 100); - } } void JustDied(Unit* /*killer*/) { - Talk(SAY_VENOXIS_DEATH); - // venoxis is dead, mark him as such for the instance - instance->SetBossState(DATA_VENOXIS, DONE); - me->RemoveAllAuras(); } - void UpdateAI(const uint32 diff) + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); - // return back to main code if we're still casting if (me->HasUnitState(UNIT_STATE_CASTING)) return; - + /* while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - // thrash is available in all phases - case EVENT_THRASH: - DoCast(me, SPELL_THRASH, true); - events.ScheduleEvent(EVENT_THRASH, urand(10000, 20000)); - break; - - // troll form spells and Actions (first part) - case EVENT_DISPEL_MAGIC: - DoCast(me, SPELL_DISPEL_MAGIC); - events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE); - break; - case EVENT_RENEW: - DoCast(me, SPELL_RENEW); - events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE); - break; - case EVENT_HOLY_NOVA: - _inMeleeRange = 0; - - for (uint8 i = 0; i < 10; ++i) - { - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i)) - // check if target is within melee-distance - if (me->IsWithinMeleeRange(target)) - ++_inMeleeRange; - } - - // trigger spellcast only if we have 3 or more targets to affect - if (_inMeleeRange >= 3) - DoCast(me->getVictim(), SPELL_HOLY_NOVA); - - events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE); - break; - case EVENT_HOLY_FIRE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_HOLY_FIRE); - events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE); - break; - case EVENT_HOLY_WRATH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_HOLY_WRATH); - events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE); - break; - - // - // snake form spells and Actions - // - - case EVENT_VENOM_SPIT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_VENOM_SPIT); - events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000, 15000), 0, PHASE_TWO); - break; - case EVENT_POISON_CLOUD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_POISON_CLOUD); - events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000, 20000), 0, PHASE_TWO); - break; - case EVENT_PARASITIC_SERPENT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_SUMMON_PARASITIC_SERPENT); - events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 15000, 0, PHASE_TWO); - break; - case EVENT_FRENZY: - // frenzy at 20% health - DoCast(me, SPELL_FRENZY, true); - break; - - // - // shape and phase-changing - // - - case EVENT_TRANSFORM: - // shapeshift at 50% health - DoCast(me, SPELL_VENOXIS_TRANSFORM); - Talk(SAY_VENOXIS_TRANSFORM); - DoResetThreat(); - - // phase two events (snakeform) - events.ScheduleEvent(EVENT_VENOM_SPIT, 5000, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_POISON_CLOUD, 10000, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 30000, 0, PHASE_TWO); - - // transformed, start phase two - events.SetPhase(PHASE_TWO); - - break; default: break; } } + */ DoMeleeAttackIfReady(); } - - private: - uint8 _inMeleeRange; - bool _transformed; - bool _frenzied; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp index 6cdb00236df..be6dd137b67 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,67 +15,65 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Wushoolay -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "zulgurub.h" -#define SPELL_LIGHTNINGCLOUD 25033 -#define SPELL_LIGHTNINGWAVE 24819 +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +}; class boss_wushoolay : public CreatureScript { public: + boss_wushoolay() : CreatureScript("boss_wushoolay") { } - boss_wushoolay() - : CreatureScript("boss_wushoolay") - { - } - - struct boss_wushoolayAI : public ScriptedAI + struct boss_wushoolayAI : public BossAI { - boss_wushoolayAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 LightningCloud_Timer; - uint32 LightningWave_Timer; + boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH) + { + } void Reset() { - LightningCloud_Timer = urand(5000, 10000); - LightningWave_Timer = urand(8000, 16000); } void EnterCombat(Unit* /*who*/) { } - void UpdateAI(const uint32 diff) + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; - //LightningCloud_Timer - if (LightningCloud_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_LIGHTNINGCLOUD); - LightningCloud_Timer = urand(15000, 20000); - } else LightningCloud_Timer -= diff; + events.Update(diff); - //LightningWave_Timer - if (LightningWave_Timer <= diff) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) DoCast(target, SPELL_LIGHTNINGWAVE); - - LightningWave_Timer = urand(12000, 16000); - } else LightningWave_Timer -= diff; + switch (eventId) + { + default: + break; + } + } + */ DoMeleeAttackIfReady(); } @@ -92,4 +89,3 @@ void AddSC_boss_wushoolay() { new boss_wushoolay(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp new file mode 100644 index 00000000000..2d5fae00550 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "zulgurub.h" + +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +}; + +class boss_zanzil : public CreatureScript +{ + public: + boss_zanzil() : CreatureScript("boss_zanzil") { } + + struct boss_zanzilAI : public BossAI + { + boss_zanzilAI(Creature* creature) : BossAI(creature, DATA_ZANZIL) + { + } + + void Reset() + { + } + + void EnterCombat(Unit* /*who*/) + { + } + + void JustDied(Unit* /*killer*/) + { + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + default: + break; + } + } + */ + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_zanzilAI(creature); + } +}; + +void AddSC_boss_zanzil() +{ + new boss_zanzil(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 104d479383b..2ebec27129f 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -16,13 +16,6 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Instance_ZulGurub -SD%Complete: 80 -SDComment: Missing reset function after killing a boss for Ohgan, Thekal. -SDCategory: Zul'Gurub -EndScriptData */ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "zulgurub.h" @@ -30,128 +23,186 @@ EndScriptData */ class instance_zulgurub : public InstanceMapScript { public: - instance_zulgurub() - : InstanceMapScript("instance_zulgurub", 309) - { - } + instance_zulgurub() : InstanceMapScript(ZGScriptName, 309) { } struct instance_zulgurub_InstanceMapScript : public InstanceScript { - instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) {} - - //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too. - uint32 m_auiEncounter[MAX_ENCOUNTERS]; - - //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too. - uint64 m_uiLorKhanGUID; - uint64 m_uiZathGUID; - uint64 m_uiThekalGUID; - uint64 m_uiJindoGUID; - - void Initialize() + instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + SetBossNumber(EncounterCount); + venoxisGUID = 0; + mandokirGUID = 0; + kilnaraGUID = 0; + zanzilGUID = 0; + jindoGUID = 0; + hazzarahGUID = 0; + renatakiGUID = 0; + wushoolayGUID = 0; + grilekGUID = 0; + } - m_uiLorKhanGUID = 0; - m_uiZathGUID = 0; - m_uiThekalGUID = 0; - m_uiJindoGUID = 0; + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_VENOXIS: + venoxisGUID = creature->GetGUID(); + break; + case NPC_MANDOKIR: + mandokirGUID = creature->GetGUID(); + break; + case NPC_KILNARA: + kilnaraGUID = creature->GetGUID(); + break; + case NPC_ZANZIL: + zanzilGUID = creature->GetGUID(); + break; + case NPC_JINDO: + jindoGUID = creature->GetGUID(); + break; + case NPC_HAZZARAH: + hazzarahGUID = creature->GetGUID(); + break; + case NPC_RENATAKI: + renatakiGUID = creature->GetGUID(); + break; + case NPC_WUSHOOLAY: + wushoolayGUID = creature->GetGUID(); + break; + case NPC_GRILEK: + grilekGUID = creature->GetGUID(); + break; + default: + break; + } } - bool IsEncounterInProgress() const + bool SetBossState(uint32 type, EncounterState state) { - //not active in Zul'Gurub - return false; + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_VENOXIS: + case DATA_MANDOKIR: + case DATA_KILNARA: + case DATA_ZANZIL: + case DATA_JINDO: + case DATA_HAZZARAH: + case DATA_RENATAKI: + case DATA_WUSHOOLAY: + case DATA_GRILEK: + break; + default: + break; + } + + return true; } - void OnCreatureCreate(Creature* creature) + /* + void SetData(uint32 type, uint32 data) { - switch (creature->GetEntry()) + switch (type) { - case 11347: m_uiLorKhanGUID = creature->GetGUID(); break; - case 11348: m_uiZathGUID = creature->GetGUID(); break; - case 14509: m_uiThekalGUID = creature->GetGUID(); break; - case 11380: m_uiJindoGUID = creature->GetGUID(); break; } } - void SetData(uint32 uiType, uint32 uiData) + uint32 GetData(uint32 type) { - switch (uiType) + switch (type) { - case DATA_ARLOKK: - m_auiEncounter[0] = uiData; - break; + } - case DATA_JEKLIK: - m_auiEncounter[1] = uiData; - break; + return 0; + } + */ + uint64 GetData64(uint32 type) + { + switch (type) + { case DATA_VENOXIS: - m_auiEncounter[2] = uiData; + return venoxisGUID; + case DATA_MANDOKIR: + return mandokirGUID; + case DATA_KILNARA: + return kilnaraGUID; + case DATA_ZANZIL: + return zanzilGUID; + case DATA_JINDO: + return jindoGUID; + case DATA_HAZZARAH: + return hazzarahGUID; + case DATA_RENATAKI: + return renatakiGUID; + case DATA_WUSHOOLAY: + return wushoolayGUID; + case DATA_GRILEK: + return grilekGUID; + default: break; - case DATA_MARLI: - m_auiEncounter[3] = uiData; - break; + } - case DATA_THEKAL: - m_auiEncounter[4] = uiData; - break; + return 0; + } - case DATA_LORKHAN: - m_auiEncounter[5] = uiData; - break; + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; - case DATA_ZATH: - m_auiEncounter[6] = uiData; - break; + std::ostringstream saveStream; + saveStream << "Z G " << GetBossSaveData(); - case DATA_OHGAN: - m_auiEncounter[7] = uiData; - break; - } + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); } - uint32 GetData(uint32 uiType) + void Load(char const* str) { - switch (uiType) + if (!str) { - case DATA_ARLOKK: - return m_auiEncounter[0]; - case DATA_JEKLIK: - return m_auiEncounter[1]; - case DATA_VENOXIS: - return m_auiEncounter[2]; - case DATA_MARLI: - return m_auiEncounter[3]; - case DATA_THEKAL: - return m_auiEncounter[4]; - case DATA_LORKHAN: - return m_auiEncounter[5]; - case DATA_ZATH: - return m_auiEncounter[6]; - case DATA_OHGAN: - return m_auiEncounter[7]; + OUT_LOAD_INST_DATA_FAIL; + return; } - return 0; - } - uint64 GetData64(uint32 uiData) - { - switch (uiData) + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'Z' && dataHead2 == 'G') { - case DATA_LORKHAN: - return m_uiLorKhanGUID; - case DATA_ZATH: - return m_uiZathGUID; - case DATA_THEKAL: - return m_uiThekalGUID; - case DATA_JINDO: - return m_uiJindoGUID; + for (uint8 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } } - return 0; + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; } + + protected: + uint64 venoxisGUID; + uint64 mandokirGUID; + uint64 kilnaraGUID; + uint64 zanzilGUID; + uint64 jindoGUID; + uint64 hazzarahGUID; + uint64 renatakiGUID; + uint64 wushoolayGUID; + uint64 grilekGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index d127680cec5..0deeb1c974d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -19,20 +19,49 @@ #ifndef DEF_ZULGURUB_H #define DEF_ZULGURUB_H +#define ZGScriptName "instance_zulgurub" + +uint32 const EncounterCount = 5; + enum DataTypes { - MAX_ENCOUNTERS = 8, - - DATA_ARLOKK = 1, - DATA_JEKLIK = 2, - DATA_VENOXIS = 3, - DATA_MARLI = 4, - DATA_OHGAN = 5, - DATA_THEKAL = 6, - DATA_ZATH = 7, - DATA_LORKHAN = 8, - DATA_JINDO = 10, + DATA_VENOXIS = 0, + DATA_MANDOKIR = 1, + DATA_KILNARA = 2, + DATA_ZANZIL = 3, + DATA_JINDO = 4, + + // Cache of Madness + DATA_HAZZARAH = 5, + DATA_RENATAKI = 6, + DATA_WUSHOOLAY = 7, + DATA_GRILEK = 8, }; +enum CreatureIds +{ + NPC_VENOXIS = 52155, + NPC_MANDOKIR = 52151, + NPC_KILNARA = 52059, + NPC_ZANZIL = 52053, + NPC_JINDO = 52148, + + // Cache of Madness + NPC_HAZZARAH = 52271, + NPC_RENATAKI = 52269, + NPC_WUSHOOLAY = 52286, + NPC_GRILEK = 52258, +}; + +template +CreatureAI* GetZulGurubCitadelAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZGScriptName)) + return new AI(creature); + return NULL; +} + #endif -- cgit v1.2.3 From 8ca6538f6d13f1d7f7b9c1765191a203d09d5851 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sun, 19 Aug 2012 01:02:57 +0200 Subject: Scripts/Zul Gurub: Fix map id in instance script for cata --- src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 2ebec27129f..b0c1c7ecddd 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -23,7 +23,7 @@ class instance_zulgurub : public InstanceMapScript { public: - instance_zulgurub() : InstanceMapScript(ZGScriptName, 309) { } + instance_zulgurub() : InstanceMapScript(ZGScriptName, 859) { } struct instance_zulgurub_InstanceMapScript : public InstanceScript { -- cgit v1.2.3 From 6cea446f22f5e1c52ffde23912019f8d88830a59 Mon Sep 17 00:00:00 2001 From: teyrnon Date: Mon, 20 Aug 2012 10:44:14 +0200 Subject: Core/Objects: Encapsulated Postion::m_orientation field to ensure it is always normalized to 0-2pi range Closes #7400. --- src/server/game/Entities/Creature/Creature.cpp | 2 -- src/server/game/Entities/GameObject/GameObject.cpp | 1 - src/server/game/Entities/Object/Object.cpp | 16 ++++++------- src/server/game/Entities/Object/Object.h | 26 ++++++++++++++++++---- src/server/game/Entities/Player/Player.cpp | 10 +++------ src/server/game/Entities/Transport/Transport.cpp | 6 ++--- src/server/game/Entities/Unit/Unit.cpp | 3 +-- src/server/game/Entities/Vehicle/Vehicle.cpp | 4 ++-- src/server/game/Handlers/MovementHandler.cpp | 8 +++---- src/server/game/Maps/MapManager.h | 15 ------------- src/server/game/Spells/SpellEffects.cpp | 2 +- .../IcecrownCitadel/boss_lord_marrowgar.cpp | 1 - .../scripts/Northrend/Nexus/Oculus/boss_varos.cpp | 2 +- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 2 +- 14 files changed, 46 insertions(+), 52 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 642c7e45a74..6e2fc197a5f 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -249,7 +249,6 @@ void Creature::RemoveCorpse(bool setSpawnTime) float x, y, z, o; GetRespawnPosition(x, y, z, &o); - o = MapManager::NormalizeOrientation(o); SetHomePosition(x, y, z, o); GetMap()->CreatureRelocation(this, x, y, z, o); } @@ -2465,7 +2464,6 @@ void Creature::SetPosition(float x, float y, float z, float o) return; } - o = MapManager::NormalizeOrientation(o); GetMap()->CreatureRelocation(ToCreature(), x, y, z, o); if (IsVehicle()) GetVehicleKit()->RelocatePassengers(x, y, z, o); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 2e9780fb87e..d11795b1ae8 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -166,7 +166,6 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa ASSERT(map); SetMap(map); - ang = MapManager::NormalizeOrientation(ang); Relocate(x, y, z, ang); if (!IsPositionValid()) { diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 153dad8e447..edbc40767f9 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1664,7 +1664,7 @@ void Position::RelocateOffset(const Position & offset) m_positionX = GetPositionX() + (offset.GetPositionX() * cos(GetOrientation()) + offset.GetPositionY() * sin(GetOrientation() + M_PI)); m_positionY = GetPositionY() + (offset.GetPositionY() * cos(GetOrientation()) + offset.GetPositionX() * sin(GetOrientation())); m_positionZ = GetPositionZ() + offset.GetPositionZ(); - m_orientation = GetOrientation() + offset.GetOrientation(); + SetOrientation(GetOrientation() + offset.GetOrientation()); } void Position::GetPositionOffsetTo(const Position & endPos, Position & retOffset) const @@ -1675,7 +1675,7 @@ void Position::GetPositionOffsetTo(const Position & endPos, Position & retOffset retOffset.m_positionX = dx * cos(GetOrientation()) + dy * sin(GetOrientation()); retOffset.m_positionY = dy * cos(GetOrientation()) - dx * sin(GetOrientation()); retOffset.m_positionZ = endPos.GetPositionZ() - GetPositionZ(); - retOffset.m_orientation = endPos.GetOrientation() - GetOrientation(); + retOffset.SetOrientation(endPos.GetOrientation() - GetOrientation()); } float Position::GetAngle(const Position* obj) const @@ -1723,13 +1723,13 @@ bool Position::HasInArc(float arc, const Position* obj) const return true; // move arc to range 0.. 2*pi - arc = MapManager::NormalizeOrientation(arc); + arc = NormalizeOrientation(arc); float angle = GetAngle(obj); angle -= m_orientation; // move angle to range -pi ... +pi - angle = MapManager::NormalizeOrientation(angle); + angle = NormalizeOrientation(angle); if (angle > M_PI) angle -= 2.0f*M_PI; @@ -2916,7 +2916,7 @@ void WorldObject::GetNearPoint(WorldObject const* /*searcher*/, float &x, float void WorldObject::MovePosition(Position &pos, float dist, float angle) { - angle += m_orientation; + angle += GetOrientation(); float destx, desty, destz, ground, floor; destx = pos.m_positionX + dist * cos(angle); desty = pos.m_positionY + dist * sin(angle); @@ -2956,12 +2956,12 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle) Trinity::NormalizeMapCoord(pos.m_positionX); Trinity::NormalizeMapCoord(pos.m_positionY); UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); - pos.m_orientation = m_orientation; + pos.SetOrientation(GetOrientation()); } void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle) { - angle += m_orientation; + angle += GetOrientation(); float destx, desty, destz, ground, floor; pos.m_positionZ += 2.0f; destx = pos.m_positionX + dist * cos(angle); @@ -3024,7 +3024,7 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float Trinity::NormalizeMapCoord(pos.m_positionX); Trinity::NormalizeMapCoord(pos.m_positionY); UpdateAllowedPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); - pos.m_orientation = m_orientation; + pos.SetOrientation(GetOrientation()); } void WorldObject::SetPhaseMask(uint32 newPhaseMask, bool update) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 3829e2f75f2..e3d940360f2 100755 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -444,21 +444,24 @@ struct Position float m_positionX; float m_positionY; float m_positionZ; +// Better to limit access to m_orientation field, but this will be hard to achieve with many scripts using array initialization for this structure +//private: float m_orientation; +//public: void Relocate(float x, float y) { m_positionX = x; m_positionY = y;} void Relocate(float x, float y, float z) { m_positionX = x; m_positionY = y; m_positionZ = z; } void Relocate(float x, float y, float z, float orientation) - { m_positionX = x; m_positionY = y; m_positionZ = z; m_orientation = orientation; } + { m_positionX = x; m_positionY = y; m_positionZ = z; SetOrientation(orientation); } void Relocate(const Position &pos) - { m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; m_positionZ = pos.m_positionZ; m_orientation = pos.m_orientation; } + { m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; m_positionZ = pos.m_positionZ; SetOrientation(pos.m_orientation); } void Relocate(const Position* pos) - { m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; m_orientation = pos->m_orientation; } + { m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; SetOrientation(pos->m_orientation); } void RelocateOffset(const Position &offset); void SetOrientation(float orientation) - { m_orientation = orientation; } + { m_orientation = NormalizeOrientation(orientation); } float GetPositionX() const { return m_positionX; } float GetPositionY() const { return m_positionY; } @@ -525,6 +528,21 @@ struct Position bool HasInArc(float arcangle, const Position* pos) const; bool HasInLine(WorldObject const* target, float width) const; std::string ToString() const; + + // modulos a radian orientation to the range of 0..2PI + static float NormalizeOrientation(float o) + { + // fmod only supports positive numbers. Thus we have + // to emulate negative numbers + if (o < 0) + { + float mod = o *-1; + mod = fmod(mod, 2.0f * static_cast(M_PI)); + mod = -mod + 2.0f * static_cast(M_PI); + return mod; + } + return fmod(o, 2.0f * static_cast(M_PI)); + } }; ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer); ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1e85afd47b1..1c164fffe3c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2106,8 +2106,6 @@ void Player::SendTeleportPacket(Position &oldPos) bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options) { - orientation = MapManager::NormalizeOrientation(orientation); - if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation)) { sLog->outError(LOG_FILTER_MAPS, "TeleportTo: invalid map (%d) or invalid coordinates (X: %f, Y: %f, Z: %f, O: %f) given when teleporting player (GUID: %u, name: %s, map: %d, X: %f, Y: %f, Z: %f, O: %f).", @@ -16683,9 +16681,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // init saved position, and fix it later if problematic uint32 transGUID = uint32(fields[31].GetUInt32()); - // used orientation 0-2pi range. Check for safe. - float orientation = MapManager::NormalizeOrientation(fields[16].GetFloat()); - Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), orientation); + Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat()); uint32 mapId = fields[15].GetUInt16(); uint32 instanceId = fields[54].GetUInt32(); @@ -16793,13 +16789,13 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) if (!Trinity::IsValidMapCoord( GetPositionX()+m_movementInfo.t_pos.m_positionX, GetPositionY()+m_movementInfo.t_pos.m_positionY, - GetPositionZ()+m_movementInfo.t_pos.m_positionZ, GetOrientation()+m_movementInfo.t_pos.m_orientation) || + GetPositionZ()+m_movementInfo.t_pos.m_positionZ, GetOrientation()+m_movementInfo.t_pos.GetOrientation()) || // transport size limited m_movementInfo.t_pos.m_positionX > 250 || m_movementInfo.t_pos.m_positionY > 250 || m_movementInfo.t_pos.m_positionZ > 250) { sLog->outError(LOG_FILTER_PLAYER, "Player (guidlow %d) have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.", guid, GetPositionX()+m_movementInfo.t_pos.m_positionX, GetPositionY()+m_movementInfo.t_pos.m_positionY, - GetPositionZ()+m_movementInfo.t_pos.m_positionZ, GetOrientation()+m_movementInfo.t_pos.m_orientation); + GetPositionZ()+m_movementInfo.t_pos.m_positionZ, GetOrientation()+m_movementInfo.t_pos.GetOrientation()); RelocateToHomebind(); } diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 528784c018f..d5163d04297 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -678,7 +678,7 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, void Transport::UpdatePosition(MovementInfo* mi) { - float transport_o = mi->pos.m_orientation - mi->t_pos.m_orientation; + float transport_o = mi->pos.GetOrientation() - mi->t_pos.GetOrientation(); float transport_x = mi->pos.m_positionX - (mi->t_pos.m_positionX * cos(transport_o) - mi->t_pos.m_positionY*sin(transport_o)); float transport_y = mi->pos.m_positionY - (mi->t_pos.m_positionY * cos(transport_o) + mi->t_pos.m_positionX*sin(transport_o)); float transport_z = mi->pos.m_positionZ - mi->t_pos.m_positionZ; @@ -707,7 +707,7 @@ void Transport::UpdateNPCPositions() void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float& o) { float inx = x, iny = y, inz = z, ino = o; - o = MapManager::NormalizeOrientation(GetOrientation() + ino); + o = GetOrientation() + ino; x = GetPositionX() + (inx * cos(GetOrientation()) + iny * sin(GetOrientation() + M_PI)); y = GetPositionY() + (iny * cos(GetOrientation()) + inx * sin(GetOrientation())); z = GetPositionZ() + inz; @@ -716,7 +716,7 @@ void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float& //! This method transforms supplied global coordinates into local offsets void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float& o) { - o = MapManager::NormalizeOrientation(o - GetOrientation()); + o = o - GetOrientation(); z -= GetPositionZ(); y -= GetPositionY(); // y = searchedY * cos(o) + searchedX * sin(o) x -= GetPositionX(); // x = searchedX * cos(o) + searchedY * sin(o + pi) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2319438c14a..727262d2e17 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -407,7 +407,7 @@ void Unit::UpdateSplinePosition() pos.m_positionX = loc.x; pos.m_positionY = loc.y; pos.m_positionZ = loc.z; - pos.m_orientation = loc.orientation; + pos.SetOrientation(loc.orientation); if (Unit* vehicle = GetVehicleBase()) { loc.x += vehicle->GetPositionX(); @@ -16722,7 +16722,6 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel return false; } - orientation = MapManager::NormalizeOrientation(orientation); bool turn = (GetOrientation() != orientation); bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || GetPositionZ() != z); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 3d36f6ccda5..50370ba48de 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -346,7 +346,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_pos.m_positionZ = veSeat->m_attachmentOffsetZ; - unit->m_movementInfo.t_pos.m_orientation = 0; + unit->m_movementInfo.t_pos.SetOrientation(0); unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; unit->m_movementInfo.t_guid = _me->GetGUID(); @@ -448,7 +448,7 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang) float px = x + passenger->m_movementInfo.t_pos.m_positionX; float py = y + passenger->m_movementInfo.t_pos.m_positionY; float pz = z + passenger->m_movementInfo.t_pos.m_positionZ; - float po = ang + passenger->m_movementInfo.t_pos.m_orientation; + float po = ang + passenger->m_movementInfo.t_pos.GetOrientation(); passenger->UpdatePosition(px, py, pz, po); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index dbdc4ac04fe..193135c5067 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -748,7 +748,7 @@ void WorldSession::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) break; case MSEOrientation: if (hasOrientation) - data >> mi->pos.m_orientation; + mi->pos.SetOrientation(data.read()); break; case MSETransportPositionX: if (hasTransportData) @@ -764,7 +764,7 @@ void WorldSession::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) break; case MSETransportOrientation: if (hasTransportData) - data >> mi->t_pos.m_orientation; + mi->pos.SetOrientation(data.read()); break; case MSETransportSeat: if (hasTransportData) @@ -1023,7 +1023,7 @@ void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi) break; case MSEOrientation: if (hasOrientation) - data << mi->pos.m_orientation; + data << mi->pos.GetOrientation(); break; case MSETransportPositionX: if (hasTransportData) @@ -1039,7 +1039,7 @@ void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi) break; case MSETransportOrientation: if (hasTransportData) - data << mi->t_pos.m_orientation; + data << mi->t_pos.GetOrientation(); break; case MSETransportSeat: if (hasTransportData) diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index aa07eef2204..8f5c3799161 100755 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -104,21 +104,6 @@ class MapManager return IsValidMapCoord(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation()); } - // modulos a radian orientation to the range of 0..2PI - static float NormalizeOrientation(float o) - { - // fmod only supports positive numbers. Thus we have - // to emulate negative numbers - if (o < 0) - { - float mod = o *-1; - mod = fmod(mod, 2.0f * static_cast(M_PI)); - mod = -mod + 2.0f * static_cast(M_PI); - return mod; - } - return fmod(o, 2.0f * static_cast(M_PI)); - } - void DoDelayedMovesAndRemoves(); void LoadTransports(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ce41a776826..cbbc96b99d7 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -6053,7 +6053,7 @@ void Spell::EffectBind(SpellEffIndex effIndex) loc.m_positionX = st->target_X; loc.m_positionY = st->target_Y; loc.m_positionZ = st->target_Z; - loc.m_orientation = st->target_Orientation; + loc.SetOrientation(st->target_Orientation); area_id = player->GetAreaId(); } else diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 479d234e27c..89a26bde6ff 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -303,7 +303,6 @@ class npc_coldflame : public CreatureScript { Position const* ownerPos = marrowgarAI->GetLastColdflamePosition(); float ang = me->GetAngle(ownerPos) - static_cast(M_PI); - ang = MapManager::NormalizeOrientation(ang); me->SetOrientation(ang); owner->GetNearPosition(pos, 2.5f, 0.0f); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 6d9450daf21..aab54785213 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -121,7 +121,7 @@ public: coreEnergizeOrientation = me->GetOrientation(); firstCoreEnergize = true; } else - coreEnergizeOrientation = MapManager::NormalizeOrientation(coreEnergizeOrientation - 2.0f); + coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f); DoCast(me, SPELL_ENERGIZE_CORES_VISUAL); events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 24a9171e29f..b414a3fcdcb 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -488,7 +488,7 @@ class spell_ulduar_squeezed_lifeless : public SpellScriptLoader pos.m_positionX = 1756.25f + irand(-3, 3); pos.m_positionY = -8.3f + irand(-3, 3); pos.m_positionZ = 448.8f; - pos.m_orientation = M_PI; + pos.SetOrientation(M_PI); GetHitPlayer()->DestroyForNearbyPlayers(); GetHitPlayer()->ExitVehicle(&pos); GetHitPlayer()->UpdateObjectVisibility(false); -- cgit v1.2.3 From 9c3c3cd9ec392be5c29086b1ed6ec47fbbeb0eb9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 20 Aug 2012 15:54:55 +0200 Subject: Core/Items: Updated InventoryResult enum --- src/server/game/Entities/Item/Item.cpp | 6 +- src/server/game/Entities/Item/Item.h | 182 +++++++++++----------- src/server/game/Entities/Player/Player.cpp | 220 +++++++++++++-------------- src/server/game/Guilds/Guild.cpp | 10 +- src/server/game/Handlers/GuildHandler.cpp | 2 +- src/server/game/Handlers/ItemHandler.cpp | 30 ++-- src/server/game/Handlers/LootHandler.cpp | 2 +- src/server/game/Handlers/MailHandler.cpp | 4 +- src/server/game/Handlers/SpellHandler.cpp | 2 +- src/server/game/Spells/Auras/SpellAuras.cpp | 4 +- src/server/game/Spells/SpellEffects.cpp | 6 +- src/server/scripts/World/item_scripts.cpp | 12 +- src/server/scripts/World/npc_professions.cpp | 2 +- 13 files changed, 242 insertions(+), 240 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 4d50f9375f1..3eb9aabab14 100755 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -838,15 +838,15 @@ InventoryResult Item::CanBeMergedPartlyWith(ItemTemplate const* proto) const { // not allow merge looting currently items if (m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // check item type if (GetEntry() != proto->ItemId) - return EQUIP_ERR_ITEM_CANT_STACK; + return EQUIP_ERR_CANT_STACK; // check free space (full stacks can't be target of merge if (GetCount() >= proto->GetMaxStackSize()) - return EQUIP_ERR_ITEM_CANT_STACK; + return EQUIP_ERR_CANT_STACK; return EQUIP_ERR_OK; } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index f8d5428e6e8..b5ee171e6b1 100755 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -38,95 +38,99 @@ struct ItemSetEffect enum InventoryResult { - EQUIP_ERR_OK = 0, - EQUIP_ERR_CANT_EQUIP_LEVEL_I = 1, - EQUIP_ERR_CANT_EQUIP_SKILL = 2, - EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT = 3, - EQUIP_ERR_BAG_FULL = 4, - EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG = 5, - EQUIP_ERR_CANT_TRADE_EQUIP_BAGS = 6, - EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE = 7, - EQUIP_ERR_NO_REQUIRED_PROFICIENCY = 8, - EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE = 9, - EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM = 10, - EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2 = 11, - EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2 = 12, - EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED = 13, - EQUIP_ERR_CANT_DUAL_WIELD = 14, - EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG = 15, - EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2 = 16, - EQUIP_ERR_CANT_CARRY_MORE_OF_THIS = 17, - EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3 = 18, - EQUIP_ERR_ITEM_CANT_STACK = 19, - EQUIP_ERR_ITEM_CANT_BE_EQUIPPED = 20, - EQUIP_ERR_ITEMS_CANT_BE_SWAPPED = 21, - EQUIP_ERR_SLOT_IS_EMPTY = 22, - EQUIP_ERR_ITEM_NOT_FOUND = 23, - EQUIP_ERR_CANT_DROP_SOULBOUND = 24, - EQUIP_ERR_OUT_OF_RANGE = 25, - EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT = 26, - EQUIP_ERR_COULDNT_SPLIT_ITEMS = 27, - EQUIP_ERR_MISSING_REAGENT = 28, - EQUIP_ERR_NOT_ENOUGH_MONEY = 29, - EQUIP_ERR_NOT_A_BAG = 30, - EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS = 31, - EQUIP_ERR_DONT_OWN_THAT_ITEM = 32, - EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER = 33, - EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT = 34, - EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK = 35, - EQUIP_ERR_ITEM_LOCKED = 36, - EQUIP_ERR_YOU_ARE_STUNNED = 37, - EQUIP_ERR_YOU_ARE_DEAD = 38, - EQUIP_ERR_CANT_DO_RIGHT_NOW = 39, - EQUIP_ERR_INT_BAG_ERROR = 40, - EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT = 41, - EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH = 42, - EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED = 43, - EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED = 44, - EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED = 45, - EQUIP_ERR_BOUND_CANT_BE_WRAPPED = 46, - EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED = 47, - EQUIP_ERR_BAGS_CANT_BE_WRAPPED = 48, - EQUIP_ERR_ALREADY_LOOTED = 49, - EQUIP_ERR_INVENTORY_FULL = 50, - EQUIP_ERR_BANK_FULL = 51, - EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT = 52, - EQUIP_ERR_BAG_FULL3 = 53, - EQUIP_ERR_ITEM_NOT_FOUND2 = 54, - EQUIP_ERR_ITEM_CANT_STACK2 = 55, - EQUIP_ERR_BAG_FULL4 = 56, - EQUIP_ERR_ITEM_SOLD_OUT = 57, - EQUIP_ERR_OBJECT_IS_BUSY = 58, - EQUIP_ERR_NONE = 59, - EQUIP_ERR_NOT_IN_COMBAT = 60, - EQUIP_ERR_NOT_WHILE_DISARMED = 61, - EQUIP_ERR_BAG_FULL6 = 62, - EQUIP_ERR_CANT_EQUIP_RANK = 63, - EQUIP_ERR_CANT_EQUIP_REPUTATION = 64, - EQUIP_ERR_TOO_MANY_SPECIAL_BAGS = 65, - EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW = 66, - EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE = 67, - EQUIP_ERR_VENDOR_MISSING_TURNINS = 68, - EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS = 69, - EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS = 70, - EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED = 71, - EQUIP_ERR_MAIL_BOUND_ITEM = 72, - EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING = 73, - EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 75, - EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 76, - EQUIP_ERR_TOO_MUCH_GOLD = 77, - EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78, - EQUIP_ERR_CANNOT_TRADE_THAT = 79, - EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW = 80, - EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM = 81, - EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS = 82, - // no output = 83, - EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED = 84, - EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED = 85, - EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 86, - EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW = 87, - EQUIP_ERR_CANT_EQUIP_NEED_TALENT = 88, - EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED = 89 + EQUIP_ERR_OK = 0, + EQUIP_ERR_CANT_EQUIP_LEVEL_I = 1, // You must reach level %d to use that item. + EQUIP_ERR_CANT_EQUIP_SKILL = 2, // You aren't skilled enough to use that item. + EQUIP_ERR_WRONG_SLOT = 3, // That item does not go in that slot. + EQUIP_ERR_BAG_FULL = 4, // That bag is full. + EQUIP_ERR_BAG_IN_BAG = 5, // Can't put non-empty bags in other bags. + EQUIP_ERR_TRADE_EQUIPPED_BAG = 6, // You can't trade equipped bags. + EQUIP_ERR_AMMO_ONLY = 7, // Only ammo can go there. + EQUIP_ERR_PROFICIENCY_NEEDED = 8, // You do not have the required proficiency for that item. + EQUIP_ERR_NO_SLOT_AVAILABLE = 9, // No equipment slot is available for that item. + EQUIP_ERR_CANT_EQUIP_EVER = 10, // You can never use that item. + EQUIP_ERR_CANT_EQUIP_EVER_2 = 11, // You can never use that item. + EQUIP_ERR_NO_SLOT_AVAILABLE_2 = 12, // No equipment slot is available for that item. + EQUIP_ERR_2HANDED_EQUIPPED = 13, // Cannot equip that with a two-handed weapon. + EQUIP_ERR_2HSKILLNOTFOUND = 14, // You cannot dual-wield + EQUIP_ERR_WRONG_BAG_TYPE = 15, // That item doesn't go in that container. + EQUIP_ERR_WRONG_BAG_TYPE_2 = 16, // That item doesn't go in that container. + EQUIP_ERR_ITEM_MAX_COUNT = 17, // You can't carry any more of those items. + EQUIP_ERR_NO_SLOT_AVAILABLE_3 = 18, // No equipment slot is available for that item. + EQUIP_ERR_CANT_STACK = 19, // This item cannot stack. + EQUIP_ERR_NOT_EQUIPPABLE = 20, // This item cannot be equipped. + EQUIP_ERR_CANT_SWAP = 21, // These items can't be swapped. + EQUIP_ERR_SLOT_EMPTY = 22, // That slot is empty. + EQUIP_ERR_ITEM_NOT_FOUND = 23, // The item was not found. + EQUIP_ERR_DROP_BOUND_ITEM = 24, // You can't drop a soulbound item. + EQUIP_ERR_OUT_OF_RANGE = 25, // Out of range. + EQUIP_ERR_TOO_FEW_TO_SPLIT = 26, // Tried to split more than number in stack. + EQUIP_ERR_SPLIT_FAILED = 27, // Couldn't split those items. + EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC = 28, // Missing reagent + EQUIP_ERR_NOT_ENOUGH_MONEY = 29, // You don't have enough money. + EQUIP_ERR_NOT_A_BAG = 30, // Not a bag. + EQUIP_ERR_DESTROY_NONEMPTY_BAG = 31, // You can only do that with empty bags. + EQUIP_ERR_NOT_OWNER = 32, // You don't own that item. + EQUIP_ERR_ONLY_ONE_QUIVER = 33, // You can only equip one quiver. + EQUIP_ERR_NO_BANK_SLOT = 34, // You must purchase that bag slot first + EQUIP_ERR_NO_BANK_HERE = 35, // You are too far away from a bank. + EQUIP_ERR_ITEM_LOCKED = 36, // Item is locked. + EQUIP_ERR_GENERIC_STUNNED = 37, // You are stunned + EQUIP_ERR_PLAYER_DEAD = 38, // You can't do that when you're dead. + EQUIP_ERR_CLIENT_LOCKED_OUT = 39, // You can't do that right now. + EQUIP_ERR_INTERNAL_BAG_ERROR = 40, // Internal Bag Error + EQUIP_ERR_ONLY_ONE_BOLT = 41, // You can only equip one quiver. + EQUIP_ERR_ONLY_ONE_AMMO = 42, // You can only equip one ammo pouch. + EQUIP_ERR_CANT_WRAP_STACKABLE = 43, // Stackable items can't be wrapped. + EQUIP_ERR_CANT_WRAP_EQUIPPED = 44, // Equipped items can't be wrapped. + EQUIP_ERR_CANT_WRAP_WRAPPED = 45, // Wrapped items can't be wrapped. + EQUIP_ERR_CANT_WRAP_BOUND = 46, // Bound items can't be wrapped. + EQUIP_ERR_CANT_WRAP_UNIQUE = 47, // Unique items can't be wrapped. + EQUIP_ERR_CANT_WRAP_BAGS = 48, // Bags can't be wrapped. + EQUIP_ERR_LOOT_GONE = 49, // Already looted + EQUIP_ERR_INV_FULL = 50, // Inventory is full. + EQUIP_ERR_BANK_FULL = 51, // Your bank is full + EQUIP_ERR_VENDOR_SOLD_OUT = 52, // That item is currently sold out. + EQUIP_ERR_BAG_FULL_2 = 53, // That bag is full. + EQUIP_ERR_ITEM_NOT_FOUND_2 = 54, // The item was not found. + EQUIP_ERR_CANT_STACK_2 = 55, // This item cannot stack. + EQUIP_ERR_BAG_FULL_3 = 56, // That bag is full. + EQUIP_ERR_VENDOR_SOLD_OUT_2 = 57, // That item is currently sold out. + EQUIP_ERR_OBJECT_IS_BUSY = 58, // That object is busy. + EQUIP_ERR_CANT_BE_DISENCHANTED = 59, + EQUIP_ERR_NOT_IN_COMBAT = 60, // You can't do that while in combat + EQUIP_ERR_NOT_WHILE_DISARMED = 61, // You can't do that while disarmed + EQUIP_ERR_BAG_FULL_4 = 62, // That bag is full. + EQUIP_ERR_CANT_EQUIP_RANK = 63, // You don't have the required rank for that item + EQUIP_ERR_CANT_EQUIP_REPUTATION = 64, // You don't have the required reputation for that item + EQUIP_ERR_TOO_MANY_SPECIAL_BAGS = 65, // You cannot equip another bag of that type + EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW = 66, // You can't loot that item now. + EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE = 67, // You cannot equip more than one of those. + EQUIP_ERR_VENDOR_MISSING_TURNINS = 68, // You do not have the required items for that purchase + EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS = 69, // You don't have enough honor points + EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS = 70, // You don't have enough arena points + EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED = 71, // You have the maximum number of those gems in your inventory or socketed into items. + EQUIP_ERR_MAIL_BOUND_ITEM = 72, // You can't mail soulbound items. + EQUIP_ERR_INTERNAL_BAG_ERROR_2 = 73, // Internal Bag Error + EQUIP_ERR_BAG_FULL_5 = 74, // That bag is full. + EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 75, // You have the maximum number of those gems socketed into equipped items. + EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 76, // You cannot socket more than one of those gems into a single item. + EQUIP_ERR_TOO_MUCH_GOLD = 77, // At gold limit + EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78, // You can't do that while in an arena match + EQUIP_ERR_TRADE_BOUND_ITEM = 79, // You can't trade a soulbound item. + EQUIP_ERR_CANT_EQUIP_RATING = 80, // You don't have the personal, team, or battleground rating required to buy that item + EQUIP_ERR_NO_OUTPUT = 81, + EQUIP_ERR_NOT_SAME_ACCOUNT = 82, // Account-bound items can only be given to your own characters. + EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 84, // You can only carry %d %s + EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 85, // You can only equip %d |4item:items in the %s category + EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 86, // Your level is too high to use that item + EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW = 87, // You must reach level %d to purchase that item. + EQUIP_ERR_CANT_EQUIP_NEED_TALENT = 88, // You do not have the required talent to equip that. + EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 89, // You can only equip %d |4item:items in the %s category + EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 90, // Cannot equip item in this form + EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL = 91, // Your inventory is full. Your satchel has been delivered to your mailbox. + EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 92, // Your level is too low to use that item + EQUIP_ERR_CANT_BUY_QUANTITY = 93, // You can't buy the specified quantity of that item. }; enum BuyResult diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1c164fffe3c..a46e7806961 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8527,7 +8527,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 if (!spellInfo) { sLog->outError(LOG_FILTER_PLAYER, "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring ", proto->ItemId, learn_spell_id); - SendEquipError(EQUIP_ERR_NONE, item, NULL); + SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, item, NULL); return; } @@ -10466,11 +10466,11 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } if (pItem && pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // no maximum if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647) @@ -10483,7 +10483,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count + curcount - pProto->MaxCount; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } @@ -10495,7 +10495,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; } if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE) @@ -10505,7 +10505,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count + curcount - limitEntry->maxCount; - return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED; + return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS; } } } @@ -10524,7 +10524,7 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP uint32 need_space; if (pSrcItem && pSrcItem->IsNotEmptyBag() && !IsBagPos(uint16(bag) << 8 | slot)) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; // empty specific slot - check item fit to slot if (!pItem2 || swap) @@ -10533,23 +10533,23 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP { // prevent cheating if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; } else { Bag* pBag = GetBagByPos(bag); if (!pBag) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; ItemTemplate const* pBagProto = pBag->GetTemplate(); if (!pBagProto) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (slot >= pBagProto->ContainerSlots) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (!ItemCanGoIntoBag(pProto, pBagProto)) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; } // non empty stack with space @@ -10583,26 +10583,26 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite { // skip specific bag already processed in first called CanStoreItem_InBag if (bag == skip_bag) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // skip not existed bag or self targeted bag Bag* pBag = GetBagByPos(bag); if (!pBag || pBag == pSrcItem) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (pSrcItem && pSrcItem->IsNotEmptyBag()) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; ItemTemplate const* pBagProto = pBag->GetTemplate(); if (!pBagProto) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // specialized bag mode or non-specilized if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER)) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (!ItemCanGoIntoBag(pProto, pBagProto)) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; for (uint32 j = 0; j < pBag->GetBagSize(); j++) { @@ -10653,7 +10653,7 @@ InventoryResult Player::CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 sl { //this is never called for non-bag slots so we can do this if (pSrcItem && pSrcItem->IsNotEmptyBag()) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; for (uint32 j = slot_begin; j < slot_end; j++) { @@ -10709,7 +10709,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des { if (no_space_count) *no_space_count = count; - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED :EQUIP_ERR_ITEM_NOT_FOUND; + return swap ? EQUIP_ERR_CANT_SWAP :EQUIP_ERR_ITEM_NOT_FOUND; } if (pItem) @@ -10719,14 +10719,14 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; } if (pItem->IsBindedNotWith(this)) { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; } } @@ -10762,7 +10762,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } @@ -10791,7 +10791,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } else // equipped bag @@ -10815,7 +10815,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10838,7 +10838,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } else // equipped bag @@ -10861,7 +10861,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10886,7 +10886,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } if (pProto->BagFamily) @@ -10904,7 +10904,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10922,7 +10922,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10943,13 +10943,13 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } if (pItem && pItem->IsNotEmptyBag()) - return EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG; + return EQUIP_ERR_BAG_IN_BAG; // search free slot res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot); @@ -10967,7 +10967,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) @@ -10983,14 +10983,14 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_INVENTORY_FULL; + return EQUIP_ERR_INV_FULL; } ////////////////////////////////////////////////////////////////////////// @@ -11039,11 +11039,11 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // item it 'bind' if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; ItemTemplate const* pBagProto; @@ -11163,7 +11163,7 @@ InventoryResult Player::CanStoreItems(Item** pItems, int count) const // no free slot found? if (!b_found) - return EQUIP_ERR_INVENTORY_FULL; + return EQUIP_ERR_INV_FULL; } return EQUIP_ERR_OK; @@ -11195,10 +11195,10 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool { // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; // check count of items (skip for auto move for same player from bank) InventoryResult res = CanTakeMoreSimilarItems(pItem); @@ -11211,7 +11211,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool // May be here should be more stronger checks; STUNNED checked // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked. if (HasUnitState(UNIT_STATE_STUNNED)) - return EQUIP_ERR_YOU_ARE_STUNNED; + return EQUIP_ERR_GENERIC_STUNNED; // do not allow equipping gear except weapons, offhands, projectiles, relics in // - combat @@ -11227,27 +11227,27 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool } if (isInCombat()&& (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err + return EQUIP_ERR_CLIENT_LOCKED_OUT; // maybe exist better err if (IsNonMeleeSpellCasted(false)) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } ScalingStatDistributionEntry const* ssd = pProto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(pProto->ScalingStatDistribution) : 0; // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items) if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < getLevel()) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; uint8 eslot = FindEquipSlot(pProto, slot, swap); if (eslot == NULL_SLOT) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; res = CanUseItem(pItem, not_loading); if (res != EQUIP_ERR_OK) return res; if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot)) - return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE; + return EQUIP_ERR_NO_SLOT_AVAILABLE; // if swap ignore item (equipped also) InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? eslot : uint8(NULL_SLOT)); @@ -11262,8 +11262,8 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool if (ItemTemplate const* pBagProto = pBag->GetTemplate()) if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot)) return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH) - ? EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH - : EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER; + ? EQUIP_ERR_ONLY_ONE_AMMO + : EQUIP_ERR_ONLY_ONE_QUIVER; uint32 type = pProto->InventoryType; @@ -11272,16 +11272,16 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND) { if (!CanDualWield()) - return EQUIP_ERR_CANT_DUAL_WIELD; + return EQUIP_ERR_2HSKILLNOTFOUND; } else if (type == INVTYPE_2HWEAPON) { if (!CanDualWield() || !CanTitanGrip()) - return EQUIP_ERR_CANT_DUAL_WIELD; + return EQUIP_ERR_2HSKILLNOTFOUND; } if (IsTwoHandUsed()) - return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED; + return EQUIP_ERR_2HANDED_EQUIPPED; } // equip two-hand weapon case (with possible unequip 2 items) @@ -11290,10 +11290,10 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool if (eslot == EQUIPMENT_SLOT_OFFHAND) { if (!CanTitanGrip()) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; } else if (eslot != EQUIPMENT_SLOT_MAINHAND) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; if (!CanTitanGrip()) { @@ -11303,7 +11303,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool if (offItem && (!not_loading || CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND, false) != EQUIP_ERR_OK || CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK)) - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_INV_FULL; } } dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot); @@ -11311,7 +11311,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool } } - return !swap ? EQUIP_ERR_ITEM_NOT_FOUND : EQUIP_ERR_ITEMS_CANT_BE_SWAPPED; + return !swap ? EQUIP_ERR_ITEM_NOT_FOUND : EQUIP_ERR_CANT_SWAP; } InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const @@ -11334,7 +11334,7 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // do not allow unequipping gear except weapons, offhands, projectiles, relics in // - combat @@ -11350,7 +11350,7 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const } if (!swap && pItem->IsNotEmptyBag()) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; return EQUIP_ERR_OK; } @@ -11358,28 +11358,28 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item* pItem, bool swap, bool not_loading) const { if (!pItem) - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_ITEM_NOT_FOUND; uint32 count = pItem->GetCount(); sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanBankItem bag = %u, slot = %u, item = %u, count = %u", bag, slot, pItem->GetEntry(), pItem->GetCount()); ItemTemplate const* pProto = pItem->GetTemplate(); if (!pProto) - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_ITEM_NOT_FOUND; // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; // Currency tokens are not supposed to be swapped out of their hidden bag if(pItem->IsCurrencyToken()) { sLog->outError(LOG_FILTER_PLAYER, "Possible hacking attempt: Player %s [guid: %u] tried to move token [guid: %u, entry: %u] out of the currency bag!", GetName(), GetGUIDLow(), pItem->GetGUIDLow(), pProto->ItemId); - return EQUIP_ERR_ITEMS_CANT_BE_SWAPPED; + return EQUIP_ERR_CANT_SWAP; } // check count of items (skip for auto move for same player from bank) @@ -11393,10 +11393,10 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END) { if (!pItem->IsBag()) - return EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT; + return EQUIP_ERR_WRONG_SLOT; if (slot - BANK_SLOT_BAG_START >= GetBankBagSlotCount()) - return EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT; + return EQUIP_ERR_NO_BANK_SLOT; res = CanUseItem(pItem, not_loading); if (res != EQUIP_ERR_OK) @@ -11417,7 +11417,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest if (bag != NULL_BAG) { if (pItem->IsNotEmptyBag()) - return EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG; + return EQUIP_ERR_BAG_IN_BAG; // search stack in bag for merge to if (pProto->Stackable != 1) @@ -11548,16 +11548,16 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanUseItem item = %u", pItem->GetEntry()); if (!isAlive() && not_loading) - return EQUIP_ERR_YOU_ARE_DEAD; + return EQUIP_ERR_PLAYER_DEAD; //if (isStunned()) - // return EQUIP_ERR_YOU_ARE_STUNNED; + // return EQUIP_ERR_GENERIC_STUNNED; ItemTemplate const* pProto = pItem->GetTemplate(); if (pProto) { if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; InventoryResult res = CanUseItem(pProto); if (res != EQUIP_ERR_OK) @@ -11570,7 +11570,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet. if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill)) { - // TODO: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY. + // TODO: when you right-click already equipped item it throws EQUIP_ERR_PROFICIENCY_NEEDED. // In fact it's a visual bug, everything works properly... I need sniffs of operations with // binded to account items from off server. @@ -11588,7 +11588,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const } } if (!allowEquip && GetSkillValue(itemSkill) == 0) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; } if (pProto->RequiredReputationFaction && uint32(GetReputationRank(pProto->RequiredReputationFaction)) < pProto->RequiredReputationRank) @@ -11607,31 +11607,31 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const if (proto) { if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeam() != HORDE) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeam() != ALLIANCE) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if (proto->RequiredSkill != 0) { if (GetSkillValue(proto->RequiredSkill) == 0) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank) return EQUIP_ERR_CANT_EQUIP_SKILL; } if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell)) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; if (getLevel() < proto->RequiredLevel) return EQUIP_ERR_CANT_EQUIP_LEVEL_I; // If World Event is not active, prevent using event dependant items if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId)) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; return EQUIP_ERR_OK; } @@ -11673,15 +11673,15 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje }; //Copy from function Item::GetSkill() if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell)) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; if (proto->RequiredSkill != 0) { if (!GetSkillValue(proto->RequiredSkill)) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank) return EQUIP_ERR_CANT_EQUIP_SKILL; } @@ -11689,7 +11689,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje uint8 _class = getClass(); if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISCELLANEOUS && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER && proto->InventoryType != INVTYPE_CLOAK) { @@ -11698,29 +11698,29 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje if (getLevel() < 40) { if (proto->SubClass != ITEM_SUBCLASS_ARMOR_MAIL) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } else if (proto->SubClass != ITEM_SUBCLASS_ARMOR_PLATE) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } else if (_class == CLASS_HUNTER || _class == CLASS_SHAMAN) { if (getLevel() < 40) { if (proto->SubClass != ITEM_SUBCLASS_ARMOR_LEATHER) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } else if (proto->SubClass != ITEM_SUBCLASS_ARMOR_MAIL) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } if (_class == CLASS_ROGUE || _class == CLASS_DRUID) if (proto->SubClass != ITEM_SUBCLASS_ARMOR_LEATHER) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; if (_class == CLASS_MAGE || _class == CLASS_PRIEST || _class == CLASS_WARLOCK) if (proto->SubClass != ITEM_SUBCLASS_ARMOR_CLOTH) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } return EQUIP_ERR_OK; @@ -12522,21 +12522,21 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) if (pSrcItem->m_lootGenerated) // prevent split looting item (item { //best error message found for attempting to split while looting - SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_SPLIT_FAILED, pSrcItem, NULL); return; } // not let split all items (can be only at cheating) if (pSrcItem->GetCount() == count) { - SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_SPLIT_FAILED, pSrcItem, NULL); return; } // not let split more existed items (can be only at cheating) if (pSrcItem->GetCount() < count) { - SendEquipError(EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_TOO_FEW_TO_SPLIT, pSrcItem, NULL); return; } @@ -12637,7 +12637,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!isAlive()) { - SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_PLAYER_DEAD, pSrcItem, pDstItem); return; } @@ -12646,7 +12646,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (pSrcItem->m_lootGenerated) // prevent swap looting item { //best error message found for attempting to swap while looting - SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, pSrcItem, NULL); return; } @@ -12665,14 +12665,14 @@ void Player::SwapItem(uint16 src, uint16 dst) // prevent put equipped/bank bag in self if (IsBagPos(src) && srcslot == dstbag) { - SendEquipError(EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_BAG_IN_BAG, pSrcItem, pDstItem); return; } // prevent equipping bag in the same slot from its inside if (IsBagPos(dst) && srcbag == dstslot) { - SendEquipError(EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_CANT_SWAP, pSrcItem, pDstItem); return; } @@ -12683,7 +12683,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (pDstItem->m_lootGenerated) // prevent swap looting item { //best error message found for attempting to swap while looting - SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, NULL); + SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, pDstItem, NULL); return; } @@ -12880,7 +12880,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto)) { // one from items not go to empty target bag - SendEquipError(EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_BAG_IN_BAG, pSrcItem, pDstItem); return; } @@ -12890,7 +12890,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (count > emptyBag->GetBagSize()) { // too small targeted bag - SendEquipError(EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_CANT_SWAP, pSrcItem, pDstItem); return; } @@ -13084,16 +13084,16 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint data << uint32(proto ? proto->RequiredLevel : 0); break; } - case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one... + case EQUIP_ERR_NO_OUTPUT: // no idea about this one... { data << uint64(0); // item guid data << uint32(0); // slot data << uint64(0); // container break; } - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED: - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED: - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: { ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid); data << uint32(proto ? proto->ItemLimitCategory : 0); @@ -14630,7 +14630,7 @@ bool Player::CanAddQuest(Quest const* quest, bool msg) InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count); // player already have max number (in most case 1) source item, no additional item needed and quest can be added. - if (msg2 == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) + if (msg2 == EQUIP_ERR_ITEM_MAX_COUNT) return true; else if (msg2 != EQUIP_ERR_OK) { @@ -15543,7 +15543,7 @@ bool Player::GiveQuestSourceItem(Quest const* quest) return true; } // player already have max amount required item, just report success - else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) + else if (msg == EQUIP_ERR_ITEM_MAX_COUNT) return true; else SendEquipError(msg, NULL, NULL, srcitem); @@ -17496,7 +17496,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { std::map::iterator itr = invalidBagMap.find(bagGuid); if (std::find(problematicItems.begin(),problematicItems.end(),itr->second) != problematicItems.end()) - err = EQUIP_ERR_INT_BAG_ERROR; + err = EQUIP_ERR_INTERNAL_BAG_ERROR; } else { @@ -21269,7 +21269,7 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 { if (pProto->BuyCount * count != 1) { - SendEquipError(EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, NULL, NULL); + SendEquipError(EQUIP_ERR_NOT_EQUIPPABLE, NULL, NULL); return false; } if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false)) @@ -21277,7 +21277,7 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 } else { - SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL); + SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return false; } @@ -23963,7 +23963,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) if (!item) { - SendEquipError(EQUIP_ERR_ALREADY_LOOTED, NULL, NULL); + SendEquipError(EQUIP_ERR_LOOT_GONE, NULL, NULL); return; } @@ -24255,7 +24255,7 @@ InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 { // there is an equip limit on this item if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot)) - return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE; + return EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE; } // check unique-equipped limit @@ -24263,12 +24263,12 @@ InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 { ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory); if (!limitEntry) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case if (limit_count > limitEntry->maxCount) - return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED; + return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS; // there is an equip limit on this item if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot)) @@ -25756,7 +25756,7 @@ uint8 Player::AddVoidStorageItem(const VoidStorageItem& item) if (slot >= VOID_STORAGE_MAX_SLOT) { GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); - return -1; + return 255; } _voidStorageItems[slot] = new VoidStorageItem(item.ItemId, item.ItemEntry, diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index e843191832e..f66e6ff8a03 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -764,13 +764,13 @@ bool Guild::PlayerMoveItemData::InitItem() // Anti-WPE protection. Do not move non-empty bags to bank. if (m_pItem->IsNotEmptyBag()) { - m_pPlayer->SendEquipError(EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, m_pItem); + m_pPlayer->SendEquipError(EQUIP_ERR_DESTROY_NONEMPTY_BAG, m_pItem); m_pItem = NULL; } // Bound items cannot be put into bank. else if (!m_pItem->CanBeTraded()) { - m_pPlayer->SendEquipError(EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, m_pItem); + m_pPlayer->SendEquipError(EQUIP_ERR_CANT_SWAP, m_pItem); m_pItem = NULL; } } @@ -989,11 +989,11 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) uint32 count = pItem->GetCount(); // Soulbound items cannot be moved if (pItem->IsSoulBound()) - return EQUIP_ERR_CANT_DROP_SOULBOUND; + return EQUIP_ERR_DROP_BOUND_ITEM; // Make sure destination bank tab exists if (m_container >= m_pGuild->_GetPurchasedTabsSize()) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // Slot explicitely specified. Check it. if (m_slotId != NULL_SLOT) @@ -1004,7 +1004,7 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) pItemDest = NULL; if (!_ReserveSpace(m_slotId, pItem, pItemDest, count)) - return EQUIP_ERR_ITEM_CANT_STACK; + return EQUIP_ERR_CANT_STACK; if (count == 0) return EQUIP_ERR_OK; diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 5bb7259a1cf..89a53be3e24 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -591,7 +591,7 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket & recvData) // Player <-> Bank // Allow to work with inventory only if (!Player::IsInventoryPos(playerBag, playerSlotId) && !(playerBag == NULL_BAG && playerSlotId == NULL_SLOT)) - GetPlayer()->SendEquipError(EQUIP_ERR_NONE, NULL); + GetPlayer()->SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, NULL); else guild->SwapItemsWithInventory(GetPlayer(), toChar, tabId, slotId, playerBag, playerSlotId, splitedAmount); } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 640d6996bdf..621278a6948 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -55,7 +55,7 @@ void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) if (!_player->IsValidPos(dstbag, dstslot, false)) // can be autostore pos { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } @@ -82,7 +82,7 @@ void WorldSession::HandleSwapInvItemOpcode(WorldPacket & recvData) if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } @@ -134,7 +134,7 @@ void WorldSession::HandleSwapItem(WorldPacket& recvData) if (!_player->IsValidPos(dstbag, dstslot, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } @@ -265,7 +265,7 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket & recvData) if (pItem->GetTemplate()->Flags & ITEM_PROTO_FLAG_INDESTRUCTIBLE) { - _player->SendEquipError(EQUIP_ERR_CANT_DROP_SOULBOUND, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_DROP_BOUND_ITEM, NULL, NULL); return; } @@ -885,7 +885,7 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData) if (!_player->IsValidPos(dstbag, NULL_SLOT, false)) // can be autostore pos { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } @@ -914,7 +914,7 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData) if (dest.size() == 1 && dest[0].pos == src) { // just remove grey item state - _player->SendEquipError(EQUIP_ERR_NONE, pItem, NULL); + _player->SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, pItem, NULL); return; } @@ -997,7 +997,7 @@ void WorldSession::HandleAutoBankItemOpcode(WorldPacket& recvPacket) if (dest.size() == 1 && dest[0].pos == pItem->GetPos()) { - _player->SendEquipError(EQUIP_ERR_NONE, pItem, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_SWAP, pItem, NULL); return; } @@ -1102,44 +1102,44 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData) if (item == gift) // not possable with pacjket from real client { - _player->SendEquipError(EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_WRAPPED, item, NULL); return; } if (item->IsEquipped()) { - _player->SendEquipError(EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_EQUIPPED, item, NULL); return; } if (item->GetUInt64Value(ITEM_FIELD_GIFTCREATOR)) // HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED); { - _player->SendEquipError(EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_WRAPPED, item, NULL); return; } if (item->IsBag()) { - _player->SendEquipError(EQUIP_ERR_BAGS_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_BAGS, item, NULL); return; } if (item->IsSoulBound()) { - _player->SendEquipError(EQUIP_ERR_BOUND_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_BOUND, item, NULL); return; } if (item->GetMaxStackCount() != 1) { - _player->SendEquipError(EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_STACKABLE, item, NULL); return; } // maybe not correct check (it is better than nothing) - if (item->GetTemplate()->MaxCount>0) + if (item->GetTemplate()->MaxCount > 0) { - _player->SendEquipError(EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED, item, NULL); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_UNIQUE, item, NULL); return; } diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 8641880db59..aa4b7b85023 100755 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -483,7 +483,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) ItemPosCountVec dest; InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count); if (item.follow_loot_rules && !item.AllowedForPlayer(target)) - msg = EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + msg = EQUIP_ERR_CANT_EQUIP_EVER; if (msg != EQUIP_ERR_OK) { target->SendEquipError(msg, NULL, NULL, item.itemid); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 0722a9c1e00..4d16fb27bec 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -259,7 +259,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (item->IsBoundAccountWide() && item->IsSoulBound() && player->GetSession()->GetAccountId() != rc_account) { - player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS); + player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_NOT_SAME_ACCOUNT); return; } @@ -277,7 +277,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (item->IsNotEmptyBag()) { - player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS); + player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_DESTROY_NONEMPTY_BAG); return; } diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 079a4e2422d..6aeb61b222b 100755 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -228,7 +228,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) // Verify that the bag is an actual bag or wrapped item that can be used "normally" if (!(proto->Flags & ITEM_PROTO_FLAG_OPENABLE) && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED)) { - pUser->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); + pUser->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); sLog->outError(LOG_FILTER_NETWORKIO, "Possible hacking attempt: Player %s [guid: %u] tried to open item [guid: %u, entry: %u] which is not openable!", pUser->GetName(), pUser->GetGUIDLow(), item->GetGUIDLow(), proto->ItemId); return; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 406fc78a3ee..31129cf98d4 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -791,14 +791,14 @@ void Aura::SetCharges(uint8 charges) uint8 Aura::CalcMaxCharges(Unit* caster) const { - uint8 maxProcCharges = m_spellInfo->ProcCharges; + uint32 maxProcCharges = m_spellInfo->ProcCharges; if (SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId())) maxProcCharges = procEntry->charges; if (caster) if (Player* modOwner = caster->GetSpellModOwner()) modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, maxProcCharges); - return maxProcCharges; + return uint8(maxProcCharges); } bool Aura::ModCharges(int32 num, AuraRemoveMode removeMode) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index cbbc96b99d7..d1af1832ce4 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1549,7 +1549,7 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) if (msg != EQUIP_ERR_OK) { // convert to possible store amount - if (msg == EQUIP_ERR_INVENTORY_FULL || msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) + if (msg == EQUIP_ERR_INV_FULL || msg == EQUIP_ERR_ITEM_MAX_COUNT) num_to_add -= no_space; else { @@ -2070,9 +2070,9 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) uint8 msg = player->CanEquipItem(m_CastItem->GetSlot(), dest, pNewItem, true); - if (msg == EQUIP_ERR_OK || msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) + if (msg == EQUIP_ERR_OK || msg == EQUIP_ERR_CLIENT_LOCKED_OUT) { - if (msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) dest = EQUIPMENT_SLOT_MAINHAND; + if (msg == EQUIP_ERR_CLIENT_LOCKED_OUT) dest = EQUIPMENT_SLOT_MAINHAND; // prevent crash at access and unexpected charges counting with item update queue corrupt if (m_CastItem == m_targets.GetItemTarget()) diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index d888e6cb56b..e7883f4f11f 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -75,7 +75,7 @@ public: return false; // error - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); return true; } }; @@ -118,7 +118,7 @@ public: targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578)) return false; - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); return true; } }; @@ -267,15 +267,13 @@ class item_petrov_cluster_bombs : public ItemScript public: item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { } - bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/) + bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/) { if (player->GetZoneId() != ZONE_ID_HOWLING) return false; if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS) { - player->SendEquipError(EQUIP_ERR_NONE, item, NULL); - if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB)) Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE); @@ -380,7 +378,7 @@ public: } else player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); return true; } }; @@ -406,7 +404,7 @@ public: player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); return true; } }; diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 74f615a87d1..e6ac4a3a2a1 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -361,7 +361,7 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, 0, 0); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, NULL, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, NULL, NULL); player->CLOSE_GOSSIP_MENU(); } -- cgit v1.2.3 From e3ea3b28bd6d505495908899de154dcf92a219d8 Mon Sep 17 00:00:00 2001 From: Nay Date: Tue, 21 Aug 2012 23:40:38 +0100 Subject: Merge remote-tracking branch 'origin/master' into 4.3.4 Conflicts: src/server/game/Groups/Group.cpp src/server/game/Handlers/BattleGroundHandler.cpp src/server/game/Handlers/MailHandler.cpp src/server/game/Handlers/MiscHandler.cpp src/server/game/Server/Protocol/Opcodes.cpp src/server/game/Server/Protocol/Opcodes.h src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSocket.cpp src/server/worldserver/worldserver.conf.dist --- .../2012_08_16_00_world_creature_template.sql | 3 + sql/updates/world/2012_08_21_01_world_command.sql | 3 + .../2012_08_21_02_world_wintergrasp_conditions.sql | 23 +++++ src/server/authserver/Main.cpp | 16 ++- src/server/authserver/authserver.conf.dist | 4 +- src/server/game/AI/CoreAI/GameObjectAI.h | 5 + src/server/game/AI/CreatureAISelector.cpp | 5 + src/server/game/Achievements/AchievementMgr.cpp | 4 +- src/server/game/Battlefield/Battlefield.cpp | 16 +-- .../game/Battlefield/Zones/BattlefieldWG.cpp | 4 +- src/server/game/Battlefield/Zones/BattlefieldWG.h | 88 +++++++++-------- src/server/game/Battlegrounds/ArenaTeam.cpp | 2 +- src/server/game/Battlegrounds/Battleground.cpp | 2 +- src/server/game/Entities/GameObject/GameObject.cpp | 9 +- src/server/game/Entities/GameObject/GameObject.h | 1 + src/server/game/Entities/Object/Object.cpp | 7 +- src/server/game/Entities/Player/Player.cpp | 13 ++- src/server/game/Entities/Player/Player.h | 6 +- src/server/game/Entities/Vehicle/Vehicle.h | 4 + src/server/game/Globals/ObjectAccessor.h | 1 + src/server/game/Groups/Group.cpp | 62 ++++++------ src/server/game/Groups/Group.h | 2 +- src/server/game/Handlers/AuctionHouseHandler.cpp | 4 +- src/server/game/Handlers/BattleGroundHandler.cpp | 49 --------- src/server/game/Handlers/ChatHandler.cpp | 4 +- src/server/game/Handlers/MailHandler.cpp | 6 +- src/server/game/Handlers/MiscHandler.cpp | 50 +++++++++- src/server/game/Scripting/ScriptLoader.cpp | 2 + src/server/game/Scripting/ScriptMgr.cpp | 16 +-- src/server/game/Server/Protocol/Opcodes.h | 9 ++ src/server/game/Server/WorldSession.cpp | 81 +++++++-------- src/server/game/Server/WorldSession.h | 4 +- src/server/game/Server/WorldSocket.cpp | 110 ++++++++++----------- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 3 +- src/server/game/Spells/Spell.cpp | 4 +- src/server/game/Spells/SpellEffects.cpp | 1 + src/server/game/Spells/SpellMgr.cpp | 16 +++ src/server/game/Warden/Warden.cpp | 5 +- src/server/game/Warden/WardenMac.cpp | 4 +- src/server/game/Warden/WardenWin.cpp | 16 +-- src/server/game/World/World.cpp | 2 +- src/server/scripts/Commands/CMakeLists.txt | 1 + src/server/scripts/Commands/cs_ban.cpp | 4 +- src/server/scripts/Commands/cs_quest.cpp | 35 ++++++- .../TrialOfTheCrusader/boss_anubarak_trial.cpp | 12 +-- .../TrialOfTheCrusader/boss_lord_jaraxxus.cpp | 14 +-- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 16 ++- .../TrialOfTheCrusader/boss_twin_valkyr.cpp | 6 +- .../instance_trial_of_the_crusader.cpp | 11 +++ .../TrialOfTheCrusader/trial_of_the_crusader.cpp | 2 +- .../TrialOfTheCrusader/trial_of_the_crusader.h | 4 +- src/server/scripts/Northrend/wintergrasp.cpp | 35 +++---- src/server/worldserver/Master.cpp | 2 +- src/server/worldserver/worldserver.conf.dist | 64 +++++++++++- 54 files changed, 531 insertions(+), 341 deletions(-) create mode 100644 sql/updates/world/2012_08_16_00_world_creature_template.sql create mode 100644 sql/updates/world/2012_08_21_01_world_command.sql create mode 100644 sql/updates/world/2012_08_21_02_world_wintergrasp_conditions.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_16_00_world_creature_template.sql b/sql/updates/world/2012_08_16_00_world_creature_template.sql new file mode 100644 index 00000000000..732f647d7b7 --- /dev/null +++ b/sql/updates/world/2012_08_16_00_world_creature_template.sql @@ -0,0 +1,3 @@ +-- Added trigger flags to triggers +UPDATE `creature_template` SET `flags_extra` = flags_extra | 128 WHERE `entry` = 34862; +UPDATE `creature_template` SET `unit_flags` = unit_flags | 256 WHERE `entry` = 34862; diff --git a/sql/updates/world/2012_08_21_01_world_command.sql b/sql/updates/world/2012_08_21_01_world_command.sql new file mode 100644 index 00000000000..df833d2d246 --- /dev/null +++ b/sql/updates/world/2012_08_21_01_world_command.sql @@ -0,0 +1,3 @@ +DELETE FROM `command` WHERE name='quest reward'; +INSERT INTO `command` (`name`,`security`,`help`) VALUES +('quest reward',3,'Syntax: .quest reward #questId\n\n\Grants quest reward to selected player and removes quest from his log (quest must be in completed state).'); diff --git a/sql/updates/world/2012_08_21_02_world_wintergrasp_conditions.sql b/sql/updates/world/2012_08_21_02_world_wintergrasp_conditions.sql new file mode 100644 index 00000000000..caf8a0cc1e4 --- /dev/null +++ b/sql/updates/world/2012_08_21_02_world_wintergrasp_conditions.sql @@ -0,0 +1,23 @@ +-- Conditions +-- Add gossip_menu condition for 9904 Horde +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup` IN (9904,9923); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`NegativeCondition`) VALUES +(14,9904,13759,0,1,33280,0), -- Must have Rank 1: Corporal +(14,9904,13759,1,1,55629,0), -- Or must have Rank 2: First Lieutenant +(14,9904,13761,0,1,33280,1), -- Must not have Rank 1: Corporal +(14,9904,13761,0,1,55629,1), -- Must not have Rank 2: First Lieutenant +-- Add gossip_menu condition for 9923 Alliance +(14,9923,13798,0,1,33280,0), -- Must have Rank 1: Corporal +(14,9923,13798,1,1,55629,0), -- Or must have Rank 2: First Lieutenant +(14,9923,14172,0,1,33280,1), -- Must not have Rank 1: Corporal +(14,9923,14172,0,1,55629,1), -- Must not have Rank 2: First Lieutenant +-- Add conditions to gossip options horde +(15,9904,0,0,1,33280,0), -- Must have reached Rank 1: Corporal +(15,9904,0,1,1,55629,0), -- Or must have reached Rank 2: First Lieutenant +(15,9904,1,0,1,55629,0), -- Must have reached Rank 2: First Lieutenant +(15,9904,2,0,1,55629,0), -- Must have reached Rank 2: First Lieutenant +-- Add conditions to gossip options alliance +(15,9923,0,0,1,33280,0), -- Must have reached Rank 1: Corporal +(15,9923,0,1,1,55629,0), -- Or must have reached Rank 2: First Lieutenant +(15,9923,1,0,1,55629,0), -- Must have reached Rank 2: First Lieutenant +(15,9923,2,0,1,55629,0); -- Must have reached Rank 2: First Lieutenant diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index f5a3c7cf7e1..b938706a0be 100755 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -141,10 +141,16 @@ extern int main(int argc, char **argv) // Launch the listening network socket RealmAcceptor acceptor; - uint16 rmport = ConfigMgr::GetIntDefault("RealmServerPort", 3724); + int32 rmport = ConfigMgr::GetIntDefault("RealmServerPort", 3724); + if (rmport < 0 || rmport > 0xFFFF) + { + sLog->outError(LOG_FILTER_AUTHSERVER, "Specified port out of allowed range (1-65535)"); + return 1; + } + std::string bind_ip = ConfigMgr::GetStringDefault("BindIP", "0.0.0.0"); - ACE_INET_Addr bind_addr(rmport, bind_ip.c_str()); + ACE_INET_Addr bind_addr(uint16(rmport), bind_ip.c_str()); if (acceptor.open(bind_addr, ACE_Reactor::instance(), ACE_NONBLOCK) == -1) { @@ -238,14 +244,14 @@ bool StartDB() return false; } - uint8 worker_threads = ConfigMgr::GetIntDefault("LoginDatabase.WorkerThreads", 1); + int32 worker_threads = ConfigMgr::GetIntDefault("LoginDatabase.WorkerThreads", 1); if (worker_threads < 1 || worker_threads > 32) { sLog->outError(LOG_FILTER_AUTHSERVER, "Improper value specified for LoginDatabase.WorkerThreads, defaulting to 1."); worker_threads = 1; } - uint8 synch_threads = ConfigMgr::GetIntDefault("LoginDatabase.SynchThreads", 1); + int32 synch_threads = ConfigMgr::GetIntDefault("LoginDatabase.SynchThreads", 1); if (synch_threads < 1 || synch_threads > 32) { sLog->outError(LOG_FILTER_AUTHSERVER, "Improper value specified for LoginDatabase.SynchThreads, defaulting to 1."); @@ -253,7 +259,7 @@ bool StartDB() } // NOTE: While authserver is singlethreaded you should keep synch_threads == 1. Increasing it is just silly since only 1 will be used ever. - if (!LoginDatabase.Open(dbstring.c_str(), worker_threads, synch_threads)) + if (!LoginDatabase.Open(dbstring.c_str(), uint8(worker_threads), uint8(synch_threads))) { sLog->outError(LOG_FILTER_AUTHSERVER, "Cannot connect to database"); return false; diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index 9a4beca9bf6..ee7e5970155 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -205,8 +205,8 @@ LoginDatabase.WorkerThreads = 1 # w - (Overwrite) # -Appender.Console=1,2,6 -Appender.Auth=2,2,7,Auth.log,w +Appender.Console=1,2,0 +Appender.Auth=2,2,0,Auth.log,w # LogLevel # 0 - (Disabled) diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index fbc8675cc47..6dfea9ac158 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -39,6 +39,11 @@ class GameObjectAI virtual void Reset() {}; + // Pass parameters between AI + virtual void DoAction(const int32 /*param = 0 */) {} + virtual void SetGUID(const uint64& /*guid*/, int32 /*id = 0 */) {} + virtual uint64 GetGUID(int32 /*id = 0 */) { return 0; } + static int Permissible(GameObject const* go); virtual bool GossipHello(Player* /*player*/) { return false; } diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp index 2d69f1e0243..4ccaa174e67 100755 --- a/src/server/game/AI/CreatureAISelector.cpp +++ b/src/server/game/AI/CreatureAISelector.cpp @@ -137,6 +137,11 @@ namespace FactorySelector ai_factory = ai_registry.GetRegistryItem(go->GetAIName()); + // scriptname in db + if (!ai_factory) + if (GameObjectAI* scriptedAI = sScriptMgr->GetGameObjectAI(go)) + return scriptedAI; + //future goAI types go here std::string ainame = (ai_factory == NULL || go->GetScriptId()) ? "NullGameObjectAI" : ai_factory->key(); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 30b6de3fc4d..7a73b9f8f69 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -342,14 +342,14 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un Map* map = source->GetMap(); if (!map->IsDungeon()) { - sLog->outError(LOG_FILTER_SQL, "Achievement system call ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-dungeon/non-raid map %u", + sLog->outError(LOG_FILTER_ACHIEVEMENTSYS, "Achievement system call ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-dungeon/non-raid map %u", ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT, criteria_id, map->GetId()); return false; } InstanceScript* instance = ((InstanceMap*)map)->GetInstanceScript(); if (!instance) { - sLog->outError(LOG_FILTER_SQL, "Achievement system call ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT (%u) for achievement criteria %u for map %u but map does not have a instance script", + sLog->outError(LOG_FILTER_ACHIEVEMENTSYS, "Achievement system call ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT (%u) for achievement criteria %u for map %u but map does not have a instance script", ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT, criteria_id, map->GetId()); return false; } diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index cdb8e1999fe..d159580d189 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -280,7 +280,7 @@ void Battlefield::InitStalker(uint32 entry, float x, float y, float z, float o) if (Creature* creature = SpawnCreature(entry, x, y, z, o, TEAM_NEUTRAL)) StalkerGuid = creature->GetGUID(); else - sLog->outError(LOG_FILTER_GENERAL, "Battlefield::InitStalker: could not spawn Stalker (Creature entry %u), zone messeges will be un-available", entry); + sLog->outError(LOG_FILTER_BATTLEFIELD, "Battlefield::InitStalker: could not spawn Stalker (Creature entry %u), zone messeges will be un-available", entry); } void Battlefield::KickAfkPlayers() @@ -563,7 +563,7 @@ bool Battlefield::AddOrSetPlayerToCorrectBfGroup(Player* player) else if (group->IsMember(player->GetGUID())) { uint8 subgroup = group->GetMemberGroup(player->GetGUID()); - player->SetBattlegroundRaid(group, subgroup); + player->SetBattlegroundOrBattlefieldRaid(group, subgroup); } else group->AddMember(player); @@ -587,10 +587,10 @@ BfGraveyard* Battlefield::GetGraveyardById(uint32 id) if (m_GraveyardList[id]) return m_GraveyardList[id]; else - sLog->outError(LOG_FILTER_GENERAL, "Battlefield::GetGraveyardById Id:%u not existed", id); + sLog->outError(LOG_FILTER_BATTLEFIELD, "Battlefield::GetGraveyardById Id:%u not existed", id); } else - sLog->outError(LOG_FILTER_GENERAL, "Battlefield::GetGraveyardById Id:%u cant be found", id); + sLog->outError(LOG_FILTER_BATTLEFIELD, "Battlefield::GetGraveyardById Id:%u cant be found", id); return NULL; } @@ -684,7 +684,7 @@ void BfGraveyard::SetSpirit(Creature* spirit, TeamId team) { if (!spirit) { - sLog->outError(LOG_FILTER_GENERAL, "BfGraveyard::SetSpirit: Invalid Spirit."); + sLog->outError(LOG_FILTER_BATTLEFIELD, "BfGraveyard::SetSpirit: Invalid Spirit."); return; } @@ -798,14 +798,14 @@ Creature* Battlefield::SpawnCreature(uint32 entry, float x, float y, float z, fl Map* map = const_cast < Map * >(sMapMgr->CreateBaseMap(m_MapId)); if (!map) { - sLog->outError(LOG_FILTER_GENERAL, "Battlefield::SpawnCreature: Can't create creature entry: %u map not found", entry); + sLog->outError(LOG_FILTER_BATTLEFIELD, "Battlefield::SpawnCreature: Can't create creature entry: %u map not found", entry); return 0; } Creature* creature = new Creature; if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, PHASEMASK_NORMAL, entry, 0, team, x, y, z, o)) { - sLog->outError(LOG_FILTER_GENERAL, "Battlefield::SpawnCreature: Can't create creature entry: %u", entry); + sLog->outError(LOG_FILTER_BATTLEFIELD, "Battlefield::SpawnCreature: Can't create creature entry: %u", entry); delete creature; return NULL; } @@ -1066,7 +1066,7 @@ bool BfCapturePoint::Update(uint32 diff) if (m_OldState != m_State) { - //sLog->outError(LOG_FILTER_GENERAL, "%u->%u", m_OldState, m_State); + //sLog->outError(LOG_FILTER_BATTLEFIELD, "%u->%u", m_OldState, m_State); if (oldTeam != m_team) ChangeTeam(oldTeam); return true; diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index 48d6b59d007..8e58dcdc5c0 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -238,7 +238,7 @@ void BattlefieldWG::OnBattleStart() m_titansRelic->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); } else - sLog->outError(LOG_FILTER_GENERAL, "WG: Failed to spawn titan relic."); + sLog->outError(LOG_FILTER_BATTLEFIELD, "WG: Failed to spawn titan relic."); // Update tower visibility and update faction @@ -490,7 +490,7 @@ uint8 BattlefieldWG::GetSpiritGraveyardId(uint32 areaId) case AREA_THE_CHILLED_QUAGMIRE: return BATTLEFIELD_WG_GY_HORDE; default: - sLog->outError(LOG_FILTER_GENERAL, "BattlefieldWG::GetSpiritGraveyardId: Unexpected Area Id %u", areaId); + sLog->outError(LOG_FILTER_BATTLEFIELD, "BattlefieldWG::GetSpiritGraveyardId: Unexpected Area Id %u", areaId); break; } diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h index 97807eb989c..924ff1ad454 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.h +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h @@ -26,11 +26,11 @@ #include "GroupMgr.h" #include "Battlefield.h" -const uint32 VehNumWorldState[2] = { 3680, 3490 }; -const uint32 MaxVehNumWorldState[2] = { 3681, 3491 }; -const uint32 ClockWorldState[2] = { 3781, 4354 }; -const uint32 WintergraspFaction[3] = { 1, 2, 35 }; -const float WintergraspStalkerPos[4] = { 0, 0, 0, 0 }; +uint32 const VehNumWorldState[2] = { 3680, 3490 }; +uint32 const MaxVehNumWorldState[2] = { 3681, 3491 }; +uint32 const ClockWorldState[2] = { 3781, 4354 }; +uint32 const WintergraspFaction[3] = { 1, 2, 35 }; +float const WintergraspStalkerPos[4] = { 0, 0, 0, 0 }; class BattlefieldWG; class WintergraspCapturePoint; @@ -81,11 +81,11 @@ enum WintergraspSpells SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA = 58730, // Phasing spells - SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT = 56618,// ADDS PHASE 16 - SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT = 56617,// ADDS PHASE 32 + SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT = 56618, // ADDS PHASE 16 + SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT = 56617, // ADDS PHASE 32 - SPELL_HORDE_CONTROL_PHASE_SHIFT = 55773,// ADDS PHASE 64 - SPELL_ALLIANCE_CONTROL_PHASE_SHIFT = 55774,// ADDS PHASE 128 + SPELL_HORDE_CONTROL_PHASE_SHIFT = 55773, // ADDS PHASE 64 + SPELL_ALLIANCE_CONTROL_PHASE_SHIFT = 55774, // ADDS PHASE 128 }; enum WintergraspData @@ -151,7 +151,7 @@ enum WintergraspAreaIds class BfGraveyardWG : public BfGraveyard { public: - BfGraveyardWG(BattlefieldWG *Bf); + BfGraveyardWG(BattlefieldWG* Bf); void SetTextId(uint32 textid) { m_GossipTextId = textid; } uint32 GetTextId() { return m_GossipTextId; } @@ -189,9 +189,9 @@ enum WintergraspNpcs BATTLEFIELD_WG_NPC_STALKER = 15214, BATTLEFIELD_WG_NPC_VIERON_BLAZEFEATHER = 31102, - BATTLEFIELD_WG_NPC_STONE_GUARD_MUKAR = 32296,// - BATTLEFIELD_WG_NPC_HOODOO_MASTER_FU_JIN = 31101,// - BATTLEFIELD_WG_NPC_CHAMPION_ROS_SLAI = 39173,// + BATTLEFIELD_WG_NPC_STONE_GUARD_MUKAR = 32296, // + BATTLEFIELD_WG_NPC_HOODOO_MASTER_FU_JIN = 31101, // + BATTLEFIELD_WG_NPC_CHAMPION_ROS_SLAI = 39173, // BATTLEFIELD_WG_NPC_COMMANDER_DARDOSH = 31091, BATTLEFIELD_WG_NPC_TACTICAL_OFFICER_KILRATH = 31151, BATTLEFIELD_WG_NPC_SIEGESMITH_STRONGHOOF = 31106, @@ -199,17 +199,17 @@ enum WintergraspNpcs BATTLEFIELD_WG_NPC_LIEUTENANT_MURP = 31107, BATTLEFIELD_WG_NPC_BOWYER_RANDOLPH = 31052, - BATTLEFIELD_WG_NPC_KNIGHT_DAMERON = 32294,// - BATTLEFIELD_WG_NPC_SORCERESS_KAYLANA = 31051,// - BATTLEFIELD_WG_NPC_MARSHAL_MAGRUDER = 39172,// + BATTLEFIELD_WG_NPC_KNIGHT_DAMERON = 32294, // + BATTLEFIELD_WG_NPC_SORCERESS_KAYLANA = 31051, // + BATTLEFIELD_WG_NPC_MARSHAL_MAGRUDER = 39172, // BATTLEFIELD_WG_NPC_COMMANDER_ZANNETH = 31036, BATTLEFIELD_WG_NPC_TACTICAL_OFFICER_AHBRAMIS = 31153, BATTLEFIELD_WG_NPC_SIEGE_MASTER_STOUTHANDLE = 31108, BATTLEFIELD_WG_NPC_ANCHORITE_TESSA = 31054, BATTLEFIELD_WG_NPC_SENIOR_DEMOLITIONIST_LEGOSO = 31109, - NPC_TAUNKA_SPIRIT_GUIDE = 31841, // Horde spirit guide for Wintergrasp - NPC_DWARVEN_SPIRIT_GUIDE = 31842, // Alliance spirit guide for Wintergrasp + NPC_TAUNKA_SPIRIT_GUIDE = 31841, // Horde spirit guide for Wintergrasp + NPC_DWARVEN_SPIRIT_GUIDE = 31842, // Alliance spirit guide for Wintergrasp NPC_TOWER_CANNON = 28366, NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE = 28312, @@ -434,14 +434,14 @@ class BattlefieldWG : public Battlefield GameObject* m_titansRelic; }; -const uint32 NORTHREND_WINTERGRASP = 4197; -const uint8 WG_MAX_OBJ = 32; -const uint8 WG_KEEPGAMEOBJECT_MAX = 44; -const uint8 WG_MAX_TURRET = 15; -const uint8 WG_MAX_KEEP_NPC = 39; -const uint8 WG_MAX_OUTSIDE_NPC = 14; -const uint8 WG_OUTSIDE_ALLIANCE_NPC = 7; -const uint8 WG_MAX_TELEPORTER = 12; +uint32 const NORTHREND_WINTERGRASP = 4197; +uint8 const WG_MAX_OBJ = 32; +uint8 const WG_KEEPGAMEOBJECT_MAX = 44; +uint8 const WG_MAX_TURRET = 15; +uint8 const WG_MAX_KEEP_NPC = 39; +uint8 const WG_MAX_OUTSIDE_NPC = 14; +uint8 const WG_OUTSIDE_ALLIANCE_NPC = 7; +uint8 const WG_MAX_TELEPORTER = 12; enum WintergraspGameObjectBuildingType { @@ -479,15 +479,15 @@ enum WintergraspWorkshopIds enum WintergraspWorldstates { - WORLDSTATE_WORKSHOP_NE = 3701, - WORLDSTATE_WORKSHOP_NW = 3700, - WORLDSTATE_WORKSHOP_SE = 3703, - WORLDSTATE_WORKSHOP_SW = 3702, - WORLDSTATE_WORKSHOP_K_W = 3698, - WORLDSTATE_WORKSHOP_K_E = 3699 + WORLDSTATE_WORKSHOP_NE = 3701, + WORLDSTATE_WORKSHOP_NW = 3700, + WORLDSTATE_WORKSHOP_SE = 3703, + WORLDSTATE_WORKSHOP_SW = 3702, + WORLDSTATE_WORKSHOP_K_W = 3698, + WORLDSTATE_WORKSHOP_K_E = 3699 }; -enum eWGTeamControl +enum WintergraspTeamControl { BATTLEFIELD_WG_TEAM_ALLIANCE, BATTLEFIELD_WG_TEAM_HORDE, @@ -495,7 +495,7 @@ enum eWGTeamControl }; // TODO: Handle this with creature_text ? -enum eWGText +enum WintergraspText { BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_NE = 12055, BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_NW = 12052, @@ -567,7 +567,8 @@ struct WintergraspBuildingSpawnData uint32 nameId; }; -const WintergraspBuildingSpawnData WGGameObjectBuilding[WG_MAX_OBJ] = { +const WintergraspBuildingSpawnData WGGameObjectBuilding[WG_MAX_OBJ] = +{ // Wall (Not spawned in db) // Entry WS X Y Z O type NameID { 190219, 3749, 5371.46f, 3047.47f, 407.571f, 3.14159f, BATTLEFIELD_WG_OBJECTTYPE_WALL, 0 }, @@ -659,7 +660,8 @@ const WintergraspBuildingSpawnData WGGameObjectBuilding[WG_MAX_OBJ] = { // 192357 : 1 in sql, 1 in header // 192350 : 1 in sql, 1 in header // 192351 : 1 in sql, 1 in header -const WintergraspObjectPositionData WGKeepGameObject[WG_KEEPGAMEOBJECT_MAX] = { +const WintergraspObjectPositionData WGKeepGameObject[WG_KEEPGAMEOBJECT_MAX] = +{ { 5262.540039f, 3047.949951f, 432.054993f, 3.106650f, 192488, 192501 }, // Flag on tower { 5272.939941f, 2976.550049f, 444.492004f, 3.124120f, 192374, 192416 }, // Flag on Wall Intersect { 5235.189941f, 2941.899902f, 444.278015f, 1.588250f, 192375, 192416 }, // Flag on Wall Intersect @@ -706,7 +708,8 @@ const WintergraspObjectPositionData WGKeepGameObject[WG_KEEPGAMEOBJECT_MAX] = { { 5271.279785f, 2820.159912f, 445.200989f, -3.13286f, 192351, 192416 } // Flag on wall intersect }; -const Position WGTurret[WG_MAX_TURRET] = { +const Position WGTurret[WG_MAX_TURRET] = +{ { 5391.19f, 3060.8f, 419.616f, 1.69557f }, { 5266.75f, 2976.5f, 421.067f, 3.20354f }, { 5234.86f, 2948.8f, 420.88f, 1.61311f }, @@ -841,7 +844,8 @@ struct WintergraspTowerData uint8 const WG_MAX_ATTACKTOWERS = 3; // 192414 : 0 in sql, 1 in header // 192278 : 0 in sql, 3 in header -const WintergraspTowerData AttackTowers[WG_MAX_ATTACKTOWERS] = { +const WintergraspTowerData AttackTowers[WG_MAX_ATTACKTOWERS] = +{ // West tower { 190356, @@ -1128,7 +1132,7 @@ const WGWorkshopData WorkshopsData[WG_MAX_WORKSHOP] = // Structure for different buildings that can be destroyed during battle struct BfWGGameObjectBuilding { - BfWGGameObjectBuilding(BattlefieldWG *WG) + BfWGGameObjectBuilding(BattlefieldWG* WG) { m_WG = WG; m_Team = 0; @@ -1143,7 +1147,7 @@ struct BfWGGameObjectBuilding uint8 m_Team; // WG object - BattlefieldWG *m_WG; + BattlefieldWG* m_WG; // Linked gameobject GameObject* m_Build; @@ -1254,7 +1258,7 @@ struct BfWGGameObjectBuilding m_WG->BrokenWallOrTower(TeamId(m_Team)); } - void Init(GameObject *go, uint32 type, uint32 worldstate, uint32 nameid) + void Init(GameObject* go, uint32 type, uint32 worldstate, uint32 nameid) { // GameObject associated to object m_Build = go; @@ -1612,7 +1616,7 @@ struct WintergraspWorkshopData GameObjectSet m_GameObjectOnPoint[2]; // Contain all Gameobject associate to this point uint32 m_NameId; // Id of trinity_string witch contain name of this node, using for alert message - WintergraspWorkshopData(BattlefieldWG * WG) + WintergraspWorkshopData(BattlefieldWG* WG) { m_WG = WG; m_Build = NULL; diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index b9ddabcf254..61b15bdd182 100755 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -343,7 +343,7 @@ void ArenaTeam::Disband(WorldSession* session) // Broadcast update if (session) { - BroadcastEvent(ERR_ARENA_TEAM_DISBANDED_S, 0, 2, session->GetPlayerName(), GetName(), ""); + BroadcastEvent(ERR_ARENA_TEAM_DISBANDED_S, 0, 2, session->GetPlayerName().c_str(), GetName(), ""); if (Player* player = session->GetPlayer()) sLog->outInfo(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u].", player->GetName(), player->GetGUIDLow(), GetType(), GetId()); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index d10e6a5dd90..98b95b5d32b 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1230,7 +1230,7 @@ void Battleground::AddOrSetPlayerToCorrectBgGroup(Player* player, uint32 team) if (group->IsMember(playerGuid)) { uint8 subgroup = group->GetMemberGroup(playerGuid); - player->SetBattlegroundRaid(group, subgroup); + player->SetBattlegroundOrBattlefieldRaid(group, subgroup); } else { diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 971716e24a1..e1b312d83d0 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -855,6 +855,13 @@ bool GameObject::IsDynTransport() const return gInfo->type == GAMEOBJECT_TYPE_MO_TRANSPORT || (gInfo->type == GAMEOBJECT_TYPE_TRANSPORT && !gInfo->transport.pause); } +bool GameObject::IsDestructibleBuilding() const +{ + GameObjectTemplate const* gInfo = GetGOInfo(); + if (!gInfo) return false; + return gInfo->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING; +} + Unit* GameObject::GetOwner() const { return ObjectAccessor::GetUnit(*this, GetOwnerGUID()); @@ -871,7 +878,7 @@ bool GameObject::IsAlwaysVisibleFor(WorldObject const* seer) const if (WorldObject::IsAlwaysVisibleFor(seer)) return true; - if (IsTransport()) + if (IsTransport() || IsDestructibleBuilding()) return true; if (!seer) diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 80aaf1c933f..b3efb47dd6f 100755 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -633,6 +633,7 @@ class GameObject : public WorldObject, public GridObject bool IsTransport() const; bool IsDynTransport() const; + bool IsDestructibleBuilding() const; uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index fb1a5ccb9b6..2ccb5b68bca 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2489,7 +2489,12 @@ void WorldObject::SetZoneScript() if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())) m_zoneScript = bf; else - m_zoneScript = sOutdoorPvPMgr->GetZoneScript(GetZoneId()); + { + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())) + m_zoneScript = bf; + else + m_zoneScript = sOutdoorPvPMgr->GetZoneScript(GetZoneId()); + } } } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 87dd1c51737..3ad14cb9c72 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5523,7 +5523,12 @@ void Player::RepopAtGraveyard() if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())) ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveYard(this); else - ClosestGrave = sObjectMgr->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam()); + { + if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())) + ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveYard(this); + else + ClosestGrave = sObjectMgr->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam()); + } } // stop countdown until repop @@ -7731,7 +7736,7 @@ void Player::CheckDuelDistance(time_t currTime) bool Player::IsOutdoorPvPActive() { - return isAlive() && !HasInvisibilityAura() && !HasStealthAura() && (IsPvP() || sWorld->IsPvPRealm()) && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && !isInFlight(); + return isAlive() && !HasInvisibilityAura() && !HasStealthAura() && IsPvP() && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && !isInFlight(); } void Player::DuelComplete(DuelCompleteType type) @@ -23464,7 +23469,7 @@ bool Player::isUsingLfg() return sLFGMgr->GetState(guid) != LFG_STATE_NONE; } -void Player::SetBattlegroundRaid(Group* group, int8 subgroup) +void Player::SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup) { //we must move references from m_group to m_originalGroup SetOriginalGroup(GetGroup(), GetSubGroup()); @@ -23474,7 +23479,7 @@ void Player::SetBattlegroundRaid(Group* group, int8 subgroup) m_group.setSubGroup((uint8)subgroup); } -void Player::RemoveFromBattlegroundRaid() +void Player::RemoveFromBattlegroundOrBattlefieldRaid() { //remove existing reference m_group.unlink(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index cd6334714df..09c7e0ff2a1 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2484,9 +2484,9 @@ class Player : public Unit, public GridObject Player* GetNextRandomRaidMember(float radius); PartyResult CanUninviteFromGroup() const; - // Battleground Group System - void SetBattlegroundRaid(Group* group, int8 subgroup = -1); - void RemoveFromBattlegroundRaid(); + // Battleground / Battlefield Group System + void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1); + void RemoveFromBattlegroundOrBattlefieldRaid(); Group* GetOriginalGroup() { return m_originalGroup.getTarget(); } GroupReference& GetOriginalGroupRef() { return m_originalGroup; } uint8 GetOriginalSubGroup() const { return m_originalGroup.getSubGroup(); } diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 213be5a21fe..95fc2364256 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -25,6 +25,8 @@ struct VehicleEntry; class Unit; +typedef std::set GuidSet; + class Vehicle { public: @@ -53,6 +55,7 @@ class Vehicle void RelocatePassengers(float x, float y, float z, float ang); void RemoveAllPassengers(); void Dismiss(); + void TeleportVehicle(float x, float y, float z, float ang); bool IsVehicleInUse() { return Seats.begin() != Seats.end(); } SeatMap Seats; @@ -65,6 +68,7 @@ class Vehicle Unit* _me; VehicleEntry const* _vehicleInfo; + GuidSet vehiclePlayers; uint32 _usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags uint32 _creatureEntry; // Can be different than me->GetBase()->GetEntry() in case of players }; diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 5b31c6bfff4..0a1b41eb292 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -191,6 +191,7 @@ class ObjectAccessor // ACCESS LIKE THAT IS NOT THREAD SAFE static Pet* FindPet(uint64); static Player* FindPlayer(uint64); + static Creature* FindCreature(uint64); static Unit* FindUnit(uint64); static Player* FindPlayerByName(const char* name); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 60dbe64f7f1..2e0843f54c9 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -104,7 +104,7 @@ bool Group::Create(Player* leader) m_leaderGuid = leaderGuid; m_leaderName = leader->GetName(); - m_groupType = isBGGroup() ? GROUPTYPE_BGRAID : GROUPTYPE_NORMAL; + m_groupType = (isBGGroup() || isBFGroup()) ? GROUPTYPE_BGRAID : GROUPTYPE_NORMAL; if (m_groupType & GROUPTYPE_RAID) _initRaidSubGroupsCounter(); @@ -116,7 +116,7 @@ bool Group::Create(Player* leader) m_dungeonDifficulty = DUNGEON_DIFFICULTY_NORMAL; m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL; - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { m_dungeonDifficulty = leader->GetDungeonDifficulty(); m_raidDifficulty = leader->GetRaidDifficulty(); @@ -232,7 +232,7 @@ void Group::ConvertToLFG() { m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_UNK1); m_lootMethod = NEED_BEFORE_GREED; - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_TYPE); @@ -251,7 +251,7 @@ void Group::ConvertToRaid() _initRaidSubGroupsCounter(); - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_TYPE); @@ -305,7 +305,7 @@ bool Group::AddInvite(Player* player) if (!player || player->GetGroupInvite()) return false; Group* group = player->GetGroup(); - if (group && group->isBGGroup()) + if (group && (group->isBGGroup() || group->isBFGroup())) group = player->GetOriginalGroup(); if (group) return false; @@ -402,8 +402,8 @@ bool Group::AddMember(Player* player) if (player) { player->SetGroupInvite(NULL); - if (player->GetGroup() && isBGGroup()) //if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid() - player->SetBattlegroundRaid(this, subGroup); + if (player->GetGroup() && (isBGGroup() || isBFGroup())) // if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid() + player->SetBattlegroundOrBattlefieldRaid(this, subGroup); else if (player->GetGroup()) //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup() player->SetOriginalGroup(this, subGroup); else //if player is not in group, then call set group @@ -422,7 +422,7 @@ bool Group::AddMember(Player* player) } // insert into the table if we're not a battleground group - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GROUP_MEMBER); @@ -441,7 +441,7 @@ bool Group::AddMember(Player* player) if (player) { - if (!IsLeader(player->GetGUID()) && !isBGGroup()) + if (!IsLeader(player->GetGUID()) && !isBGGroup() && !isBFGroup()) { // reset the new member's instances, unless he is currently in one of them // including raid/heroic instances that they are not permanently bound to! @@ -527,15 +527,15 @@ bool Group::RemoveMember(uint64 guid, const RemoveMethod &method /*= GROUP_REMOV if (isLFGGroup() && method == GROUP_REMOVEMETHOD_KICK) return m_memberSlots.size(); - // remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG allow 1 member group) - if (GetMembersCount() > ((isBGGroup() || isLFGGroup()) ? 1u : 2u)) + // remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group) + if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u)) { Player* player = ObjectAccessor::FindPlayer(guid); if (player) { // Battleground group handling - if (isBGGroup()) - player->RemoveFromBattlegroundRaid(); + if (isBGGroup() || isBFGroup()) + player->RemoveFromBattlegroundOrBattlefieldRaid(); else // Regular group { @@ -566,13 +566,13 @@ bool Group::RemoveMember(uint64 guid, const RemoveMethod &method /*= GROUP_REMOV } // Remove player from group in DB - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER); - - stmt->setUInt32(0, GUID_LOPART(guid)); - - CharacterDatabase.Execute(stmt); - - DelinkMember(guid); + if (!isBGGroup() && !isBFGroup()) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER); + stmt->setUInt32(0, GUID_LOPART(guid)); + CharacterDatabase.Execute(stmt); + DelinkMember(guid); + } // Reevaluate group enchanter if the leaving player had enchanting skill or the player is offline if ((player && player->GetSkillValue(SKILL_ENCHANTING)) || !player) @@ -663,7 +663,7 @@ void Group::ChangeLeader(uint64 guid) sScriptMgr->OnGroupChangeLeader(this, m_leaderGuid, guid); - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { // Remove the groups permanent instance bindings for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) @@ -723,8 +723,8 @@ void Group::Disband(bool hideDestroy /* = false */) //we cannot call _removeMember because it would invalidate member iterator //if we are removing player from battleground raid - if (isBGGroup()) - player->RemoveFromBattlegroundRaid(); + if (isBGGroup() || isBFGroup()) + player->RemoveFromBattlegroundOrBattlefieldRaid(); else { //we can remove player who is in battleground from his original group @@ -768,7 +768,7 @@ void Group::Disband(bool hideDestroy /* = false */) RemoveAllInvites(); - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -1540,7 +1540,7 @@ void Group::SendUpdateToPlayer(uint64 playerGUID, MemberSlot* slot) Player* member = ObjectAccessor::FindPlayer(citr->guid); uint8 onlineState = (member) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE; - onlineState = onlineState | ((isBGGroup()) ? MEMBER_STATUS_PVP : 0); + onlineState = onlineState | ((isBGGroup() || isBFGroup()) ? MEMBER_STATUS_PVP : 0); data << citr->name; data << uint64(citr->guid); // guid @@ -1645,7 +1645,7 @@ bool Group::_setMembersGroup(uint64 guid, uint8 group) SubGroupCounterIncrease(group); - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_MEMBER_SUBGROUP); @@ -1696,7 +1696,7 @@ void Group::ChangeMembersGroup(uint64 guid, uint8 group) SubGroupCounterDecrease(prevSubGroup); // Preserve new sub group in database for non-raid groups - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_MEMBER_SUBGROUP); @@ -1891,7 +1891,7 @@ void Roll::targetObjectBuildLink() void Group::SetDungeonDifficulty(Difficulty difficulty) { m_dungeonDifficulty = difficulty; - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_DIFFICULTY); @@ -1915,7 +1915,7 @@ void Group::SetDungeonDifficulty(Difficulty difficulty) void Group::SetRaidDifficulty(Difficulty difficulty) { m_raidDifficulty = difficulty; - if (!isBGGroup()) + if (!isBGGroup() && !isBFGroup()) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_RAID_DIFFICULTY); @@ -1951,7 +1951,7 @@ bool Group::InCombatToInstance(uint32 instanceId) void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo) { - if (isBGGroup()) + if (isBGGroup() || isBFGroup()) return; // method can be INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_GROUP_DISBAND @@ -2066,7 +2066,7 @@ InstanceGroupBind* Group::GetBoundInstance(MapEntry const* mapEntry) InstanceGroupBind* Group::BindToInstance(InstanceSave* save, bool permanent, bool load) { - if (!save || isBGGroup()) + if (!save || isBGGroup() || isBFGroup()) return NULL; InstanceGroupBind& bind = m_boundInstances[save->GetDifficulty()][save->GetMapId()]; diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index f11cdcdbcf4..e6da9caea32 100755 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -247,7 +247,7 @@ class Group void ConvertToGroup(); void SetBattlegroundGroup(Battleground* bg); - void SetBattlefieldGroup(Battlefield *bf); + void SetBattlefieldGroup(Battlefield* bf); GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot); void ChangeMembersGroup(uint64 guid, uint8 group); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 385bb8abb45..122102b76f3 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -247,7 +247,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recvData) if (GetSecurity() > SEC_PLAYER && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { sLog->outCommand(GetAccountId(), "GM %s (Account: %u) create auction: %s (Entry: %u Count: %u)", - GetPlayerName(), GetAccountId(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetCount()); + GetPlayerName().c_str(), GetAccountId(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetCount()); } AH->item_guidlow = item->GetGUIDLow(); @@ -293,7 +293,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recvData) if (GetSecurity() > SEC_PLAYER && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { sLog->outCommand(GetAccountId(), "GM %s (Account: %u) create auction: %s (Entry: %u Count: %u)", - GetPlayerName(), GetAccountId(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), newItem->GetCount()); + GetPlayerName().c_str(), GetAccountId(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), newItem->GetCount()); } AH->item_guidlow = newItem->GetGUIDLow(); diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index e46aa4c39b7..d1da504008e 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -34,8 +34,6 @@ #include "Opcodes.h" #include "DisableMgr.h" #include "Group.h" -#include "Battlefield.h" -#include "BattlefieldMgr.h" void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket & recvData) { @@ -561,53 +559,6 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/) } } -void WorldSession::HandleAreaSpiritHealerQueryOpcode(WorldPacket & recvData) -{ - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_AREA_SPIRIT_HEALER_QUERY"); - - Battleground* bg = _player->GetBattleground(); - - uint64 guid; - recvData >> guid; - - Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); - if (!unit) - return; - - if (!unit->isSpiritService()) // it's not spirit service - return; - - if (bg) - sBattlegroundMgr->SendAreaSpiritHealerQueryOpcode(_player, bg, guid); - - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) - bf->SendAreaSpiritHealerQueryOpcode(_player,guid); -} - -void WorldSession::HandleAreaSpiritHealerQueueOpcode(WorldPacket & recvData) -{ - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_AREA_SPIRIT_HEALER_QUEUE"); - - Battleground* bg = _player->GetBattleground(); - - uint64 guid; - recvData >> guid; - - Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); - if (!unit) - return; - - if (!unit->isSpiritService()) // it's not spirit service - return; - - if (bg) - bg->AddPlayerToResurrectQueue(guid, _player->GetGUID()); - - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) - bf->AddPlayerToResurrectQueue(guid, _player->GetGUID()); -} - - void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_BATTLEMASTER_JOIN_ARENA"); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 28f15a7377d..2ab2831c0d0 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -110,7 +110,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) type = CHAT_MSG_RAID_WARNING; break; default: - sLog->outInfo(LOG_FILTER_NETWORKIO, "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode()); + sLog->outError(LOG_FILTER_NETWORKIO, "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode()); recvData.hexlike(); return; } @@ -535,7 +535,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) type = CHAT_MSG_WHISPER; break; default: - sLog->outInfo(LOG_FILTER_NETWORKIO, "HandleAddonMessagechatOpcode: Unknown addon chat opcode (%u)", recvData.GetOpcode()); + sLog->outError(LOG_FILTER_NETWORKIO, "HandleAddonMessagechatOpcode: Unknown addon chat opcode (%u)", recvData.GetOpcode()); recvData.hexlike(); return; } diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 4d16fb27bec..f89fa2ab25e 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -305,7 +305,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (!AccountMgr::IsPlayerAccount(GetSecurity()) && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { sLog->outCommand(GetAccountId(), "GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) to player: %s (Account: %u)", - GetPlayerName(), GetAccountId(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetCount(), receiver.c_str(), rc_account); + GetPlayerName().c_str(), GetAccountId(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetCount(), receiver.c_str(), rc_account); } item->SetNotRefundable(GetPlayer()); // makes the item no longer refundable @@ -325,7 +325,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (money > 0 && !AccountMgr::IsPlayerAccount(GetSecurity()) && sWorld->getBoolConfig(CONFIG_GM_LOG_TRADE)) { sLog->outCommand(GetAccountId(), "GM %s (Account: %u) mail money: " UI64FMTD " to player: %s (Account: %u)", - GetPlayerName(), GetAccountId(), money, receiver.c_str(), rc_account); + GetPlayerName().c_str(), GetAccountId(), money, receiver.c_str(), rc_account); } } @@ -520,7 +520,7 @@ void WorldSession::HandleMailTakeItem(WorldPacket& recvData) sender_name = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); } sLog->outCommand(GetAccountId(), "GM %s (Account: %u) receive mail item: %s (Entry: %u Count: %u) and send COD money: " UI64FMTD " to player: %s (Account: %u)", - GetPlayerName(), GetAccountId(), it->GetTemplate()->Name1.c_str(), it->GetEntry(), it->GetCount(), m->COD, sender_name.c_str(), sender_accId); + GetPlayerName().c_str(), GetAccountId(), it->GetTemplate()->Name1.c_str(), it->GetEntry(), it->GetCount(), m->COD, sender_name.c_str(), sender_accId); } else if (!receive) sender_accId = sObjectMgr->GetPlayerAccountIdByGUID(sender_guid); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index c177d8b2888..677b3cccf82 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -52,6 +52,7 @@ #include "Group.h" #include "AccountMgr.h" #include "Spell.h" +#include "BattlegroundMgr.h" #include "Battlefield.h" #include "BattlefieldMgr.h" @@ -1727,6 +1728,53 @@ void WorldSession::SendSetPhaseShift(uint32 PhaseShift) SendPacket(&data); } +// Battlefield and Battleground +void WorldSession::HandleAreaSpiritHealerQueryOpcode(WorldPacket & recv_data) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_AREA_SPIRIT_HEALER_QUERY"); + + Battleground* bg = _player->GetBattleground(); + + uint64 guid; + recv_data >> guid; + + Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); + if (!unit) + return; + + if (!unit->isSpiritService()) // it's not spirit service + return; + + if (bg) + sBattlegroundMgr->SendAreaSpiritHealerQueryOpcode(_player, bg, guid); + + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) + bf->SendAreaSpiritHealerQueryOpcode(_player,guid); +} + +void WorldSession::HandleAreaSpiritHealerQueueOpcode(WorldPacket & recv_data) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_AREA_SPIRIT_HEALER_QUEUE"); + + Battleground* bg = _player->GetBattleground(); + + uint64 guid; + recv_data >> guid; + + Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); + if (!unit) + return; + + if (!unit->isSpiritService()) // it's not spirit service + return; + + if (bg) + bg->AddPlayerToResurrectQueue(guid, _player->GetGUID()); + + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) + bf->AddPlayerToResurrectQueue(guid, _player->GetGUID()); +} + void WorldSession::HandleHearthAndResurrect(WorldPacket& /*recvData*/) { if (_player->isInFlight()) @@ -1890,5 +1938,5 @@ void WorldSession::HandleUpdateMissileTrajectory(WorldPacket& recvPacket) recvPacket.ReadByteSeq(guid[5]); WorldObject* obj = ObjectAccessor::GetWorldObject(*GetPlayer(), guid); - sLog->outError(LOG_FILTER_NETWORKIO, "Object update failed for object "UI64FMTD" (%s) for player %s (%u)", uint64(guid), obj ? obj->GetName() : "object-not-found", GetPlayerName(), GetGuidLow()); + sLog->outError(LOG_FILTER_NETWORKIO, "Object update failed for object "UI64FMTD" (%s) for player %s (%u)", uint64(guid), obj ? obj->GetName() : "object-not-found", GetPlayerName().c_str(), GetGuidLow()); } diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 0337a60a459..5e6caec1f29 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -47,6 +47,7 @@ void AddSC_SmartSCripts(); void AddSC_account_commandscript(); void AddSC_achievement_commandscript(); void AddSC_ban_commandscript(); +void AddSC_bf_commandscript(); void AddSC_cast_commandscript(); void AddSC_character_commandscript(); void AddSC_debug_commandscript(); @@ -655,6 +656,7 @@ void AddCommandScripts() AddSC_account_commandscript(); AddSC_achievement_commandscript(); AddSC_ban_commandscript(); + AddSC_bf_commandscript(); AddSC_cast_commandscript(); AddSC_character_commandscript(); AddSC_debug_commandscript(); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 589eb6fc179..e3f550c5f48 100755 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -723,14 +723,6 @@ bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effInd return tmpscript->OnDummyEffect(caster, spellId, effIndex, target); } -GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* go) -{ - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, NULL); - return tmpscript->GetAI(go); -} - bool ScriptMgr::OnQuestAccept(Player* player, Item* item, Quest const* quest) { ASSERT(player); @@ -861,6 +853,14 @@ CreatureAI* ScriptMgr::GetCreatureAI(Creature* creature) return tmpscript->GetAI(creature); } +GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject) +{ + ASSERT(gameobject); + + GET_SCRIPT_RET(GameObjectScript, gameobject->GetScriptId(), tmpscript, NULL); + return tmpscript->GetAI(gameobject); +} + void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff) { ASSERT(creature); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 6c27c49bf79..43e4ddfb9e4 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1466,5 +1466,14 @@ inline const char* LookupOpcodeName(Opcodes id) return "INVALID OPCODE"; } + +inline std::string GetOpcodeNameForLogging(Opcodes id) +{ + uint32 opcode = uint32(id); + std::ostringstream ss; + ss << '[' << LookupOpcodeName(id) << " 0x" << std::hex << std::uppercase << opcode << std::nouppercase << " (" << std::dec << opcode << ")]"; + return ss.str().c_str(); +} + #endif /// @} diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 92db86c2a35..e2755d3d1f7 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -163,16 +163,29 @@ WorldSession::~WorldSession() delete _compressionStream; } -void WorldSession::SizeError(WorldPacket const& packet, uint32 size) const -{ - sLog->outError(LOG_FILTER_GENERAL, "Client (account %u) send packet %s (%u) with size " SIZEFMTD " but expected %u (attempt to crash server?), skipped", - GetAccountId(), LookupOpcodeName(packet.GetOpcode()), packet.GetOpcode(), packet.size(), size); -} - /// Get the player name -char const* WorldSession::GetPlayerName() const -{ - return GetPlayer() ? GetPlayer()->GetName() : ""; +std::string WorldSession::GetPlayerName(bool simple /* = true */) const + { + std::string name = "[Player: "; + uint32 guidLow = 0; + + if (Player* player = GetPlayer()) + { + name.append(player->GetName()); + guidLow = player->GetGUIDLow(); + } + else + name.append(""); + + if (!simple) + { + std::ostringstream ss; + ss << " (Guid: " << guidLow << ", Account: " << GetAccountId() << ")"; + name.append(ss.str()); + } + + name.append("]"); + return name; } /// Get player guid if available. Use for logging purposes only @@ -249,16 +262,15 @@ void WorldSession::QueuePacket(WorldPacket* new_packet) /// Logging helper for unexpected opcodes void WorldSession::LogUnexpectedOpcode(WorldPacket* packet, const char* status, const char *reason) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION (account: %u, guidlow: %u, char: %s): received unexpected opcode %s (0x%.4X, status: %s) %s", - GetAccountId(), m_GUIDLow, _player ? _player->GetName() : "", - LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode(), status, reason); + sLog->outError(LOG_FILTER_OPCODES, "Received unexpected opcode %s Status: %s Reason: %s from %s", + GetOpcodeNameForLogging(packet->GetOpcode()).c_str(), status, reason, GetPlayerName(false).c_str()); } /// Logging helper for unexpected opcodes void WorldSession::LogUnprocessedTail(WorldPacket* packet) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION: opcode %s (0x%.4X) have unprocessed tail data (read stop at %u from %u)", - LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode(), uint32(packet->rpos()), uint32(packet->wpos())); + sLog->outError(LOG_FILTER_OPCODES, "Unprocessed tail data (read stop at %u from %u) Opcode %s from %s", + uint32(packet->rpos()), uint32(packet->wpos()), GetOpcodeNameForLogging(packet->GetOpcode()).c_str(), GetPlayerName(false).c_str()); packet->print_storage(); } @@ -290,6 +302,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) _recvQueue.next(packet, updater)) { const OpcodeHandler* opHandle = opcodeTable[packet->GetOpcode()]; + try { switch (opHandle->status) @@ -309,8 +322,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) deletePacket = false; QueuePacket(packet); //! Log - sLog->outDebug(LOG_FILTER_NETWORKIO, "Re-enqueueing packet with opcode %s (0x%.4X) with with status STATUS_LOGGEDIN. " - "Player is currently not in world yet.", opHandle->name, packet->GetOpcode()); + sLog->outDebug(LOG_FILTER_NETWORKIO, "Re-enqueueing packet with opcode %s with with status STATUS_LOGGEDIN. " + "Player is currently not in world yet.", GetOpcodeNameForLogging(packet->GetOpcode()).c_str()); } } else if (_player->IsInWorld()) @@ -367,14 +380,12 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) LogUnprocessedTail(packet); break; case STATUS_NEVER: - sLog->outError(LOG_FILTER_NETWORKIO, "SESSION (account: %u, guidlow: %u, char: %s): received not allowed opcode %s (0x%.4X)", - GetAccountId(), m_GUIDLow, _player ? _player->GetName() : "", - LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode()); + sLog->outError(LOG_FILTER_OPCODES, "Received not allowed opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() + , GetPlayerName(false).c_str()); break; case STATUS_UNHANDLED: - sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION (account: %u, guidlow: %u, char: %s): received not handled opcode %s (0x%.4X)", - GetAccountId(), m_GUIDLow, _player ? _player->GetName() : "", - LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode()); + sLog->outDebug(LOG_FILTER_OPCODES, "Received not handled opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() + , GetPlayerName(false).c_str()); break; } } @@ -382,11 +393,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) { sLog->outError(LOG_FILTER_NETWORKIO, "WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.", packet->GetOpcode(), GetRemoteAddress().c_str(), GetAccountId()); - if (sLog->ShouldLog(LOG_FILTER_NETWORKIO, LOG_LEVEL_TRACE)) - { - sLog->outTrace(LOG_FILTER_NETWORKIO, "Dumping error causing packet:"); - packet->hexlike(); - } + packet->hexlike(); } if (deletePacket) @@ -648,30 +655,26 @@ const char *WorldSession::GetTrinityString(int32 entry) const void WorldSession::Handle_NULL(WorldPacket& recvPacket) { - sLog->outError(LOG_FILTER_GENERAL, "SESSION: received unhandled opcode %s (0x%.4X)", - LookupOpcodeName(recvPacket.GetOpcode()), - recvPacket.GetOpcode()); + sLog->outError(LOG_FILTER_OPCODES, "Received unhandled opcode %s from %s" + , GetOpcodeNameForLogging(recvPacket.GetOpcode()).c_str(), GetPlayerName(false).c_str()); } void WorldSession::Handle_EarlyProccess(WorldPacket& recvPacket) { - sLog->outError(LOG_FILTER_GENERAL, "SESSION: received opcode %s (0x%.4X) that must be processed in WorldSocket::OnRead", - LookupOpcodeName(recvPacket.GetOpcode()), - recvPacket.GetOpcode()); + sLog->outError(LOG_FILTER_OPCODES, "Received opcode %s that must be processed in WorldSocket::OnRead from %s" + , GetOpcodeNameForLogging(recvPacket.GetOpcode()).c_str(), GetPlayerName(false).c_str()); } void WorldSession::Handle_ServerSide(WorldPacket& recvPacket) { - sLog->outError(LOG_FILTER_GENERAL, "SESSION: received server-side opcode %s (0x%.4X)", - LookupOpcodeName(recvPacket.GetOpcode()), - recvPacket.GetOpcode()); + sLog->outError(LOG_FILTER_OPCODES, "Received server-side opcode %s from %s" + , GetOpcodeNameForLogging(recvPacket.GetOpcode()).c_str(), GetPlayerName(false).c_str()); } void WorldSession::Handle_Deprecated(WorldPacket& recvPacket) { - sLog->outError(LOG_FILTER_GENERAL, "SESSION: received deprecated opcode %s (0x%.4X)", - LookupOpcodeName(recvPacket.GetOpcode()), - recvPacket.GetOpcode()); + sLog->outError(LOG_FILTER_OPCODES, "Received deprecated opcode %s from %s" + , GetOpcodeNameForLogging(recvPacket.GetOpcode()).c_str(), GetPlayerName(false).c_str()); } void WorldSession::SendAuthWaitQue(uint32 position) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 78af675a348..53398de8c65 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -240,8 +240,6 @@ class WorldSession bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; } bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } - void SizeError(WorldPacket const& packet, uint32 size) const; - void ReadAddonsInfo(WorldPacket& data); void SendAddonsInfo(); bool IsAddonRegistered(const std::string& prefix) const; @@ -264,7 +262,7 @@ class WorldSession AccountTypes GetSecurity() const { return _security; } uint32 GetAccountId() const { return _accountId; } Player* GetPlayer() const { return _player; } - char const* GetPlayerName() const; + std::string GetPlayerName(bool simple = true) const; uint32 GetGuidLow() const; void SetSecurity(AccountTypes security) { _security = security; } std::string const& GetRemoteAddress() { return m_Address; } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 783d53562a2..8211f846f7d 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -173,7 +173,7 @@ int WorldSocket::SendPacket(WorldPacket const& pct) pkt = &buff; } - sLog->outInfo(LOG_FILTER_OPCODES, "S->C: %s 0x%.4X (%u)", LookupOpcodeName(pkt->GetOpcode()), uint32(pkt->GetOpcode()), uint32(pkt->GetOpcode())); + sLog->outInfo(LOG_FILTER_OPCODES, "S->C: %s", GetOpcodeNameForLogging(pkt->GetOpcode()).c_str()); sScriptMgr->OnPacketSend(this, *pkt); @@ -204,7 +204,7 @@ int WorldSocket::SendPacket(WorldPacket const& pct) if (msg_queue()->enqueue_tail(mb, (ACE_Time_Value*)&ACE_Time_Value::zero) == -1) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::SendPacket enqueue_tail failed"); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::SendPacket enqueue_tail failed"); mb->release(); return -1; } @@ -247,7 +247,7 @@ int WorldSocket::open (void *a) if (peer().get_remote_addr(remote_addr) == -1) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::open: peer().get_remote_addr errno = %s", ACE_OS::strerror (errno)); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::open: peer().get_remote_addr errno = %s", ACE_OS::strerror (errno)); return -1; } @@ -264,7 +264,7 @@ int WorldSocket::open (void *a) // Register with ACE Reactor if (reactor()->register_handler(this, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK) == -1) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::open: unable to register client handler errno = %s", ACE_OS::strerror (errno)); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::open: unable to register client handler errno = %s", ACE_OS::strerror (errno)); return -1; } @@ -300,14 +300,14 @@ int WorldSocket::handle_input (ACE_HANDLE) return Update(); // interesting line, isn't it ? } - sLog->outDebug(LOG_FILTER_GENERAL, "WorldSocket::handle_input: Peer error closing connection errno = %s", ACE_OS::strerror (errno)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::handle_input: Peer error closing connection errno = %s", ACE_OS::strerror (errno)); errno = ECONNRESET; return -1; } case 0: { - sLog->outDebug(LOG_FILTER_GENERAL, "WorldSocket::handle_input: Peer has closed connection"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::handle_input: Peer has closed connection"); errno = ECONNRESET; return -1; @@ -376,7 +376,7 @@ int WorldSocket::handle_output_queue (GuardType& g) if (msg_queue()->dequeue_head(mblk, (ACE_Time_Value*)&ACE_Time_Value::zero) == -1) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::handle_output_queue dequeue_head"); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::handle_output_queue dequeue_head"); return -1; } @@ -411,7 +411,7 @@ int WorldSocket::handle_output_queue (GuardType& g) if (msg_queue()->enqueue_head(mblk, (ACE_Time_Value*) &ACE_Time_Value::zero) == -1) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::handle_output_queue enqueue_head"); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::handle_output_queue enqueue_head"); mblk->release(); return -1; } @@ -483,7 +483,7 @@ int WorldSocket::handle_input_header (void) if ((header.size < 4) || (header.size > 10240) || (header.cmd > 0xFFFF && (header.cmd >> 16) != 0x4C52)) // LR (from MSG_VERIFY_CONNECTIVITY) { Player* _player = m_Session ? m_Session->GetPlayer() : NULL; - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::handle_input_header(): client (account: %u, char [GUID: %u, name: %s]) sent malformed packet (size: %d, cmd: %d)", + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::handle_input_header(): client (account: %u, char [GUID: %u, name: %s]) sent malformed packet (size: %d, cmd: %d)", m_Session ? m_Session->GetAccountId() : 0, _player ? _player->GetGUIDLow() : 0, _player ? _player->GetName() : "", @@ -589,7 +589,7 @@ int WorldSocket::handle_input_missing_data (void) // hope this is not hack, as proper m_RecvWPct is asserted around if (!m_RecvWPct) { - sLog->outError(LOG_FILTER_GENERAL, "Forcing close on input m_RecvWPct = NULL"); + sLog->outError(LOG_FILTER_NETWORKIO, "Forcing close on input m_RecvWPct = NULL"); errno = EINVAL; return -1; } @@ -635,7 +635,7 @@ int WorldSocket::cancel_wakeup_output (GuardType& g) (this, ACE_Event_Handler::WRITE_MASK) == -1) { // would be good to store errno from reactor with errno guard - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::cancel_wakeup_output"); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::cancel_wakeup_output"); return -1; } @@ -654,7 +654,7 @@ int WorldSocket::schedule_wakeup_output (GuardType& g) if (reactor()->schedule_wakeup (this, ACE_Event_Handler::WRITE_MASK) == -1) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::schedule_wakeup_output"); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::schedule_wakeup_output"); return -1; } @@ -668,7 +668,7 @@ int WorldSocket::ProcessIncoming(WorldPacket* new_pct) // manage memory ;) ACE_Auto_Ptr aptr(new_pct); - const ACE_UINT16 opcode = PacketFilter::DropHighBytes(new_pct->GetOpcode()); + Opcodes opcode = PacketFilter::DropHighBytes(new_pct->GetOpcode()); if (closing_) return -1; @@ -677,7 +677,8 @@ int WorldSocket::ProcessIncoming(WorldPacket* new_pct) if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(*new_pct, CLIENT_TO_SERVER); - sLog->outInfo(LOG_FILTER_OPCODES, "C->S: %s 0x%.4X (%u)", LookupOpcodeName(Opcodes(opcode)), uint32(Opcodes(opcode)), uint32(Opcodes(opcode))); + char const* opcodeName = GetOpcodeNameForLogging(opcode).c_str(); + sLog->outInfo(LOG_FILTER_OPCODES, "C->S: %s", opcodeName); try { @@ -688,26 +689,26 @@ int WorldSocket::ProcessIncoming(WorldPacket* new_pct) case CMSG_AUTH_SESSION: if (m_Session) { - sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::ProcessIncoming: Player send CMSG_AUTH_SESSION again"); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", m_Session->GetPlayerName(false).c_str()); return -1; } sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct)); return HandleAuthSession(*new_pct); case CMSG_KEEP_ALIVE: - sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_KEEP_ALIVE, size: " UI64FMTD, uint64(new_pct->size())); + sLog->outDebug(LOG_FILTER_NETWORKIO, "%s", GetOpcodeNameForLogging(opcode).c_str()); sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct)); return 0; case CMSG_LOG_DISCONNECT: new_pct->rfinish(); // contains uint32 disconnectReason; - sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_LOG_DISCONNECT , size: " UI64FMTD, uint64(new_pct->size())); + sLog->outDebug(LOG_FILTER_NETWORKIO, "%s", opcodeName); sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct)); return 0; // not an opcode, client sends string "WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER" without opcode // first 4 bytes become the opcode (2 dropped) case MSG_VERIFY_CONNECTIVITY: { - sLog->outInfo(LOG_FILTER_NETWORKIO, "MSG_VERIFY_CONNECTIVITY , size: " UI64FMTD, uint64(new_pct->size())); + sLog->outDebug(LOG_FILTER_NETWORKIO, "%s", opcodeName); sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct)); std::string str; *new_pct >> str; @@ -717,48 +718,43 @@ int WorldSocket::ProcessIncoming(WorldPacket* new_pct) } case CMSG_ENABLE_NAGLE: { + sLog->outDebug(LOG_FILTER_NETWORKIO, "%s", opcodeName); sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct)); return m_Session ? m_Session->HandleEnableNagleAlgorithm() : -1; } default: { ACE_GUARD_RETURN(LockType, Guard, m_SessionLock, -1); - if (!opcodeTable[Opcodes(opcode)]) + if (!m_Session) { - sLog->outError(LOG_FILTER_NETWORKIO, "Opcode with no defined handler received from client: %u", new_pct->GetOpcode()); - return 0; - } - if (m_Session != NULL) - { - // Our Idle timer will reset on any non PING opcodes. - // Catches people idling on the login screen and any lingering ingame connections. - m_Session->ResetTimeOutTime(); - - // OK, give the packet to WorldSession - aptr.release(); - // WARNINIG here we call it with locks held. - // Its possible to cause deadlock if QueuePacket calls back - m_Session->QueuePacket(new_pct); - return 0; + sLog->outError(LOG_FILTER_NETWORKIO, "ProcessIncoming: Client not authed opcode = %u", uint32(opcode)); + return -1; } - else + + if (!opcodeTable[opcode]) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::ProcessIncoming: Client not authed opcode = %u", uint32(opcode)); + sLog->outError(LOG_FILTER_NETWORKIO, "ProcessIncoming: Client not authed opcode = %u", uint32(opcode)); return -1; } + + // Our Idle timer will reset on any non PING opcodes. + // Catches people idling on the login screen and any lingering ingame connections. + m_Session->ResetTimeOutTime(); + + // OK, give the packet to WorldSession + aptr.release(); + // WARNINIG here we call it with locks held. + // Its possible to cause deadlock if QueuePacket calls back + m_Session->QueuePacket(new_pct); + return 0; } } } catch (ByteBufferException &) { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::ProcessIncoming ByteBufferException occured while parsing an instant handled packet (opcode: %u) from client %s, accountid=%i. Disconnected client.", - opcode, GetRemoteAddress().c_str(), m_Session ? int32(m_Session->GetAccountId()) : -1); - if (sLog->ShouldLog(LOG_FILTER_NETWORKIO, LOG_LEVEL_DEBUG)) - { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Dumping error causing packet:"); - new_pct->hexlike(); - } - + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::ProcessIncoming ByteBufferException occured while parsing an instant handled packet (opcode: %u) from client %s, accountid=%i. Disconnected client.", + opcodeName, GetRemoteAddress().c_str(), m_Session ? int32(m_Session->GetAccountId()) : -1); + new_pct->hexlike(); return -1; } @@ -840,7 +836,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) packet << uint8(AUTH_REJECT); SendPacket(packet); - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: World closed, denying client (%s).", GetRemoteAddress().c_str()); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: World closed, denying client (%s).", GetRemoteAddress().c_str()); return -1; } @@ -861,7 +857,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) SendPacket(packet); - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: Sent Auth Response (unknown account)."); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Sent Auth Response (unknown account)."); return -1; } @@ -872,7 +868,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) if (expansion > world_expansion) expansion = world_expansion; - sLog->outDebug(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: (s,v) check s: %s v: %s", + sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: (s,v) check s: %s v: %s", fields[5].GetCString(), fields[4].GetCString()); @@ -887,7 +883,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) packet << uint8(AUTH_FAILED); SendPacket(packet); - sLog->outDebug(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs)."); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs)."); return -1; } } @@ -953,7 +949,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) packet << uint8(AUTH_BANNED); SendPacket(packet); - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: Sent Auth Response (Account banned)."); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Sent Auth Response (Account banned)."); return -1; } @@ -969,7 +965,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) SendPacket(packet); - sLog->outInfo(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); + sLog->outInfo(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); return -1; } @@ -994,11 +990,11 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) packet << uint8(AUTH_FAILED); SendPacket(packet); - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", id, account.c_str(), address.c_str()); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", id, account.c_str(), address.c_str()); return -1; } - sLog->outDebug(LOG_FILTER_GENERAL, "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.", + sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.", account.c_str(), address.c_str()); @@ -1073,12 +1069,8 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket) if (m_Session && AccountMgr::IsPlayerAccount(m_Session->GetSecurity())) { - Player* _player = m_Session->GetPlayer(); - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::HandlePing: Player (account: %u, GUID: %u, name: %s) kicked for over-speed pings (address: %s)", - m_Session->GetAccountId(), - _player ? _player->GetGUIDLow() : 0, - _player ? _player->GetName() : "", - GetRemoteAddress().c_str()); + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::HandlePing: %s kicked for over-speed pings (address: %s)", + m_Session->GetPlayerName(false).c_str(), GetRemoteAddress().c_str()); return -1; } @@ -1096,7 +1088,7 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket) m_Session->SetLatency (latency); else { - sLog->outError(LOG_FILTER_GENERAL, "WorldSocket::HandlePing: peer sent CMSG_PING, " + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::HandlePing: peer sent CMSG_PING, " "but is not authenticated or got recently kicked, " " address = %s", GetRemoteAddress().c_str()); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e9c498392ee..be18785e76e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -4923,7 +4923,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool { if (Battleground* bg = target->ToPlayer()->GetBattleground()) bg->RemovePlayerFromResurrectQueue(target->GetGUID()); - if(Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId())) + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId())) bf->RemovePlayerFromResurrectQueue(target->GetGUID()); } break; @@ -4962,6 +4962,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool target->CastSpell((Unit*)NULL, GetAmount(), true, NULL, this); break; case 58600: // Restricted Flight Area + case 58730: // Restricted Flight Area if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) target->CastSpell(target, 58601, true); break; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 46f735d26f1..ed8a4252128 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5439,8 +5439,8 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_originalCaster && m_originalCaster->GetTypeId() == TYPEID_PLAYER && m_originalCaster->isAlive()) { Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(m_originalCaster->GetZoneId()); - if (AreaTableEntry const* pArea = GetAreaEntryByAreaID(m_originalCaster->GetAreaId())) - if (pArea->flags & AREA_FLAG_NO_FLY_ZONE) + if (AreaTableEntry const* area = GetAreaEntryByAreaID(m_originalCaster->GetAreaId())) + if (area->flags & AREA_FLAG_NO_FLY_ZONE || (Bf && !Bf->CanFlyIn())) return (_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_DONT_REPORT : SPELL_FAILED_NOT_HERE; } break; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d1af1832ce4..be5d4e3fa74 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5928,6 +5928,7 @@ void Spell::EffectPlayerNotification(SpellEffIndex effIndex) case 58730: // Restricted Flight Area case 58600: // Restricted Flight Area unitTarget->ToPlayer()->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE); + unitTarget->PlayDirectSound(9417); // Fel Reaver sound break; } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 4cc72cc3660..03824cf7dc9 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3249,6 +3249,22 @@ void SpellMgr::LoadDbcDataCorrections() // this needs research on modifier applying rules, does not seem to be in Attributes fields spellInfo->EffectSpellClassMask[0] = flag96(0x00000040, 0x00000000, 0x00000000); break; + case 64949: // Idol of the Flourishing Life + spellInfo->EffectSpellClassMask[EFFECT_0] = flag96(0x00000000, 0x02000000, 0x00000000); + spellInfo->EffectApplyAuraName[EFFECT_0] = SPELL_AURA_ADD_FLAT_MODIFIER; + break; + case 34231: // Libram of the Lightbringer + case 60792: // Libram of Tolerance + case 64956: // Libram of the Resolute + spellInfo->EffectSpellClassMask[EFFECT_0] = flag96(0x80000000, 0x00000000, 0x00000000); + spellInfo->EffectApplyAuraName[EFFECT_0] = SPELL_AURA_ADD_FLAT_MODIFIER; + break; + case 28851: // Libram of Light + case 28853: // Libram of Divinity + case 32403: // Blessed Book of Nagrand + spellInfo->EffectSpellClassMask[EFFECT_0] = flag96(0x40000000, 0x00000000, 0x00000000); + spellInfo->EffectApplyAuraName[EFFECT_0] = SPELL_AURA_ADD_FLAT_MODIFIER; + break; case 45602: // Ride Carpet spellInfo->EffectBasePoints[EFFECT_0] = 0; // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)" break; diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 06f11cfaa2c..d651fbd4ce1 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -105,9 +105,8 @@ void Warden::Update() // Kick player if client response delays more than set in config if (_clientResponseTimer > maxClientResponseDelay * IN_MILLISECONDS) { - sLog->outDebug(LOG_FILTER_WARDEN, "WARDEN: Player %s (guid: %u, account: %u, latency: %u, IP: %s) exceeded Warden module response delay for more than %s - disconnecting client", - _session->GetPlayerName(), _session->GetGuidLow(), _session->GetAccountId(), _session->GetLatency(), _session->GetRemoteAddress().c_str(), - secsToTimeString(maxClientResponseDelay, true).c_str()); + sLog->outWarn(LOG_FILTER_WARDEN, "%s (latency: %u, IP: %s) exceeded Warden module response delay for more than %s - disconnecting client", + _session->GetPlayerName(false).c_str(), _session->GetLatency(), _session->GetRemoteAddress().c_str(), secsToTimeString(maxClientResponseDelay, true).c_str()); _session->KickPlayer(); } else diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp index 96b71912421..9c90662105a 100644 --- a/src/server/game/Warden/WardenMac.cpp +++ b/src/server/game/Warden/WardenMac.cpp @@ -152,9 +152,7 @@ void WardenMac::HandleHashResult(ByteBuffer &buff) // Verify key if (memcmp(buff.contents() + 1, sha1.GetDigest(), 20) != 0) { - sLog->outDebug(LOG_FILTER_WARDEN, "Request hash reply: failed"); - sLog->outDebug(LOG_FILTER_WARDEN, "WARDEN: Player %s (guid: %u, account: %u) failed hash reply. Action: %s", - _session->GetPlayerName(), _session->GetGuidLow(), _session->GetAccountId(), Penalty().c_str()); + sLog->outWarn(LOG_FILTER_WARDEN, "%s failed hash reply. Action: %s", _session->GetPlayerName(false).c_str(), Penalty().c_str()); return; } diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index 7aea6794e01..20f09ec5bda 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -156,9 +156,7 @@ void WardenWin::HandleHashResult(ByteBuffer &buff) // Verify key if (memcmp(buff.contents() + 1, Module.ClientKeySeedHash, 20) != 0) { - sLog->outDebug(LOG_FILTER_WARDEN, "Request hash reply: failed"); - sLog->outDebug(LOG_FILTER_WARDEN, "WARDEN: Player %s (guid: %u, account: %u) failed hash reply. Action: %s", - _session->GetPlayerName(), _session->GetGuidLow(), _session->GetAccountId(), Penalty().c_str()); + sLog->outWarn(LOG_FILTER_WARDEN, "%s failed hash reply. Action: %s", _session->GetPlayerName(false).c_str(), Penalty().c_str()); return; } @@ -343,9 +341,7 @@ void WardenWin::HandleData(ByteBuffer &buff) if (!IsValidCheckSum(Checksum, buff.contents() + buff.rpos(), Length)) { buff.rpos(buff.wpos()); - sLog->outDebug(LOG_FILTER_WARDEN, "CHECKSUM FAIL"); - sLog->outDebug(LOG_FILTER_WARDEN, "WARDEN: Player %s (guid: %u, account: %u) failed checksum. Action: %s", - _session->GetPlayerName(), _session->GetGuidLow(), _session->GetAccountId(), Penalty().c_str()); + sLog->outWarn(LOG_FILTER_WARDEN, "%s failed checksum. Action: %s", _session->GetPlayerName(false).c_str(), Penalty().c_str()); return; } @@ -356,9 +352,7 @@ void WardenWin::HandleData(ByteBuffer &buff) // TODO: test it. if (result == 0x00) { - sLog->outDebug(LOG_FILTER_WARDEN, "TIMING CHECK FAIL result 0x00"); - sLog->outDebug(LOG_FILTER_WARDEN, "WARDEN: Player %s (guid: %u, account: %u) failed timing check. Action: %s", - _session->GetPlayerName(), _session->GetGuidLow(), _session->GetAccountId(), Penalty().c_str()); + sLog->outWarn(LOG_FILTER_WARDEN, "%s failed timing check. Action: %s", _session->GetPlayerName(false).c_str(), Penalty().c_str()); return; } @@ -500,9 +494,7 @@ void WardenWin::HandleData(ByteBuffer &buff) if (checkFailed > 0) { WardenCheck* check = sWardenCheckMgr->GetWardenDataById(checkFailed); - - sLog->outDebug(LOG_FILTER_WARDEN, "WARDEN: Player %s (guid: %u, account: %u) failed Warden check %u. Action: %s", - _session->GetPlayerName(), _session->GetGuidLow(), _session->GetAccountId(), checkFailed, Penalty(check).c_str()); + sLog->outWarn(LOG_FILTER_WARDEN, "%s failed Warden check %u. Action: %s", _session->GetPlayerName(false).c_str(), checkFailed, Penalty(check).c_str()); } // Set hold off timer, minimum timer should at least be 1 second diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 273820d02ff..e7c140c01b8 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1720,7 +1720,7 @@ void World::SetInitialWorldSettings() sOutdoorPvPMgr->InitOutdoorPvP(); ///- Initialize Battlefield - sLog->outInfo(LOG_FILTER_GENERAL, "Starting Battlefield System"); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Starting Battlefield System"); sBattlefieldMgr->InitBattlefield(); sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Transports..."); diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt index bd439c2c473..d5ebeab3b8a 100644 --- a/src/server/scripts/Commands/CMakeLists.txt +++ b/src/server/scripts/Commands/CMakeLists.txt @@ -13,6 +13,7 @@ set(scripts_STAT_SRCS Commands/cs_account.cpp Commands/cs_achievement.cpp Commands/cs_ban.cpp + Commands/cs_bf.cpp Commands/cs_cast.cpp Commands/cs_character.cpp Commands/cs_debug.cpp diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index b84a7e5544a..bfb52d342e1 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -107,7 +107,7 @@ public: return false; } - switch (sWorld->BanCharacter(name, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : "")) + switch (sWorld->BanCharacter(name, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "")) { case BAN_SUCCESS: { @@ -183,7 +183,7 @@ public: break; } - switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : "")) + switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "")) { case BAN_SUCCESS: if (atoi(durationStr) > 0) diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 2472a29e595..7e489a5781e 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -38,6 +38,7 @@ public: { "add", SEC_ADMINISTRATOR, false, &HandleQuestAdd, "", NULL }, { "complete", SEC_ADMINISTRATOR, false, &HandleQuestComplete, "", NULL }, { "remove", SEC_ADMINISTRATOR, false, &HandleQuestRemove, "", NULL }, + { "reward", SEC_ADMINISTRATOR, false, &HandleQuestReward, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = @@ -77,7 +78,7 @@ public: // check item starting quest (it can work incorrectly if added without item in inventory) ItemTemplateContainer const* itc = sObjectMgr->GetItemTemplateStore(); - ItemTemplateContainer::const_iterator result = find_if (itc->begin(), itc->end(), Finder(entry, &ItemTemplate::StartQuest)); + ItemTemplateContainer::const_iterator result = find_if(itc->begin(), itc->end(), Finder(entry, &ItemTemplate::StartQuest)); if (result != itc->end()) { @@ -244,6 +245,38 @@ public: player->CompleteQuest(entry); return true; } + + static bool HandleQuestReward(ChatHandler* handler, char const* args) + { + Player* player = handler->getSelectedPlayer(); + if (!player) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + // .quest reward #entry + // number or [name] Shift-click form |color|Hquest:quest_id:quest_level|h[name]|h|r + char* cId = handler->extractKeyFromLink((char*)args, "Hquest"); + if (!cId) + return false; + + uint32 entry = atol(cId); + + Quest const* quest = sObjectMgr->GetQuestTemplate(entry); + + // If player doesn't have the quest + if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE) + { + handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); + handler->SetSentErrorMessage(true); + return false; + } + + player->RewardQuest(quest, 0, player); + return true; + } }; void AddSC_quest_commandscript() diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 1019deac106..89fdcc7f725 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -207,7 +207,7 @@ public: { if (!m_bIntro) { - DoScriptText(SAY_INTRO, me); + Talk(SAY_INTRO); m_bIntro = false; } } @@ -225,7 +225,7 @@ public: void JustDied(Unit* /*killer*/) { Summons.DespawnAll(); - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); if (instance) instance->SetData(TYPE_ANUBARAK, DONE); } @@ -242,7 +242,7 @@ public: break; case NPC_SPIKE: summoned->CombatStart(target); - DoScriptText(EMOTE_SPIKE, me, target); + Talk(EMOTE_SPIKE, target->GetGUID()); break; } Summons.Summon(summoned); @@ -260,7 +260,7 @@ public: void EnterCombat(Unit* /*who*/) { - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetInCombatWithZone(); if (instance) @@ -405,8 +405,8 @@ public: { m_bReachedPhase3 = true; DoCastAOE(SPELL_LEECHING_SWARM); - DoScriptText(EMOTE_LEECHING_SWARM, me); - DoScriptText(SAY_LEECHING_SWARM, me); + Talk(EMOTE_LEECHING_SWARM); + Talk(SAY_LEECHING_SWARM); } if (m_uiBerserkTimer <= uiDiff && !me->HasAura(SPELL_BERSERK)) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index f9e2080895a..10f7150351e 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -161,7 +161,7 @@ public: void JustDied(Unit* /*killer*/) { Summons.DespawnAll(); - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); if (instance) instance->SetData(TYPE_JARAXXUS, DONE); } @@ -176,7 +176,7 @@ public: me->SetInCombatWithZone(); if (instance) instance->SetData(TYPE_JARAXXUS, IN_PROGRESS); - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); } void UpdateAI(const uint32 uiDiff) @@ -186,8 +186,8 @@ public: if (m_uiSummonInfernalEruptionTimer <= uiDiff) { - DoScriptText(EMOTE_INFERNAL_ERUPTION, me); - DoScriptText(SAY_INFERNAL_ERUPTION, me); + Talk(EMOTE_INFERNAL_ERUPTION); + Talk(SAY_INFERNAL_ERUPTION); DoCast(SPELL_INFERNAL_ERUPTION); m_uiSummonInfernalEruptionTimer = 2*MINUTE*IN_MILLISECONDS; } else m_uiSummonInfernalEruptionTimer -= uiDiff; @@ -217,8 +217,8 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true)) { - DoScriptText(EMOTE_INCINERATE, me, target); - DoScriptText(SAY_INCINERATE, me); + Talk(EMOTE_INCINERATE, target->GetGUID()); + Talk(SAY_INCINERATE); DoCast(target, SPELL_INCINERATE_FLESH); } m_uiIncinerateFleshTimer = urand(20*IN_MILLISECONDS, 25*IN_MILLISECONDS); @@ -234,7 +234,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true)) { - DoScriptText(EMOTE_LEGION_FLAME, me, target); + Talk(EMOTE_LEGION_FLAME, target->GetGUID()); DoCast(target, SPELL_LEGION_FLAME); } m_uiLegionFlameTimer = 30*IN_MILLISECONDS; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index db9bc3581ea..88e0fe5ba66 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -905,6 +905,8 @@ public: if (m_uiMassiveCrashTimer <= diff) { me->GetMotionMaster()->MoveJump(ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 10.0f, 20.0f); // 1: Middle of the room + SetCombatMovement(false); + me->AttackStop(); m_uiStage = 7; //Invalid (Do nothing more than move) m_uiMassiveCrashTimer = 30*IN_MILLISECONDS; } else m_uiMassiveCrashTimer -= diff; @@ -913,22 +915,28 @@ public: break; case 1: DoCastAOE(SPELL_MASSIVE_CRASH); + me->StopMoving(); + me->AttackStop(); m_uiStage = 2; break; case 2: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) { + me->StopMoving(); + me->AttackStop(); m_uiTrampleTargetGUID = target->GetGUID(); me->SetTarget(m_uiTrampleTargetGUID); m_bTrampleCasted = false; - SetCombatMovement(false); - me->GetMotionMaster()->MoveIdle(); + //SetCombatMovement(false); + //me->GetMotionMaster()->MoveIdle(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_uiTrampleTimer = 4*IN_MILLISECONDS; m_uiStage = 3; } else m_uiStage = 6; break; case 3: + me->StopMoving(); + me->AttackStop(); if (m_uiTrampleTimer <= diff) { if (Unit* target = Unit::GetPlayer(*me, m_uiTrampleTargetGUID)) @@ -941,12 +949,14 @@ public: me->GetMotionMaster()->MoveJump(2*me->GetPositionX()-m_fTrampleTargetX, 2*me->GetPositionY()-m_fTrampleTargetY, me->GetPositionZ(), - 10.0f, 20.0f); // 2: Hop Backwards + 20.0f, 30.0f); // 2: Hop Backwards m_uiStage = 7; //Invalid (Do nothing more than move) } else m_uiStage = 6; } else m_uiTrampleTimer -= diff; break; case 4: + me->StopMoving(); + me->AttackStop(); Talk(EMOTE_TRAMPLE_START, m_uiTrampleTargetGUID); me->GetMotionMaster()->MoveCharge(m_fTrampleTargetX, m_fTrampleTargetY, m_fTrampleTargetZ+2, 42, 1); me->SetTarget(0); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 203e49420be..a65eaebbc0c 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -254,7 +254,7 @@ struct boss_twin_baseAI : public ScriptedAI void JustDied(Unit* /*killer*/) { - DoScriptText(SAY_DEATH, me); + Talk(SAY_DEATH); if (instance) { if (Creature* pSister = GetSister()) @@ -296,7 +296,7 @@ struct boss_twin_baseAI : public ScriptedAI instance->SetData(TYPE_VALKIRIES, IN_PROGRESS); } - DoScriptText(SAY_AGGRO, me); + Talk(SAY_AGGRO); DoCast(me, m_uiSurgeSpellId); } @@ -384,7 +384,7 @@ struct boss_twin_baseAI : public ScriptedAI if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff) { DoCast(me, SPELL_BERSERK); - DoScriptText(SAY_BERSERK, me); + Talk(SAY_BERSERK); m_bIsBerserk = true; } else diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 3fb76ea52dc..9767126371b 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -244,10 +244,18 @@ class instance_trial_of_the_crusader : public InstanceMapScript switch (type) { case TYPE_JARAXXUS: + // Cleanup Icehowl + if (Creature* icehowl = instance->GetCreature(IcehowlGUID)) + icehowl->DespawnOrUnsummon(); if (data == DONE) EventStage = 2000; break; case TYPE_CRUSADERS: + // Cleanup Jaraxxus + if (Creature* jaraxxus = instance->GetCreature(JaraxxusGUID)) + jaraxxus->DespawnOrUnsummon(); + if (Creature* fizzlebang = instance->GetCreature(FizzlebangGUID)) + fizzlebang->DespawnOrUnsummon(); switch (data) { case IN_PROGRESS: @@ -267,6 +275,9 @@ class instance_trial_of_the_crusader : public InstanceMapScript } break; case TYPE_VALKIRIES: + // Cleanup chest + if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID)) + cache->Delete(); switch (data) { case FAIL: diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 7064368f090..37d08484f0b 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -789,7 +789,7 @@ class npc_tirion_toc : public CreatureScript case 5005: m_uiUpdateTimer = 8000; instance->SetData(TYPE_EVENT, 5010); - me->SummonCreature(NPC_LICH_KING_1, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5); + me->SummonCreature(NPC_LICH_KING_1, ToCCommonLoc[2].GetPositionX(), ToCCommonLoc[2].GetPositionY(), ToCCommonLoc[2].GetPositionZ(), 5); break; case 5020: Talk(SAY_STAGE_4_03); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index f361c3521d1..ba230551b24 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -53,8 +53,8 @@ const Position ToCCommonLoc[]= {563.833008f, 195.244995f, 394.585561f, 0}, // 5 - Center {573.5f, 180.5f, 395.14f, 0}, // 6 Move 0 Right {553.5f, 180.5f, 395.14f, 0}, // 7 Move 0 Left - {585.5f, 170.0f, 395.14f, 0}, // 8 Move 1 Right - {545.5f, 170.0f, 395.14f, 0}, // 9 Move 1 Left + {573.0f, 170.0f, 395.14f, 0}, // 8 Move 1 Right + {555.5f, 170.0f, 395.14f, 0}, // 9 Move 1 Left {563.8f, 216.1f, 395.1f, 0}, // 10 Behind the door {575.042358f, 195.260727f, 395.137146f, 0}, // 5 diff --git a/src/server/scripts/Northrend/wintergrasp.cpp b/src/server/scripts/Northrend/wintergrasp.cpp index 37994e40b63..fc967acf9e2 100644 --- a/src/server/scripts/Northrend/wintergrasp.cpp +++ b/src/server/scripts/Northrend/wintergrasp.cpp @@ -139,7 +139,7 @@ class npc_wg_demolisher_engineer : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender */, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->CLOSE_GOSSIP_MENU(); @@ -207,7 +207,7 @@ class npc_wg_spirit_guide : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* /*creature */ , uint32 /*sender */ , uint32 action) + bool OnGossipSelect(Player* player, Creature* /*creature*/ , uint32 /*sender */ , uint32 action) { player->CLOSE_GOSSIP_MENU(); @@ -225,17 +225,16 @@ class npc_wg_spirit_guide : public CreatureScript struct npc_wg_spirit_guideAI : public ScriptedAI { - npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) - { } + npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } - void UpdateAI(const uint32 /* diff */) + void UpdateAI(uint32 const /*diff*/) { if (!me->HasUnitState(UNIT_STATE_CASTING)) DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_wg_spirit_guideAI(creature); } @@ -258,7 +257,7 @@ class npc_wg_queue : public CreatureScript if (wintergrasp->IsWarTime()) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetTrinityStringForDBCLocale(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam()? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); + player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); } else { @@ -275,7 +274,7 @@ class npc_wg_queue : public CreatureScript return true; } - bool OnGossipSelect(Player* player, Creature* /*creature */ , uint32 /*sender */ , uint32 /*action*/) + bool OnGossipSelect(Player* player, Creature* /*creature*/ , uint32 /*sender*/ , uint32 /*action*/) { player->CLOSE_GOSSIP_MENU(); @@ -302,9 +301,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript struct go_wg_vehicle_teleporterAI : public GameObjectAI { - go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), - _checkTimer(1000) - { } + go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(1000) { } void UpdateAI(uint32 diff) { @@ -324,6 +321,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript } else _checkTimer -= diff; } + private: uint32 _checkTimer; }; @@ -358,12 +356,12 @@ class npc_wg_quest_giver : public CreatureScript for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i) { - uint32 quest_id = i->second; - QuestStatus status = player->GetQuestStatus(quest_id); + uint32 questId = i->second; + QuestStatus status = player->GetQuestStatus(questId); if (status == QUEST_STATUS_COMPLETE) - qm.AddMenuItem(quest_id, 4); + qm.AddMenuItem(questId, 4); else if (status == QUEST_STATUS_INCOMPLETE) - qm.AddMenuItem(quest_id, 4); + qm.AddMenuItem(questId, 4); //else if (status == QUEST_STATUS_AVAILABLE) // qm.AddMenuItem(quest_id, 2); } @@ -549,17 +547,14 @@ public: } }; - - void AddSC_wintergrasp() { new npc_wg_queue(); new npc_wg_spirit_guide(); new npc_wg_demolisher_engineer(); + new go_wg_vehicle_teleporter(); new npc_wg_quest_giver(); - new achievement_wg_didnt_stand_a_chance(); new spell_wintergrasp_force_building(); new spell_wintergrasp_grab_passenger(); - - new go_wg_vehicle_teleporter(); + new achievement_wg_didnt_stand_a_chance(); } diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index 48e07c727b4..7587a9d1904 100755 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -240,7 +240,7 @@ int Master::Run() if (ConfigMgr::GetBoolDefault("SOAP.Enabled", false)) { TCSoapRunnable* runnable = new TCSoapRunnable(); - runnable->setListenArguments(ConfigMgr::GetStringDefault("SOAP.IP", "127.0.0.1"), ConfigMgr::GetIntDefault("SOAP.Port", 7878)); + runnable->setListenArguments(ConfigMgr::GetStringDefault("SOAP.IP", "127.0.0.1"), uint16(ConfigMgr::GetIntDefault("SOAP.Port", 7878))); soap_thread = new ACE_Based::Thread(runnable); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 28bd8aecaf3..fbd45bec8e1 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -20,6 +20,7 @@ # SERVER RATES # AUTO BROADCAST # BATTLEGROUND CONFIG +# BATTLEFIELD CONFIG # ARENA CONFIG # NETWORK CONFIG # CONSOLE AND REMOTE ACCESS @@ -2183,6 +2184,62 @@ Battleground.Random.ResetHour = 6 # ################################################################################################### +################################################################################################### +# BATTLEFIELD CONFIG +# +# Wintergrasp.Enable +# Description: Enable the Wintergrasp battlefield. +# Default: 0 - (Disabled) +# 1 - (Enabled, Experimental as of still being in development) + +Wintergrasp.Enable = 0 + +# +# Wintergrasp.PlayerMax +# Description: Maximum number of players allowed in Wintergrasp. +# Default: 100 + +Wintergrasp.PlayerMax = 100 + +# +# Wintergrasp.PlayerMin +# Description: Minimum number of players required for Wintergrasp. +# Default: 0 + +Wintergrasp.PlayerMin = 0 + +# +# Wintergrasp.PlayerMinLvl +# Description: Required character level for the Wintergrasp battle. +# Default: 77 + +Wintergrasp.PlayerMinLvl = 77 + +# +# Wintergrasp.BattleTimer +# Description: Time (in minutes) for the Wintergrasp battle to last. +# Default: 30 + +Wintergrasp.BattleTimer = 30 + +# +# Wintergrasp.NoBattleTimer +# Description: Time (in minutes) between Wintergrasp battles. +# Default: 150 + +Wintergrasp.NoBattleTimer = 150 + +# +# Wintergrasp.CrashRestartTimer +# Description: Time (in minutes) to delay the restart of Wintergrasp if the world server +# crashed during a running battle. +# Default: 10 + +Wintergrasp.CrashRestartTimer = 10 + +# +################################################################################################### + ################################################################################################### # ARENA CONFIG # @@ -2651,7 +2708,7 @@ Appender.GM=2,2,0,GM.log Appender.DBErrors=2,2,0,DBErrors.log Appender.Char=2,2,0,Char.log,w Appender.RA=2,2,0,RA.log -Appender.Warden=2,2,0,Warden.log +Appender.Warden=2,4,0,Warden.log Appender.Chat=2,2,0,Chat.log Appender.CharDump=2,2,0,%s.log Appender.Arenas=2,2,0,Arena.log @@ -2735,7 +2792,7 @@ Logger.Chat=22,3,Chat Logger.DBErrors=26,5,Console Server DBErrors Logger.GM=27,3,Console Server GM Logger.RA=28,3,RA -Logger.Warden=29,3,Warden +Logger.Warden=29,4,Warden Logger.WorldServer=31,3,Console Server Logger.Character=34,3,Char Logger.Arenas=35,3,Arenas @@ -2743,6 +2800,7 @@ Logger.SQLDriver=36,5,SQLDriver Logger.SQLDev=37,3,SQLDev Logger.CharDump=38,3,CharDump Logger.Load=40,3,Console Server +Logger.Opcodes=41,6,Console Server # # Loggers @@ -2750,4 +2808,4 @@ Logger.Load=40,3,Console Server # (Using spaces as separator). # Default: "Root Chat DBErrors GM RA Warden Character Load" -Loggers=Root Chat DBErrors GM RA Warden Character Load WorldServer +Loggers=Root Chat DBErrors GM RA Warden Character Load WorldServer Opcodes -- cgit v1.2.3 From da9480557b3f191efab08d6aaf75a21a62512252 Mon Sep 17 00:00:00 2001 From: Nay Date: Wed, 22 Aug 2012 22:56:31 +0100 Subject: Core: Fix a typo and whitespace cleanup --- src/server/game/Battlefield/Battlefield.cpp | 6 +++--- src/server/game/Battlefield/Battlefield.h | 2 +- src/server/game/Battlefield/BattlefieldHandler.cpp | 6 +++--- src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/Spells/SpellMgr.cpp | 2 +- src/server/game/World/World.cpp | 4 ++-- src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 2 +- src/tools/map_extractor/CMakeLists.txt | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index d159580d189..99852f14277 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -65,7 +65,7 @@ Battlefield::~Battlefield() // Called when a player enters the zone void Battlefield::HandlePlayerEnterZone(Player* player, uint32 /*zone*/) { - // If battle is started, + // If battle is started, // If not full of players > invite player to join the war // If full of players > announce to player that BF is full and kick him after a few second if he desn't leave if (IsWarTime()) @@ -885,9 +885,9 @@ GuidSet::iterator BfCapturePoint::HandlePlayerLeave(Player* player) { if (m_capturePoint) player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 0); - + GuidSet::iterator current = m_activePlayers[player->GetTeamId()].find(player->GetGUID()); - + if (current == m_activePlayers[player->GetTeamId()].end()) return current; // return end() diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index 5fa8d6b1bc8..07daf33d431 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -35,7 +35,7 @@ enum BattlefieldTypes enum BattlefieldIDs { - BATTLEFIELD_BATTLEID_WG = 1, // Wintergrasp battle + BATTLEFIELD_BATTLEID_WG = 1, // Wintergrasp battle }; enum BattlefieldObjectiveStates diff --git a/src/server/game/Battlefield/BattlefieldHandler.cpp b/src/server/game/Battlefield/BattlefieldHandler.cpp index 09c6f18f796..b852082d582 100644 --- a/src/server/game/Battlefield/BattlefieldHandler.cpp +++ b/src/server/game/Battlefield/BattlefieldHandler.cpp @@ -32,7 +32,7 @@ //Param3:(time) Time in second that the player have for accept void WorldSession::SendBfInvitePlayerToWar(uint32 BattleId, uint32 ZoneId, uint32 p_time) { - //Send packet + //Send packet WorldPacket data(SMSG_BATTLEFIELD_MGR_ENTRY_INVITE, 12); data << uint32(BattleId); data << uint32(ZoneId); @@ -65,13 +65,13 @@ void WorldSession::SendBfQueueInviteResponse(uint32 BattleId,uint32 ZoneId, bool WorldPacket data(SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE, 11); data << uint32(BattleId); data << uint32(ZoneId); - data << uint8((CanQueue ? 1 : 0)); //Accepted //0 you cannot queue wg //1 you are queued + data << uint8((CanQueue ? 1 : 0)); //Accepted //0 you cannot queue wg //1 you are queued data << uint8((Full ? 0 : 1)); //Logging In //0 wg full //1 queue for upcoming data << uint8(1); //Warmup SendPacket(&data); } -//This is call when player accept to join war +//This is call when player accept to join war //Param1:(BattleId) the BattleId of Bf void WorldSession::SendBfEntered(uint32 BattleId) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index f89b1b95bc1..c86bd363c98 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2163,7 +2163,7 @@ void WorldSession::HandleReorderCharacters(WorldPacket& recvData) recvData.ReadByteSeq(guids[i][3]); recvData >> positions[i]; - position[i] /= 10; + positions[i] /= 10; recvData.ReadByteSeq(guids[i][2]); recvData.ReadByteSeq(guids[i][7]); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 03824cf7dc9..5c2b007493c 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1160,7 +1160,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 // team that controls the workshop in the specified area uint32 team = bf->GetData(newArea); - + if (team == TEAM_HORDE) return spellId == 56618; else if (team == TEAM_ALLIANCE) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index e7c140c01b8..936b2d3629b 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1209,7 +1209,7 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_WINTERGRASP_BATTLETIME] = ConfigMgr::GetIntDefault("Wintergrasp.BattleTimer", 30); m_int_configs[CONFIG_WINTERGRASP_NOBATTLETIME] = ConfigMgr::GetIntDefault("Wintergrasp.NoBattleTimer", 150); m_int_configs[CONFIG_WINTERGRASP_RESTART_AFTER_CRASH] = ConfigMgr::GetIntDefault("Wintergrasp.CrashRestartTimer", 10); - + if (reload) sScriptMgr->OnConfigLoad(reload); } @@ -1722,7 +1722,7 @@ void World::SetInitialWorldSettings() ///- Initialize Battlefield sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Starting Battlefield System"); sBattlefieldMgr->InitBattlefield(); - + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Transports..."); sMapMgr->LoadTransports(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index b0c1c7ecddd..d6a0b4e3761 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -97,7 +97,7 @@ class instance_zulgurub : public InstanceMapScript default: break; } - + return true; } diff --git a/src/tools/map_extractor/CMakeLists.txt b/src/tools/map_extractor/CMakeLists.txt index af66b73827e..b84e56e5734 100644 --- a/src/tools/map_extractor/CMakeLists.txt +++ b/src/tools/map_extractor/CMakeLists.txt @@ -33,5 +33,5 @@ add_dependencies(mapextractor storm) if( UNIX ) install(TARGETS mapextractor DESTINATION bin) elseif( WIN32 ) - install(TARGETS mapextractor DESTINATION "${CMAKE_INSTALL_PREFIX}") + install(TARGETS mapextractor DESTINATION "${CMAKE_INSTALL_PREFIX}") endif() -- cgit v1.2.3 From 26bc57733af4c2cedc60b9777cd037d43e4b8063 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sat, 25 Aug 2012 02:09:15 +0200 Subject: Core/outdoorPvP: Remove outdoor pvp eastern plaguelands (thx projectfreya) --- src/server/game/Entities/Player/Player.cpp | 43 -- src/server/game/OutdoorPvP/OutdoorPvP.h | 3 +- src/server/game/Scripting/ScriptLoader.cpp | 2 - src/server/scripts/OutdoorPvP/CMakeLists.txt | 2 - src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp | 785 ------------------------- src/server/scripts/OutdoorPvP/OutdoorPvPEP.h | 331 ----------- 6 files changed, 1 insertion(+), 1165 deletions(-) delete mode 100755 src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp delete mode 100755 src/server/scripts/OutdoorPvP/OutdoorPvPEP.h (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 812383b9616..f84ff1ead1d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -9138,9 +9138,6 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) case 2918: NumberOfFields = 8; break; - case 139: - NumberOfFields = 41; - break; case 1377: NumberOfFields = 15; break; @@ -9228,46 +9225,6 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) case 2257: // Deeprun Tram case 3703: // Shattrath City break; - case 139: // Eastern Plaguelands - if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_EP) - pvp->FillInitialWorldStates(data); - else - { - data << uint32(0x97a) << uint32(0x0); // 10 2426 - data << uint32(0x917) << uint32(0x0); // 11 2327 - data << uint32(0x918) << uint32(0x0); // 12 2328 - data << uint32(0x97b) << uint32(0x32); // 13 2427 - data << uint32(0x97c) << uint32(0x32); // 14 2428 - data << uint32(0x933) << uint32(0x1); // 15 2355 - data << uint32(0x946) << uint32(0x0); // 16 2374 - data << uint32(0x947) << uint32(0x0); // 17 2375 - data << uint32(0x948) << uint32(0x0); // 18 2376 - data << uint32(0x949) << uint32(0x0); // 19 2377 - data << uint32(0x94a) << uint32(0x0); // 20 2378 - data << uint32(0x94b) << uint32(0x0); // 21 2379 - data << uint32(0x932) << uint32(0x0); // 22 2354 - data << uint32(0x934) << uint32(0x0); // 23 2356 - data << uint32(0x935) << uint32(0x0); // 24 2357 - data << uint32(0x936) << uint32(0x0); // 25 2358 - data << uint32(0x937) << uint32(0x0); // 26 2359 - data << uint32(0x938) << uint32(0x0); // 27 2360 - data << uint32(0x939) << uint32(0x1); // 28 2361 - data << uint32(0x930) << uint32(0x1); // 29 2352 - data << uint32(0x93a) << uint32(0x0); // 30 2362 - data << uint32(0x93b) << uint32(0x0); // 31 2363 - data << uint32(0x93c) << uint32(0x0); // 32 2364 - data << uint32(0x93d) << uint32(0x0); // 33 2365 - data << uint32(0x944) << uint32(0x0); // 34 2372 - data << uint32(0x945) << uint32(0x0); // 35 2373 - data << uint32(0x931) << uint32(0x1); // 36 2353 - data << uint32(0x93e) << uint32(0x0); // 37 2366 - data << uint32(0x931) << uint32(0x1); // 38 2367 ?? grey horde not in dbc! send for consistency's sake, and to match field count - data << uint32(0x940) << uint32(0x0); // 39 2368 - data << uint32(0x941) << uint32(0x0); // 7 2369 - data << uint32(0x942) << uint32(0x0); // 8 2370 - data << uint32(0x943) << uint32(0x0); // 9 2371 - } - break; case 1377: // Silithus if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_SI) pvp->FillInitialWorldStates(data); diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.h b/src/server/game/OutdoorPvP/OutdoorPvP.h index 6ea13d353c5..d2f1362dc82 100755 --- a/src/server/game/OutdoorPvP/OutdoorPvP.h +++ b/src/server/game/OutdoorPvP/OutdoorPvP.h @@ -31,10 +31,9 @@ enum OutdoorPvPTypes OUTDOOR_PVP_TF = 3, OUTDOOR_PVP_ZM = 4, OUTDOOR_PVP_SI = 5, - OUTDOOR_PVP_EP = 6, }; -#define MAX_OUTDOORPVP_TYPES 7 +#define MAX_OUTDOORPVP_TYPES 6 enum ObjectiveStates { diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 5e6caec1f29..e7d203c9bc1 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -593,7 +593,6 @@ void AddSC_zangarmarsh(); // battlegrounds // outdoor pvp -void AddSC_outdoorpvp_ep(); void AddSC_outdoorpvp_hp(); void AddSC_outdoorpvp_na(); void AddSC_outdoorpvp_si(); @@ -1224,7 +1223,6 @@ void AddNorthrendScripts() void AddOutdoorPvPScripts() { #ifdef SCRIPTS - AddSC_outdoorpvp_ep(); AddSC_outdoorpvp_hp(); AddSC_outdoorpvp_na(); AddSC_outdoorpvp_si(); diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt index 237b974aa9d..15d7dbd7e8d 100644 --- a/src/server/scripts/OutdoorPvP/CMakeLists.txt +++ b/src/server/scripts/OutdoorPvP/CMakeLists.txt @@ -17,8 +17,6 @@ set(scripts_STAT_SRCS OutdoorPvP/OutdoorPvPNA.cpp OutdoorPvP/OutdoorPvPHP.cpp OutdoorPvP/OutdoorPvPTF.h - OutdoorPvP/OutdoorPvPEP.h - OutdoorPvP/OutdoorPvPEP.cpp OutdoorPvP/OutdoorPvPHP.h OutdoorPvP/OutdoorPvPZM.h OutdoorPvP/OutdoorPvPNA.h diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp deleted file mode 100755 index 2a94ddb3134..00000000000 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp +++ /dev/null @@ -1,785 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "ScriptMgr.h" -#include "OutdoorPvPEP.h" -#include "WorldPacket.h" -#include "Player.h" -#include "GameObject.h" -#include "ObjectMgr.h" -#include "ObjectAccessor.h" -#include "OutdoorPvPMgr.h" -#include "Creature.h" -#include "Language.h" -#include "World.h" -#include "GossipDef.h" - -OPvPCapturePointEP_EWT::OPvPCapturePointEP_EWT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_UnitsSummonedSide(0) -{ - SetCapturePointData(EPCapturePoints[EP_EWT].entry, EPCapturePoints[EP_EWT].map, EPCapturePoints[EP_EWT].x, EPCapturePoints[EP_EWT].y, EPCapturePoints[EP_EWT].z, EPCapturePoints[EP_EWT].o, EPCapturePoints[EP_EWT].rot0, EPCapturePoints[EP_EWT].rot1, EPCapturePoints[EP_EWT].rot2, EPCapturePoints[EP_EWT].rot3); - AddObject(EP_EWT_FLAGS, EPTowerFlags[EP_EWT].entry, EPTowerFlags[EP_EWT].map, EPTowerFlags[EP_EWT].x, EPTowerFlags[EP_EWT].y, EPTowerFlags[EP_EWT].z, EPTowerFlags[EP_EWT].o, EPTowerFlags[EP_EWT].rot0, EPTowerFlags[EP_EWT].rot1, EPTowerFlags[EP_EWT].rot2, EPTowerFlags[EP_EWT].rot3); -} - -void OPvPCapturePointEP_EWT::ChangeState() -{ - // if changing from controlling alliance to horde or vice versa - if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_EWT_A)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, 0); - } - else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_EWT_H)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, 0); - } - - uint32 artkit = 21; - - switch (m_State) - { - case OBJECTIVESTATE_ALLIANCE: - m_TowerState = EP_TS_A; - artkit = 2; - SummonSupportUnitAtNorthpassTower(ALLIANCE); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, ALLIANCE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_A)); - break; - case OBJECTIVESTATE_HORDE: - m_TowerState = EP_TS_H; - artkit = 1; - SummonSupportUnitAtNorthpassTower(HORDE); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, HORDE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_H)); - break; - case OBJECTIVESTATE_NEUTRAL: - m_TowerState = EP_TS_N; - break; - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - m_TowerState = EP_TS_N_A; - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - m_TowerState = EP_TS_N_H; - break; - } - - GameObject* flag = HashMapHolder::Find(m_capturePointGUID); - GameObject* flag2 = HashMapHolder::Find(m_Objects[EP_EWT_FLAGS]); - if (flag) - { - flag->SetGoArtKit(artkit); - } - if (flag2) - { - flag2->SetGoArtKit(artkit); - } - - UpdateTowerState(); - - // complete quest objective - if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) - SendObjectiveComplete(EP_EWT_CM, 0); -} - -void OPvPCapturePointEP_EWT::SendChangePhase() -{ - // send this too, sometimes the slider disappears, dunno why :( - SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket &data) -{ - data << EP_EWT_A << uint32(bool(m_TowerState & EP_TS_A)); - data << EP_EWT_H << uint32(bool(m_TowerState & EP_TS_H)); - data << EP_EWT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); - data << EP_EWT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); - data << EP_EWT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_EWT::UpdateTowerState() -{ - m_PvP->SendUpdateWorldState(EP_EWT_A, bool(m_TowerState & EP_TS_A)); - m_PvP->SendUpdateWorldState(EP_EWT_H, bool(m_TowerState & EP_TS_H)); - m_PvP->SendUpdateWorldState(EP_EWT_N_A, bool(m_TowerState & EP_TS_N_A)); - m_PvP->SendUpdateWorldState(EP_EWT_N_H, bool(m_TowerState & EP_TS_N_H)); - m_PvP->SendUpdateWorldState(EP_EWT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_EWT::HandlePlayerEnter(Player* player) -{ - if (OPvPCapturePoint::HandlePlayerEnter(player)) - { - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); - return true; - } - return false; -} - -void OPvPCapturePointEP_EWT::HandlePlayerLeave(Player* player) -{ - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); - OPvPCapturePoint::HandlePlayerLeave(player); -} - -void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(uint32 team) -{ - if (m_UnitsSummonedSide != team) - { - m_UnitsSummonedSide = team; - const creature_type * ct = NULL; - if (team == ALLIANCE) - ct=EP_EWT_Summons_A; - else - ct=EP_EWT_Summons_H; - - for (uint8 i = 0; i < EP_EWT_NUM_CREATURES; ++i) - { - DelCreature(i); - AddCreature(i, ct[i].entry, ct[i].teamval, ct[i].map, ct[i].x, ct[i].y, ct[i].z, ct[i].o, 1000000); - } - } -} - -// NPT -OPvPCapturePointEP_NPT::OPvPCapturePointEP_NPT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_SummonedGOSide(0) -{ - SetCapturePointData(EPCapturePoints[EP_NPT].entry, EPCapturePoints[EP_NPT].map, EPCapturePoints[EP_NPT].x, EPCapturePoints[EP_NPT].y, EPCapturePoints[EP_NPT].z, EPCapturePoints[EP_NPT].o, EPCapturePoints[EP_NPT].rot0, EPCapturePoints[EP_NPT].rot1, EPCapturePoints[EP_NPT].rot2, EPCapturePoints[EP_NPT].rot3); - AddObject(EP_NPT_FLAGS, EPTowerFlags[EP_NPT].entry, EPTowerFlags[EP_NPT].map, EPTowerFlags[EP_NPT].x, EPTowerFlags[EP_NPT].y, EPTowerFlags[EP_NPT].z, EPTowerFlags[EP_NPT].o, EPTowerFlags[EP_NPT].rot0, EPTowerFlags[EP_NPT].rot1, EPTowerFlags[EP_NPT].rot2, EPTowerFlags[EP_NPT].rot3); -} - -void OPvPCapturePointEP_NPT::ChangeState() -{ - // if changing from controlling alliance to horde or vice versa - if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_NPT_A)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, 0); - } - else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_NPT_H)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, 0); - } - - uint32 artkit = 21; - - switch (m_State) - { - case OBJECTIVESTATE_ALLIANCE: - m_TowerState = EP_TS_A; - artkit = 2; - SummonGO(ALLIANCE); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, ALLIANCE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_A)); - break; - case OBJECTIVESTATE_HORDE: - m_TowerState = EP_TS_H; - artkit = 1; - SummonGO(HORDE); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, HORDE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_H)); - break; - case OBJECTIVESTATE_NEUTRAL: - m_TowerState = EP_TS_N; - m_SummonedGOSide = 0; - DelObject(EP_NPT_BUFF); - break; - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - m_TowerState = EP_TS_N_A; - break; - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - m_TowerState = EP_TS_N_A; - m_SummonedGOSide = 0; - DelObject(EP_NPT_BUFF); - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - m_TowerState = EP_TS_N_H; - break; - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - m_TowerState = EP_TS_N_H; - m_SummonedGOSide = 0; - DelObject(EP_NPT_BUFF); - break; - } - - GameObject* flag = HashMapHolder::Find(m_capturePointGUID); - GameObject* flag2 = HashMapHolder::Find(m_Objects[EP_NPT_FLAGS]); - if (flag) - { - flag->SetGoArtKit(artkit); - } - if (flag2) - { - flag2->SetGoArtKit(artkit); - } - - UpdateTowerState(); - - // complete quest objective - if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) - SendObjectiveComplete(EP_NPT_CM, 0); -} - -void OPvPCapturePointEP_NPT::SendChangePhase() -{ - // send this too, sometimes the slider disappears, dunno why :( - SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket &data) -{ - data << EP_NPT_A << uint32(bool(m_TowerState & EP_TS_A)); - data << EP_NPT_H << uint32(bool(m_TowerState & EP_TS_H)); - data << EP_NPT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); - data << EP_NPT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); - data << EP_NPT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_NPT::UpdateTowerState() -{ - m_PvP->SendUpdateWorldState(EP_NPT_A, bool(m_TowerState & EP_TS_A)); - m_PvP->SendUpdateWorldState(EP_NPT_H, bool(m_TowerState & EP_TS_H)); - m_PvP->SendUpdateWorldState(EP_NPT_N_A, bool(m_TowerState & EP_TS_N_A)); - m_PvP->SendUpdateWorldState(EP_NPT_N_H, bool(m_TowerState & EP_TS_N_H)); - m_PvP->SendUpdateWorldState(EP_NPT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_NPT::HandlePlayerEnter(Player* player) -{ - if (OPvPCapturePoint::HandlePlayerEnter(player)) - { - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); - return true; - } - return false; -} - -void OPvPCapturePointEP_NPT::HandlePlayerLeave(Player* player) -{ - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); - OPvPCapturePoint::HandlePlayerLeave(player); -} - -void OPvPCapturePointEP_NPT::SummonGO(uint32 team) -{ - if (m_SummonedGOSide != team) - { - m_SummonedGOSide = team; - DelObject(EP_NPT_BUFF); - AddObject(EP_NPT_BUFF, EP_NPT_LordaeronShrine.entry, EP_NPT_LordaeronShrine.map, EP_NPT_LordaeronShrine.x, EP_NPT_LordaeronShrine.y, EP_NPT_LordaeronShrine.z, EP_NPT_LordaeronShrine.o, EP_NPT_LordaeronShrine.rot0, EP_NPT_LordaeronShrine.rot1, EP_NPT_LordaeronShrine.rot2, EP_NPT_LordaeronShrine.rot3); - GameObject* go = HashMapHolder::Find(m_Objects[EP_NPT_BUFF]); - if (go) - go->SetUInt32Value(GAMEOBJECT_FACTION, (team == ALLIANCE ? 84 : 83)); - } -} - -// CGT -OPvPCapturePointEP_CGT::OPvPCapturePointEP_CGT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_GraveyardSide(0) -{ - SetCapturePointData(EPCapturePoints[EP_CGT].entry, EPCapturePoints[EP_CGT].map, EPCapturePoints[EP_CGT].x, EPCapturePoints[EP_CGT].y, EPCapturePoints[EP_CGT].z, EPCapturePoints[EP_CGT].o, EPCapturePoints[EP_CGT].rot0, EPCapturePoints[EP_CGT].rot1, EPCapturePoints[EP_CGT].rot2, EPCapturePoints[EP_CGT].rot3); - AddObject(EP_CGT_FLAGS, EPTowerFlags[EP_CGT].entry, EPTowerFlags[EP_CGT].map, EPTowerFlags[EP_CGT].x, EPTowerFlags[EP_CGT].y, EPTowerFlags[EP_CGT].z, EPTowerFlags[EP_CGT].o, EPTowerFlags[EP_CGT].rot0, EPTowerFlags[EP_CGT].rot1, EPTowerFlags[EP_CGT].rot2, EPTowerFlags[EP_CGT].rot3); -} - -void OPvPCapturePointEP_CGT::ChangeState() -{ - // if changing from controlling alliance to horde or vice versa - if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_CGT_A)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, 0); - } - else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_CGT_H)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, 0); - } - - uint32 artkit = 21; - - switch (m_State) - { - case OBJECTIVESTATE_ALLIANCE: - m_TowerState = EP_TS_A; - artkit = 2; - LinkGraveYard(ALLIANCE); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, ALLIANCE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_A)); - break; - case OBJECTIVESTATE_HORDE: - m_TowerState = EP_TS_H; - artkit = 1; - LinkGraveYard(HORDE); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, HORDE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_H)); - break; - case OBJECTIVESTATE_NEUTRAL: - m_TowerState = EP_TS_N; - break; - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - m_TowerState = EP_TS_N_A; - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - m_TowerState = EP_TS_N_H; - break; - } - - GameObject* flag = HashMapHolder::Find(m_capturePointGUID); - GameObject* flag2 = HashMapHolder::Find(m_Objects[EP_CGT_FLAGS]); - if (flag) - { - flag->SetGoArtKit(artkit); - } - if (flag2) - { - flag2->SetGoArtKit(artkit); - } - - UpdateTowerState(); - - // complete quest objective - if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) - SendObjectiveComplete(EP_CGT_CM, 0); -} - -void OPvPCapturePointEP_CGT::SendChangePhase() -{ - // send this too, sometimes the slider disappears, dunno why :( - SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket &data) -{ - data << EP_CGT_A << uint32(bool(m_TowerState & EP_TS_A)); - data << EP_CGT_H << uint32(bool(m_TowerState & EP_TS_H)); - data << EP_CGT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); - data << EP_CGT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); - data << EP_CGT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_CGT::UpdateTowerState() -{ - m_PvP->SendUpdateWorldState(EP_CGT_A, bool(m_TowerState & EP_TS_A)); - m_PvP->SendUpdateWorldState(EP_CGT_H, bool(m_TowerState & EP_TS_H)); - m_PvP->SendUpdateWorldState(EP_CGT_N_A, bool(m_TowerState & EP_TS_N_A)); - m_PvP->SendUpdateWorldState(EP_CGT_N_H, bool(m_TowerState & EP_TS_N_H)); - m_PvP->SendUpdateWorldState(EP_CGT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_CGT::HandlePlayerEnter(Player* player) -{ - if (OPvPCapturePoint::HandlePlayerEnter(player)) - { - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); - return true; - } - return false; -} - -void OPvPCapturePointEP_CGT::HandlePlayerLeave(Player* player) -{ - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); - OPvPCapturePoint::HandlePlayerLeave(player); -} - -void OPvPCapturePointEP_CGT::LinkGraveYard(uint32 team) -{ - if (m_GraveyardSide != team) - { - m_GraveyardSide = team; - sObjectMgr->RemoveGraveYardLink(EP_GraveYardId, EP_GraveYardZone, team, false); - sObjectMgr->AddGraveYardLink(EP_GraveYardId, EP_GraveYardZone, team, false); - } -} - -// PWT -OPvPCapturePointEP_PWT::OPvPCapturePointEP_PWT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_FlightMasterSpawned(0), m_TowerState(EP_TS_N) -{ - SetCapturePointData(EPCapturePoints[EP_PWT].entry, EPCapturePoints[EP_PWT].map, EPCapturePoints[EP_PWT].x, EPCapturePoints[EP_PWT].y, EPCapturePoints[EP_PWT].z, EPCapturePoints[EP_PWT].o, EPCapturePoints[EP_PWT].rot0, EPCapturePoints[EP_PWT].rot1, EPCapturePoints[EP_PWT].rot2, EPCapturePoints[EP_PWT].rot3); - AddObject(EP_PWT_FLAGS, EPTowerFlags[EP_PWT].entry, EPTowerFlags[EP_PWT].map, EPTowerFlags[EP_PWT].x, EPTowerFlags[EP_PWT].y, EPTowerFlags[EP_PWT].z, EPTowerFlags[EP_PWT].o, EPTowerFlags[EP_PWT].rot0, EPTowerFlags[EP_PWT].rot1, EPTowerFlags[EP_PWT].rot2, EPTowerFlags[EP_PWT].rot3); -} - -void OPvPCapturePointEP_PWT::ChangeState() -{ - // if changing from controlling alliance to horde or vice versa - if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_PWT_A)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, 0); - } - else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) - { - sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_PWT_H)); - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, 0); - } - - uint32 artkit = 21; - - switch (m_State) - { - case OBJECTIVESTATE_ALLIANCE: - m_TowerState = EP_TS_A; - SummonFlightMaster(ALLIANCE); - artkit = 2; - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, ALLIANCE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_A)); - break; - case OBJECTIVESTATE_HORDE: - m_TowerState = EP_TS_H; - SummonFlightMaster(HORDE); - artkit = 1; - ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, HORDE); - if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_H)); - break; - case OBJECTIVESTATE_NEUTRAL: - m_TowerState = EP_TS_N; - DelCreature(EP_PWT_FLIGHTMASTER); - m_FlightMasterSpawned = 0; - break; - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - m_TowerState = EP_TS_N_A; - break; - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - m_TowerState = EP_TS_N_A; - DelCreature(EP_PWT_FLIGHTMASTER); - m_FlightMasterSpawned = 0; - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - m_TowerState = EP_TS_N_H; - break; - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - m_TowerState = EP_TS_N_H; - DelCreature(EP_PWT_FLIGHTMASTER); - m_FlightMasterSpawned = 0; - break; - } - - GameObject* flag = HashMapHolder::Find(m_capturePointGUID); - GameObject* flag2 = HashMapHolder::Find(m_Objects[EP_PWT_FLAGS]); - if (flag) - { - flag->SetGoArtKit(artkit); - } - if (flag2) - { - flag2->SetGoArtKit(artkit); - } - - UpdateTowerState(); - - // complete quest objective - if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) - SendObjectiveComplete(EP_PWT_CM, 0); -} - -void OPvPCapturePointEP_PWT::SendChangePhase() -{ - // send this too, sometimes the slider disappears, dunno why :( - SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket &data) -{ - data << EP_PWT_A << uint32(bool(m_TowerState & EP_TS_A)); - data << EP_PWT_H << uint32(bool(m_TowerState & EP_TS_H)); - data << EP_PWT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); - data << EP_PWT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); - data << EP_PWT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_PWT::UpdateTowerState() -{ - m_PvP->SendUpdateWorldState(EP_PWT_A, bool(m_TowerState & EP_TS_A)); - m_PvP->SendUpdateWorldState(EP_PWT_H, bool(m_TowerState & EP_TS_H)); - m_PvP->SendUpdateWorldState(EP_PWT_N_A, bool(m_TowerState & EP_TS_N_A)); - m_PvP->SendUpdateWorldState(EP_PWT_N_H, bool(m_TowerState & EP_TS_N_H)); - m_PvP->SendUpdateWorldState(EP_PWT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_PWT::HandlePlayerEnter(Player* player) -{ - if (OPvPCapturePoint::HandlePlayerEnter(player)) - { - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); - return true; - } - return false; -} - -void OPvPCapturePointEP_PWT::HandlePlayerLeave(Player* player) -{ - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); - OPvPCapturePoint::HandlePlayerLeave(player); -} - -void OPvPCapturePointEP_PWT::SummonFlightMaster(uint32 team) -{ - if (m_FlightMasterSpawned != team) - { - m_FlightMasterSpawned = team; - DelCreature(EP_PWT_FLIGHTMASTER); - AddCreature(EP_PWT_FLIGHTMASTER, EP_PWT_FlightMaster.entry, team, EP_PWT_FlightMaster.map, EP_PWT_FlightMaster.x, EP_PWT_FlightMaster.y, EP_PWT_FlightMaster.z, EP_PWT_FlightMaster.o); - /* - // sky - we need update gso code - - Creature* c = HashMapHolder::Find(m_Creatures[EP_PWT_FLIGHTMASTER]); - //Spawn flight master as friendly to capturing team - c->SetUInt32Value(GAMEOBJECT_FACTION, (team == ALLIANCE ? 55 : 68)); - if (c) - { - GossipOption gso; - gso.Action = GOSSIP_OPTION_OUTDOORPVP; - gso.GossipId = 0; - gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_NPT)); - gso.Id = 50; - gso.Icon = 0; - gso.NpcFlag = 0; - gso.BoxMoney = 0; - gso.Coded = false; - c->addGossipOption(gso); - - gso.Action = GOSSIP_OPTION_OUTDOORPVP; - gso.GossipId = 0; - gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_EWT)); - gso.Id = 50; - gso.Icon = 0; - gso.NpcFlag = 0; - gso.BoxMoney = 0; - gso.Coded = false; - c->addGossipOption(gso); - - gso.Action = GOSSIP_OPTION_OUTDOORPVP; - gso.GossipId = 0; - gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_CGT)); - gso.Id = 50; - gso.Icon = 0; - gso.NpcFlag = 0; - gso.BoxMoney = 0; - gso.Coded = false; - c->addGossipOption(gso); - } - */ - } -} - -// ep -OutdoorPvPEP::OutdoorPvPEP() -{ - m_TypeId = OUTDOOR_PVP_EP; - memset(EP_Controls, 0, sizeof(EP_Controls)); - m_AllianceTowersControlled = 0; - m_HordeTowersControlled = 0; -} - -bool OutdoorPvPEP::SetupOutdoorPvP() -{ - for (uint8 i = 0; i < EPBuffZonesNum; ++i) - RegisterZone(EPBuffZones[i]); - - AddCapturePoint(new OPvPCapturePointEP_EWT(this)); - AddCapturePoint(new OPvPCapturePointEP_PWT(this)); - AddCapturePoint(new OPvPCapturePointEP_CGT(this)); - AddCapturePoint(new OPvPCapturePointEP_NPT(this)); - return true; -} - -bool OutdoorPvPEP::Update(uint32 diff) -{ - if (OutdoorPvP::Update(diff)) - { - m_AllianceTowersControlled = 0; - m_HordeTowersControlled = 0; - for (int i = 0; i < EP_TOWER_NUM; ++i) - { - if (EP_Controls[i] == ALLIANCE) - ++m_AllianceTowersControlled; - else if (EP_Controls[i] == HORDE) - ++m_HordeTowersControlled; - SendUpdateWorldState(EP_UI_TOWER_COUNT_A, m_AllianceTowersControlled); - SendUpdateWorldState(EP_UI_TOWER_COUNT_H, m_HordeTowersControlled); - BuffTeams(); - } - return true; - } - return false; -} - -void OutdoorPvPEP::HandlePlayerEnterZone(Player* player, uint32 zone) -{ - // add buffs - if (player->GetTeam() == ALLIANCE) - { - if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5) - player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled-1], true); - } - else - { - if (m_HordeTowersControlled && m_HordeTowersControlled < 5) - player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled-1], true); - } - OutdoorPvP::HandlePlayerEnterZone(player, zone); -} - -void OutdoorPvPEP::HandlePlayerLeaveZone(Player* player, uint32 zone) -{ - // remove buffs - if (player->GetTeam() == ALLIANCE) - { - for (int i = 0; i < 4; ++i) - player->RemoveAurasDueToSpell(EP_AllianceBuffs[i]); - } - else - { - for (int i = 0; i < 4; ++i) - player->RemoveAurasDueToSpell(EP_HordeBuffs[i]); - } - OutdoorPvP::HandlePlayerLeaveZone(player, zone); -} - -void OutdoorPvPEP::BuffTeams() -{ - for (PlayerSet::iterator itr = m_players[0].begin(); itr != m_players[0].end(); ++itr) - { - Player* player = *itr; - { - for (int i = 0; i < 4; ++i) - player->RemoveAurasDueToSpell(EP_AllianceBuffs[i]); - if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5) - player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled-1], true); - } - } - for (PlayerSet::iterator itr = m_players[1].begin(); itr != m_players[1].end(); ++itr) - { - Player* player = *itr; - { - for (int i = 0; i < 4; ++i) - player->RemoveAurasDueToSpell(EP_HordeBuffs[i]); - if (m_HordeTowersControlled && m_HordeTowersControlled < 5) - player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled-1], true); - } - } -} - -void OutdoorPvPEP::SetControlledState(uint32 index, uint32 state) -{ - EP_Controls[index] = state; -} - -void OutdoorPvPEP::FillInitialWorldStates(WorldPacket & data) -{ - data << EP_UI_TOWER_COUNT_A << m_AllianceTowersControlled; - data << EP_UI_TOWER_COUNT_H << m_HordeTowersControlled; - data << EP_UI_TOWER_SLIDER_DISPLAY << uint32(0); - data << EP_UI_TOWER_SLIDER_POS << uint32(50); - data << EP_UI_TOWER_SLIDER_N << uint32(100); - for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) - { - itr->second->FillInitialWorldStates(data); - } -} - -void OutdoorPvPEP::SendRemoveWorldStates(Player* player) -{ - player->SendUpdateWorldState(EP_UI_TOWER_COUNT_A, 0); - player->SendUpdateWorldState(EP_UI_TOWER_COUNT_H, 0); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, 0); - player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, 0); - - player->SendUpdateWorldState(EP_EWT_A, 0); - player->SendUpdateWorldState(EP_EWT_H, 0); - player->SendUpdateWorldState(EP_EWT_N, 0); - player->SendUpdateWorldState(EP_EWT_N_A, 0); - player->SendUpdateWorldState(EP_EWT_N_H, 0); - - player->SendUpdateWorldState(EP_PWT_A, 0); - player->SendUpdateWorldState(EP_PWT_H, 0); - player->SendUpdateWorldState(EP_PWT_N, 0); - player->SendUpdateWorldState(EP_PWT_N_A, 0); - player->SendUpdateWorldState(EP_PWT_N_H, 0); - - player->SendUpdateWorldState(EP_NPT_A, 0); - player->SendUpdateWorldState(EP_NPT_H, 0); - player->SendUpdateWorldState(EP_NPT_N, 0); - player->SendUpdateWorldState(EP_NPT_N_A, 0); - player->SendUpdateWorldState(EP_NPT_N_H, 0); - - player->SendUpdateWorldState(EP_CGT_A, 0); - player->SendUpdateWorldState(EP_CGT_H, 0); - player->SendUpdateWorldState(EP_CGT_N, 0); - player->SendUpdateWorldState(EP_CGT_N_A, 0); - player->SendUpdateWorldState(EP_CGT_N_H, 0); -} - -class OutdoorPvP_eastern_plaguelands : public OutdoorPvPScript -{ - public: - - OutdoorPvP_eastern_plaguelands() - : OutdoorPvPScript("outdoorpvp_ep") - { - } - - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPEP(); - } -}; - -void AddSC_outdoorpvp_ep() -{ - new OutdoorPvP_eastern_plaguelands(); -} diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h deleted file mode 100755 index 14712e0150d..00000000000 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef OUTDOOR_PVP_EP_ -#define OUTDOOR_PVP_EP_ - -#include "DBCStructure.h" -#include "OutdoorPvP.h" - -const uint32 EP_AllianceBuffs[4] = {11413, 11414, 11415, 1386}; - -const uint32 EP_HordeBuffs[4] = {30880, 30683, 30682, 29520}; - -const uint32 EP_GraveYardZone = 139; - -const uint32 EP_GraveYardId = 927; - -const uint8 EPBuffZonesNum = 3; - -const uint32 EP_EWT_CM = 17690; -const uint32 EP_CGT_CM = 17689; -const uint32 EP_NPT_CM = 17696; -const uint32 EP_PWT_CM = 17698; - -const uint32 EPBuffZones[EPBuffZonesNum] = {139, 2017, 2057}; - -enum EP_TaxiNodes -{ - EP_CGT_Taxi = 87, - EP_EWT_Taxi = 86, - EP_NPT_Taxi = 85, - EP_PWT_Taxi = 84 -}; - -enum EP_EastwallTowerWorldStates -{ - EP_EWT_A = 2354, - EP_EWT_H = 2356, - EP_EWT_N_A = 2359, // ally conquested - EP_EWT_N_H = 2360, - EP_EWT_N = 2361 -}; - -enum EP_NorthpassTowerWorldStates -{ - EP_NPT_N = 2352, - EP_NPT_N_A = 2362, - EP_NPT_N_H = 2363, - EP_NPT_A = 2372, - EP_NPT_H = 2373 -}; - -enum EP_PlagewoodTowerWorldStates -{ - EP_PWT_N_A = 2366, - EP_PWT_N_H = 2353, //2367 not present! use neutral! - EP_PWT_A = 2370, - EP_PWT_H = 2371, - EP_PWT_N = 2353 -}; - -enum EP_CrownGuardTowerWorldStates -{ - EP_CGT_N_A = 2374, - EP_CGT_N_H = 2375, - EP_CGT_A = 2378, - EP_CGT_H = 2379, - EP_CGT_N = 2355 -}; - -enum EP_WorldStates -{ - EP_UI_TOWER_SLIDER_DISPLAY = 2426, - EP_UI_TOWER_SLIDER_POS = 2427, - EP_UI_TOWER_SLIDER_N = 2428, - - EP_UI_TOWER_COUNT_A = 2327, - EP_UI_TOWER_COUNT_H = 2328 -}; - -enum EP_Summons -{ - EP_EWT_COMMANDER = 0, - EP_EWT_SOLDIER1, - EP_EWT_SOLDIER2, - EP_EWT_SOLDIER3, - EP_EWT_SOLDIER4, - EP_PWT_FLIGHTMASTER, -}; - -enum EP_GoSummons -{ - EP_NPT_BUFF = 0, - EP_NPT_FLAGS, - EP_EWT_FLAGS, - EP_CGT_FLAGS, - EP_PWT_FLAGS -}; - -enum EP_Towers -{ - EP_EWT = 0, // plaguelands 03 - EP_NPT, // plaguelands 01 - EP_PWT, // plaguelands 04 - EP_CGT, // plaguelands 02 - EP_TOWER_NUM -}; - -const go_type EPCapturePoints[EP_TOWER_NUM] = -{ - {182097, 0, 2574.51f, -4794.89f, 144.704f, -1.45003f, -0.097056f, 0.095578f, -0.656229f, 0.742165f}, - {181899, 0, 3181.08f, -4379.36f, 174.123f, -2.03472f, -0.065392f, 0.119494f, -0.842275f, 0.521553f}, - {182098, 0, 2962.71f, -3042.31f, 154.789f, 2.08426f, -0.074807f, -0.113837f, 0.855928f, 0.49883f}, - {182096, 0, 1860.85f, -3731.23f, 196.716f, -2.53214f, 0.033967f, -0.131914f, 0.944741f, -0.298177f} -}; - -const go_type EPTowerFlags[EP_TOWER_NUM] = -{ - {182106, 0, 2569.60f, -4772.93f, 115.399f, 2.72271f, 0.0f, 0.0f, 0.978148f, 0.207912f}, - {182106, 0, 3148.17f, -4365.51f, 145.029f, 1.53589f, 0.0f, 0.0f, 0.694658f, 0.71934f}, - {182106, 0, 2992.63f, -3022.95f, 125.593f, 3.03687f, 0.0f, 0.0f, 0.99863f, 0.052336f}, - {182106, 0, 1838.42f, -3703.56f, 167.713f, 0.890118f, 0.0f, 0.0f, 0.430511f, 0.902585f} -}; - -const uint32 EPTowerPlayerEnterEvents[EP_TOWER_NUM] = {10691, 10699, 10701, 10705}; - -const uint32 EPTowerPlayerLeaveEvents[EP_TOWER_NUM] = {10692, 10698, 10700, 10704}; - -const uint8 EP_NUM_CREATURES = 6; -const uint8 EP_EWT_NUM_CREATURES = 5; - -// one lordaeron commander, 4 soldiers -// should be spawned at EWT and follow a path, but trans-grid pathing isn't safe, so summon them directly at NPT -const creature_type EP_EWT_Summons_A[EP_EWT_NUM_CREATURES] = -{ - {17635, 469, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f}, - {17647, 469, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f}, - {17647, 469, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f}, - {17647, 469, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f}, - {17647, 469, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f} -}; - -const creature_type EP_EWT_Summons_H[EP_EWT_NUM_CREATURES] = -{ - {17995, 67, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f}, - {17996, 67, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f}, - {17996, 67, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f}, - {17996, 67, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f}, - {17996, 67, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f} -}; - -enum EP_TowerStates -{ - EP_TS_N = 1, - EP_TS_N_A = 2, - EP_TS_N_H = 4, - EP_TS_A_P = 8, - EP_TS_H_P = 16, - EP_TS_A = 32, - EP_TS_H = 64 -}; - -// when spawning, pay attention at setting the faction manually! -const creature_type EP_PWT_FlightMaster = {17209, 0, 0, 2987.5f, -3049.11f, 120.126f, 5.75959f}; - -// after spawning, modify the faction so that only the controller will be able to use it with SetUInt32Value(GAMEOBJECT_FACTION, faction_id); -const go_type EP_NPT_LordaeronShrine = {181682, 0, 3167.72f, -4355.91f, 138.785f, 1.69297f, 0.0f, 0.0f, 0.748956f, 0.66262f}; - -class OutdoorPvPEP; - -class OPvPCapturePointEP_EWT : public OPvPCapturePoint -{ - public: - - OPvPCapturePointEP_EWT(OutdoorPvP* pvp); - - void ChangeState(); - - void SendChangePhase(); - - void FillInitialWorldStates(WorldPacket & data); - - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); - - protected: - - void SummonSupportUnitAtNorthpassTower(uint32 team); - - void UpdateTowerState(); - - protected: - - uint32 m_TowerState; - - uint32 m_UnitsSummonedSide; -}; - -class OPvPCapturePointEP_NPT : public OPvPCapturePoint -{ - public: - - OPvPCapturePointEP_NPT(OutdoorPvP* pvp); - - void ChangeState(); - - void SendChangePhase(); - - void FillInitialWorldStates(WorldPacket & data); - - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); - - protected: - - void SummonGO(uint32 team); - - void UpdateTowerState(); - - protected: - - uint32 m_TowerState; - - uint32 m_SummonedGOSide; -}; - -class OPvPCapturePointEP_CGT : public OPvPCapturePoint -{ - public: - - OPvPCapturePointEP_CGT(OutdoorPvP* pvp); - - void ChangeState(); - - void SendChangePhase(); - - void FillInitialWorldStates(WorldPacket & data); - - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); - - protected: - - void LinkGraveYard(uint32 team); - - void UpdateTowerState(); - - protected: - - uint32 m_TowerState; - - uint32 m_GraveyardSide; -}; - -class OPvPCapturePointEP_PWT : public OPvPCapturePoint -{ - public: - - OPvPCapturePointEP_PWT(OutdoorPvP* pvp); - - void ChangeState(); - - void SendChangePhase(); - - void FillInitialWorldStates(WorldPacket & data); - - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); - - protected: - - void SummonFlightMaster(uint32 team); - - void UpdateTowerState(); - - protected: - - uint32 m_FlightMasterSpawned; - - uint32 m_TowerState; -}; - -class OutdoorPvPEP : public OutdoorPvP -{ - public: - - OutdoorPvPEP(); - - bool SetupOutdoorPvP(); - - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); - - bool Update(uint32 diff); - - void FillInitialWorldStates(WorldPacket &data); - - void SendRemoveWorldStates(Player* player); - - void BuffTeams(); - - void SetControlledState(uint32 index, uint32 state); - - private: - - // how many towers are controlled - uint32 EP_Controls[EP_TOWER_NUM]; - - uint32 m_AllianceTowersControlled; - uint32 m_HordeTowersControlled; -}; - -#endif -- cgit v1.2.3 From 71ca10681408b6d5098a3718ea61b54f91d5f803 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sun, 26 Aug 2012 04:43:08 +0200 Subject: Core/Spells: Implement visual spells for priest shadowform --- .../2012_08_26_00_world_spell_script_names_434.sql | 3 ++ src/server/scripts/Spells/spell_priest.cpp | 47 ++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 sql/updates/world/2012_08_26_00_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_08_26_00_world_spell_script_names_434.sql b/sql/updates/world/2012_08_26_00_world_spell_script_names_434.sql new file mode 100644 index 00000000000..d9bb921bf8a --- /dev/null +++ b/sql/updates/world/2012_08_26_00_world_spell_script_names_434.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id`=15473; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(15473,'spell_pri_shadowform'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 3d8ca3e729b..da4229ff175 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -39,6 +39,9 @@ enum PriestSpells PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021, PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874, PRIEST_SHADOW_WORD_DEATH = 32409, + PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903, + PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904, + PRIEST_GLYPH_OF_SHADOW = 107906, }; // Guardian Spirit @@ -449,6 +452,49 @@ class spell_pri_shadow_word_death : public SpellScriptLoader } }; +class spell_pri_shadowform : public SpellScriptLoader +{ + public: + spell_pri_shadowform() : SpellScriptLoader("spell_pri_shadowform") { } + + class spell_pri_shadowform_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_shadowform_AuraScript); + + bool Validate(SpellInfo const* /*entry*/) + { + if (!sSpellMgr->GetSpellInfo(PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH) || + !sSpellMgr->GetSpellInfo(PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH)) + return false; + return true; + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTarget()->HasAura(PRIEST_GLYPH_OF_SHADOW)) + GetTarget()->CastSpell(GetTarget(), PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH, true); + else + GetTarget()->CastSpell(GetTarget(), PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(GetTarget()->HasAura(PRIEST_GLYPH_OF_SHADOW) ? PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_pri_shadowform_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_pri_shadowform_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_shadowform_AuraScript(); + } +}; + void AddSC_priest_spell_scripts() { new spell_pri_guardian_spirit(); @@ -461,4 +507,5 @@ void AddSC_priest_spell_scripts() new spell_pri_vampiric_touch(); new spell_priest_renew(); new spell_pri_shadow_word_death(); + new spell_pri_shadowform(); } -- cgit v1.2.3 From 50bed7eb4bba6709dfab2c2e28ceb5bf9e4c931b Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sun, 26 Aug 2012 05:05:05 +0200 Subject: Core/Spells: Cleanup in 71ca10681408b6d5098a3718ea61b54f91d5f803 /slap me --- src/server/scripts/Spells/spell_priest.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index da4229ff175..be5ec311c39 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -471,10 +471,7 @@ class spell_pri_shadowform : public SpellScriptLoader void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (GetTarget()->HasAura(PRIEST_GLYPH_OF_SHADOW)) - GetTarget()->CastSpell(GetTarget(), PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH, true); - else - GetTarget()->CastSpell(GetTarget(), PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true); + GetTarget()->CastSpell(GetTarget(), GetTarget()->HasAura(PRIEST_GLYPH_OF_SHADOW) ? PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -- cgit v1.2.3 From b7fa5cb566d7a90d749e783c8deb3e1052130124 Mon Sep 17 00:00:00 2001 From: Gigatotem Date: Tue, 28 Aug 2012 00:03:37 +0200 Subject: Spells/Shaman: Heroism and Bloodlust Heroism and Bloodlust will now check for Temporal Displacement from Time Warp and Insanity from Ancient Hysteria. --- src/server/scripts/Spells/spell_shaman.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index c863c2363af..1c6e6e11f04 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -35,6 +35,8 @@ enum ShamanSpells SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349, SHAMAN_SPELL_SATED = 57724, SHAMAN_SPELL_EXHAUSTION = 57723, + HUNTER_SPELL_INSANITY = 95809, + MAGE_SPELL_TEMPORAL_DISPLACEMENT = 80354, SHAMAN_SPELL_STORM_EARTH_AND_FIRE = 51483, EARTHBIND_TOTEM_SPELL_EARTHGRAB = 64695, @@ -319,6 +321,8 @@ class spell_sha_bloodlust : public SpellScriptLoader void RemoveInvalidTargets(std::list& targets) { targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED)); + targets.remove_if(Trinity::UnitAuraCheck(true, HUNTER_SPELL_INSANITY)); + targets.remove_if(Trinity::UnitAuraCheck(true, MAGE_SPELL_TEMPORAL_DISPLACEMENT)); } void ApplyDebuff() @@ -361,6 +365,8 @@ class spell_sha_heroism : public SpellScriptLoader void RemoveInvalidTargets(std::list& targets) { targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_EXHAUSTION)); + targets.remove_if(Trinity::UnitAuraCheck(true, HUNTER_SPELL_INSANITY)); + targets.remove_if(Trinity::UnitAuraCheck(true, MAGE_SPELL_TEMPORAL_DISPLACEMENT)); } void ApplyDebuff() -- cgit v1.2.3 From 8bfdfd18cd97fc80846809eae80e81e1315d329e Mon Sep 17 00:00:00 2001 From: Nay Date: Fri, 31 Aug 2012 19:48:26 +0100 Subject: Scripts: Fix a merge issue, thanks cyberbrest --- src/server/scripts/Kalimdor/silithus.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp index 44a68355a4e..1fe945b06d4 100644 --- a/src/server/scripts/Kalimdor/silithus.cpp +++ b/src/server/scripts/Kalimdor/silithus.cpp @@ -224,9 +224,6 @@ public: }; - Unit* mob = NULL; - Unit* target = NULL; - /*### ## go_wind_stone ###*/ -- cgit v1.2.3 From 10c9f0d0eda80253febb5913000f41182e887f89 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 2 Sep 2012 18:40:08 +0200 Subject: Scripts/Commands: Fixed compile --- src/server/scripts/Commands/cs_cheat.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp index ade1b9fae02..1911c6d476b 100644 --- a/src/server/scripts/Commands/cs_cheat.cpp +++ b/src/server/scripts/Commands/cs_cheat.cpp @@ -178,14 +178,14 @@ public: if (argstr == "off") { handler->GetSession()->GetPlayer()->SetCommandStatusOff(CHEAT_WATERWALK); - handler->GetSession()->GetPlayer()->SetMovement(MOVE_LAND_WALK); // OFF + handler->GetSession()->GetPlayer()->SendMovementSetWaterWalking(false); // OFF handler->SendSysMessage("Waterwalking is OFF. You can't walk on water."); return true; } else if (argstr == "on") { handler->GetSession()->GetPlayer()->SetCommandStatusOn(CHEAT_WATERWALK); - handler->GetSession()->GetPlayer()->SetMovement(MOVE_WATER_WALK); // ON + handler->GetSession()->GetPlayer()->SendMovementSetWaterWalking(true); // ON handler->SendSysMessage("Waterwalking is ON. You can walk on water."); return true; } -- cgit v1.2.3 From 7da92908b8e176248db4d87217f0adf48318fd15 Mon Sep 17 00:00:00 2001 From: Nay Date: Wed, 5 Sep 2012 19:55:55 +0100 Subject: Scripts/Commands: Fix .reload creature_template # (4.3.4 branch) --- src/server/scripts/Commands/cs_reload.cpp | 99 ++++++++++++++++--------------- 1 file changed, 50 insertions(+), 49 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 77f6316c881..88be4d6d151 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -451,57 +451,58 @@ public: cInfo->rangeattacktime = fields[29].GetUInt32(); cInfo->unit_class = fields[30].GetUInt8(); cInfo->unit_flags = fields[31].GetUInt32(); - cInfo->dynamicflags = fields[32].GetUInt32(); - cInfo->family = fields[33].GetUInt8(); - cInfo->trainer_type = fields[34].GetUInt8(); - cInfo->trainer_spell = fields[35].GetUInt32(); - cInfo->trainer_class = fields[36].GetUInt8(); - cInfo->trainer_race = fields[37].GetUInt8(); - cInfo->minrangedmg = fields[38].GetFloat(); - cInfo->maxrangedmg = fields[39].GetFloat(); - cInfo->rangedattackpower = fields[40].GetUInt16(); - cInfo->type = fields[41].GetUInt8(); - cInfo->type_flags = fields[42].GetUInt32(); - cInfo->lootid = fields[43].GetUInt32(); - cInfo->pickpocketLootId = fields[44].GetUInt32(); - cInfo->SkinLootId = fields[45].GetUInt32(); + cInfo->unit_flags2 = fields[32].GetUInt32(); + cInfo->dynamicflags = fields[33].GetUInt32(); + cInfo->family = fields[34].GetUInt8(); + cInfo->trainer_type = fields[35].GetUInt8(); + cInfo->trainer_spell = fields[36].GetUInt32(); + cInfo->trainer_class = fields[37].GetUInt8(); + cInfo->trainer_race = fields[38].GetUInt8(); + cInfo->minrangedmg = fields[39].GetFloat(); + cInfo->maxrangedmg = fields[40].GetFloat(); + cInfo->rangedattackpower = fields[41].GetUInt16(); + cInfo->type = fields[42].GetUInt8(); + cInfo->type_flags = fields[43].GetUInt32(); + cInfo->lootid = fields[44].GetUInt32(); + cInfo->pickpocketLootId = fields[45].GetUInt32(); + cInfo->SkinLootId = fields[46].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - cInfo->resistance[i] = fields[46 + i -1].GetUInt16(); - - cInfo->spells[0] = fields[52].GetUInt32(); - cInfo->spells[1] = fields[53].GetUInt32(); - cInfo->spells[2] = fields[54].GetUInt32(); - cInfo->spells[3] = fields[55].GetUInt32(); - cInfo->spells[4] = fields[56].GetUInt32(); - cInfo->spells[5] = fields[57].GetUInt32(); - cInfo->spells[6] = fields[58].GetUInt32(); - cInfo->spells[7] = fields[59].GetUInt32(); - cInfo->PetSpellDataId = fields[60].GetUInt32(); - cInfo->VehicleId = fields[61].GetUInt32(); - cInfo->mingold = fields[62].GetUInt32(); - cInfo->maxgold = fields[63].GetUInt32(); - cInfo->AIName = fields[64].GetString(); - cInfo->MovementType = fields[65].GetUInt8(); - cInfo->InhabitType = fields[66].GetUInt8(); - cInfo->HoverHeight = fields[67].GetFloat(); - cInfo->ModHealth = fields[68].GetFloat(); - cInfo->ModMana = fields[69].GetFloat(); - cInfo->ModManaExtra = fields[70].GetFloat(); - cInfo->ModArmor = fields[71].GetFloat(); - cInfo->RacialLeader = fields[72].GetBool(); - cInfo->questItems[0] = fields[73].GetUInt32(); - cInfo->questItems[1] = fields[74].GetUInt32(); - cInfo->questItems[2] = fields[75].GetUInt32(); - cInfo->questItems[3] = fields[76].GetUInt32(); - cInfo->questItems[4] = fields[77].GetUInt32(); - cInfo->questItems[5] = fields[78].GetUInt32(); - cInfo->movementId = fields[79].GetUInt32(); - cInfo->RegenHealth = fields[80].GetBool(); - cInfo->equipmentId = fields[81].GetUInt32(); - cInfo->MechanicImmuneMask = fields[82].GetUInt32(); - cInfo->flags_extra = fields[83].GetUInt32(); - cInfo->ScriptID = sObjectMgr->GetScriptId(fields[84].GetCString()); + cInfo->resistance[i] = fields[47 + i -1].GetUInt16(); + + cInfo->spells[0] = fields[53].GetUInt32(); + cInfo->spells[1] = fields[54].GetUInt32(); + cInfo->spells[2] = fields[55].GetUInt32(); + cInfo->spells[3] = fields[56].GetUInt32(); + cInfo->spells[4] = fields[57].GetUInt32(); + cInfo->spells[5] = fields[58].GetUInt32(); + cInfo->spells[6] = fields[59].GetUInt32(); + cInfo->spells[7] = fields[60].GetUInt32(); + cInfo->PetSpellDataId = fields[61].GetUInt32(); + cInfo->VehicleId = fields[62].GetUInt32(); + cInfo->mingold = fields[63].GetUInt32(); + cInfo->maxgold = fields[64].GetUInt32(); + cInfo->AIName = fields[65].GetString(); + cInfo->MovementType = fields[66].GetUInt8(); + cInfo->InhabitType = fields[67].GetUInt8(); + cInfo->HoverHeight = fields[68].GetFloat(); + cInfo->ModHealth = fields[69].GetFloat(); + cInfo->ModMana = fields[70].GetFloat(); + cInfo->ModManaExtra = fields[71].GetFloat(); + cInfo->ModArmor = fields[72].GetFloat(); + cInfo->RacialLeader = fields[73].GetBool(); + cInfo->questItems[0] = fields[74].GetUInt32(); + cInfo->questItems[1] = fields[75].GetUInt32(); + cInfo->questItems[2] = fields[76].GetUInt32(); + cInfo->questItems[3] = fields[77].GetUInt32(); + cInfo->questItems[4] = fields[78].GetUInt32(); + cInfo->questItems[5] = fields[79].GetUInt32(); + cInfo->movementId = fields[80].GetUInt32(); + cInfo->RegenHealth = fields[81].GetBool(); + cInfo->equipmentId = fields[82].GetUInt32(); + cInfo->MechanicImmuneMask = fields[83].GetUInt32(); + cInfo->flags_extra = fields[84].GetUInt32(); + cInfo->ScriptID = sObjectMgr->GetScriptId(fields[85].GetCString()); sObjectMgr->CheckCreatureTemplate(cInfo); } -- cgit v1.2.3 From f44ddb3355eaab1786fbdad806001db5d1f0769e Mon Sep 17 00:00:00 2001 From: Nay Date: Wed, 5 Sep 2012 20:15:20 +0100 Subject: Tabs to spaces --- src/server/game/Entities/Player/Player.h | 5 ++++- src/server/game/Handlers/MiscHandler.cpp | 2 +- .../Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 41b01036ef5..97a8d10b16a 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -182,7 +182,7 @@ enum CUFBoolOptions CUF_UNK_156, CUF_UNK_157, - // Two of the unks is _LOCKED and _SHOWN + // The unks is _LOCKED and _SHOWN and _DYNAMIC, unknown order CUF_BOOL_OPTIONS_COUNT, }; @@ -226,9 +226,12 @@ struct CUFProfile uint8 SortBy; uint8 HealthText; + // LeftAlign, TopAlight, BottomAllign (unk order) uint8 Unk146; uint8 Unk147; uint8 Unk148; + + // LeftOffset, TopOffset and BottomOffset (unk order) uint16 Unk150; uint16 Unk152; uint16 Unk154; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 6499ead3685..aace2b8c9b8 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -2051,7 +2051,7 @@ void WorldSession::SendLoadCUFProfiles() ByteBuffer byteBuffer(25 * count); WorldPacket data(SMSG_LOAD_CUF_PROFILES, 5 * count + 25 * count); - data.WriteBits(count, 20); + data.WriteBits(count, 20); for (uint8 i = 0; i < MAX_CUF_PROFILES; ++i) { CUFProfile* profile = player->GetCUFProfile(i); diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index 156581e8cd2..233a8d82497 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -350,10 +350,10 @@ class instance_blood_furnace : public InstanceMapScript ++PrisonerCounter8; } else - return; + return; } else - return; + return; ResetPrisoner(creature); } -- cgit v1.2.3 From da5f8f58e205bd2c896677daf6500af4ffe655f1 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 9 Sep 2012 11:42:31 -0500 Subject: Core/Scripts: Cleanup the warrior spell scripts --- .../2012_09_09_01_world_spell_script_names.sql | 5 + src/server/game/Spells/SpellEffects.cpp | 2 +- src/server/scripts/Spells/spell_warrior.cpp | 233 ++++----------------- 3 files changed, 45 insertions(+), 195 deletions(-) create mode 100644 sql/updates/world/2012_09_09_01_world_spell_script_names.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_09_09_01_world_spell_script_names.sql b/sql/updates/world/2012_09_09_01_world_spell_script_names.sql new file mode 100644 index 00000000000..5c1701e45bd --- /dev/null +++ b/sql/updates/world/2012_09_09_01_world_spell_script_names.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_warr_improved_spell_reflection', 'spell_warr_vigilance', 'spell_warr_charge', 'spell_warr_slam', 'spell_warr_execute', 'spell_warr_overpower'); +INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) VALUES +(100,'spell_warr_charge'), +(1464,'spell_warr_slam'), +(5308,'spell_warr_execute'); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 340140ea249..7e32ce9137e 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -387,7 +387,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) case SPELLFAMILY_WARRIOR: { // Victory Rush - if (m_spellInfo->SpellFamilyFlags[1] & 0x100) + if (m_spellInfo->Id == 34428) ApplyPctF(damage, m_caster->GetTotalAttackPowerValue(BASE_ATTACK)); // Shockwave else if (m_spellInfo->Id == 46968) diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index c64101e11ea..2918a05774d 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -27,9 +27,21 @@ enum WarriorSpells { - WARRIOR_SPELL_LAST_STAND_TRIGGERED = 12976, + SPELL_LAST_STAND_TRIGGERED = 12976, + SPELL_DEEP_WOUNDS_RANK_1 = 12162, + SPELL_DEEP_WOUNDS_RANK_2 = 12850, + SPELL_DEEP_WOUNDS_RANK_3 = 12868, + SPELL_DEEP_WOUNDS_RANK_PERIODIC = 12721, + SPELL_JUGGERNAUT_CRIT_BONUS_TALENT = 64976, + SPELL_JUGGERNAUT_CRIT_BONUS_BUFF = 65156, + SPELL_CHARGE = 34846, + SPELL_SLAM = 50782, + ICON_ID_SUDDEN_DEATH = 1989, + SPELL_BLOODTHIRST_DAMAGE = 23881, + SPELL_BLOODTHIRST = 23885, }; +/// Updated 4.3.4 class spell_warr_last_stand : public SpellScriptLoader { public: @@ -41,7 +53,7 @@ class spell_warr_last_stand : public SpellScriptLoader bool Validate(SpellInfo const* /*spellEntry*/) { - if (!sSpellMgr->GetSpellInfo(WARRIOR_SPELL_LAST_STAND_TRIGGERED)) + if (!sSpellMgr->GetSpellInfo(SPELL_LAST_STAND_TRIGGERED)) return false; return true; } @@ -50,8 +62,8 @@ class spell_warr_last_stand : public SpellScriptLoader { if (Unit* caster = GetCaster()) { - int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30)); - caster->CastCustomSpell(caster, WARRIOR_SPELL_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL); + int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue())); + caster->CastCustomSpell(caster, SPELL_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL); } } @@ -68,96 +80,7 @@ class spell_warr_last_stand : public SpellScriptLoader } }; -class spell_warr_improved_spell_reflection : public SpellScriptLoader -{ - public: - spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { } - - class spell_warr_improved_spell_reflection_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warr_improved_spell_reflection_SpellScript); - - void FilterTargets(std::list& unitList) - { - if (GetCaster()) - unitList.remove(GetCaster()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_improved_spell_reflection_SpellScript(); - } -}; - -enum DamageReductionAura -{ - SPELL_BLESSING_OF_SANCTUARY = 20911, - SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, - SPELL_RENEWED_HOPE = 63944, - SPELL_DAMAGE_REDUCTION_AURA = 68066, -}; - -class spell_warr_vigilance : public SpellScriptLoader -{ -public: - spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } - - class spell_warr_vigilance_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warr_vigilance_AuraScript); - - bool Validate(SpellInfo const* /*SpellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) - return false; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - { - if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_RENEWED_HOPE))) - target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_vigilance_AuraScript(); - } -}; - -enum DeepWounds -{ - SPELL_DEEP_WOUNDS_RANK_1 = 12162, - SPELL_DEEP_WOUNDS_RANK_2 = 12850, - SPELL_DEEP_WOUNDS_RANK_3 = 12868, - SPELL_DEEP_WOUNDS_RANK_PERIODIC = 12721, -}; - +/// Updated 4.3.4 class spell_warr_deep_wounds : public SpellScriptLoader { public: @@ -174,7 +97,7 @@ class spell_warr_deep_wounds : public SpellScriptLoader return true; } - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleDummy(SpellEffIndex /*effIndex*/) { int32 damage = GetEffectValue(); Unit* caster = GetCaster(); @@ -212,13 +135,7 @@ class spell_warr_deep_wounds : public SpellScriptLoader } }; -enum Charge -{ - SPELL_JUGGERNAUT_CRIT_BONUS_TALENT = 64976, - SPELL_JUGGERNAUT_CRIT_BONUS_BUFF = 65156, - SPELL_CHARGE = 34846, -}; - +/// Updated 4.3.4 class spell_warr_charge : public SpellScriptLoader { public: @@ -234,7 +151,7 @@ class spell_warr_charge : public SpellScriptLoader return false; return true; } - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleDummy(SpellEffIndex /*effIndex*/) { int32 chargeBasePoints0 = GetEffectValue(); Unit* caster = GetCaster(); @@ -257,11 +174,7 @@ class spell_warr_charge : public SpellScriptLoader } }; -enum Slam -{ - SPELL_SLAM = 50783, -}; - +/// Updated 4.3.4 class spell_warr_slam : public SpellScriptLoader { public: @@ -277,7 +190,7 @@ class spell_warr_slam : public SpellScriptLoader return false; return true; } - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleDummy(SpellEffIndex /*effIndex*/) { int32 bp0 = GetEffectValue(); if (GetHitUnit()) @@ -296,13 +209,7 @@ class spell_warr_slam : public SpellScriptLoader } }; -enum Execute -{ - SPELL_EXECUTE = 20647, - SPELL_GLYPH_OF_EXECUTION = 58367, - ICON_ID_SUDDEN_DEATH = 1989, -}; - +/// Updated 4.3.4 class spell_warr_execute : public SpellScriptLoader { public: @@ -312,42 +219,35 @@ class spell_warr_execute : public SpellScriptLoader { PrepareSpellScript(spell_warr_execute_SpellScript); - bool Validate(SpellInfo const* /*SpellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_GLYPH_OF_EXECUTION)) - return false; - return true; - } - void HandleDummy(SpellEffIndex effIndex) + void HandleEffect(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); if (Unit* target = GetHitUnit()) { SpellInfo const* spellInfo = GetSpellInfo(); - int32 rageUsed = std::min(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); + int32 rageUsed = std::min(200 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); int32 newRage = std::max(0, caster->GetPower(POWER_RAGE) - rageUsed); // Sudden Death rage save if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, ICON_ID_SUDDEN_DEATH, EFFECT_0)) { - int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10; + int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_0].CalcValue() * 10; newRage = std::max(newRage, ragesave); } - + caster->SetPower(POWER_RAGE, uint32(newRage)); - // Glyph of Execution bonus - if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_GLYPH_OF_EXECUTION, EFFECT_0)) - rageUsed += aurEff->GetAmount() * 10; - - - int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f); - caster->CastCustomSpell(target,SPELL_EXECUTE,&bp,0,0,true,0,0,GetOriginalCaster()->GetGUID()); + + /// Formula taken from the DBC: "${10+$AP*0.437*$m1/100}" + int32 baseDamage = int32(10 + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.437f * GetEffectValue() / 100.0f); + /// Formula taken from the DBC: "${$ap*0.874*$m1/100-1} = 20 rage" + int32 moreDamage = int32(rageUsed * (caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.874f * GetEffectValue() / 100.0f - 1) / 200); + SetHitDamage(baseDamage + moreDamage); } } void Register() { - OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); } }; @@ -357,6 +257,7 @@ class spell_warr_execute : public SpellScriptLoader } }; +/// Updated 4.3.4 class spell_warr_concussion_blow : public SpellScriptLoader { public: @@ -366,7 +267,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader { PrepareSpellScript(spell_warr_concussion_blow_SpellScript); - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleDummy(SpellEffIndex /*effIndex*/) { SetHitDamage(CalculatePctN(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue())); } @@ -383,11 +284,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader } }; -enum Bloodthirst -{ - SPELL_BLOODTHIRST = 23885, -}; - +/// Updated 4.3.4 class spell_warr_bloodthirst : public SpellScriptLoader { public: @@ -429,11 +326,7 @@ class spell_warr_bloodthirst : public SpellScriptLoader } }; -enum BloodthirstHeal -{ - SPELL_BLOODTHIRST_DAMAGE = 23881, -}; - +/// Updated 4.3.4 class spell_warr_bloodthirst_heal : public SpellScriptLoader { public: @@ -446,7 +339,7 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader void HandleHeal(SpellEffIndex /*effIndex*/) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_BLOODTHIRST_DAMAGE)) - SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); + SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())) / 100); } void Register() @@ -461,56 +354,9 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader } }; -enum Overpower -{ - SPELL_UNRELENTING_ASSAULT_RANK_1 = 46859, - SPELL_UNRELENTING_ASSAULT_RANK_2 = 46860, - SPELL_UNRELENTING_ASSAULT_TRIGGER_1 = 64849, - SPELL_UNRELENTING_ASSAULT_TRIGGER_2 = 64850, -}; - -class spell_warr_overpower : public SpellScriptLoader -{ -public: - spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { } - - class spell_warr_overpower_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warr_overpower_SpellScript); - - void HandleEffect(SpellEffIndex /* effIndex */) - { - uint32 spellId = 0; - if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_1)) - spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_1; - else if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_2)) - spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_2; - - if (!spellId) - return; - - if (Player* target = GetHitPlayer()) - if (target->HasUnitState(UNIT_STATE_CASTING)) - target->CastSpell(target, spellId, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_overpower_SpellScript(); - } -}; - void AddSC_warrior_spell_scripts() { new spell_warr_last_stand(); - new spell_warr_improved_spell_reflection(); - new spell_warr_vigilance(); new spell_warr_deep_wounds(); new spell_warr_charge(); new spell_warr_slam(); @@ -518,5 +364,4 @@ void AddSC_warrior_spell_scripts() new spell_warr_concussion_blow(); new spell_warr_bloodthirst(); new spell_warr_bloodthirst_heal(); - new spell_warr_overpower(); } -- cgit v1.2.3 From 6fc3d3a77c738411b12a06fd1e6b32b1562a56c7 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 9 Sep 2012 12:28:31 -0500 Subject: Core/Scripts: Some cleanup in warlock spellscripts --- .../2012_09_09_02_world_spell_script_names.sql | 4 +++ src/server/scripts/Spells/spell_warlock.cpp | 38 ++++------------------ 2 files changed, 10 insertions(+), 32 deletions(-) create mode 100644 sql/updates/world/2012_09_09_02_world_spell_script_names.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_09_09_02_world_spell_script_names.sql b/sql/updates/world/2012_09_09_02_world_spell_script_names.sql new file mode 100644 index 00000000000..a4304663d9c --- /dev/null +++ b/sql/updates/world/2012_09_09_02_world_spell_script_names.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_warl_banish','spell_warl_create_healthstone','spell_warl_ritual_of_doom_effect'); +INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) VALUES +(710,'spell_warl_banish'), +(6201,'spell_warl_create_healthstone'); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 0def62b7d3a..a841db86e65 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -47,6 +47,7 @@ enum WarlockSpells WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956, }; +/// Updated 4.3.4 class spell_warl_banish : public SpellScriptLoader { public: @@ -64,11 +65,13 @@ public: void HandleBanish() { + /// Casting Banish on a banished target will cancel the effect + /// Check if the target already has Banish, if so, do nothing. if (Unit* target = GetHitUnit()) { if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0)) { - //No need to remove old aura since its removed due to not stack by current Banish aura + // No need to remove old aura since its removed due to not stack by current Banish aura PreventHitDefaultEffect(EFFECT_0); PreventHitDefaultEffect(EFFECT_1); PreventHitDefaultEffect(EFFECT_2); @@ -99,6 +102,7 @@ public: }; // 47193 Demonic Empowerment +/// Updated 4.3.4 class spell_warl_demonic_empowerment : public SpellScriptLoader { public: @@ -132,7 +136,6 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER); int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0))); targetCreature->CastCustomSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, &hp, NULL, NULL, true); - //unitTarget->CastSpell(unitTarget, 54441, true); break; } case CREATURE_FAMILY_FELGUARD: @@ -161,7 +164,7 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader } }; -// 6201 Create Healthstone (and ranks) +// 6201 Create Healthstone class spell_warl_create_healthstone : public SpellScriptLoader { public: @@ -270,34 +273,6 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader } }; -// 18541 Ritual of Doom Effect -class spell_warl_ritual_of_doom_effect : public SpellScriptLoader -{ -public: - spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } - - class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, GetEffectValue(), true); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_ritual_of_doom_effect_SpellScript(); - } -}; - class spell_warl_seed_of_corruption : public SpellScriptLoader { public: @@ -723,7 +698,6 @@ void AddSC_warlock_spell_scripts() new spell_warl_demonic_empowerment(); new spell_warl_create_healthstone(); new spell_warl_everlasting_affliction(); - new spell_warl_ritual_of_doom_effect(); new spell_warl_seed_of_corruption(); new spell_warl_soulshatter(); new spell_warl_life_tap(); -- cgit v1.2.3 From 5226f53b8ae815f707538b66207727e2715af826 Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 10 Sep 2012 00:06:47 +0100 Subject: Core/Guilds: Corrections to guild news & rewards commit, fixed build and added missing sql Closes #7708 --- .../characters/2012_09_09_00_characters_guild_news.sql | 11 +++++++++++ src/server/game/Entities/Player/Player.cpp | 14 ++++++++------ src/server/game/Guilds/Guild.cpp | 17 +++++++++-------- src/server/game/Guilds/Guild.h | 7 ++++--- src/server/game/Guilds/GuildMgr.cpp | 7 ++++--- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/GuildHandler.cpp | 10 +++++----- src/server/game/Spells/SpellEffects.cpp | 2 +- src/server/scripts/Spells/spell_warrior.cpp | 4 ++-- .../Database/Implementation/CharacterDatabase.cpp | 2 +- 10 files changed, 46 insertions(+), 30 deletions(-) create mode 100644 sql/updates/characters/2012_09_09_00_characters_guild_news.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2012_09_09_00_characters_guild_news.sql b/sql/updates/characters/2012_09_09_00_characters_guild_news.sql new file mode 100644 index 00000000000..78fa817678b --- /dev/null +++ b/sql/updates/characters/2012_09_09_00_characters_guild_news.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS `guild_news_log`; +CREATE TABLE `guild_news_log` ( + `guild` int(10) unsigned NOT NULL, + `id` int(10) unsigned NOT NULL, + `eventType` int(10) unsigned NOT NULL, + `playerGuid` bigint(20) unsigned NOT NULL, + `data` int(10) unsigned NOT NULL, + `flags` int(10) unsigned NOT NULL, + `date` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guild`,`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9b80750437c..ee6d71e64b1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21496,13 +21496,15 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 return false; } - bool bought = crItem->maxcount != 0; - - if (bought) - if ((pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]) || pProto->Quality > ITEM_QUALITY_EPIC) + if (crItem->maxcount != 0) // bought + { + if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId())) guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_PURCHASED, time(NULL), GetGUID(), 0, item); - return bought; + return true; + } + + return false; } uint32 Player::GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const @@ -24237,7 +24239,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) --loot->unlootedCount; if (const ItemTemplate* proto = sObjectMgr->GetItemTemplate(item->itemid)) - if ((proto->Quality == ITEM_QUALITY_EPIC && proto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]) || proto->Quality > ITEM_QUALITY_EPIC) + if (proto->Quality > ITEM_QUALITY_EPIC || (proto->Quality == ITEM_QUALITY_EPIC && proto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId())) guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_LOOTED, time(NULL), GetGUID(), 0, item->itemid); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 09188843d52..e7121b0fa81 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -3263,6 +3263,7 @@ void Guild::ResetDailyExperience() void Guild::GuildNewsLog::AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data) { uint32 id = _newsLog.size(); + GuildNewsEntry& log = _newsLog[id]; log.EventType = eventType; log.PlayerGuid = playerGuid; @@ -3280,9 +3281,9 @@ void Guild::GuildNewsLog::AddNewEvent(GuildNews eventType, time_t date, uint64 p stmt->setUInt32(6, uint32(log.Date)); CharacterDatabase.Execute(stmt); - WorldPacket pData; - BuildNewsData(id, log, pData); - GetGuild()->BroadcastPacket(&pData); + WorldPacket packet; + BuildNewsData(id, log, packet); + GetGuild()->BroadcastPacket(&packet); } void Guild::GuildNewsLog::LoadFromDB(PreparedQueryResult result) @@ -3305,10 +3306,10 @@ void Guild::GuildNewsLog::LoadFromDB(PreparedQueryResult result) void Guild::GuildNewsLog::BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data) { - data.Initialize(SMSG_GUILD_NEWS_UPDATE); - data.WriteBits(1, 21); + data.Initialize(SMSG_GUILD_NEWS_UPDATE, 7 + 32); + data.WriteBits(1, 21); // size, we are only sending 1 news here - data.WriteBits(0, 26); // Other Guids NYI + data.WriteBits(0, 26); // Not yet implemented used for guild achievements ObjectGuid guid = guildNew.PlayerGuid; data.WriteBit(guid[7]); @@ -3326,7 +3327,7 @@ void Guild::GuildNewsLog::BuildNewsData(uint32 id, GuildNewsEntry& guildNew, Wor data << uint32(guildNew.Flags); // 1 sticky data << uint32(guildNew.Data); - data << uint32(0); + data << uint32(0); // always 0 data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[6]); @@ -3343,7 +3344,7 @@ void Guild::GuildNewsLog::BuildNewsData(uint32 id, GuildNewsEntry& guildNew, Wor void Guild::GuildNewsLog::BuildNewsData(WorldPacket& data) { - data.Initialize(SMSG_GUILD_NEWS_UPDATE); + data.Initialize(SMSG_GUILD_NEWS_UPDATE, (21 + _newsLog.size() * (26 + 8)) / 8 + (8 + 6 * 4) * _newsLog.size()); data.WriteBits(_newsLog.size(), 21); for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index c9799fbe5ca..f3e18d8998b 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -230,7 +230,7 @@ enum GuildNews { GUILD_NEWS_GUILD_ACHIEVEMENT = 0, GUILD_NEWS_PLAYER_ACHIEVEMENT = 1, - GUILD_NEWS_DUNGEON_ENCOUNTER = 2, // Todo Implement + GUILD_NEWS_DUNGEON_ENCOUNTER = 2, // @todo Implement GUILD_NEWS_ITEM_LOOTED = 3, GUILD_NEWS_ITEM_CRAFTED = 4, GUILD_NEWS_ITEM_PURCHASED = 5, @@ -249,15 +249,16 @@ struct GuildNewsEntry struct GuildReward { uint32 Entry; - uint8 Standing; int32 Racemask; uint64 Price; uint32 AchievementId; + uint8 Standing; }; uint32 const MinNewsItemLevel[MAX_CONTENT] = { 61, 90, 200, 353 }; typedef std::map GuildNewsLogMap; + #define GUILD_EXPERIENCE_UNCAPPED_LEVEL 20 ///> Hardcoded in client, starting from this level, guild daily experience gain is unlimited. //////////////////////////////////////////////////////////////////////////////////////////// @@ -390,7 +391,7 @@ private: void BuildNewsData(WorldPacket& data); void BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data); void AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data); - GuildNewsEntry* GetNewById(uint32 id) + GuildNewsEntry* GetNewsById(uint32 id) { GuildNewsLogMap::iterator itr = _newsLog.find(id); if (itr != _newsLog.end()) diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index c611732ab48..8eef6b2ade3 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -436,7 +436,7 @@ void GuildMgr::LoadGuilds() // 10. Loading Guild news sLog->outInfo(LOG_FILTER_GENERAL, "Loading Guild News"); { - for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); itr++) + for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_NEWS); stmt->setInt32(0, itr->first); @@ -474,7 +474,7 @@ void GuildMgr::LoadGuildXpForLevel() for (uint8 level = 0; level < sWorld->getIntConfig(CONFIG_GUILD_MAX_LEVEL); ++level) GuildXPperLevel[level] = 0; - // 0 1 + // 0 1 QueryResult result = WorldDatabase.Query("SELECT lvl, xp_for_next_level FROM guild_xp_for_level"); if (!result) @@ -500,6 +500,7 @@ void GuildMgr::LoadGuildXpForLevel() GuildXPperLevel[level] = requiredXP; ++count; + } while (result->NextRow()); // fill level gaps @@ -519,7 +520,7 @@ void GuildMgr::LoadGuildRewards() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 + // 0 1 2 3 4 QueryResult result = WorldDatabase.Query("SELECT entry, standing, racemask, price, achievement FROM guild_rewards"); if (!result) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 66d8acb5d34..f21001ba7bf 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -767,7 +767,7 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) guid[0] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); - + recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[5]); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index bbd21176511..c0d96b53190 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -791,7 +791,7 @@ void WorldSession::HandleGuildRewardsQueryOpcode(WorldPacket& recvPacket) { std::vector const& rewards = sGuildMgr->GetGuildRewards(); - WorldPacket data(SMSG_GUILD_REWARDS_LIST, (3 + rewards.size() * (4 + 4 + 4 +8 + 4 +4))); + WorldPacket data(SMSG_GUILD_REWARDS_LIST, 3 + rewards.size() * (4 + 4 + 4 + 8 + 4 + 4)); data.WriteBits(rewards.size(), 21); data.FlushBits(); @@ -823,11 +823,11 @@ void WorldSession::HandleGuildQueryNewsOpcode(WorldPacket& recvPacket) void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket) { - uint32 newId; + uint32 newsId; bool sticky; ObjectGuid guid; - recvPacket >> id; + recvPacket >> newsId; guid[2] = recvPacket.ReadBit(); guid[4] = recvPacket.ReadBit(); @@ -850,7 +850,7 @@ void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket) if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) { - if (GuildNewsEntry* newsEntry = guild->GetNewsLog().GetNewById(id)) + if (GuildNewsEntry* newsEntry = guild->GetNewsLog().GetNewsById(newsId)) { if (sticky) newsEntry->Flags |= 1; @@ -858,7 +858,7 @@ void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket) newsEntry->Flags &= ~1; WorldPacket data; - guild->GetNewsLog().BuildNewsData(id, *newsEntry, data); + guild->GetNewsLog().BuildNewsData(newsId, *newsEntry, data); SendPacket(&data); } } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 095cceab7bf..767f17cd276 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1569,7 +1569,7 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) // create the new item and store it Item* pItem = player->StoreNewItem(dest, newitemid, true, Item::GenerateItemRandomPropertyId(newitemid)); - if ((pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]) || pProto->Quality > ITEM_QUALITY_EPIC) + if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_CRAFTED, time(NULL), player->GetGUID(), 0, pProto->ItemId); diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 2918a05774d..7b0952dac7b 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -234,9 +234,9 @@ class spell_warr_execute : public SpellScriptLoader int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_0].CalcValue() * 10; newRage = std::max(newRage, ragesave); } - + caster->SetPower(POWER_RAGE, uint32(newRage)); - + /// Formula taken from the DBC: "${10+$AP*0.437*$m1/100}" int32 baseDamage = int32(10 + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.437f * GetEffectValue() / 100.0f); /// Formula taken from the DBC: "${$ap*0.874*$m1/100-1} = 20 rage" diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 1b17c35284b..3d848f94c00 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -242,7 +242,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_UPD_GUILD_EXPERIENCE, "UPDATE guild SET level = ?, experience = ?, todayExperience = ? WHERE guildId = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_GUILD_RESET_TODAY_EXPERIENCE, "UPDATE guild SET todayExperience = 0", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_LOAD_GUILD_NEWS, "SELECT id, eventType, playerGuid, data, flags, date FROM guild_news_log WHERE guild = ? ORDER BY guild ASC, id ASC", CONNECTION_SYNCH); - PREPARE_STATEMENT(CHAR_SAVE_GUILD_NEWS, "INSERT INTO guild_news_log values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_SAVE_GUILD_NEWS, "INSERT INTO guild_news_log (guild, id, eventType, playerGuid, data, flags, date) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); // Chat channel handling PREPARE_STATEMENT(CHAR_SEL_CHANNEL, "SELECT announce, ownership, password, bannedList FROM channels WHERE name = ? AND team = ?", CONNECTION_SYNCH) -- cgit v1.2.3 From 917ffc030ea2ffaf698d2bd2b1e7967081a27beb Mon Sep 17 00:00:00 2001 From: Warpten Date: Sun, 9 Sep 2012 11:32:14 +0200 Subject: Core/Guilds: Implemented GuildFinder. --- sql/base/characters_database.sql | 38 ++ .../2012_09_08_00_characters_guild_finder_434.sql | 40 ++ src/server/game/Entities/Object/ObjectDefines.h | 1 + src/server/game/Entities/Unit/Unit.cpp | 3 + src/server/game/Guilds/Guild.cpp | 5 + src/server/game/Guilds/Guild.h | 2 + src/server/game/Guilds/GuildFinderMgr.cpp | 305 ++++++++++++++ src/server/game/Guilds/GuildFinderMgr.h | 268 +++++++++++++ src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/Handlers/GuildFinderHandler.cpp | 443 +++++++++++++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 32 +- src/server/game/Server/Protocol/Opcodes.h | 2 - src/server/game/Server/WorldSession.h | 11 +- src/server/game/Tools/PlayerDump.cpp | 4 +- src/server/game/World/World.cpp | 19 +- src/server/game/World/World.h | 6 +- src/server/scripts/Commands/cs_character.cpp | 2 +- .../Database/Implementation/CharacterDatabase.cpp | 8 +- .../Database/Implementation/CharacterDatabase.h | 5 + 19 files changed, 1168 insertions(+), 28 deletions(-) create mode 100644 sql/updates/characters/2012_09_08_00_characters_guild_finder_434.sql create mode 100644 src/server/game/Guilds/GuildFinderMgr.cpp create mode 100644 src/server/game/Guilds/GuildFinderMgr.h create mode 100644 src/server/game/Handlers/GuildFinderHandler.cpp mode change 100755 => 100644 src/server/shared/Database/Implementation/CharacterDatabase.cpp (limited to 'src/server/scripts') diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index fe2a859d5e6..115047173ae 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1851,6 +1851,44 @@ LOCK TABLES `guild_eventlog` WRITE; /*!40000 ALTER TABLE `guild_eventlog` ENABLE KEYS */; UNLOCK TABLES; +--- +--- Table structure for table `guild_finder_applicant` +--- + +DROP TABLE IF EXISTS `guild_finder_applicant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `guild_finder_applicant` ( + `guildId` int(10) unsigned DEFAULT NULL, + `playerGuid` int(10) unsigned DEFAULT NULL, + `availability` tinyint(3) unsigned DEFAULT '0', + `classRole` tinyint(3) unsigned DEFAULT '0', + `interests` tinyint(3) unsigned DEFAULT '0', + `comment` varchar(255) DEFAULT NULL, + `submitTime` int(10) unsigned DEFAULT NULL, + UNIQUE KEY `guildId` (`guildId`,`playerGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="Guild finder membership requests"; +/*!40101 SET character_set_client = @saved_cs_client */; + +--- +--- Table structure for table `guild_finder_guild_settings` +--- + +DROP TABLE IF EXISTS `guild_finder_guild_settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `guild_finder_guild_settings` ( + `guildId` int(10) unsigned NOT NULL, + `availability` tinyint(3) unsigned NOT NULL DEFAULT '0', + `classRoles` tinyint(3) unsigned NOT NULL DEFAULT '0', + `interests` tinyint(3) unsigned NOT NULL DEFAULT '0', + `level` tinyint(3) unsigned NOT NULL DEFAULT '1', + `listed` tinyint(3) unsigned NOT NULL DEFAULT '0', + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`guildId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="Guild finder guild-releated settings storage"; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `guild_member` -- diff --git a/sql/updates/characters/2012_09_08_00_characters_guild_finder_434.sql b/sql/updates/characters/2012_09_08_00_characters_guild_finder_434.sql new file mode 100644 index 00000000000..d4d524e0bef --- /dev/null +++ b/sql/updates/characters/2012_09_08_00_characters_guild_finder_434.sql @@ -0,0 +1,40 @@ +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/* Table structure for table `guild_finder_applicant` */ + +DROP TABLE IF EXISTS `guild_finder_applicant`; + +CREATE TABLE `guild_finder_applicant` ( + `guildId` int(10) unsigned DEFAULT NULL, + `playerGuid` int(10) unsigned DEFAULT NULL, + `availability` tinyint(3) unsigned DEFAULT '0', + `classRole` tinyint(3) unsigned DEFAULT '0', + `interests` tinyint(3) unsigned DEFAULT '0', + `comment` varchar(255) DEFAULT NULL, + `submitTime` int(10) unsigned DEFAULT NULL, + UNIQUE KEY `guildId` (`guildId`,`playerGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +/* Table structure for table `guild_finder_guild_settings` */ + +DROP TABLE IF EXISTS `guild_finder_guild_settings`; + +CREATE TABLE `guild_finder_guild_settings` ( + `guildId` int(10) unsigned NOT NULL, + `availability` tinyint(3) unsigned NOT NULL DEFAULT '0', + `classRoles` tinyint(3) unsigned NOT NULL DEFAULT '0', + `interests` tinyint(3) unsigned NOT NULL DEFAULT '0', + `level` tinyint(3) unsigned NOT NULL DEFAULT '1', + `listed` tinyint(3) unsigned NOT NULL DEFAULT '0', + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`guildId`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h index b971943954e..46baee4a284 100755 --- a/src/server/game/Entities/Object/ObjectDefines.h +++ b/src/server/game/Entities/Object/ObjectDefines.h @@ -57,6 +57,7 @@ enum HighGuid #define IS_CRE_OR_VEH_GUID(Guid) (IS_CREATURE_GUID(Guid) || IS_VEHICLE_GUID(Guid)) #define IS_CRE_OR_VEH_OR_PET_GUID(Guid)(IS_CRE_OR_VEH_GUID(Guid) || IS_PET_GUID(Guid)) #define IS_PLAYER_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_PLAYER && Guid != 0) +#define IS_GUILD_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_GUILD && Guid != 0) #define IS_UNIT_GUID(Guid) (IS_CRE_OR_VEH_OR_PET_GUID(Guid) || IS_PLAYER_GUID(Guid)) // special case for empty guid need check #define IS_ITEM_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_ITEM) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7d1734ee204..7886c0354f5 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12780,6 +12780,9 @@ void Unit::SetLevel(uint8 lvl) // group update if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->GetGroup()) ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_LEVEL); + + if (GetTypeId() == TYPEID_PLAYER) + sWorld->UpdateCharacterNameDataLevel(ToPlayer()->GetGUIDLow(), lvl); } void Unit::SetHealth(uint32 val) diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index e7121b0fa81..92191551858 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -19,6 +19,7 @@ #include "DatabaseEnv.h" #include "Guild.h" #include "GuildMgr.h" +#include "GuildFinderMgr.h" #include "ScriptMgr.h" #include "Chat.h" #include "Config.h" @@ -1190,6 +1191,9 @@ void Guild::Disband() trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); + + sGuildFinderMgr->DeleteGuild(m_id); + sGuildMgr->RemoveGuild(m_id); } @@ -1665,6 +1669,7 @@ void Guild::HandleAcceptMember(WorldSession* session) { _LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, player->GetGUIDLow()); _BroadcastEvent(GE_JOINED, player->GetGUID(), player->GetName()); + sGuildFinderMgr->RemoveMembershipRequest(player->GetGUIDLow(), GUID_LOPART(this->GetGUID())); } } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index f3e18d8998b..f644e5d3592 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -787,6 +787,8 @@ public: void ResetDailyExperience(); GuildNewsLog& GetNewsLog() { return _newsLog; } + EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; } + protected: uint32 m_id; std::string m_name; diff --git a/src/server/game/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp new file mode 100644 index 00000000000..71a1a9ded0d --- /dev/null +++ b/src/server/game/Guilds/GuildFinderMgr.cpp @@ -0,0 +1,305 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "GuildFinderMgr.h" +#include "GuildMgr.h" +#include "World.h" + +GuildFinderMgr::GuildFinderMgr() +{ +} + +GuildFinderMgr::~GuildFinderMgr() +{ +} + +void GuildFinderMgr::LoadFromDB() +{ + LoadGuildSettings(); + LoadMembershipRequests(); +} + +void GuildFinderMgr::LoadGuildSettings() +{ + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading guild finder guild-related settings..."); + // 0 1 2 3 4 5 6 7 + QueryResult result = CharacterDatabase.Query("SELECT gfgs.guildId, gfgs.availability, gfgs.classRoles, gfgs.interests, gfgs.level, gfgs.listed, gfgs.comment, c.race " + "FROM guild_finder_guild_settings gfgs " + "LEFT JOIN guild_member gm ON gm.guildid=gfgs.guildId " + "LEFT JOIN characters c ON c.guid = gm.guid LIMIT 1"); + + if (!result) + { + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild finder guild-related settings. Table `guild_finder_guild_settings` is empty."); + return; + } + + uint32 count = 0; + uint32 oldMSTime = getMSTime(); + do + { + Field* fields = result->Fetch(); + uint32 guildId = fields[0].GetUInt32(); + uint8 availability = fields[1].GetUInt8(); + uint8 classRoles = fields[2].GetUInt8(); + uint8 interests = fields[3].GetUInt8(); + uint8 level = fields[4].GetUInt8(); + bool listed = (fields[5].GetUInt8() != 0); + std::string comment = fields[6].GetString(); + + TeamId guildTeam = TEAM_ALLIANCE; + if (ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(fields[7].GetUInt8())) + if (raceEntry->TeamID == 1) + guildTeam = TEAM_HORDE; + + LFGuildSettings settings(listed, guildTeam, guildId, classRoles, availability, interests, level, comment); + _guildSettings[guildId] = settings; + + ++count; + } while (result->NextRow()); + + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild finder guild-related settings in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); +} + +void GuildFinderMgr::LoadMembershipRequests() +{ + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading guild finder membership requests..."); + // 0 1 2 3 4 5 6 + QueryResult result = CharacterDatabase.Query("SELECT guildId, playerGuid, availability, classRole, interests, comment, submitTime " + "FROM guild_finder_applicant"); + + if (!result) + { + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild finder membership requests. Table `guild_finder_applicant` is empty."); + return; + } + + uint32 count = 0; + uint32 oldMSTime = getMSTime(); + do + { + Field* fields = result->Fetch(); + uint32 guildId = fields[0].GetUInt32(); + uint32 playerId = fields[1].GetUInt32(); + uint8 availability = fields[2].GetUInt8(); + uint8 classRoles = fields[3].GetUInt8(); + uint8 interests = fields[4].GetUInt8(); + std::string comment = fields[5].GetString(); + uint32 submitTime = fields[6].GetUInt32(); + + MembershipRequest request(playerId, guildId, availability, classRoles, interests, comment, time_t(submitTime)); + + _membershipRequests[guildId].push_back(request); + + ++count; + } while (result->NextRow()); + + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild finder membership requests in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); +} + +void GuildFinderMgr::AddMembershipRequest(uint32 guildGuid, MembershipRequest const& request) +{ + _membershipRequests[guildGuid].push_back(request); + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GUILD_FINDER_APPLICANT); + stmt->setUInt32(0, request.GetGuildId()); + stmt->setUInt32(1, request.GetPlayerGUID()); + stmt->setUInt8(2, request.GetAvailability()); + stmt->setUInt8(3, request.GetClassRoles()); + stmt->setUInt8(4, request.GetInterests()); + stmt->setString(5, request.GetComment()); + stmt->setUInt32(6, request.GetSubmitTime()); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); + + // Notify the applicant his submittion has been added + if (Player* player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(request.GetPlayerGUID(), 0, HIGHGUID_PLAYER))) + SendMembershipRequestListUpdate(*player); + + // Notify the guild master and officers the list changed + if (Guild* guild = sGuildMgr->GetGuildById(guildGuid)) + SendApplicantListUpdate(*guild); +} + +void GuildFinderMgr::RemoveMembershipRequest(uint32 playerId, uint32 guildId) +{ + std::vector::iterator itr = _membershipRequests[guildId].begin(); + for(; itr != _membershipRequests[guildId].end(); ++itr) + if (itr->GetPlayerGUID() == playerId) + break; + + if (itr == _membershipRequests[guildId].end()) + return; + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); + stmt->setUInt32(0, (*itr).GetGuildId()); + stmt->setUInt32(1, (*itr).GetPlayerGUID()); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); + + _membershipRequests[guildId].erase(itr); + + // Notify the applicant his submittion has been removed + if (Player* player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(playerId, 0, HIGHGUID_PLAYER))) + SendMembershipRequestListUpdate(*player); + + // Notify the guild master and officers the list changed + if (Guild* guild = sGuildMgr->GetGuildById(guildId)) + SendApplicantListUpdate(*guild); +} + +std::list GuildFinderMgr::GetAllMembershipRequestsForPlayer(uint32 playerGuid) +{ + std::list resultSet; + for (MembershipRequestStore::const_iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) + { + std::vector const& guildReqs = itr->second; + for (std::vector::const_iterator itr2 = guildReqs.begin(); itr2 != guildReqs.end(); ++itr2) + { + if (itr2->GetPlayerGUID() == playerGuid) + { + resultSet.push_back(*itr2); + break; + } + } + } + return resultSet; +} + +uint8 GuildFinderMgr::CountRequestsFromPlayer(uint32 playerId) +{ + uint8 result = 0; + for (MembershipRequestStore::const_iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) + { + for (std::vector::const_iterator itr2 = itr->second.begin(); itr2 != itr->second.end(); ++itr2) + { + if (itr2->GetPlayerGUID() != playerId) + continue; + ++result; + break; + } + } + return result; +} + +LFGuildStore GuildFinderMgr::GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction) +{ + LFGuildStore resultSet; + for (LFGuildStore::const_iterator itr = _guildSettings.begin(); itr != _guildSettings.end(); ++itr) + { + LFGuildSettings const& guildSettings = itr->second; + + if (guildSettings.GetTeam() != faction) + continue; + + if (!(guildSettings.GetAvailability() & settings.GetAvailability())) + continue; + + if (!(guildSettings.GetClassRoles() & settings.GetClassRoles())) + continue; + + if (!(guildSettings.GetInterests() & settings.GetInterests())) + continue; + + if (!(guildSettings.GetLevel() & settings.GetLevel())) + continue; + + resultSet.insert(std::make_pair(itr->first, guildSettings)); + } + + return resultSet; +} + +bool GuildFinderMgr::HasRequest(uint32 playerId, uint32 guildId) +{ + for (std::vector::const_iterator itr = _membershipRequests[guildId].begin(); itr != _membershipRequests[guildId].end(); ++itr) + if (itr->GetPlayerGUID() == playerId) + return true; + return false; +} + +void GuildFinderMgr::SetGuildSettings(uint32 guildGuid, LFGuildSettings const& settings) +{ + _guildSettings[guildGuid] = settings; + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GUILD_FINDER_GUILD_SETTINGS); + stmt->setUInt32(0, settings.GetGUID()); + stmt->setUInt8(1, settings.GetAvailability()); + stmt->setUInt8(2, settings.GetClassRoles()); + stmt->setUInt8(3, settings.GetInterests()); + stmt->setUInt8(4, settings.GetLevel()); + stmt->setUInt8(5, settings.IsListed()); + stmt->setString(6, settings.GetComment()); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); +} + +void GuildFinderMgr::DeleteGuild(uint32 guildId) +{ + std::vector::iterator itr = _membershipRequests[guildId].begin(); + while (itr != _membershipRequests[guildId].end()) + { + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + uint32 applicant = itr->GetPlayerGUID(); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); + stmt->setUInt32(0, itr->GetGuildId()); + stmt->setUInt32(1, applicant); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS); + stmt->setUInt32(0, (*itr).GetGuildId()); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); + _membershipRequests[guildId].erase(itr); + + // Notify the applicant his submition has been removed + if (Player* player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(applicant, 0, HIGHGUID_PLAYER))) + SendMembershipRequestListUpdate(*player); + } + + _membershipRequests.erase(guildId); + _guildSettings.erase(guildId); + + // Notify the guild master the list changed (even if he's not a GM any more, not sure if needed) + if (Guild* guild = sGuildMgr->GetGuildById(guildId)) + SendApplicantListUpdate(*guild); +} + +void GuildFinderMgr::SendApplicantListUpdate(Guild& guild) +{ + WorldPacket data(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, 0); + if (Player* player = ObjectAccessor::FindPlayer(guild.GetLeaderGUID())) + player->SendDirectMessage(&data); + guild.BroadcastPacketToRank(&data, GR_OFFICER); +} + +void GuildFinderMgr::SendMembershipRequestListUpdate(Player& player) +{ + WorldPacket data(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, 0); + player.SendDirectMessage(&data); +} diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h new file mode 100644 index 00000000000..049071dbca9 --- /dev/null +++ b/src/server/game/Guilds/GuildFinderMgr.h @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef __TRINITY_GUILDFINDER_H +#define __TRINITY_GUILDFINDER_H + +#include +#include "Common.h" +#include "World.h" +#include "GuildMgr.h" + +enum GuildFinderOptionsInterest +{ + INTEREST_QUESTING = 0x01, + INTEREST_DUNGEONS = 0x02, + INTEREST_RAIDS = 0x04, + INTEREST_PVP = 0x08, + INTEREST_ROLE_PLAYING = 0x10, + ALL_INTERESTS = INTEREST_QUESTING | INTEREST_DUNGEONS | INTEREST_RAIDS | INTEREST_PVP | INTEREST_ROLE_PLAYING +}; + +enum GuildFinderOptionsAvailability +{ + AVAILABILITY_WEEKDAYS = 0x1, + AVAILABILITY_WEEKENDS = 0x2, + ALL_WEEK = AVAILABILITY_WEEKDAYS | AVAILABILITY_WEEKENDS +}; + +enum GuildFinderOptionsRoles +{ + GUILDFINDER_ROLE_TANK = 0x1, + GUILDFINDER_ROLE_HEALER = 0x2, + GUILDFINDER_ROLE_DPS = 0x4, + GUILDFINDER_ALL_ROLES = GUILDFINDER_ROLE_TANK | GUILDFINDER_ROLE_HEALER | GUILDFINDER_ROLE_DPS +}; + +enum GuildFinderOptionsLevel +{ + ANY_FINDER_LEVEL = 0x1, + MAX_FINDER_LEVEL = 0x2, + ALL_GUILDFINDER_LEVELS = ANY_FINDER_LEVEL | MAX_FINDER_LEVEL +}; + +/// Holds all required informations about a membership request +struct MembershipRequest +{ + public: + MembershipRequest(MembershipRequest const& settings) : _comment(settings.GetComment()) + { + _availability = settings.GetAvailability(); + _classRoles = settings.GetClassRoles(); + _interests = settings.GetInterests(); + _guildId = settings.GetGuildId(); + _playerGUID = settings.GetPlayerGUID(); + _time = settings.GetSubmitTime(); + } + + MembershipRequest(uint32 playerGUID, uint32 guildId, uint32 availability, uint32 classRoles, uint32 interests, std::string& comment, time_t submitTime) : + _playerGUID(playerGUID), _guildId(guildId), _availability(availability), _classRoles(classRoles), + _interests(interests), _time(submitTime), _comment(comment) {} + + MembershipRequest() : _playerGUID(0), _guildId(0), _availability(0), _classRoles(0), + _interests(0), _time(time(NULL)) {} + + uint32 GetGuildId() const { return _guildId; } + uint32 GetPlayerGUID() const { return _playerGUID; } + uint8 GetAvailability() const { return _availability; } + uint8 GetClassRoles() const { return _classRoles; } + uint8 GetInterests() const { return _interests; } + uint8 GetClass() const { return sWorld->GetCharacterNameData(GetPlayerGUID())->m_class; } + uint8 GetLevel() const { return sWorld->GetCharacterNameData(GetPlayerGUID())->m_level; } + time_t GetSubmitTime() const { return _time; } + time_t GetExpiryTime() const { return time_t(_time + 30 * 24 * 3600); } // Adding 30 days + std::string const& GetComment() const { return _comment; } + std::string const& GetName() const { return sWorld->GetCharacterNameData(GetPlayerGUID())->m_name; } + private: + std::string _comment; + + uint32 _guildId; + uint32 _playerGUID; + + uint8 _availability; + uint8 _classRoles; + uint8 _interests; + + time_t _time; +}; + +/// Holds all informations about a player's finder settings. _NOT_ stored in database. +struct LFGuildPlayer +{ + public: + LFGuildPlayer() + { + _guid = 0; + _roles = 0; + _availability = 0; + _interests = 0; + _level = 0; + } + + LFGuildPlayer(uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level) + { + _guid = guid; + _roles = role; + _availability = availability; + _interests = interests; + _level = level; + } + + LFGuildPlayer(uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level, std::string& comment) : _comment(comment) + { + _guid = guid; + _roles = role; + _availability = availability; + _interests = interests; + _level = level; + } + + LFGuildPlayer(LFGuildPlayer const& settings) : _comment(settings.GetComment()) + { + _guid = settings.GetGUID(); + _roles = settings.GetClassRoles(); + _availability = settings.GetAvailability(); + _interests = settings.GetInterests(); + _level = settings.GetLevel(); + } + + uint32 GetGUID() const { return _guid; } + uint8 GetClassRoles() const { return _roles; } + uint8 GetAvailability() const { return _availability; } + uint8 GetInterests() const { return _interests; } + uint8 GetLevel() const { return _level; } + std::string const& GetComment() const { return _comment; } + + private: + std::string _comment; + uint32 _guid; + uint8 _roles; + uint8 _availability; + uint8 _interests; + uint8 _level; +}; + +/// Holds settings for a guild in the finder system. Saved to database. +struct LFGuildSettings : public LFGuildPlayer +{ + public: + LFGuildSettings() : LFGuildPlayer(), _listed(false), _team(TEAM_ALLIANCE) {} + + LFGuildSettings(bool listed, TeamId team) : LFGuildPlayer(), _listed(listed), _team(team) {} + + LFGuildSettings(bool listed, TeamId team, uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level) : _listed(listed), + LFGuildPlayer(guid, role, availability, interests, level), _team(team) {} + + LFGuildSettings(bool listed, TeamId team, uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level, std::string& comment) : _listed(listed), + LFGuildPlayer(guid, role, availability, interests, level, comment), _team(team) {} + + LFGuildSettings(LFGuildSettings const& settings) : _listed(settings.IsListed()), _team(settings.GetTeam()), + LFGuildPlayer(settings) {} + + + bool IsListed() const { return _listed; } + void SetListed(bool state) { _listed = state; } + + TeamId GetTeam() const { return _team; } + private: + TeamId _team; + bool _listed; +}; + +typedef std::map LFGuildStore; +typedef std::map > MembershipRequestStore; + +class GuildFinderMgr +{ + friend class ACE_Singleton; + + private: + GuildFinderMgr(); + ~GuildFinderMgr(); + + LFGuildStore _guildSettings; + + MembershipRequestStore _membershipRequests; + + void LoadGuildSettings(); + void LoadMembershipRequests(); + + public: + void LoadFromDB(); + + /** + * @brief Stores guild settings and begins an asynchronous database insert + * @param guildGuid The guild's database guid. + * @param LFGuildSettings The guild's settings storage. + */ + void SetGuildSettings(uint32 guildGuid, LFGuildSettings const& settings); + + /** + * @brief Returns settings for a guild. + * @param guildGuid The guild's database guid. + */ + LFGuildSettings GetGuildSettings(uint32 guildGuid) { return _guildSettings[guildGuid]; } + + /** + * @brief Files a membership request to a guild + * @param guildGuid The guild's database GUID. + * @param MembershipRequest An object storing all data related to the request. + */ + void AddMembershipRequest(uint32 guildGuid, MembershipRequest const& request); + + /** + * @brief Removes a membership request to a guild. + * @param playerId The player's database guid whose application shall be deleted. + * @param guildId The guild's database guid + */ + void RemoveMembershipRequest(uint32 playerId, uint32 guildId); + + /// wipes everything related to a guild. Used when that guild is disbanded + void DeleteGuild(uint32 guildId); + + /** + * @brief Returns a set of membership requests for a guild + * @param guildGuid The guild's database guid. + */ + std::vector GetAllMembershipRequestsForGuild(uint32 guildGuid) { return _membershipRequests[guildGuid]; } + + /** + * @brief Returns a list of membership requests for a player. + * @param playerGuid The player's database guid. + */ + std::list GetAllMembershipRequestsForPlayer(uint32 playerGuid); + + /** + * @brief Returns a store of guilds matching the settings provided, using bitmask operators. + * @param settings The player's finder settings + * @param teamId The player's faction (TEAM_ALLIANCE or TEAM_HORDE) + */ + LFGuildStore GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction); + + /// Provided a player DB guid and a guild DB guid, determines if a pending request is filed with these keys. + bool HasRequest(uint32 playerId, uint32 guildId); + + /// Counts the amount of pending membership requests, given the player's db guid. + uint8 CountRequestsFromPlayer(uint32 playerId); + + void SendApplicantListUpdate(Guild& guild); + void SendMembershipRequestListUpdate(Player& player); +}; + +#define sGuildFinderMgr ACE_Singleton::instance() + +#endif // __TRINITY_GUILDFINDER_H diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 32ed1d2b27f..33ffb5ba169 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -685,7 +685,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte std::string IP_str = GetRemoteAddress(); sLog->outInfo(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Create Character:[%s] (GUID: %u)", GetAccountId(), IP_str.c_str(), createInfo->Name.c_str(), newChar.GetGUIDLow()); sScriptMgr->OnPlayerCreate(&newChar); - sWorld->AddCharacterNameData(newChar.GetGUIDLow(), std::string(newChar.GetName()), newChar.getGender(), newChar.getRace(), newChar.getClass()); + sWorld->AddCharacterNameData(newChar.GetGUIDLow(), std::string(newChar.GetName()), newChar.getGender(), newChar.getRace(), newChar.getClass(), newChar.getLevel()); newChar.CleanupsBeforeDelete(); delete createInfo; diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp new file mode 100644 index 00000000000..af57a5908f8 --- /dev/null +++ b/src/server/game/Handlers/GuildFinderHandler.cpp @@ -0,0 +1,443 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "WorldSession.h" +#include "WorldPacket.h" +#include "Object.h" +#include "SharedDefines.h" +#include "GuildFinderMgr.h" +#include "GuildMgr.h" + +void WorldSession::HandleGuildFinderAddRecruit(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_ADD_RECRUIT"); + + if (sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUIDLow()).size() == 10) + return; + + uint32 classRoles = 0; + uint32 availability = 0; + uint32 guildInterests = 0; + + recvPacket >> classRoles >> guildInterests >> availability; + + ObjectGuid guid; + guid[3] = recvPacket.ReadBit(); + guid[0] = recvPacket.ReadBit(); + guid[6] = recvPacket.ReadBit(); + guid[1] = recvPacket.ReadBit(); + uint16 commentLength = recvPacket.ReadBits(11); + guid[5] = recvPacket.ReadBit(); + guid[4] = recvPacket.ReadBit(); + guid[7] = recvPacket.ReadBit(); + uint8 nameLength = recvPacket.ReadBits(7); + guid[2] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guid[4]); + recvPacket.ReadByteSeq(guid[5]); + std::string comment = recvPacket.ReadString(commentLength); + std::string playerName = recvPacket.ReadString(nameLength); + recvPacket.ReadByteSeq(guid[7]); + recvPacket.ReadByteSeq(guid[2]); + recvPacket.ReadByteSeq(guid[0]); + recvPacket.ReadByteSeq(guid[6]); + recvPacket.ReadByteSeq(guid[1]); + recvPacket.ReadByteSeq(guid[3]); + + uint32 guildLowGuid = GUID_LOPART(uint64(guid)); + + if (!IS_GUILD_GUID(guid)) + return; + if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + return; + if (!(availability & ALL_WEEK) || availability > ALL_WEEK) + return; + if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + return; + + MembershipRequest request = MembershipRequest(GetPlayer()->GetGUIDLow(), guildLowGuid, availability, classRoles, guildInterests, comment, time(NULL)); + sGuildFinderMgr->AddMembershipRequest(guildLowGuid, request); +} + +void WorldSession::HandleGuildFinderBrowse(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_BROWSE"); + uint32 classRoles = 0; + uint32 availability = 0; + uint32 guildInterests = 0; + uint32 playerLevel = 0; // Raw player level (1-85), do they use MAX_FINDER_LEVEL when on level 85 ? + + recvPacket >> classRoles >> availability >> guildInterests >> playerLevel; + + if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + return; + if (!(availability & ALL_WEEK) || availability > ALL_WEEK) + return; + if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + return; + if (playerLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || playerLevel < 1) + return; + + Player* player = GetPlayer(); + + LFGuildPlayer settings(player->GetGUIDLow(), classRoles, availability, guildInterests, ANY_FINDER_LEVEL); + LFGuildStore guildList = sGuildFinderMgr->GetGuildsMatchingSetting(settings, player->GetTeamId()); + uint32 guildCount = guildList.size(); + + if (guildCount == 0) + { + WorldPacket packet(SMSG_LF_GUILD_BROWSE_UPDATED, 0); + player->SendDirectMessage(&packet); + return; + } + + ByteBuffer bufferData(65 * guildCount); + WorldPacket data(SMSG_LF_GUILD_BROWSE_UPDATED, 3 + guildCount * 65); // Estimated size + data.WriteBits(guildCount, 19); + + for (LFGuildStore::const_iterator itr = guildList.begin(); itr != guildList.end(); ++itr) + { + LFGuildSettings guildSettings = itr->second; + Guild* guild = sGuildMgr->GetGuildById(itr->first); + + ObjectGuid guildGUID = ObjectGuid(guild->GetGUID()); + + data.WriteBit(guildGUID[7]); + data.WriteBit(guildGUID[5]); + data.WriteBits(guild->GetName().size(), 8); + data.WriteBit(guildGUID[0]); + data.WriteBits(guildSettings.GetComment().size(), 11); + data.WriteBit(guildGUID[4]); + data.WriteBit(guildGUID[1]); + data.WriteBit(guildGUID[2]); + data.WriteBit(guildGUID[6]); + data.WriteBit(guildGUID[3]); + + bufferData << int32(guild->GetEmblemInfo().GetColor()); + bufferData << int32(guild->GetEmblemInfo().GetBorderStyle()); // Guessed + bufferData << int32(guild->GetEmblemInfo().GetStyle()); + + bufferData.WriteString(guildSettings.GetComment()); + + bufferData << uint8(0); // Cached ? Idk + + bufferData.WriteByteSeq(guildGUID[5]); + + bufferData << uint32(guildSettings.GetInterests()); // Guild Interests + + bufferData.WriteByteSeq(guildGUID[6]); + bufferData.WriteByteSeq(guildGUID[4]); + + bufferData << guild->GetLevel(); + + bufferData.WriteString(guild->GetName()); + + bufferData << int32(0); // guild->GetAchievementMgr().GetAchievementPoints() + + bufferData.WriteByteSeq(guildGUID[7]); + + bufferData << uint8(sGuildFinderMgr->HasRequest(player->GetGUIDLow(), guild->GetGUID())); // Request pending + + bufferData.WriteByteSeq(guildGUID[2]); + bufferData.WriteByteSeq(guildGUID[0]); + + bufferData << uint32(guildSettings.GetAvailability()); + + bufferData.WriteByteSeq(guildGUID[1]); + + bufferData << int32(guild->GetEmblemInfo().GetBackgroundColor()); + bufferData << uint32(0); // Unk Int 2 (+ 128) // Always 0 or 1 + bufferData << int32(guild->GetEmblemInfo().GetBorderColor()); + bufferData << uint32(guildSettings.GetClassRoles()); + + bufferData.WriteByteSeq(guildGUID[3]); + bufferData << int32(guild->GetMembersCount()); + } + + data.FlushBits(); + data.append(bufferData); + + player->SendDirectMessage(&data); +} + +void WorldSession::HandleGuildFinderDeclineRecruit(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_DECLINE_RECRUIT"); + + ObjectGuid playerGuid; + + playerGuid[1] = recvPacket.ReadBit(); + playerGuid[4] = recvPacket.ReadBit(); + playerGuid[5] = recvPacket.ReadBit(); + playerGuid[2] = recvPacket.ReadBit(); + playerGuid[6] = recvPacket.ReadBit(); + playerGuid[7] = recvPacket.ReadBit(); + playerGuid[0] = recvPacket.ReadBit(); + playerGuid[3] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(playerGuid[5]); + recvPacket.ReadByteSeq(playerGuid[7]); + recvPacket.ReadByteSeq(playerGuid[2]); + recvPacket.ReadByteSeq(playerGuid[3]); + recvPacket.ReadByteSeq(playerGuid[4]); + recvPacket.ReadByteSeq(playerGuid[1]); + recvPacket.ReadByteSeq(playerGuid[0]); + recvPacket.ReadByteSeq(playerGuid[6]); + + if (!IS_PLAYER_GUID(playerGuid)) + return; + + sGuildFinderMgr->RemoveMembershipRequest(GUID_LOPART(playerGuid), GetPlayer()->GetGuildId()); +} + +void WorldSession::HandleGuildFinderGetApplications(WorldPacket& /*recvPacket*/) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_GET_APPLICATIONS"); // Empty opcode + + std::list applicatedGuilds = sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUIDLow()); + uint32 applicationsCount = applicatedGuilds.size(); + WorldPacket data(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, 7 + 54 * applicationsCount); + data.WriteBits(applicationsCount, 20); + + if (applicationsCount > 0) + { + ByteBuffer bufferData(54 * applicationsCount); + for (std::list::const_iterator itr = applicatedGuilds.begin(); itr != applicatedGuilds.end(); ++itr) + { + Guild* guild = sGuildMgr->GetGuildById(itr->GetGuildId()); + LFGuildSettings guildSettings = sGuildFinderMgr->GetGuildSettings(itr->GetGuildId()); + MembershipRequest request = *itr; + + ObjectGuid guildGuid = ObjectGuid(guild->GetGUID()); + + data.WriteBit(guildGuid[1]); + data.WriteBit(guildGuid[0]); + data.WriteBit(guildGuid[5]); + data.WriteBits(request.GetComment().size(), 11); + data.WriteBit(guildGuid[3]); + data.WriteBit(guildGuid[7]); + data.WriteBit(guildGuid[4]); + data.WriteBit(guildGuid[6]); + data.WriteBit(guildGuid[2]); + data.WriteBits(guild->GetName().size(), 8); + + bufferData.WriteByteSeq(guildGuid[2]); + bufferData.WriteString(request.GetComment()); + bufferData.WriteByteSeq(guildGuid[5]); + bufferData.WriteString(guild->GetName()); + + bufferData << uint32(guildSettings.GetAvailability()); + bufferData << uint32(request.GetExpiryTime() - time(NULL)); // Time left to application expiry (seconds) + + bufferData.WriteByteSeq(guildGuid[0]); + bufferData.WriteByteSeq(guildGuid[6]); + bufferData.WriteByteSeq(guildGuid[3]); + bufferData.WriteByteSeq(guildGuid[7]); + + bufferData << uint32(guildSettings.GetClassRoles()); + + bufferData.WriteByteSeq(guildGuid[4]); + bufferData.WriteByteSeq(guildGuid[1]); + + bufferData << uint32(time(NULL) - request.GetSubmitTime()); // Time since application (seconds) + bufferData << uint32(guildSettings.GetInterests()); + } + + data.FlushBits(); + data.append(bufferData); + } + data << uint32(10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUIDLow())); // Applications count left + + GetPlayer()->SendDirectMessage(&data); +} + +// Lists all recruits for a guild - Misses times +void WorldSession::HandleGuildFinderGetRecruits(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_GET_RECRUITS"); + + uint32 unkTime = 0; + recvPacket >> unkTime; + + Player* player = GetPlayer(); + if (!player->GetGuildId()) + return; + + std::vector recruitsList = sGuildFinderMgr->GetAllMembershipRequestsForGuild(player->GetGuildId()); + uint32 recruitCount = recruitsList.size(); + + ByteBuffer dataBuffer(53 * recruitCount); + WorldPacket data(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, 7 + 26 * recruitCount + 53 * recruitCount); + data.WriteBits(recruitCount, 20); + + for (std::vector::const_iterator itr = recruitsList.begin(); itr != recruitsList.end(); ++itr) + { + MembershipRequest request = *itr; + ObjectGuid playerGuid(MAKE_NEW_GUID(request.GetPlayerGUID(), 0, HIGHGUID_PLAYER)); + + data.WriteBits(request.GetComment().size(), 11); + data.WriteBit(playerGuid[2]); + data.WriteBit(playerGuid[4]); + data.WriteBit(playerGuid[3]); + data.WriteBit(playerGuid[7]); + data.WriteBit(playerGuid[0]); + data.WriteBits(request.GetName().size(), 7); + data.WriteBit(playerGuid[5]); + data.WriteBit(playerGuid[1]); + data.WriteBit(playerGuid[6]); + + dataBuffer.WriteByteSeq(playerGuid[4]); + + dataBuffer << int32(time(NULL) <= request.GetExpiryTime()); + + dataBuffer.WriteByteSeq(playerGuid[3]); + dataBuffer.WriteByteSeq(playerGuid[0]); + dataBuffer.WriteByteSeq(playerGuid[1]); + + dataBuffer << int32(request.GetLevel()); + + dataBuffer.WriteByteSeq(playerGuid[6]); + dataBuffer.WriteByteSeq(playerGuid[7]); + dataBuffer.WriteByteSeq(playerGuid[2]); + + dataBuffer << int32(time(NULL) - request.GetSubmitTime()); // Time in seconds since application submitted. + dataBuffer << int32(request.GetAvailability()); + dataBuffer << int32(request.GetClassRoles()); + dataBuffer << int32(request.GetInterests()); + dataBuffer << int32(request.GetExpiryTime() - time(NULL)); // TIme in seconds until application expires. + + dataBuffer.WriteString(request.GetName()); + dataBuffer.WriteString(request.GetComment()); + + dataBuffer << int32(request.GetClass()); + + dataBuffer.WriteByteSeq(playerGuid[5]); + } + + data.FlushBits(); + data.append(dataBuffer); + data << uint32(time(NULL)); // Unk time + + player->SendDirectMessage(&data); +} + +void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_POST_REQUEST"); // Empty opcode + + Player* player = GetPlayer(); + + if (!player->GetGuildId()) // Player must be in guild + return; + + bool isGuildMaster = true; + if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) + if (guild->GetLeaderGUID() != player->GetGUID()) + isGuildMaster = false; + + LFGuildSettings settings = sGuildFinderMgr->GetGuildSettings(player->GetGuildId()); + + /// Client does not seem to receive correct data as only the comment is correctly displayed. + WorldPacket data(SMSG_LF_GUILD_POST_UPDATED, 35); + data.WriteBit(isGuildMaster); // Guessed + + if (isGuildMaster) + { + data.WriteBits(settings.GetComment().size(), 11); + data.WriteBit(settings.IsListed()); + data << uint32(settings.GetLevel()); + data.WriteString(settings.GetComment()); + data << uint32(0); // Unk Int32 + data << uint32(settings.GetAvailability()); + data << uint32(settings.GetClassRoles()); + data << uint32(settings.GetInterests()); + } + else + data.FlushBits(); + player->SendDirectMessage(&data); +} + +void WorldSession::HandleGuildFinderRemoveRecruit(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_REMOVE_RECRUIT"); + + ObjectGuid guildGuid; + + guildGuid[0] = recvPacket.ReadBit(); + guildGuid[4] = recvPacket.ReadBit(); + guildGuid[3] = recvPacket.ReadBit(); + guildGuid[5] = recvPacket.ReadBit(); + guildGuid[7] = recvPacket.ReadBit(); + guildGuid[6] = recvPacket.ReadBit(); + guildGuid[2] = recvPacket.ReadBit(); + guildGuid[1] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guildGuid[4]); + recvPacket.ReadByteSeq(guildGuid[0]); + recvPacket.ReadByteSeq(guildGuid[3]); + recvPacket.ReadByteSeq(guildGuid[6]); + recvPacket.ReadByteSeq(guildGuid[5]); + recvPacket.ReadByteSeq(guildGuid[1]); + recvPacket.ReadByteSeq(guildGuid[2]); + recvPacket.ReadByteSeq(guildGuid[7]); + + if (!IS_GUILD_GUID(guildGuid)) + return; + + sGuildFinderMgr->RemoveMembershipRequest(GetPlayer()->GetGUIDLow(), GUID_LOPART(guildGuid)); +} + +// Sent any time a guild master sets an option in the interface and when listing / unlisting his guild +void WorldSession::HandleGuildFinderSetGuildPost(WorldPacket& recvPacket) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_SET_GUILD_POST"); + + uint32 classRoles = 0; + uint32 availability = 0; + uint32 guildInterests = 0; + uint32 level = 0; + + recvPacket >> level >> availability >> guildInterests >> classRoles; + // Level sent is zero if untouched, force to any (from interface). Idk why + if (!level) + level = ANY_FINDER_LEVEL; + + uint16 length = recvPacket.ReadBits(11); + bool listed = recvPacket.ReadBit(); + std::string comment = recvPacket.ReadString(length); + + if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + return; + if (!(availability & ALL_WEEK) || availability > ALL_WEEK) + return; + if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + return; + if (!(level & ALL_GUILDFINDER_LEVELS) || level > ALL_GUILDFINDER_LEVELS) + return; + + Player* player = GetPlayer(); + + if (!player->GetGuildId()) // Player must be in guild + return; + + if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) // Player must be guild master + if (guild->GetLeaderGUID() != player->GetGUID()) + return; + + LFGuildSettings settings(listed, player->GetTeamId(), player->GetGuildId(), classRoles, availability, guildInterests, level, comment); + sGuildFinderMgr->SetGuildSettings(player->GetGuildId(), settings); +} diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3ed5c0fe7f8..b1ef5bcb704 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -261,7 +261,7 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(CMSG_GUILD_DECLINE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDeclineOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GUILD_DEL_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDelRankOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GUILD_DEMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDemoteOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_GUILD_DISBAND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDisbandOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_GUILD_DISBAND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDisbandOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GUILD_EVENT_LOG_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildEventLogQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GUILD_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildChangeInfoTextOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GUILD_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildInviteOpcode ); @@ -310,14 +310,14 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(CMSG_LFG_SET_COMMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_LFG_SET_ROLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetRolesOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LFG_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgTeleportOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_ADD_RECRUIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_BROWSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_DECLINE_RECRUIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_GET_APPLICATIONS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_GET_RECRUITS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_POST_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_ADD_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderAddRecruit ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_BROWSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderBrowse ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_DECLINE_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderDeclineRecruit ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_GET_APPLICATIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetApplications); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_GET_RECRUITS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetRecruits ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_POST_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderPostRequest ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderRemoveRecruit ); + DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost ); DEFINE_OPCODE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleListInventoryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LOAD_SCREEN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleLoadScreenOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode ); @@ -940,13 +940,13 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS_NONE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE_UPDATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_POST_UPDATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_COMMAND_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_POST_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LIST_INVENTORY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index b948ce76ca6..a9594fa44a6 100755 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -312,7 +312,6 @@ enum Opcodes CMSG_LF_GUILD_DECLINE_RECRUIT = 0x1031, CMSG_LF_GUILD_GET_APPLICATIONS = 0x1230, CMSG_LF_GUILD_GET_RECRUITS = 0x3230, - CMSG_LF_GUILD_JOIN = 0x0000, CMSG_LF_GUILD_POST_REQUEST = 0x3237, CMSG_LF_GUILD_REMOVE_RECRUIT = 0x3027, CMSG_LF_GUILD_SET_GUILD_POST = 0x0448, @@ -1024,7 +1023,6 @@ enum Opcodes SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED = 0x1CA5, SMSG_LF_GUILD_POST_UPDATED = 0x35B7, SMSG_LF_GUILD_RECRUIT_LIST_UPDATED = 0x1CB2, - SMSG_LF_GUILD_SEARCH_RESULT = 0x0000, SMSG_LIST_INVENTORY = 0x7CB0, SMSG_LOAD_CUF_PROFILES = 0x50B1, SMSG_LOGIN_SETTIMESPEED = 0x4D15, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index a7ab19f393a..1db1399e45f 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -245,7 +245,7 @@ class WorldSession bool IsAddonRegistered(const std::string& prefix) const; void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); - void WriteMovementInfo(WorldPacket &data, MovementInfo* mi); + void WriteMovementInfo(WorldPacket& data, MovementInfo* mi); void SendPacket(WorldPacket const* packet, bool forced = false); void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3); @@ -597,6 +597,15 @@ class WorldSession void HandleGuildRequestMaxDailyXP(WorldPacket& recvPacket); void HandleAutoDeclineGuildInvites(WorldPacket& recvPacket); + void HandleGuildFinderAddRecruit(WorldPacket& recvPacket); + void HandleGuildFinderBrowse(WorldPacket& recvPacket); + void HandleGuildFinderDeclineRecruit(WorldPacket& recvPacket); + void HandleGuildFinderGetApplications(WorldPacket& recvPacket); + void HandleGuildFinderGetRecruits(WorldPacket& recvPacket); + void HandleGuildFinderPostRequest(WorldPacket& recvPacket); + void HandleGuildFinderRemoveRecruit(WorldPacket& recvPacket); + void HandleGuildFinderSetGuildPost(WorldPacket& recvPacket); + void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket); void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket); void HandleActivateTaxiOpcode(WorldPacket& recvPacket); diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index ae05cb4e8eb..86cc42fba42 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -462,6 +462,7 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s uint8 gender = GENDER_NONE; uint8 race = RACE_NONE; uint8 playerClass = 0; + uint8 level = 1; SQLTransaction trans = CharacterDatabase.BeginTransaction(); while (!feof(fin)) @@ -536,6 +537,7 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s race = uint8(atol(getnth(line, 4).c_str())); playerClass = uint8(atol(getnth(line, 5).c_str())); gender = uint8(atol(getnth(line, 6).c_str())); + level = uint8(atol(getnth(line, 7).c_str())); if (name == "") { // check if the original name already exists @@ -679,7 +681,7 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s CharacterDatabase.CommitTransaction(trans); // in case of name conflict player has to rename at login anyway - sWorld->AddCharacterNameData(guid, name, gender, race, playerClass); + sWorld->AddCharacterNameData(guid, name, gender, race, playerClass, level); sObjectMgr->_hiItemGuid += items.size(); sObjectMgr->_mailId += mails.size(); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 92dd103f79d..204e90053ad 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -39,6 +39,7 @@ #include "ObjectMgr.h" #include "ArenaTeamMgr.h" #include "GuildMgr.h" +#include "GuildFinderMgr.h" #include "TicketMgr.h" #include "SpellMgr.h" #include "GroupMgr.h" @@ -1572,6 +1573,8 @@ void World::SetInitialWorldSettings() sGuildMgr->LoadGuilds(); + sGuildFinderMgr->LoadFromDB(); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading ArenaTeams..."); sArenaTeamMgr->LoadArenaTeams(); @@ -2955,7 +2958,7 @@ void World::LoadCharacterNameData() { sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading character name data"); - QueryResult result = CharacterDatabase.Query("SELECT guid, name, race, gender, class FROM characters WHERE deleteDate IS NULL"); + QueryResult result = CharacterDatabase.Query("SELECT guid, name, race, gender, class, level FROM characters WHERE deleteDate IS NULL"); if (!result) { sLog->outInfo(LOG_FILTER_SERVER_LOADING, "No character name data loaded, empty query"); @@ -2968,20 +2971,21 @@ void World::LoadCharacterNameData() { Field* fields = result->Fetch(); AddCharacterNameData(fields[0].GetUInt32(), fields[1].GetString(), - fields[3].GetUInt8() /*gender*/, fields[2].GetUInt8() /*race*/, fields[4].GetUInt8() /*class*/); + fields[3].GetUInt8() /*gender*/, fields[2].GetUInt8() /*race*/, fields[4].GetUInt8() /*class*/, fields[5].GetUInt8()); ++count; } while (result->NextRow()); sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loaded name data for %u characters", count); } -void World::AddCharacterNameData(uint32 guid, std::string const& name, uint8 gender, uint8 race, uint8 playerClass) +void World::AddCharacterNameData(uint32 guid, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level) { CharacterNameData& data = _characterNameDataMap[guid]; data.m_name = name; data.m_race = race; data.m_gender = gender; data.m_class = playerClass; + data.m_level = level; } void World::UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 gender /*= GENDER_NONE*/, uint8 race /*= RACE_NONE*/) @@ -2999,6 +3003,15 @@ void World::UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 itr->second.m_race = race; } +void World::UpdateCharacterNameDataLevel(uint32 guid, uint8 level) +{ + std::map::iterator itr = _characterNameDataMap.find(guid); + if (itr == _characterNameDataMap.end()) + return; + + itr->second.m_level = level; +} + CharacterNameData const* World::GetCharacterNameData(uint32 guid) const { std::map::const_iterator itr = _characterNameDataMap.find(guid); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index f0f5e3f723b..83746bb6022 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -555,6 +555,7 @@ struct CharacterNameData uint8 m_class; uint8 m_race; uint8 m_gender; + uint8 m_level; }; /// The World @@ -776,9 +777,10 @@ class World bool isEventKillStart; CharacterNameData const* GetCharacterNameData(uint32 guid) const; - void AddCharacterNameData(uint32 guid, std::string const& name, uint8 gender, uint8 race, uint8 playerClass); + void AddCharacterNameData(uint32 guid, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level); void UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 gender = GENDER_NONE, uint8 race = RACE_NONE); - void DeleteCharaceterNameData(uint32 guid) { _characterNameDataMap.erase(guid); } + void UpdateCharacterNameDataLevel(uint32 guid, uint8 level); + void DeleteCharaceterNameData(uint32 guid) { _characterNameDataMap.erase(guid); }; uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 87948391500..9f910cbaf75 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -224,7 +224,7 @@ public: stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME_DATA); stmt->setUInt32(0, delInfo.lowGuid); if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) - sWorld->AddCharacterNameData(delInfo.lowGuid, delInfo.name, (*result)[2].GetUInt8(), (*result)[0].GetUInt8(), (*result)[1].GetUInt8()); + sWorld->AddCharacterNameData(delInfo.lowGuid, delInfo.name, (*result)[2].GetUInt8(), (*result)[0].GetUInt8(), (*result)[1].GetUInt8(), (*result)[2].GetUInt8()); } static void HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel, ChatHandler* handler) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp old mode 100755 new mode 100644 index 3d848f94c00..a335d8bc4fe --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -49,7 +49,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_CHAR_RACE, "SELECT race FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_CHAR_LEVEL, "SELECT level FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?", CONNECTION_SYNCH); - PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME_DATA, "SELECT race, class, gender FROM characters WHERE guid = ?", CONNECTION_SYNCH); + PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME_DATA, "SELECT race, class, gender, level FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_SEL_CHAR_POSITION, "SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_DAILY, "DELETE FROM character_queststatus_daily", CONNECTION_ASYNC); @@ -580,4 +580,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_CHAR_CUF_PROFILES, "SELECT id, name, frameHeight, frameWidth, sortBy, healthText, boolOptions, unk146, unk147, unk148, unk150, unk152, unk154 FROM character_cuf_profiles WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_REP_CHAR_CUF_PROFILES, "REPLACE INTO character_cuf_profiles (guid, id, name, frameHeight, frameWidth, sortBy, healthText, boolOptions, unk146, unk147, unk148, unk150, unk152, unk154) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_DEL_CHAR_CUF_PROFILES, "DELETE FROM character_cuf_profiles WHERE guid = ? and id = ?", CONNECTION_ASYNC); + + // Guild Finder + PREPARE_STATEMENT(CHAR_REP_GUILD_FINDER_APPLICANT, "REPLACE INTO guild_finder_applicant (guildId, playerGuid, availability, classRole, interests, comment, submitTime) VALUES(?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GUILD_FINDER_APPLICANT, "DELETE FROM guild_finder_applicant WHERE guildId = ? AND playerGuid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_REP_GUILD_FINDER_GUILD_SETTINGS, "REPLACE INTO guild_finder_guild_settings (guildId, availability, classRoles, interests, level, listed, comment) VALUES(?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS, "DELETE FROM guild_finder_guild_settings WHERE guildId = ?", CONNECTION_ASYNC); } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 20454798f98..93bcb1d70ab 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -541,6 +541,11 @@ enum CharacterDatabaseStatements CHAR_REP_CHAR_CUF_PROFILES, CHAR_DEL_CHAR_CUF_PROFILES, + CHAR_REP_GUILD_FINDER_APPLICANT, + CHAR_DEL_GUILD_FINDER_APPLICANT, + CHAR_REP_GUILD_FINDER_GUILD_SETTINGS, + CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS, + MAX_CHARACTERDATABASE_STATEMENTS, }; -- cgit v1.2.3 From 045682006a429cf4d585ce36878a7b4ffc0330de Mon Sep 17 00:00:00 2001 From: Tuxity Date: Tue, 11 Sep 2012 23:14:41 +0200 Subject: Core/Stats: - Defense skill doesn't exist since 4.0.X - Weapon skill doesn't increase during player's level anymore, it's set to the max value for level on each levelup. --- src/server/game/Entities/Item/Item.cpp | 40 -------- src/server/game/Entities/Item/Item.h | 1 - src/server/game/Entities/Player/Player.cpp | 116 +--------------------- src/server/game/Entities/Player/Player.h | 8 -- src/server/game/Entities/Unit/StatSystem.cpp | 25 ++--- src/server/game/Entities/Unit/Unit.cpp | 91 ++--------------- src/server/game/Entities/Unit/Unit.h | 4 +- src/server/game/Globals/ObjectMgr.cpp | 8 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 5 +- src/server/game/World/World.cpp | 5 - src/server/game/World/World.h | 3 - src/server/scripts/Spells/spell_paladin.cpp | 8 +- src/server/worldserver/worldserver.conf.dist | 15 --- 13 files changed, 29 insertions(+), 300 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index faa91c2672a..08489bcacba 100755 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -547,46 +547,6 @@ uint32 Item::GetSkill() } } -uint32 Item::GetSpell() -{ - ItemTemplate const* proto = GetTemplate(); - - switch (proto->Class) - { - case ITEM_CLASS_WEAPON: - switch (proto->SubClass) - { - case ITEM_SUBCLASS_WEAPON_AXE: return 196; - case ITEM_SUBCLASS_WEAPON_AXE2: return 197; - case ITEM_SUBCLASS_WEAPON_BOW: return 264; - case ITEM_SUBCLASS_WEAPON_GUN: return 266; - case ITEM_SUBCLASS_WEAPON_MACE: return 198; - case ITEM_SUBCLASS_WEAPON_MACE2: return 199; - case ITEM_SUBCLASS_WEAPON_POLEARM: return 200; - case ITEM_SUBCLASS_WEAPON_SWORD: return 201; - case ITEM_SUBCLASS_WEAPON_SWORD2: return 202; - case ITEM_SUBCLASS_WEAPON_STAFF: return 227; - case ITEM_SUBCLASS_WEAPON_DAGGER: return 1180; - case ITEM_SUBCLASS_WEAPON_THROWN: return 2567; - case ITEM_SUBCLASS_WEAPON_SPEAR: return 3386; - case ITEM_SUBCLASS_WEAPON_CROSSBOW:return 5011; - case ITEM_SUBCLASS_WEAPON_WAND: return 5009; - default: return 0; - } - case ITEM_CLASS_ARMOR: - switch (proto->SubClass) - { - case ITEM_SUBCLASS_ARMOR_CLOTH: return 9078; - case ITEM_SUBCLASS_ARMOR_LEATHER: return 9077; - case ITEM_SUBCLASS_ARMOR_MAIL: return 8737; - case ITEM_SUBCLASS_ARMOR_PLATE: return 750; - case ITEM_SUBCLASS_ARMOR_SHIELD: return 9116; - default: return 0; - } - } - return 0; -} - int32 Item::GenerateItemRandomPropertyId(uint32 item_id) { ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(item_id); diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index b5ee171e6b1..3927676af47 100755 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -279,7 +279,6 @@ class Item : public Object bool IsEquipped() const; uint32 GetSkill(); - uint32 GetSpell(); // RandomPropertyId (signed but stored as unsigned) int32 GetItemRandomPropertyId() const { return GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 302791f4888..a27a1b4c64a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5699,17 +5699,6 @@ void Player::LeaveLFGChannel() } } -void Player::UpdateDefense() -{ - uint32 defense_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE); - - if (UpdateSkill(SKILL_DEFENSE, defense_skill_gain)) - { - // update dependent from defense skill part - UpdateDefenseBonusesMod(); - } -} - void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply) { if (modGroup >= BASEMOD_END || modType >= MOD_END) @@ -5961,9 +5950,8 @@ void Player::UpdateRating(CombatRating cr) switch (cr) { - case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst + case CR_WEAPON_SKILL: case CR_DEFENSE_SKILL: - UpdateDefenseBonusesMod(); break; case CR_DODGE: UpdateDodgePercentage(); @@ -6239,70 +6227,6 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) return false; } -void Player::UpdateWeaponSkill(WeaponAttackType attType) -{ - // no skill gain in pvp - Unit* victim = getVictim(); - if (victim && victim->GetTypeId() == TYPEID_PLAYER) - return; - - if (IsInFeralForm()) - return; // always maximized SKILL_FERAL_COMBAT in fact - - if (GetShapeshiftForm() == FORM_TREE) - return; // use weapon but not skill up - - if (victim && victim->GetTypeId() == TYPEID_UNIT && (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_SKILLGAIN)) - return; - - uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON); - - Item* tmpitem = GetWeaponForAttack(attType, true); - if (!tmpitem && attType == BASE_ATTACK) - UpdateSkill(SKILL_UNARMED, weapon_skill_gain); - else if (tmpitem && tmpitem->GetTemplate()->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE) - UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain); - - UpdateAllCritPercentages(); -} - -void Player::UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence) -{ - uint8 plevel = getLevel(); // if defense than victim == attacker - uint8 greylevel = Trinity::XP::GetGrayLevel(plevel); - uint8 moblevel = victim->getLevelForTarget(this); - if (moblevel < greylevel) - return; - - if (moblevel > plevel + 5) - moblevel = plevel + 5; - - uint8 lvldif = moblevel - greylevel; - if (lvldif < 3) - lvldif = 3; - - uint32 skilldif = 5 * plevel - (defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType)); - if (skilldif <= 0) - return; - - float chance = float(3 * lvldif * skilldif) / plevel; - if (!defence) - if (getClass() == CLASS_WARRIOR || getClass() == CLASS_ROGUE) - chance += chance * 0.02f * GetStat(STAT_INTELLECT); - - chance = chance < 1.0f ? 1.0f : chance; //minimum chance to increase skill is 1% - - if (roll_chance_f(chance)) - { - if (defence) - UpdateDefense(); - else - UpdateWeaponSkill(attType); - } - else - return; -} - void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent) { SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid); @@ -6319,11 +6243,8 @@ void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent) void Player::UpdateSkillsForLevel() { - uint16 maxconfskill = sWorld->GetConfigMaxSkillValue(); uint32 maxSkill = GetMaxSkillValueForLevel(); - bool alwaysMaxSkill = sWorld->getBoolConfig(CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL); - for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end(); ++itr) { if (itr->second.uState == SKILL_DELETED) @@ -6346,22 +6267,10 @@ void Player::UpdateSkillsForLevel() /// update only level dependent max skill values if (max != 1) { - /// maximize skill always - if (alwaysMaxSkill) - { - SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, maxSkill); - SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill); - if (itr->second.uState != SKILL_NEW) - itr->second.uState = SKILL_CHANGED; - } - - else if (max != maxconfskill) /// update max skill value if current max skill not maximized - { - SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, val); - SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill); - if (itr->second.uState != SKILL_NEW) - itr->second.uState = SKILL_CHANGED; - } + SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, maxSkill); + SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill); + if (itr->second.uState != SKILL_NEW) + itr->second.uState = SKILL_CHANGED; } } } @@ -6389,8 +6298,6 @@ void Player::UpdateSkillsToMaxSkillsForLevel() if (itr->second.uState != SKILL_NEW) itr->second.uState = SKILL_CHANGED; } - if (pskill == SKILL_DEFENSE) - UpdateDefenseBonusesMod(); } } @@ -23388,19 +23295,6 @@ bool Player::IsAtRecruitAFriendDistance(WorldObject const* pOther) const return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE); } -uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const -{ - Item* item = GetWeaponForAttack(attType, true); - - // unarmed only with base attack - if (attType != BASE_ATTACK && !item) - return 0; - - // weapon skill or (unarmed for base attack and for fist weapons) - uint32 skill = (item && item->GetSkill() != SKILL_FIST_WEAPONS) ? item->GetSkill() : uint32(SKILL_UNARMED); - return GetBaseSkillValue(skill); -} - void Player::ResurectUsingRequestData() { /// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 89c82736335..ad17ee7844b 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2054,9 +2054,6 @@ class Player : public Unit, public GridObject bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1); bool UpdateFishingSkill(); - uint32 GetBaseDefenseSkillValue() const { return GetBaseSkillValue(SKILL_DEFENSE); } - uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const; - uint32 GetSpellByProto(ItemTemplate* proto); float GetHealthBonusFromStamina(); @@ -2078,7 +2075,6 @@ class Player : public Unit, public GridObject void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& min_damage, float& max_damage); - void UpdateDefenseBonusesMod(); inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} float GetMeleeCritFromAgility(); void GetDodgeFromAgility(float &diminishing, float &nondiminishing); @@ -2183,10 +2179,6 @@ class Player : public Unit, public GridObject void UpdateLocalChannels(uint32 newZone); void LeaveLFGChannel(); - void UpdateDefense(); - void UpdateWeaponSkill (WeaponAttackType attType); - void UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence); - void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal); uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus uint16 GetPureMaxSkillValue(uint32 skill) const; // max diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 12d214e49ab..c0f7f5c8939 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -75,16 +75,16 @@ bool Player::UpdateStats(Stats stat) UpdateAllCritPercentages(); UpdateDodgePercentage(); break; - case STAT_STAMINA: UpdateMaxHealth(); break; + case STAT_STAMINA: + UpdateMaxHealth(); + break; case STAT_INTELLECT: UpdateMaxPower(POWER_MANA); UpdateAllSpellCritChances(); UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently break; - case STAT_SPIRIT: break; - default: break; } @@ -155,7 +155,9 @@ bool Player::UpdateAllStats() UpdateAllRatings(); UpdateAllCritPercentages(); UpdateAllSpellCritChances(); - UpdateDefenseBonusesMod(); + UpdateBlockPercentage(); + UpdateParryPercentage(); + UpdateDodgePercentage(); UpdateSpellDamageAndHealingBonus(); UpdateManaRegen(); UpdateExpertise(BASE_ATTACK); @@ -430,13 +432,6 @@ void Player::UpdateDamagePhysical(WeaponAttackType attType) } } -void Player::UpdateDefenseBonusesMod() -{ - UpdateBlockPercentage(); - UpdateParryPercentage(); - UpdateDodgePercentage(); -} - void Player::UpdateBlockPercentage() { // No block @@ -482,7 +477,7 @@ void Player::UpdateCritPercentage(WeaponAttackType attType) float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr); // Modify crit from weapon skill and maximized defense skill of same level victim difference - value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f; + value += (int32(GetMaxSkillValueForLevel()) - int32(GetMaxSkillValueForLevel())) * 0.04f; value = value < 0.0f ? 0.0f : value; SetStatFloatValue(index, value); } @@ -540,9 +535,6 @@ void Player::UpdateParryPercentage() float nondiminishing = 5.0f; // Parry from rating float diminishing = GetRatingBonusValue(CR_PARRY); - // Modify value from defense skill (only bonus from defense rating diminishes) - nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f; - diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f; // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT); // apply diminishing formula to diminishing parry chance @@ -571,9 +563,6 @@ void Player::UpdateDodgePercentage() float diminishing = 0.0f, nondiminishing = 0.0f; GetDodgeFromAgility(diminishing, nondiminishing); - // Modify value from defense skill (only bonus from defense rating diminishes) - nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f; - diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f; // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT); // Dodge from rating diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5407cbd274e..01ee90ce895 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1311,8 +1311,8 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) if (victim->getLevel() < 30) Probability = 0.65f * victim->getLevel() + 0.5f; - uint32 VictimDefense=victim->GetDefenseSkillValue(); - uint32 AttackerMeleeSkill=GetUnitMeleeSkill(); + uint32 VictimDefense = victim->GetMaxSkillValueForLevel(this); + uint32 AttackerMeleeSkill = GetMaxSkillValueForLevel(); Probability *= AttackerMeleeSkill/(float)VictimDefense; @@ -1860,11 +1860,8 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim); int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this); - int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim); - int32 victimDefenseSkill = victim->GetDefenseSkillValue(this); - // bonus from skills is 0.04% - int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel); + int32 skillBonus = 4 * (attackerMaxSkillValueForLevel - victimMaxSkillValueForLevel); int32 sum = 0, tmp = 0; int32 roll = urand (0, 10000); @@ -1973,11 +1970,9 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT getLevel() < victim->getLevelForTarget(this)) { // cap possible value (with bonuses > max skill) - int32 skill = attackerWeaponSkill; - int32 maxskill = attackerMaxSkillValueForLevel; - skill = (skill > maxskill) ? maxskill : skill; + int32 skill = attackerMaxSkillValueForLevel; - tmp = (10 + (victimDefenseSkill - skill)) * 100; + tmp = (10 + (victimMaxSkillValueForLevel - skill)) * 100; tmp = tmp > 4000 ? 4000 : tmp; if (roll < (sum += tmp)) { @@ -1993,10 +1988,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH)) { // when their weapon skill is 15 or more above victim's defense skill - tmp = victimDefenseSkill; - int32 tmpmax = victimMaxSkillValueForLevel; - // having defense above your maximum (from items, talents etc.) has no effect - tmp = tmp > tmpmax ? tmpmax : tmp; + tmp = victimMaxSkillValueForLevel; // tmp = mob's level * 5 - player's current defense skill tmp = attackerMaxSkillValueForLevel - tmp; if (tmp >= 15) @@ -2441,21 +2433,6 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, SpellInfo const* spell, bool Ca return SPELL_MISS_NONE; } -uint32 Unit::GetDefenseSkillValue(Unit const* target) const -{ - if (GetTypeId() == TYPEID_PLAYER) - { - // in PvP use full skill instead current skill value - uint32 value = (target && target->GetTypeId() == TYPEID_PLAYER) - ? ToPlayer()->GetMaxSkillValue(SKILL_DEFENSE) - : ToPlayer()->GetSkillValue(SKILL_DEFENSE); - value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL)); - return value; - } - else - return GetUnitMeleeSkill(target); -} - float Unit::GetUnitDodgeChance() const { if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) @@ -2597,54 +2574,11 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit* victi else ApplyResilience(victim, &crit, NULL, false, CR_CRIT_TAKEN_RANGED); - // Apply crit chance from defence skill - crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f; - if (crit < 0.0f) crit = 0.0f; return crit; } -uint32 Unit::GetWeaponSkillValue (WeaponAttackType attType, Unit const* target) const -{ - uint32 value = 0; - if (Player const* player = ToPlayer()) - { - Item* item = player->GetWeaponForAttack(attType, true); - - // feral or unarmed skill only for base attack - if (attType != BASE_ATTACK && !item) - return 0; - - if (IsInFeralForm()) - return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact - - // weapon skill or (unarmed for base attack and fist weapons) - uint32 skill; - if (item && item->GetSkill() != SKILL_FIST_WEAPONS) - skill = item->GetSkill(); - else - skill = SKILL_UNARMED; - - // in PvP use full skill instead current skill value - value = (target && target->IsControlledByPlayer()) - ? player->GetMaxSkillValue(skill) - : player->GetSkillValue(skill); - // Modify value from ratings - value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL)); - switch (attType) - { - case BASE_ATTACK: value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND)); break; - case OFF_ATTACK: value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND)); break; - case RANGED_ATTACK: value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED)); break; - default: break; - } - } - else - value = GetUnitMeleeSkill(target); - return value; -} - void Unit::_DeleteRemovedAuras() { while (!m_removedAuras.empty()) @@ -13482,19 +13416,6 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u // For melee/ranged based attack need update skills and set some Aura states if victim present if (procFlag & MELEE_BASED_TRIGGER_MASK && target) { - // Update skills here for players - if (GetTypeId() == TYPEID_PLAYER) - { - // On melee based hit/miss/resist need update skill (for victim and attacker) - if (procExtra & (PROC_EX_NORMAL_HIT|PROC_EX_MISS|PROC_EX_RESIST)) - { - if (target->GetTypeId() != TYPEID_PLAYER && target->GetCreatureType() != CREATURE_TYPE_CRITTER) - ToPlayer()->UpdateCombatSkills(target, attType, isVictim); - } - // Update defence if player is victim and parry/dodge/block - else if (isVictim && procExtra & (PROC_EX_DODGE|PROC_EX_PARRY|PROC_EX_BLOCK)) - ToPlayer()->UpdateCombatSkills(target, attType, true); - } // If exist crit/parry/dodge/block need update aura state (for victim and attacker) if (procExtra & (PROC_EX_CRITICAL_HIT|PROC_EX_PARRY|PROC_EX_DODGE|PROC_EX_BLOCK)) { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 327886adfec..b57f148c3d6 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -546,7 +546,7 @@ enum WeaponAttackType enum CombatRating { CR_WEAPON_SKILL = 0, - CR_DEFENSE_SKILL = 1, + CR_DEFENSE_SKILL = 1, // Removed in 4.0.1 CR_DODGE = 2, CR_PARRY = 3, CR_BLOCK = 4, @@ -1493,8 +1493,6 @@ class Unit : public WorldObject virtual uint32 GetBlockPercent() { return 30; } uint32 GetUnitMeleeSkill(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; } - uint32 GetDefenseSkillValue(Unit const* target = NULL) const; - uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const* target = NULL) const; float GetWeaponProcChance() const; float GetPPMProcChance(uint32 WeaponSpeed, float PPM, const SpellInfo* spellProto) const; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6b6c95eda66..d26011a552a 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7568,12 +7568,10 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial) { switch (pSkill->categoryId) { - case SKILL_CATEGORY_LANGUAGES: return SKILL_RANGE_LANGUAGE; + case SKILL_CATEGORY_LANGUAGES: + return SKILL_RANGE_LANGUAGE; case SKILL_CATEGORY_WEAPON: - if (pSkill->id != SKILL_FIST_WEAPONS) - return SKILL_RANGE_LEVEL; - else - return SKILL_RANGE_MONO; + return SKILL_RANGE_LEVEL; case SKILL_CATEGORY_ARMOR: case SKILL_CATEGORY_CLASS: if (pSkill->id != SKILL_LOCKPICKING) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 04ad2eb99f3..cf58a51dad8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2711,9 +2711,10 @@ void AuraEffect::HandleAuraModSkill(AuraApplication const* aurApp, uint8 mode, b uint32 prot = GetMiscValue(); int32 points = GetAmount(); - target->ModifySkillBonus(prot, (apply ? points : -points), GetAuraType() == SPELL_AURA_MOD_SKILL_TALENT); if (prot == SKILL_DEFENSE) - target->UpdateDefenseBonusesMod(); + return; + + target->ModifySkillBonus(prot, (apply ? points : -points), GetAuraType() == SPELL_AURA_MOD_SKILL_TALENT); } /****************************/ diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2779814d4ee..703b158d6a3 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -920,12 +920,8 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_SKILL_GAIN_CRAFTING] = ConfigMgr::GetIntDefault("SkillGain.Crafting", 1); - m_int_configs[CONFIG_SKILL_GAIN_DEFENSE] = ConfigMgr::GetIntDefault("SkillGain.Defense", 1); - m_int_configs[CONFIG_SKILL_GAIN_GATHERING] = ConfigMgr::GetIntDefault("SkillGain.Gathering", 1); - m_int_configs[CONFIG_SKILL_GAIN_WEAPON] = ConfigMgr::GetIntDefault("SkillGain.Weapon", 1); - m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] = ConfigMgr::GetIntDefault("MaxOverspeedPings", 2); if (m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] != 0 && m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] < 2) { @@ -938,7 +934,6 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_DISABLE_BREATHING] = ConfigMgr::GetIntDefault("DisableWaterBreath", SEC_CONSOLE); - m_bool_configs[CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL] = ConfigMgr::GetBoolDefault("AlwaysMaxSkillForLevel", false); if (reload) { diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 53422108971..5a8c7cc879c 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -122,7 +122,6 @@ enum WorldBoolConfigs CONFIG_SKILL_MILLING, CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY, CONFIG_WEATHER, - CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, CONFIG_QUEST_IGNORE_RAID, CONFIG_DETECT_POS_COLLISION, CONFIG_RESTRICTED_LFG_CHANNEL, @@ -256,9 +255,7 @@ enum WorldIntConfigs CONFIG_SKILL_CHANCE_MINING_STEPS, CONFIG_SKILL_CHANCE_SKINNING_STEPS, CONFIG_SKILL_GAIN_CRAFTING, - CONFIG_SKILL_GAIN_DEFENSE, CONFIG_SKILL_GAIN_GATHERING, - CONFIG_SKILL_GAIN_WEAPON, CONFIG_MAX_OVERSPEED_PINGS, CONFIG_EXPANSION, CONFIG_CHATFLOOD_MESSAGE_COUNT, diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 0bf2e5664a0..557cef24ee6 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -50,7 +50,7 @@ enum PaladinSpells }; // 31850 - Ardent Defender -class spell_pal_ardent_defender : public SpellScriptLoader +/*class spell_pal_ardent_defender : public SpellScriptLoader { public: spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { } @@ -73,7 +73,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER; } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & canBeRecalculated) { // Set absorbtion amount to unlimited amount = -1; @@ -123,7 +123,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader { return new spell_pal_ardent_defender_AuraScript(); } -}; +};*/ class spell_pal_blessing_of_faith : public SpellScriptLoader { @@ -568,7 +568,7 @@ class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader void AddSC_paladin_spell_scripts() { - new spell_pal_ardent_defender(); + //new spell_pal_ardent_defender(); new spell_pal_blessing_of_faith(); new spell_pal_blessing_of_sanctuary(); new spell_pal_guarded_by_the_light(); diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index f8ee2390842..ec6d60863dd 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -862,15 +862,6 @@ AllFlightPaths = 0 InstantFlightPaths = 0 -# -# AlwaysMaxSkillForLevel -# Description: Players will automatically gain max skill level when logging in or leveling -# up. -# Default: 0 - (Disabled) -# 1 - (Enabled) - -AlwaysMaxSkillForLevel = 0 - # # ActivateWeather # Description: Activate the weather system. @@ -1952,19 +1943,13 @@ Rate.InstanceResetTime = 1 # # SkillGain.Crafting -# SkillGain.Defense # SkillGain.Gathering -# SkillGain.Weapon # Description: Crafting/defense/gathering/weapon skills gain rate. # Default: 1 - (SkillGain.Crafting) -# 1 - (SkillGain.Defense) # 1 - (SkillGain.Gathering) -# 1 - (SkillGain.Weapon) SkillGain.Crafting = 1 -SkillGain.Defense = 1 SkillGain.Gathering = 1 -SkillGain.Weapon = 1 # # SkillChance.Orange -- cgit v1.2.3 From c4d4beff3b26bfa4a34b7d520b0b96899fc5dd69 Mon Sep 17 00:00:00 2001 From: Spp Date: Tue, 18 Sep 2012 11:33:09 +0200 Subject: Warning fixes and some minor changes here and there - Added GetAchievementPoints to AchievementMgr --- src/server/game/Achievements/AchievementMgr.cpp | 50 +++++++------- src/server/game/Achievements/AchievementMgr.h | 2 + src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 8 +-- src/server/game/Entities/Unit/Unit.cpp | 6 +- src/server/game/Guilds/Guild.cpp | 76 ++++++++-------------- src/server/game/Guilds/Guild.h | 13 ++-- src/server/game/Guilds/GuildFinderMgr.h | 20 +++--- src/server/game/Handlers/GuildHandler.cpp | 2 +- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 2 +- src/server/scripts/Spells/spell_warrior.cpp | 2 +- 11 files changed, 79 insertions(+), 104 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 5bb9b4a0a11..39dc169b11d 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -16,6 +16,7 @@ * with this program. If not, see . */ +#include "AchievementMgr.h" #include "Common.h" #include "DBCEnums.h" #include "ObjectMgr.h" @@ -24,7 +25,6 @@ #include "World.h" #include "WorldPacket.h" #include "DatabaseEnv.h" -#include "AchievementMgr.h" #include "ArenaTeam.h" #include "CellImpl.h" #include "GameEventMgr.h" @@ -37,7 +37,6 @@ #include "ScriptMgr.h" #include "MapManager.h" #include "Battleground.h" -#include "BattlegroundAB.h" #include "Map.h" #include "InstanceScript.h" #include "Group.h" @@ -378,10 +377,7 @@ bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, } template -AchievementMgr::AchievementMgr(T* owner) -{ - _owner = owner; -} +AchievementMgr::AchievementMgr(T* owner): _owner(owner), _achievementPoints(0) {} template AchievementMgr::~AchievementMgr() @@ -456,7 +452,7 @@ void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntr template void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2, bool evenIfCriteriaComplete) { - sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", type, miscValue1, miscValue2); + sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "ResetAchievementCriteria(%u, %u, %u)", type, miscValue1, miscValue2); // disable for gamemasters with GM-mode enabled if (GetOwner()->isGameMaster()) @@ -711,6 +707,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, P ca.date = time_t(fields[1].GetUInt32()); ca.changed = false; + _achievementPoints += achievement->points; + // title achievement rewards are retroactive if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) if (uint32 titleId = reward->titleId[Player::TeamForRace(GetOwner()->getRace()) == ALLIANCE ? 0 : 1]) @@ -778,6 +776,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, Pr ca.guids.insert(MAKE_NEW_GUID(atol(guids[i]), 0, HIGHGUID_PLAYER)); ca.changed = false; + + _achievementPoints += achievement->points; } while (achievementResult->NextRow()); } @@ -840,6 +840,7 @@ void AchievementMgr::Reset() } m_completedAchievements.clear(); + _achievementPoints = 0; m_criteriaProgress.clear(); DeleteFromDB(GetOwner()->GetGUIDLow()); @@ -879,6 +880,7 @@ void AchievementMgr::Reset() if (AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(m_criteriaProgress.begin()->first)) RemoveCriteriaProgress(criteria); + _achievementPoints = 0; m_completedAchievements.clear(); DeleteFromDB(GetOwner()->GetId()); } @@ -1310,19 +1312,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, SetCriteriaProgress(achievementCriteria, referencePlayer->GetMoney(), referencePlayer, PROGRESS_HIGHEST); break; case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: - { if (!miscValue1) - { - uint32 points = 0; - for (CompletedAchievementMap::iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) - if (AchievementEntry const* pAchievement = sAchievementMgr->GetAchievement(itr->first)) - points += pAchievement->points; - SetCriteriaProgress(achievementCriteria, points, referencePlayer, PROGRESS_SET); - } + SetCriteriaProgress(achievementCriteria, _achievementPoints, referencePlayer, PROGRESS_SET); else SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; - } case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: { uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype; @@ -1387,10 +1381,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, break; } case ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL: - { - SetCriteriaProgress(achievementCriteria, referencePlayer->GetGuildLevel(), referencePlayer, PROGRESS_SET); + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer); break; - } // FIXME: not triggered in code as result, need to implement case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: @@ -1466,7 +1458,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi if (!progress) return false; - switch (achievementCriteria->type) + switch (AchievementCriteriaTypes(achievementCriteria->type)) { case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: return progress->counter >= achievementCriteria->win_bg.winCount; @@ -1604,6 +1596,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi default: break; } + return false; } @@ -1704,7 +1697,8 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entr if (entry->timeLimit && timedIter == m_timedAchievements.end()) return; - sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::SetCriteriaProgress(%u, %u) for (%s GUID: "UI64FMTD")", entry->ID, changeValue, GetLogNameForGuid(GetOwner()->GetGUID()), GetOwner()->GetGUID()); + sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "SetCriteriaProgress(%u, %u) for (%s GUID: %u)", + entry->ID, changeValue, GetLogNameForGuid(GetOwner()->GetGUID()), GUID_LOPART(GetOwner()->GetGUID())); CriteriaProgress* progress = GetCriteriaProgress(entry); if (!progress) @@ -1841,8 +1835,8 @@ void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes typ } } -template -void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* referencePlayer) +template<> +void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* referencePlayer) { sLog->outInfo(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::CompletedAchievement(%u)", achievement->ID); @@ -1869,6 +1863,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement if (!(achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) sAchievementMgr->SetRealmCompleted(achievement); + _achievementPoints += achievement->points; + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, NULL, referencePlayer); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->points, 0, NULL, referencePlayer); @@ -1955,6 +1951,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achieve sAchievementMgr->SetRealmCompleted(achievement); + _achievementPoints += achievement->points; + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, NULL, referencePlayer); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->points, 0, NULL, referencePlayer); } @@ -2054,11 +2052,6 @@ void AchievementMgr::SendAllAchievementData(Player* receiver) const receiver->GetSession()->SendPacket(&data); } -template -void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 achievementId /*= 0*/) const -{ -} - template<> void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 /*achievementId = 0 */) const { @@ -2355,6 +2348,7 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const *ac case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED: + case ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 38d76c247a9..efb9fcba1b6 100755 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -243,6 +243,7 @@ class AchievementMgr void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements + uint32 GetAchievementPoints() const { return _achievementPoints; } private: enum ProgressType { PROGRESS_SET, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST }; void SendAchievementEarned(AchievementEntry const* achievement) const; @@ -265,6 +266,7 @@ class AchievementMgr CompletedAchievementMap m_completedAchievements; typedef std::map TimedAchievementMap; TimedAchievementMap m_timedAchievements; // Criteria id/time left in MS + uint32 _achievementPoints; }; class AchievementGlobalMgr diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index becfc70fce8..2842a825e87 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -180,7 +180,7 @@ void BattlegroundMgr::Update(uint32 diff) } } -void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battleground *bg, Player * pPlayer, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype, uint8 uiFrame) +void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battleground *bg, Player * pPlayer, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 /*arenatype*/, uint8 /*uiFrame*/) { if (!bg) StatusID = STATUS_NONE; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3384c7a30d7..6ddbe2d037d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -849,8 +849,8 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep _activeCheats = CHEAT_NONE; - memset(_voidStorageItems, NULL, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*)); - memset(_CUFProfiles, NULL, MAX_CUF_PROFILES * sizeof(CUFProfile*)); + memset(_voidStorageItems, 0, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*)); + memset(_CUFProfiles, 0, MAX_CUF_PROFILES * sizeof(CUFProfile*)); } Player::~Player() @@ -6261,7 +6261,7 @@ void Player::UpdateSkillsForLevel() uint16 field = itr->second.pos / 2; uint8 offset = itr->second.pos & 1; // itr->second.pos % 2 - uint16 val = GetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset); + //uint16 val = GetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset); uint16 max = GetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset); /// update only level dependent max skill values @@ -7219,7 +7219,7 @@ void Player::_LoadCurrency(PreparedQueryResult result) uint16 currencyID = fields[0].GetUInt16(); CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(currencyID); - if (!currencyID) + if (!currency) continue; PlayerCurrency cur; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2cd395a1877..a96a829b91f 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9900,7 +9900,7 @@ bool Unit::isSpellCrit(Unit* victim, SpellInfo const* spellProto, SpellSchoolMas return false; } -uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* victim) +uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* /*victim*/) { // Calculate critical bonus int32 crit_bonus = damage; @@ -9937,7 +9937,7 @@ uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage return crit_bonus; } -uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* /*spellProto*/, uint32 damage, Unit* victim) +uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* /*spellProto*/, uint32 damage, Unit* /*victim*/) { // Calculate critical bonus int32 crit_bonus = damage; @@ -10459,7 +10459,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType AddPctN(DoneTotalMod, GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC, spellProto->Mechanic)); // done scripted mod (take it from owner) - Unit* owner = GetOwner() ? GetOwner() : this; + // Unit* owner = GetOwner() ? GetOwner() : this; // AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index a7ff2c75309..12455784cc8 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -120,13 +120,10 @@ inline uint32 Guild::LogHolder::GetNextGUID() return m_nextGUID; } -/////////////////////////////////////////////////////////////////////////////// // EventLogEntry void Guild::EventLogEntry::SaveToDB(SQLTransaction& trans) const { - PreparedStatement* stmt = NULL; - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG); stmt->setUInt32(0, m_guildId); stmt->setUInt32(1, m_guid); CharacterDatabase.ExecuteOrAppend(trans, stmt); @@ -195,14 +192,12 @@ void Guild::EventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& content) c content.WriteByteSeq(guid1[1]); } -/////////////////////////////////////////////////////////////////////////////// // BankEventLogEntry void Guild::BankEventLogEntry::SaveToDB(SQLTransaction& trans) const { - PreparedStatement* stmt = NULL; uint8 index = 0; - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG); stmt->setUInt32( index, m_guildId); stmt->setUInt32(++index, m_guid); stmt->setUInt8 (++index, m_bankTabId); @@ -270,7 +265,6 @@ void Guild::BankEventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& conten content << uint8(m_destTabId); } -/////////////////////////////////////////////////////////////////////////////// // RankInfo void Guild::RankInfo::LoadFromDB(Field* fields) { @@ -351,16 +345,15 @@ void Guild::RankInfo::SetBankTabSlotsAndRights(uint8 tabId, GuildBankRightsAndSl if (m_rankId == GR_GUILDMASTER) // Prevent loss of leader rights rightsAndSlots.SetGuildMasterValues(); - if (m_bankTabRightsAndSlots[tabId].IsEqual(rightsAndSlots)) + GuildBankRightsAndSlots& guildBR = m_bankTabRightsAndSlots[tabId]; + if (guildBR.IsEqual(rightsAndSlots)) return; - m_bankTabRightsAndSlots[tabId] = rightsAndSlots; + guildBR = rightsAndSlots; if (saveToDB) { - PreparedStatement* stmt = NULL; - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHT); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHT); stmt->setUInt32(0, m_guildId); stmt->setUInt8 (1, tabId); stmt->setUInt8 (2, m_rankId); @@ -370,8 +363,8 @@ void Guild::RankInfo::SetBankTabSlotsAndRights(uint8 tabId, GuildBankRightsAndSl stmt->setUInt32(0, m_guildId); stmt->setUInt8 (1, tabId); stmt->setUInt8 (2, m_rankId); - stmt->setUInt8 (3, m_bankTabRightsAndSlots[tabId].rights); - stmt->setUInt32(4, m_bankTabRightsAndSlots[tabId].slots); + stmt->setUInt8 (3, guildBR.rights); + stmt->setUInt32(4, guildBR.slots); CharacterDatabase.Execute(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_RANK_BANK_TIME0 + tabId); @@ -381,7 +374,6 @@ void Guild::RankInfo::SetBankTabSlotsAndRights(uint8 tabId, GuildBankRightsAndSl } } -/////////////////////////////////////////////////////////////////////////////// // BankTab bool Guild::BankTab::LoadFromDB(Field* fields) { @@ -414,7 +406,7 @@ bool Guild::BankTab::LoadItemFromDB(Field* fields) { sLog->outError(LOG_FILTER_GUILD, "Item (GUID %u, id: %u) not found in item_instance, deleting from guild bank!", itemGuid, itemEntry); - PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM); stmt->setUInt32(0, m_guildId); stmt->setUInt8 (1, m_tabId); stmt->setUInt8 (2, slotId); @@ -483,9 +475,7 @@ bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* item) m_items[slotId] = item; - PreparedStatement* stmt = NULL; - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_ITEM); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_ITEM); stmt->setUInt32(0, m_guildId); stmt->setUInt8 (1, m_tabId); stmt->setUInt8 (2, slotId); @@ -521,7 +511,6 @@ void Guild::BankTab::SendText(Guild const* guild, WorldSession* session) const guild->BroadcastPacket(&data); } -/////////////////////////////////////////////////////////////////////////////// // Member void Guild::Member::SetStats(Player* player) { @@ -633,6 +622,7 @@ bool Guild::Member::CheckStats() const sLog->outError(LOG_FILTER_GUILD, "Player (GUID: %u) has a broken data in field `characters`.`level`, deleting him from guild!", GUID_LOPART(m_guid)); return false; } + if (m_class < CLASS_WARRIOR || m_class >= MAX_CLASSES) { sLog->outError(LOG_FILTER_GUILD, "Player (GUID: %u) has a broken data in field `characters`.`class`, deleting him from guild!", GUID_LOPART(m_guid)); @@ -706,8 +696,12 @@ inline void Guild::Member::ResetMoneyTime() m_bankRemaining[GUILD_BANK_MAX_TABS].resetTime = 0; } -/////////////////////////////////////////////////////////////////////////////// // EmblemInfo +void EmblemInfo::ReadPacket(WorldPacket& recv) +{ + recv >> m_style >> m_color >> m_borderStyle >> m_borderColor >> m_backgroundColor; +} + void EmblemInfo::LoadFromDB(Field* fields) { m_style = fields[3].GetUInt8(); @@ -738,7 +732,6 @@ void EmblemInfo::SaveToDB(uint32 guildId) const CharacterDatabase.Execute(stmt); } -/////////////////////////////////////////////////////////////////////////////// // MoveItemData bool Guild::MoveItemData::CheckItem(uint32& splitedAmount) { @@ -786,7 +779,6 @@ inline void Guild::MoveItemData::CopySlots(SlotIds& ids) const ids.insert(uint8(itr->pos)); } -/////////////////////////////////////////////////////////////////////////////// // PlayerMoveItemData bool Guild::PlayerMoveItemData::InitItem() { @@ -846,7 +838,6 @@ inline InventoryResult Guild::PlayerMoveItemData::CanStore(Item* pItem, bool swa return m_pPlayer->CanStoreItem(m_container, m_slotId, m_vec, pItem, swap); } -/////////////////////////////////////////////////////////////////////////////// // BankMoveItemData bool Guild::BankMoveItemData::InitItem() { @@ -1059,10 +1050,9 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) return EQUIP_ERR_BANK_FULL; } -/////////////////////////////////////////////////////////////////////////////// // Guild Guild::Guild() : m_id(0), m_leaderGuid(0), m_createdDate(0), m_accountsNumber(0), m_bankMoney(0), m_eventLog(NULL), - m_achievementMgr(this), _level(1), _experience(0), _todayExperience(0), _newsLog(this) + m_achievementMgr(this), _newsLog(this), _level(1), _experience(0), _todayExperience(0) { memset(&m_bankEventLog, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(LogHolder*)); } @@ -1213,8 +1203,6 @@ void Guild::SaveToDB() CharacterDatabase.CommitTransaction(trans); } -/////////////////////////////////////////////////////////////////////////////// -// HANDLE CLIENT COMMANDS void Guild::HandleRoster(WorldSession* session /*= NULL*/) { ByteBuffer memberData(100); @@ -1565,6 +1553,7 @@ void Guild::HandleInviteMember(WorldSession* session, const std::string& name) // Do not show invitations from ignored players if (pInvitee->GetSocial()->HasIgnore(player->GetGUIDLow())) return; + if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeam() != player->GetTeam()) { SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_NOT_ALLIED, name); @@ -1695,7 +1684,7 @@ void Guild::HandleLeaveMember(WorldSession* session) _LogEvent(GUILD_EVENT_LOG_LEAVE_GUILD, player->GetGUIDLow()); _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName()); - SendCommandResult(session, GUILD_QUIT_S, ERR_PLAYER_NO_MORE_IN_GUILD, m_name); + SendCommandResult(session, GUILD_QUIT_S, ERR_GUILD_COMMAND_SUCCESS, m_name); } } @@ -1726,7 +1715,7 @@ void Guild::HandleRemoveMember(WorldSession* session, uint64 guid) } } else if (removedPlayer) - SendCommandResult(session, GUILD_QUIT_S, ERR_PLAYER_NO_MORE_IN_GUILD, removedPlayer->GetName()); + SendCommandResult(session, GUILD_QUIT_S, ERR_GUILD_COMMAND_SUCCESS, removedPlayer->GetName()); } void Guild::HandleUpdateMemberRank(WorldSession* session, uint64 targetGuid, bool demote) @@ -1969,8 +1958,6 @@ void Guild::HandleGuildPartyRequest(WorldSession* session) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent (SMSG_GUILD_PARTY_STATE_RESPONSE)"); } -/////////////////////////////////////////////////////////////////////////////// -// Send data to client void Guild::SendEventLog(WorldSession* session) const { WorldPacket data(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, 1 + m_eventLog->GetSize() * (1 + 8 + 4)); @@ -2005,7 +1992,7 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool withContent, b if (withContent && _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) if (BankTab const* tab = GetBankTab(tabId)) for (uint8 slotId = 0; slotId < GUILD_BANK_MAX_SLOTS; ++slotId) - if (Item* tabItem = tab->GetItem(slotId)) + if (tab->GetItem(slotId)) ++itemCount; data.WriteBits(itemCount, 20); @@ -2173,7 +2160,6 @@ void Guild::SendGuildReputationWeeklyCap(WorldSession* session) const } } -/////////////////////////////////////////////////////////////////////////////// // Loading methods bool Guild::LoadFromDB(Field* fields) { @@ -2377,7 +2363,6 @@ bool Guild::Validate() return true; } -/////////////////////////////////////////////////////////////////////////////// // Broadcasts void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, const std::string& msg, uint32 language) const { @@ -2423,7 +2408,6 @@ void Guild::BroadcastPacket(WorldPacket* packet) const player->GetSession()->SendPacket(packet); } -/////////////////////////////////////////////////////////////////////////////// // Members handling bool Guild::AddMember(uint64 guid, uint8 rankId) { @@ -2521,6 +2505,7 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked) else if (!newLeader || newLeader->GetRankId() > i->second->GetRankId()) newLeader = i->second; } + if (!newLeader) { Disband(); @@ -2540,7 +2525,7 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked) _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName().c_str()); } } - // Call script on remove before member is acutally removed from guild (and database) + // Call script on remove before member is actually removed from guild (and database) sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked); if (Member* member = GetMember(guid)) @@ -2581,7 +2566,6 @@ bool Guild::IsMember(uint64 guid) return itr != m_members.end(); } -/////////////////////////////////////////////////////////////////////////////// // Bank (items move) void Guild::SwapItems(Player* player, uint8 tabId, uint8 slotId, uint8 destTabId, uint8 destSlotId, uint32 splitedAmount) { @@ -2610,7 +2594,6 @@ void Guild::SwapItemsWithInventory(Player* player, bool toChar, uint8 tabId, uin _MoveItems(&charData, &bankData, splitedAmount); } -/////////////////////////////////////////////////////////////////////////////// // Bank tabs void Guild::SetBankTabText(uint8 tabId, const std::string& text) { @@ -2621,7 +2604,6 @@ void Guild::SetBankTabText(uint8 tabId, const std::string& text) } } -/////////////////////////////////////////////////////////////////////////////// // Private methods void Guild::_CreateLogHolders() { @@ -2676,12 +2658,11 @@ void Guild::_CreateDefaultGuildRanks(LocaleConstant loc) void Guild::_CreateRank(const std::string& name, uint32 rights) { - if (_GetRanksSize() >= GUILD_RANKS_MAX_COUNT) + uint32 newRankId = _GetRanksSize(); + if (newRankId >= GUILD_RANKS_MAX_COUNT) return; // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster - uint32 newRankId = _GetRanksSize(); - RankInfo info(m_id, newRankId, name, rights, 0); m_ranks.push_back(info); @@ -2923,7 +2904,7 @@ void Guild::_MoveItems(MoveItemData* pSrc, MoveItemData* pDest, uint32 splitedAm /* if (pItemSrc->GetCount() == 0) { - sLog->outFatal(LOG_FILTER_GENERAL, "Guild::SwapItems: Player %s(GUIDLow: %u) tried to move item %u from tab %u slot %u to tab %u slot %u, but item %u has a stack of zero!", + sLog->outFatal(LOG_FILTER_GUILD, "Guild::SwapItems: Player %s(GUIDLow: %u) tried to move item %u from tab %u slot %u to tab %u slot %u, but item %u has a stack of zero!", player->GetName(), player->GetGUIDLow(), pItemSrc->GetEntry(), tabId, slotId, destTabId, destSlotId, pItemSrc->GetEntry()); //return; // Commented out for now, uncomment when it's verified that this causes a crash!! } @@ -3133,8 +3114,7 @@ void Guild::_BroadcastEvent(GuildEvents guildEvent, uint64 guid, const char* par data << uint64(guid); BroadcastPacket(&data); - - sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent SMSG_GUILD_EVENT"); + sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_EVENT [Broadcast] Event: %u", guildEvent); } void Guild::SendGuildRanksUpdate(uint64 setterGuid, uint64 targetGuid, uint32 rank) @@ -3246,7 +3226,7 @@ void Guild::GiveXP(uint32 xp, Player* source) void Guild::SendGuildXP(WorldSession* session) const { - Member const* member = GetMember(session->GetGuidLow()); + //Member const* member = GetMember(session->GetGuidLow()); WorldPacket data(SMSG_GUILD_XP, 40); data << uint64(/*member ? member->GetTotalActivity() :*/ 0); diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 58dedf0137a..f39cd386a96 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -38,7 +38,8 @@ enum GuildMisc GUILD_RANK_NONE = 0xFF, GUILD_WITHDRAW_MONEY_UNLIMITED = 0xFFFFFFFF, GUILD_WITHDRAW_SLOT_UNLIMITED = 0xFFFFFFFF, - GUILD_EVENT_LOG_GUID_UNDEFINED = 0xFFFFFFFF + GUILD_EVENT_LOG_GUID_UNDEFINED = 0xFFFFFFFF, + GUILD_EXPERIENCE_UNCAPPED_LEVEL = 20 ///> Hardcoded in client, starting from this level, guild daily experience gain is unlimited. }; enum GuildDefaultRanks @@ -88,7 +89,7 @@ enum GuildCommandType enum GuildCommandError { - ERR_PLAYER_NO_MORE_IN_GUILD = 0x00, + ERR_GUILD_COMMAND_SUCCESS = 0x00, ERR_GUILD_INTERNAL = 0x01, ERR_ALREADY_IN_GUILD = 0x02, ERR_ALREADY_IN_GUILD_S = 0x03, @@ -138,7 +139,7 @@ enum GuildEvents GE_RANK_CREATED = 12, GE_RANK_DELETED = 13, GE_RANK_ORDER_CHANGED = 14, - GE_FOUNDER = 15, // At guild creation - Set founder + GE_FOUNDER = 15, GE_SIGNED_ON = 16, GE_SIGNED_OFF = 17, GE_GUILDBANKBAGSLOTS_CHANGED = 18, @@ -259,9 +260,6 @@ uint32 const MinNewsItemLevel[MAX_CONTENT] = { 61, 90, 200, 353 }; typedef std::map GuildNewsLogMap; -#define GUILD_EXPERIENCE_UNCAPPED_LEVEL 20 ///> Hardcoded in client, starting from this level, guild daily experience gain is unlimited. - -//////////////////////////////////////////////////////////////////////////////////////////// // Emblem info class EmblemInfo { @@ -270,7 +268,7 @@ public: void LoadFromDB(Field* fields); void SaveToDB(uint32 guildId) const; - void ReadPacket(WorldPacket& recv) { recv >> m_style >> m_color >> m_borderStyle >> m_borderColor >> m_backgroundColor; } + void ReadPacket(WorldPacket& recv); void WritePacket(WorldPacket& data) const; uint32 GetStyle() const { return m_style; } @@ -623,6 +621,7 @@ private: Item* GetItem(bool isCloned = false) const { return isCloned ? m_pClonedItem : m_pItem; } uint8 GetContainer() const { return m_container; } uint8 GetSlotId() const { return m_slotId; } + protected: virtual InventoryResult CanStore(Item* pItem, bool swap) = 0; diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h index 54faa83a002..930d538ebca 100644 --- a/src/server/game/Guilds/GuildFinderMgr.h +++ b/src/server/game/Guilds/GuildFinderMgr.h @@ -70,10 +70,10 @@ struct MembershipRequest } MembershipRequest(uint32 playerGUID, uint32 guildId, uint32 availability, uint32 classRoles, uint32 interests, std::string& comment, time_t submitTime) : - _playerGUID(playerGUID), _guildId(guildId), _availability(availability), _classRoles(classRoles), - _interests(interests), _time(submitTime), _comment(comment) {} + _comment(comment), _guildId(guildId), _playerGUID(playerGUID), _availability(availability), + _classRoles(classRoles), _interests(interests), _time(submitTime) {} - MembershipRequest() : _playerGUID(0), _guildId(0), _availability(0), _classRoles(0), + MembershipRequest() : _guildId(0), _playerGUID(0), _availability(0), _classRoles(0), _interests(0), _time(time(NULL)) {} uint32 GetGuildId() const { return _guildId; } @@ -164,14 +164,14 @@ struct LFGuildSettings : public LFGuildPlayer LFGuildSettings(bool listed, TeamId team) : LFGuildPlayer(), _listed(listed), _team(team) {} - LFGuildSettings(bool listed, TeamId team, uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level) : _listed(listed), - LFGuildPlayer(guid, role, availability, interests, level), _team(team) {} + LFGuildSettings(bool listed, TeamId team, uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level) : + LFGuildPlayer(guid, role, availability, interests, level), _listed(listed), _team(team) {} - LFGuildSettings(bool listed, TeamId team, uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level, std::string& comment) : _listed(listed), - LFGuildPlayer(guid, role, availability, interests, level, comment), _team(team) {} + LFGuildSettings(bool listed, TeamId team, uint32 guid, uint8 role, uint8 availability, uint8 interests, uint8 level, std::string& comment) : + LFGuildPlayer(guid, role, availability, interests, level, comment), _listed(listed), _team(team) {} - LFGuildSettings(LFGuildSettings const& settings) : _listed(settings.IsListed()), _team(settings.GetTeam()), - LFGuildPlayer(settings) {} + LFGuildSettings(LFGuildSettings const& settings) : + LFGuildPlayer(settings), _listed(settings.IsListed()), _team(settings.GetTeam()) {} bool IsListed() const { return _listed; } @@ -179,8 +179,8 @@ struct LFGuildSettings : public LFGuildPlayer TeamId GetTeam() const { return _team; } private: - TeamId _team; bool _listed; + TeamId _team; }; typedef std::map LFGuildStore; diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index fa3147ca175..d6f61b45ccf 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -787,7 +787,7 @@ void WorldSession::HandleGuildRewardsQueryOpcode(WorldPacket& recvPacket) { recvPacket.read_skip(); // Unk - if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) + if (sGuildMgr->GetGuildById(_player->GetGuildId())) { std::vector const& rewards = sGuildMgr->GetGuildRewards(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 108d2118a25..55f257e5ecc 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -46,7 +46,7 @@ class boss_mandokir : public CreatureScript { } - void KilledUnit(Unit* victim) + void KilledUnit(Unit* /*victim*/) { } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 7b0952dac7b..891505f1ec8 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -222,7 +222,7 @@ class spell_warr_execute : public SpellScriptLoader void HandleEffect(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) + if (GetHitUnit()) { SpellInfo const* spellInfo = GetSpellInfo(); int32 rageUsed = std::min(200 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); -- cgit v1.2.3 From 361034e8484e1ad7ef7cb7ebd560d0565f620ce9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 18 Sep 2012 18:11:22 +0200 Subject: Scripts/Icecrown Citadel: Fixed Unbound Plague Closes #7791 --- .../Northrend/IcecrownCitadel/boss_professor_putricide.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 489616332c8..7f6448382ba 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -1122,17 +1122,18 @@ class spell_putricide_unbound_plague : public SpellScriptLoader return true; } - SpellCastResult CheckCast() + void FilterTargets(std::list& targets) { if (AuraEffect const* eff = GetCaster()->GetAuraEffect(SPELL_UNBOUND_PLAGUE_SEARCHER, EFFECT_0)) + { if (eff->GetTickNumber() < 2) - return SPELL_FAILED_DONT_REPORT; + { + targets.clear(); + return; + } + } - return SPELL_CAST_OK; - } - void FilterTargets(std::list& targets) - { targets.remove_if(Trinity::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()))); Trinity::Containers::RandomResizeList(targets, 1); } @@ -1171,7 +1172,6 @@ class spell_putricide_unbound_plague : public SpellScriptLoader void Register() { - OnCheckCast += SpellCheckCastFn(spell_putricide_unbound_plague_SpellScript::CheckCast); OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_unbound_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); OnEffectHitTarget += SpellEffectFn(spell_putricide_unbound_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } -- cgit v1.2.3 From 993fb5b4a66e963344e07ef300055cf548a21796 Mon Sep 17 00:00:00 2001 From: Shocker Date: Fri, 21 Sep 2012 01:02:18 +0300 Subject: Core/Spells: Fix SPELL_AURA_MOD_CURRENCY_GAIN --- src/server/game/Entities/Player/Player.cpp | 9 ++++++--- src/server/game/Entities/Player/Player.h | 3 ++- src/server/game/Spells/Auras/SpellAuraDefines.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 +- src/server/scripts/Commands/cs_modify.cpp | 4 ++-- 5 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 96c6b30cba5..0d6e5a37b90 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7356,7 +7356,7 @@ bool Player::HasCurrency(uint32 id, uint32 count) const return itr != _currencyStorage.end() && itr->second.totalCount >= count; } -void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/) +void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bool ignoreMultipliers/* = false*/) { if (!count) return; @@ -7364,6 +7364,9 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/) CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id); ASSERT(currency); + if (!ignoreMultipliers) + count *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_CURRENCY_GAIN, id); + int32 precision = currency->Flags & CURRENCY_FLAG_HIGH_PRECISION ? 100 : 1; uint32 oldTotalCount = 0; uint32 oldWeekCount = 0; @@ -21118,7 +21121,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c for (int i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) { if (iece->RequiredCurrency[i]) - ModifyCurrency(iece->RequiredCurrency[i], -int32(iece->RequiredCurrencyCount[i])); + ModifyCurrency(iece->RequiredCurrency[i], -int32(iece->RequiredCurrencyCount[i]), true, true); } } @@ -21252,7 +21255,7 @@ bool Player::BuyCurrencyFromVendorSlot(uint64 vendorGuid, uint32 vendorSlot, uin return false; } - ModifyCurrency(currency, crItem->maxcount); + ModifyCurrency(currency, crItem->maxcount, true, true); return true; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 758e44aeefe..22091f80ce2 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1454,8 +1454,9 @@ class Player : public Unit, public GridObject * @param id currency entry from CurrencyTypes.dbc * @param count integer value for adding/removing curent currency * @param printLog used on SMSG_UPDATE_CURRENCY + * @param ignore gain multipliers */ - void ModifyCurrency(uint32 id, int32 count, bool printLog = true); + void ModifyCurrency(uint32 id, int32 count, bool printLog = true, bool ignoreMultipliers = false); void ApplyEquipCooldown(Item* pItem); void QuickEquipItem(uint16 pos, Item* pItem); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 1561f6289ed..102986c01ea 100755 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -408,7 +408,7 @@ enum AuraType SPELL_AURA_PROGRESS_BAR = 346, // NYI SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE = 347, // NYI SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT = 348, // NYI - SPELL_AURA_MOD_CURRENCY_GAIN = 349, // NYI + SPELL_AURA_MOD_CURRENCY_GAIN = 349, SPELL_AURA_MOD_GATHERING_ITEMS_GAINED_PERCENT = 350, // NYI SPELL_AURA_351 = 351, SPELL_AURA_352 = 352, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e93d9f25b67..0aa599baae3 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -404,7 +404,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //346 SPELL_AURA_PROGRESS_BAR &AuraEffect::HandleNULL, //347 SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE &AuraEffect::HandleNoImmediateEffect, //348 SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT - &AuraEffect::HandleNULL, //349 SPELL_AURA_MOD_CURRENCY_GAIN + &AuraEffect::HandleNoImmediateEffect, //349 SPELL_AURA_MOD_CURRENCY_GAIN &AuraEffect::HandleNULL, //350 SPELL_AURA_MOD_GATHERING_ITEMS_GAINED_PERCENT &AuraEffect::HandleNULL, //351 SPELL_AURA_351 &AuraEffect::HandleNULL, //352 SPELL_AURA_352 diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index beb5db62dfa..f527d7fb275 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1121,7 +1121,7 @@ public: int32 amount = (uint32)atoi(args); - target->ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, amount); + target->ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, amount, true, true); handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_HONOR_POINTS)); @@ -1311,7 +1311,7 @@ public: int32 amount = (uint32)atoi(args); - target->ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, amount); + target->ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, amount, true, true); handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS)); -- cgit v1.2.3 From 4fabb0ba32e29b8a8150a353e532ec01175a41cd Mon Sep 17 00:00:00 2001 From: Nexflame Date: Mon, 8 Oct 2012 22:52:13 +0300 Subject: Fix Compile --- .../scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 64210e97122..ce1e45f21e8 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1016,7 +1016,7 @@ class npc_meteor_strike_initial : public CreatureScript _meteorList.clear(); for (uint8 i = 0; i < 4; i++) { - angle[i] = MapManager::NormalizeOrientation(angle[i]); + angle[i] = Position::NormalizeOrientation(angle[i]); me->SetOrientation(angle[i]); me->GetNearPosition(newPos, 10.0f, 0.0f); // Exact distance if (Creature* meteor = me->SummonCreature(NPC_METEOR_STRIKE_NORTH + i, newPos, TEMPSUMMON_TIMED_DESPAWN, 30000)) -- cgit v1.2.3 From 1f699f2cd300895a5889d24d7513b09b544638ff Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 10 Oct 2012 10:14:26 -0500 Subject: Core/Scripts: Fixed the command to restore deleted characters. --- src/server/scripts/Commands/cs_character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 9f910cbaf75..d6c4ef54d15 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -224,7 +224,7 @@ public: stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME_DATA); stmt->setUInt32(0, delInfo.lowGuid); if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) - sWorld->AddCharacterNameData(delInfo.lowGuid, delInfo.name, (*result)[2].GetUInt8(), (*result)[0].GetUInt8(), (*result)[1].GetUInt8(), (*result)[2].GetUInt8()); + sWorld->AddCharacterNameData(delInfo.lowGuid, delInfo.name, (*result)[2].GetUInt8(), (*result)[0].GetUInt8(), (*result)[1].GetUInt8(), (*result)[3].GetUInt8()); } static void HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel, ChatHandler* handler) -- cgit v1.2.3 From a1c0d81fd6a1f4d61c8cd499ecf440fc56ef6196 Mon Sep 17 00:00:00 2001 From: kaelima Date: Thu, 11 Oct 2012 08:34:00 +0200 Subject: Fix build Remove 2 unused header includes --- src/server/game/Handlers/CharacterHandler.cpp | 2 +- .../scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp | 1 - src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b5a6bee8319..a37362ce7bc 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1734,7 +1734,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData) Field* fields = result->Fetch(); uint32 at_loginFlags = fields[0].GetUInt16(); char const* knownTitlesStr = fields[1].GetCString(); - uint32 used_loginFlag = ((recv_data.GetOpcode() == CMSG_CHAR_RACE_CHANGE) ? AT_LOGIN_CHANGE_RACE : AT_LOGIN_CHANGE_FACTION); + uint32 used_loginFlag = ((recvData.GetOpcode() == CMSG_CHAR_RACE_CHANGE) ? AT_LOGIN_CHANGE_RACE : AT_LOGIN_CHANGE_FACTION); if (!sObjectMgr->GetPlayerInfo(race, playerClass)) { diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index ce1e45f21e8..497ce889c62 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -20,7 +20,6 @@ #include "SpellAuraEffects.h" #include "Spell.h" #include "Vehicle.h" -#include "MapManager.h" #include "GameObjectAI.h" #include "ScriptedCreature.h" #include "ruby_sanctum.h" diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index aab54785213..5ad7375f259 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -20,7 +20,6 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "oculus.h" -#include "MapManager.h" enum Says { -- cgit v1.2.3 From 963aa5a159c5541b6c794b42a5f5809bc7a36192 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 14 Oct 2012 19:15:00 -0500 Subject: Scripts/Spells: Updated some warlock spellscripts to 4.3.4 --- src/server/game/Entities/Unit/StatSystem.cpp | 10 ++-- src/server/scripts/Spells/spell_warlock.cpp | 74 +++++++++++++++------------- 2 files changed, 44 insertions(+), 40 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index f2266f03ae9..eac2b531805 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -1101,8 +1101,8 @@ void Guardian::UpdateAttackPowerAndDamage(bool ranged) //demons benefit from warlocks shadow or fire damage else if (isPet()) { - int32 fire = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE); - int32 shadow = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_SHADOW); + int32 fire = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) + owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE); + int32 shadow = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW)) + owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_SHADOW); int32 maximum = (fire > shadow) ? fire : shadow; if (maximum < 0) maximum = 0; @@ -1112,7 +1112,7 @@ void Guardian::UpdateAttackPowerAndDamage(bool ranged) //water elementals benefit from mage's frost damage else if (GetEntry() == ENTRY_WATER_ELEMENTAL) { - int32 frost = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FROST)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FROST); + int32 frost = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FROST)) + owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FROST); if (frost < 0) frost = 0; SetBonusDamage(int32(frost * 0.4f)); @@ -1145,14 +1145,14 @@ void Guardian::UpdateDamagePhysical(WeaponAttackType attType) //force of nature if (GetEntry() == ENTRY_TREANT) { - int32 spellDmg = int32(m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_NATURE)) - m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_NATURE); + int32 spellDmg = int32(m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_NATURE)) + m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_NATURE); if (spellDmg > 0) bonusDamage = spellDmg * 0.09f; } //greater fire elemental else if (GetEntry() == ENTRY_FIRE_ELEMENTAL) { - int32 spellDmg = int32(m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) - m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE); + int32 spellDmg = int32(m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) + m_owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE); if (spellDmg > 0) bonusDamage = spellDmg * 0.4f; } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index e7cca8fed36..6bfa2419fdd 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -40,11 +40,16 @@ enum WarlockSpells WARLOCK_HAUNT = 48181, WARLOCK_HAUNT_HEAL = 48210, WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117, - WARLOCK_CURSE_OF_DOOM_EFFECT = 18662, + WARLOCK_BANE_OF_DOOM_EFFECT = 18662, WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703, WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704, WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955, WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956, + WARLOCK_SOULSHATTER = 32835, + WARLOCK_LIFE_TAP_ENERGIZE = 31818, + WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553, + WARLOCK_IMPROVED_LIFE_TAP_ICON_ID = 208, + WARLOCK_MANA_FEED_ICON_ID = 1982, }; /// Updated 4.3.4 @@ -244,6 +249,7 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS }; // 47422 Everlasting Affliction +/// Updated 4.3.4 class spell_warl_everlasting_affliction : public SpellScriptLoader { public: @@ -273,6 +279,8 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader } }; +// 27285 Seed of Corruption +/// Updated 4.3.4 class spell_warl_seed_of_corruption : public SpellScriptLoader { public: @@ -300,11 +308,8 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader } }; -enum Soulshatter -{ - SPELL_SOULSHATTER = 32835, -}; - +// 29858 Soulshatter +/// Updated 4.3.4 class spell_warl_soulshatter : public SpellScriptLoader { public: @@ -316,7 +321,7 @@ class spell_warl_soulshatter : public SpellScriptLoader bool Validate(SpellInfo const* /*spell*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_SOULSHATTER)) + if (!sSpellMgr->GetSpellInfo(WARLOCK_SOULSHATTER)) return false; return true; } @@ -325,10 +330,8 @@ class spell_warl_soulshatter : public SpellScriptLoader { Unit* caster = GetCaster(); if (Unit* target = GetHitUnit()) - { if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f) - caster->CastSpell(target, SPELL_SOULSHATTER, true); - } + caster->CastSpell(target, WARLOCK_SOULSHATTER, true); } void Register() @@ -343,14 +346,8 @@ class spell_warl_soulshatter : public SpellScriptLoader } }; -enum LifeTap -{ - SPELL_LIFE_TAP_ENERGIZE = 31818, - SPELL_LIFE_TAP_ENERGIZE_2 = 32553, - ICON_ID_IMPROVED_LIFE_TAP = 208, - ICON_ID_MANA_FEED = 1982, -}; - +// 1454 Life Tap +/// Updated 4.3.4 class spell_warl_life_tap : public SpellScriptLoader { public: @@ -367,7 +364,7 @@ class spell_warl_life_tap : public SpellScriptLoader bool Validate(SpellInfo const* /*spell*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2)) + if (!sSpellMgr->GetSpellInfo(WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(WARLOCK_LIFE_TAP_ENERGIZE_2)) return false; return true; } @@ -377,34 +374,31 @@ class spell_warl_life_tap : public SpellScriptLoader Player* caster = GetCaster()->ToPlayer(); if (Unit* target = GetHitUnit()) { - int32 damage = GetEffectValue(); - int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * 0.5f)); + int32 damage = caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue()); + int32 mana = CalculatePct(damage, GetSpellInfo()->Effects[EFFECT_1].CalcValue()); // Shouldn't Appear in Combat Log target->ModifyHealth(-damage); // Improved Life Tap mod - if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, ICON_ID_IMPROVED_LIFE_TAP, 0)) + if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_IMPROVED_LIFE_TAP_ICON_ID, 0)) AddPct(mana, aurEff->GetAmount()); - caster->CastCustomSpell(target, SPELL_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, false); + caster->CastCustomSpell(target, WARLOCK_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, false); // Mana Feed - int32 manaFeedVal = 0; - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, ICON_ID_MANA_FEED, 0)) - manaFeedVal = aurEff->GetAmount(); - - if (manaFeedVal > 0) + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_MANA_FEED_ICON_ID, 0)) { + int32 manaFeedVal = aurEff->GetAmount(); ApplyPct(manaFeedVal, mana); - caster->CastCustomSpell(caster, SPELL_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL); + caster->CastCustomSpell(caster, WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL); } } } SpellCastResult CheckCast() { - if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel)))) + if (int32(GetCaster()->GetHealth()) > int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue()))) return SPELL_CAST_OK; return SPELL_FAILED_FIZZLE; } @@ -422,6 +416,8 @@ class spell_warl_life_tap : public SpellScriptLoader } }; +// 48018 Demonic Circle: Summon +/// Updated 4.3.4 class spell_warl_demonic_circle_summon : public SpellScriptLoader { public: @@ -473,6 +469,8 @@ class spell_warl_demonic_circle_summon : public SpellScriptLoader } }; +// 48020 Demonic Circle: Teleport +/// Updated 4.3.4 class spell_warl_demonic_circle_teleport : public SpellScriptLoader { public: @@ -506,6 +504,8 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader } }; +// 48181 Haunt +/// Updated 4.3.4 class spell_warl_haunt : public SpellScriptLoader { public: @@ -565,6 +565,7 @@ class spell_warl_haunt : public SpellScriptLoader } }; +/// Updated 4.3.4 class spell_warl_unstable_affliction : public SpellScriptLoader { public: @@ -604,10 +605,12 @@ class spell_warl_unstable_affliction : public SpellScriptLoader } }; -class spell_warl_curse_of_doom : public SpellScriptLoader +// 603 Bane of Doom +/// Updated 4.3.4 +class spell_warl_bane_of_doom : public SpellScriptLoader { public: - spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { } + spell_warl_bane_of_doom() : SpellScriptLoader("spell_warl_bane_of_doom") { } class spell_warl_curse_of_doom_AuraScript : public AuraScript { @@ -615,7 +618,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader bool Validate(SpellInfo const* /*spell*/) { - if (!sSpellMgr->GetSpellInfo(WARLOCK_CURSE_OF_DOOM_EFFECT)) + if (!sSpellMgr->GetSpellInfo(WARLOCK_BANE_OF_DOOM_EFFECT)) return false; return true; } @@ -635,7 +638,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader return; if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) - GetCaster()->CastSpell(GetTarget(), WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff); + GetCaster()->CastSpell(GetTarget(), WARLOCK_BANE_OF_DOOM_EFFECT, true, NULL, aurEff); } void Register() @@ -650,6 +653,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader } }; +// 755 Health Funnel class spell_warl_health_funnel : public SpellScriptLoader { public: @@ -705,6 +709,6 @@ void AddSC_warlock_spell_scripts() new spell_warl_demonic_circle_teleport(); new spell_warl_haunt(); new spell_warl_unstable_affliction(); - new spell_warl_curse_of_doom(); + new spell_warl_bane_of_doom(); new spell_warl_health_funnel(); } -- cgit v1.2.3 From 61dce1a02e0092f4ad57dbe05ec74d6dd89df14a Mon Sep 17 00:00:00 2001 From: Naios Date: Wed, 26 Sep 2012 17:46:00 +0200 Subject: Core/PhaseMgr: Implemented Phase Definitions, Terrainswap and multiphasing * fixes cataclysm aura effect SPELL_AURA_PHASE without phasemasks defined in miscValueA * implements CONDITION_SOURCE_TYPE_PHASE_DEFINITION Thanks to: - Cyberbrest: For the hard research work about multiphasing. - Venugh: He helped me with a lot of strange compile Errors. - Shauren: For the 4.3.4 phaseshift packet. - Booksize: He showed me how terrainswap works Signed-off-by: Naios --- .../2012_09_26_00_world_phase_definitions_434.sql | 66 ++++ src/server/game/Conditions/ConditionMgr.cpp | 48 ++- src/server/game/Conditions/ConditionMgr.h | 6 +- src/server/game/DataStores/DBCStructure.h | 4 +- src/server/game/Entities/Player/Player.cpp | 74 ++-- src/server/game/Entities/Player/Player.h | 9 +- src/server/game/Globals/ObjectMgr.cpp | 97 +++++- src/server/game/Globals/ObjectMgr.h | 11 + src/server/game/Handlers/MiscHandler.cpp | 47 ++- src/server/game/Instances/InstanceScript.cpp | 11 + src/server/game/Instances/InstanceScript.h | 3 + src/server/game/Maps/PhaseMgr.cpp | 371 +++++++++++++++++++++ src/server/game/Maps/PhaseMgr.h | 173 ++++++++++ src/server/game/Miscellaneous/Language.h | 10 +- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/WorldSession.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 26 +- src/server/game/World/World.cpp | 14 + src/server/game/World/World.h | 2 + src/server/scripts/Commands/cs_debug.cpp | 29 +- src/server/scripts/Commands/cs_gobject.cpp | 4 +- src/server/scripts/Commands/cs_modify.cpp | 17 +- src/server/scripts/Commands/cs_npc.cpp | 4 +- src/server/scripts/Commands/cs_reload.cpp | 10 + src/server/scripts/Commands/cs_wp.cpp | 16 +- 25 files changed, 973 insertions(+), 83 deletions(-) create mode 100644 sql/updates/world/2012_09_26_00_world_phase_definitions_434.sql mode change 100755 => 100644 src/server/game/Entities/Player/Player.h create mode 100644 src/server/game/Maps/PhaseMgr.cpp create mode 100644 src/server/game/Maps/PhaseMgr.h (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_09_26_00_world_phase_definitions_434.sql b/sql/updates/world/2012_09_26_00_world_phase_definitions_434.sql new file mode 100644 index 00000000000..b8e97278eb5 --- /dev/null +++ b/sql/updates/world/2012_09_26_00_world_phase_definitions_434.sql @@ -0,0 +1,66 @@ +DROP TABLE IF EXISTS `phase_definitions`; +CREATE TABLE `phase_definitions` ( + `zoneId` mediumint(7) unsigned NOT NULL DEFAULT '0', + `entry` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `phasemask` bigint(20) unsigned NOT NULL DEFAULT '0', + `phaseId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `terrainswapmap` smallint(5) unsigned NOT NULL DEFAULT '0', + `flags` tinyint(3) unsigned DEFAULT '0', + `comment` text, + PRIMARY KEY (`zoneId`, `entry`) +) +AUTO_INCREMENT=1 +ENGINE=MyISAM +COLLATE='utf8_general_ci'; + +INSERT INTO `phase_definitions` (`zoneId`, `entry`, `phasemask`, `phaseId`, `terrainswapmap`, `flags`, `comment`) VALUES +(1519, 1, 129, 0, 0, 0, 'Stormwind: [A] Heros Call: Vashj''ir'), +(1519, 2, 257, 0, 0, 0, 'Stormwind: [A] Heros Call: Hyjal'), +(1519, 3, 513, 0, 0, 0, 'Stormwind: [A] Heros Call: Deepholm'), +(1519, 4, 1025, 0, 0, 0, 'Stormwind: [A] Heros Call: Uldum'), +(1519, 5, 2049, 0, 0, 0, 'Stormwind: [A] Heros Call: Twilight Highlands'), +(1637, 1, 129, 0, 0, 0, 'Orgrimmar: [H] Warchiefs Command: Vashj''ir'), +(1637, 2, 257, 0, 0, 0, 'Orgrimmar: [H] Warchiefs Command: Hyjal'), +(1637, 3, 513, 0, 0, 0, 'Orgrimmar: [H] Warchiefs Command: Deepholm'), +(1637, 4, 1025, 0, 0, 0, 'Orgrimmar: [H] Warchiefs Command: Uldum'), +(1637, 5, 2049, 0, 0, 0, 'Orgrimmar: [H] Warchiefs Command: Twilight Highlands'), +(616 , 1, 0 , 165, 719, 0, 'Mount Hyjal: Default Terrainswap'); + +DROP TABLE IF EXISTS `spell_phase`; +CREATE TABLE `spell_phase` ( + `id` mediumint(7) unsigned NOT NULL DEFAULT '0', + `phasemask` bigint(20) unsigned NOT NULL DEFAULT '1', + `terrainswapmap` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) +AUTO_INCREMENT=1 +ENGINE=MyISAM +COLLATE='utf8_general_ci'; + +DELETE FROM `trinity_string` WHERE `entry` BETWEEN 176 AND 182; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES +(176, '|cff0099FFPhaseMgr: Report for player: %s, zoneId: %u, level: %u, team: %u, phaseupdateflag: %u|r'), +(177, '|cff663399PhaseMgr: There are no definitions defined for zoneId %u.|r'), +(178, '|cff0066FFPhaseMgr: Success (entry: %u) - added %s %u to the players phase.|r'), +(179, '|cffFF0000PhaseMgr: Condition for phase %u (entry: %u, zoneId: %u) failed.|r'), +(180, '|cffFF0000PhaseMgr: Condition for phase %u (entry: %u, zoneId: %u) has last phasemask flag. Skipped other definitions.|r'), +(181, '|cff6699FFPhaseMgr: The player gets phasemask %u through definitions, %u through phasing auras, and phase %u through custom phase.|r'), +(182, '|cff0099FFPhaseMgr: The player has phasemask %u (real: %u).|r'); + +DELETE FROM `command` WHERE `name` IN('debug phase', 'debug send setphaseshift'); +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('debug phase', 1, 'Syntax: .debug phase\r\n\r\nSends a phase debug report of a player to you.'); + +/* +Conditions (SourceGroup -> ZoneId, SourceEntry -> Entry) + +If you visit the Gm Island as a alliance race you are automatically phased into phase 2. + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=23 AND `SourceGroup`=876 AND `SourceEntry`=1; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(23, 876, 1, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Phase Definitions Example: Phase is only visible for Alliance Members'); + +DELETE FROM `phase_definitions` WHERE `zoneId`=876 AND `entry`=1; +INSERT INTO `phase_definitions` (`zoneId`, `entry`, `phasemask`, `phaseId`, `terrainswapmap`, `flags`, `comment`) VALUES +(876, 1, 2, 0, 0, 0, '[Example] Gm Island'); +*/ diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 917c4cd7f90..406fb7cb753 100755 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -611,7 +611,8 @@ bool ConditionMgr::CanHaveSourceGroupSet(ConditionSourceType sourceType) const sourceType == CONDITION_SOURCE_TYPE_VEHICLE_SPELL || sourceType == CONDITION_SOURCE_TYPE_SPELL_IMPLICIT_TARGET || sourceType == CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT || - sourceType == CONDITION_SOURCE_TYPE_SMART_EVENT); + sourceType == CONDITION_SOURCE_TYPE_SMART_EVENT || + sourceType == CONDITION_SOURCE_TYPE_PHASE_DEFINITION); } bool ConditionMgr::CanHaveSourceIdSet(ConditionSourceType sourceType) const @@ -687,6 +688,23 @@ ConditionList ConditionMgr::GetConditionsForSmartEvent(int32 entryOrGuid, uint32 return cond; } +ConditionList ConditionMgr::GetConditionsForPhaseDefinition(uint32 zone, uint32 entry) +{ + ConditionList cond; + PhaseDefinitionConditionContainer::const_iterator itr = PhaseDefinitionsConditionStore.find(zone); + if (itr != PhaseDefinitionsConditionStore.end()) + { + ConditionTypeContainer::const_iterator i = (*itr).second.find(entry); + if (i != (*itr).second.end()) + { + cond = (*i).second; + sLog->outDebug(LOG_FILTER_CONDITIONSYS, "GetConditionsForPhaseDefinition: found conditions for zone %u entry %u spell %u", zone, entry); + } + } + + return cond; +} + void ConditionMgr::LoadConditions(bool isReload) { uint32 oldMSTime = getMSTime(); @@ -898,6 +916,13 @@ void ConditionMgr::LoadConditions(bool isReload) ++count; continue; } + case CONDITION_SOURCE_TYPE_PHASE_DEFINITION: + { + PhaseDefinitionsConditionStore[cond->SourceGroup][cond->SourceEntry].push_back(cond); + valid = true; + ++count; + continue; + } default: break; } @@ -1389,6 +1414,13 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) return false; } break; + case CONDITION_SOURCE_TYPE_PHASE_DEFINITION: + if (!PhaseMgr::IsConditionTypeSupported(cond->ConditionType)) + { + sLog->outError(LOG_FILTER_SQL, "Condition source type `CONDITION_SOURCE_TYPE_PHASE_DEFINITION` does not support condition type %u, ignoring.", cond->ConditionType); + return false; + } + break; case CONDITION_SOURCE_TYPE_GOSSIP_MENU: case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION: case CONDITION_SOURCE_TYPE_SMART_EVENT: @@ -1399,6 +1431,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) return true; } + bool ConditionMgr::isConditionTypeValid(Condition* cond) { if (cond->ConditionType == CONDITION_NONE || cond->ConditionType >= CONDITION_MAX) @@ -1940,6 +1973,19 @@ void ConditionMgr::Clean() SpellClickEventConditionStore.clear(); + for (PhaseDefinitionConditionContainer::iterator itr = PhaseDefinitionsConditionStore.begin(); itr != PhaseDefinitionsConditionStore.end(); ++itr) + { + for (ConditionTypeContainer::iterator it = itr->second.begin(); it != itr->second.end(); ++it) + { + for (ConditionList::const_iterator i = it->second.begin(); i != it->second.end(); ++i) + delete *i; + it->second.clear(); + } + itr->second.clear(); + } + + PhaseDefinitionsConditionStore.clear(); + // this is a BIG hack, feel free to fix it if you can figure out the ConditionMgr ;) for (std::list::const_iterator itr = AllocatedMemoryStore.begin(); itr != AllocatedMemoryStore.end(); ++itr) delete *itr; diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 57af0562dcd..fe7f6a18af8 100755 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -124,7 +124,8 @@ enum ConditionSourceType CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK = 20, CONDITION_SOURCE_TYPE_VEHICLE_SPELL = 21, CONDITION_SOURCE_TYPE_SMART_EVENT = 22, - CONDITION_SOURCE_TYPE_MAX = 23 //MAX + CONDITION_SOURCE_TYPE_PHASE_DEFINITION = 23, + CONDITION_SOURCE_TYPE_MAX = 24 //MAX }; enum ComparisionType @@ -211,6 +212,7 @@ typedef std::map ConditionTypeContainer; typedef std::map ConditionContainer; typedef std::map CreatureSpellConditionContainer; typedef std::map, ConditionTypeContainer> SmartEventConditionContainer; +typedef std::map PhaseDefinitionConditionContainer; typedef std::map ConditionReferenceContainer;//only used for references @@ -237,6 +239,7 @@ class ConditionMgr ConditionList GetConditionsForSpellClickEvent(uint32 creatureId, uint32 spellId); ConditionList GetConditionsForSmartEvent(int32 entryOrGuid, uint32 eventId, uint32 sourceType); ConditionList GetConditionsForVehicleSpell(uint32 creatureId, uint32 spellId); + ConditionList GetConditionsForPhaseDefinition(uint32 zone, uint32 entry); private: bool isSourceTypeValid(Condition* cond); @@ -254,6 +257,7 @@ class ConditionMgr CreatureSpellConditionContainer VehicleSpellConditionStore; CreatureSpellConditionContainer SpellClickEventConditionStore; SmartEventConditionContainer SmartEventConditionStore; + PhaseDefinitionConditionContainer PhaseDefinitionsConditionStore; }; template bool CompareValues(ComparisionType type, T val1, T val2) diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 308b9fa1a60..a1a0931dc5a 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1408,8 +1408,8 @@ struct LockEntry struct PhaseEntry { uint32 ID; // 0 - char* Name; // 1 - uint32 phaseShift; // 2 + char* Name; // 1 + uint32 flag; // 2 }; struct MailTemplateEntry diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9a0b21194cd..0582a879d5f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -649,7 +649,7 @@ void KillRewarder::Reward() #ifdef _MSC_VER #pragma warning(disable:4355) #endif -Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_reputationMgr(this) +Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_reputationMgr(this), phaseMgr(this) { #ifdef _MSC_VER #pragma warning(default:4355) @@ -2938,18 +2938,6 @@ void Player::SetGameMaster(bool on) } else { - // restore phase - uint32 newPhase = 0; - AuraEffectList const& phases = GetAuraEffectsByType(SPELL_AURA_PHASE); - if (!phases.empty()) - for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr) - newPhase |= (*itr)->GetMiscValue(); - - if (!newPhase) - newPhase = PHASEMASK_NORMAL; - - SetPhaseMask(newPhase, false); - m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON; setFactionForRace(getRace()); RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_GM); @@ -2970,6 +2958,9 @@ void Player::SetGameMaster(bool on) getHostileRefManager().setOnlineOfflineState(true); m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GM, SEC_PLAYER); + + phaseMgr.AddUpdateFlag(PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED); + phaseMgr.Update(); } UpdateObjectVisibility(); @@ -3202,6 +3193,11 @@ void Player::GiveLevel(uint8 level) UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL); + PhaseUpdateData phaseUdateData; + phaseUdateData.AddConditionType(CONDITION_LEVEL); + + phaseMgr.NotifyConditionChanged(phaseUdateData); + // Refer-A-Friend if (GetSession()->GetRecruiterId()) if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL)) @@ -7628,6 +7624,8 @@ void Player::UpdateArea(uint32 newArea) // so apply them accordingly m_areaUpdateId = newArea; + phaseMgr.AddUpdateFlag(PHASE_UPDATE_FLAG_AREA_UPDATE); + AreaTableEntry const* area = GetAreaEntryByAreaID(newArea); pvpInfo.inFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA); UpdatePvPState(true); @@ -7644,10 +7642,14 @@ void Player::UpdateArea(uint32 newArea) } else RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY); + + phaseMgr.RemoveUpdateFlag(PHASE_UPDATE_FLAG_AREA_UPDATE); } void Player::UpdateZone(uint32 newZone, uint32 newArea) { + phaseMgr.AddUpdateFlag(PHASE_UPDATE_FLAG_ZONE_UPDATE); + if (m_zoneUpdateId != newZone) { sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId); @@ -7757,6 +7759,8 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) UpdateLocalChannels(newZone); UpdateZoneDependentAuras(newZone); + + phaseMgr.RemoveUpdateFlag(PHASE_UPDATE_FLAG_ZONE_UPDATE); } //If players are too far away from the duel flag... they lose the duel @@ -15010,6 +15014,11 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) CastSpell(this, itr->second->spellId, true); } + PhaseUpdateData phaseUdateData; + phaseUdateData.AddQuestUpdate(quest_id); + + phaseMgr.NotifyConditionChanged(phaseUdateData); + UpdateForQuestWorldObjects(); } @@ -15178,6 +15187,11 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, m_RewardedQuests.insert(quest_id); m_RewardedQuestsSave[quest_id] = true; + PhaseUpdateData phaseUdateData; + phaseUdateData.AddQuestUpdate(quest_id); + + phaseMgr.NotifyConditionChanged(phaseUdateData); + // StoreNewItem, mail reward, etc. save data directly to the database // to prevent exploitable data desynchronisation we save the quest status to the database too // (to prevent rewarding this quest another time while rewards were already given out) @@ -15767,6 +15781,11 @@ void Player::SetQuestStatus(uint32 quest_id, QuestStatus status) m_QuestStatusSave[quest_id] = true; } + PhaseUpdateData phaseUdateData; + phaseUdateData.AddQuestUpdate(quest_id); + + phaseMgr.NotifyConditionChanged(phaseUdateData); + UpdateForQuestWorldObjects(); } @@ -15777,6 +15796,11 @@ void Player::RemoveActiveQuest(uint32 quest_id) { m_QuestStatus.erase(itr); m_QuestStatusSave[quest_id] = false; + + PhaseUpdateData phaseUdateData; + phaseUdateData.AddQuestUpdate(quest_id); + + phaseMgr.NotifyConditionChanged(phaseUdateData); return; } } @@ -15788,6 +15812,11 @@ void Player::RemoveRewardedQuest(uint32 quest_id) { m_RewardedQuests.erase(rewItr); m_RewardedQuestsSave[quest_id] = false; + + PhaseUpdateData phaseUdateData; + phaseUdateData.AddQuestUpdate(quest_id); + + phaseMgr.NotifyConditionChanged(phaseUdateData); } } @@ -24420,25 +24449,6 @@ void Player::_LoadSkills(PreparedQueryResult result) } } -uint32 Player::GetPhaseMaskForSpawn() const -{ - uint32 phase = PHASEMASK_NORMAL; - if (!isGameMaster()) - phase = GetPhaseMask(); - else - { - AuraEffectList const& phases = GetAuraEffectsByType(SPELL_AURA_PHASE); - if (!phases.empty()) - phase = phases.front()->GetMiscValue(); - } - - // some aura phases include 1 normal map in addition to phase itself - if (uint32 n_phase = phase & ~PHASEMASK_NORMAL) - return n_phase; - - return PHASEMASK_NORMAL; -} - InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limit_count) const { ItemTemplate const* pProto = pItem->GetTemplate(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h old mode 100755 new mode 100644 index 4d91ac42879..f1f58231bef --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -37,6 +37,9 @@ #include "Unit.h" #include "Util.h" // for Tokens typedef #include "WorldSession.h" +#include "PhaseMgr.h" + +// for template #include "SpellMgr.h" #include @@ -54,6 +57,7 @@ class PlayerMenu; class PlayerSocial; class SpellCastTargets; class UpdateMask; +class PhaseMgr; typedef std::deque PlayerMails; @@ -1342,7 +1346,8 @@ class Player : public Unit, public GridObject Pet* GetPet() const; Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 despwtime); void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false); - uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn + + PhaseMgr& GetPhaseMgr() { return phaseMgr; } void Say(const std::string& text, const uint32 language); void Yell(const std::string& text, const uint32 language); @@ -3083,6 +3088,8 @@ class Player : public Unit, public GridObject uint32 _pendingBindTimer; uint32 _activeCheats; + + PhaseMgr phaseMgr; }; void AddItemsSetItem(Player*player, Item* item); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 3945d3b76fe..dd2afa44a07 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8652,7 +8652,7 @@ void ObjectMgr::LoadFactionChangeTitles() } uint32 count = 0; - + do { Field* fields = result->Fetch(); @@ -8666,7 +8666,7 @@ void ObjectMgr::LoadFactionChangeTitles() sLog->outError(LOG_FILTER_SQL, "Title %u referenced in `player_factionchange_title` does not exist, pair skipped!", horde); else FactionChange_Titles[alliance] = horde; - + ++count; } while (result->NextRow()); @@ -8674,6 +8674,99 @@ void ObjectMgr::LoadFactionChangeTitles() sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u faction change title pairs in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +void ObjectMgr::LoadPhaseDefinitions() +{ + _PhaseDefinitionStore.clear(); + + uint32 oldMSTime = getMSTime(); + + // 0 1 2 3 4 5 + QueryResult result = WorldDatabase.Query("SELECT zoneId, entry, phasemask, phaseId, terrainswapmap, flags FROM `phase_definitions` ORDER BY `entry` ASC"); + + if (!result) + { + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 phasing definitions. DB table `phase_definitions` is empty."); + return; + } + + uint32 count = 0; + + do + { + Field *fields = result->Fetch(); + + PhaseDefinition PhaseDefinition; + + PhaseDefinition.zoneId = fields[0].GetUInt32(); + PhaseDefinition.entry = fields[1].GetUInt32(); + PhaseDefinition.phasemask = fields[2].GetUInt32(); + PhaseDefinition.phaseId = fields[3].GetUInt32(); + PhaseDefinition.terrainswapmap = fields[4].GetUInt32(); + PhaseDefinition.flags = fields[5].GetUInt32(); + + // Checks + if ((PhaseDefinition.flags & PHASE_FLAG_OVERWRITE_EXISTING) && (PhaseDefinition.flags & PHASE_FLAG_NEGATE_PHASE)) + { + sLog->outError(LOG_FILTER_SQL, "Flags defined in phase_definitions in zoneId %d and entry %u does contain PHASE_FLAG_OVERWRITE_EXISTING and PHASE_FLAG_NEGATE_PHASE. Setting flags to PHASE_FLAG_OVERWRITE_EXISTING", PhaseDefinition.zoneId, PhaseDefinition.entry); + PhaseDefinition.flags &= ~PHASE_FLAG_NEGATE_PHASE; + } + + _PhaseDefinitionStore[PhaseDefinition.zoneId].push_back(PhaseDefinition); + + ++count; + } + while (result->NextRow()); + + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u phasing definitions in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); +} + +void ObjectMgr::LoadSpellPhaseInfo() +{ + _SpellPhaseStore.clear(); + + uint32 oldMSTime = getMSTime(); + + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT id, phasemask, terrainswapmap FROM `spell_phase`"); + + if (!result) + { + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 spell dbc infos. DB table `spell_phase` is empty."); + return; + } + + uint32 count = 0; + do + { + Field *fields = result->Fetch(); + + SpellPhaseInfo spellPhaseInfo; + spellPhaseInfo.spellId = fields[0].GetUInt32(); + + SpellInfo const* spell = sSpellMgr->GetSpellInfo(spellPhaseInfo.spellId); + if (!spell) + { + sLog->outError(LOG_FILTER_SQL, "Spell %u defined in `spell_phase` does not exists, skipped.", spellPhaseInfo.spellId); + continue; + } + + if (!spell->HasAura(SPELL_AURA_PHASE)) + { + sLog->outError(LOG_FILTER_SQL, "Spell %u defined in `spell_phase` does not have aura effect type SPELL_AURA_PHASE, useless value.", spellPhaseInfo.spellId); + continue; + } + + spellPhaseInfo.phasemask = fields[1].GetUInt32(); + spellPhaseInfo.terrainswapmap = fields[2].GetUInt32(); + + _SpellPhaseStore[spellPhaseInfo.spellId] = spellPhaseInfo; + + ++count; + } + while (result->NextRow()); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u spell dbc infos in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); +} + GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry) { GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 61094d60c55..496d5ae224f 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -42,8 +42,10 @@ #include #include "ConditionMgr.h" #include +#include "PhaseMgr.h" class Item; +class PhaseMgr; // GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push, N), also any gcc version not support it at some platform #if defined(__GNUC__) @@ -906,6 +908,12 @@ class ObjectMgr void LoadTrainerSpell(); void AddSpellToTrainer(uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel); + void LoadPhaseDefinitions(); + void LoadSpellPhaseInfo(); + + PhaseDefinitionStore const* GetPhaseDefinitionStore() { return &_PhaseDefinitionStore; } + SpellPhaseStore const* GetSpellPhaseStore() { return &_SpellPhaseStore; } + std::string GeneratePetName(uint32 entry); uint32 GetBaseXP(uint8 level); uint32 GetXPForLevel(uint8 level) const; @@ -1222,6 +1230,9 @@ class ObjectMgr PageTextContainer _pageTextStore; InstanceTemplateContainer _instanceTemplateStore; + PhaseDefinitionStore _PhaseDefinitionStore; + SpellPhaseStore _SpellPhaseStore; + private: void LoadScripts(ScriptsType type); void CheckScripts(ScriptsType type, std::set& ids); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 2acc8ffcf7b..1947baa43b6 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1753,10 +1753,51 @@ void WorldSession::HandleReadyForAccountDataTimes(WorldPacket& /*recvData*/) SendAccountDataTimes(GLOBAL_CACHE_MASK); } -void WorldSession::SendSetPhaseShift(uint32 PhaseShift) +void WorldSession::SendSetPhaseShift(std::set const& phaseIds, std::set const& terrainswaps) { - WorldPacket data(SMSG_SET_PHASE_SHIFT, 4); - data << uint32(PhaseShift); + ObjectGuid guid = _player->GetGUID(); + + WorldPacket data(SMSG_SET_PHASE_SHIFT, 1 + 8 + 4 + 4 + 4 + 4 + 2 * phaseIds.size() + 4 + terrainswaps.size() * 2); + data.WriteBit(guid[2]); + data.WriteBit(guid[3]); + data.WriteBit(guid[1]); + data.WriteBit(guid[6]); + data.WriteBit(guid[4]); + data.WriteBit(guid[5]); + data.WriteBit(guid[0]); + data.WriteBit(guid[7]); + + data.WriteByteSeq(guid[7]); + data.WriteByteSeq(guid[4]); + + data << uint32(0); + //for (uint8 i = 0; i < worldMapAreaCount; ++i) + // data << uint16(0); // WorldMapArea.dbc id (controls map display) + + data.WriteByteSeq(guid[1]); + + data << uint32(0); // flags (not phasemask) + + data.WriteByteSeq(guid[2]); + data.WriteByteSeq(guid[6]); + + data << uint32(0); // Inactive terrain swaps + //for (uint8 i = 0; i < inactiveSwapsCount; ++i) + // data << uint16(0); + + data << uint32(phaseIds.size()) * 2; // Phase.dbc ids + for (std::set::const_iterator itr = phaseIds.begin(); itr != phaseIds.end(); ++itr) + data << uint16(*itr); + + data.WriteByteSeq(guid[3]); + data.WriteByteSeq(guid[0]); + + data << uint32(terrainswaps.size()) * 2; // Active terrain swaps + for (std::set::const_iterator itr = terrainswaps.begin(); itr != terrainswaps.end(); ++itr) + data << uint16(*itr); + + data.WriteByteSeq(guid[5]); + SendPacket(&data); } diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index d967ece9cf2..f14dc3c8b14 100755 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -450,3 +450,14 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi } } } + +void InstanceScript::UpdatePhasing() +{ + PhaseUpdateData phaseUdateData; + phaseUdateData.AddConditionType(CONDITION_INSTANCE_DATA); + + Map::PlayerList const& players = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->getSource()) + player->GetPhaseMgr().NotifyConditionChanged(phaseUdateData); +} diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index ab37c1ab5e9..291ba3be52f 100755 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -217,6 +217,9 @@ class InstanceScript : public ZoneScript virtual void FillInitialWorldStates(WorldPacket& /*data*/) {} + // ReCheck PhaseTemplate related conditions + void UpdatePhasing(); + protected: void SetBossNumber(uint32 number) { bosses.resize(number); } void LoadDoorData(DoorData const* data); diff --git a/src/server/game/Maps/PhaseMgr.cpp b/src/server/game/Maps/PhaseMgr.cpp new file mode 100644 index 00000000000..63bdff2d094 --- /dev/null +++ b/src/server/game/Maps/PhaseMgr.cpp @@ -0,0 +1,371 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "PhaseMgr.h" +#include "Chat.h" + +////////////////////////////////////////////////////////////////// +// Updating + +PhaseMgr::PhaseMgr(Player* _player) : player(_player), phaseData(_player), _UpdateFlags(0) +{ + _PhaseDefinitionStore = sObjectMgr->GetPhaseDefinitionStore(); + _SpellPhaseStore = sObjectMgr->GetSpellPhaseStore(); +} + +void PhaseMgr::Update() +{ + if (IsUpdateInProgress()) + return; + + if (_UpdateFlags & PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED) + phaseData.SendPhaseshiftToPlayer(); + + if (_UpdateFlags & PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED) + phaseData.SendPhaseMaskToPlayer(); + + _UpdateFlags = 0; +} + +void PhaseMgr::RemoveUpdateFlag(PhaseUpdateFlag updateFlag) +{ + _UpdateFlags &= ~updateFlag; + + if (updateFlag == PHASE_UPDATE_FLAG_ZONE_UPDATE) + { + // Update zone changes + if (phaseData.HasActiveDefinitions()) + { + phaseData.ResetDefinitions(); + _UpdateFlags |= (PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED | PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED); + } + + if (_PhaseDefinitionStore->find(player->GetZoneId()) != _PhaseDefinitionStore->end()) + Recalculate(); + } + + Update(); +} + +///////////////////////////////////////////////////////////////// +// Notifier + +void PhaseMgr::NotifyConditionChanged(PhaseUpdateData const& updateData) +{ + if (NeedsPhaseUpdateWithData(updateData)) + { + Recalculate(); + Update(); + } +} + +////////////////////////////////////////////////////////////////// +// Phasing Definitions + +void PhaseMgr::Recalculate() +{ + if (phaseData.HasActiveDefinitions()) + { + phaseData.ResetDefinitions(); + _UpdateFlags |= (PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED | PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED); + } + + PhaseDefinitionStore::const_iterator itr = _PhaseDefinitionStore->find(player->GetZoneId()); + if (itr != _PhaseDefinitionStore->end()) + for (PhaseDefinitionContainer::const_iterator phase = itr->second.begin(); phase != itr->second.end(); ++phase) + if (CheckDefinition(&(*phase))) + { + phaseData.AddPhaseDefinition(&(*phase)); + + if (phase->phasemask) + _UpdateFlags |= PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED; + + if (phase->phaseId || phase->terrainswapmap) + _UpdateFlags |= PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED; + + if (phase->IsLastDefinition()) + break; + } +} + +inline bool PhaseMgr::CheckDefinition(PhaseDefinition const* phaseDefinition) +{ + return sConditionMgr->IsObjectMeetToConditions(player, sConditionMgr->GetConditionsForPhaseDefinition(phaseDefinition->zoneId, phaseDefinition->entry)); +} + +bool PhaseMgr::NeedsPhaseUpdateWithData(PhaseUpdateData const updateData) const +{ + PhaseDefinitionStore::const_iterator itr = _PhaseDefinitionStore->find(player->GetZoneId()); + if (itr != _PhaseDefinitionStore->end()) + { + for (PhaseDefinitionContainer::const_iterator phase = itr->second.begin(); phase != itr->second.end(); ++phase) + { + ConditionList conditionList = sConditionMgr->GetConditionsForPhaseDefinition(phase->zoneId, phase->entry); + for (ConditionList::const_iterator condition = conditionList.begin(); condition != conditionList.end(); ++condition) + if (updateData.IsConditionRelated(*condition)) + return true; + } + } + return false; +} + +////////////////////////////////////////////////////////////////// +// Auras + +void PhaseMgr::RegisterPhasingAuraEffect(AuraEffect const* auraEffect) +{ + PhaseInfo phaseInfo; + + if (auraEffect->GetMiscValue()) + { + _UpdateFlags |= PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED; + phaseInfo.phasemask = auraEffect->GetMiscValue(); + } + else + { + SpellPhaseStore::const_iterator itr = _SpellPhaseStore->find(auraEffect->GetId()); + if (itr != _SpellPhaseStore->end()) + { + if (itr->second.phasemask) + { + _UpdateFlags |= PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED; + phaseInfo.phasemask = itr->second.phasemask; + } + + if (itr->second.terrainswapmap) + phaseInfo.terrainswapmap = itr->second.terrainswapmap; + } + } + + phaseInfo.phaseId = auraEffect->GetMiscValueB(); + + if (phaseInfo.NeedsClientSideUpdate()) + _UpdateFlags |= PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED; + + phaseData.AddAuraInfo(auraEffect->GetId(), phaseInfo); + + Update(); +} + +void PhaseMgr::UnRegisterPhasingAuraEffect(AuraEffect const* auraEffect) +{ + _UpdateFlags |= phaseData.RemoveAuraInfo(auraEffect->GetId()); + + Update(); +} + +////////////////////////////////////////////////////////////////// +// Commands + +void PhaseMgr::SendDebugReportToPlayer(Player* const debugger) +{ + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_REPORT_STATUS, player->GetName(), player->GetZoneId(), player->getLevel(), player->GetTeamId(), _UpdateFlags); + + PhaseDefinitionStore::const_iterator itr = _PhaseDefinitionStore->find(player->GetZoneId()); + if (itr == _PhaseDefinitionStore->end()) + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_NO_DEFINITIONS, player->GetZoneId()); + else + { + for (PhaseDefinitionContainer::const_iterator phase = itr->second.begin(); phase != itr->second.end(); ++phase) + { + if (CheckDefinition(&(*phase))) + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_SUCCESS, phase->entry, phase->IsNegatingPhasemask() ? "negated Phase" : "Phase", phase->phasemask); + else + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_FAILED, phase->phasemask, phase->entry, phase->zoneId); + + if (phase->IsLastDefinition()) + { + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_LAST_PHASE, phase->phasemask, phase->entry, phase->zoneId); + break; + } + } + } + + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_LIST, phaseData._PhasemaskThroughDefinitions, phaseData._PhasemaskThroughAuras, phaseData._CustomPhasemask); + + ChatHandler(debugger).PSendSysMessage(LANG_PHASING_PHASEMASK, phaseData.GetPhaseMaskForSpawn(), player->GetPhaseMask()); +} + +void PhaseMgr::SetCustomPhase(uint32 const phaseMask) +{ + phaseData._CustomPhasemask = phaseMask; + + _UpdateFlags |= PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED; + + Update(); +} + +////////////////////////////////////////////////////////////////// +// Phase Data + +uint32 PhaseData::GetCurrentPhasemask() const +{ + if (player->isGameMaster()) + return PHASEMASK_ANYWHERE; + + if (_CustomPhasemask) + return _CustomPhasemask; + + return GetPhaseMaskForSpawn(); +} + +inline uint32 PhaseData::GetPhaseMaskForSpawn() const +{ + uint32 const phase = (_PhasemaskThroughDefinitions | _PhasemaskThroughAuras); + return (phase ? phase : PHASEMASK_NORMAL); +} + +void PhaseData::SendPhaseMaskToPlayer() +{ + // Server side update + uint32 const phasemask = GetCurrentPhasemask(); + if (player->GetPhaseMask() == phasemask) + return; + + player->SetPhaseMask(phasemask, false); + + if (player->IsVisible()) + player->UpdateObjectVisibility(); +} + +void PhaseData::SendPhaseshiftToPlayer() +{ + // Client side update + std::set phaseIds; + std::set terrainswaps; + + for (PhaseInfoContainer::const_iterator itr = spellPhaseInfo.begin(); itr != spellPhaseInfo.end(); ++itr) + { + if (itr->second.terrainswapmap) + terrainswaps.insert(itr->second.terrainswapmap); + + if (itr->second.phaseId) + phaseIds.insert(itr->second.phaseId); + } + + // Phase Definitions + for (std::list::const_iterator itr = activePhaseDefinitions.begin(); itr != activePhaseDefinitions.end(); ++itr) + { + if ((*itr)->phaseId) + phaseIds.insert((*itr)->phaseId); + + if ((*itr)->terrainswapmap) + terrainswaps.insert((*itr)->terrainswapmap); + } + + player->GetSession()->SendSetPhaseShift(phaseIds, terrainswaps); +} + +void PhaseData::AddPhaseDefinition(PhaseDefinition const* phaseDefinition) +{ + if (phaseDefinition->IsOverwritingExistingPhases()) + { + activePhaseDefinitions.clear(); + _PhasemaskThroughDefinitions = phaseDefinition->phasemask; + } + else + { + if (phaseDefinition->IsNegatingPhasemask()) + _PhasemaskThroughDefinitions &= ~phaseDefinition->phasemask; + else + _PhasemaskThroughDefinitions |= phaseDefinition->phasemask; + } + + activePhaseDefinitions.push_back(phaseDefinition); +} + +void PhaseData::AddAuraInfo(uint32 const spellId, PhaseInfo phaseInfo) +{ + if (phaseInfo.phasemask) + _PhasemaskThroughAuras |= phaseInfo.phasemask; + + spellPhaseInfo[spellId] = phaseInfo; +} + +uint32 PhaseData::RemoveAuraInfo(uint32 const spellId) +{ + PhaseInfoContainer::const_iterator rAura = spellPhaseInfo.find(spellId); + if (rAura != spellPhaseInfo.end()) + { + uint32 updateflag = 0; + + if (rAura->second.NeedsClientSideUpdate()) + updateflag |= PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED; + + if (rAura->second.NeedsServerSideUpdate()) + { + _PhasemaskThroughAuras = 0; + + updateflag |= PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED; + + spellPhaseInfo.erase(rAura); + + for (PhaseInfoContainer::const_iterator itr = spellPhaseInfo.begin(); itr != spellPhaseInfo.end(); ++itr) + _PhasemaskThroughAuras |= itr->second.phasemask; + } + + return updateflag; + } + else + return 0; +} + +////////////////////////////////////////////////////////////////// +// Phase Update Data + +void PhaseUpdateData::AddQuestUpdate(uint32 const questId) +{ + AddConditionType(CONDITION_QUESTREWARDED); + AddConditionType(CONDITION_QUESTTAKEN); + AddConditionType(CONDITION_QUEST_COMPLETE); + AddConditionType(CONDITION_QUEST_NONE); + + _questId = questId; +} + +bool PhaseUpdateData::IsConditionRelated(Condition const* condition) const +{ + switch (condition->ConditionType) + { + case CONDITION_QUESTREWARDED: + case CONDITION_QUESTTAKEN: + case CONDITION_QUEST_COMPLETE: + case CONDITION_QUEST_NONE: + return condition->ConditionValue1 == _questId && ((1 << condition->ConditionType) & _conditionTypeFlags); + default: + return (1 << condition->ConditionType) & _conditionTypeFlags; + } +} + +bool PhaseMgr::IsConditionTypeSupported(ConditionTypes const conditionType) +{ + switch (conditionType) + { + case CONDITION_QUESTREWARDED: + case CONDITION_QUESTTAKEN: + case CONDITION_QUEST_COMPLETE: + case CONDITION_QUEST_NONE: + case CONDITION_TEAM: + case CONDITION_CLASS: + case CONDITION_RACE: + case CONDITION_INSTANCE_DATA: + case CONDITION_LEVEL: + return true; + default: + return false; + } +} diff --git a/src/server/game/Maps/PhaseMgr.h b/src/server/game/Maps/PhaseMgr.h new file mode 100644 index 00000000000..accb0cd3ea8 --- /dev/null +++ b/src/server/game/Maps/PhaseMgr.h @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef TRINITY_PHASEMGR_H +#define TRINITY_PHASEMGR_H + +#include "SharedDefines.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" + +class ObjectMgr; +class Player; + +// Phasing (visibility) +enum PhasingFlags +{ + PHASE_FLAG_OVERWRITE_EXISTING = 0x01, // don't stack with existing phases, overwrites existing phases + PHASE_FLAG_NO_MORE_PHASES = 0x02, // stop calculating phases after this phase was applied (no more phases will be applied) + PHASE_FLAG_NEGATE_PHASE = 0x04 // negate instead to add the phasemask +}; + +enum PhaseUpdateFlag +{ + PHASE_UPDATE_FLAG_ZONE_UPDATE = 0x01, + PHASE_UPDATE_FLAG_AREA_UPDATE = 0x02, + + // Internal flags + PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED = 0x08, + PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED = 0x10, +}; + +struct PhaseDefinition +{ + uint32 zoneId; + uint32 entry; + uint32 phasemask; + uint32 phaseId; + uint32 terrainswapmap; + uint8 flags; + + bool IsOverwritingExistingPhases() const { return flags & PHASE_FLAG_OVERWRITE_EXISTING; } + bool IsLastDefinition() const { return flags & PHASE_FLAG_NO_MORE_PHASES; } + bool IsNegatingPhasemask() const { return flags & PHASE_FLAG_NEGATE_PHASE; } +}; + +typedef std::list PhaseDefinitionContainer; +typedef UNORDERED_MAP PhaseDefinitionStore; + +struct SpellPhaseInfo +{ + uint32 spellId; + uint32 phasemask; + uint32 terrainswapmap; +}; + +typedef UNORDERED_MAP SpellPhaseStore; + +struct PhaseInfo +{ + PhaseInfo() : phasemask(0), terrainswapmap(0), phaseId(0) {} + + uint32 phasemask; + uint32 terrainswapmap; + uint32 phaseId; + + bool NeedsServerSideUpdate() const { return phasemask; } + bool NeedsClientSideUpdate() const { return terrainswapmap || phaseId; } +}; + +typedef UNORDERED_MAP PhaseInfoContainer; + +struct PhaseData +{ + PhaseData(Player* _player) : player(_player), _PhasemaskThroughDefinitions(0), _PhasemaskThroughAuras(0), _CustomPhasemask(0) {} + + uint32 _PhasemaskThroughDefinitions; + uint32 _PhasemaskThroughAuras; + uint32 _CustomPhasemask; + + uint32 GetCurrentPhasemask() const; + inline uint32 GetPhaseMaskForSpawn() const; + + void ResetDefinitions() { _PhasemaskThroughDefinitions = 0; activePhaseDefinitions.clear(); } + void AddPhaseDefinition(PhaseDefinition const* phaseDefinition); + bool HasActiveDefinitions() const { return !activePhaseDefinitions.empty(); } + + void AddAuraInfo(uint32 const spellId, PhaseInfo phaseInfo); + uint32 RemoveAuraInfo(uint32 const spellId); + + void SendPhaseMaskToPlayer(); + void SendPhaseshiftToPlayer(); + +private: + Player* player; + std::list activePhaseDefinitions; + PhaseInfoContainer spellPhaseInfo; +}; + +struct PhaseUpdateData +{ + void AddConditionType(ConditionTypes const conditionType) { _conditionTypeFlags |= (1 << conditionType); } + void AddQuestUpdate(uint32 const questId); + + bool IsConditionRelated(Condition const* condition) const; + +private: + uint32 _conditionTypeFlags; + uint32 _questId; +}; + +class PhaseMgr +{ +public: + PhaseMgr(Player* _player); + ~PhaseMgr() {} + + uint32 GetCurrentPhasemask() { return phaseData.GetCurrentPhasemask(); }; + inline uint32 GetPhaseMaskForSpawn() { return phaseData.GetCurrentPhasemask(); } + + // Phase definitions update handling + void NotifyConditionChanged(PhaseUpdateData const& updateData); + void NotifyStoresReloaded() { Recalculate(); Update(); } + + void Update(); + + // Aura phase effects + void RegisterPhasingAuraEffect(AuraEffect const* auraEffect); + void UnRegisterPhasingAuraEffect(AuraEffect const* auraEffect); + + // Update flags (delayed phasing) + void AddUpdateFlag(PhaseUpdateFlag const updateFlag) { _UpdateFlags |= updateFlag; } + void RemoveUpdateFlag(PhaseUpdateFlag const updateFlag); + + // Needed for modify phase command + void SetCustomPhase(uint32 const phaseMask); + + // Debug + void SendDebugReportToPlayer(Player* const debugger); + + static bool IsConditionTypeSupported(ConditionTypes const conditionType); + +private: + void Recalculate(); + + inline bool CheckDefinition(PhaseDefinition const* phaseDefinition); + + bool NeedsPhaseUpdateWithData(PhaseUpdateData const updateData) const; + + inline bool IsUpdateInProgress() const { return (_UpdateFlags & PHASE_UPDATE_FLAG_ZONE_UPDATE) || (_UpdateFlags & PHASE_UPDATE_FLAG_AREA_UPDATE); } + + PhaseDefinitionStore const* _PhaseDefinitionStore; + SpellPhaseStore const* _SpellPhaseStore; + + Player* player; + PhaseData phaseData; + uint8 _UpdateFlags; +}; + +#endif diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 5893bbd6564..c55c57481f4 100755 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -174,7 +174,15 @@ enum TrinityStrings LANG_YOU_CHANGE_RUNIC_POWER = 173, LANG_YOURS_RUNIC_POWER_CHANGED = 174, LANG_LIQUID_STATUS = 175, - // Room for more level 1 176-199 not used + + LANG_PHASING_REPORT_STATUS = 176, + LANG_PHASING_NO_DEFINITIONS = 177, // Phasing + LANG_PHASING_SUCCESS = 178, + LANG_PHASING_FAILED = 179, + LANG_PHASING_LAST_PHASE = 180, + LANG_PHASING_LIST = 181, + LANG_PHASING_PHASEMASK = 182, + // Room for more level 1 183-199 not used // level 2 chat LANG_NO_SELECTION = 200, diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5b6af4b2de8..694b2cf2d7f 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1157,7 +1157,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index e6c13557076..5c61385f537 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -253,7 +253,7 @@ class WorldSession void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName); void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res, uint32 val = 0); void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2, 3); - void SendSetPhaseShift(uint32 phaseShift); + void SendSetPhaseShift(std::set const& phaseIds, std::set const& terrainswaps); void SendQueryTimeResponse(); void SendAuthResponse(uint8 code, bool queued, uint32 queuePos = 0); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 28ddaf05afc..d70c68b9be2 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1808,27 +1808,21 @@ void AuraEffect::HandlePhase(AuraApplication const* aurApp, uint8 mode, bool app Unit* target = aurApp->GetTarget(); - // no-phase is also phase state so same code for apply and remove - uint32 newPhase = 0; - Unit::AuraEffectList const& phases = target->GetAuraEffectsByType(SPELL_AURA_PHASE); - if (!phases.empty()) - for (Unit::AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr) - newPhase |= (*itr)->GetMiscValue(); - if (Player* player = target->ToPlayer()) { - if (!newPhase) - newPhase = PHASEMASK_NORMAL; - - // GM-mode have mask 0xFFFFFFFF - if (player->isGameMaster()) - newPhase = 0xFFFFFFFF; - - player->SetPhaseMask(newPhase, false); - player->GetSession()->SendSetPhaseShift(newPhase); + if (apply) + player->GetPhaseMgr().RegisterPhasingAuraEffect(this); + else + player->GetPhaseMgr().UnRegisterPhasingAuraEffect(this); } else { + uint32 newPhase = 0; + Unit::AuraEffectList const& phases = target->GetAuraEffectsByType(SPELL_AURA_PHASE); + if (!phases.empty()) + for (Unit::AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr) + newPhase |= (*itr)->GetMiscValue(); + if (!newPhase) { newPhase = PHASEMASK_NORMAL; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 94961b7b930..371668e73d9 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1368,6 +1368,9 @@ void World::SetInitialWorldSettings() sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Spell Group Stack Rules..."); sSpellMgr->LoadSpellGroupStackRules(); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Spell Phase Dbc Info..."); + sObjectMgr->LoadSpellPhaseInfo(); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading NPC Texts..."); sObjectMgr->LoadGossipText(); @@ -1616,6 +1619,9 @@ void World::SetInitialWorldSettings() sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading World States..."); // must be loaded before battleground, outdoor PvP and conditions LoadWorldStates(); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Phase definitions..."); + sObjectMgr->LoadPhaseDefinitions(); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Conditions..."); sConditionMgr->LoadConditions(); @@ -3022,3 +3028,11 @@ CharacterNameData const* World::GetCharacterNameData(uint32 guid) const else return NULL; } + +void World::UpdatePhaseDefinitions() +{ + SessionMap::const_iterator itr; + for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) + if (itr->second && itr->second->GetPlayer() && itr->second->GetPlayer()->IsInWorld()) + itr->second->GetPlayer()->GetPhaseMgr().NotifyStoresReloaded(); +} diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 33ec159ec81..e1465f4897d 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -784,6 +784,8 @@ class World uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } void ResetEventSeasonalQuests(uint16 event_id); + + void UpdatePhaseDefinitions(); protected: void _UpdateGameTime(); // callback for UpdateRealmCharacters diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 67b4d780942..363258648f6 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -90,6 +90,7 @@ public: { "areatriggers", SEC_ADMINISTRATOR, false, &HandleDebugAreaTriggersCommand, "", NULL }, { "los", SEC_MODERATOR, false, &HandleDebugLoSCommand, "", NULL }, { "moveflags", SEC_ADMINISTRATOR, false, &HandleDebugMoveflagsCommand, "", NULL }, + { "phase", SEC_MODERATOR, false, &HandleDebugPhaseCommand, "", NULL }, { NULL, SEC_PLAYER, false, NULL, "", NULL } }; static ChatCommand commandTable[] = @@ -948,8 +949,21 @@ public: if (!*args) return false; - uint32 PhaseShift = atoi(args); - handler->GetSession()->SendSetPhaseShift(PhaseShift); + char* t = strtok((char*)args, " "); + char* p = strtok(NULL, " "); + + if (!t) + return false; + + std::set terrainswap; + std::set phaseId; + + terrainswap.insert((uint32)atoi(t)); + + if (p) + phaseId.insert((uint32)atoi(p)); + + handler->GetSession()->SendSetPhaseShift(phaseId, terrainswap); return true; } @@ -1330,6 +1344,17 @@ public: handler->PSendSysMessage("Waypoint SQL written to SQL Developer log"); return true; } + + static bool HandleDebugPhaseCommand(ChatHandler* handler, char const* args) + { + Unit* unit = handler->getSelectedUnit(); + Player* player = handler->GetSession()->GetPlayer(); + if(unit && unit->GetTypeId() == TYPEID_PLAYER) + player = unit->ToPlayer(); + + player->GetPhaseMgr().SendDebugReportToPlayer(handler->GetSession()->GetPlayer()); + return true; + } }; void AddSC_debug_commandscript() diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 6803354d29b..fd24e618ef0 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -149,7 +149,7 @@ public: GameObject* object = new GameObject; uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT); - if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY)) + if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMgr().GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY)) { delete object; return false; @@ -162,7 +162,7 @@ public: } // fill the gameobject data and save to the db - object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn()); + object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMgr().GetPhaseMaskForSpawn()); // this will generate a new guid if the object is in an instance if (!object->LoadGameObjectFromDB(guidLow, map)) diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index c370c70a94a..932a0cbc634 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1277,14 +1277,15 @@ public: uint32 phasemask = (uint32)atoi((char*)args); Unit* target = handler->getSelectedUnit(); - if (!target) - target = handler->GetSession()->GetPlayer(); - - // check online security - else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0)) - return false; - - target->SetPhaseMask(phasemask, true); + if (target) + { + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->GetPhaseMgr().SetCustomPhase(phasemask); + else + target->SetPhaseMask(phasemask, true); + } + else + handler->GetSession()->GetPlayer()->GetPhaseMgr().SetCustomPhase(phasemask); return true; } diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index e43760191df..30713728cf6 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -151,13 +151,13 @@ public: } Creature* creature = new Creature(); - if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o)) + if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o)) { delete creature; return false; } - creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn()); uint32 db_guid = creature->GetDBTableGUIDLow(); diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index ce0141290ff..14481884ec8 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -115,6 +115,7 @@ public: { "npc_trainer", SEC_ADMINISTRATOR, true, &HandleReloadNpcTrainerCommand, "", NULL }, { "npc_vendor", SEC_ADMINISTRATOR, true, &HandleReloadNpcVendorCommand, "", NULL }, { "page_text", SEC_ADMINISTRATOR, true, &HandleReloadPageTextsCommand, "", NULL }, + { "phasedefinitions", SEC_ADMINISTRATOR, true, &HandleReloadPhaseDefinitionsCommand, "", NULL }, { "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesPickpocketingCommand, "", NULL}, { "points_of_interest", SEC_ADMINISTRATOR, true, &HandleReloadPointsOfInterestCommand, "", NULL }, { "prospecting_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesProspectingCommand, "", NULL }, @@ -1250,6 +1251,15 @@ public: handler->SendGlobalGMSysMessage("Vehicle template accessories reloaded."); return true; } + + static bool HandleReloadPhaseDefinitionsCommand(ChatHandler* handler, const char* /*args*/) + { + sLog->outInfo(LOG_FILTER_GENERAL, "Reloading phase_definitions table..."); + sObjectMgr->LoadPhaseDefinitions(); + sWorld->UpdatePhaseDefinitions(); + handler->SendGlobalGMSysMessage("Phase Definitions reloaded."); + return true; + } }; void AddSC_reload_commandscript() diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index e3cd185e4a3..05226fb55aa 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -688,7 +688,7 @@ public: } // re-create Creature* wpCreature2 = new Creature; - if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) + if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); delete wpCreature2; @@ -696,7 +696,7 @@ public: return false; } - wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); //TODO: Should we first use "Create" then use "LoadFromDB"? if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map)) @@ -912,7 +912,7 @@ public: float o = chr->GetOrientation(); Creature* wpCreature = new Creature; - if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) + if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); delete wpCreature; @@ -928,7 +928,7 @@ public: WorldDatabase.Execute(stmt); - wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); if (!wpCreature->LoadCreatureFromDB(wpCreature->GetDBTableGUIDLow(), map)) { @@ -976,14 +976,14 @@ public: Map* map = chr->GetMap(); Creature* creature = new Creature; - if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) + if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); delete creature; return false; } - creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn()); if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map)) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); @@ -1025,14 +1025,14 @@ public: Map* map = chr->GetMap(); Creature* creature = new Creature; - if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) + if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) { handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); delete creature; return false; } - creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn()); if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map)) { handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); -- cgit v1.2.3 From fe55f735c12ad2a372dac24c636f3362a20d9eff Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 15 Oct 2012 14:27:56 -0500 Subject: Scripts/Spells: Updated some more spells to 4.3.4 --- .../2012_10_15_01_world_spell_script_names.sql | 2 + src/server/scripts/Commands/cs_modify.cpp | 2 +- src/server/scripts/Spells/spell_shaman.cpp | 43 +++++----------------- src/server/scripts/Spells/spell_warlock.cpp | 1 + 4 files changed, 14 insertions(+), 34 deletions(-) create mode 100644 sql/updates/world/2012_10_15_01_world_spell_script_names.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_10_15_01_world_spell_script_names.sql b/sql/updates/world/2012_10_15_01_world_spell_script_names.sql new file mode 100644 index 00000000000..c3390573bc2 --- /dev/null +++ b/sql/updates/world/2012_10_15_01_world_spell_script_names.sql @@ -0,0 +1,2 @@ +UPDATE `spell_script_names` SET `spell_id`=755 WHERE `spell_id`=-755; +UPDATE `spell_script_names` SET `spell_id`=1535 WHERE `spell_id`=-1535; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 932a0cbc634..9f13dd00fb8 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1047,7 +1047,7 @@ public: target->ModifyMoney(moneyToAdd); } - sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), uint32(targetMoney), nt32(moneyToAdd), uint32(target->GetMoney())); + sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(target->GetMoney())); return true; } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 23f09a88911..8e8d0a89cde 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -31,7 +31,7 @@ enum ShamanSpells { SHAMAN_SPELL_GLYPH_OF_MANA_TIDE = 55441, SHAMAN_SPELL_MANA_TIDE_TOTEM = 39609, - SHAMAN_SPELL_FIRE_NOVA_R1 = 1535, + SHAMAN_SPELL_FLAME_SHOCK = 8050, SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349, SHAMAN_SPELL_SATED = 57724, SHAMAN_SPELL_EXHAUSTION = 57723, @@ -53,6 +53,7 @@ enum ShamanSpells }; // 51474 - Astral shift +/// Updated 4.3.4 class spell_sha_astral_shift : public SpellScriptLoader { public: @@ -76,10 +77,10 @@ class spell_sha_astral_shift : public SpellScriptLoader amount = -1; } - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) { // reduces all damage taken while stun, fear or silence - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || ((GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<GetSpellInfo(SHAMAN_SPELL_FIRE_NOVA_R1) || sSpellMgr->GetFirstSpellInChain(SHAMAN_SPELL_FIRE_NOVA_R1) != sSpellMgr->GetFirstSpellInChain(spellEntry->Id)) - return false; - - uint8 rank = sSpellMgr->GetSpellRank(spellEntry->Id); - if (!sSpellMgr->GetSpellWithRank(SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, rank, true)) - return false; - return true; - } - - SpellCastResult CheckFireTotem() - { - // fire totem - if (!GetCaster()->m_SummonSlot[1]) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; - } - void HandleDummy(SpellEffIndex /*effIndex*/) { - if (Unit* caster = GetCaster()) + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) { - uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id); - if (uint32 spellId = sSpellMgr->GetSpellWithRank(SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, rank)) + if (target->HasAura(SHAMAN_SPELL_FLAME_SHOCK)) { - Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1]); - if (totem && totem->isTotem()) - caster->CastSpell(totem, spellId, true); + caster->CastSpell(target, SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, true); + target->RemoveAurasDueToSpell(SHAMAN_SPELL_FLAME_SHOCK); } } } void Register() { - OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem); OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 6bfa2419fdd..42296154634 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -654,6 +654,7 @@ class spell_warl_bane_of_doom : public SpellScriptLoader }; // 755 Health Funnel +/// Updated 4.3.4 class spell_warl_health_funnel : public SpellScriptLoader { public: -- cgit v1.2.3 From fc796fb879fcf399b7e05636e2876c53b261f8f2 Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 15 Oct 2012 18:01:16 -0500 Subject: Scripts/Spells: Deleted a deprecated SpellScript (Astral Shift) --- .../2012_10_15_02_world_spell_script_names_434.sql | 1 + src/server/scripts/Spells/spell_shaman.cpp | 46 ---------------------- 2 files changed, 1 insertion(+), 46 deletions(-) create mode 100644 sql/updates/world/2012_10_15_02_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_10_15_02_world_spell_script_names_434.sql b/sql/updates/world/2012_10_15_02_world_spell_script_names_434.sql new file mode 100644 index 00000000000..d0876fa3cc6 --- /dev/null +++ b/sql/updates/world/2012_10_15_02_world_spell_script_names_434.sql @@ -0,0 +1 @@ +DELETE FROM `spell_script_names` WHERE `scriptname`='spell_sha_astral_shift'; diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 8e8d0a89cde..8b1fe6f38ba 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -52,51 +52,6 @@ enum ShamanSpells SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 64694, }; -// 51474 - Astral shift -/// Updated 4.3.4 -class spell_sha_astral_shift : public SpellScriptLoader -{ - public: - spell_sha_astral_shift() : SpellScriptLoader("spell_sha_astral_shift") { } - - class spell_sha_astral_shift_AuraScript : public AuraScript - { - PrepareAuraScript(spell_sha_astral_shift_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - // reduces all damage taken while stun, fear or silence - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || ((GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1< Date: Tue, 16 Oct 2012 09:35:15 +0200 Subject: Fix compile without pch --- src/server/game/Achievements/AchievementMgr.cpp | 3 +-- src/server/game/Battlefield/Zones/BattlefieldWG.cpp | 2 +- src/server/game/Chat/ChatLink.cpp | 2 +- src/server/game/Conditions/ConditionMgr.cpp | 4 ++-- src/server/game/Conditions/ConditionMgr.h | 1 - src/server/game/Conditions/DisableMgr.cpp | 2 +- src/server/game/Globals/ObjectMgr.cpp | 6 +++--- src/server/game/Guilds/GuildMgr.cpp | 2 +- src/server/game/Handlers/AuctionHouseHandler.cpp | 10 ++++++++-- src/server/game/Handlers/BattleGroundHandler.cpp | 2 +- src/server/game/Handlers/ItemHandler.cpp | 4 ++-- src/server/game/Loot/LootMgr.h | 1 - src/server/game/Maps/PhaseMgr.cpp | 1 + src/server/game/Maps/PhaseMgr.h | 3 ++- src/server/game/Spells/SpellInfo.cpp | 2 +- src/server/game/Spells/SpellScript.h | 2 +- src/server/game/Tools/CharacterDatabaseCleaner.cpp | 3 ++- src/server/scripts/Commands/cs_achievement.cpp | 2 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- src/server/scripts/Commands/cs_disable.cpp | 2 +- src/server/scripts/Commands/cs_wp.cpp | 2 +- src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp | 2 +- .../Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp | 4 ++-- src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp | 2 +- src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp | 2 +- .../scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp | 2 +- src/server/scripts/World/npcs_special.cpp | 2 +- 27 files changed, 39 insertions(+), 33 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 0fe66c94534..7830ea3f7f8 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1423,7 +1423,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_UNK148: case ACHIEVEMENT_CRITERIA_TYPE_UNK149: case ACHIEVEMENT_CRITERIA_TYPE_UNK150: - case ACHIEVEMENT_CRITERIA_TYPE_TOTAL: break; // Not implemented yet :( } @@ -3356,5 +3355,5 @@ AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementI AchievementCriteriaEntry const* AchievementGlobalMgr::GetAchievementCriteria(uint32 criteriaId) const { - return sAchievementCriteriaStore.LookupEntry(criteriaId); + return sAchievementMgr->GetAchievementCriteria(criteriaId); } diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index 59dc6761583..4468660006e 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -427,7 +427,7 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer) // ******************************************************* void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 /*incrementNumber*/) { - AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievement); + AchievementEntry const* achievementEntry = sAchievementMgr->GetAchievement(achievement); if (!achievementEntry) return; diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 6860426c3eb..7d5078a751e 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -335,7 +335,7 @@ bool AchievementChatLink::Initialize(std::istringstream& iss) return false; } // Validate achievement - _achievement = sAchievementStore.LookupEntry(achievementId); + _achievement = sAchievementMgr->GetAchievement(achievementId); if (!_achievement) { sLog->outDebug(LOG_FILTER_CHATSYS, "ChatHandler::isValidChatMessage('%s'): got invalid achivement id %u in |achievement command", iss.str().c_str(), achievementId); diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 406fb7cb753..b7eea9f0b7e 100755 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -698,7 +698,7 @@ ConditionList ConditionMgr::GetConditionsForPhaseDefinition(uint32 zone, uint32 if (i != (*itr).second.end()) { cond = (*i).second; - sLog->outDebug(LOG_FILTER_CONDITIONSYS, "GetConditionsForPhaseDefinition: found conditions for zone %u entry %u spell %u", zone, entry); + sLog->outDebug(LOG_FILTER_CONDITIONSYS, "GetConditionsForPhaseDefinition: found conditions for zone %u entry %u", zone, entry); } } @@ -1595,7 +1595,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) } case CONDITION_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1); + AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1); if (!achievement) { sLog->outError(LOG_FILTER_SQL, "Achivement condition has non existing achivement id (%u), skipped", cond->ConditionValue1); diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index fe7f6a18af8..9d14bde1586 100755 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -19,7 +19,6 @@ #ifndef TRINITY_CONDITIONMGR_H #define TRINITY_CONDITIONMGR_H -#include "LootMgr.h" #include class Player; diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 9b065729b88..cf5b7bd53a2 100755 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -171,7 +171,7 @@ void LoadDisables() sLog->outError(LOG_FILTER_SQL, "Disable flags specified for outdoor PvP %u, useless data.", entry); break; case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: - if (!sAchievementCriteriaStore.LookupEntry(entry)) + if (!sAchievementMgr->GetAchievementCriteria(entry)) { sLog->outError(LOG_FILTER_SQL, "Achievement Criteria entry %u from `disables` doesn't exist in dbc, skipped.", entry); continue; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index dd2afa44a07..d62a4c9b9fb 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -5920,7 +5920,7 @@ void ObjectMgr::LoadAccessRequirements() if (ar.achievement) { - if (!sAchievementStore.LookupEntry(ar.achievement)) + if (!sAchievementMgr->GetAchievement(ar.achievement)) { sLog->outError(LOG_FILTER_SQL, "Required Achievement %u not exist for map %u difficulty %u, remove quest done requirement.", ar.achievement, mapid, difficulty); ar.achievement = 0; @@ -8487,9 +8487,9 @@ void ObjectMgr::LoadFactionChangeAchievements() uint32 alliance = fields[0].GetUInt32(); uint32 horde = fields[1].GetUInt32(); - if (!sAchievementStore.LookupEntry(alliance)) + if (!sAchievementMgr->GetAchievement(alliance)) sLog->outError(LOG_FILTER_SQL, "Achievement %u referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance); - else if (!sAchievementStore.LookupEntry(horde)) + else if (!sAchievementMgr->GetAchievement(horde)) sLog->outError(LOG_FILTER_SQL, "Achievement %u referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde); else FactionChange_Achievements[alliance] = horde; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 8eef6b2ade3..0f421c7c432 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -547,7 +547,7 @@ void GuildMgr::LoadGuildRewards() continue; } - if (reward.AchievementId != 0 && (!sAchievementStore.LookupEntry(reward.AchievementId))) + if (reward.AchievementId != 0 && (!sAchievementMgr->GetAchievement(reward.AchievementId))) { sLog->outError(LOG_FILTER_SERVER_LOADING, "Guild rewards constains not existing achievement entry %u", reward.AchievementId); continue; diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 3e2d0e1310a..53cf3fe7caf 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -286,7 +286,10 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recvData) AH->deposit = deposit; AH->auctionHouseEntry = auctionHouseEntry; - sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) to auctioneer %u with count %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", _player->GetName(), _player->GetGUIDLow(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetGUIDLow(), AH->auctioneer, item->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); + sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) " + "to auctioneer %u with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u", + _player->GetName(), _player->GetGUIDLow(), item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetGUIDLow(), + AH->auctioneer, item->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); sAuctionMgr->AddAItem(item); auctionHouse->AddAuction(AH); @@ -332,7 +335,10 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recvData) AH->deposit = deposit; AH->auctionHouseEntry = auctionHouseEntry; - sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) to auctioneer %u with count %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", _player->GetName(), _player->GetGUIDLow(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), newItem->GetGUIDLow(), AH->auctioneer, newItem->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); + sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) to " + "auctioneer %u with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u", + _player->GetName(), _player->GetGUIDLow(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), + newItem->GetGUIDLow(), AH->auctioneer, newItem->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); sAuctionMgr->AddAItem(newItem); auctionHouse->AddAuction(AH); diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 17d65264e9e..62ab55f70f8 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -571,7 +571,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) } } -void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& recvData) +void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& /*recvData*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_BATTLEFIELD_LEAVE Message"); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 69d9d24db8c..3d7de576c6c 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1476,7 +1476,7 @@ void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) // Read data uint32 count = recvData.ReadBits(22); - if (count < EQUIPMENT_SLOT_START || count >= EQUIPMENT_SLOT_END) + if (count >= EQUIPMENT_SLOT_END) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) sent a wrong count (%u) when transmogrifying items.", player->GetGUIDLow(), player->GetName(), count); recvData.rfinish(); @@ -1548,7 +1548,7 @@ void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) for (uint8 i = 0; i < count; ++i) { // slot of the transmogrified item - if (slots[i] < EQUIPMENT_SLOT_START || slots[i] >= EQUIPMENT_SLOT_END) + if (slots[i] >= EQUIPMENT_SLOT_END) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify an item (lowguid: %u) with a wrong slot (%u) when transmogrifying items.", player->GetGUIDLow(), player->GetName(), GUID_LOPART(itemGuids[i]), slots[i]); return; diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index 45fc5c7983c..72243cd98f6 100755 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -99,7 +99,6 @@ enum LootSlotType class Player; class LootStore; -class ConditionMgr; struct LootStoreItem { diff --git a/src/server/game/Maps/PhaseMgr.cpp b/src/server/game/Maps/PhaseMgr.cpp index 63bdff2d094..5e0989c1cad 100644 --- a/src/server/game/Maps/PhaseMgr.cpp +++ b/src/server/game/Maps/PhaseMgr.cpp @@ -17,6 +17,7 @@ #include "PhaseMgr.h" #include "Chat.h" +#include "ObjectMgr.h" ////////////////////////////////////////////////////////////////// // Updating diff --git a/src/server/game/Maps/PhaseMgr.h b/src/server/game/Maps/PhaseMgr.h index accb0cd3ea8..2fdf8eb5e7f 100644 --- a/src/server/game/Maps/PhaseMgr.h +++ b/src/server/game/Maps/PhaseMgr.h @@ -21,6 +21,7 @@ #include "SharedDefines.h" #include "SpellAuras.h" #include "SpellAuraEffects.h" +#include "ConditionMgr.h" class ObjectMgr; class Player; @@ -85,7 +86,7 @@ typedef UNORDERED_MAP PhaseInfoContainer; struct PhaseData { - PhaseData(Player* _player) : player(_player), _PhasemaskThroughDefinitions(0), _PhasemaskThroughAuras(0), _CustomPhasemask(0) {} + PhaseData(Player* _player) : _PhasemaskThroughDefinitions(0), _PhasemaskThroughAuras(0), _CustomPhasemask(0), player(_player) {} uint32 _PhasemaskThroughDefinitions; uint32 _PhasemaskThroughAuras; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 3dc095a8611..f99321a0396 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -317,7 +317,7 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 110 TARGET_DEST_UNK_110 }; -SpellEffectInfo::SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) +SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) { SpellScalingEntry const* scaling = spellInfo->GetSpellScaling(); diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index c8126f8aaf3..b1a2097a8f9 100755 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -586,7 +586,7 @@ class AuraScript : public _SpellScript uint8 _currentScriptState; bool _defaultActionPrevented; ScriptStateStore(uint8 currentScriptState, AuraApplication const* auraApplication, bool defaultActionPrevented) - : _currentScriptState(currentScriptState), _auraApplication(auraApplication), _defaultActionPrevented(defaultActionPrevented) + : _auraApplication(auraApplication), _currentScriptState(currentScriptState), _defaultActionPrevented(defaultActionPrevented) {} }; typedef std::stack ScriptStateStack; diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index f87b81c8be8..8c86b80e827 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -22,6 +22,7 @@ #include "Database/DatabaseEnv.h" #include "SpellMgr.h" #include "DBCStores.h" +#include "AchievementMgr.h" void CharacterDatabaseCleaner::CleanDatabase() { @@ -108,7 +109,7 @@ void CharacterDatabaseCleaner::CheckUnique(const char* column, const char* table bool CharacterDatabaseCleaner::AchievementProgressCheck(uint32 criteria) { - return sAchievementCriteriaStore.LookupEntry(criteria); + return sAchievementMgr->GetAchievementCriteria(criteria); } void CharacterDatabaseCleaner::CleanCharacterAchievementProgress() diff --git a/src/server/scripts/Commands/cs_achievement.cpp b/src/server/scripts/Commands/cs_achievement.cpp index 7667e79ece7..a5dacc7bb00 100644 --- a/src/server/scripts/Commands/cs_achievement.cpp +++ b/src/server/scripts/Commands/cs_achievement.cpp @@ -67,7 +67,7 @@ public: return false; } - if (AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievementId)) + if (AchievementEntry const* achievementEntry = sAchievementMgr->GetAchievement(achievementId)) target->CompletedAchievement(achievementEntry); return true; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 363258648f6..6c5abfe60e6 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1345,7 +1345,7 @@ public: return true; } - static bool HandleDebugPhaseCommand(ChatHandler* handler, char const* args) + static bool HandleDebugPhaseCommand(ChatHandler* handler, char const* /*args*/) { Unit* unit = handler->getSelectedUnit(); Player* player = handler->GetSession()->GetPlayer(); diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index 0bb376b08dd..00214ed4b0f 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -137,7 +137,7 @@ public: } case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: { - if (!sAchievementCriteriaStore.LookupEntry(entry)) + if (!sAchievementMgr->GetAchievementCriteria(entry)) { handler->PSendSysMessage(LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index 05226fb55aa..5bc84bed28a 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -941,7 +941,7 @@ public: { wpCreature->SetDisplayId(target->GetDisplayId()); wpCreature->SetObjectScale(0.5f); - wpCreature->SetLevel(point > STRONG_MAX_LEVEL ? STRONG_MAX_LEVEL : point); + wpCreature->SetLevel(std::min(point, STRONG_MAX_LEVEL)); } } while (result->NextRow()); diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index 0d4efac4321..aa7dfb4a864 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -317,7 +317,7 @@ public: eventTimer = 3000; if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX))) { - AchievementEntry const* AchievWC = sAchievementStore.LookupEntry(ACHIEVEMENT_WAILING_CAVERNS); + AchievementEntry const* AchievWC = sAchievementMgr->GetAchievement(ACHIEVEMENT_WAILING_CAVERNS); if (AchievWC) { Map* map = me->GetMap(); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 497ce889c62..ddecc62ab08 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -695,7 +695,7 @@ class npc_halion_controller : public CreatureScript halion->AI()->Talk(SAY_INTRO); break; case EVENT_TWILIGHT_MENDING: - if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HALION))) + if (ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HALION))) if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_TWILIGHT_HALION))) twilightHalion->CastSpell((Unit*)NULL, SPELL_TWILIGHT_MENDING, true); break; @@ -1114,7 +1114,7 @@ class npc_combustion_consumption : public CreatureScript struct npc_combustion_consumptionAI : public Scripted_NoMovementAI { npc_combustion_consumptionAI(Creature* creature) : Scripted_NoMovementAI(creature), - _summonerGuid(0), _instance(creature->GetInstanceScript()) + _instance(creature->GetInstanceScript()), _summonerGuid(0) { switch (me->GetEntry()) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index a2acf8a64da..9822146984f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -154,7 +154,7 @@ public: CheckPlayersFrostResist(); if (CanTheHundredClub) { - AchievementEntry const* AchievTheHundredClub = sAchievementStore.LookupEntry(ACHIEVEMENT_THE_HUNDRED_CLUB); + AchievementEntry const* AchievTheHundredClub = sAchievementMgr->GetAchievement(ACHIEVEMENT_THE_HUNDRED_CLUB); if (AchievTheHundredClub) { if (map && map->IsDungeon()) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 39fff139b52..28595571a2f 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -232,7 +232,7 @@ public: { npc_verdisa_beglaristrasz_eternosAI(Creature* creature) : ScriptedAI(creature) { } - void MovementInform(uint32 type, uint32 id) + void MovementInform(uint32 /*type*/, uint32 id) { // When Belgaristraz finish his moving say grateful text if (me->GetEntry() == NPC_BELGARISTRASZ) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index fe41e7a12dc..707ea7f138d 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -153,7 +153,7 @@ public: if (IsHeroic() && GolemsShattered < 5) { - AchievementEntry const* AchievShatterResistant = sAchievementStore.LookupEntry(ACHIEVEMENT_SHATTER_RESISTANT); + AchievementEntry const* AchievShatterResistant = sAchievementMgr->GetAchievement(ACHIEVEMENT_SHATTER_RESISTANT); if (AchievShatterResistant) { Map* map = me->GetMap(); diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index f689d2f29ac..f7363f2fb0a 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2115,7 +2115,7 @@ class npc_shadowfiend : public CreatureScript { npc_shadowfiendAI(Creature* creature) : PetAI(creature) {} - void JustDied(Unit* killer) + void JustDied(Unit* /*killer*/) { if (me->isSummon()) if (Unit* owner = me->ToTempSummon()->GetSummoner()) -- cgit v1.2.3 From 67118c6999cc7241520274d1b852386f1490f05e Mon Sep 17 00:00:00 2001 From: Spp Date: Tue, 16 Oct 2012 18:43:21 +0200 Subject: Fix compile under windows --- src/server/scripts/Commands/cs_modify.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 9f13dd00fb8..5c9280e5956 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1026,12 +1026,13 @@ public: } else { + uint32 moneyToAddMsg = moneyToAdd * -1; if (newmoney > MAX_MONEY_AMOUNT) newmoney = MAX_MONEY_AMOUNT; - handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, uint32(abs(moneyToAdd)), handler->GetNameLink(target).c_str()); + handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, moneyToAddMsg, handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), uint32(abs(moneyToAdd))); + (ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), moneyToAddMsg); target->SetMoney(newmoney); } } -- cgit v1.2.3 From 2356e936a4730dddc32c3893722cdf0c0aa2138a Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 17 Oct 2012 15:04:51 -0500 Subject: Scripts/Spells: Updated some Shaman SpellScripts to 4.3.4 --- src/server/scripts/Spells/spell_shaman.cpp | 240 ++++++----------------------- 1 file changed, 46 insertions(+), 194 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 8b1fe6f38ba..d09289d59ab 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -29,8 +29,6 @@ enum ShamanSpells { - SHAMAN_SPELL_GLYPH_OF_MANA_TIDE = 55441, - SHAMAN_SPELL_MANA_TIDE_TOTEM = 39609, SHAMAN_SPELL_FLAME_SHOCK = 8050, SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349, SHAMAN_SPELL_SATED = 57724, @@ -38,7 +36,7 @@ enum ShamanSpells HUNTER_SPELL_INSANITY = 95809, MAGE_SPELL_TEMPORAL_DISPLACEMENT = 80354, - SHAMAN_SPELL_STORM_EARTH_AND_FIRE = 51483, + SHAMAN_SPELL_EARTH_GRASP = 51483, EARTHBIND_TOTEM_SPELL_EARTHGRAB = 64695, // For Earthen Power @@ -49,7 +47,11 @@ enum ShamanSpells ICON_ID_SHAMAN_LAVA_FLOW = 3087, SHAMAN_LAVA_FLOWS_R1 = 51480, - SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 64694, + SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264, + SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC = 52752, + + ICON_ID_SOOTHING_RAIN = 2011, + SPELL_HEALING_STREAM_TOTEM_HEAL = 52042, }; // 1535 Fire Nova @@ -88,55 +90,38 @@ class spell_sha_fire_nova : public SpellScriptLoader } }; -// 39610 Mana Tide Totem -class spell_sha_mana_tide_totem : public SpellScriptLoader +// 16191 Mana Tide +/// Updated 4.3.4 +class spell_sha_mana_tide : public SpellScriptLoader { public: - spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { } + spell_sha_mana_tide() : SpellScriptLoader("spell_sha_mana_tide") { } - class spell_sha_mana_tide_totem_SpellScript : public SpellScript + class spell_sha_mana_tide_AuraScript : public AuraScript { - PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SHAMAN_SPELL_MANA_TIDE_TOTEM)) - return false; - return true; - } + PrepareAuraScript(spell_sha_mana_tide_AuraScript); - void HandleDummy(SpellEffIndex /*effIndex*/) + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { if (Unit* caster = GetCaster()) - if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->getPowerType() == POWER_MANA) - { - int32 effValue = GetEffectValue(); - // Glyph of Mana Tide - if (Unit* owner = caster->GetOwner()) - if (AuraEffect* dummy = owner->GetAuraEffect(SHAMAN_SPELL_GLYPH_OF_MANA_TIDE, 0)) - effValue += dummy->GetAmount(); - // Regenerate 6% of Total Mana Every 3 secs - int32 effBasePoints0 = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), effValue)); - caster->CastCustomSpell(unitTarget, SHAMAN_SPELL_MANA_TIDE_TOTEM, &effBasePoints0, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID()); - } - } + if (Unit* owner = caster->GetOwner()) + amount = CalculatePct(owner->GetCreateStat(STAT_SPIRIT), aurEff->GetAmount()); } void Register() { - OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_mana_tide_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_STAT); } }; - SpellScript* GetSpellScript() const + AuraScript* GetAuraScript() const { - return new spell_sha_mana_tide_totem_SpellScript(); + return new spell_sha_mana_tide_AuraScript(); } }; -// 6474 - Earthbind Totem - Fix Talent:Earthen Power +// 6474 - Earthbind Totem - Fix Talent:Earthen Power, Earth's Grasp +/// Updated 4.3.4 class spell_sha_earthbind_totem : public SpellScriptLoader { public: @@ -170,8 +155,8 @@ class spell_sha_earthbind_totem : public SpellScriptLoader Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); if (!owner) return; - // Storm, Earth and Fire - if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_STORM_EARTH_AND_FIRE, EFFECT_1)) + // Earth's Grasp + if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_EARTH_GRASP, EFFECT_0)) { if (roll_chance_i(aurEff->GetAmount())) GetCaster()->CastSpell(GetCaster(), EARTHBIND_TOTEM_SPELL_EARTHGRAB, false); @@ -234,6 +219,7 @@ class spell_sha_earthen_power : public SpellScriptLoader } }; +/// Updated 4.3.4 class spell_sha_bloodlust : public SpellScriptLoader { public: @@ -278,6 +264,7 @@ class spell_sha_bloodlust : public SpellScriptLoader } }; +/// Updated 4.3.4 class spell_sha_heroism : public SpellScriptLoader { public: @@ -322,11 +309,7 @@ class spell_sha_heroism : public SpellScriptLoader } }; -enum AncestralAwakeningProc -{ - SPELL_ANCESTRAL_AWAKENING_PROC = 52752, -}; - +/// Updated 4.3.4 class spell_sha_ancestral_awakening_proc : public SpellScriptLoader { public: @@ -338,7 +321,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader bool Validate(SpellInfo const* /*SpellEntry*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_ANCESTRAL_AWAKENING_PROC)) + if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC)) return false; return true; } @@ -347,7 +330,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader { int32 damage = GetEffectValue(); if (GetCaster() && GetHitUnit()) - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true); + GetCaster()->CastCustomSpell(GetHitUnit(), SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true); } void Register() @@ -362,53 +345,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader } }; -enum CleansingTotemPulse -{ - SPELL_CLEANSING_TOTEM_EFFECT = 52025, -}; - -class spell_sha_cleansing_totem_pulse : public SpellScriptLoader -{ - public: - spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { } - - class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript - { - PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript); - - bool Validate(SpellInfo const* /*SpellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CLEANSING_TOTEM_EFFECT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - int32 bp = 1; - if (GetCaster() && GetHitUnit() && GetOriginalCaster()) - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_cleansing_totem_pulse_SpellScript(); - } -}; - -enum HealingStreamTotem -{ - SPELL_GLYPH_OF_HEALING_STREAM_TOTEM = 55456, - ICON_ID_RESTORATIVE_TOTEMS = 338, - SPELL_HEALING_STREAM_TOTEM_HEAL = 52042, -}; - +/// Updated 4.3.4 class spell_sha_healing_stream_totem : public SpellScriptLoader { public: @@ -420,9 +357,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader bool Validate(SpellInfo const* /*SpellEntry*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_HEALING_STREAM_TOTEM_HEAL)) - return false; - return true; + return sSpellMgr->GetSpellInfo(SPELL_HEALING_STREAM_TOTEM_HEAL); } void HandleDummy(SpellEffIndex /* effIndex */) @@ -437,14 +372,10 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader if (triggeringSpell) damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL)); - // Restorative Totems - if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, ICON_ID_RESTORATIVE_TOTEMS, 1)) + // Soothing Rains + if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, ICON_ID_SOOTHING_RAIN, EFFECT_0)) AddPct(damage, dummy->GetAmount()); - // Glyph of Healing Stream Totem - if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0)) - AddPct(damage, aurEff->GetAmount()); - damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL)); } caster->CastCustomSpell(target, SPELL_HEALING_STREAM_TOTEM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); @@ -463,49 +394,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader } }; -enum ManaSpringTotem -{ - SPELL_MANA_SPRING_TOTEM_ENERGIZE = 52032, -}; - -class spell_sha_mana_spring_totem : public SpellScriptLoader -{ - public: - spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { } - - class spell_sha_mana_spring_totem_SpellScript : public SpellScript - { - PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript); - - bool Validate(SpellInfo const* /*SpellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MANA_SPRING_TOTEM_ENERGIZE)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - int32 damage = GetEffectValue(); - if (Unit* target = GetHitUnit()) - if (Unit* caster = GetCaster()) - if (target->getPowerType() == POWER_MANA) - caster->CastCustomSpell(target, SPELL_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_mana_spring_totem_SpellScript(); - } -}; - +/// Updated 4.3.4 class spell_sha_lava_lash : public SpellScriptLoader { public: @@ -550,6 +439,7 @@ class spell_sha_lava_lash : public SpellScriptLoader }; // 1064 Chain Heal +/// Updated 4.3.4 class spell_sha_chain_heal : public SpellScriptLoader { public: @@ -563,6 +453,7 @@ class spell_sha_chain_heal : public SpellScriptLoader { firstHeal = true; riptide = false; + amount = 0; return true; } @@ -574,6 +465,7 @@ class spell_sha_chain_heal : public SpellScriptLoader if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID())) { riptide = true; + amount = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue(); // Consume it GetHitUnit()->RemoveAura(aurEff->GetBase()); } @@ -581,7 +473,10 @@ class spell_sha_chain_heal : public SpellScriptLoader } // Riptide increases the Chain Heal effect by 25% if (riptide) - SetHitHeal(GetHitHeal() * 1.25f); + { + uint32 bonus = CalculatePct(GetHitHeal(), amount); + SetHitHeal(GetHitHeal() + bonus); + } } void Register() @@ -591,6 +486,7 @@ class spell_sha_chain_heal : public SpellScriptLoader bool firstHeal; bool riptide; + uint32 amount; }; SpellScript* GetSpellScript() const @@ -599,6 +495,7 @@ class spell_sha_chain_heal : public SpellScriptLoader } }; +/// Updated 4.3.4 class spell_sha_flame_shock : public SpellScriptLoader { public: @@ -620,15 +517,17 @@ class spell_sha_flame_shock : public SpellScriptLoader void HandleDispel(DispelInfo* /*dispelInfo*/) { if (Unit* caster = GetCaster()) + { // Lava Flows if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0)) { if (sSpellMgr->GetFirstSpellInChain(SHAMAN_LAVA_FLOWS_R1) != sSpellMgr->GetFirstSpellInChain(aurEff->GetId())) return; - uint8 rank = sSpellMgr->GetSpellRank(aurEff->GetId()); - caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true); + uint32 basepoints = aurEff->GetAmount(); + caster->CastCustomSpell(caster, SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true); } + } } void Register() @@ -643,64 +542,17 @@ class spell_sha_flame_shock : public SpellScriptLoader } }; -class spell_sha_sentry_totem : public SpellScriptLoader -{ - public: - spell_sha_sentry_totem() : SpellScriptLoader("spell_sha_sentry_totem") { } - - class spell_sha_sentry_totem_AuraScript : public AuraScript - { - PrepareAuraScript(spell_sha_sentry_totem_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SHAMAN_BIND_SIGHT)) - return false; - return true; - } - - void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[4])) - if (totem->isTotem()) - caster->CastSpell(totem, SHAMAN_BIND_SIGHT, true); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (caster->GetTypeId() == TYPEID_PLAYER) - caster->ToPlayer()->StopCastingBindSight(); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_sha_sentry_totem_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_sha_sentry_totem_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_sentry_totem_AuraScript(); - } -}; - void AddSC_shaman_spell_scripts() { new spell_sha_fire_nova(); - new spell_sha_mana_tide_totem(); + new spell_sha_mana_tide(); new spell_sha_earthbind_totem(); new spell_sha_earthen_power(); new spell_sha_bloodlust(); new spell_sha_heroism(); new spell_sha_ancestral_awakening_proc(); - new spell_sha_cleansing_totem_pulse(); new spell_sha_healing_stream_totem(); - new spell_sha_mana_spring_totem(); new spell_sha_lava_lash(); new spell_sha_chain_heal(); new spell_sha_flame_shock(); - new spell_sha_sentry_totem(); } -- cgit v1.2.3 From f8feb1ec0ed5964bd8e5049dc3263f87c785b599 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 17 Oct 2012 17:35:50 -0500 Subject: Core/Scripts: Fixed build --- src/server/scripts/Spells/spell_shaman.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index d09289d59ab..e776fc87a5e 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -524,7 +524,7 @@ class spell_sha_flame_shock : public SpellScriptLoader if (sSpellMgr->GetFirstSpellInChain(SHAMAN_LAVA_FLOWS_R1) != sSpellMgr->GetFirstSpellInChain(aurEff->GetId())) return; - uint32 basepoints = aurEff->GetAmount(); + int32 basepoints = aurEff->GetAmount(); caster->CastCustomSpell(caster, SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true); } } -- cgit v1.2.3 From 77a8d6f127b0fd082c2b7072bd512822a6732362 Mon Sep 17 00:00:00 2001 From: Subv Date: Fri, 19 Oct 2012 16:16:30 -0500 Subject: Scripts/Spells: Corrected the spirit value used in the Mana Tide Totem script. --- src/server/scripts/Spells/spell_shaman.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index e776fc87a5e..5ddfe1f4dc5 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -103,9 +103,10 @@ class spell_sha_mana_tide : public SpellScriptLoader void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { + ///@TODO: Exclude the "short term" buffs from the stat value if (Unit* caster = GetCaster()) if (Unit* owner = caster->GetOwner()) - amount = CalculatePct(owner->GetCreateStat(STAT_SPIRIT), aurEff->GetAmount()); + amount = CalculatePct(owner->GetStat(STAT_SPIRIT), aurEff->GetAmount()); } void Register() -- cgit v1.2.3 From 66889f11b72966fbdfc10abc460ec7345b29855a Mon Sep 17 00:00:00 2001 From: Shocker Date: Sun, 21 Oct 2012 22:25:52 +0300 Subject: Core/Spells: Use previous defines in a druid spell script --- src/server/scripts/Spells/spell_druid.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 5cba8edb37e..f8adb13d058 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -158,7 +158,6 @@ enum EclipseSpells SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) SPELL_DRUID_SOLAR_ECLIPSE = 48517, SPELL_DRUID_LUNAR_ECLIPSE = 48518, - TALENT_TREE_BALANCE = 752, }; // Wrath, Starfire, and Starsurge @@ -191,7 +190,7 @@ public: Player* caster = GetCaster()->ToPlayer(); // No boomy, no deal. - if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_BALANCE) + if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) return; switch(GetSpellInfo()->Id) -- cgit v1.2.3 From 9659f0335f3dad4cf84dca70fa436cb4b214ba39 Mon Sep 17 00:00:00 2001 From: Spp Date: Wed, 7 Nov 2012 23:21:19 +0100 Subject: Core/Guilds: Multiple changes - Fix Delete Rank - Fix Rank order after Rank is deleted - Send correct event after Guild Tab purchase - Better debug msgs - Move news to Event Logs (internal struct is like Event Logs and Bank Event Logs). Max news configurable --- .../2012_11_07_00_characters_guild_newslog_434.sql | 21 + src/server/game/Achievements/AchievementMgr.cpp | 8 +- src/server/game/Battlegrounds/Battleground.cpp | 4 +- src/server/game/DungeonFinding/LFGQueue.cpp | 4 +- src/server/game/DungeonFinding/LFGQueue.h | 2 +- src/server/game/Entities/Player/Player.cpp | 21 +- src/server/game/Entities/Player/Player.h | 3 +- src/server/game/Globals/ObjectMgr.cpp | 4 +- src/server/game/Guilds/Guild.cpp | 454 ++++++++++++--------- src/server/game/Guilds/Guild.h | 153 ++++--- src/server/game/Guilds/GuildMgr.cpp | 54 ++- src/server/game/Handlers/AuctionHouseHandler.cpp | 4 +- src/server/game/Handlers/BattleGroundHandler.cpp | 2 +- src/server/game/Handlers/ChatHandler.cpp | 3 +- src/server/game/Handlers/GuildHandler.cpp | 259 ++++++------ src/server/game/Handlers/ItemHandler.cpp | 2 +- src/server/game/Handlers/MailHandler.cpp | 20 +- src/server/game/Handlers/MovementHandler.cpp | 2 +- src/server/game/Miscellaneous/SharedDefines.h | 8 +- src/server/game/Spells/Spell.cpp | 2 +- src/server/game/Spells/SpellEffects.cpp | 9 +- src/server/game/World/World.cpp | 3 + src/server/game/World/World.h | 1 + src/server/scripts/Spells/spell_shaman.cpp | 2 +- .../Database/Implementation/CharacterDatabase.cpp | 6 +- .../Database/Implementation/CharacterDatabase.h | 3 +- src/server/worldserver/worldserver.conf.dist | 10 + 27 files changed, 598 insertions(+), 466 deletions(-) create mode 100644 sql/updates/characters/2012_11_07_00_characters_guild_newslog_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2012_11_07_00_characters_guild_newslog_434.sql b/sql/updates/characters/2012_11_07_00_characters_guild_newslog_434.sql new file mode 100644 index 00000000000..1504bd3b6e5 --- /dev/null +++ b/sql/updates/characters/2012_11_07_00_characters_guild_newslog_434.sql @@ -0,0 +1,21 @@ +-- Rename table and column to fit the other guild_*log tables and columns and create indexes +RENAME TABLE `guild_news_log` TO `guild_newslog`; + +ALTER TABLE `guild_newslog` +CHANGE COLUMN `guild` `guildid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Guild Identificator', +CHANGE COLUMN `id` `LogGuid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Log record identificator - auxiliary column', +CHANGE COLUMN `eventType` `EventType` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Event type', +CHANGE COLUMN `playerGuid` `PlayerGuid` int(10) unsigned NOT NULL DEFAULT '0', +CHANGE COLUMN `data` `Value` int(10) unsigned NOT NULL DEFAULT '0', +CHANGE COLUMN `flags` `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PlayerGuid`, +CHANGE COLUMN `date` `TimeStamp` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Event UNIX time', +ADD KEY `guildid_key` (`guildid`), +ADD KEY `Idx_PlayerGuid` (`PlayerGuid`), +ADD KEY `Idx_LogGuid` (`LogGuid`); + +-- Create missing tabs + +ALTER TABLE `guild_member_withdraw` +ADD COLUMN `tab6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `tab5`, +ADD COLUMN `tab7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `tab6`; + diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index c5aabff7db6..356be60909d 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1852,8 +1852,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achiev return; if (achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS) - if (Guild* guild = sGuildMgr->GetGuildById(referencePlayer->GetGuildId())) - guild->GetNewsLog().AddNewEvent(GUILD_NEWS_PLAYER_ACHIEVEMENT, time(NULL), referencePlayer->GetGUID(), achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID); + if (Guild* guild = referencePlayer->GetGuild()) + guild->AddGuildNews(GUILD_NEWS_PLAYER_ACHIEVEMENT, referencePlayer->GetGUID(), achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID); if (!GetOwner()->GetSession()->PlayerLoading()) SendAchievementEarned(achievement); @@ -1933,8 +1933,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achieve return; if (achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS) - if (Guild* guild = sGuildMgr->GetGuildById(referencePlayer->GetGuildId())) - guild->GetNewsLog().AddNewEvent(GUILD_NEWS_GUILD_ACHIEVEMENT, time(NULL), 0, achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID); + if (Guild* guild = referencePlayer->GetGuild()) + guild->AddGuildNews(GUILD_NEWS_GUILD_ACHIEVEMENT, 0, achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID); SendAchievementEarned(achievement); CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 1e252b5b705..389873f7caf 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -914,9 +914,9 @@ void Battleground::EndBattleground(uint32 winner) if (uint32 guildId = GetBgMap()->GetOwnerGuildId(player->GetTeam())) if (Guild* guild = sGuildMgr->GetGuildById(guildId)) { - guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1, 0, NULL, player); + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1, 0, NULL, player); if (isArena() && isRated() && winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) - guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, std::max(winnerArenaTeam->GetRating(), 1), 0, NULL, player); + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, std::max(winnerArenaTeam->GetRating(), 1), 0, NULL, player); } } } diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index cf600b0645f..3bcd1ee5643 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -639,7 +639,7 @@ void LFGQueue::FindBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueu std::string sguid = o.str(); for (LfgCompatibleContainer::const_iterator itr = CompatibleMapStore.begin(); itr != CompatibleMapStore.end(); ++itr) - if (itr->second.compatibility == LFG_COMPATIBLES_WITH_LESS_PLAYERS && + if (itr->second.compatibility == LFG_COMPATIBLES_WITH_LESS_PLAYERS && std::string::npos != itr->first.find(sguid)) { UpdateBestCompatibleInQueue(itrQueue, itr->first, itr->second.roles); @@ -650,7 +650,7 @@ void LFGQueue::UpdateBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQu { LfgQueueData& queueData = itrQueue->second; - uint8 storedSize = queueData.bestCompatible.empty() ? 0 : + uint8 storedSize = queueData.bestCompatible.empty() ? 0 : std::count(queueData.bestCompatible.begin(), queueData.bestCompatible.end(), '|') + 1; uint8 size = std::count(key.begin(), key.end(), '|') + 1; diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h index f937ac0d21a..e6ba038a9e6 100644 --- a/src/server/game/DungeonFinding/LFGQueue.h +++ b/src/server/game/DungeonFinding/LFGQueue.h @@ -42,7 +42,7 @@ struct LfgCompatibilityData compatibility(_compatibility), roles(_roles) { } LfgCompatibility compatibility; - LfgRolesMap roles; + LfgRolesMap roles; }; /// Stores player or group queue info diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1de1a453d86..b6974082604 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -515,7 +515,7 @@ inline void KillRewarder::_RewardXP(Player* player, float rate) // 4.2.3. Calculate expansion penalty if (_victim->GetTypeId() == TYPEID_UNIT && player->getLevel() >= GetMaxLevelForExpansion(_victim->ToCreature()->GetCreatureTemplate()->expansion)) xp = CalculatePct(xp, 10); // Players get only 10% xp for killing creatures of lower expansion levels than himself - + // 4.2.4. Give XP to player. player->GiveXP(xp, _victim, _groupRate); if (Pet* pet = player->GetPet()) @@ -635,7 +635,7 @@ void KillRewarder::Reward() if (uint32 guildId = victim->GetMap()->GetOwnerGuildId()) if (Guild* guild = sGuildMgr->GetGuildById(guildId)) - guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, victim, _killer); + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, victim, _killer); } } @@ -21440,8 +21440,8 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 if (crItem->maxcount != 0) // bought { if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) - if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId())) - guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_PURCHASED, time(NULL), GetGUID(), 0, item); + if (Guild* guild = GetGuild()) + guild->AddGuildNews(GUILD_NEWS_ITEM_PURCHASED, GetGUID(), 0, item); return true; } @@ -24189,10 +24189,10 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) --loot->unlootedCount; - if (const ItemTemplate* proto = sObjectMgr->GetItemTemplate(item->itemid)) + if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item->itemid)) if (proto->Quality > ITEM_QUALITY_EPIC || (proto->Quality == ITEM_QUALITY_EPIC && proto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) - if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId())) - guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_LOOTED, time(NULL), GetGUID(), 0, item->itemid); + if (Guild* guild = GetGuild()) + guild->AddGuildNews(GUILD_NEWS_ITEM_LOOTED, GetGUID(), 0, item->itemid); SendNewItem(newitem, uint32(item->count), false, false, true); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count); @@ -24499,6 +24499,11 @@ void Player::SendRespondInspectAchievements(Player* player) const m_achievementMgr.SendAchievementInfo(player); } +uint32 Player::GetAchievementPoints() const +{ + return m_achievementMgr.GetAchievementPoints(); +} + bool Player::HasAchieved(uint32 achievementId) const { return m_achievementMgr.HasAchieved(achievementId); @@ -24529,7 +24534,7 @@ void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 mis return; if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId())) - guild->GetAchievementMgr().UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, this); + guild->UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, this); } void Player::CompletedAchievement(AchievementEntry const* entry) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2bc8aeb9c10..0f1a60c5c79 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2057,7 +2057,7 @@ class Player : public Unit, public GridObject uint32 GetGuildLevel() { return GetUInt32Value(PLAYER_GUILDLEVEL); } void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; } uint32 GetGuildId() const { return GetUInt32Value(OBJECT_FIELD_DATA); /* return only lower part */ } - Guild* GetGuild(); + Guild* GetGuild(); static uint32 GetGuildIdFromDB(uint64 guid); static uint8 GetRankFromDB(uint64 guid); int GetGuildIdInvited() { return m_GuildIdInvited; } @@ -2701,6 +2701,7 @@ class Player : public Unit, public GridObject void InitRunes(); void SendRespondInspectAchievements(Player* player) const; + uint32 GetAchievementPoints() const; bool HasAchieved(uint32 achievementId) const; void ResetAchievements(); void CheckAllAchievementCriteria(); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 146654d69af..edf5aba1305 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8652,7 +8652,7 @@ void ObjectMgr::LoadFactionChangeTitles() } uint32 count = 0; - + do { Field* fields = result->Fetch(); @@ -8666,7 +8666,7 @@ void ObjectMgr::LoadFactionChangeTitles() sLog->outError(LOG_FILTER_SQL, "Title %u referenced in `player_factionchange_title` does not exist, pair skipped!", horde); else FactionChange_Titles[alliance] = horde; - + ++count; } while (result->NextRow()); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 0a8267652c6..2f9d4d3b8ec 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -267,6 +267,55 @@ void Guild::BankEventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& conten content << uint8(m_destTabId); } +void Guild::NewsLogEntry::SaveToDB(SQLTransaction& trans) const +{ + uint8 index = 0; + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_NEWS); + stmt->setUInt32( index, m_guildId); + stmt->setUInt32(++index, GetGUID()); + stmt->setUInt8 (++index, GetType()); + stmt->setUInt32(++index, GetPlayerGuid()); + stmt->setUInt32(++index, GetFlags()); + stmt->setUInt32(++index, GetValue()); + stmt->setUInt64(++index, GetTimestamp()); + CharacterDatabase.ExecuteOrAppend(trans, stmt); +} + +void Guild::NewsLogEntry::WritePacket(WorldPacket& data, ByteBuffer& /*content*/) const +{ + data.WriteBits(0, 26); // Not yet implemented used for guild achievements + ObjectGuid guid = GetPlayerGuid(); + + data.WriteBit(guid[7]); + data.WriteBit(guid[0]); + data.WriteBit(guid[6]); + data.WriteBit(guid[5]); + data.WriteBit(guid[4]); + data.WriteBit(guid[3]); + data.WriteBit(guid[1]); + data.WriteBit(guid[2]); + + data.FlushBits(); + + data.WriteByteSeq(guid[5]); + + data << uint32(GetFlags()); // 1 sticky + data << uint32(GetValue()); + data << uint32(0); // always 0 + + data.WriteByteSeq(guid[7]); + data.WriteByteSeq(guid[6]); + data.WriteByteSeq(guid[2]); + data.WriteByteSeq(guid[3]); + data.WriteByteSeq(guid[0]); + data.WriteByteSeq(guid[4]); + data.WriteByteSeq(guid[1]); + + data << uint32(GetGUID()); + data << uint32(GetType()); + data.AppendPackedTime(GetTimestamp()); +} + // RankInfo void Guild::RankInfo::LoadFromDB(Field* fields) { @@ -514,13 +563,13 @@ void Guild::BankTab::SendText(Guild const* guild, WorldSession* session) const if (session) { - sLog->outDebug(LOG_FILTER_GUILD, "MSG_QUERY_GUILD_BANK_TEXT [%s]: Tabid: %u, Text: %s" + sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [%s]: Tabid: %u, Text: %s" , session->GetPlayerInfo().c_str(), m_tabId, m_text.c_str()); session->SendPacket(&data); } else { - sLog->outDebug(LOG_FILTER_GUILD, "MSG_QUERY_GUILD_BANK_TEXT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str()); + sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str()); guild->BroadcastPacket(&data); } } @@ -533,15 +582,17 @@ void Guild::Member::SetStats(Player* player) m_class = player->getClass(); m_zoneId = player->GetZoneId(); m_accountId = player->GetSession()->GetAccountId(); + m_achievementPoints = player->GetAchievementPoints(); } -void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId) +void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId, uint32 reputation) { m_name = name; m_level = level; m_class = _class; m_zoneId = zoneId; m_accountId = accountId; + m_totalReputation = reputation; } void Guild::Member::SetPublicNote(std::string const& publicNote) @@ -610,8 +661,12 @@ bool Guild::Member::LoadFromDB(Field* fields) fields[15].GetUInt8(), // characters.level fields[16].GetUInt8(), // characters.class fields[17].GetUInt16(), // characters.zone - fields[18].GetUInt32()); // characters.account + fields[18].GetUInt32(), // characters.account + 0); m_logoutTime = fields[19].GetUInt32(); // characters.logout_time + m_totalActivity = 0; + m_weekActivity = 0; + m_weekReputation = 0; if (!CheckStats()) return false; @@ -660,10 +715,16 @@ void Guild::Member::UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, CharacterDatabase.ExecuteOrAppend(trans, stmt); } -void Guild::Member::ResetValues(bool /*week*/) +void Guild::Member::ResetValues(bool weekly /* = false*/) { for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId) m_bankWithdraw[tabId] = 0; + + if (weekly) + { + m_weekActivity = 0; + m_weekReputation = 0; + } } // Get amount of money/slots left for today. @@ -1045,8 +1106,8 @@ Guild::Guild(): m_accountsNumber(0), m_bankMoney(0), m_eventLog(NULL), + m_newsLog(NULL), m_achievementMgr(this), - _newsLog(this), _level(1), _experience(0), _todayExperience(0) @@ -1062,6 +1123,8 @@ Guild::~Guild() // Cleanup delete m_eventLog; m_eventLog = NULL; + delete m_newsLog; + m_newsLog = NULL; for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId) { @@ -1095,6 +1158,8 @@ bool Guild::Create(Player* pLeader, std::string const& name) m_bankMoney = 0; m_createdDate = ::time(NULL); _level = 1; + _experience = 0; + _todayExperience = 0; _CreateLogHolders(); sLog->outDebug(LOG_FILTER_GUILD, "GUILD: creating guild [%s] for leader %s (%u)", @@ -1128,7 +1193,7 @@ bool Guild::Create(Player* pLeader, std::string const& name) if (ret) { - _BroadcastEvent(GE_FOUNDER, m_leaderGuid); + _BroadcastEvent(GE_FOUNDER, 0); sScriptMgr->OnGuildCreate(this, pLeader, name); } @@ -1214,6 +1279,9 @@ void Guild::UpdateMemberData(Player* player, uint8 dataid, uint32 value) case GUILD_MEMBER_DATA_ZONEID: member->SetZoneId(value); break; + case GUILD_MEMBER_DATA_ACHIEVEMENT_POINTS: + member->SetAchievementPoints(value); + break; case GUILD_MEMBER_DATA_LEVEL: member->SetLevel(value); break; @@ -1265,11 +1333,11 @@ void Guild::HandleRoster(WorldSession* session /*= NULL*/) data.WriteBit(guid[7]); memberData << uint8(member->GetClass()); - memberData << int32(0); // unk + memberData << uint32(member->GetTotalReputation()); memberData.WriteByteSeq(guid[0]); - memberData << uint64(0); // weekly activity + memberData << uint64(member->GetWeekActivity()); memberData << uint32(member->GetRankId()); - memberData << uint32(0); // player->GetAchievementMgr().GetCompletedAchievementsAmount() + memberData << uint32(member->GetAchievementPoints()); // for (2 professions) memberData << uint32(0) << uint32(0) << uint32(0); @@ -1278,9 +1346,9 @@ void Guild::HandleRoster(WorldSession* session /*= NULL*/) memberData.WriteByteSeq(guid[2]); memberData << uint8(member->GetFlags()); memberData << uint32(member->GetZoneId()); - memberData << uint64(0); // Total activity + memberData << uint64(member->GetTotalActivity()); memberData.WriteByteSeq(guid[7]); - memberData << uint32(member->GetRemainingWeeklyReputation());// Remaining guild week Rep + memberData << uint32(sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP) - member->GetWeekReputation()); if (pubNoteLength) memberData.WriteString(member->GetPublicNote()); @@ -1371,7 +1439,6 @@ void Guild::HandleQuery(WorldSession* session) void Guild::SendGuildRankInfo(WorldSession* session) const { - // perhaps move to guild.cpp..... ByteBuffer rankData(100); WorldPacket data(SMSG_GUILD_RANK, 100); @@ -1385,7 +1452,7 @@ void Guild::SendGuildRankInfo(WorldSession* session) const data.WriteBits(rankInfo->GetName().length(), 7); - rankData << uint32(i); + rankData << uint32(rankInfo->GetId()); for (uint8 j = 0; j < GUILD_BANK_MAX_TABS; ++j) { @@ -1399,12 +1466,13 @@ void Guild::SendGuildRankInfo(WorldSession* session) const if (rankInfo->GetName().length()) rankData.WriteString(rankInfo->GetName()); - rankData << uint32(rankInfo->GetId()); + rankData << uint32(i); } data.FlushBits(); data.append(rankData); session->SendPacket(&data); + sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_RANK [%s]", session->GetPlayerInfo().c_str()); } void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd) @@ -1517,7 +1585,7 @@ void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note, else member->SetOfficerNote(note); - HandleRoster(session); // FIXME - We should send SMSG_GUILD_SET_NOTE + HandleRoster(session); // FIXME - We should send SMSG_GUILD_MEMBER_UPDATE_NOTE } } @@ -1539,7 +1607,7 @@ void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string c char aux[2]; sprintf(aux, "%u", rankId); - _BroadcastEvent(GE_RANK_UPDATED, 0, aux, name.c_str()); + _BroadcastEvent(GE_RANK_UPDATED, 0, aux); } } @@ -1556,26 +1624,24 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) if (_GetPurchasedTabsSize() >= GUILD_BANK_MAX_TABS) return; - if (tabId != _GetPurchasedTabsSize()) - return; - - uint32 tabCost = _GetGuildBankTabPrice(tabId) * GOLD; - if (!tabCost) - return; + if (tabId != _GetPurchasedTabsSize()) + return; + uint32 tabCost = _GetGuildBankTabPrice(tabId) * GOLD; + if (!tabCost) + return; - if (!player->HasEnoughMoney(uint64(tabCost))) // Should not happen, this is checked by client - return; + if (!player->HasEnoughMoney(uint64(tabCost))) // Should not happen, this is checked by client + return; - player->ModifyMoney(-int64(tabCost)); + player->ModifyMoney(-int64(tabCost)); uint8 rankId = member->GetRankId(); _CreateNewBankTab(); - _SetRankBankMoneyPerDay(rankId, uint32(GUILD_WITHDRAW_MONEY_UNLIMITED)); GuildBankRightsAndSlots rightsAndSlots(tabId); _SetRankBankTabRightsAndSlots(rankId, rightsAndSlots); - //HandleRoster(); // Broadcast for tab rights update - SendBankList(session, tabId, false, true); + _BroadcastEvent(GE_BANK_TAB_PURCHASED, 0); + SendPermissions(session); /// Hack to force client to update permissions } void Guild::HandleInviteMember(WorldSession* session, std::string const& name) @@ -1749,7 +1815,7 @@ void Guild::HandleRemoveMember(WorldSession* session, uint64 guid) DeleteMember(guid, false, true); _LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUIDLow(), GUID_LOPART(guid)); _BroadcastEvent(GE_REMOVED, 0, name.c_str(), player->GetName().c_str()); - SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_COMMAND_SUCCESS, name); + SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_COMMAND_SUCCESS, name); } } } @@ -1847,11 +1913,7 @@ void Guild::HandleAddNewRank(WorldSession* session, std::string const& name) // Only leader can add new rank if (_IsLeader(session->GetPlayer())) if (_CreateRank(name, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK)) - { - char aux[2]; - sprintf(aux, "%u", size); - _BroadcastEvent(GE_RANK_CREATED, 0, aux, name.c_str()); - } + _BroadcastEvent(GE_RANK_CREATED, 0); } void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId) @@ -1860,18 +1922,18 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId) if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer())) return; - // Delete bank rights for rank - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK); - stmt->setUInt32(0, m_id); - stmt->setUInt8(1, rankId); - CharacterDatabase.Execute(stmt); - // Delete rank - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANK); - stmt->setUInt32(0, m_id); - stmt->setUInt8(1, rankId); - CharacterDatabase.Execute(stmt); + // Delete bank rights for rank + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK); + stmt->setUInt32(0, m_id); + stmt->setUInt8(1, rankId); + CharacterDatabase.Execute(stmt); + // Delete rank + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANK); + stmt->setUInt32(0, m_id); + stmt->setUInt8(1, rankId); + CharacterDatabase.Execute(stmt); - m_ranks.erase(m_ranks.begin() + rankId-1); + m_ranks.erase(m_ranks.begin() + rankId); _BroadcastEvent(GE_RANK_DELETED, rankId); } @@ -1994,6 +2056,61 @@ void Guild::SendEventLog(WorldSession* session) const sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_EVENT_LOG_QUERY_RESULT [%s]", session->GetPlayerInfo().c_str()); } +void Guild::SendNewsUpdate(WorldSession* session) +{ + uint32 size = m_newsLog->GetSize(); + GuildLog* logs = m_newsLog->GetGuildLog(); + + if (!logs) + return; + + WorldPacket data(SMSG_GUILD_NEWS_UPDATE, (21 + size * (26 + 8)) / 8 + (8 + 6 * 4) * size); + data.WriteBits(size, 21); + + for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr) + { + data.WriteBits(0, 26); // Not yet implemented used for guild achievements + ObjectGuid guid = ((NewsLogEntry*)(*itr))->GetPlayerGuid(); + + data.WriteBit(guid[7]); + data.WriteBit(guid[0]); + data.WriteBit(guid[6]); + data.WriteBit(guid[5]); + data.WriteBit(guid[4]); + data.WriteBit(guid[3]); + data.WriteBit(guid[1]); + data.WriteBit(guid[2]); + } + + data.FlushBits(); + + for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr) + { + NewsLogEntry* news = (NewsLogEntry*)(*itr); + ObjectGuid guid = news->GetPlayerGuid(); + data.WriteByteSeq(guid[5]); + + data << uint32(news->GetFlags()); // 1 sticky + data << uint32(news->GetValue()); + data << uint32(0); + + data.WriteByteSeq(guid[7]); + data.WriteByteSeq(guid[6]); + data.WriteByteSeq(guid[2]); + data.WriteByteSeq(guid[3]); + data.WriteByteSeq(guid[0]); + data.WriteByteSeq(guid[4]); + data.WriteByteSeq(guid[1]); + + data << uint32(news->GetGUID()); + data << uint32(news->GetType()); + data.AppendPackedTime(news->GetTimestamp()); + } + + session->SendPacket(&data); + sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_NEWS_UPDATE [%s]", session->GetPlayerInfo().c_str()); +} + void Guild::SendBankLog(WorldSession* session, uint8 tabId) const { // GUILD_BANK_MAX_TABS send by client for money log @@ -2011,8 +2128,6 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const } } - - void Guild::SendBankTabText(WorldSession* session, uint8 tabId) const { if (BankTab const* tab = GetBankTab(tabId)) @@ -2050,7 +2165,7 @@ void Guild::SendMoneyInfo(WorldSession* session) const return; int32 amount = _GetMemberRemainingMoney(member); - WorldPacket data(SMSG_GUILD_BANK_MONEY_WITHDRAWN, 4); + WorldPacket data(SMSG_GUILD_BANK_MONEY_WITHDRAWN, 8); data << int64(amount); session->SendPacket(&data); sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_BANK_MONEY_WITHDRAWN [%s] Money: %u", session->GetPlayerInfo().c_str(), amount); @@ -2058,6 +2173,11 @@ void Guild::SendMoneyInfo(WorldSession* session) const void Guild::SendLoginInfo(WorldSession* session) { + Player* player = session->GetPlayer(); + Member* member = GetMember(player->GetGUID()); + if (!member) + return; + /* Login sequence: SMSG_GUILD_EVENT - GE_MOTD @@ -2077,13 +2197,11 @@ void Guild::SendLoginInfo(WorldSession* session) sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_EVENT [%s] MOTD", session->GetPlayerInfo().c_str()); - Player* player = session->GetPlayer(); - SendGuildRankInfo(session); _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName().c_str()); // Send to self separately, player is not in world yet and is not found by _BroadcastEvent - data.Initialize(SMSG_GUILD_EVENT, 1 + 1 + session->GetPlayer()->GetName().size() + 8); + data.Initialize(SMSG_GUILD_EVENT, 1 + 1 + player->GetName().size() + 8); data << uint8(GE_SIGNED_ON); data << uint8(1); data << player->GetName(); @@ -2099,27 +2217,14 @@ void Guild::SendLoginInfo(WorldSession* session) for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i) if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i)) if (entry->Level <= GetLevel()) - session->GetPlayer()->learnSpell(entry->SpellId, true); + player->learnSpell(entry->SpellId, true); - SendGuildReputationWeeklyCap(session); + SendGuildReputationWeeklyCap(session, member->GetWeekReputation()); - GetAchievementMgr().SendAllAchievementData(player); + m_achievementMgr.SendAllAchievementData(player); - if (Member* member = GetMember(player->GetGUID())) - { - member->SetStats(player); - member->AddFlag(GUILDMEMBER_STATUS_ONLINE); - } -} - -void Guild::SendGuildReputationWeeklyCap(WorldSession* session) const -{ - if (Member const* member = GetMember(session->GetPlayer()->GetGUID())) - { - WorldPacket data(SMSG_GUILD_REPUTATION_WEEKLY_CAP, 4); - data << uint32(member->GetRemainingWeeklyReputation()); - session->SendPacket(&data); - } + member->SetStats(player); + member->AddFlag(GUILDMEMBER_STATUS_ONLINE); } // Loading methods @@ -2237,6 +2342,21 @@ bool Guild::LoadBankEventLogFromDB(Field* fields) return true; } +void Guild::LoadGuildNewsLogFromDB(Field* fields) +{ + if (!m_newsLog->CanInsert()) + return; + + m_newsLog->LoadEvent(new NewsLogEntry( + m_id, // guild id + fields[1].GetUInt32(), // guid + fields[6].GetUInt32(), // timestamp //64 bits? + GuildNews(fields[2].GetUInt8()), // type + fields[3].GetUInt32(), // player guid + fields[4].GetUInt32(), // Flags + fields[5].GetUInt32())); // value +} + void Guild::LoadBankTabFromDB(Field* fields) { uint8 tabId = fields[1].GetUInt8(); @@ -2405,11 +2525,11 @@ bool Guild::AddMember(uint64 guid, uint8 rankId) std::string name; if (player) { + m_members[lowguid] = member; player->SetInGuild(m_id); player->SetGuildIdInvited(0); player->SetRank(rankId); player->SetGuildLevel(GetLevel()); - member->SetStats(player); SendLoginInfo(player->GetSession()); name = player->GetName(); } @@ -2430,17 +2550,19 @@ bool Guild::AddMember(uint64 guid, uint8 rankId) fields[1].GetUInt8(), fields[2].GetUInt8(), fields[3].GetUInt16(), - fields[4].GetUInt32()); + fields[4].GetUInt32(), + 0); ok = member->CheckStats(); } + if (!ok) { delete member; return false; } + m_members[lowguid] = member; } - m_members[lowguid] = member; SQLTransaction trans(NULL); member->SaveToDB(trans); @@ -2448,7 +2570,7 @@ bool Guild::AddMember(uint64 guid, uint8 rankId) _UpdateAccountsNumber(); _LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, lowguid); _BroadcastEvent(GE_JOINED, guid, name.c_str()); - sGuildFinderMgr->RemoveMembershipRequest(player->GetGUIDLow(), GUID_LOPART(this->GetGUID())); + sGuildFinderMgr->RemoveMembershipRequest(player->GetGUIDLow(), GUID_LOPART(this->GetGUID())); // Call scripts if member was succesfully added (and stored to database) sScriptMgr->OnGuildAddMember(this, player, rankId); @@ -2507,6 +2629,7 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked) player->SetInGuild(0); player->SetRank(0); player->SetGuildLevel(0); + for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i) if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i)) if (entry->Level <= GetLevel()) @@ -2529,7 +2652,7 @@ bool Guild::ChangeMemberRank(uint64 guid, uint8 newRank) return false; } -bool Guild::IsMember(uint64 guid) +bool Guild::IsMember(uint64 guid) const { Members::const_iterator itr = m_members.find(GUID_LOPART(guid)); return itr != m_members.end(); @@ -2577,6 +2700,7 @@ void Guild::SetBankTabText(uint8 tabId, std::string const& text) void Guild::_CreateLogHolders() { m_eventLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT)); + m_newsLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT)); for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId) m_bankEventLog[tabId] = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT)); } @@ -3222,7 +3346,8 @@ void Guild::SendGuildRanksUpdate(uint64 setterGuid, uint64 targetGuid, uint32 ra member->ChangeRank(rank); - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_GUILD_RANKS_UPDATE"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_GUILD_RANKS_UPDATE [Broadcast] Target: %u, Issuer: %u, RankId: %u", + GUID_LOPART(targetGuid), GUID_LOPART(setterGuid), rank); } void Guild::GiveXP(uint32 xp, Player* source) @@ -3275,11 +3400,11 @@ void Guild::GiveXP(uint32 xp, Player* source) } } - GetNewsLog().AddNewEvent(GUILD_NEWS_LEVEL_UP, time(NULL), 0, 0, _level); - GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL, GetLevel(), 0, NULL, source); + AddGuildNews(GUILD_NEWS_LEVEL_UP, 0, 0, _level); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL, GetLevel(), 0, NULL, source); } -void Guild::SendGuildXP(WorldSession* session) const +void Guild::SendGuildXP(WorldSession* session /* = NULL */) const { //Member const* member = GetMember(session->GetGuidLow()); @@ -3292,144 +3417,81 @@ void Guild::SendGuildXP(WorldSession* session) const session->SendPacket(&data); } -void Guild::GuildNewsLog::AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data) +void Guild::SendGuildReputationWeeklyCap(WorldSession* session, uint32 reputation) const { - uint32 id = _newsLog.size(); - - GuildNewsEntry& log = _newsLog[id]; - log.EventType = eventType; - log.PlayerGuid = playerGuid; - log.Data = data; - log.Flags = flags; - log.Date = date; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SAVE_GUILD_NEWS); - stmt->setUInt32(0, GetGuild()->GetId()); - stmt->setUInt32(1, id); - stmt->setUInt32(2, log.EventType); - stmt->setUInt64(3, log.PlayerGuid); - stmt->setUInt32(4, log.Data); - stmt->setUInt32(5, log.Flags); - stmt->setUInt32(6, uint32(log.Date)); - CharacterDatabase.Execute(stmt); - - WorldPacket packet; - BuildNewsData(id, log, packet); - GetGuild()->BroadcastPacket(&packet); + uint32 cap = sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP) - reputation; + WorldPacket data(SMSG_GUILD_REPUTATION_WEEKLY_CAP, 4); + data << uint32(cap); + session->SendPacket(&data); + sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_REPUTATION_WEEKLY_CAP [%s]: Left: %u", + session->GetPlayerInfo().c_str(), cap); } -void Guild::GuildNewsLog::LoadFromDB(PreparedQueryResult result) +void Guild::ResetTimes(bool weekly) { - if (!result) - return; - do + _todayExperience = 0; + for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { - Field* fields = result->Fetch(); - uint32 id = fields[0].GetInt32(); - GuildNewsEntry& log = _newsLog[id]; - log.EventType = GuildNews(fields[1].GetInt32()); - log.PlayerGuid = fields[2].GetInt64(); - log.Data = fields[3].GetInt32(); - log.Flags = fields[4].GetInt32(); - log.Date = time_t(fields[5].GetInt32()); + itr->second->ResetValues(weekly); + if (Player* player = itr->second->FindPlayer()) + { + //SendGuildXP(player->GetSession()); + WorldPacket data(SMSG_GUILD_MEMBER_DAILY_RESET, 0); // tells the client to request bank withdrawal limit + player->GetSession()->SendPacket(&data); + } } - while (result->NextRow()); } -void Guild::GuildNewsLog::BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data) +void Guild::AddGuildNews(uint8 type, uint64 guid, uint32 flags, uint32 value) { - data.Initialize(SMSG_GUILD_NEWS_UPDATE, 7 + 32); - data.WriteBits(1, 21); // size, we are only sending 1 news here + uint32 lowGuid = GUID_LOPART(guid); + NewsLogEntry* news = new NewsLogEntry(m_id, m_newsLog->GetNextGUID(), GuildNews(type), lowGuid, flags, value); - data.WriteBits(0, 26); // Not yet implemented used for guild achievements - ObjectGuid guid = guildNew.PlayerGuid; - - data.WriteBit(guid[7]); - data.WriteBit(guid[0]); - data.WriteBit(guid[6]); - data.WriteBit(guid[5]); - data.WriteBit(guid[4]); - data.WriteBit(guid[3]); - data.WriteBit(guid[1]); - data.WriteBit(guid[2]); - - data.FlushBits(); + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + m_newsLog->AddEvent(trans, news); + CharacterDatabase.CommitTransaction(trans); - data.WriteByteSeq(guid[5]); + WorldPacket data(SMSG_GUILD_NEWS_UPDATE, 7 + 32); + data.WriteBits(1, 21); // size, we are only sending 1 news here + ByteBuffer buffer; + news->WritePacket(data, buffer); - data << uint32(guildNew.Flags); // 1 sticky - data << uint32(guildNew.Data); - data << uint32(0); // always 0 + BroadcastPacket(&data); +} - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[1]); +bool Guild::HasAchieved(uint32 achievementId) const +{ + return m_achievementMgr.HasAchieved(achievementId); +} - data << uint32(id); - data << uint32(guildNew.EventType); - data.AppendPackedTime(guildNew.Date); +void Guild::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2, Unit* unit, Player* player) +{ + m_achievementMgr.UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, player); } -void Guild::GuildNewsLog::BuildNewsData(WorldPacket& data) +void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky) { - data.Initialize(SMSG_GUILD_NEWS_UPDATE, (21 + _newsLog.size() * (26 + 8)) / 8 + (8 + 6 * 4) * _newsLog.size()); - data.WriteBits(_newsLog.size(), 21); + GuildLog* logs = m_newsLog->GetGuildLog(); + GuildLog::iterator itr = logs->begin(); + while (itr != logs->end() && (*itr)->GetGUID() != newsId) + ++itr; - for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++) + if (itr == logs->end()) { - data.WriteBits(0, 26); // Not yet implemented used for guild achievements - ObjectGuid guid = it->second.PlayerGuid; - - data.WriteBit(guid[7]); - data.WriteBit(guid[0]); - data.WriteBit(guid[6]); - data.WriteBit(guid[5]); - data.WriteBit(guid[4]); - data.WriteBit(guid[3]); - data.WriteBit(guid[1]); - data.WriteBit(guid[2]); + sLog->outDebug(LOG_FILTER_GUILD, "HandleNewsSetSticky: [%s] requested unknown newsId %u - Sticky: %u", + session->GetPlayerInfo().c_str(), newsId, sticky); + return; } - data.FlushBits(); - - for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++) - { - ObjectGuid guid = it->second.PlayerGuid; - data.WriteByteSeq(guid[5]); + NewsLogEntry* news = (NewsLogEntry*)(*itr); + news->SetSticky(sticky); - data << uint32(it->second.Flags); // 1 sticky - data << uint32(it->second.Data); - data << uint32(0); + sLog->outDebug(LOG_FILTER_GUILD, "HandleNewsSetSticky: [%s] chenged newsId %u sticky to %u", + session->GetPlayerInfo().c_str(), newsId, sticky); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[1]); - - data << uint32(it->first); - data << uint32(it->second.EventType); - data.AppendPackedTime(it->second.Date); - } -} - -void Guild::ResetTimes(bool week) -{ - _todayExperience = 0; - for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) - { - itr->second->ResetValues(week); - if (Player* player = itr->second->FindPlayer()) - { - //SendGuildXP(player->GetSession()); - WorldPacket data(SMSG_GUILD_MEMBER_DAILY_RESET, 0); // tells the client to request bank withdrawal limit - player->GetSession()->SendPacket(&data); - } - } + WorldPacket data(SMSG_GUILD_NEWS_UPDATE, 7 + 32); + data.WriteBits(1, 21); + ByteBuffer buffer; + news->WritePacket(data, buffer); + session->SendPacket(&data); } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 9a0b9e682e4..796d8359dea 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -33,7 +33,7 @@ enum GuildMisc GUILD_BANK_MAX_TABS = 8, // send by client for money log also GUILD_BANK_MAX_SLOTS = 98, GUILD_BANK_MONEY_LOGS_TAB = 100, // used for money log in DB - GUILD_RANKS_MIN_COUNT = 5, + GUILD_RANKS_MIN_COUNT = 2, GUILD_RANKS_MAX_COUNT = 10, GUILD_RANK_NONE = 0xFF, GUILD_WITHDRAW_MONEY_UNLIMITED = 0xFFFFFFFF, @@ -46,6 +46,7 @@ enum GuildMisc enum GuildMemberData { GUILD_MEMBER_DATA_ZONEID, + GUILD_MEMBER_DATA_ACHIEVEMENT_POINTS, GUILD_MEMBER_DATA_LEVEL, }; @@ -255,15 +256,6 @@ enum GuildNews GUILD_NEWS_LEVEL_UP = 6, }; -struct GuildNewsEntry -{ - GuildNews EventType; - time_t Date; - uint64 PlayerGuid; - uint32 Flags; - uint32 Data; -}; - struct GuildReward { uint32 Entry; @@ -275,8 +267,6 @@ struct GuildReward uint32 const MinNewsItemLevel[MAX_CONTENT] = { 61, 90, 200, 353 }; -typedef std::map GuildNewsLogMap; - // Emblem info class EmblemInfo { @@ -347,29 +337,35 @@ private: m_zoneId(0), m_level(0), m_class(0), + m_flags(GUILDMEMBER_STATUS_NONE), m_logoutTime(::time(NULL)), m_accountId(0), - m_rankId(rankId) + m_rankId(rankId), + m_achievementPoints(0), + m_totalActivity(0), + m_weekActivity(0), + m_totalReputation(0), + m_weekReputation(0) { memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(int32)); } void SetStats(Player* player); - void SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId); + void SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId, uint32 reputation); bool CheckStats() const; void SetPublicNote(std::string const& publicNote); void SetOfficerNote(std::string const& officerNote); void SetZoneId(uint32 id) { m_zoneId = id; } + void SetAchievementPoints(uint32 val) { m_achievementPoints = val; } void SetLevel(uint8 var) { m_level = var; } + void AddReputation(uint32& reputation); + void AddActivity(uint64 activity); void AddFlag(uint8 var) { m_flags |= var; } void RemFlag(uint8 var) { m_flags &= ~var; } void ResetFlags() { m_flags = GUILDMEMBER_STATUS_NONE; } - std::string GetPublicNote() { return m_publicNote; }; - std::string GetOfficerNote() { return m_officerNote; }; - bool LoadFromDB(Field* fields); void SaveToDB(SQLTransaction& trans) const; @@ -384,6 +380,12 @@ private: uint8 GetLevel() const { return m_level; } uint8 GetFlags() const { return m_flags; } uint32 GetZoneId() const { return m_zoneId; } + uint32 GetAchievementPoints() const { return m_achievementPoints; } + uint64 GetTotalActivity() const { return m_totalActivity; } + uint64 GetWeekActivity() const { return m_weekActivity; } + uint32 GetTotalReputation() const { return m_totalReputation; } + uint32 GetWeekReputation() const { return m_weekReputation; } + bool IsOnline() { return (m_flags & GUILDMEMBER_STATUS_ONLINE); } void ChangeRank(uint8 newRank); @@ -395,12 +397,10 @@ private: void UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, uint32 amount); int32 GetBankWithdrawValue(uint8 tabId) const; - void ResetValues(bool week); + void ResetValues(bool weekly = false); inline Player* FindPlayer() const { return ObjectAccessor::FindPlayer(m_guid); } - uint32 GetRemainingWeeklyReputation() const { return 0; } - private: uint32 m_guildId; // Fields from characters table @@ -418,30 +418,11 @@ private: std::string m_officerNote; int32 m_bankWithdraw[GUILD_BANK_MAX_TABS + 1]; - }; - - // News Log class - class GuildNewsLog - { - public: - GuildNewsLog(Guild* guild) : _guild(guild) { } - - void LoadFromDB(PreparedQueryResult result); - void BuildNewsData(WorldPacket& data); - void BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data); - void AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data); - GuildNewsEntry* GetNewsById(uint32 id) - { - GuildNewsLogMap::iterator itr = _newsLog.find(id); - if (itr != _newsLog.end()) - return &itr->second; - return NULL; - } - Guild* GetGuild() const { return _guild; } - - private: - Guild* _guild; - GuildNewsLogMap _newsLog; + uint32 m_achievementPoints; + uint64 m_totalActivity; + uint64 m_weekActivity; + uint32 m_totalReputation; + uint32 m_weekReputation; }; // Base class for event entries @@ -504,11 +485,11 @@ private: return IsMoneyEvent(m_eventType); } - BankEventLogEntry(uint32 guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : + BankEventLogEntry(uint32 guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, uint32 playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : LogEntry(guildId, guid), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid), m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { } - BankEventLogEntry(uint32 guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : + BankEventLogEntry(uint32 guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, uint32 playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid), m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { } @@ -521,18 +502,52 @@ private: GuildBankEventLogTypes m_eventType; uint8 m_bankTabId; uint32 m_playerGuid; - uint32 m_itemOrMoney; + uint64 m_itemOrMoney; uint16 m_itemStackCount; uint8 m_destTabId; }; + // News log entry + class NewsLogEntry : public LogEntry + { + public: + NewsLogEntry(uint32 guildId, uint32 guid, GuildNews type, uint32 playerGuid, uint32 flags, uint32 value) : + LogEntry(guildId, guid), m_type(type), m_playerGuid(playerGuid), m_flags(flags), m_value(value) { } + + NewsLogEntry(uint32 guildId, uint32 guid, time_t timestamp, GuildNews type, uint32 playerGuid, uint32 flags, uint32 value) : + LogEntry(guildId, guid, timestamp), m_type(type), m_playerGuid(playerGuid), m_flags(flags), m_value(value) { } + + ~NewsLogEntry() { } + + GuildNews GetType() const { return m_type; } + uint64 GetPlayerGuid() const { return m_playerGuid ? MAKE_NEW_GUID(m_playerGuid, 0, HIGHGUID_PLAYER) : 0; } + uint32 GetValue() const { return m_value; } + uint32 GetFlags() const { return m_flags; } + void SetSticky(bool sticky) + { + if (sticky) + m_flags |= 1; + else + m_flags &= ~1; + } + + void SaveToDB(SQLTransaction& trans) const; + void WritePacket(WorldPacket& data, ByteBuffer& content) const; + + private: + GuildNews m_type; + uint32 m_playerGuid; + uint32 m_flags; + uint32 m_value; + }; + // Class encapsulating work with events collection typedef std::list GuildLog; class LogHolder { public: - LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } + LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(GUILD_EVENT_LOG_GUID_UNDEFINED) { } ~LogHolder(); uint8 GetSize() const { return uint8(m_log.size()); } @@ -545,6 +560,7 @@ private: // Writes information about all events to packet void WritePacket(WorldPacket& data) const; uint32 GetNextGUID(); + GuildLog* GetGuildLog() { return &m_log; } // Hack needed for news as WritePacket can't be used private: GuildLog m_log; @@ -559,13 +575,13 @@ private: public: RankInfo(): m_guildId(0), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { } RankInfo(uint32 guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { } - RankInfo(uint32 guildId, uint32 rankId, std::string const& name, uint32 rights, uint32 money) : + RankInfo(uint32 guildId, uint8 rankId, std::string const& name, uint32 rights, uint32 money) : m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { } void LoadFromDB(Field* fields); void SaveToDB(SQLTransaction& trans) const; - uint32 GetId() const { return m_rankId; } + uint8 GetId() const { return m_rankId; } std::string const& GetName() const { return m_name; } void SetName(std::string const& name); @@ -592,7 +608,7 @@ private: private: uint32 m_guildId; - uint32 m_rankId; + uint8 m_rankId; std::string m_name; uint32 m_rights; uint32 m_bankMoneyPerDay; @@ -752,7 +768,7 @@ public: std::string const& GetInfo() const { return m_info; } // Handle client commands - void HandleRoster(WorldSession* session = NULL); // NULL = broadcast + void HandleRoster(WorldSession* session = NULL); void HandleQuery(WorldSession* session); void HandleSetMOTD(WorldSession* session, std::string const& motd); void HandleSetInfo(WorldSession* session, std::string const& info); @@ -766,8 +782,8 @@ public: void HandleAcceptMember(WorldSession* session); void HandleLeaveMember(WorldSession* session); void HandleRemoveMember(WorldSession* session, uint64 guid); - void HandleUpdateMemberRank(WorldSession* session, uint64 targetGuid, bool demote); - void HandleSetMemberRank(WorldSession* session, uint64 targetGuid, uint64 setterGuid, uint32 rank); + void HandleUpdateMemberRank(WorldSession* session, uint64 guid, bool demote); + void HandleSetMemberRank(WorldSession* session, uint64 guid, uint64 setterGuid, uint32 rank); void HandleAddNewRank(WorldSession* session, std::string const& name); void HandleRemoveRank(WorldSession* session, uint8 rankId); void HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow = false); @@ -775,6 +791,7 @@ public: void HandleMemberLogout(WorldSession* session); void HandleDisband(WorldSession* session); void HandleGuildPartyRequest(WorldSession* session); + void HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky); void UpdateMemberData(Player* player, uint8 dataid, uint32 value); void OnPlayerStatusChange(Player* player, uint32 flag, bool state); @@ -784,15 +801,16 @@ public: void SendEventLog(WorldSession* session) const; void SendBankLog(WorldSession* session, uint8 tabId) const; void SendBankList(WorldSession* session, uint8 tabId, bool withContent, bool withTabInfo) const; - void SendGuildReputationWeeklyCap(WorldSession* session) const; - void SendGuildXP(WorldSession* session) const; + void SendGuildXP(WorldSession* session = NULL) const; void SendBankTabText(WorldSession* session, uint8 tabId) const; void SendPermissions(WorldSession* session) const; void SendMoneyInfo(WorldSession* session) const; void SendLoginInfo(WorldSession* session); + void SendNewsUpdate(WorldSession* session); // Load from DB bool LoadFromDB(Field* fields); + void LoadGuildNewsLogFromDB(Field* fields); void LoadRankFromDB(Field* fields); bool LoadMemberFromDB(Field* fields); bool LoadEventLogFromDB(Field* fields); @@ -822,7 +840,7 @@ public: bool AddMember(uint64 guid, uint8 rankId = GUILD_RANK_NONE); void DeleteMember(uint64 guid, bool isDisbanding = false, bool isKicked = false); bool ChangeMemberRank(uint64 guid, uint8 newRank); - bool IsMember(uint64 guid); + bool IsMember(uint64 guid) const; uint32 GetMembersCount() { return m_members.size(); } // Bank @@ -836,15 +854,18 @@ public: AchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } // Guild leveling - uint32 GetLevel() const { return _level; } + uint8 GetLevel() const { return _level; } void GiveXP(uint32 xp, Player* source); uint64 GetExperience() const { return _experience; } uint64 GetTodayExperience() const { return _todayExperience; } - void ResetDailyExperience(); - GuildNewsLog& GetNewsLog() { return _newsLog; } + + void AddGuildNews(uint8 type, uint64 guid, uint32 flags, uint32 value); EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; } - void ResetTimes(bool week); + void ResetTimes(bool weekly); + + bool HasAchieved(uint32 achievementId) const; + void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2, Unit* unit, Player* player); protected: uint32 m_id; @@ -865,11 +886,10 @@ protected: // These are actually ordered lists. The first element is the oldest entry. LogHolder* m_eventLog; LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; - + LogHolder* m_newsLog; AchievementMgr m_achievementMgr; - GuildNewsLog _newsLog; - uint32 _level; + uint8 _level; uint64 _experience; uint64 _todayExperience; @@ -877,7 +897,7 @@ private: inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } inline RankInfo* GetRankInfo(uint8 rankId) { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } - inline bool _HasRankRight(Player* player, uint32 right) const + inline bool _HasRankRight(Player const* player, uint32 right) const { if (player) if (Member const* member = GetMember(player->GetGUID())) @@ -957,8 +977,7 @@ private: void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const; void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const; - void _SendBankList(WorldSession* session = NULL, uint8 tabId = 0, bool sendFullSlots = false, SlotIds *slots = NULL) const; - + void SendGuildReputationWeeklyCap(WorldSession* session, uint32 reputation) const; void SendGuildRanksUpdate(uint64 setterGuid, uint64 targetGuid, uint32 rank); void _BroadcastEvent(GuildEvents guildEvent, uint64 guid, const char* param1 = NULL, const char* param2 = NULL, const char* param3 = NULL) const; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 38a5699510e..1cb8419be7c 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -197,13 +197,13 @@ void GuildMgr::LoadGuilds() CharacterDatabase.DirectExecute("DELETE gm FROM guild_member gm LEFT JOIN guild g ON gm.guildId = g.guildId WHERE g.guildId IS NULL"); CharacterDatabase.DirectExecute("DELETE gm FROM guild_member_withdraw gm LEFT JOIN guild_member g ON gm.guid = g.guid WHERE g.guid IS NULL"); - // 0 1 2 3 4 5 6 7 8 9 10 - QueryResult result = CharacterDatabase.Query("SELECT guildid, gm.guid, rank, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, " + // 0 1 2 3 4 5 6 7 8 9 10 + QueryResult result = CharacterDatabase.Query("SELECT gm.guildid, gm.guid, rank, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, " // 11 12 13 14 15 16 17 18 19 "w.tab6, w.tab7, w.money, c.name, c.level, c.class, c.zone, c.account, c.logout_time " "FROM guild_member gm " "LEFT JOIN guild_member_withdraw w ON gm.guid = w.guid " - "LEFT JOIN characters c ON c.guid = gm.guid ORDER BY guildid ASC"); + "LEFT JOIN characters c ON c.guid = gm.guid ORDER BY gm.guildid ASC"); if (!result) sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild members. DB table `guild_member` is empty."); @@ -328,7 +328,39 @@ void GuildMgr::LoadGuilds() } } - // 7. Load all guild bank tabs + // 7. Load all news event logs + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Guild News..."); + { + uint32 oldMSTime = getMSTime(); + + CharacterDatabase.DirectPExecute("DELETE FROM guild_newslog WHERE LogGuid > %u", sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT)); + + // 0 1 2 3 4 5 6 + QueryResult result = CharacterDatabase.Query("SELECT guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp FROM guild_newslog ORDER BY TimeStamp DESC, LogGuid DESC"); + + if (!result) + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild event logs. DB table `guild_newslog` is empty."); + else + { + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + uint32 guildId = fields[0].GetUInt32(); + + if (Guild* guild = GetGuildById(guildId)) + guild->LoadGuildNewsLogFromDB(fields); + + ++count; + } + while (result->NextRow()); + + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild new logs in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + } + } + + + // 8. Load all guild bank tabs sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading guild bank tabs..."); { uint32 oldMSTime = getMSTime(); @@ -362,7 +394,7 @@ void GuildMgr::LoadGuilds() } } - // 8. Fill all guild bank tabs + // 9. Fill all guild bank tabs sLog->outInfo(LOG_FILTER_GUILD, "Filling bank tabs with items..."); { uint32 oldMSTime = getMSTime(); @@ -398,7 +430,7 @@ void GuildMgr::LoadGuilds() } } - // 9. Load guild achievements + // 10. Load guild achievements { PreparedQueryResult achievementResult; PreparedQueryResult criteriaResult; @@ -414,16 +446,6 @@ void GuildMgr::LoadGuilds() itr->second->GetAchievementMgr().LoadFromDB(achievementResult, criteriaResult); } } - // 10. Loading Guild news - sLog->outInfo(LOG_FILTER_GENERAL, "Loading Guild News"); - { - for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) - { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_NEWS); - stmt->setInt32(0, itr->first); - itr->second->GetNewsLog().LoadFromDB(CharacterDatabase.Query(stmt)); - } - } // 11. Validate loaded guild data sLog->outInfo(LOG_FILTER_GENERAL, "Validating data of loaded guilds..."); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index ac440b23d65..17d84295bd7 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -336,8 +336,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recvData) AH->auctionHouseEntry = auctionHouseEntry; sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) to " - "auctioneer %u with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u", - _player->GetName().c_str(), _player->GetGUIDLow(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), + "auctioneer %u with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u", + _player->GetName().c_str(), _player->GetGUIDLow(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(), newItem->GetGUIDLow(), AH->auctioneer, newItem->GetCount(), bid, buyout, auctionTime, AH->GetHouseId()); sAuctionMgr->AddAItem(newItem); auctionHouse->AddAuction(AH); diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index e2537d84149..6ad0c7c0b2b 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -219,7 +219,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recvData) if (grp->GetLeaderGUID() != _player->GetGUID()) return; - + err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam()); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index a82496c1335..4b830505467 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -137,7 +137,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } } -<<<<<<< HEAD if (lang == LANG_ADDON) { // LANG_ADDON is only valid for the following message types @@ -164,7 +163,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) return; break; default: - sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (GUID: %u) sent a chatmessage with an invalid language/message type combination", + sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (GUID: %u) sent a chatmessage with an invalid language/message type combination", GetPlayer()->GetName().c_str(), GetPlayer()->GetGUIDLow()); recvData.rfinish(); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index e27118db6ac..f97216f2169 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -33,8 +33,8 @@ void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket) uint64 guildGuid, playerGuid; recvPacket >> guildGuid >> playerGuid; - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY [%s]: Guild: " UI64FMTD " Target: ", - GetPlayerInfo().c_str(), guildGuid, playerGuid); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY [%s]: Guild: %u Target: %u", + GetPlayerInfo().c_str(), GUID_LOPART(guildGuid), GUID_LOPART(playerGuid)); if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid)) if (guild->IsMember(playerGuid)) @@ -74,7 +74,7 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) recvPacket.ReadByteSeq(playerGuid[3]); recvPacket.ReadByteSeq(playerGuid[0]); - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_REMOVE [%s]: Target: " UI64FMTD, GetPlayerInfo().c_str(), playerGuid); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_REMOVE [%s]: Target: %u", GetPlayerInfo().c_str(), GUID_LOPART(playerGuid)); if (Guild* guild = GetPlayer()->GetGuild()) guild->HandleRemoveMember(this, playerGuid); @@ -82,7 +82,7 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/) { - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ACCEPT [%s]", GetPlayer()->GetName().c_str()); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ACCEPT [%s]", GetPlayerInfo().c_str()); if (!GetPlayer()->GetGuildId()) if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildIdInvited())) @@ -130,7 +130,7 @@ void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket) recvPacket.ReadByteSeq(targetGuid[1]); recvPacket.ReadByteSeq(targetGuid[7]); - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_PROMOTE [%s]: Target: " UI64FMTD, GetPlayerInfo().c_str(), targetGuid); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_PROMOTE [%s]: Target: %u", GetPlayerInfo().c_str(), GUID_LOPART(targetGuid)); if (Guild* guild = GetPlayer()->GetGuild()) guild->HandleUpdateMemberRank(this, targetGuid, false); @@ -158,7 +158,7 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket) recvPacket.ReadByteSeq(targetGuid[4]); recvPacket.ReadByteSeq(targetGuid[3]); - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_DEMOTE [%s]: Target: " UI64FMTD, GetPlayerInfo().c_str(), targetGuid); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_DEMOTE [%s]: Target: %u", GetPlayerInfo().c_str(), GUID_LOPART(targetGuid)); if (Guild* guild = GetPlayer()->GetGuild()) guild->HandleUpdateMemberRank(this, targetGuid, true); @@ -206,8 +206,8 @@ void WorldSession::HandleGuildAssignRankOpcode(WorldPacket& recvPacket) recvPacket.ReadByteSeq(targetGuid[6]); recvPacket.ReadByteSeq(setterGuid[7]); - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ASSIGN_MEMBER_RANK [%s]: Target: " UI64FMTD " Rank: %u, Issuer " UI64FMTD, - GetPlayerInfo().c_str(), targetGuid, rankId, setterGuid); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ASSIGN_MEMBER_RANK [%s]: Target: %u Rank: %u, Issuer: %u", + GetPlayerInfo().c_str(), GUID_LOPART(targetGuid), rankId, GUID_LOPART(setterGuid)); if (Guild* guild = GetPlayer()->GetGuild()) guild->HandleSetMemberRank(this, targetGuid, setterGuid, rankId); @@ -261,7 +261,7 @@ void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket) playerGuid[3] = recvPacket.ReadBit(); playerGuid[0] = recvPacket.ReadBit(); playerGuid[7] = recvPacket.ReadBit(); - bool type = recvPacket.ReadBit(); // 0 == Officer, 1 == Public + bool ispublic = recvPacket.ReadBit(); // 0 == Officer, 1 == Public playerGuid[6] = recvPacket.ReadBit(); uint32 noteLength = recvPacket.ReadBits(8); playerGuid[2] = recvPacket.ReadBit(); @@ -276,37 +276,37 @@ void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket) std::string note = recvPacket.ReadString(noteLength); recvPacket.ReadByteSeq(playerGuid[2]); - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_SET_NOTE [%s]: Target: " UI64FMTD ", Note: %s, Public: %u", - GetPlayerInfo().c_str(), playerGuid, note.c_str(), type); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_SET_NOTE [%s]: Target: %u, Note: %s, Public: %u", + GetPlayerInfo().c_str(), GUID_LOPART(playerGuid), note.c_str(), ispublic); if (Guild* guild = GetPlayer()->GetGuild()) - guild->HandleSetMemberNote(this, note, playerGuid, type); + guild->HandleSetMemberNote(this, note, playerGuid, ispublic); } -void WorldSession::HandleGuildQueryRanksOpcode(WorldPacket& recvData) +void WorldSession::HandleGuildQueryRanksOpcode(WorldPacket& recvPacket) { ObjectGuid guildGuid; - guildGuid[2] = recvData.ReadBit(); - guildGuid[3] = recvData.ReadBit(); - guildGuid[0] = recvData.ReadBit(); - guildGuid[6] = recvData.ReadBit(); - guildGuid[4] = recvData.ReadBit(); - guildGuid[7] = recvData.ReadBit(); - guildGuid[5] = recvData.ReadBit(); - guildGuid[1] = recvData.ReadBit(); - - recvData.ReadByteSeq(guildGuid[3]); - recvData.ReadByteSeq(guildGuid[4]); - recvData.ReadByteSeq(guildGuid[5]); - recvData.ReadByteSeq(guildGuid[7]); - recvData.ReadByteSeq(guildGuid[1]); - recvData.ReadByteSeq(guildGuid[0]); - recvData.ReadByteSeq(guildGuid[6]); - recvData.ReadByteSeq(guildGuid[2]); - - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY_RANKS [%s]: Guild: " UI64FMTD, - GetPlayerInfo().c_str(), guildGuid); + guildGuid[2] = recvPacket.ReadBit(); + guildGuid[3] = recvPacket.ReadBit(); + guildGuid[0] = recvPacket.ReadBit(); + guildGuid[6] = recvPacket.ReadBit(); + guildGuid[4] = recvPacket.ReadBit(); + guildGuid[7] = recvPacket.ReadBit(); + guildGuid[5] = recvPacket.ReadBit(); + guildGuid[1] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guildGuid[3]); + recvPacket.ReadByteSeq(guildGuid[4]); + recvPacket.ReadByteSeq(guildGuid[5]); + recvPacket.ReadByteSeq(guildGuid[7]); + recvPacket.ReadByteSeq(guildGuid[1]); + recvPacket.ReadByteSeq(guildGuid[0]); + recvPacket.ReadByteSeq(guildGuid[6]); + recvPacket.ReadByteSeq(guildGuid[2]); + + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY_RANKS [%s]: Guild: %u", + GetPlayerInfo().c_str(), GUID_LOPART(guildGuid)); if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid)) if (guild->IsMember(_player->GetGUID())) @@ -386,7 +386,7 @@ void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */) guild->SendEventLog(this); } -void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket & /* recvData */) +void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket& /* recvPacket */) { sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_MONEY_WITHDRAWN [%s]", GetPlayerInfo().c_str()); @@ -394,7 +394,7 @@ void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket & /* recvData */) guild->SendMoneyInfo(this); } -void WorldSession::HandleGuildPermissions(WorldPacket& /* recvData */) +void WorldSession::HandleGuildPermissions(WorldPacket& /* recvPacket */) { sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_PERMISSIONS [%s]", GetPlayerInfo().c_str()); @@ -403,46 +403,51 @@ void WorldSession::HandleGuildPermissions(WorldPacket& /* recvData */) } // Called when clicking on Guild bank gameobject -void WorldSession::HandleGuildBankerActivate(WorldPacket& recvData) +void WorldSession::HandleGuildBankerActivate(WorldPacket& recvPacket) { uint64 guid; bool sendAllSlots; - recvData >> guid >> sendAllSlots; + recvPacket >> guid >> sendAllSlots; sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANKER_ACTIVATE [%s]: Go: [" UI64FMTD "] AllSlots: %u" , GetPlayerInfo().c_str(), guid, sendAllSlots); - if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK)) + GameObject const * const go = GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK); + if (!go) + return; + + Guild * const guild = GetPlayer()->GetGuild(); + if (!guild) { - if (Guild* guild = GetPlayer()->GetGuild()) - guild->SendBankList(this, 0, true, true); - else - Guild::SendCommandResult(this, GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD); + Guild::SendCommandResult(this, GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD); + return; } + + guild->SendBankList(this, 0, true, true); } // Called when opening guild bank tab only (first one) -void WorldSession::HandleGuildBankQueryTab(WorldPacket& recvData) +void WorldSession::HandleGuildBankQueryTab(WorldPacket& recvPacket) { uint64 guid; uint8 tabId; - bool full; + bool sendAllSlots; - recvData >> guid >> tabId >> full; + recvPacket >> guid >> tabId >> sendAllSlots; - sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_QUERY_TAB [%s]: Go: [" UI64FMTD "], TabId: %u, ShowTabs: %u" - , GetPlayerInfo().c_str(), guid, tabId, full); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_QUERY_TAB [%s]: Go: [" UI64FMTD "], TabId: %u, AllSlots: %u" + , GetPlayerInfo().c_str(), guid, tabId, sendAllSlots); if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK)) if (Guild* guild = GetPlayer()->GetGuild()) guild->SendBankList(this, tabId, true, false); } -void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvData) +void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvPacket) { uint64 guid; uint64 money; - recvData >> guid >> money; + recvPacket >> guid >> money; sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_DEPOSIT_MONEY [%s]: Go: [" UI64FMTD "], money: " UI64FMTD, GetPlayerInfo().c_str(), guid, money); @@ -453,11 +458,11 @@ void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvData) guild->HandleMemberDepositMoney(this, money); } -void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvData) +void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvPacket) { uint64 guid; uint64 money; - recvData >> guid >> money; + recvPacket >> guid >> money; sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_WITHDRAW_MONEY [%s]: Go: [" UI64FMTD "], money: " UI64FMTD, GetPlayerInfo().c_str(), guid, money); @@ -467,28 +472,28 @@ void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvData) guild->HandleMemberWithdrawMoney(this, money); } -void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData) +void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_SWAP_ITEMS [%s]", GetPlayerInfo().c_str()); uint64 GoGuid; - recvData >> GoGuid; + recvPacket >> GoGuid; if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK)) { - recvData.rfinish(); // Prevent additional spam at rejected packet + recvPacket.rfinish(); // Prevent additional spam at rejected packet return; } Guild* guild = GetPlayer()->GetGuild(); if (!guild) { - recvData.rfinish(); // Prevent additional spam at rejected packet + recvPacket.rfinish(); // Prevent additional spam at rejected packet return; } uint8 bankToBank; - recvData >> bankToBank; + recvPacket >> bankToBank; uint8 tabId; uint8 slotId; @@ -498,19 +503,19 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData) if (bankToBank) { uint8 destTabId; - recvData >> destTabId; + recvPacket >> destTabId; uint8 destSlotId; - recvData >> destSlotId; + recvPacket >> destSlotId; uint32 destItemEntry; - recvData >> destItemEntry; + recvPacket >> destItemEntry; - recvData >> tabId; - recvData >> slotId; - recvData >> itemEntry; - recvData.read_skip(); // Always 0 - recvData >> splitedAmount; + recvPacket >> tabId; + recvPacket >> slotId; + recvPacket >> itemEntry; + recvPacket.read_skip(); // Always 0 + recvPacket >> splitedAmount; guild->SwapItems(GetPlayer(), tabId, slotId, destTabId, destSlotId, splitedAmount); } @@ -520,24 +525,24 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData) uint8 playerSlotId = NULL_SLOT; uint8 toChar = 1; - recvData >> tabId; - recvData >> slotId; - recvData >> itemEntry; + recvPacket >> tabId; + recvPacket >> slotId; + recvPacket >> itemEntry; uint8 autoStore; - recvData >> autoStore; + recvPacket >> autoStore; if (autoStore) { - recvData.read_skip(); // autoStoreCount - recvData.read_skip(); // ToChar (?), always and expected to be 1 (autostore only triggered in Bank -> Char) - recvData.read_skip(); // Always 0 + recvPacket.read_skip(); // autoStoreCount + recvPacket.read_skip(); // ToChar (?), always and expected to be 1 (autostore only triggered in Bank -> Char) + recvPacket.read_skip(); // Always 0 } else { - recvData >> playerBag; - recvData >> playerSlotId; - recvData >> toChar; - recvData >> splitedAmount; + recvPacket >> playerBag; + recvPacket >> playerSlotId; + recvPacket >> toChar; + recvPacket >> splitedAmount; } // Player <-> Bank @@ -549,13 +554,13 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData) } } -void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvData) +void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvPacket) { uint64 guid; - recvData >> guid; + recvPacket >> guid; uint8 tabId; - recvData >> tabId; + recvPacket >> tabId; sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_BUY_TAB [%s]: Go: [" UI64FMTD "], TabId: %u", GetPlayerInfo().c_str(), guid, tabId); @@ -564,13 +569,13 @@ void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvData) guild->HandleBuyBankTab(this, tabId); } -void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvData) +void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvPacket) { uint64 guid; uint8 tabId; std::string name, icon; - recvData >> guid >> tabId >> name >> icon; + recvPacket >> guid >> tabId >> name >> icon; sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_UPDATE_TAB [%s]: Go: [" UI64FMTD "], TabId: %u, Name: %s, Icon: %s" , GetPlayerInfo().c_str(), guid, tabId, name.c_str(), icon.c_str()); @@ -580,10 +585,10 @@ void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvData) guild->HandleSetBankTabInfo(this, tabId, name, icon); } -void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvData) +void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvPacket) { uint32 tabId; - recvData >> tabId; + recvPacket >> tabId; sLog->outDebug(LOG_FILTER_GUILD, "MSG_GUILD_BANK_LOG_QUERY [%s]: TabId: %u", GetPlayerInfo().c_str(), tabId); @@ -591,10 +596,10 @@ void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvData) guild->SendBankLog(this, tabId); } -void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvData) +void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvPacket) { uint8 tabId; - recvData >> tabId; + recvPacket >> tabId; sLog->outDebug(LOG_FILTER_GUILD, "MSG_QUERY_GUILD_BANK_TEXT [%s]: TabId: %u", GetPlayerInfo().c_str(), tabId); @@ -602,13 +607,13 @@ void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvData) guild->SendBankTabText(this, tabId); } -void WorldSession::HandleSetGuildBankTabText(WorldPacket& recvData) +void WorldSession::HandleSetGuildBankTabText(WorldPacket& recvPacket) { uint32 tabId; - recvData >> tabId; + recvPacket >> tabId; - uint32 textLen = recvData.ReadBits(14); - std::string text = recvData.ReadString(textLen); + uint32 textLen = recvPacket.ReadBits(14); + std::string text = recvPacket.ReadString(textLen); sLog->outDebug(LOG_FILTER_GUILD, "CMSG_SET_GUILD_BANK_TEXT [%s]: TabId: %u, Text: %s", GetPlayerInfo().c_str(), tabId, text.c_str()); @@ -640,6 +645,8 @@ void WorldSession::HandleGuildQueryXPOpcode(WorldPacket& recvPacket) recvPacket.ReadByteSeq(guildGuid[0]); recvPacket.ReadByteSeq(guildGuid[4]); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_QUERY_GUILD_XP [%s]: Guild: %u", GetPlayerInfo().c_str(), GUID_LOPART(guildGuid)); + if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid)) if (guild->IsMember(_player->GetGUID())) guild->SendGuildXP(this); @@ -647,8 +654,6 @@ void WorldSession::HandleGuildQueryXPOpcode(WorldPacket& recvPacket) void WorldSession::HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_SET_RANK_PERMISSIONS"); - Guild* guild = GetPlayer()->GetGuild(); if (!guild) { @@ -656,13 +661,13 @@ void WorldSession::HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket) return; } - uint32 unk; - uint32 rankId; + uint32 oldRankId; + uint32 newRankId; uint32 oldRights; uint32 newRights; uint32 moneyPerDay; - recvPacket >> unk; + recvPacket >> oldRankId; recvPacket >> oldRights; recvPacket >> newRights; @@ -679,36 +684,38 @@ void WorldSession::HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket) } recvPacket >> moneyPerDay; - recvPacket >> rankId; + recvPacket >> newRankId; uint32 nameLength = recvPacket.ReadBits(7); std::string rankName = recvPacket.ReadString(nameLength); - guild->HandleSetRankInfo(this, rankId, rankName, newRights, moneyPerDay, rightsAndSlots); + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_SET_RANK_PERMISSIONS [%s]: Rank: %s (%u)", GetPlayerInfo().c_str(), rankName.c_str(), newRankId); + + guild->HandleSetRankInfo(this, newRankId, rankName, newRights, moneyPerDay, rightsAndSlots); } -void WorldSession::HandleGuildRequestPartyState(WorldPacket& recvData) +void WorldSession::HandleGuildRequestPartyState(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_REQUEST_PARTY_STATE"); ObjectGuid guildGuid; - guildGuid[0] = recvData.ReadBit(); - guildGuid[6] = recvData.ReadBit(); - guildGuid[7] = recvData.ReadBit(); - guildGuid[3] = recvData.ReadBit(); - guildGuid[5] = recvData.ReadBit(); - guildGuid[1] = recvData.ReadBit(); - guildGuid[2] = recvData.ReadBit(); - guildGuid[4] = recvData.ReadBit(); - - recvData.ReadByteSeq(guildGuid[6]); - recvData.ReadByteSeq(guildGuid[3]); - recvData.ReadByteSeq(guildGuid[2]); - recvData.ReadByteSeq(guildGuid[1]); - recvData.ReadByteSeq(guildGuid[5]); - recvData.ReadByteSeq(guildGuid[0]); - recvData.ReadByteSeq(guildGuid[7]); - recvData.ReadByteSeq(guildGuid[4]); + guildGuid[0] = recvPacket.ReadBit(); + guildGuid[6] = recvPacket.ReadBit(); + guildGuid[7] = recvPacket.ReadBit(); + guildGuid[3] = recvPacket.ReadBit(); + guildGuid[5] = recvPacket.ReadBit(); + guildGuid[1] = recvPacket.ReadBit(); + guildGuid[2] = recvPacket.ReadBit(); + guildGuid[4] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guildGuid[6]); + recvPacket.ReadByteSeq(guildGuid[3]); + recvPacket.ReadByteSeq(guildGuid[2]); + recvPacket.ReadByteSeq(guildGuid[1]); + recvPacket.ReadByteSeq(guildGuid[5]); + recvPacket.ReadByteSeq(guildGuid[0]); + recvPacket.ReadByteSeq(guildGuid[7]); + recvPacket.ReadByteSeq(guildGuid[4]); if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid)) guild->HandleGuildPartyRequest(this); @@ -783,13 +790,9 @@ void WorldSession::HandleGuildRewardsQueryOpcode(WorldPacket& recvPacket) void WorldSession::HandleGuildQueryNewsOpcode(WorldPacket& recvPacket) { recvPacket.read_skip(); - - if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) - { - WorldPacket data; - guild->GetNewsLog().BuildNewsData(data); - SendPacket(&data); - } + sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY_NEWS [%s]", GetPlayerInfo().c_str()); + if (Guild* guild = GetPlayer()->GetGuild()) + guild->SendNewsUpdate(this); } void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket) @@ -819,18 +822,6 @@ void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket) recvPacket.ReadByteSeq(guid[7]); recvPacket.ReadByteSeq(guid[4]); - if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) - { - if (GuildNewsEntry* newsEntry = guild->GetNewsLog().GetNewsById(newsId)) - { - if (sticky) - newsEntry->Flags |= 1; - else - newsEntry->Flags &= ~1; - - WorldPacket data; - guild->GetNewsLog().BuildNewsData(newsId, *newsEntry, data); - SendPacket(&data); - } - } + if (Guild* guild = GetPlayer()->GetGuild()) + guild->HandleNewsSetSticky(this, newsId, sticky); } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 5e568a90d85..ea96f4051a7 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -814,7 +814,7 @@ void WorldSession::SendListInventory(uint64 vendorGuid) uint32 precision = (currencyTemplate->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1; ++count; - itemsData << uint32(slot + 1); // client expects counting to start at 1 + itemsData << uint32(slot + 1); // client expects counting to start at 1 itemsData << uint32(0); // max durability if (vendorItem->ExtendedCost != 0) diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index d7798f18f99..5df7b20b596 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -412,8 +412,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recvData) player->SendMailResult(mailId, MAIL_RETURNED_TO_SENDER, MAIL_ERR_INTERNAL_ERROR); return; } - //we can return mail now - //so firstly delete the old one + //we can return mail now, so firstly delete the old one SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); @@ -437,14 +436,8 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recvData) { for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2) { - Item* item = player->GetMItem(itr2->item_guid); - if (item) + if (Item * const item = player->GetMItem(itr2->item_guid)) draft.AddItem(item); - else - { - //WTF? - } - player->RemoveMItem(itr2->item_guid); } } @@ -652,10 +645,10 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData) case MAIL_CREATURE: case MAIL_GAMEOBJECT: case MAIL_AUCTION: - data << uint32((*itr)->sender); // creature/gameobject entry, auction id + data << uint32((*itr)->sender); // creature/gameobject entry, auction id break; - case MAIL_ITEM: // item entry (?) sender = "Unknown", NYI - data << uint32(0); // item entry + case MAIL_ITEM: // item entry (?) sender = "Unknown", NYI + data << uint32(0); // item entry break; } @@ -685,6 +678,7 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData) data << uint32((item ? item->GetEnchantmentDuration((EnchantmentSlot)j) : 0)); data << uint32((item ? item->GetEnchantmentCharges((EnchantmentSlot)j) : 0)); } + // can be negative data << int32((item ? item->GetItemRandomPropertyId() : 0)); // unk @@ -780,7 +774,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket& recvData) } //TODO Fix me! ... this void has probably bad condition, but good data are sent -void WorldSession::HandleQueryNextMailTime(WorldPacket & /*recvData*/) +void WorldSession::HandleQueryNextMailTime(WorldPacket& /*recvData*/) { WorldPacket data(MSG_QUERY_NEXT_MAIL_TIME, 8); diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 73232320d43..2b9cf4a9b6d 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -398,7 +398,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) if (plrMover) // nothing is charmed, or player charmed { plrMover->UpdateFallInformationIfNeed(movementInfo, opcode); - + AreaTableEntry const* zone = GetAreaEntryByAreaID(plrMover->GetAreaId()); float depth = zone ? zone->MaxDepth : -500.0f; if (movementInfo.pos.GetPositionZ() < depth) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 93a911459c9..4159b58554c 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -3355,8 +3355,12 @@ enum PetDiet #define CHAIN_SPELL_JUMP_RADIUS 8 -#define GUILD_BANKLOG_MAX_RECORDS 25 -#define GUILD_EVENTLOG_MAX_RECORDS 100 +enum GuildLogs +{ + GUILD_BANKLOG_MAX_RECORDS = 25, + GUILD_EVENTLOG_MAX_RECORDS = 100, + GUILD_NEWSLOG_MAX_RECORDS = 250 +}; enum AiReaction { diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 1a565dacad9..89c698744a3 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3488,7 +3488,7 @@ void Spell::_handle_finish_phase() // Real add combo points from effects if (m_comboPointGain) m_caster->m_movedPlayer->GainSpellComboPoints(m_comboPointGain); - + if (m_spellInfo->PowerType == POWER_HOLY_POWER && m_caster->m_movedPlayer->getClass() == CLASS_PALADIN) HandleHolyPower(m_caster->m_movedPlayer); } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 27abe8ebc6e..56aa88852a9 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1577,10 +1577,6 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) // create the new item and store it Item* pItem = player->StoreNewItem(dest, newitemid, true, Item::GenerateItemRandomPropertyId(newitemid)); - if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) - if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) - guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_CRAFTED, time(NULL), player->GetGUID(), 0, pProto->ItemId); - // was it successful? return error if not if (!pItem) { @@ -1595,6 +1591,11 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) // send info to the client player->SendNewItem(pItem, num_to_add, true, bgType == 0); + if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) + if (Guild* guild = player->GetGuild()) + guild->AddGuildNews(GUILD_NEWS_ITEM_CRAFTED, player->GetGUID(), 0, pProto->ItemId); + + // we succeeded in creating at least one item, so a levelup is possible if (bgType == 0) player->UpdateCraftSkill(m_spellInfo->Id); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 75f5dd1c807..39512aa155e 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1054,6 +1054,9 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_INSTANT_LOGOUT] = ConfigMgr::GetIntDefault("InstantLogout", SEC_MODERATOR); + m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] = ConfigMgr::GetIntDefault("Guild.NewsLogRecordsCount", GUILD_NEWSLOG_MAX_RECORDS); + if (m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] > GUILD_NEWSLOG_MAX_RECORDS) + m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] = GUILD_NEWSLOG_MAX_RECORDS; m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = ConfigMgr::GetIntDefault("Guild.EventLogRecordsCount", GUILD_EVENTLOG_MAX_RECORDS); if (m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] > GUILD_EVENTLOG_MAX_RECORDS) m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = GUILD_EVENTLOG_MAX_RECORDS; diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 1f90c169fa6..230f96e4997 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -308,6 +308,7 @@ enum WorldIntConfigs CONFIG_LOGDB_CLEARINTERVAL, CONFIG_LOGDB_CLEARTIME, CONFIG_CLIENTCACHE_VERSION, + CONFIG_GUILD_NEWS_LOG_COUNT, CONFIG_GUILD_EVENT_LOG_COUNT, CONFIG_GUILD_BANK_EVENT_LOG_COUNT, CONFIG_MIN_LEVEL_STAT_SAVE, diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 5ddfe1f4dc5..af508dd1fca 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -49,7 +49,7 @@ enum ShamanSpells SHAMAN_LAVA_FLOWS_R1 = 51480, SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264, SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC = 52752, - + ICON_ID_SOOTHING_RAIN = 2011, SPELL_HEALING_STREAM_TOTEM_HEAL = 52042, }; diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 96a282d9c85..91941a02df6 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -201,7 +201,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC) // 0: string, 1: uint32, 2: uint8 PREPARE_STATEMENT(CHAR_INS_GUILD_MEMBER_WITHDRAW, - "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, tab6, tab7, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?) " + "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, tab6, tab7, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " "ON DUPLICATE KEY UPDATE tab0 = VALUES (tab0), tab1 = VALUES (tab1), tab2 = VALUES (tab2), tab3 = VALUES (tab3), tab4 = VALUES (tab4), tab5 = VALUES (tab5), tab6 = VALUES (tab6), tab7 = VALUES (tab7)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_GUILD_MEMBER_WITHDRAW, "TRUNCATE guild_member_withdraw", CONNECTION_ASYNC) @@ -217,8 +217,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA, "SELECT criteria, counter, date, completedGuid FROM guild_achievement_progress WHERE guildId = ?", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_UPD_GUILD_EXPERIENCE, "UPDATE guild SET level = ?, experience = ?, todayExperience = ? WHERE guildId = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_UPD_GUILD_RESET_TODAY_EXPERIENCE, "UPDATE guild SET todayExperience = 0", CONNECTION_ASYNC); - PREPARE_STATEMENT(CHAR_LOAD_GUILD_NEWS, "SELECT id, eventType, playerGuid, data, flags, date FROM guild_news_log WHERE guild = ? ORDER BY guild ASC, id ASC", CONNECTION_SYNCH); - PREPARE_STATEMENT(CHAR_SAVE_GUILD_NEWS, "INSERT INTO guild_news_log (guild, id, eventType, playerGuid, data, flags, date) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_INS_GUILD_NEWS, "INSERT INTO guild_newslog (guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)" + " ON DUPLICATE KEY UPDATE LogGuid = VALUES (LogGuid), EventType = VALUES (EventType), PlayerGuid = VALUES (PlayerGuid), Flags = VALUES (Flags), Value = VALUES (Value), Timestamp = VALUES (Timestamp)", CONNECTION_ASYNC); // Chat channel handling PREPARE_STATEMENT(CHAR_SEL_CHANNEL, "SELECT announce, ownership, password, bannedList FROM channels WHERE name = ? AND team = ?", CONNECTION_SYNCH) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 80c41122e7c..5a03ee4767c 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -209,8 +209,7 @@ enum CharacterDatabaseStatements CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA, CHAR_UPD_GUILD_EXPERIENCE, CHAR_UPD_GUILD_RESET_TODAY_EXPERIENCE, - CHAR_LOAD_GUILD_NEWS, - CHAR_SAVE_GUILD_NEWS, + CHAR_INS_GUILD_NEWS, CHAR_SEL_CHANNEL, CHAR_INS_CHANNEL, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index e257198745d..0cb6072c244 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -984,6 +984,16 @@ Guild.ResetHour = 6 Guild.BankEventLogRecordsCount = 25 +# +# Guild.Guild.NewsLogRecordsCount +# Description: Number of log entries for guild news that are stored per guild. Old +# entries will be overwritten if the number of log entries exceed the +# configured value. High numbers prevent this behavior but may have performance +# impacts. +# Default: 250 + +Guild.Guild.NewsLogRecordsCount = 250 + # # MaxPrimaryTradeSkill # Description: Maximum number of primary professions a character can learn. -- cgit v1.2.3 From 5fd7d01bde40f5375847e863a9ef7d4f4432a304 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 12 Nov 2012 10:29:52 +0100 Subject: Core/Build: Remove some more unneeded code for OS X from cmake files Core: Minor changes here and there --- dep/StormLib/CMakeLists.txt | 6 ----- src/server/game/Achievements/AchievementMgr.cpp | 21 ++-------------- src/server/game/DataStores/DBCEnums.h | 32 +++++++------------------ src/server/game/Spells/Auras/SpellAuraDefines.h | 4 ++-- src/server/game/Spells/SpellMgr.cpp | 4 ++-- src/server/game/World/World.cpp | 5 +--- src/server/scripts/Events/event.cpp | 2 -- src/server/worldserver/CMakeLists.txt | 1 - src/tools/vmap4_assembler/CMakeLists.txt | 4 ---- 9 files changed, 16 insertions(+), 63 deletions(-) (limited to 'src/server/scripts') diff --git a/dep/StormLib/CMakeLists.txt b/dep/StormLib/CMakeLists.txt index a6735e0a6a0..7096c8f8729 100644 --- a/dep/StormLib/CMakeLists.txt +++ b/dep/StormLib/CMakeLists.txt @@ -262,12 +262,6 @@ endif() add_library(storm STATIC ${SRC_FILES} ${SRC_ADDITIONAL_FILES}) target_link_libraries(storm ${LINK_LIBS}) -if(APPLE) - set_target_properties(storm PROPERTIES FRAMEWORK true) - set_target_properties(storm PROPERTIES PUBLIC_HEADER "src/StormLib.h src/StormPort.h") - set_target_properties(storm PROPERTIES LINK_FLAGS "-framework Carbon") -endif() - if(UNIX) set_target_properties(storm PROPERTIES SOVERSION 0) endif() diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 0c46cee8470..436d3851d43 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1404,25 +1404,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS: - case ACHIEVEMENT_CRITERIA_TYPE_UNK118: - case ACHIEVEMENT_CRITERIA_TYPE_UNK120: - case ACHIEVEMENT_CRITERIA_TYPE_UNK121: - case ACHIEVEMENT_CRITERIA_TYPE_UNK122: - case ACHIEVEMENT_CRITERIA_TYPE_UNK123: - case ACHIEVEMENT_CRITERIA_TYPE_UNK137: - case ACHIEVEMENT_CRITERIA_TYPE_UNK138: - case ACHIEVEMENT_CRITERIA_TYPE_UNK139: - case ACHIEVEMENT_CRITERIA_TYPE_UNK140: - case ACHIEVEMENT_CRITERIA_TYPE_UNK141: - case ACHIEVEMENT_CRITERIA_TYPE_UNK142: - case ACHIEVEMENT_CRITERIA_TYPE_UNK143: - case ACHIEVEMENT_CRITERIA_TYPE_UNK144: - case ACHIEVEMENT_CRITERIA_TYPE_UNK145: - case ACHIEVEMENT_CRITERIA_TYPE_UNK146: - case ACHIEVEMENT_CRITERIA_TYPE_UNK147: - case ACHIEVEMENT_CRITERIA_TYPE_UNK148: - case ACHIEVEMENT_CRITERIA_TYPE_UNK149: - case ACHIEVEMENT_CRITERIA_TYPE_UNK150: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE: break; // Not implemented yet :( } diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 8f4415631b4..5217fa0d979 100755 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -77,7 +77,7 @@ enum AchievementFlags ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER = 0x00002000, // Shows in guild news header ACHIEVEMENT_FLAG_GUILD = 0x00004000, // ACHIEVEMENT_FLAG_SHOW_GUILD_MEMBERS = 0x00008000, // - ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS = 0x00010000, // + ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS = 0x00010000 // }; enum @@ -90,12 +90,14 @@ enum AchievementCriteriaCondition { ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death - ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days" + ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 2, // only used in "Complete a daily quest every day for five consecutive days" ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP = 3, // requires you to be on specific map, reset at change ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE = 4, // only used in "Win 10 arenas without losing" + ACHIEVEMENT_CRITERIA_CONDITION_UNK5 = 5, // Have spell? + ACHIEVEMENT_CRITERIA_CONDITION_UNK8 = 8, ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT = 9, // requires the player not to be hit by specific spell ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP = 10, // requires the player not to be in group - ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13 // unk + ACHIEVEMENT_CRITERIA_CONDITION_UNK13 = 13 // unk }; enum AchievementCriteriaAdditionalCondition @@ -234,6 +236,7 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72, + // TODO 73: Achievements 1515, 1241, 1103 (Name: Mal'Ganis) ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE = 74, // TODO: title id is not mentioned in dbc ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76, @@ -266,12 +269,7 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113, ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114, ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115, - ACHIEVEMENT_CRITERIA_TYPE_UNK118 = 118, ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS = 119, - ACHIEVEMENT_CRITERIA_TYPE_UNK120 = 120, - ACHIEVEMENT_CRITERIA_TYPE_UNK121 = 121, - ACHIEVEMENT_CRITERIA_TYPE_UNK122 = 122, - ACHIEVEMENT_CRITERIA_TYPE_UNK123 = 123, ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124, ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125, ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126, @@ -284,23 +282,11 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136, - ACHIEVEMENT_CRITERIA_TYPE_UNK137 = 137, - ACHIEVEMENT_CRITERIA_TYPE_UNK138 = 138, //struct { Flag flag; uint32 count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild battlefield - ACHIEVEMENT_CRITERIA_TYPE_UNK139 = 139, //struct { uint32 count; } Guild Challenge - ACHIEVEMENT_CRITERIA_TYPE_UNK140 = 140, - ACHIEVEMENT_CRITERIA_TYPE_UNK141 = 141, - ACHIEVEMENT_CRITERIA_TYPE_UNK142 = 142, - ACHIEVEMENT_CRITERIA_TYPE_UNK143 = 143, - ACHIEVEMENT_CRITERIA_TYPE_UNK144 = 144, - ACHIEVEMENT_CRITERIA_TYPE_UNK145 = 145, - ACHIEVEMENT_CRITERIA_TYPE_UNK146 = 146, - ACHIEVEMENT_CRITERIA_TYPE_UNK147 = 147, - ACHIEVEMENT_CRITERIA_TYPE_UNK148 = 148, - ACHIEVEMENT_CRITERIA_TYPE_UNK149 = 149, - ACHIEVEMENT_CRITERIA_TYPE_UNK150 = 150, + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE = 138, //struct { Flag flag; uint32 count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild battlefield + ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE = 139 //struct { uint32 count; } Guild Challenge }; -#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL 151 +#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL 140 enum AreaFlags { diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index c198f4c178b..84a25158e8a 100755 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -289,7 +289,7 @@ enum AuraType SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE = 227, SPELL_AURA_DETECT_STEALTH = 228, SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE = 229, - SPELL_AURA_230 = 230, + SPELL_AURA_MOD_MAX_HEALTH = 230, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE = 231, SPELL_AURA_MECHANIC_DURATION_MOD = 232, SPELL_AURA_CHANGE_MODEL_FOR_ALL_HUMANOIDS = 233, // client-side only @@ -417,7 +417,7 @@ enum AuraType SPELL_AURA_355 = 355, SPELL_AURA_356 = 356, // Arcane Mage mastery - mod damage based on current mana SPELL_AURA_ENABLE_BOSS1_UNIT_FRAME = 357, - SPELL_AURA_358 = 358, + SPELL_AURA_WORGEN_ALTERED_FORM = 358, SPELL_AURA_359 = 359, SPELL_AURA_PROC_TRIGGER_SPELL_COPY = 360, // Procs the same spell that caused this proc (Dragonwrath, Tarecgosa's Rest) SPELL_AURA_PROC_TRIGGER_SPELL_2 = 361, diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 337f7293cec..a596d4bf076 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1424,10 +1424,10 @@ void SpellMgr::LoadSpellLearnSpells() { Field* fields = result->Fetch(); - uint32 spell_id = fields[0].GetUInt16(); + uint32 spell_id = fields[0].GetUInt32(); SpellLearnSpellNode node; - node.spell = fields[1].GetUInt16(); + node.spell = fields[1].GetUInt32(); node.active = fields[2].GetBool(); node.autoLearned = false; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 39512aa155e..dc64c607c62 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1888,7 +1888,6 @@ void World::LoadAutobroadcasts() if (!result) { sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 autobroadcasts definitions. DB table `autobroadcast` is empty!"); - return; } @@ -1896,7 +1895,6 @@ void World::LoadAutobroadcasts() do { - Field* fields = result->Fetch(); std::string message = fields[0].GetString(); @@ -1905,8 +1903,7 @@ void World::LoadAutobroadcasts() ++count; } while (result->NextRow()); - sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u autobroadcasts definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u autobroadcast definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } /// Update the World ! diff --git a/src/server/scripts/Events/event.cpp b/src/server/scripts/Events/event.cpp index 22334f8d365..d77ef2b78c1 100644 --- a/src/server/scripts/Events/event.cpp +++ b/src/server/scripts/Events/event.cpp @@ -15,8 +15,6 @@ * with this program. If not, see . */ -#include "ScriptPCH.h" - void AddSC_event_childrens_week(); void AddSC_event_scripts() diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index 0ea5a562732..0ab3d7715c7 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -149,7 +149,6 @@ endif() add_dependencies(worldserver revision.h) - if( UNIX AND NOT NOJEM ) set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}") endif() diff --git a/src/tools/vmap4_assembler/CMakeLists.txt b/src/tools/vmap4_assembler/CMakeLists.txt index f0f2e88c471..871624620ce 100644 --- a/src/tools/vmap4_assembler/CMakeLists.txt +++ b/src/tools/vmap4_assembler/CMakeLists.txt @@ -24,10 +24,6 @@ add_definitions(-DNO_CORE_FUNCS) add_executable(vmap4assembler VMapAssembler.cpp) add_dependencies(vmap4assembler storm) -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set_target_properties(vmap4assembler PROPERTIES LINK_FLAGS "-framework Carbon") -endif() - target_link_libraries(vmap4assembler collision g3dlib -- cgit v1.2.3 From f53a04add0931fd059861fd530f368e9c0a6b3e0 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 12 Nov 2012 10:31:56 +0100 Subject: Core/Scripts: Added Worgen and Goblin races to .pinfo command. --- src/server/scripts/Commands/cs_misc.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index d69e7e1cc6b..cfa5f6d6f3d 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1659,6 +1659,12 @@ public: case RACE_DRAENEI: raceStr = "Draenei"; break; + case RACE_GOBLIN: + raceStr = "Goblin"; + break; + case RACE_WORGEN: + raceStr = "Worgen"; + break; } switch (Class) -- cgit v1.2.3 From 978fc4b7b9c8de757d41dca0c61f1bda5a4e4e6c Mon Sep 17 00:00:00 2001 From: Spp Date: Fri, 16 Nov 2012 09:09:27 +0100 Subject: Fix compile --- src/server/game/Handlers/BattleGroundHandler.cpp | 2 +- src/server/game/Server/WorldSocket.cpp | 2 +- src/server/scripts/Commands/cs_lookup.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 47586c32a2e..7aabd9d4bdf 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -469,7 +469,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) if (action) { sLog->outDebug(LOG_FILTER_BATTLEGROUND, "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u. Cant find BG with id %u!", - GetPlayerInfo().c_str(), queueSlot, unk, time, action); + GetPlayerInfo().c_str(), queueSlot, unk, time, action, ginfo.IsInvitedToBGInstanceGUID); return; } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 5c71c9e503c..df3c2d77c02 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -921,7 +921,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) // Must be done before WorldSession is created if (sWorld->getBoolConfig(CONFIG_WARDEN_ENABLED) && os != "Win" && os != "OSX") { - packet.Initialize(SMSG_AUTH_RESPONSE, 1); + WorldPacket packet(SMSG_AUTH_RESPONSE, 1); packet << uint8(AUTH_REJECT); SendPacket(packet); diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 612e2ecd7ed..e1bf34fb6cf 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -1049,7 +1049,7 @@ public: { if (MapEntry const* mapInfo = sMapStore.LookupEntry(id)) { - std::string name = mapInfo->name[locale]; + std::string name = mapInfo->name; if (name.empty()) continue; -- cgit v1.2.3 From 279b7f4c1029b239000a7db746c361abc639e798 Mon Sep 17 00:00:00 2001 From: Spp Date: Fri, 16 Nov 2012 09:51:44 +0100 Subject: Core/Misc: Minor changes here and there --- src/server/game/Battlefield/Battlefield.cpp | 4 ++ src/server/game/Chat/Chat.cpp | 3 +- src/server/game/Chat/Chat.h | 2 +- src/server/game/Entities/Vehicle/Vehicle.h | 7 ++++ src/server/game/Miscellaneous/Formulas.h | 7 ++-- src/server/game/Miscellaneous/SharedDefines.h | 5 ++- src/server/game/Movement/MotionMaster.h | 4 +- src/server/game/Server/WorldSession.cpp | 33 ++++++++++------ src/server/game/Spells/Auras/SpellAuraEffects.cpp | 3 +- src/server/game/Spells/Spell.cpp | 7 ++++ src/server/game/Spells/SpellInfo.cpp | 3 +- src/server/game/Spells/SpellInfo.h | 2 +- src/server/game/Spells/SpellMgr.cpp | 1 + src/server/game/World/World.cpp | 6 +-- src/server/scripts/Commands/cs_wp.cpp | 48 ++++++++++++----------- 15 files changed, 86 insertions(+), 49 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index f1a2e22b34b..f6b3d133cb9 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -408,13 +408,17 @@ void Battlefield::PlayerAcceptInviteToWar(Player* player) void Battlefield::TeamCastSpell(TeamId team, int32 spellId) { if (spellId > 0) + { for (GuidSet::const_iterator itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr) if (Player* player = sObjectAccessor->FindPlayer(*itr)) player->CastSpell(player, uint32(spellId), true); + } else + { for (GuidSet::const_iterator itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr) if (Player* player = sObjectAccessor->FindPlayer(*itr)) player->RemoveAuraFromStack(uint32(-spellId)); + } } void Battlefield::BroadcastPacketToZone(WorldPacket& data) const diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index b120cd5e978..4571f261587 100755 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -63,7 +63,7 @@ ChatCommand* ChatHandler::getCommandTable() // cache for commands, needed because some commands are loaded dynamically through ScriptMgr // cache is never freed and will show as a memory leak in diagnostic tools // can't use vector as vector storage is implementation-dependent, eg, there can be alignment gaps between elements - static ChatCommand* commandTableCache = 0; + static ChatCommand* commandTableCache = NULL; if (LoadCommandTable()) { @@ -96,7 +96,6 @@ ChatCommand* ChatHandler::getCommandTable() std::string name = fields[0].GetString(); SetDataForCommandInTable(commandTableCache, name.c_str(), fields[1].GetUInt8(), fields[2].GetString(), name); - } while (result->NextRow()); } diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index b583d749301..0597ab216ec 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -115,7 +115,7 @@ class ChatHandler bool extractPlayerTarget(char* args, Player** player, uint64* player_guid = NULL, std::string* player_name = NULL); std::string playerLink(std::string const& name) const { return m_session ? "|cffffffff|Hplayer:"+name+"|h["+name+"]|h|r" : name; } - std::string GetNameLink(Player* chr) const { return playerLink(chr->GetName()); } + std::string GetNameLink(Player const* chr) const { return playerLink(chr->GetName()); } GameObject* GetNearbyGameObject(); GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid, uint32 entry); diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 4ad8663a17a..3f1567c74ee 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -20,9 +20,11 @@ #define __TRINITY_VEHICLE_H #include "ObjectDefines.h" +#include "Object.h" #include "VehicleDefines.h" struct VehicleEntry; + class Unit; typedef std::set GuidSet; @@ -58,6 +60,9 @@ class Vehicle : public TransportBase void TeleportVehicle(float x, float y, float z, float ang); bool IsVehicleInUse() { return Seats.begin() != Seats.end(); } + void SetLastShootPos(Position const& pos) { m_lastShootPos.Relocate(pos); } + Position GetLastShootPos() { return m_lastShootPos; } + SeatMap Seats; VehicleSeatEntry const* GetSeatForPassenger(Unit* passenger); @@ -77,5 +82,7 @@ class Vehicle : public TransportBase GuidSet vehiclePlayers; uint32 _usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags uint32 _creatureEntry; // Can be different than me->GetBase()->GetEntry() in case of players + + Position m_lastShootPos; }; #endif diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 212c391d186..3cf4b1f96b7 100755 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -38,7 +38,8 @@ namespace Trinity { return uint32(ceil(hk_honor_at_level_f(level, multiplier))); } - } + } // namespace Trinity::Honor + namespace XP { inline uint8 GetGrayLevel(uint8 pl_level) @@ -221,7 +222,7 @@ namespace Trinity sScriptMgr->OnGroupRateCalculation(rate, count, isRaid); return rate; } - } -} + } // namespace Trinity::XP +} // namespace Trinity #endif diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 908cfe41404..b5b7bb4a6cf 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -594,7 +594,7 @@ enum SpellAttr8 SPELL_ATTR8_RAID_MARKER = 0x04000000, // 26 probably spell no need learn to cast SPELL_ATTR8_UNK27 = 0x08000000, // 27 SPELL_ATTR8_NOT_IN_BG_OR_ARENA = 0x10000000, // 28 not allow to cast or deactivate currently active effect, not sure about Fast Track - SPELL_ATTR8_MASTERY = 0x20000000, // 29 + SPELL_ATTR8_MASTERY_SPECIALIZATION = 0x20000000, // 29 SPELL_ATTR8_UNK30 = 0x40000000, // 30 SPELL_ATTR8_UNK31 = 0x80000000 // 31 }; @@ -3436,7 +3436,8 @@ enum SummonType enum EventId { - EVENT_CHARGE = 1003 + EVENT_CHARGE = 1003, + EVENT_JUMP = 1004 }; enum ResponseCodes diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 8d7fdee7ad2..7037d1316f1 100755 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -163,7 +163,9 @@ class MotionMaster //: private std::stack void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE); void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ); void MoveJumpTo(float angle, float speedXY, float speedZ); - void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = 0); + void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP) + { MoveJump(pos.m_positionX, pos.m_positionY, pos.m_positionZ, speedXY, speedZ, id); }; + void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP); void MoveFall(uint32 id = 0); void MoveSeekAssistance(float x, float y, float z); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 3bdd8e54fc0..72e1a472c06 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -98,18 +98,29 @@ bool WorldSessionFilter::Process(WorldPacket* packet) /// WorldSession constructor WorldSession::WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter): -m_muteTime(mute_time), m_timeOutTime(0), _player(NULL), m_Socket(sock), -_security(sec), _accountId(id), m_expansion(expansion), _logoutTime(0), -m_inQueue(false), m_playerLoading(false), m_playerLogout(false), -m_playerRecentlyLogout(false), m_playerSave(false), -m_sessionDbcLocale(sWorld->GetAvailableDbcLocale(locale)), -m_sessionDbLocaleIndex(locale), -m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter), -isRecruiter(isARecruiter), timeLastWhoCommand(0) + m_muteTime(mute_time), + m_timeOutTime(0), + _player(NULL), + m_Socket(sock), + _security(sec), + _accountId(id), + m_expansion(expansion), + _warden(NULL), + _logoutTime(0), + m_inQueue(false), + m_playerLoading(false), + m_playerLogout(false), + m_playerRecentlyLogout(false), + m_playerSave(false), + m_sessionDbcLocale(sWorld->GetAvailableDbcLocale(locale)), + m_sessionDbLocaleIndex(locale), + m_latency(0), + m_TutorialsChanged(false), + _filterAddonMessages(false), + recruiterId(recruiter), + isRecruiter(isARecruiter), + timeLastWhoCommand(0) { - _warden = NULL; - _filterAddonMessages = false; - if (sock) { m_Address = sock->GetRemoteAddress(); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 6a282d15241..1c41f1fb2ff 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -470,9 +470,8 @@ void AuraEffect::GetApplicationList(std::list & applicationLis int32 AuraEffect::CalculateAmount(Unit* caster) { - int32 amount; // default amount calculation - amount = m_spellInfo->Effects[m_effIndex].CalcValue(caster, &m_baseAmount, GetBase()->GetOwner()->ToUnit()); + int32 amount = m_spellInfo->Effects[m_effIndex].CalcValue(caster, &m_baseAmount, GetBase()->GetOwner()->ToUnit()); // check item enchant aura cast if (!amount && caster) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 5beaa49c050..d66d60fece9 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1725,6 +1725,9 @@ void Spell::SelectImplicitTrajTargets() trajDst.Relocate(x, y, z, m_caster->GetOrientation()); m_targets.ModDst(trajDst); } + + if (Vehicle * veh = m_caster->GetVehicleKit()) + veh->SetLastShootPos(*m_targets.GetDstPos()); } void Spell::SelectEffectTypeImplicitTargets(uint8 effIndex) @@ -2795,11 +2798,15 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint8 effMask) // trigger linked auras remove/apply // TODO: remove/cleanup this, as this table is not documented and people are doing stupid things with it if (std::vector const* spellTriggered = sSpellMgr->GetSpellLinked(m_spellInfo->Id + SPELL_LINK_HIT)) + { for (std::vector::const_iterator i = spellTriggered->begin(); i != spellTriggered->end(); ++i) + { if (*i < 0) unit->RemoveAurasDueToSpell(-(*i)); else unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID()); + } + } } void Spell::DoAllEffectOnTarget(GOTargetInfo* target) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 7054d866e6f..9faf9a1f850 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -15,12 +15,13 @@ * with this program. If not, see . */ -#include "SpellAuraDefines.h" #include "SpellInfo.h" +#include "SpellAuraDefines.h" #include "SpellMgr.h" #include "Spell.h" #include "DBCStores.h" #include "ConditionMgr.h" +#include "Object.h" uint32 GetTargetFlagMask(SpellTargetObjectTypes objType) { diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index d8115569f25..636ef607e2b 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -21,13 +21,13 @@ #include "SharedDefines.h" #include "Util.h" #include "DBCStructure.h" -#include "Object.h" class Unit; class Player; class Item; class Spell; class SpellInfo; +class WorldObject; struct SpellChainNode; struct SpellTargetPosition; struct SpellDurationEntry; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index a596d4bf076..600b9dc65a3 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1292,6 +1292,7 @@ void SpellMgr::LoadSpellRanks() mSpellInfoMap[addedSpell]->ChainEntry = &mSpellChains[addedSpell]; prevRank = addedSpell; ++itr; + if (itr == rankChain.end()) { mSpellChains[addedSpell].next = NULL; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index e2cc4ff2c43..e301367ce43 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -223,7 +223,7 @@ void World::AddSession(WorldSession* s) void World::AddSession_(WorldSession* s) { - ASSERT (s); + ASSERT(s); //NOTE - Still there is race condition in WorldSession* being used in the Sockets @@ -258,7 +258,7 @@ void World::AddSession_(WorldSession* s) uint32 Sessions = GetActiveAndQueuedSessionCount(); uint32 pLimit = GetPlayerAmountLimit(); - uint32 QueueSize = GetQueuedSessionCount(); //number of players in the queue + uint32 QueueSize = GetQueuedSessionCount(); //number of players in the queue //so we don't count the user trying to //login as a session and queue the socket that we are using @@ -267,7 +267,7 @@ void World::AddSession_(WorldSession* s) if (pLimit > 0 && Sessions >= pLimit && AccountMgr::IsPlayerAccount(s->GetSecurity()) && !HasRecentlyDisconnected(s)) { - AddQueuedPlayer (s); + AddQueuedPlayer(s); UpdateMaxSessionCounters(); sLog->outInfo(LOG_FILTER_GENERAL, "PlayerQueue: Account id %u is in Queue Position (%u).", s->GetAccountId(), ++QueueSize); return; diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index 5bc84bed28a..259845d82ae 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -239,40 +239,44 @@ public: if (!target) { - handler->PSendSysMessage("%s%s|r", "|cff33ffff", "You must select target."); + handler->PSendSysMessage("%s%s|r", "|cff33ffff", "You must select a target."); return true; } - uint32 guildLow = target->GetDBTableGUIDLow(); + uint32 guidLow = target->GetDBTableGUIDLow(); + if (guidLow == 0) + { + handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target is not saved to DB."); + return true; + } - if (target->GetCreatureAddon()) + CreatureAddon const* addon = sObjectMgr->GetCreatureAddon(guidLow); + if (!addon || addon->path_id == 0) { - if (target->GetCreatureAddon()->path_id != 0) - { - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); + handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target does not have a loaded path."); + return true; + } - stmt->setUInt32(0, guildLow); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); - WorldDatabase.Execute(stmt); + stmt->setUInt32(0, guidLow); + + WorldDatabase.Execute(stmt); - target->UpdateWaypointID(0); + target->UpdateWaypointID(0); - stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE); + stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE); - stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE)); - stmt->setUInt32(1, guildLow); + stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE)); + stmt->setUInt32(1, guidLow); - WorldDatabase.Execute(stmt); + WorldDatabase.Execute(stmt); - target->LoadPath(0); - target->SetDefaultMovementType(IDLE_MOTION_TYPE); - target->GetMotionMaster()->MoveTargetedHome(); - target->GetMotionMaster()->Initialize(); - target->MonsterSay("Path unloaded.", 0, 0); - return true; - } - handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target have no loaded path."); - } + target->LoadPath(0); + target->SetDefaultMovementType(IDLE_MOTION_TYPE); + target->GetMotionMaster()->MoveTargetedHome(); + target->GetMotionMaster()->Initialize(); + target->MonsterSay("Path unloaded.", 0, 0); return true; } -- cgit v1.2.3 From 572788c3c048bb4319956d527505a8159674656e Mon Sep 17 00:00:00 2001 From: Shocker Date: Fri, 16 Nov 2012 23:23:38 +0200 Subject: Core/Commands: Fix .npc add item --- src/server/scripts/Commands/cs_npc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 1fa84985445..d4d4adad6a0 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -222,7 +222,7 @@ public: return false; } - sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, type, extendedcost); + sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, extendedcost, type); ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); -- cgit v1.2.3 From 339d2b12575550b40840c410f04eb90a45f4e79d Mon Sep 17 00:00:00 2001 From: Spp Date: Sat, 17 Nov 2012 03:18:37 +0100 Subject: Fix compile --- .../PitOfSaron/boss_forgemaster_garfrost.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index a12bd96f6df..e24024f5305 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -48,16 +48,6 @@ enum Spells #define SPELL_PERMAFROST_HELPER RAID_MODE(68786, 70336) #define SPELL_FORGE_BLADE_HELPER RAID_MODE(68774, 70334) -enum Events -{ - EVENT_THROW_SARONITE = 1, - EVENT_CHILLING_WAVE = 2, - EVENT_DEEP_FREEZE = 3, - EVENT_JUMP = 4, - EVENT_FORGING = 5, - EVENT_RESUME_ATTACK = 6, -}; - enum Phases { PHASE_ONE = 1, @@ -82,6 +72,15 @@ Position const southForgePos = {639.257f, -210.1198f, 529.015f, 0.523599f}; class boss_garfrost : public CreatureScript { +enum Events +{ + EVENT_THROW_SARONITE = 1, + EVENT_CHILLING_WAVE = 2, + EVENT_DEEP_FREEZE = 3, + EVENT_JUMP = 4, + EVENT_FORGING = 5, + EVENT_RESUME_ATTACK = 6, +}; public: boss_garfrost() : CreatureScript("boss_garfrost") { } -- cgit v1.2.3 From 477d17b0fc065f8d859d52037bf711b933d7bee8 Mon Sep 17 00:00:00 2001 From: oMadMano Date: Sat, 17 Nov 2012 14:10:47 -0500 Subject: Core/Spells: Fixed Improved Cone of Cold. --- .../2012_11_17_00_world_spell_script_names_434.sql | 4 ++ src/server/scripts/Spells/spell_mage.cpp | 44 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 sql/updates/world/2012_11_17_00_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_11_17_00_world_spell_script_names_434.sql b/sql/updates/world/2012_11_17_00_world_spell_script_names_434.sql new file mode 100644 index 00000000000..13eac8b301e --- /dev/null +++ b/sql/updates/world/2012_11_17_00_world_spell_script_names_434.sql @@ -0,0 +1,4 @@ +-- 120 Cone of Cold +DELETE FROM `spell_script_names` WHERE `spell_id` IN (120); +INSERT INTO `spell_script_names` VALUES +(120, "spell_mage_cone_of_cold"); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index f4bbccc8587..35f0e98eef2 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -380,6 +380,49 @@ class spell_mage_living_bomb : public SpellScriptLoader } }; +enum ConeOfColdSpells +{ + SPELL_CONE_OF_COLD_AURA_R1 = 11190, // Improved Cone of Cold Rank 1 aura + SPELL_CONE_OF_COLD_AURA_R2 = 12489, // Improved Cone of Cold Rank 2 aura + SPELL_CONE_OF_COLD_TRIGGER_R1 = 83301, // Improved Cone of Cold Rank 1 Trigger + SPELL_CONE_OF_COLD_TRIGGER_R2 = 83302, // Improved Cone of Cold Rank 2 Trigger +}; + +// 120 Cone of Cold +/// Updated 4.3.4 +class spell_mage_cone_of_cold : public SpellScriptLoader +{ +public: + spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { } + + class spell_mage_cone_of_cold_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_cone_of_cold_SpellScript); + + void HandleConeOfColdScript(SpellEffIndex effIndex) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + if (caster->HasAura(SPELL_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1 + unitTarget->CastSpell(unitTarget, SPELL_CONE_OF_COLD_TRIGGER_R1, true); + else if (caster->HasAura(SPELL_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2 + unitTarget->CastSpell(unitTarget, SPELL_CONE_OF_COLD_TRIGGER_R2, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_cone_of_cold_SpellScript(); + } +}; + void AddSC_mage_spell_scripts() { new spell_mage_blast_wave(); @@ -390,4 +433,5 @@ void AddSC_mage_spell_scripts() new spell_mage_polymorph_cast_visual(); new spell_mage_summon_water_elemental(); new spell_mage_living_bomb(); + new spell_mage_cone_of_cold(); } -- cgit v1.2.3 From fff684ec7884440500aad7ca5a90e39709dc675e Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 19 Nov 2012 12:03:45 +0100 Subject: Remove duplicate code after some old merge --- src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp | 1 - src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp | 2 -- 2 files changed, 3 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index e8180057cec..afb60e60bf2 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -966,7 +966,6 @@ class spell_xt002_tympanic_tantrum : public SpellScriptLoader OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); OnHit += SpellHitFn(spell_xt002_tympanic_tantrum_SpellScript::RecalculateDamage); - OnHit += SpellHitFn(spell_xt002_tympanic_tantrum_SpellScript::RecalculateDamage); } }; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 3a90b6901e3..f2f03ff602b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -339,8 +339,6 @@ public: me->GetMotionMaster()->MoveLand(0, pos); me->SetDisableGravity(false, true); me->SetHover(true); - me->SetDisableGravity(false, true); - me->SetHover(true); ++introPhase; introTimer = 3000; break; -- cgit v1.2.3 From 43d5af1ebd3743968c04edc58f9df9e0acf5b503 Mon Sep 17 00:00:00 2001 From: huri Date: Tue, 20 Nov 2012 17:29:15 +0100 Subject: Core/Spells: Fixed Arcane Brilliance, Dalaran Brilliance, Power Word: Fortitude, Shadow Protection, Mark of the Wild, Blessing of Kings, Blessing of Might --- sql/updates/world/2012_11_20_00_world_misc.sql | 39 ++++++++++++++++++++++++++ src/server/scripts/Spells/spell_generic.cpp | 36 ++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 sql/updates/world/2012_11_20_00_world_misc.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_11_20_00_world_misc.sql b/sql/updates/world/2012_11_20_00_world_misc.sql new file mode 100644 index 00000000000..c0a95134b0a --- /dev/null +++ b/sql/updates/world/2012_11_20_00_world_misc.sql @@ -0,0 +1,39 @@ +-- Mark of the Wild +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=1126; +DELETE FROM `spell_script_names` WHERE `spell_id`=1126 OR `ScriptName`='spell_dru_mark_of_the_wild'; +INSERT INTO `spell_script_names` VALUES +(1126,'spell_dru_mark_of_the_wild'); + +-- Arcane Brilliance +DELETE FROM `spell_script_names` WHERE `spell_id`=1459 OR `ScriptName`='spell_mage_arcane_brilliance'; +INSERT INTO `spell_script_names` VALUES +(1459,'spell_mage_arcane_brilliance'); + +-- Dalaran Brilliance +DELETE FROM `spell_script_names` WHERE `spell_id`=61316 OR `ScriptName`='spell_mage_dalaran_brilliance'; +INSERT INTO `spell_script_names` VALUES +(61316,'spell_mage_dalaran_brilliance'); + +-- Blessing of Kings +DELETE FROM `spell_script_names` WHERE `spell_id`=20217 OR `ScriptName`='spell_pal_blessing_of_kings'; +INSERT INTO `spell_script_names` VALUES +(20217,'spell_pal_blessing_of_kings'); + +-- Blessing of Might +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=19740; +DELETE FROM `spell_script_names` WHERE `spell_id`=19740 OR `ScriptName`='spell_pal_blessing_of_might'; +INSERT INTO `spell_script_names` VALUES +(19740,'spell_pal_blessing_of_might'); + +-- Power Word: Fortitude +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=21562; +DELETE FROM `spell_script_names` WHERE `spell_id`=21562 OR `ScriptName`='spell_pri_power_word_fortitude'; +INSERT INTO `spell_script_names` VALUES +(21562,'spell_pri_power_word_fortitude'); + +-- Shadow Protection +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=27683; +DELETE FROM `spell_scripts` WHERE `id`=27683; +DELETE FROM `spell_script_names` WHERE `spell_id`=27683 OR `ScriptName`='spell_pri_shadow_protection'; +INSERT INTO `spell_script_names` VALUES +(27683,'spell_pri_shadow_protection'); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 65fde6059c9..1f23d0a4d7a 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3306,6 +3306,35 @@ class spell_gen_gift_of_naaru : public SpellScriptLoader } }; +class spell_gen_increase_stats_buff : public SpellScriptLoader +{ + public: + spell_gen_increase_stats_buff(char const* scriptName) : SpellScriptLoader(scriptName) { } + + class spell_gen_increase_stats_buff_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_increase_stats_buff_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()->IsInRaidWith(GetCaster())) + GetCaster()->CastSpell(GetCaster(), GetEffectValue() + 1, true); // raid buff + else + GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), true); // single-target buff + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_increase_stats_buff_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_increase_stats_buff_SpellScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -3382,4 +3411,11 @@ void AddSC_generic_spell_scripts() new spell_gen_upper_deck_create_foam_sword(); new spell_gen_bonked(); new spell_gen_gift_of_naaru(); + new spell_gen_increase_stats_buff("spell_pal_blessing_of_kings"); + new spell_gen_increase_stats_buff("spell_pal_blessing_of_might"); + new spell_gen_increase_stats_buff("spell_dru_mark_of_the_wild"); + new spell_gen_increase_stats_buff("spell_pri_power_word_fortitude"); + new spell_gen_increase_stats_buff("spell_pri_shadow_protection"); + new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance"); + new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance"); } -- cgit v1.2.3 From f205bc9b4fabc2e2a21fa7975e2b15737969147f Mon Sep 17 00:00:00 2001 From: cyberbrest Date: Wed, 21 Nov 2012 18:25:23 +0100 Subject: Core/Currency: Add support of Conquest points cap for arena and bg Remove obselete code for arena points distribution Thanks to @Zakamurite --- .../2012_11_21_00_characters_worldstates_434.sql | 1 + sql/updates/world/2012_11_21_00_world_command.sql | 1 + .../world/2012_11_21_01_world_trinity_string.sql | 1 + src/server/game/Battlegrounds/ArenaTeam.cpp | 56 ------ src/server/game/Battlegrounds/ArenaTeam.h | 3 - src/server/game/Battlegrounds/ArenaTeamMgr.cpp | 58 ------ src/server/game/Battlegrounds/ArenaTeamMgr.h | 2 - src/server/game/Battlegrounds/Battleground.cpp | 9 +- src/server/game/Battlegrounds/Battleground.h | 13 +- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 36 +--- src/server/game/Battlegrounds/BattlegroundMgr.h | 6 +- src/server/game/DataStores/DBCEnums.h | 10 +- src/server/game/DataStores/DBCStructure.h | 4 +- src/server/game/DataStores/DBCfmt.h | 2 +- src/server/game/Entities/Item/ItemPrototype.h | 7 + src/server/game/Entities/Player/Player.cpp | 212 ++++++++++++++++----- src/server/game/Entities/Player/Player.h | 26 ++- src/server/game/Handlers/BattleGroundHandler.cpp | 75 ++++++++ src/server/game/Miscellaneous/Formulas.h | 20 ++ src/server/game/Miscellaneous/Language.h | 12 +- src/server/game/Server/Protocol/Opcodes.cpp | 16 +- src/server/game/Server/WorldSession.h | 4 + src/server/game/World/World.cpp | 146 +++++++++----- src/server/game/World/World.h | 23 ++- src/server/scripts/Commands/cs_misc.cpp | 7 - src/server/scripts/Commands/cs_modify.cpp | 4 +- src/server/worldserver/worldserver.conf.dist | 104 ++++++---- 27 files changed, 516 insertions(+), 342 deletions(-) create mode 100644 sql/updates/characters/2012_11_21_00_characters_worldstates_434.sql create mode 100644 sql/updates/world/2012_11_21_00_world_command.sql create mode 100644 sql/updates/world/2012_11_21_01_world_trinity_string.sql (limited to 'src/server/scripts') diff --git a/sql/updates/characters/2012_11_21_00_characters_worldstates_434.sql b/sql/updates/characters/2012_11_21_00_characters_worldstates_434.sql new file mode 100644 index 00000000000..14e9ffb6834 --- /dev/null +++ b/sql/updates/characters/2012_11_21_00_characters_worldstates_434.sql @@ -0,0 +1 @@ +UPDATE `worldstates` SET `comment` = 'NextCurrencyDistributionTime' WHERE `entry` =20001; diff --git a/sql/updates/world/2012_11_21_00_world_command.sql b/sql/updates/world/2012_11_21_00_world_command.sql new file mode 100644 index 00000000000..74a472aa526 --- /dev/null +++ b/sql/updates/world/2012_11_21_00_world_command.sql @@ -0,0 +1 @@ +DELETE FROM `command` WHERE `name`='flusharenapoints'; diff --git a/sql/updates/world/2012_11_21_01_world_trinity_string.sql b/sql/updates/world/2012_11_21_01_world_trinity_string.sql new file mode 100644 index 00000000000..6c70d8cb28b --- /dev/null +++ b/sql/updates/world/2012_11_21_01_world_trinity_string.sql @@ -0,0 +1 @@ +DELETE FROM `trinity_string` WHERE `entry` IN ('741','742','743','744','745','746'); diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 7889d5caf65..a7ec2cde2b8 100755 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -567,32 +567,6 @@ bool ArenaTeam::IsMember(uint64 guid) const return false; } -uint32 ArenaTeam::GetPoints(uint32 memberRating) -{ - // Returns how many points would be awarded with this team type with this rating - float points; - - uint32 rating = memberRating + 150 < Stats.Rating ? memberRating : Stats.Rating; - - if (rating <= 1500) - { - if (sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID) < 6) - points = (float)rating * 0.22f + 14.0f; - else - points = 344; - } - else - points = 1511.26f / (1.0f + 1639.28f * exp(-0.00412f * (float)rating)); - - // Type penalties for teams < 5v5 - if (Type == ARENA_TEAM_2v2) - points *= 0.76f; - else if (Type == ARENA_TEAM_3v3) - points *= 0.88f; - - return (uint32) points; -} - uint32 ArenaTeam::GetAverageMMR(Group* group) const { if (!group) @@ -820,36 +794,6 @@ void ArenaTeam::MemberWon(Player* player, uint32 againstMatchmakerRating, int32 } } -void ArenaTeam::UpdateArenaPointsHelper(std::map& playerPoints) -{ - // Called after a match has ended and the stats are already modified - // Helper function for arena point distribution (this way, when distributing, no actual calculation is required, just a few comparisons) - // 10 played games per week is a minimum - if (Stats.WeekGames < 10) - return; - - // To get points, a player has to participate in at least 30% of the matches - uint32 requiredGames = (uint32)ceil(Stats.WeekGames * 0.3f); - - for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) - { - // The player participated in enough games, update his points - uint32 pointsToAdd = 0; - if (itr->WeekGames >= requiredGames) - pointsToAdd = GetPoints(itr->PersonalRating); - - std::map::iterator plr_itr = playerPoints.find(GUID_LOPART(itr->Guid)); - if (plr_itr != playerPoints.end()) - { - // Check if there is already more points - if (plr_itr->second < pointsToAdd) - playerPoints[GUID_LOPART(itr->Guid)] = pointsToAdd; - } - else - playerPoints[GUID_LOPART(itr->Guid)] = pointsToAdd; - } -} - void ArenaTeam::SaveToDB() { // Save team and member stats to db diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index 405b82c6f4d..58d67cf9daa 100755 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -172,7 +172,6 @@ class ArenaTeam void SendStats(WorldSession* session); void Inspect(WorldSession* session, uint64 guid); - uint32 GetPoints(uint32 MemberRating); int32 GetMatchmakerRatingMod(uint32 ownRating, uint32 opponentRating, bool won); int32 GetRatingMod(uint32 ownRating, uint32 opponentRating, bool won); float GetChanceAgainst(uint32 ownRating, uint32 opponentRating); @@ -182,8 +181,6 @@ class ArenaTeam void MemberLost(Player* player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange = -12); void OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange = -12); - void UpdateArenaPointsHelper(std::map & PlayerPoints); - void FinishWeek(); void FinishGame(int32 mod); diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index 8b2a056f4bb..78840a8dde4 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -134,61 +134,3 @@ void ArenaTeamMgr::LoadArenaTeams() sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u arena teams in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } - -void ArenaTeamMgr::DistributeArenaPoints() -{ - // Used to distribute arena points based on last week's stats - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_START); - - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_START); - - // Temporary structure for storing maximum points to add values for all players - std::map PlayerPoints; - - // At first update all points for all team members - for (ArenaTeamContainer::iterator teamItr = GetArenaTeamMapBegin(); teamItr != GetArenaTeamMapEnd(); ++teamItr) - if (ArenaTeam* at = teamItr->second) - at->UpdateArenaPointsHelper(PlayerPoints); - - /* - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - // Cycle that gives points to all players - PreparedStatement* stmt; - - for (std::map::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) - { - // Add points to player if online - if (Player* player = HashMapHolder::Find(playerItr->first)) - player->ModifyConquestPoints(playerItr->second, &trans); - else // Update database - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ARENA_POINTS); - stmt->setUInt32(0, playerItr->second); - stmt->setUInt32(1, playerItr->first); - trans->Append(stmt); - } - } - - CharacterDatabase.CommitTransaction(trans); - */ - - PlayerPoints.clear(); - - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_END); - - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_START); - for (ArenaTeamContainer::iterator titr = GetArenaTeamMapBegin(); titr != GetArenaTeamMapEnd(); ++titr) - { - if (ArenaTeam* at = titr->second) - { - at->FinishWeek(); - at->SaveToDB(); - at->NotifyStatsChanged(); - } - } - - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_END); - - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_END); -} diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.h b/src/server/game/Battlegrounds/ArenaTeamMgr.h index bf06418145d..9e06e84d1e6 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.h +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.h @@ -40,8 +40,6 @@ public: ArenaTeamContainer::iterator GetArenaTeamMapBegin() { return ArenaTeamStore.begin(); } ArenaTeamContainer::iterator GetArenaTeamMapEnd() { return ArenaTeamStore.end(); } - void DistributeArenaPoints(); - uint32 GenerateArenaTeamId(); void SetNextArenaTeamId(uint32 Id) { NextArenaTeamId = Id; } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index d1165456abb..393ca57e22c 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -907,6 +907,7 @@ void Battleground::EndBattleground(uint32 winner) uint32 rating = player->GetArenaPersonalRating(winnerArenaTeam->GetSlot()); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, GetMapId()); + player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_ARENA, sWorld->getIntConfig(CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD)); winnerArenaTeam->MemberWon(player, loserMatchmakerRating, winnerMatchmakerChange); } @@ -932,11 +933,15 @@ void Battleground::EndBattleground(uint32 winner) if (IsRandom() || BattlegroundMgr::IsBGWeekend(GetTypeID())) { UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winner_kills)); - /*if (CanAwardArenaPoints()) - player->ModifyConquestPoints(player->GetRandomWinner() ? BG_REWARD_WINNER_ARENA_LAST : BG_REWARD_WINNER_ARENA_FIRST);*/ if (!player->GetRandomWinner()) + { + // 100cp awarded for the first rated battleground won each day + player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_BG, BG_REWARD_WINNER_CONQUEST_FIRST); player->SetRandomWinner(true); + } } + else // 50cp awarded for each non-rated battleground won + player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_BG, BG_REWARD_WINNER_CONQUEST_LAST ); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1); if (!guildAwarded) diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 7c0ca616214..90b7e5167a6 100755 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -134,14 +134,15 @@ enum BattlegroundBuffObjects BG_OBJECTID_BERSERKERBUFF_ENTRY = 179905 }; +/// Battleground currency rewards. Should be with precision mod. enum BattlegroundRandomRewards { - BG_REWARD_WINNER_HONOR_FIRST = 270, - BG_REWARD_WINNER_CONQUEST_FIRST = 100, - BG_REWARD_WINNER_HONOR_LAST = 135, - BG_REWARD_WINNER_CONQUEST_LAST = 50, - BG_REWARD_LOSER_HONOR_FIRST = 45, - BG_REWARD_LOSER_HONOR_LAST = 35 + BG_REWARD_WINNER_HONOR_FIRST = 27000, + BG_REWARD_WINNER_CONQUEST_FIRST = 10000, + BG_REWARD_WINNER_HONOR_LAST = 13500, + BG_REWARD_WINNER_CONQUEST_LAST = 5000, + BG_REWARD_LOSER_HONOR_FIRST = 4500, + BG_REWARD_LOSER_HONOR_LAST = 3500 }; const uint32 Buff_Entries[3] = { BG_OBJECTID_SPEEDBUFF_ENTRY, BG_OBJECTID_REGENBUFF_ENTRY, BG_OBJECTID_BERSERKERBUFF_ENTRY }; diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 13aed749a49..271cbee850e 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -54,7 +54,7 @@ BattlegroundMgr::BattlegroundMgr() : m_NextRatedArenaUpdate(sWorld->getIntConfig(CONFIG_ARENA_RATED_UPDATE_TIMER)), - m_AutoDistributionTimeChecker(0), m_ArenaTesting(false), m_Testing(false) + m_ArenaTesting(false), m_Testing(false) { } BattlegroundMgr::~BattlegroundMgr() @@ -146,22 +146,6 @@ void BattlegroundMgr::Update(uint32 diff) else m_NextRatedArenaUpdate -= diff; } - - if (sWorld->getBoolConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS)) - { - if (m_AutoDistributionTimeChecker < diff) - { - if (time(NULL) > m_NextAutoDistributionTime) - { - sArenaTeamMgr->DistributeArenaPoints(); - m_NextAutoDistributionTime = m_NextAutoDistributionTime + BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY * sWorld->getIntConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS); - sWorld->setWorldState(WS_ARENA_DISTRIBUTION_TIME, uint64(m_NextAutoDistributionTime)); - } - m_AutoDistributionTimeChecker = 600000; // check 10 minutes - } - else - m_AutoDistributionTimeChecker -= diff; - } } void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battleground *bg, Player * player, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype) @@ -1110,24 +1094,6 @@ void BattlegroundMgr::CreateInitialBattlegrounds() sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u battlegrounds in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void BattlegroundMgr::InitAutomaticArenaPointDistribution() -{ - if (!sWorld->getBoolConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS)) - return; - - time_t wstime = time_t(sWorld->getWorldState(WS_ARENA_DISTRIBUTION_TIME)); - time_t curtime = time(NULL); - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Initializing Automatic Arena Point Distribution"); - if (wstime < curtime) - { - m_NextAutoDistributionTime = curtime; // reset will be called in the next update - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: Next arena point distribution time in the past, reseting it now."); - } - else - m_NextAutoDistributionTime = wstime; - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Automatic Arena Point Distribution initialized."); -} - void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, uint64 guid, Player* player, BattlegroundTypeId bgTypeId) { if (!player) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index da7839ff1b0..3512e1c2891 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -30,8 +30,7 @@ typedef std::set BattlegroundClientIdsContainer; typedef UNORDERED_MAP BattleMastersMap; -#define BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY 86400 // seconds in a day -#define WS_ARENA_DISTRIBUTION_TIME 20001 // Custom worldstate +#define WS_CURRENCY_RESET_TIME 20001 // Custom worldstate struct CreateBattlegroundData { @@ -124,7 +123,6 @@ class BattlegroundMgr uint32 GetMaxRatingDifference() const; uint32 GetRatingDiscardTimer() const; - void InitAutomaticArenaPointDistribution(); void LoadBattleMastersEntry(); BattlegroundTypeId GetBattleMasterBG(uint32 entry) const { @@ -150,8 +148,6 @@ class BattlegroundMgr BattlegroundSelectionWeightMap m_BGSelectionWeights; std::vector m_QueueUpdateScheduler; uint32 m_NextRatedArenaUpdate; - time_t m_NextAutoDistributionTime; - uint32 m_AutoDistributionTimeChecker; bool m_ArenaTesting; bool m_Testing; BattleMastersMap mBattleMastersMap; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 853202df8d0..dc91a0642c4 100755 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -525,10 +525,12 @@ enum VehicleSeatFlagsB // CurrencyTypes.dbc enum CurrencyTypes { - CURRENCY_TYPE_CONQUEST_POINTS = 390, - CURRENCY_TYPE_HONOR_POINTS = 392, - CURRENCY_TYPE_JUSTICE_POINTS = 395, - CURRENCY_TYPE_VALOR_POINTS = 396 + CURRENCY_TYPE_CONQUEST_POINTS = 390, + CURRENCY_TYPE_HONOR_POINTS = 392, + CURRENCY_TYPE_JUSTICE_POINTS = 395, + CURRENCY_TYPE_VALOR_POINTS = 396, + CURRENCY_TYPE_CONQUEST_META_ARENA = 483, + CURRENCY_TYPE_CONQUEST_META_BG = 484, }; #endif diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 87e77ad491e..ee6cd5d951f 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -848,8 +848,8 @@ struct CurrencyCategoryEntry struct CurrencyTypesEntry { - uint32 ID; // 0 not used - //uint32 Category; // 1 may be category + uint32 ID; // 0 not used + uint32 Category; // 1 may be category //char* name; // 2 //char* iconName; // 3 //uint32 unk4; // 4 all 0 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index c1430c7bef0..9e593f66244 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -49,7 +49,7 @@ char const CreatureModelDatafmt[]="nxxxxxxxxxxxxxffxxxxxxxxxxxxxxx"; char const CreatureFamilyfmt[]="nfifiiiiixsx"; char const CreatureSpellDatafmt[]="niiiixxxx"; char const CreatureTypefmt[]="nxx"; -char const CurrencyTypesfmt[]="nxxxxxiiiix"; +char const CurrencyTypesfmt[]="nixxxxiiiix"; char const DestructibleModelDatafmt[]="ixxixxxixxxixxxixxxxxxxx"; char const DungeonEncounterfmt[]="iiixisxx"; diff --git a/src/server/game/Entities/Item/ItemPrototype.h b/src/server/game/Entities/Item/ItemPrototype.h index cf818b740b4..e8795347d0e 100755 --- a/src/server/game/Entities/Item/ItemPrototype.h +++ b/src/server/game/Entities/Item/ItemPrototype.h @@ -219,6 +219,13 @@ enum CurrencyFlags CURRENCY_FLAG_COUNT_SEASON_TOTAL = 0x80, }; +enum CurrencyCategory +{ + // ... + CURRENCY_CATEGORY_META_CONQUEST = 89, + // ... +}; + enum ItemVendorType { ITEM_VENDOR_TYPE_ITEM = 1, diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0e0bbb95daa..fdf9c2c7a90 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -858,6 +858,8 @@ Player::Player(WorldSession* session): Unit(true), phaseMgr(this) SetPendingBind(0, 0); _activeCheats = CHEAT_NONE; + _maxPersonalArenaRate = 0; + _ConquestCurrencyTotalWeekCap = 0; memset(_voidStorageItems, 0, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*)); memset(_CUFProfiles, 0, MAX_CUF_PROFILES * sizeof(CUFProfile*)); @@ -1022,9 +1024,9 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) InitRunes(); SetUInt32Value(PLAYER_FIELD_COINAGE, sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)); - SetCurrency(CURRENCY_TYPE_HONOR_POINTS, sWorld->getIntConfig(CONFIG_START_HONOR_POINTS)); - SetCurrency(CURRENCY_TYPE_JUSTICE_POINTS, sWorld->getIntConfig(CONFIG_START_JUSTICE_POINTS)); - SetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, sWorld->getIntConfig(CONFIG_START_ARENA_POINTS)); + SetCurrency(CURRENCY_TYPE_HONOR_POINTS, sWorld->getIntConfig(CONFIG_CURRENCY_START_HONOR_POINTS)); + SetCurrency(CURRENCY_TYPE_JUSTICE_POINTS, sWorld->getIntConfig(CONFIG_CURRENCY_START_JUSTICE_POINTS)); + SetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, sWorld->getIntConfig(CONFIG_CURRENCY_START_CONQUEST_POINTS)); // start with every map explored if (sWorld->getBoolConfig(CONFIG_START_ALL_EXPLORED)) @@ -7255,6 +7257,14 @@ void Player::_LoadCurrency(PreparedQueryResult result) _currencyStorage.insert(PlayerCurrenciesMap::value_type(currencyID, cur)); + // load total conquest cap. should be after insert. + if (currency->Category == CURRENCY_CATEGORY_META_CONQUEST) + { + uint32 cap = _GetCurrencyWeekCap(currency); + if (cap > _ConquestCurrencyTotalWeekCap) + _ConquestCurrencyTotalWeekCap = cap; + } + } while (result->NextRow()); } @@ -7336,12 +7346,16 @@ void Player::SendCurrencies() const { ByteBuffer currencyData; WorldPacket packet(SMSG_INIT_CURRENCY, 4 + _currencyStorage.size()*(5*4 + 1)); + size_t count_pos = packet.bitwpos(); packet.WriteBits(_currencyStorage.size(), 23); + size_t count = 0; for (PlayerCurrenciesMap::const_iterator itr = _currencyStorage.begin(); itr != _currencyStorage.end(); ++itr) { CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(itr->first); - if (!entry) // should never happen + + // not send init meta currencies. + if (!entry || entry->Category == CURRENCY_CATEGORY_META_CONQUEST) continue; uint32 precision = (entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1; @@ -7363,17 +7377,59 @@ void Player::SendCurrencies() const currencyData << uint32(entry->ID); if (weekCount) currencyData << uint32(weekCount); + + ++count; } packet.FlushBits(); packet.append(currencyData); + packet.PutBits(count_pos, count, 23); + GetSession()->SendPacket(&packet); +} + +void Player::SendPvpRewards() const +{ + WorldPacket packet(SMSG_REQUEST_PVP_REWARDS_RESPONSE, 24); + packet << GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_POINTS, true); + packet << GetCurrencyOnWeek(CURRENCY_TYPE_CONQUEST_POINTS, true); + packet << GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_META_ARENA, true); + packet << GetCurrencyOnWeek(CURRENCY_TYPE_CONQUEST_META_ARENA, true); + packet << GetCurrencyOnWeek(CURRENCY_TYPE_CONQUEST_META_BG, true); + packet << GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_POINTS, true); + packet << GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_META_BG, true); GetSession()->SendPacket(&packet); } -uint32 Player::GetCurrency(uint32 id) const +uint32 Player::GetCurrency(uint32 id, bool precision) const { PlayerCurrenciesMap::const_iterator itr = _currencyStorage.find(id); - return itr != _currencyStorage.end() ? itr->second.totalCount : 0; + if (itr == _currencyStorage.end()) + return 0; + + if (!precision) + return itr->second.totalCount; + + CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id); + ASSERT(currency); + + int32 mod = currency->Flags & CURRENCY_FLAG_HIGH_PRECISION ? 100 : 1; + return itr->second.totalCount / mod; +} + +uint32 Player::GetCurrencyOnWeek(uint32 id, bool precision) const +{ + PlayerCurrenciesMap::const_iterator itr = _currencyStorage.find(id); + if (itr == _currencyStorage.end()) + return 0; + + if (!precision) + return itr->second.weekCount; + + CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id); + ASSERT(currency); + + int32 mod = currency->Flags & CURRENCY_FLAG_HIGH_PRECISION ? 100 : 1; + return itr->second.weekCount / mod; } bool Player::HasCurrency(uint32 id, uint32 count) const @@ -7412,9 +7468,9 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo oldWeekCount = itr->second.weekCount; } - // count can't be more then weekCap. + // count can't be more then weekCap if used (weekCap > 0) uint32 weekCap = _GetCurrencyWeekCap(currency); - if (count > int32(weekCap)) + if (weekCap && count > int32(weekCap)) count = weekCap; int32 newTotalCount = int32(oldTotalCount) + count; @@ -7427,7 +7483,6 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo ASSERT(weekCap >= oldWeekCount); - // TODO: fix conquest points // if we get more then weekCap just set to limit if (weekCap && int32(weekCap) < newWeekCount) { @@ -7457,6 +7512,16 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo if (count > 0) UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count); + if (currency->Category == CURRENCY_CATEGORY_META_CONQUEST) + { + //original conquest cap is highest of bg/arena conquest cap. + if(weekCap > _ConquestCurrencyTotalWeekCap) + _ConquestCurrencyTotalWeekCap = weekCap; + // count was changed to week limit, now we can modify original points. + ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, count, printLog ); + return; + } + // on new case just set init. if(itr->second.state == PLAYERCURRENCY_NEW) { @@ -7484,45 +7549,94 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo void Player::SetCurrency(uint32 id, uint32 count, bool printLog /*= true*/) { - ModifyCurrency(id, int32(count) - GetCurrency(id), printLog); + PlayerCurrenciesMap::iterator itr = _currencyStorage.find(id); + if (itr == _currencyStorage.end()) + { + PlayerCurrency cur; + cur.state = PLAYERCURRENCY_NEW; + cur.totalCount = count; + cur.weekCount = 0; + _currencyStorage[id] = cur; + } +} + +uint32 Player::GetCurrencyWeekCap(uint32 id, bool usePrecision) const +{ + CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(id); + if (!entry) + return 0; + + uint32 cap = _GetCurrencyWeekCap(entry); + if(usePrecision && entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) + cap /= 100; + + return cap; } -uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const +void Player::ResetCurrencyWeekCap() { - uint32 cap = currency->WeekCap; - switch (currency->ID) - { - case CURRENCY_TYPE_CONQUEST_POINTS: - { - // TODO: implement - cap = 0; - break; - } - case CURRENCY_TYPE_HONOR_POINTS: - { - uint32 honorcap = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS); - if (honorcap > 0) - cap = honorcap; - break; - } - case CURRENCY_TYPE_JUSTICE_POINTS: - { - uint32 justicecap = sWorld->getIntConfig(CONFIG_MAX_JUSTICE_POINTS); - if (justicecap > 0) - cap = justicecap; - break; - } - } + for (uint32 arenaSlot = 0; arenaSlot < MAX_ARENA_SLOT; arenaSlot++) + { + if (uint32 arenaTeamId = GetArenaTeamId(arenaSlot)) + { + ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId); + arenaTeam->FinishWeek(); // set played this week etc values to 0 in memory, too + arenaTeam->SaveToDB(); // save changes + arenaTeam->NotifyStatsChanged(); // notify the players of the changes + } + } + + for (PlayerCurrenciesMap::iterator itr = _currencyStorage.begin(); itr != _currencyStorage.end(); ++itr) + { + itr->second.weekCount = 0; + itr->second.state = PLAYERCURRENCY_CHANGED; + } + + WorldPacket data(SMSG_WEEKLY_RESET_CURRENCY, 0); + SendDirectMessage(&data); +} - if (cap != currency->WeekCap && IsInWorld() && !GetSession()->PlayerLoading()) - { - WorldPacket packet(SMSG_UPDATE_CURRENCY_WEEK_LIMIT, 8); - packet << uint32(cap / ((currency->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1)); - packet << uint32(currency->ID); - GetSession()->SendPacket(&packet); - } +uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const +{ + uint32 cap = currency->WeekCap; + + switch (currency->ID) + { + //original conquest not have week cap + case CURRENCY_TYPE_CONQUEST_POINTS: + return _ConquestCurrencyTotalWeekCap; + case CURRENCY_TYPE_CONQUEST_META_ARENA: + // should add precision mod = 100 + return Trinity::Currency::ConquestRatingCalculator(_maxPersonalArenaRate) * 100; + case CURRENCY_TYPE_CONQUEST_META_BG: + // should add precision mod = 100 + return Trinity::Currency::BgConquestRatingCalculator(GetRBGPersonalRating()) * 100; + case CURRENCY_TYPE_HONOR_POINTS: + { + uint32 honorcap = sWorld->getIntConfig(CONFIG_CURRENCY_MAX_HONOR_POINTS); + if (honorcap > 0) + cap = honorcap; + break; + } + case CURRENCY_TYPE_JUSTICE_POINTS: + { + uint32 justicecap = sWorld->getIntConfig(CONFIG_CURRENCY_MAX_JUSTICE_POINTS); + if (justicecap > 0) + cap = justicecap; + break; + } + } + + if (cap != currency->WeekCap && IsInWorld() && !GetSession()->PlayerLoading()) + { + WorldPacket packet(SMSG_UPDATE_CURRENCY_WEEK_LIMIT, 8); + packet << uint32(cap / ((currency->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1)); + packet << uint32(currency->ID); + GetSession()->SendPacket(&packet); + } + + return cap; - return cap; } void Player::SetInGuild(uint32 guildId) @@ -7556,6 +7670,13 @@ uint8 Player::GetRankFromDB(uint64 guid) return 0; } +void Player::SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value) +{ + SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + type, value); + if (type == ARENA_TEAM_PERSONAL_RATING && value > _maxPersonalArenaRate) + _maxPersonalArenaRate = value; +} + uint32 Player::GetArenaTeamIdFromDB(uint64 guid, uint8 type) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID); @@ -20720,6 +20841,11 @@ void Player::LeaveAllArenaTeams(uint64 guid) while (result->NextRow()); } +uint32 Player::GetRBGPersonalRating() const +{ + return 0; +} + void Player::SetRestBonus (float rest_bonus_new) { // Prevent resting on max level diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 0056230f6ce..56983dfeee9 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1454,12 +1454,19 @@ class Player : public Unit, public GridObject void SendNewCurrency(uint32 id) const; /// send full data about all currencies to client void SendCurrencies() const; + /// send conquest currency points and their cap week/arena + void SendPvpRewards() const; /// return count of currency witch has plr - uint32 GetCurrency(uint32 id) const; + uint32 GetCurrency(uint32 id, bool precision) const; + /// return count of currency gaind on current week + uint32 GetCurrencyOnWeek(uint32 id, bool precision) const; + /// return week cap by currency id + uint32 GetCurrencyWeekCap(uint32 id, bool usePrecision) const; /// return presence related currency bool HasCurrency(uint32 id, uint32 count) const; - /// @todo: not understand why it subtract from total count and for what it used. It should be remove and replaced by ModifyCurrency + /// initialize currency count for custom initialization at create character void SetCurrency(uint32 id, uint32 count, bool printLog = true); + void ResetCurrencyWeekCap(); /** * @name ModifyCurrency @@ -2045,16 +2052,14 @@ class Player : public Unit, public GridObject SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId); SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, type); } - void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value) - { - SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + type, value); - } + void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value); static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot); static void LeaveAllArenaTeams(uint64 guid); uint32 GetArenaTeamId(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_ID); } uint32 GetArenaPersonalRating(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_PERSONAL_RATING); } void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; } uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; } + uint32 GetRBGPersonalRating() const; Difficulty GetDifficulty(bool isRaid) const { return isRaid ? m_raidDifficulty : m_dungeonDifficulty; } Difficulty GetDungeonDifficulty() const { return m_dungeonDifficulty; } @@ -2890,6 +2895,13 @@ class Player : public Unit, public GridObject uint32 m_currentBuybackSlot; PlayerCurrenciesMap _currencyStorage; + + /** + * @name _GetCurrencyWeekCap + * @brief return week cap for selected currency + + * @param currency CurrencyTypesEntry witch should get week cap + */ uint32 _GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const; VoidStorageItem* _voidStorageItems[VOID_STORAGE_MAX_SLOT]; @@ -3096,6 +3108,8 @@ class Player : public Unit, public GridObject uint32 _pendingBindTimer; uint32 _activeCheats; + uint32 _maxPersonalArenaRate; + uint32 _ConquestCurrencyTotalWeekCap; PhaseMgr phaseMgr; }; diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index a4177b9a081..5a6a26dd1c8 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -784,3 +784,78 @@ void WorldSession::HandleReportPvPAFK(WorldPacket & recvData) reportedPlayer->ReportedAfkBy(_player); } + +void WorldSession::HandleRequestRatedBgInfo(WorldPacket & recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_REQUEST_RATED_BG_INFO"); + + uint8 unk; + recvData >> unk; + + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "WorldSession::HandleRequestRatedBgInfo: get unk = %u", unk); + + /// @Todo: perfome research in this case + /// The unk fields are related to arenas + WorldPacket data(SMSG_RATED_BG_STATS, 72); + data << uint32(0); // BgWeeklyWins20vs20 + data << uint32(0); // BgWeeklyPlayed20vs20 + data << uint32(0); // BgWeeklyPlayed15vs15 + data << uint32(0); + data << uint32(0); // BgWeeklyWins10vs10 + data << uint32(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); // BgWeeklyWins15vs15 + data << uint32(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); + data << uint32(0); // BgWeeklyPlayed10vs10 + data << uint32(0); + data << uint32(0); + + SendPacket(&data); +} + +void WorldSession::HandleRequestPvpOptions(WorldPacket& recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_REQUEST_PVP_OPTIONS_ENABLED"); + + /// @Todo: perfome research in this case + WorldPacket data(SMSG_PVP_OPTIONS_ENABLED, 1); + data.WriteBit(1); + data.WriteBit(1); // WargamesEnabled + data.WriteBit(1); + data.WriteBit(1); // RatedBGsEnabled + data.WriteBit(1); // RatedArenasEnabled + + data.FlushBits(); + + SendPacket(&data); +} + +void WorldSession::HandleRequestPvpReward(WorldPacket& recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_REQUEST_PVP_REWARDS"); + + _player->SendPvpRewards(); +} + +void WorldSession::HandleRequestRatedBgStats(WorldPacket& recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_REQUEST_RATED_BG_STATS"); + + WorldPacket data(SMSG_BATTLEFIELD_RATED_INFO, 29); + data << uint32(0); // Reward + data << uint8(3); // unk + data << uint32(0); // unk + data << uint32(0); // unk + data << _player->GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_META_BG, true); + data << uint32(0); // unk + data << uint32(0); // unk + data << _player->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, true); + + SendPacket(&data); +} \ No newline at end of file diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 6e6668ba4d6..d557a1093ed 100755 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -224,6 +224,26 @@ namespace Trinity return rate; } } // namespace Trinity::XP + + namespace Currency + { + inline uint32 ConquestRatingCalculator(uint32 rate) + { + if (rate <= 1500) + return 1350; // Default conquest points + else if (rate > 3000) + rate = 3000; + + // http://www.arenajunkies.com/topic/179536-conquest-point-cap-vs-personal-rating-chart/page__st__60#entry3085246 + return 1.4326 * ((1511.26 / (1 + 1639.28 / exp(0.00412 * rate))) + 850.15); + } + + inline uint32 BgConquestRatingCalculator(uint32 rate) + { + // WowWiki: Battleground ratings receive a bonus of 22.2% to the cap they generate + return ConquestRatingCalculator(rate)*1.222f; + } + } // namespace Trinity::Currency } // namespace Trinity #endif diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index b1eb24c507b..8a7a1cec33a 100755 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -707,12 +707,12 @@ enum TrinityStrings LANG_DEBUG_ARENA_OFF = 738, LANG_DEBUG_BG_ON = 739, LANG_DEBUG_BG_OFF = 740, - LANG_DIST_ARENA_POINTS_START = 741, - LANG_DIST_ARENA_POINTS_ONLINE_START = 742, - LANG_DIST_ARENA_POINTS_ONLINE_END = 743, - LANG_DIST_ARENA_POINTS_TEAM_START = 744, - LANG_DIST_ARENA_POINTS_TEAM_END = 745, - LANG_DIST_ARENA_POINTS_END = 746, +// LANG_DIST_ARENA_POINTS_START = 741, +// LANG_DIST_ARENA_POINTS_ONLINE_START = 742, +// LANG_DIST_ARENA_POINTS_ONLINE_END = 743, +// LANG_DIST_ARENA_POINTS_TEAM_START = 744, +// LANG_DIST_ARENA_POINTS_TEAM_END = 745, +// LANG_DIST_ARENA_POINTS_END = 746, LANG_BG_DISABLED = 747, LANG_ARENA_DISABLED = 748, // = 749, not used diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0ecb6529ea8..aad5085e477 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -453,11 +453,11 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PET_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PVP_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestPvpOptions ); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PVP_REWARDS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestPvpReward ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RATED_BG_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RATED_BG_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestRatedBgInfo ); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RATED_BG_STATS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestRatedBgStats ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleExit ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); @@ -673,7 +673,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_STATE_CHANGE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_PLAYER_POSITIONS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_RATED_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_RATED_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1089,7 +1089,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1120,7 +1120,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_RAID_SUMMON_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RATED_BG_RATING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_READ_ITEM_FAILED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_READ_ITEM_OK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1133,7 +1133,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RESEARCH_SETUP_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 306ce8323cf..eecbbc56368 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -772,6 +772,10 @@ class WorldSession void HandleBattlefieldLeaveOpcode(WorldPacket& recvData); void HandleBattlemasterJoinArena(WorldPacket& recvData); void HandleReportPvPAFK(WorldPacket& recvData); + void HandleRequestRatedBgInfo(WorldPacket& recvData); + void HandleRequestPvpOptions(WorldPacket& recvData); + void HandleRequestPvpReward(WorldPacket& recvData); + void HandleRequestRatedBgStats(WorldPacket& recvData); void HandleWardenDataOpcode(WorldPacket& recvData); void HandleWorldTeleportOpcode(WorldPacket& recvData); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index e301367ce43..f5472ac8bf4 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -108,6 +108,7 @@ World::World() m_MaxPlayerCount = 0; m_NextDailyQuestReset = 0; m_NextWeeklyQuestReset = 0; + m_NextCurrencyReset = 0; m_defaultDbcLocale = LOCALE_enUS; m_availableDbcLocaleMask = 0; @@ -782,67 +783,78 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_START_PLAYER_MONEY] = 0x7FFFFFFF-1; } - m_int_configs[CONFIG_MAX_HONOR_POINTS] = ConfigMgr::GetIntDefault("MaxHonorPoints", 75000); - if (int32(m_int_configs[CONFIG_MAX_HONOR_POINTS]) < 0) + m_int_configs[CONFIG_CURRENCY_RESET_HOUR] = ConfigMgr::GetIntDefault("Currency.ResetHour", 3); + if (m_int_configs[CONFIG_CURRENCY_RESET_HOUR] > 23) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "MaxHonorPoints (%i) can't be negative. Set to 0.", m_int_configs[CONFIG_MAX_HONOR_POINTS]); - m_int_configs[CONFIG_MAX_HONOR_POINTS] = 0; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.ResetHour (%i) can't be load. Set to 6.", m_int_configs[CONFIG_CURRENCY_RESET_HOUR]); + m_int_configs[CONFIG_CURRENCY_RESET_HOUR] = 3; } - - m_int_configs[CONFIG_START_HONOR_POINTS] = ConfigMgr::GetIntDefault("StartHonorPoints", 0); - if (int32(m_int_configs[CONFIG_START_HONOR_POINTS]) < 0) + m_int_configs[CONFIG_CURRENCY_RESET_DAY] = ConfigMgr::GetIntDefault("Currency.ResetDay", 3); + if (m_int_configs[CONFIG_CURRENCY_RESET_DAY] > 6) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartHonorPoints (%i) must be in range 0..MaxHonorPoints(%u). Set to %u.", - m_int_configs[CONFIG_START_HONOR_POINTS], m_int_configs[CONFIG_MAX_HONOR_POINTS], 0); - m_int_configs[CONFIG_START_HONOR_POINTS] = 0; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.ResetDay (%i) can't be load. Set to 3.", m_int_configs[CONFIG_CURRENCY_RESET_DAY]); + m_int_configs[CONFIG_CURRENCY_RESET_DAY] = 3; } - else if (m_int_configs[CONFIG_START_HONOR_POINTS] > m_int_configs[CONFIG_MAX_HONOR_POINTS]) + m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL] = ConfigMgr::GetIntDefault("Currency.ResetInterval", 7); + if (int32(m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL]) <= 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartHonorPoints (%i) must be in range 0..MaxHonorPoints(%u). Set to %u.", - m_int_configs[CONFIG_START_HONOR_POINTS], m_int_configs[CONFIG_MAX_HONOR_POINTS], m_int_configs[CONFIG_MAX_HONOR_POINTS]); - m_int_configs[CONFIG_START_HONOR_POINTS] = m_int_configs[CONFIG_MAX_HONOR_POINTS]; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.ResetInterval (%i) must be > 0, set to default 7.", m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL]); + m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL] = 7; } - - m_int_configs[CONFIG_MAX_JUSTICE_POINTS] = ConfigMgr::GetIntDefault("MaxJusticePoints", 400000); - if (int32(m_int_configs[CONFIG_MAX_JUSTICE_POINTS]) < 0) + + m_int_configs[CONFIG_CURRENCY_START_HONOR_POINTS] = ConfigMgr::GetIntDefault("Currency.StartHonorPoints", 0); + if (int32(m_int_configs[CONFIG_CURRENCY_START_HONOR_POINTS]) < 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "MaxJusticePoints (%i) can't be negative. Set to 0.", m_int_configs[CONFIG_MAX_JUSTICE_POINTS]); - m_int_configs[CONFIG_MAX_JUSTICE_POINTS] = 0; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.StartHonorPoints (%i) must be >= 0, set to default 0.", m_int_configs[CONFIG_CURRENCY_START_HONOR_POINTS]); + m_int_configs[CONFIG_CURRENCY_START_HONOR_POINTS] = 0; + } + m_int_configs[CONFIG_CURRENCY_MAX_HONOR_POINTS] = ConfigMgr::GetIntDefault("Currency.MaxHonorPoints", 40000); + if (int32(m_int_configs[CONFIG_CURRENCY_MAX_HONOR_POINTS]) < 0) + { + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.MaxHonorPoints (%i) can't be negative. Set to 0.", m_int_configs[CONFIG_CURRENCY_MAX_HONOR_POINTS]); + m_int_configs[CONFIG_CURRENCY_MAX_HONOR_POINTS] = 0; } - m_int_configs[CONFIG_START_JUSTICE_POINTS] = ConfigMgr::GetIntDefault("StartJusticePoints", 0); - if (int32(m_int_configs[CONFIG_START_JUSTICE_POINTS]) < 0) + m_int_configs[CONFIG_CURRENCY_START_CONQUEST_POINTS] = ConfigMgr::GetIntDefault("Currency.StartConquestPoints", 0); + if (int32(m_int_configs[CONFIG_CURRENCY_START_CONQUEST_POINTS]) < 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartJusticePoints (%i) must be in range 0..MaxJusticePoints(%u). Set to %u.", - m_int_configs[CONFIG_START_JUSTICE_POINTS], m_int_configs[CONFIG_MAX_JUSTICE_POINTS], 0); - m_int_configs[CONFIG_START_JUSTICE_POINTS] = 0; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.StartConquestPoints (%i) must be >= 0, set to default 0.", m_int_configs[CONFIG_CURRENCY_START_CONQUEST_POINTS]); + m_int_configs[CONFIG_CURRENCY_START_CONQUEST_POINTS] = 0; } - else if (m_int_configs[CONFIG_START_JUSTICE_POINTS] > m_int_configs[CONFIG_MAX_JUSTICE_POINTS]) + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP] = ConfigMgr::GetIntDefault("Currency.ConquestPointsWeekCap", 1650); + if (int32(m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP]) <= 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartJusticePoints (%i) must be in range 0..MaxJusticePoints(%u). Set to %u.", - m_int_configs[CONFIG_START_JUSTICE_POINTS], m_int_configs[CONFIG_MAX_JUSTICE_POINTS], m_int_configs[CONFIG_MAX_JUSTICE_POINTS]); - m_int_configs[CONFIG_START_JUSTICE_POINTS] = m_int_configs[CONFIG_MAX_JUSTICE_POINTS]; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.ConquestPointsWeekCap (%i) must be > 0, set to default 1650.", m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP]); + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP] = 1650; } - - m_int_configs[CONFIG_MAX_ARENA_POINTS] = ConfigMgr::GetIntDefault("MaxArenaPoints", 10000); - if (int32(m_int_configs[CONFIG_MAX_ARENA_POINTS]) < 0) + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP] *= 100; //precision mod + + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD] = ConfigMgr::GetIntDefault("Currency.ConquestPointsArenaReward", 150); + if (int32(m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD]) <= 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "MaxArenaPoints (%i) can't be negative. Set to 0.", m_int_configs[CONFIG_MAX_ARENA_POINTS]); - m_int_configs[CONFIG_MAX_ARENA_POINTS] = 0; + sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.ConquestPointsArenaReward (%i) must be > 0, set to default 180.", m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD]); + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD] = 150; } + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD] *= 100; //precision mod - m_int_configs[CONFIG_START_ARENA_POINTS] = ConfigMgr::GetIntDefault("StartArenaPoints", 0); - if (int32(m_int_configs[CONFIG_START_ARENA_POINTS]) < 0) + m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS] = ConfigMgr::GetIntDefault("StartJusticePoints", 0); + if (int32(m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS]) < 0) + { + sLog->outError(LOG_FILTER_SERVER_LOADING, "StartJusticePoints (%i) must be in range 0..MaxJusticePoints(%u). Set to %u.", + m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS], m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS], 0); + m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS] = 0; + } + else if (m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS] > m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS]) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartArenaPoints (%i) must be in range 0..MaxArenaPoints(%u). Set to %u.", - m_int_configs[CONFIG_START_ARENA_POINTS], m_int_configs[CONFIG_MAX_ARENA_POINTS], 0); - m_int_configs[CONFIG_START_ARENA_POINTS] = 0; + sLog->outError(LOG_FILTER_SERVER_LOADING, "StartJusticePoints (%i) must be in range 0..MaxJusticePoints(%u). Set to %u.", + m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS], m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS], m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS]); + m_int_configs[CONFIG_CURRENCY_START_JUSTICE_POINTS] = m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS]; } - else if (m_int_configs[CONFIG_START_ARENA_POINTS] > m_int_configs[CONFIG_MAX_ARENA_POINTS]) + m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS] = ConfigMgr::GetIntDefault("MaxJusticePoints", 400000); + if (int32(m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS]) < 0) { - sLog->outError(LOG_FILTER_SERVER_LOADING, "StartArenaPoints (%i) must be in range 0..MaxArenaPoints(%u). Set to %u.", - m_int_configs[CONFIG_START_ARENA_POINTS], m_int_configs[CONFIG_MAX_ARENA_POINTS], m_int_configs[CONFIG_MAX_ARENA_POINTS]); - m_int_configs[CONFIG_START_ARENA_POINTS] = m_int_configs[CONFIG_MAX_ARENA_POINTS]; + sLog->outError(LOG_FILTER_SERVER_LOADING, "MaxJusticePoints (%i) can't be negative. Set to 0.", m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS]); + m_int_configs[CONFIG_CURRENCY_MAX_JUSTICE_POINTS] = 0; } m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = ConfigMgr::GetIntDefault("RecruitAFriend.MaxLevel", 60); @@ -1048,8 +1060,6 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_ARENA_MAX_RATING_DIFFERENCE] = ConfigMgr::GetIntDefault ("Arena.MaxRatingDifference", 150); m_int_configs[CONFIG_ARENA_RATING_DISCARD_TIMER] = ConfigMgr::GetIntDefault ("Arena.RatingDiscardTimer", 10 * MINUTE * IN_MILLISECONDS); m_int_configs[CONFIG_ARENA_RATED_UPDATE_TIMER] = ConfigMgr::GetIntDefault ("Arena.RatedUpdateTimer", 5 * IN_MILLISECONDS); - m_bool_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS] = ConfigMgr::GetBoolDefault("Arena.AutoDistributePoints", false); - m_int_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS] = ConfigMgr::GetIntDefault ("Arena.AutoDistributeInterval", 7); m_bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = ConfigMgr::GetBoolDefault("Arena.QueueAnnouncer.Enable", false); m_bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY] = ConfigMgr::GetBoolDefault("Arena.QueueAnnouncer.PlayerOnly", false); m_int_configs[CONFIG_ARENA_SEASON_ID] = ConfigMgr::GetIntDefault ("Arena.ArenaSeason.ID", 1); @@ -1777,7 +1787,6 @@ void World::SetInitialWorldSettings() ///- Initialize Battlegrounds sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Starting Battleground System"); sBattlegroundMgr->CreateInitialBattlegrounds(); - sBattlegroundMgr->InitAutomaticArenaPointDistribution(); ///- Initialize outdoor pvp sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Starting Outdoor PvP System"); @@ -1815,6 +1824,9 @@ void World::SetInitialWorldSettings() sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Calculate Guild cap reset time..."); InitGuildResetTime(); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Calculate next currency reset time..."); + InitCurrencyResetTime(); + LoadCharacterNameData(); sLog->outInfo(LOG_FILTER_GENERAL, "Initializing Opcodes..."); @@ -1975,6 +1987,9 @@ void World::Update(uint32 diff) if (m_gameTime > m_NextGuildReset) ResetGuildCap(); + if (m_gameTime > m_NextCurrencyReset) + ResetCurrencyWeekCap(); + ///
  • Handle auctions when the timer has passed if (m_timers[WUPDATE_AUCTIONS].Passed()) { @@ -2822,6 +2837,35 @@ void World::InitGuildResetTime() sWorld->setWorldState(WS_GUILD_DAILY_RESET_TIME, uint64(m_NextGuildReset)); } +void World::InitCurrencyResetTime() +{ + time_t currencytime = uint64(sWorld->getWorldState(WS_CURRENCY_RESET_TIME)); + if (!currencytime) + m_NextCurrencyReset = time_t(time(NULL)); // game time not yet init + + // generate time by config + time_t curTime = time(NULL); + tm localTm = *localtime(&curTime); + + localTm.tm_wday = getIntConfig(CONFIG_CURRENCY_RESET_DAY); + localTm.tm_hour = getIntConfig(CONFIG_CURRENCY_RESET_HOUR); + localTm.tm_min = 0; + localTm.tm_sec = 0; + + // current week reset time + time_t nextWeekResetTime = mktime(&localTm); + + // next reset time before current moment + if (curTime >= nextWeekResetTime) + nextWeekResetTime += getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL) * DAY; + + // normalize reset time + m_NextCurrencyReset = currencytime < curTime ? nextWeekResetTime - getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL) * DAY : nextWeekResetTime; + + if (!currencytime) + sWorld->setWorldState(WS_CURRENCY_RESET_TIME, uint64(m_NextCurrencyReset)); +} + void World::ResetDailyQuests() { sLog->outInfo(LOG_FILTER_GENERAL, "Daily quests reset for all characters."); @@ -2837,6 +2881,18 @@ void World::ResetDailyQuests() sPoolMgr->ChangeDailyQuests(); } +void World::ResetCurrencyWeekCap() +{ + CharacterDatabase.Execute("UPDATE `character_currency` SET `week_count` = 0"); + + for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) + if (itr->second->GetPlayer()) + itr->second->GetPlayer()->ResetCurrencyWeekCap(); + + m_NextCurrencyReset = time_t(m_NextCurrencyReset + DAY * getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL)); + sWorld->setWorldState(WS_CURRENCY_RESET_TIME, uint64(m_NextCurrencyReset)); +} + void World::LoadDBAllowedSecurityLevel() { PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 917ab6c5fec..f187f302bea 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -139,7 +139,6 @@ enum WorldBoolConfigs CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE, CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY, CONFIG_BG_XP_FOR_KILL, - CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS, CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE, CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY, CONFIG_ARENA_SEASON_IN_PROGRESS, @@ -225,12 +224,16 @@ enum WorldIntConfigs CONFIG_START_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, - CONFIG_MAX_HONOR_POINTS, - CONFIG_START_HONOR_POINTS, - CONFIG_MAX_JUSTICE_POINTS, - CONFIG_START_JUSTICE_POINTS, - CONFIG_MAX_ARENA_POINTS,//todo: remove - CONFIG_START_ARENA_POINTS,//todo: remove + CONFIG_CURRENCY_START_JUSTICE_POINTS, + CONFIG_CURRENCY_MAX_JUSTICE_POINTS, + CONFIG_CURRENCY_START_HONOR_POINTS, + CONFIG_CURRENCY_MAX_HONOR_POINTS, + CONFIG_CURRENCY_START_CONQUEST_POINTS, + CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP, + CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD, + CONFIG_CURRENCY_RESET_HOUR, + CONFIG_CURRENCY_RESET_DAY, + CONFIG_CURRENCY_RESET_INTERVAL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, CONFIG_INSTANCE_RESET_TIME_HOUR, @@ -290,7 +293,6 @@ enum WorldIntConfigs CONFIG_ARENA_MAX_RATING_DIFFERENCE, CONFIG_ARENA_RATING_DISCARD_TIMER, CONFIG_ARENA_RATED_UPDATE_TIMER, - CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS, CONFIG_ARENA_SEASON_ID, CONFIG_ARENA_START_RATING, CONFIG_ARENA_START_PERSONAL_RATING, @@ -764,10 +766,12 @@ class World void InitWeeklyQuestResetTime(); void InitRandomBGResetTime(); void InitGuildResetTime(); + void InitCurrencyResetTime(); void ResetDailyQuests(); void ResetWeeklyQuests(); void ResetRandomBG(); void ResetGuildCap(); + void ResetCurrencyWeekCap(); private: static ACE_Atomic_Op m_stopEvent; static uint8 m_ExitCode; @@ -824,11 +828,12 @@ class World // CLI command holder to be thread safe ACE_Based::LockedQueue cliCmdQueue; - // next daily quests and random bg reset time + // scheduled reset times time_t m_NextDailyQuestReset; time_t m_NextWeeklyQuestReset; time_t m_NextRandomBGReset; time_t m_NextGuildReset; + time_t m_NextCurrencyReset; //Player Queue Queue m_QueuedPlayer; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 443bc9a0ecd..8078b09baa3 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -106,7 +106,6 @@ public: { "cometome", SEC_ADMINISTRATOR, false, &HandleComeToMeCommand, "", NULL }, { "damage", SEC_ADMINISTRATOR, false, &HandleDamageCommand, "", NULL }, { "combatstop", SEC_GAMEMASTER, true, &HandleCombatStopCommand, "", NULL }, - { "flusharenapoints", SEC_ADMINISTRATOR, false, &HandleFlushArenaPointsCommand, "", NULL }, { "repairitems", SEC_GAMEMASTER, true, &HandleRepairitemsCommand, "", NULL }, { "freeze", SEC_MODERATOR, false, &HandleFreezeCommand, "", NULL }, { "unfreeze", SEC_MODERATOR, false, &HandleUnFreezeCommand, "", NULL }, @@ -2125,12 +2124,6 @@ public: return true; } - static bool HandleFlushArenaPointsCommand(ChatHandler* /*handler*/, char const* /*args*/) - { - sArenaTeamMgr->DistributeArenaPoints(); - return true; - } - static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args) { Player* target; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 47955e26ac8..61f90b9d046 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1134,7 +1134,7 @@ public: target->ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, amount, true, true); - handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_HONOR_POINTS)); + handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_HONOR_POINTS, false)); return true; } @@ -1325,7 +1325,7 @@ public: target->ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, amount, true, true); - handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS)); + handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, false)); return true; } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 217daeeca6a..8b8e45432c8 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -27,6 +27,7 @@ # CHARACTER DELETE OPTIONS # CUSTOM SERVER OPTIONS # LOGGING SYSTEM SETTINGS +# CURRENCIES SETTINGS # ################################################################################################### @@ -778,48 +779,6 @@ StartHeroicPlayerLevel = 55 StartPlayerMoney = 0 -# -# MaxHonorPoints -# Description: Maximum honor points a character can have. -# Default: 75000 - -MaxHonorPoints = 75000 - -# -# StartHonorPoints -# Description: Amount of honor points that characters have after creation. -# Default: 0 - -StartHonorPoints = 0 - -# -# MaxJusticePoints -# Description: Maximum justice points a character can have. -# Default: 400000 - -MaxJusticePoints = 400000 - -# -# StartJusticePoints -# Description: Amount of justice points that characters have after creation. -# Default: 0 - -StartJusticePoints = 0 - -# -# MaxArenaPoints -# Description: Maximum arena points a character can have. -# Default: 10000 - -MaxArenaPoints = 10000 - -# -# StartArenaPoints -# Description: Amount of arena points that characters has after creation. -# Default: 0 - -StartArenaPoints = 0 - # # RecruitAFriend.MaxLevel # Description: Highest level up to which a character can benefit from the Recruit-A-Friend @@ -2905,3 +2864,64 @@ Guild.WeeklyReputationCap = 4375 # ################################################################################################### + +################################################################################################### +# CURRENCIES SETTINGS +# +# Currency.StartHonorPoints +# Amount of honor that new players will start with +# Default: 0 (with precision) +# + +Currency.StartHonorPoints = 0 + +# +# Currency.StartConquestPoints +# Amount of conquest points that new players will start with +# Default: 0 (with precision) +# + +Currency.StartConquestPoints = 0 + +# +# Currency.ResetInterval +# How often should currency week count reset (days) +# Default: 7 (weekly) +# + +Currency.ResetInterval = 7 + +# +# Currency.ResetWeekDay +# Week day when currency week count is reset (0..6) 0 == Sunday +# Default: 3 (Wednesday) +# + +Currency.ResetWeekDay = 3 + +# +# Currency.ResetHour +# Hour of a day when currency week count is reset (0..23) +# Default: 6 +# + +Currency.ResetHour = 6 + +# +# Currency.ConquestPointsDefaultWeekCap +# Amount of conquest points that player can earn per week +# Default: 1350 +# + +Currency.ConquestPointsDefaultWeekCap = 1350 + +# +# Currency.ConquestPointsArenaReward +# Amount of conquest points rewarded by winning arenas +# Default: 150 +# + +Currency.ConquestPointsArenaReward = 150 + +# +################################################################################################### -- cgit v1.2.3 From f5a54f8cbefc150b41571e7e5fea1d8a4eec8e1a Mon Sep 17 00:00:00 2001 From: Tuxity Date: Wed, 21 Nov 2012 18:26:28 +0100 Subject: Misc: Whitespace and tabs cleanup --- src/server/game/Battlegrounds/Battleground.cpp | 10 ++++----- src/server/game/Battlegrounds/Battleground.h | 2 +- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 8 +++---- .../game/Battlegrounds/Zones/BattlegroundAB.cpp | 4 ++-- .../game/Battlegrounds/Zones/BattlegroundAB.h | 2 +- .../game/Battlegrounds/Zones/BattlegroundAV.cpp | 4 ++-- .../game/Battlegrounds/Zones/BattlegroundAV.h | 2 +- .../game/Battlegrounds/Zones/BattlegroundEY.cpp | 2 +- .../game/Battlegrounds/Zones/BattlegroundEY.h | 2 +- .../game/Battlegrounds/Zones/BattlegroundWS.cpp | 2 +- .../game/Battlegrounds/Zones/BattlegroundWS.h | 2 +- src/server/game/Entities/Player/Player.cpp | 14 ++++++------ src/server/game/Handlers/ArenaTeamHandler.cpp | 2 +- src/server/game/Handlers/BattleGroundHandler.cpp | 26 +++++++++++----------- src/server/game/Miscellaneous/Formulas.h | 6 ++--- src/server/game/World/World.cpp | 6 ++--- .../MagistersTerrace/boss_felblood_kaelthas.cpp | 2 +- .../instance_magisters_terrace.cpp | 10 ++++----- 18 files changed, 53 insertions(+), 53 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 393ca57e22c..881d0e3296b 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -419,7 +419,7 @@ uint32 Battleground::GetPrematureWinner() winner = ALLIANCE; else if (GetPlayersCountByTeam(HORDE) >= GetMinPlayersPerTeam()) winner = HORDE; - + return winner; } @@ -481,7 +481,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) if (m_CountdownTimer >= 10000) { uint32 countdownMaxForBGType = isArena() ? ARENA_COUNTDOWN_MAX : BATTLEGROUND_COUNTDOWN_MAX; - + WorldPacket data(SMSG_START_TIMER, 4+4+4); data << uint32(0); // unk data << uint32(countdownMaxForBGType - (m_CountdownTimer / 1000)); @@ -935,12 +935,12 @@ void Battleground::EndBattleground(uint32 winner) UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winner_kills)); if (!player->GetRandomWinner()) { - // 100cp awarded for the first rated battleground won each day + // 100cp awarded for the first rated battleground won each day player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_BG, BG_REWARD_WINNER_CONQUEST_FIRST); player->SetRandomWinner(true); } } - else // 50cp awarded for each non-rated battleground won + else // 50cp awarded for each non-rated battleground won player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_BG, BG_REWARD_WINNER_CONQUEST_LAST ); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1); @@ -1240,7 +1240,7 @@ void Battleground::AddPlayer(Player* player) // Correctly display EnemyUnitFrame player->SetByteValue(PLAYER_BYTES_3, 3, player->GetBGTeam()); - + WorldPacket data(SMSG_ARENA_OPPONENT_UPDATE, 8); data << uint64(player->GetGUID()); SendPacketToTeam(team, &data, player, false); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 90b7e5167a6..3026d737bda 100755 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -533,7 +533,7 @@ class Battleground virtual uint64 GetFlagPickerGUID(int32 /*team*/ = -1) const { return 0; } virtual void SetDroppedFlagGUID(uint64 /*guid*/, int32 /*team*/ = -1) {} uint32 GetTeamScore(uint32 TeamID) const; - + virtual uint32 GetPrematureWinner(); protected: diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 271cbee850e..f5edafec655 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -390,7 +390,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) } Player* player = ObjectAccessor::FindPlayer(itr->first); ObjectGuid playerGUID = itr->first; - + data->WriteBit(0); // Unk 1 data->WriteBit(0); // Unk 2 data->WriteBit(playerGUID[2]); @@ -405,17 +405,17 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) data->WriteBit(playerGUID[6]); data->WriteBit(player->GetTeam() == ALLIANCE); data->WriteBit(playerGUID[7]); - + buff << uint32(itr->second->HealingDone); // healing done buff << uint32(itr->second->DamageDone); // damage done - + if (!isArena) { buff << uint32(itr->second->BonusHonor / 100); buff << uint32(itr->second->Deaths); buff << uint32(itr->second->HonorableKills); } - + buff.WriteByteSeq(playerGUID[4]); buff << uint32(itr->second->KillingBlows); // if (unk 5) << uint32() unk diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 47320db27cf..cb0d651ad47 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -558,12 +558,12 @@ uint32 BattlegroundAB::GetPrematureWinner() ++ally; else if (m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED) ++horde; - + if (ally > horde) return ALLIANCE; else if (horde > ally) return HORDE; - + // If the values are equal, fall back to the original result (based on number of players on each team) return Battleground::GetPrematureWinner(); } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index b80e216a216..6e01437b895 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -272,7 +272,7 @@ class BattlegroundAB : public Battleground /* achievement req. */ bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited bool IsTeamScores500Disadvantage(uint32 team) const { return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(team)]; } - + uint32 GetPrematureWinner(); private: void PostUpdateImpl(uint32 diff); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 918cef4d261..b12aec245cd 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -1701,11 +1701,11 @@ uint32 BattlegroundAV::GetPrematureWinner() { uint32 allianceScore = m_Team_Scores[GetTeamIndexByTeamId(ALLIANCE)]; uint32 hordeScore = m_Team_Scores[GetTeamIndexByTeamId(HORDE)]; - + if (allianceScore > hordeScore) return ALLIANCE; else if (hordeScore > allianceScore) return HORDE; - + return Battleground::GetPrematureWinner(); } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index bedd946a78c..b7fa8d6ece8 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1572,7 +1572,7 @@ class BattlegroundAV : public Battleground /* achievement req. */ bool IsBothMinesControlledByTeam(uint32 team) const; bool IsAllTowersControlledAndCaptainAlive(uint32 team) const; - + uint32 GetPrematureWinner(); private: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 458e86729e7..ab0f94b74f6 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -944,6 +944,6 @@ uint32 BattlegroundEY::GetPrematureWinner() return ALLIANCE; else if (GetTeamScore(TEAM_HORDE) > GetTeamScore(TEAM_ALLIANCE)) return HORDE; - + return Battleground::GetPrematureWinner(); } \ No newline at end of file diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index 2cfd4ca7e0f..43e7fb4f933 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -369,7 +369,7 @@ class BattlegroundEY : public Battleground /* achievement req. */ bool IsAllNodesConrolledByTeam(uint32 team) const; - + uint32 GetPrematureWinner(); private: void PostUpdateImpl(uint32 diff); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 663e5aed1e4..e47cb0acb35 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -864,6 +864,6 @@ uint32 BattlegroundWS::GetPrematureWinner() return ALLIANCE; else if (GetTeamScore(TEAM_HORDE) > GetTeamScore(TEAM_ALLIANCE)) return HORDE; - + return Battleground::GetPrematureWinner(); } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 5b72de43b32..b0d68177072 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -211,7 +211,7 @@ class BattlegroundWS : public Battleground void AddPoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] += Points; } void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; } void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; } - + uint32 GetPrematureWinner(); private: uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fdf9c2c7a90..8b85f761b85 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7565,11 +7565,11 @@ uint32 Player::GetCurrencyWeekCap(uint32 id, bool usePrecision) const CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(id); if (!entry) return 0; - + uint32 cap = _GetCurrencyWeekCap(entry); if(usePrecision && entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) cap /= 100; - + return cap; } @@ -7585,13 +7585,13 @@ void Player::ResetCurrencyWeekCap() arenaTeam->NotifyStatsChanged(); // notify the players of the changes } } - + for (PlayerCurrenciesMap::iterator itr = _currencyStorage.begin(); itr != _currencyStorage.end(); ++itr) { itr->second.weekCount = 0; itr->second.state = PLAYERCURRENCY_CHANGED; } - + WorldPacket data(SMSG_WEEKLY_RESET_CURRENCY, 0); SendDirectMessage(&data); } @@ -7599,7 +7599,7 @@ void Player::ResetCurrencyWeekCap() uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const { uint32 cap = currency->WeekCap; - + switch (currency->ID) { //original conquest not have week cap @@ -7626,7 +7626,7 @@ uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const break; } } - + if (cap != currency->WeekCap && IsInWorld() && !GetSession()->PlayerLoading()) { WorldPacket packet(SMSG_UPDATE_CURRENCY_WEEK_LIMIT, 8); @@ -7634,7 +7634,7 @@ uint32 Player::_GetCurrencyWeekCap(const CurrencyTypesEntry* currency) const packet << uint32(currency->ID); GetSession()->SendPacket(&packet); } - + return cap; } diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index 917fc7069a8..1116587a63b 100755 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -119,7 +119,7 @@ void WorldSession::HandleArenaTeamCreateOpcode(WorldPacket & recvData) } sArenaTeamMgr->AddArenaTeam(arenaTeam); - + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_CREATED); } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 5a6a26dd1c8..a2780459f9b 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -706,7 +706,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recvData) return; if (grp->GetLeaderGUID() != _player->GetGUID()) return; - + uint32 ateamId = _player->GetArenaTeamId(arenaslot); // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice) ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId); @@ -720,30 +720,30 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recvData) arenaRating = at->GetRating(); matchmakerRating = at->GetAverageMMR(grp); // the arenateam id must match for everyone in the group - + if (arenaRating <= 0) arenaRating = 1; - + BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); - + uint32 avgTime = 0; GroupQueueInfo* ginfo; - + err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot); if (!err) { sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: arena team id %u, leader %s queued with matchmaker rating %u for type %u", _player->GetArenaTeamId(arenaslot), _player->GetName().c_str(), matchmakerRating, arenatype); - + ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, true, false, arenaRating, matchmakerRating, ateamId); avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); } - + for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* member = itr->getSource(); if (!member) continue; - + if (err) { WorldPacket data; @@ -751,20 +751,20 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recvData) member->GetSession()->SendPacket(&data); continue; } - + // add to queue uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); - + // add joined time data member->AddBattlegroundQueueJoinTime(bgTypeId, ginfo->JoinTime); - + WorldPacket data; // send status packet (in queue) sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, arenatype); member->GetSession()->SendPacket(&data); - + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, member->GetGUIDLow(), member->GetName().c_str()); } - + sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); } diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index d557a1093ed..ad13bcba316 100755 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -224,7 +224,7 @@ namespace Trinity return rate; } } // namespace Trinity::XP - + namespace Currency { inline uint32 ConquestRatingCalculator(uint32 rate) @@ -233,11 +233,11 @@ namespace Trinity return 1350; // Default conquest points else if (rate > 3000) rate = 3000; - + // http://www.arenajunkies.com/topic/179536-conquest-point-cap-vs-personal-rating-chart/page__st__60#entry3085246 return 1.4326 * ((1511.26 / (1 + 1639.28 / exp(0.00412 * rate))) + 850.15); } - + inline uint32 BgConquestRatingCalculator(uint32 rate) { // WowWiki: Battleground ratings receive a bonus of 22.2% to the cap they generate diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index f5472ac8bf4..fa813f454e5 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -801,7 +801,7 @@ void World::LoadConfigSettings(bool reload) sLog->outError(LOG_FILTER_SERVER_LOADING, "Currency.ResetInterval (%i) must be > 0, set to default 7.", m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL]); m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL] = 7; } - + m_int_configs[CONFIG_CURRENCY_START_HONOR_POINTS] = ConfigMgr::GetIntDefault("Currency.StartHonorPoints", 0); if (int32(m_int_configs[CONFIG_CURRENCY_START_HONOR_POINTS]) < 0) { @@ -828,7 +828,7 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP] = 1650; } m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_WEEK_CAP] *= 100; //precision mod - + m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD] = ConfigMgr::GetIntDefault("Currency.ConquestPointsArenaReward", 150); if (int32(m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD]) <= 0) { @@ -1989,7 +1989,7 @@ void World::Update(uint32 diff) if (m_gameTime > m_NextCurrencyReset) ResetCurrencyWeekCap(); - + ///
    • Handle auctions when the timer has passed if (m_timers[WUPDATE_AUCTIONS].Passed()) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index eec520f04e2..0c3c046a2e0 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -168,7 +168,7 @@ public: { if (!instance) return; - + instance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index c8bf50c0bcc..c142a0c30d7 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -150,7 +150,7 @@ public: HandleGameObject(SelinEncounterDoorGUID, false); else if (data == NOT_STARTED) HandleGameObject(SelinEncounterDoorGUID, true); - + Encounter[0] = data; break; case DATA_VEXALLUS_EVENT: @@ -184,7 +184,7 @@ public: StatuesState = data; break; } - + SaveToDB(); } @@ -245,7 +245,7 @@ public: OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); } - + void Load(const char* str) { if (!str) @@ -257,7 +257,7 @@ public: OUT_LOAD_INST_DATA(str); std::istringstream loadStream(str); - + for (uint32 i = 0; i < MAX_ENCOUNTER; ++i) { uint32 tmpState; @@ -272,7 +272,7 @@ public: OUT_LOAD_INST_DATA_COMPLETE; } - + uint64 GetData64(uint32 identifier) const { switch (identifier) -- cgit v1.2.3 From 2f1000a9ed14fbfabce05278ec80a4dc7bfd45e7 Mon Sep 17 00:00:00 2001 From: Tuxity Date: Thu, 22 Nov 2012 01:39:54 +0100 Subject: Core/Arenas: Drop old .modify arenapoint command, create a new command to add currency to players. --- sql/updates/world/2012_11_22_00_world_command.sql | 4 ++ src/server/scripts/Commands/cs_modify.cpp | 51 +++++++++++++---------- 2 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 sql/updates/world/2012_11_22_00_world_command.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_11_22_00_world_command.sql b/sql/updates/world/2012_11_22_00_world_command.sql new file mode 100644 index 00000000000..74ed29e31ac --- /dev/null +++ b/sql/updates/world/2012_11_22_00_world_command.sql @@ -0,0 +1,4 @@ +DELETE FROM `command` WHERE `name` = 'modify arenapoints'; + +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('modify currency', 2, 'Syntax: .modify currency #id #value\nAdd $amount (without precision) of $currency to the selected player.'); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 61f90b9d046..dff89821a2a 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -65,11 +65,11 @@ public: { "mount", SEC_MODERATOR, false, &HandleModifyMountCommand, "", NULL }, { "honor", SEC_MODERATOR, false, &HandleModifyHonorCommand, "", NULL }, { "reputation", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "", NULL }, - { "arenapoints", SEC_MODERATOR, false, &HandleModifyArenaCommand, "", NULL }, { "drunk", SEC_MODERATOR, false, &HandleModifyDrunkCommand, "", NULL }, { "standstate", SEC_GAMEMASTER, false, &HandleModifyStandStateCommand, "", NULL }, { "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL }, { "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL }, + { "currency", SEC_GAMEMASTER, false, &HandleModifyCurrencyCommand, "", NULL }, { "speed", SEC_MODERATOR, false, NULL, "", modifyspeedCommandTable }, { NULL, 0, false, NULL, "", NULL } }; @@ -1308,28 +1308,6 @@ public: return true; } - static bool HandleModifyArenaCommand(ChatHandler* handler, const char* args) - { - if (!*args) - return false; - - Player* target = handler->getSelectedPlayer(); - if (!target) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return false; - } - - int32 amount = (uint32)atoi(args); - - target->ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, amount, true, true); - - handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, false)); - - return true; - } - static bool HandleModifyGenderCommand(ChatHandler* handler, const char* args) { if (!*args) @@ -1405,6 +1383,33 @@ public: return true; } + + static bool HandleModifyCurrencyCommand(ChatHandler* handler, const char* args) + { + if (!*args) + return false; + + Player* target = handler->getSelectedPlayer(); + if (!target) + { + handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 currencyId = atoi(strtok((char*)args, " ")); + const CurrencyTypesEntry* currencyType = sCurrencyTypesStore.LookupEntry(currencyId); + if (!currencyType) + return false; + + uint32 amount = atoi(strtok(NULL, " ")); + if (!amount) + return false; + + target->ModifyCurrency(currencyId, amount, true, true); + + return true; + } }; void AddSC_modify_commandscript() -- cgit v1.2.3 From 3cf7eb23f9f3d145d91a182669bf3f820e53211c Mon Sep 17 00:00:00 2001 From: Spp Date: Thu, 22 Nov 2012 15:08:28 +0100 Subject: Missing change from merge --- src/server/scripts/EasternKingdoms/hinterlands.cpp | 201 --------------------- 1 file changed, 201 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/hinterlands.cpp b/src/server/scripts/EasternKingdoms/hinterlands.cpp index 618491c8c7b..cf4a6f273f9 100644 --- a/src/server/scripts/EasternKingdoms/hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/hinterlands.cpp @@ -146,207 +146,6 @@ public: }; }; -<<<<<<< HEAD -======= -/*###### -## npc_rinji -######*/ - -enum eRinji -{ - SAY_RIN_BY_OUTRUNNER = 0, - - SAY_RIN_FREE = 0, //from here - SAY_RIN_HELP = 1, - SAY_RIN_COMPLETE = 2, - SAY_RIN_PROGRESS_1 = 3, - SAY_RIN_PROGRESS_2 = 4, - - QUEST_RINJI_TRAPPED = 2742, - NPC_RANGER = 2694, - NPC_OUTRUNNER = 2691, - GO_RINJI_CAGE = 142036 -}; - -struct Location -{ - float m_fX, m_fY, m_fZ; -}; - -Location m_afAmbushSpawn[] = -{ - {191.296204f, -2839.329346f, 107.388f}, - {70.972466f, -2848.674805f, 109.459f} -}; - -Location m_afAmbushMoveTo[] = -{ - {166.630386f, -2824.780273f, 108.153f}, - {70.886589f, -2874.335449f, 116.675f} -}; - -class npc_rinji : public CreatureScript -{ -public: - npc_rinji() : CreatureScript("npc_rinji") { } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) - { - if (quest->GetQuestId() == QUEST_RINJI_TRAPPED) - { - if (GameObject* go = creature->FindNearestGameObject(GO_RINJI_CAGE, INTERACTION_DISTANCE)) - go->UseDoorOrButton(); - - if (npc_rinjiAI* pEscortAI = CAST_AI(npc_rinji::npc_rinjiAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_rinjiAI(creature); - } - - struct npc_rinjiAI : public npc_escortAI - { - npc_rinjiAI(Creature* creature) : npc_escortAI(creature) - { - m_bIsByOutrunner = false; - m_iSpawnId = 0; - } - - bool m_bIsByOutrunner; - uint32 m_uiPostEventCount; - uint32 m_uiPostEventTimer; - int m_iSpawnId; - - void Reset() - { - m_uiPostEventCount = 0; - m_uiPostEventTimer = 3000; - } - - void JustRespawned() - { - m_bIsByOutrunner = false; - m_iSpawnId = 0; - - npc_escortAI::JustRespawned(); - } - - void EnterCombat(Unit* who) - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - { - if (who->GetEntry() == NPC_OUTRUNNER && !m_bIsByOutrunner) - { - if (Creature* talker = who->ToCreature()) - talker->AI()->Talk(SAY_RIN_BY_OUTRUNNER); - m_bIsByOutrunner = true; - } - - if (rand()%4) - return; - - //only if attacked and escorter is not in combat? - Talk(SAY_RIN_HELP); - } - } - - void DoSpawnAmbush(bool bFirst) - { - if (!bFirst) - m_iSpawnId = 1; - - me->SummonCreature(NPC_RANGER, - m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f, - TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); - - for (int i = 0; i < 2; ++i) - { - me->SummonCreature(NPC_OUTRUNNER, - m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f, - TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); - } - } - - void JustSummoned(Creature* summoned) - { - summoned->SetWalk(false); - summoned->GetMotionMaster()->MovePoint(0, m_afAmbushMoveTo[m_iSpawnId].m_fX, m_afAmbushMoveTo[m_iSpawnId].m_fY, m_afAmbushMoveTo[m_iSpawnId].m_fZ); - } - - void WaypointReached(uint32 waypointId) - { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (waypointId) - { - case 1: - Talk(SAY_RIN_FREE, player->GetGUID()); - break; - case 7: - DoSpawnAmbush(true); - break; - case 13: - DoSpawnAmbush(false); - break; - case 17: - Talk(SAY_RIN_COMPLETE, player->GetGUID()); - player->GroupEventHappens(QUEST_RINJI_TRAPPED, me); - SetRun(); - m_uiPostEventCount = 1; - break; - } - } - - void UpdateEscortAI(const uint32 uiDiff) - { - //Check if we have a current target - if (!UpdateVictim()) - { - if (HasEscortState(STATE_ESCORT_ESCORTING) && m_uiPostEventCount) - { - if (m_uiPostEventTimer <= uiDiff) - { - m_uiPostEventTimer = 3000; - - if (Player* player = GetPlayerForEscort()) - { - switch (m_uiPostEventCount) - { - case 1: - Talk(SAY_RIN_PROGRESS_1, player->GetGUID()); - ++m_uiPostEventCount; - break; - case 2: - Talk(SAY_RIN_PROGRESS_2, player->GetGUID()); - m_uiPostEventCount = 0; - break; - } - } - else - { - me->DespawnOrUnsummon(); - return; - } - } - else - m_uiPostEventTimer -= uiDiff; - } - - return; - } - - DoMeleeAttackIfReady(); - } - }; -}; - ->>>>>>> master void AddSC_hinterlands() { new npc_00x09hl(); -- cgit v1.2.3 From f01f695c7d31e0db9e4f36af406964598653aad7 Mon Sep 17 00:00:00 2001 From: Warpten Date: Sun, 25 Nov 2012 21:07:08 +0100 Subject: Core/Spells: Fixed Leap of Faith and renamed a spell script to match standards. --- .../world/2012_11_25_world_spell_script_names.sql | 9 ++++ src/server/scripts/Spells/spell_priest.cpp | 59 +++++++++++++++++++--- 2 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 sql/updates/world/2012_11_25_world_spell_script_names.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_11_25_world_spell_script_names.sql b/sql/updates/world/2012_11_25_world_spell_script_names.sql new file mode 100644 index 00000000000..f0dd277cc96 --- /dev/null +++ b/sql/updates/world/2012_11_25_world_spell_script_names.sql @@ -0,0 +1,9 @@ +DELETE FROM spell_linked_spell WHERE spell_trigger = 73325; +INSERT INTO spell_linked_spell (spell_trigger, spell_effect, type, comment) VALUES +(73325, 92833, 0, "Priest - Leap of Faith"); + +DELETE FROM spell_script_names WHERE spell_id = 92833; +DELETE FROM spell_script_names WHERE spell_id = -139; +INSERT INTO spell_script_names (spell_id, ScriptName) VALUES +(92833, "spell_pri_leap_of_faith_effect_trigger"), +(139, "spell_pri_renew"); -- Minus doesnt matter, theres no rank any more diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 01598f12166..999140dd073 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -43,6 +43,10 @@ enum PriestSpells PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903, PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904, PRIEST_GLYPH_OF_SHADOW = 107906, + PRIEST_LEAP_OF_FAITH = 73325, + PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572, + PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833, + PRIEST_LEAP_OF_FAITH_EFFECT = 92832 }; // Guardian Spirit @@ -102,6 +106,45 @@ class spell_pri_guardian_spirit : public SpellScriptLoader } }; +class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader +{ +public: + spell_pri_leap_of_faith_effect_trigger() : SpellScriptLoader("spell_pri_leap_of_faith_effect_trigger") { } + + class spell_pri_leap_of_faith_effect_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_leap_of_faith_effect_trigger_SpellScript); + + bool Validate(SpellInfo const* /*entry*/) + { + if (!sSpellMgr->GetSpellInfo(PRIEST_LEAP_OF_FAITH_EFFECT)) + return false; + return true; + } + + void HandleEffectDummy(SpellEffIndex /*effIndex*/) + { + Position destPos; + GetHitDest()->GetPosition(&destPos); + + SpellCastTargets targets; + targets.SetDst(destPos); + targets.SetUnitTarget(GetCaster()); + GetHitUnit()->CastSpell(targets, sSpellMgr->GetSpellInfo(GetEffectValue()), NULL); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pri_leap_of_faith_effect_trigger_SpellScript::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_leap_of_faith_effect_trigger_SpellScript(); + } +}; + class spell_pri_mana_burn : public SpellScriptLoader { public: @@ -303,6 +346,7 @@ enum PrayerOfMending { SPELL_T9_HEALING_2_PIECE = 67201, }; + // Prayer of Mending Heal class spell_pri_prayer_of_mending_heal : public SpellScriptLoader { @@ -379,14 +423,14 @@ class spell_pri_vampiric_touch : public SpellScriptLoader } }; -class spell_priest_renew : public SpellScriptLoader +class spell_pri_renew : public SpellScriptLoader { public: - spell_priest_renew() : SpellScriptLoader("spell_priest_renew") { } + spell_pri_renew() : SpellScriptLoader("spell_pri_renew") { } - class spell_priest_renew_AuraScript : public AuraScript + class spell_pri_renew_AuraScript : public AuraScript { - PrepareAuraScript(spell_priest_renew_AuraScript); + PrepareAuraScript(spell_pri_renew_AuraScript); bool Load() { @@ -411,13 +455,13 @@ class spell_priest_renew : public SpellScriptLoader void Register() { - OnEffectApply += AuraEffectApplyFn(spell_priest_renew_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectApply += AuraEffectApplyFn(spell_pri_renew_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; AuraScript* GetAuraScript() const { - return new spell_priest_renew_AuraScript(); + return new spell_pri_renew_AuraScript(); } }; @@ -496,6 +540,7 @@ class spell_pri_shadowform : public SpellScriptLoader void AddSC_priest_spell_scripts() { new spell_pri_guardian_spirit(); + new spell_pri_leap_of_faith_effect_trigger(); new spell_pri_mana_burn(); new spell_pri_pain_and_suffering_proc(); new spell_pri_penance(); @@ -503,7 +548,7 @@ void AddSC_priest_spell_scripts() new spell_pri_mind_sear(); new spell_pri_prayer_of_mending_heal(); new spell_pri_vampiric_touch(); - new spell_priest_renew(); + new spell_pri_renew(); new spell_pri_shadow_word_death(); new spell_pri_shadowform(); } -- cgit v1.2.3 From 99e050fb271697ded6bf649c3173e7d04a196a74 Mon Sep 17 00:00:00 2001 From: Spp Date: Tue, 27 Nov 2012 11:56:23 +0100 Subject: Core/Misc: Tab2spaces, remove trailing whitespaces and remove dupe code after merge --- src/server/game/Battlefield/Battlefield.cpp | 14 +++++++------- src/server/game/Battlefield/Battlefield.h | 4 ++-- src/server/game/Battlefield/Zones/BattlefieldWG.h | 2 +- src/server/game/Entities/Creature/Creature.cpp | 3 --- src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp | 2 +- .../scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp | 2 +- .../ScarletMonastery/boss_headless_horseman.cpp | 2 +- .../EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp | 2 +- .../EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp | 2 +- 9 files changed, 15 insertions(+), 18 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index b0ad965f310..6431f8a3479 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -918,7 +918,7 @@ bool BfCapturePoint::HandlePlayerEnter(Player* player) player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct); } } - + return m_activePlayers[player->GetTeamId()].insert(player->GetGUID()).second; } @@ -941,7 +941,7 @@ void BfCapturePoint::SendChangePhase() { if (!m_capturePointGUID) return; - + if (GameObject* capturePoint = m_Bf->GetGameObject(m_capturePointGUID)) { // send this too, sometimes the slider disappears, dunno why :( @@ -989,9 +989,9 @@ bool BfCapturePoint::SetCapturePointData(GameObject* capturePoint) return true; } -GameObject* BfCapturePoint::GetCapturePointGo() -{ - return m_Bf->GetGameObject(m_capturePointGUID); +GameObject* BfCapturePoint::GetCapturePointGo() +{ + return m_Bf->GetGameObject(m_capturePointGUID); } bool BfCapturePoint::DelCapturePoint() @@ -1039,13 +1039,13 @@ bool BfCapturePoint::Update(uint32 diff) Trinity::AnyPlayerInObjectRangeCheck checker(capturePoint, radius); Trinity::PlayerListSearcher searcher(capturePoint, players, checker); capturePoint->VisitNearbyWorldObject(radius, searcher); - + for (std::list::iterator itr = players.begin(); itr != players.end(); ++itr) if ((*itr)->IsOutdoorPvPActive()) if (m_activePlayers[(*itr)->GetTeamId()].insert((*itr)->GetGUID()).second) HandlePlayerEnter(*itr); } - + // get the difference of numbers float fact_diff = ((float) m_activePlayers[0].size() - (float) m_activePlayers[1].size()) * diff / BATTLEFIELD_OBJECTIVE_UPDATE_INTERVAL; if (G3D::fuzzyEq(fact_diff, 0.0f)) diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index f17a7666d67..cccdf320d89 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -106,7 +106,7 @@ class BfCapturePoint bool SetCapturePointData(GameObject* capturePoint); GameObject* GetCapturePointGo(); uint32 GetCapturePointEntry(){ return m_capturePointEntry; } - + TeamId GetTeamId() { return m_team; } protected: bool DelCapturePoint(); @@ -294,7 +294,7 @@ class Battlefield : public ZoneScript Creature* GetCreature(uint64 GUID); GameObject* GetGameObject(uint64 GUID); - + // Script-methods /// Called on start diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h index 73ec858e965..0ac87af94ba 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.h +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h @@ -1201,7 +1201,7 @@ struct BfWGGameObjectBuilding { if (!go) return; - + // GameObject associated to object m_BuildGUID = go->GetGUID(); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 458b4ea7706..41d48cbfc02 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1721,9 +1721,6 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* victim) if (bcontinue) continue; - if (bcontinue) - continue; - if (spellInfo->ManaCost > (uint32)GetPower(POWER_MANA)) continue; float range = spellInfo->GetMaxRange(false); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 660b8f6c460..da6fdb2d0e3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -226,7 +226,7 @@ public: if (text) CreatureAI::Talk(text); - + } void PrepareEncounter() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 78fc8d127b2..1bfcb4adf6a 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -171,7 +171,7 @@ public: ++speechCounter; DoCastAOE(SPELL_THREAT_PULSE, true); - } else + } else speechTimer -= diff; return; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 5bedf1e99b2..5422d3812f1 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -34,7 +34,7 @@ EndScriptData */ //this texts are already used by 3975 and 3976 enum Says { - SAY_LOST_HEAD = 0, + SAY_LOST_HEAD = 0, SAY_PLAYER_DEATH = 1, SAY_ENTRANCE = 0, diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index c7db80c7f22..c2dc7123f6d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -54,7 +54,7 @@ enum Spells AURA_SPECTRAL_REALM = 46021, AURA_SPECTRAL_INVISIBILITY = 44801, AURA_DEMONIC_VISUAL = 44800, - + SPELL_SPECTRAL_BLAST = 44869, SPELL_TELEPORT_SPECTRAL = 46019, SPELL_ARCANE_BUFFET = 45018, diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 814588fdf68..4c724c1c1a1 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -34,7 +34,7 @@ EndScriptData */ enum Yells { SAY_KJ_OFFCOMBAT = 0, - + SAY_KALECGOS_ENCOURAGE = 0, SAY_KALECGOS_READY1 = 1, SAY_KALECGOS_READY2 = 2, -- cgit v1.2.3 From 4d111c10f0389b0fc762e58df0fb7003fb4ec11e Mon Sep 17 00:00:00 2001 From: Warpten Date: Sat, 1 Dec 2012 14:58:56 +0100 Subject: Scripts/Spells: Fixed Rogue's Recuperate, Mage's Conjure Refreshment and Paladin's Sacred Shield. Also fixed SQL file naming. --- .../2012_11_25_02_world_spell_script_names.sql | 9 +++ .../world/2012_11_25_world_spell_script_names.sql | 9 --- .../2012_12_01_00_world_spell_script_names.sql | 16 +++++ src/server/scripts/Spells/spell_mage.cpp | 70 ++++++++++++++++++++++ src/server/scripts/Spells/spell_paladin.cpp | 40 ++++++++++++- src/server/scripts/Spells/spell_rogue.cpp | 53 +++++++++++++++- 6 files changed, 184 insertions(+), 13 deletions(-) create mode 100644 sql/updates/world/2012_11_25_02_world_spell_script_names.sql delete mode 100644 sql/updates/world/2012_11_25_world_spell_script_names.sql create mode 100644 sql/updates/world/2012_12_01_00_world_spell_script_names.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_11_25_02_world_spell_script_names.sql b/sql/updates/world/2012_11_25_02_world_spell_script_names.sql new file mode 100644 index 00000000000..f0dd277cc96 --- /dev/null +++ b/sql/updates/world/2012_11_25_02_world_spell_script_names.sql @@ -0,0 +1,9 @@ +DELETE FROM spell_linked_spell WHERE spell_trigger = 73325; +INSERT INTO spell_linked_spell (spell_trigger, spell_effect, type, comment) VALUES +(73325, 92833, 0, "Priest - Leap of Faith"); + +DELETE FROM spell_script_names WHERE spell_id = 92833; +DELETE FROM spell_script_names WHERE spell_id = -139; +INSERT INTO spell_script_names (spell_id, ScriptName) VALUES +(92833, "spell_pri_leap_of_faith_effect_trigger"), +(139, "spell_pri_renew"); -- Minus doesnt matter, theres no rank any more diff --git a/sql/updates/world/2012_11_25_world_spell_script_names.sql b/sql/updates/world/2012_11_25_world_spell_script_names.sql deleted file mode 100644 index f0dd277cc96..00000000000 --- a/sql/updates/world/2012_11_25_world_spell_script_names.sql +++ /dev/null @@ -1,9 +0,0 @@ -DELETE FROM spell_linked_spell WHERE spell_trigger = 73325; -INSERT INTO spell_linked_spell (spell_trigger, spell_effect, type, comment) VALUES -(73325, 92833, 0, "Priest - Leap of Faith"); - -DELETE FROM spell_script_names WHERE spell_id = 92833; -DELETE FROM spell_script_names WHERE spell_id = -139; -INSERT INTO spell_script_names (spell_id, ScriptName) VALUES -(92833, "spell_pri_leap_of_faith_effect_trigger"), -(139, "spell_pri_renew"); -- Minus doesnt matter, theres no rank any more diff --git a/sql/updates/world/2012_12_01_00_world_spell_script_names.sql b/sql/updates/world/2012_12_01_00_world_spell_script_names.sql new file mode 100644 index 00000000000..bd13cb8ef9d --- /dev/null +++ b/sql/updates/world/2012_12_01_00_world_spell_script_names.sql @@ -0,0 +1,16 @@ +-- Conjure Refreshment +DELETE FROM `spell_script_names` WHERE `spell_id`=42955; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(42955, 'spell_mage_conjure_refreshment'); + +-- Sacred Shield +DELETE FROM spell_proc_event WHERE entry=85285; +INSERT INTO spell_proc_event (entry, Cooldown) VALUES(85285, 60); +DELETE FROM spell_script_names WHERE spell_id=85285; +INSERT INTO spell_script_names (spell_id, ScriptName) VALUES +(85285, 'spell_pal_sacred_shield'); + +-- Recuperate +DELETE FROM spell_script_names WHERE spell_id=73651; +INSERT INTO spell_script_names (spell_id, ScriptName) VALUES +(73651, "spell_rog_recuperate"); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 1d94cb6caf8..da020d944e8 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -39,6 +39,7 @@ enum MageSpells SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907, SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126, + SPELL_MAGE_CONJURE_REFRESHMENT = 42955, }; class spell_mage_blast_wave : public SpellScriptLoader @@ -423,6 +424,75 @@ public: } }; +struct ConjureRefreshmentData +{ + uint32 minLevel; + uint32 maxLevel; + uint32 spellId; +}; + +uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 7; +const ConjureRefreshmentData _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] = +{ + { 33, 43, 92739 }, + { 44, 53, 92799 }, + { 54, 63, 92802 }, + { 64, 73, 92805 }, + { 74, 79, 74625 }, + { 80, 84, 92822 }, + { 85, 85, 92727 } +}; + +class spell_mage_conjure_refreshment : public SpellScriptLoader +{ + public: + spell_mage_conjure_refreshment() : SpellScriptLoader("spell_mage_conjure_refreshment") { } + + class spell_mage_conjure_refreshment_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_conjure_refreshment_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) + { + for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i) + if (!sSpellMgr->GetSpellInfo(_conjureData[i].spellId)) + return false; + return true; + } + + bool Load() + { + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + uint8 level = GetHitUnit()->getLevel(); + for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i) + { + ConjureRefreshmentData const& spellData = _conjureData[i]; + if (level < spellData.minLevel || level > spellData.maxLevel) + continue; + GetHitUnit()->CastSpell(GetHitUnit(), spellData.spellId); + break; + } + } + + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_conjure_refreshment_SpellScript(); + } +}; + void AddSC_mage_spell_scripts() { new spell_mage_blast_wave(); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 2a3fcd88778..3faa4cebe23 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -668,19 +668,53 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader } }; +class spell_pal_sacred_shield : public SpellScriptLoader +{ + public: + spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { } + + class spell_pal_sacred_shield_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_sacred_shield_SpellScript); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_DONT_REPORT; + + if (!caster->HealthBelowPct(30)) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_pal_sacred_shield_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_sacred_shield_SpellScript(); + } +}; + void AddSC_paladin_spell_scripts() { //new spell_pal_ardent_defender(); new spell_pal_blessing_of_faith(); new spell_pal_blessing_of_sanctuary(); + new spell_pal_divine_sacrifice(); + new spell_pal_exorcism_and_holy_wrath_damage(); new spell_pal_guarded_by_the_light(); + new spell_pal_hand_of_sacrifice(); new spell_pal_holy_shock(); new spell_pal_judgement_of_command(); new spell_pal_divine_storm(); new spell_pal_divine_storm_dummy(); new spell_pal_lay_on_hands(); new spell_pal_righteous_defense(); - new spell_pal_exorcism_and_holy_wrath_damage(); - new spell_pal_hand_of_sacrifice(); - new spell_pal_divine_sacrifice(); + new spell_pal_sacred_shield(); } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 39f23fc0516..ee0dd44f008 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -26,12 +26,14 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" -enum RogueSpells +enum RogueData { ROGUE_SPELL_SHIV_TRIGGERED = 5940, ROGUE_SPELL_GLYPH_OF_PREPARATION = 56819, ROGUE_SPELL_PREY_ON_THE_WEAK = 58670, ROGUE_SPELL_CHEAT_DEATH_COOLDOWN = 31231, + + ROGUE_ICON_IMPROVED_RECUPERATE = 4819 }; // Cheat Death @@ -418,12 +420,61 @@ class spell_rog_shadowstep : public SpellScriptLoader } }; +class spell_rog_recuperate : public SpellScriptLoader +{ + public: + spell_rog_recuperate() : SpellScriptLoader("spell_rog_recuperate") { } + + class spell_rog_recuperate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_recuperate_AuraScript); + + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + if (Unit* caster = GetCaster()) + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) + effect->RecalculateAmount(caster); + } + + void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + { + int32 baseAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster) * 1000; + // Improved Recuperate + if (AuraEffect const* auraEffect = caster->GetDummyAuraEffect(SPELLFAMILY_ROGUE, ROGUE_ICON_IMPROVED_RECUPERATE, EFFECT_0)) + baseAmount += auraEffect->GetAmount(); + + amount = CalculatePct(caster->GetMaxHealth(), float(baseAmount) / 1000.0f); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_recuperate_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_recuperate_AuraScript::CalculateBonus, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_recuperate_AuraScript(); + } +}; + void AddSC_rogue_spell_scripts() { new spell_rog_cheat_death(); new spell_rog_nerves_of_steel(); new spell_rog_preparation(); new spell_rog_prey_on_the_weak(); + new spell_rog_recuperate(); new spell_rog_shiv(); new spell_rog_deadly_poison(); new spell_rog_shadowstep(); -- cgit v1.2.3 From e6c763f4337cfe4ab673bb17b6d0c24c9dae1c60 Mon Sep 17 00:00:00 2001 From: Warpten Date: Fri, 7 Dec 2012 17:29:31 +0100 Subject: Core/Spells: Fixed multiple spell effects where RadiusEntry is NULL but where MaxRadiusEntry is a valid radius entry. Also fixed COD and money being swapped when sending mails, and another typo when sending battleground log data. --- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 19 +++++++++---------- src/server/game/Handlers/MailHandler.cpp | 2 +- src/server/game/Spells/SpellInfo.cpp | 14 ++++++++++++++ src/server/game/Spells/SpellInfo.h | 2 ++ src/server/scripts/Spells/spell_mage.cpp | 3 ++- 5 files changed, 28 insertions(+), 12 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 79c4f1accab..362c4e3fb65 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -403,7 +403,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) data->WriteBit(playerGUID[5]); data->WriteBit(playerGUID[1]); data->WriteBit(playerGUID[6]); - data->WriteBit(player->GetTeam() == ALLIANCE); + data->WriteBit(player->GetBGTeam() == ALLIANCE); data->WriteBit(playerGUID[7]); buff << uint32(itr->second->HealingDone); // healing done @@ -444,7 +444,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case 529: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundABScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundABScore*)itr->second)->BasesAssaulted); // bases assaulted buff << uint32(((BattlegroundABScore*)itr->second)->BasesDefended); // bases defended break; case 30: @@ -462,7 +462,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case 628: // IC data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundICScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundICScore*)itr->second)->BasesAssaulted); // bases assaulted buff << uint32(((BattlegroundICScore*)itr->second)->BasesDefended); // bases defended break; case 726: @@ -472,7 +472,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case 761: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesAssaulted); // bases assaulted buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesDefended); // bases defended break; default: @@ -495,7 +495,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case BATTLEGROUND_AB: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundABScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundABScore*)itr->second)->BasesAssaulted); // bases assaulted buff << uint32(((BattlegroundABScore*)itr->second)->BasesDefended); // bases defended break; case BATTLEGROUND_EY: @@ -509,7 +509,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case BATTLEGROUND_IC: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundICScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundICScore*)itr->second)->BasesAssaulted); // bases assaulted buff << uint32(((BattlegroundICScore*)itr->second)->BasesDefended); // bases defended break; case BATTLEGROUND_TP: @@ -519,7 +519,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case BATTLEGROUND_BFG: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesAssaulted); // bases assaulted buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesDefended); // bases defended break; case BATTLEGROUND_NA: @@ -576,7 +576,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) *data << uint8(bg->GetPlayersCountByTeam(HORDE)); if (bg->GetStatus() == STATUS_WAIT_LEAVE) - *data << uint8(bg->GetWinner()); // who win + *data << uint8(bg->GetWinner()); *data << uint8(bg->GetPlayersCountByTeam(ALLIANCE)); } @@ -777,7 +777,7 @@ Battleground* BattlegroundMgr::GetBattlegroundTemplate(BattlegroundTypeId bgType return NULL; BattlegroundContainer const& bgs = itr->second.m_Battlegrounds; - //map is sorted and we can be sure that lowest instance id has only BG template + // map is sorted and we can be sure that lowest instance id has only BG template return bgs.empty() ? NULL : bgs.begin()->second; } @@ -1497,4 +1497,3 @@ void BattlegroundMgr::RemoveBattleground(BattlegroundTypeId bgTypeId, uint32 ins { bgDataStore[bgTypeId].m_Battlegrounds.erase(instanceId); } - diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 3e84ab5151c..9e4e8c56da9 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -40,7 +40,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) recvData >> unk1; recvData >> unk2; // Stationery? - recvData >> money >> COD; // money and cod + recvData >> COD >> money; // money and cod bodyLength = recvData.ReadBits(12); subjectLength = recvData.ReadBits(9); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index fbc0ae1d803..9b9b888a9f3 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -341,6 +341,7 @@ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo con TargetA = SpellImplicitTargetInfo(_effect ? _effect->EffectImplicitTargetA : 0); TargetB = SpellImplicitTargetInfo(_effect ? _effect->EffectImplicitTargetB : 0); RadiusEntry = _effect && _effect->EffectRadiusIndex ? sSpellRadiusStore.LookupEntry(_effect->EffectRadiusIndex) : NULL; + MaxRadiusEntry = _effect && _effect->EffectRadiusMaxIndex ? sSpellRadiusStore.LookupEntry(_effect->EffectRadiusMaxIndex) : NULL; ChainTarget = _effect ? _effect->EffectChainTarget : 0; ItemType = _effect ? _effect->EffectItemType : 0; TriggerSpell = _effect ? _effect->EffectTriggerSpell : 0; @@ -534,10 +535,23 @@ bool SpellEffectInfo::HasRadius() const return RadiusEntry != NULL; } +bool SpellEffectInfo::HasMaxRadius() const +{ + return MaxRadiusEntry != NULL; +} + float SpellEffectInfo::CalcRadius(Unit* caster, Spell* spell) const { if (!HasRadius()) + { + if (HasMaxRadius()) + { + //! Still not sure which to pick. Anyway at the current time (Patch 4.3.4) most of the spell effects + //! have no radius mod per level, and RadiusMin is equal to RadiusMax. + return MaxRadiusEntry->RadiusMin; + } return 0.0f; + } float radius = RadiusEntry->RadiusMin; if (caster) diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 9abb82bbc4b..b51ed93a86f 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -247,6 +247,7 @@ public: SpellImplicitTargetInfo TargetA; SpellImplicitTargetInfo TargetB; SpellRadiusEntry const* RadiusEntry; + SpellRadiusEntry const* MaxRadiusEntry; uint32 ChainTarget; uint32 ItemType; uint32 TriggerSpell; @@ -276,6 +277,7 @@ public: float CalcDamageMultiplier(Unit* caster, Spell* spell = NULL) const; bool HasRadius() const; + bool HasMaxRadius() const; float CalcRadius(Unit* caster = NULL, Spell* = NULL) const; uint32 GetProvidedTargetMask() const; diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index da020d944e8..78217cfd7cd 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -497,11 +497,12 @@ void AddSC_mage_spell_scripts() { new spell_mage_blast_wave(); new spell_mage_cold_snap(); + new spell_mage_cone_of_cold(); + new spell_mage_conjure_refreshment(); new spell_mage_frost_warding_trigger(); new spell_mage_incanters_absorbtion_absorb(); new spell_mage_incanters_absorbtion_manashield(); new spell_mage_polymorph_cast_visual(); new spell_mage_summon_water_elemental(); new spell_mage_living_bomb(); - new spell_mage_cone_of_cold(); } -- cgit v1.2.3 From 1293de90be725521c5c8f04095cef7804811427c Mon Sep 17 00:00:00 2001 From: Shocker Date: Mon, 17 Dec 2012 01:53:52 +0200 Subject: Core/Spells: Correct effect index check for Earth's Grasp --- src/server/scripts/Spells/spell_shaman.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 939e6371d98..02c314fd472 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -158,7 +158,7 @@ class spell_sha_earthbind_totem : public SpellScriptLoader if (!owner) return; // Earth's Grasp - if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_EARTH_GRASP, EFFECT_0)) + if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_EARTH_GRASP, EFFECT_1)) { if (roll_chance_i(aurEff->GetAmount())) GetCaster()->CastSpell(GetCaster(), EARTHBIND_TOTEM_SPELL_EARTHGRAB, false); -- cgit v1.2.3 From ec6f7541b7b71b6948336de1a8e54ce36d58a918 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 24 Dec 2012 14:38:31 +0100 Subject: Core: Fix merge fail --- .../EasternKingdoms/ZulGurub/boss_arlokk.cpp | 293 ---------- .../EasternKingdoms/ZulGurub/boss_hakkar.cpp | 262 --------- .../EasternKingdoms/ZulGurub/boss_jeklik.cpp | 308 ----------- .../EasternKingdoms/ZulGurub/boss_jindo.cpp | 286 ---------- .../EasternKingdoms/ZulGurub/boss_marli.cpp | 278 ---------- .../EasternKingdoms/ZulGurub/boss_thekal.cpp | 588 --------------------- 6 files changed, 2015 deletions(-) delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp delete mode 100644 src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp deleted file mode 100644 index c5639a68860..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Arlokk -SD%Complete: 95 -SDComment: Wrong cleave and red aura is missing. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum eYells -{ - SAY_AGGRO = 0, - SAY_FEAST_PANTHER = 1, - SAY_DEATH = 2, -}; - -enum eSpells -{ - SPELL_SHADOWWORDPAIN = 23952, - SPELL_GOUGE = 24698, - SPELL_MARK = 24210, - SPELL_CLEAVE = 26350, //Perhaps not right. Not a red aura... - SPELL_PANTHER_TRANSFORM = 24190, - - MODEL_ID_NORMAL = 15218, - MODEL_ID_PANTHER = 15215, - MODEL_ID_BLANK = 11686, - - NPC_ZULIAN_PROWLER = 15101 -}; - -class boss_arlokk : public CreatureScript -{ - public: - - boss_arlokk() - : CreatureScript("boss_arlokk") - { - } - - struct boss_arlokkAI : public ScriptedAI - { - boss_arlokkAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 m_uiShadowWordPain_Timer; - uint32 m_uiGouge_Timer; - uint32 m_uiMark_Timer; - uint32 m_uiCleave_Timer; - uint32 m_uiVanish_Timer; - uint32 m_uiVisible_Timer; - - uint32 m_uiSummon_Timer; - uint32 m_uiSummonCount; - - Unit* m_pMarkedTarget; - uint64 MarkedTargetGUID; - - bool m_bIsPhaseTwo; - bool m_bIsVanished; - - void Reset() - { - m_uiShadowWordPain_Timer = 8000; - m_uiGouge_Timer = 14000; - m_uiMark_Timer = 35000; - m_uiCleave_Timer = 4000; - m_uiVanish_Timer = 60000; - m_uiVisible_Timer = 6000; - - m_uiSummon_Timer = 5000; - m_uiSummonCount = 0; - - m_bIsPhaseTwo = false; - m_bIsVanished = false; - - MarkedTargetGUID = 0; - - me->SetDisplayId(MODEL_ID_NORMAL); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void JustReachedHome() - { - if (instance) - instance->SetData(DATA_ARLOKK, NOT_STARTED); - - //we should be summoned, so despawn - me->DespawnOrUnsummon(); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - - me->SetDisplayId(MODEL_ID_NORMAL); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - if (instance) - instance->SetData(DATA_ARLOKK, DONE); - } - - void DoSummonPhanters() - { - if (MarkedTargetGUID) - Talk(SAY_FEAST_PANTHER, MarkedTargetGUID); - - me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998f, -1649.6734f, 41.4800f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970f, -1606.4840f, 41.2979f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - } - - void JustSummoned(Creature* summoned) - { - if (Unit* pMarkedTarget = Unit::GetUnit(*me, MarkedTargetGUID)) - summoned->AI()->AttackStart(pMarkedTarget); - - ++m_uiSummonCount; - } - - void UpdateAI(const uint32 uiDiff) - { - if (!UpdateVictim()) - return; - - if (!m_bIsPhaseTwo) - { - if (m_uiShadowWordPain_Timer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN); - m_uiShadowWordPain_Timer = 15000; - } - else - m_uiShadowWordPain_Timer -= uiDiff; - - if (m_uiMark_Timer <= uiDiff) - { - Unit* pMarkedTarget = SelectTarget(SELECT_TARGET_RANDOM, 0); - - if (pMarkedTarget) - { - DoCast(pMarkedTarget, SPELL_MARK); - MarkedTargetGUID = pMarkedTarget->GetGUID(); - } - else - sLog->outError(LOG_FILTER_TSCR, "boss_arlokk could not accuire pMarkedTarget."); - - m_uiMark_Timer = 15000; - } - else - m_uiMark_Timer -= uiDiff; - } - else - { - //Cleave_Timer - if (m_uiCleave_Timer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_CLEAVE); - m_uiCleave_Timer = 16000; - } - else - m_uiCleave_Timer -= uiDiff; - - //Gouge_Timer - if (m_uiGouge_Timer <= uiDiff) - { - DoCast(me->getVictim(), SPELL_GOUGE); - - DoModifyThreatPercent(me->getVictim(), -80); - - m_uiGouge_Timer = 17000+rand()%10000; - } - else - m_uiGouge_Timer -= uiDiff; - } - - if (m_uiSummonCount <= 30) - { - if (m_uiSummon_Timer <= uiDiff) - { - DoSummonPhanters(); - m_uiSummon_Timer = 5000; - } - else - m_uiSummon_Timer -= uiDiff; - } - - if (m_uiVanish_Timer <= uiDiff) - { - //Invisble Model - me->SetDisplayId(MODEL_ID_BLANK); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - me->AttackStop(); - DoResetThreat(); - - m_bIsVanished = true; - - m_uiVanish_Timer = 45000; - m_uiVisible_Timer = 6000; - } - else - m_uiVanish_Timer -= uiDiff; - - if (m_bIsVanished) - { - if (m_uiVisible_Timer <= uiDiff) - { - //The Panther Model - me->SetDisplayId(MODEL_ID_PANTHER); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); - me->UpdateDamagePhysical(BASE_ATTACK); - - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - - m_bIsPhaseTwo = true; - m_bIsVanished = false; - } - else - m_uiVisible_Timer -= uiDiff; - } - else - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_arlokkAI(creature); - } -}; - -class go_gong_of_bethekk : public GameObjectScript -{ - public: - go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") - { - } - - bool OnGossipHello(Player* /*player*/, GameObject* go) - { - if (InstanceScript* instance = go->GetInstanceScript()) - { - if (instance->GetData(DATA_ARLOKK) == DONE || instance->GetData(DATA_ARLOKK) == IN_PROGRESS) - return true; - - instance->SetData(DATA_ARLOKK, IN_PROGRESS); - return true; - } - - return true; - } -}; - -void AddSC_boss_arlokk() -{ - new boss_arlokk(); - new go_gong_of_bethekk(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp deleted file mode 100644 index 7d80de88beb..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Hakkar -SD%Complete: 95 -SDComment: Blood siphon spell buggy cause of Core Issue. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Hakkar -{ - SAY_AGGRO = 0, - SAY_FLEEING = 1, - SAY_MINION_DESTROY = 2, //where does it belong? - SAY_PROTECT_ALTAR = 3, //where does it belong? - - SPELL_BLOODSIPHON = 24322, - SPELL_CORRUPTEDBLOOD = 24328, - SPELL_CAUSEINSANITY = 24327, //Not working disabled. - SPELL_WILLOFHAKKAR = 24178, - SPELL_ENRAGE = 24318, - -// The Aspects of all High Priests - SPELL_ASPECT_OF_JEKLIK = 24687, - SPELL_ASPECT_OF_VENOXIS = 24688, - SPELL_ASPECT_OF_MARLI = 24686, - SPELL_ASPECT_OF_THEKAL = 24689, - SPELL_ASPECT_OF_ARLOKK = 24690 -}; - -class boss_hakkar : public CreatureScript -{ - public: - - boss_hakkar() - : CreatureScript("boss_hakkar") - { - } - - struct boss_hakkarAI : public ScriptedAI - { - boss_hakkarAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 BloodSiphon_Timer; - uint32 CorruptedBlood_Timer; - uint32 CauseInsanity_Timer; - uint32 WillOfHakkar_Timer; - uint32 Enrage_Timer; - - uint32 CheckJeklik_Timer; - uint32 CheckVenoxis_Timer; - uint32 CheckMarli_Timer; - uint32 CheckThekal_Timer; - uint32 CheckArlokk_Timer; - - uint32 AspectOfJeklik_Timer; - uint32 AspectOfVenoxis_Timer; - uint32 AspectOfMarli_Timer; - uint32 AspectOfThekal_Timer; - uint32 AspectOfArlokk_Timer; - - bool Enraged; - - void Reset() - { - BloodSiphon_Timer = 90000; - CorruptedBlood_Timer = 25000; - CauseInsanity_Timer = 17000; - WillOfHakkar_Timer = 17000; - Enrage_Timer = 600000; - - CheckJeklik_Timer = 1000; - CheckVenoxis_Timer = 2000; - CheckMarli_Timer = 3000; - CheckThekal_Timer = 4000; - CheckArlokk_Timer = 5000; - - AspectOfJeklik_Timer = 4000; - AspectOfVenoxis_Timer = 7000; - AspectOfMarli_Timer = 12000; - AspectOfThekal_Timer = 8000; - AspectOfArlokk_Timer = 18000; - - Enraged = false; - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - //BloodSiphon_Timer - if (BloodSiphon_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_BLOODSIPHON); - BloodSiphon_Timer = 90000; - } else BloodSiphon_Timer -= diff; - - //CorruptedBlood_Timer - if (CorruptedBlood_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_CORRUPTEDBLOOD); - CorruptedBlood_Timer = urand(30000, 45000); - } else CorruptedBlood_Timer -= diff; - - //CauseInsanity_Timer - /*if (CauseInsanity_Timer <= diff) - { - if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_CAUSEINSANITY); - - CauseInsanity_Timer = urand(35000, 43000); - } else CauseInsanity_Timer -= diff;*/ - - //WillOfHakkar_Timer - if (WillOfHakkar_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_WILLOFHAKKAR); - - WillOfHakkar_Timer = urand(25000, 35000); - } else WillOfHakkar_Timer -= diff; - - if (!Enraged && Enrage_Timer <= diff) - { - DoCast(me, SPELL_ENRAGE); - Enraged = true; - } else Enrage_Timer -= diff; - - //Checking if Jeklik is dead. If not we cast her Aspect - if (CheckJeklik_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_JEKLIK) != DONE) - { - if (AspectOfJeklik_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_JEKLIK); - AspectOfJeklik_Timer = urand(10000, 14000); - } else AspectOfJeklik_Timer -= diff; - } - } - CheckJeklik_Timer = 1000; - } else CheckJeklik_Timer -= diff; - - //Checking if Venoxis is dead. If not we cast his Aspect - if (CheckVenoxis_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_VENOXIS) != DONE) - { - if (AspectOfVenoxis_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_VENOXIS); - AspectOfVenoxis_Timer = 8000; - } else AspectOfVenoxis_Timer -= diff; - } - } - CheckVenoxis_Timer = 1000; - } else CheckVenoxis_Timer -= diff; - - //Checking if Marli is dead. If not we cast her Aspect - if (CheckMarli_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_MARLI) != DONE) - { - if (AspectOfMarli_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); - AspectOfMarli_Timer = 10000; - } else AspectOfMarli_Timer -= diff; - - } - } - CheckMarli_Timer = 1000; - } else CheckMarli_Timer -= diff; - - //Checking if Thekal is dead. If not we cast his Aspect - if (CheckThekal_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_THEKAL) != DONE) - { - if (AspectOfThekal_Timer <= diff) - { - DoCast(me, SPELL_ASPECT_OF_THEKAL); - AspectOfThekal_Timer = 15000; - } else AspectOfThekal_Timer -= diff; - } - } - CheckThekal_Timer = 1000; - } else CheckThekal_Timer -= diff; - - //Checking if Arlokk is dead. If yes we cast her Aspect - if (CheckArlokk_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_ARLOKK) != DONE) - { - if (AspectOfArlokk_Timer <= diff) - { - DoCast(me, SPELL_ASPECT_OF_ARLOKK); - DoResetThreat(); - - AspectOfArlokk_Timer = urand(10000, 15000); - } else AspectOfArlokk_Timer -= diff; - } - } - CheckArlokk_Timer = 1000; - } else CheckArlokk_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_hakkarAI(creature); - } -}; - -void AddSC_boss_hakkar() -{ - new boss_hakkar(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp deleted file mode 100644 index 3a2da6fdba9..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Jeklik -SD%Complete: 85 -SDComment: Problem in finding the right flying batriders for spawning and making them fly. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Jeklik -{ - SAY_AGGRO = 0, - SAY_RAIN_FIRE = 1, - SAY_DEATH = 2, - - SPELL_CHARGE = 22911, - SPELL_SONICBURST = 23918, - SPELL_SCREECH = 6605, - SPELL_SHADOW_WORD_PAIN = 23952, - SPELL_MIND_FLAY = 23953, - SPELL_CHAIN_MIND_FLAY = 26044, //Right ID unknown. So disabled - SPELL_GREATERHEAL = 23954, - SPELL_BAT_FORM = 23966, - - // Batriders Spell - SPELL_BOMB = 40332 //Wrong ID but Magmadars bomb is not working... -}; - -class boss_jeklik : public CreatureScript -{ - public: - - boss_jeklik() - : CreatureScript("boss_jeklik") - { - } - - struct boss_jeklikAI : public ScriptedAI - { - boss_jeklikAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 Charge_Timer; - uint32 SonicBurst_Timer; - uint32 Screech_Timer; - uint32 SpawnBats_Timer; - uint32 ShadowWordPain_Timer; - uint32 MindFlay_Timer; - uint32 ChainMindFlay_Timer; - uint32 GreaterHeal_Timer; - uint32 SpawnFlyingBats_Timer; - - bool PhaseTwo; - - void Reset() - { - Charge_Timer = 20000; - SonicBurst_Timer = 8000; - Screech_Timer = 13000; - SpawnBats_Timer = 60000; - ShadowWordPain_Timer = 6000; - MindFlay_Timer = 11000; - ChainMindFlay_Timer = 26000; - GreaterHeal_Timer = 50000; - SpawnFlyingBats_Timer = 10000; - - PhaseTwo = false; - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - DoCast(me, SPELL_BAT_FORM); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - - if (instance) - instance->SetData(DATA_JEKLIK, DONE); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->getVictim() && me->isAlive()) - { - if (HealthAbovePct(50)) - { - if (Charge_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_CHARGE); - AttackStart(target); - } - - Charge_Timer = urand(15000, 30000); - } else Charge_Timer -= diff; - - if (SonicBurst_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SONICBURST); - SonicBurst_Timer = urand(8000, 13000); - } else SonicBurst_Timer -= diff; - - if (Screech_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SCREECH); - Screech_Timer = urand(18000, 26000); - } else Screech_Timer -= diff; - - if (SpawnBats_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - - Creature* Bat = NULL; - Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - SpawnBats_Timer = 60000; - } else SpawnBats_Timer -= diff; - } - else - { - if (PhaseTwo) - { - if (PhaseTwo && ShadowWordPain_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_SHADOW_WORD_PAIN); - ShadowWordPain_Timer = urand(12000, 18000); - } - }ShadowWordPain_Timer -=diff; - - if (MindFlay_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MIND_FLAY); - MindFlay_Timer = 16000; - }MindFlay_Timer -=diff; - - if (ChainMindFlay_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - DoCast(me->getVictim(), SPELL_CHAIN_MIND_FLAY); - ChainMindFlay_Timer = urand(15000, 30000); - }ChainMindFlay_Timer -=diff; - - if (GreaterHeal_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_GREATERHEAL); - GreaterHeal_Timer = urand(25000, 35000); - }GreaterHeal_Timer -=diff; - - if (SpawnFlyingBats_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (FlyingBat) - FlyingBat->AI()->AttackStart(target); - - SpawnFlyingBats_Timer = urand(10000, 15000); - } else SpawnFlyingBats_Timer -=diff; - } - else - { - me->SetDisplayId(15219); - DoResetThreat(); - PhaseTwo = true; - } - } - - DoMeleeAttackIfReady(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_jeklikAI(creature); - } -}; - -//Flying Bat -class mob_batrider : public CreatureScript -{ - public: - - mob_batrider() - : CreatureScript("mob_batrider") - { - } - - struct mob_batriderAI : public ScriptedAI - { - mob_batriderAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 Bomb_Timer; - uint32 Check_Timer; - - void Reset() - { - Bomb_Timer = 2000; - Check_Timer = 1000; - - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) {} - - void UpdateAI (const uint32 diff) - { - if (!UpdateVictim()) - return; - - //Bomb_Timer - if (Bomb_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_BOMB); - Bomb_Timer = 5000; - } - } else Bomb_Timer -= diff; - - //Check_Timer - if (Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_JEKLIK) == DONE) - { - me->setDeathState(JUST_DIED); - me->RemoveCorpse(); - return; - } - } - - Check_Timer = 1000; - } else Check_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_batriderAI(creature); - } -}; - -void AddSC_boss_jeklik() -{ - new boss_jeklik(); - new mob_batrider(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp deleted file mode 100644 index 844a2b16800..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Jin'do the Hexxer -SD%Complete: 85 -SDComment: Mind Control not working because of core bug. Shades visible for all. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Jindo -{ - SAY_AGGRO = 1, - - SPELL_BRAINWASHTOTEM = 24262, - SPELL_POWERFULLHEALINGWARD = 24309, //We will not use this spell. We will summon a totem by script cause the spell totems will not cast. - SPELL_HEX = 24053, - SPELL_DELUSIONSOFJINDO = 24306, - SPELL_SHADEOFJINDO = 24308, //We will not use this spell. We will summon a shade by script. - - //Healing Ward Spell - SPELL_HEAL = 38588, //Totems are not working right. Right heal spell ID is 24311 but this spell is not casting... - - //Shade of Jindo Spell - SPELL_SHADOWSHOCK = 19460, - SPELL_INVISIBLE = 24699 -}; - -class boss_jindo : public CreatureScript -{ - public: - - boss_jindo() - : CreatureScript("boss_jindo") - { - } - - struct boss_jindoAI : public ScriptedAI - { - boss_jindoAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 BrainWashTotem_Timer; - uint32 HealingWard_Timer; - uint32 Hex_Timer; - uint32 Delusions_Timer; - uint32 Teleport_Timer; - - void Reset() - { - BrainWashTotem_Timer = 20000; - HealingWard_Timer = 16000; - Hex_Timer = 8000; - Delusions_Timer = 10000; - Teleport_Timer = 5000; - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - //BrainWashTotem_Timer - if (BrainWashTotem_Timer <= diff) - { - DoCast(me, SPELL_BRAINWASHTOTEM); - BrainWashTotem_Timer = urand(18000, 26000); - } else BrainWashTotem_Timer -= diff; - - //HealingWard_Timer - if (HealingWard_Timer <= diff) - { - //DoCast(me, SPELL_POWERFULLHEALINGWARD); - me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); - HealingWard_Timer = urand(14000, 20000); - } else HealingWard_Timer -= diff; - - //Hex_Timer - if (Hex_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_HEX); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -80); - - Hex_Timer = urand(12000, 20000); - } else Hex_Timer -= diff; - - //Casting the delusion curse with a shade. So shade will attack the same target with the curse. - if (Delusions_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_DELUSIONSOFJINDO); - - Creature* Shade = me->SummonCreature(14986, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Shade) - Shade->AI()->AttackStart(target); - } - - Delusions_Timer = urand(4000, 12000); - } else Delusions_Timer -= diff; - - //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer - if (Teleport_Timer <= diff) - { - Unit* target = NULL; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target && target->GetTypeId() == TYPEID_PLAYER) - { - DoTeleportPlayer(target, -11583.7783f, -1249.4278f, 77.5471f, 4.745f); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(target, -100); - - Creature* Skeletons; - Skeletons = me->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - Skeletons = me->SummonCreature(14826, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Skeletons) - Skeletons->AI()->AttackStart(target); - } - - Teleport_Timer = urand(15000, 23000); - } else Teleport_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_jindoAI(creature); - } -}; - -//Healing Ward -class mob_healing_ward : public CreatureScript -{ - public: - - mob_healing_ward() - : CreatureScript("mob_healing_ward") - { - } - - struct mob_healing_wardAI : public ScriptedAI - { - mob_healing_wardAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 Heal_Timer; - - InstanceScript* instance; - - void Reset() - { - Heal_Timer = 2000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - //Heal_Timer - if (Heal_Timer <= diff) - { - if (instance) - { - Unit* pJindo = Unit::GetUnit(*me, instance->GetData64(DATA_JINDO)); - if (pJindo) - DoCast(pJindo, SPELL_HEAL); - } - Heal_Timer = 3000; - } else Heal_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_healing_wardAI(creature); - } -}; - -//Shade of Jindo -class mob_shade_of_jindo : public CreatureScript -{ - public: - - mob_shade_of_jindo() - : CreatureScript("mob_shade_of_jindo") - { - } - - struct mob_shade_of_jindoAI : public ScriptedAI - { - mob_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 ShadowShock_Timer; - - void Reset() - { - ShadowShock_Timer = 1000; - DoCast(me, SPELL_INVISIBLE, true); - } - - void EnterCombat(Unit* /*who*/){} - - void UpdateAI (const uint32 diff) - { - - //ShadowShock_Timer - if (ShadowShock_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SHADOWSHOCK); - ShadowShock_Timer = 2000; - } else ShadowShock_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_shade_of_jindoAI(creature); - } -}; - -void AddSC_boss_jindo() -{ - new boss_jindo(); - new mob_healing_ward(); - new mob_shade_of_jindo(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp deleted file mode 100644 index 17b268b92ef..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Marli -SD%Complete: 80 -SDComment: Charging healers and casters not working. Perhaps wrong Spell Timers. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Marli -{ - SAY_AGGRO = 0, - SAY_TRANSFORM = 1, - SAY_SPIDER_SPAWN = 2, - SAY_DEATH = 3, - - SPELL_CHARGE = 22911, - SPELL_ASPECT_OF_MARLI = 24686, // A stun spell - SPELL_ENVOLWINGWEB = 24110, - SPELL_POISONVOLLEY = 24099, - SPELL_SPIDER_FORM = 24084, - -//The Spider Spells - SPELL_LEVELUP = 24312 //Not right Spell. -}; - -class boss_marli : public CreatureScript -{ - public: - - boss_marli() - : CreatureScript("boss_marli") - { - } - - struct boss_marliAI : public ScriptedAI - { - boss_marliAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 SpawnStartSpiders_Timer; - uint32 PoisonVolley_Timer; - uint32 SpawnSpider_Timer; - uint32 Charge_Timer; - uint32 Aspect_Timer; - uint32 Transform_Timer; - uint32 TransformBack_Timer; - - bool Spawned; - bool PhaseTwo; - - void Reset() - { - SpawnStartSpiders_Timer = 1000; - PoisonVolley_Timer = 15000; - SpawnSpider_Timer = 30000; - Charge_Timer = 1500; - Aspect_Timer = 12000; - Transform_Timer = 45000; - TransformBack_Timer = 25000; - - Spawned = false; - PhaseTwo = false; - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_MARLI, DONE); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->getVictim() && me->isAlive()) - { - if (PoisonVolley_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_POISONVOLLEY); - PoisonVolley_Timer = urand(10000, 20000); - } else PoisonVolley_Timer -= diff; - - if (!PhaseTwo && Aspect_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); - Aspect_Timer = urand(13000, 18000); - } else Aspect_Timer -= diff; - - if (!Spawned && SpawnStartSpiders_Timer <= diff) - { - Talk(SAY_SPIDER_SPAWN); - - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* Spider = NULL; - - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - - Spawned = true; - } else SpawnStartSpiders_Timer -= diff; - - if (SpawnSpider_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (!target) - return; - - Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - SpawnSpider_Timer = urand(12000, 17000); - } else SpawnSpider_Timer -= diff; - - if (!PhaseTwo && Transform_Timer <= diff) - { - Talk(SAY_TRANSFORM); - DoCast(me, SPELL_SPIDER_FORM); - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); - me->UpdateDamagePhysical(BASE_ATTACK); - DoCast(me->getVictim(), SPELL_ENVOLWINGWEB); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -100); - - PhaseTwo = true; - Transform_Timer = urand(35000, 60000); - } else Transform_Timer -= diff; - - if (PhaseTwo) - { - if (Charge_Timer <= diff) - { - Unit* target = NULL; - int i = 0; - while (i < 3) // max 3 tries to get a random target with power_mana - { - ++i; - target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); // not aggro leader - if (target && target->getPowerType() == POWER_MANA) - i = 3; - } - if (target) - { - DoCast(target, SPELL_CHARGE); - //me->SetPosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0); - //me->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true, 1); - AttackStart(target); - } - - Charge_Timer = 8000; - } else Charge_Timer -= diff; - - if (TransformBack_Timer <= diff) - { - me->SetDisplayId(15220); - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); - me->UpdateDamagePhysical(BASE_ATTACK); - - PhaseTwo = false; - TransformBack_Timer = urand(25000, 40000); - } else TransformBack_Timer -= diff; - - } - - DoMeleeAttackIfReady(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_marliAI(creature); - } -}; - -//Spawn of Marli -class mob_spawn_of_marli : public CreatureScript -{ - public: - - mob_spawn_of_marli() - : CreatureScript("mob_spawn_of_marli") - { - } - - struct mob_spawn_of_marliAI : public ScriptedAI - { - mob_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 LevelUp_Timer; - - void Reset() - { - LevelUp_Timer = 3000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //LevelUp_Timer - if (LevelUp_Timer <= diff) - { - DoCast(me, SPELL_LEVELUP); - LevelUp_Timer = 3000; - } else LevelUp_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_spawn_of_marliAI(creature); - } -}; - -void AddSC_boss_marli() -{ - new boss_marli(); - new mob_spawn_of_marli(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp deleted file mode 100644 index 3ea5d932ab0..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ /dev/null @@ -1,588 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Boss_Thekal -SD%Complete: 95 -SDComment: Almost finished. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Thekal -{ - SAY_AGGRO = 0, - SAY_DEATH = 1, - - SPELL_MORTALCLEAVE = 22859, - SPELL_SILENCE = 22666, - SPELL_FRENZY = 8269, - SPELL_FORCEPUNCH = 24189, - SPELL_CHARGE = 24193, - SPELL_ENRAGE = 8269, - SPELL_SUMMONTIGERS = 24183, - SPELL_TIGER_FORM = 24169, - SPELL_RESURRECT = 24173, //We will not use this spell. - -//Zealot Lor'Khan Spells - SPELL_SHIELD = 20545, - SPELL_BLOODLUST = 24185, - SPELL_GREATERHEAL = 24208, - SPELL_DISARM = 6713, - -//Zealot Zath Spells - SPELL_SWEEPINGSTRIKES = 18765, - SPELL_SINISTERSTRIKE = 15581, - SPELL_GOUGE = 12540, - SPELL_KICK = 15614, - SPELL_BLIND = 21060 -}; - -class boss_thekal : public CreatureScript -{ - public: - - boss_thekal() - : CreatureScript("boss_thekal") - { - } - - struct boss_thekalAI : public ScriptedAI - { - boss_thekalAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 MortalCleave_Timer; - uint32 Silence_Timer; - uint32 Frenzy_Timer; - uint32 ForcePunch_Timer; - uint32 Charge_Timer; - uint32 Enrage_Timer; - uint32 SummonTigers_Timer; - uint32 Check_Timer; - uint32 Resurrect_Timer; - - InstanceScript* instance; - bool Enraged; - bool PhaseTwo; - bool WasDead; - - void Reset() - { - MortalCleave_Timer = 4000; - Silence_Timer = 9000; - Frenzy_Timer = 30000; - ForcePunch_Timer = 4000; - Charge_Timer = 12000; - Enrage_Timer = 32000; - SummonTigers_Timer = 25000; - Check_Timer = 10000; - Resurrect_Timer = 10000; - - Enraged = false; - PhaseTwo = false; - WasDead = false; - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_THEKAL, DONE); - } - - void JustReachedHome() - { - if (instance) - instance->SetData(DATA_THEKAL, NOT_STARTED); - } - - void UpdateAI(const uint32 diff) - { - if (!UpdateVictim()) - return; - - //Check_Timer for the death of LorKhan and Zath. - if (!WasDead && Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_LORKHAN) == SPECIAL) - { - //Resurrect LorKhan - if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) - { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->setFaction(14); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->SetFullHealth(); - - instance->SetData(DATA_LORKHAN, DONE); - } - } - - if (instance->GetData(DATA_ZATH) == SPECIAL) - { - //Resurrect Zath - Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); - if (pZath) - { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->setFaction(14); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->SetFullHealth(); - - instance->SetData(DATA_ZATH, DONE); - } - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!PhaseTwo && MortalCleave_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_MORTALCLEAVE); - MortalCleave_Timer = urand(15000, 20000); - } else MortalCleave_Timer -= diff; - - if (!PhaseTwo && Silence_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SILENCE); - Silence_Timer = urand(20000, 25000); - } else Silence_Timer -= diff; - - if (!PhaseTwo && !WasDead && !HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->AttackStop(); - - if (instance) - instance->SetData(DATA_THEKAL, SPECIAL); - - WasDead=true; - } - - //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. - if (!PhaseTwo && WasDead) - { - if (Resurrect_Timer <= diff) - { - DoCast(me, SPELL_TIGER_FORM); - me->SetObjectScale(2.00f); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFullHealth(); - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40))); - me->UpdateDamagePhysical(BASE_ATTACK); - DoResetThreat(); - PhaseTwo = true; - } else Resurrect_Timer -= diff; - } - - if (me->IsFullHealth() && WasDead) - { - WasDead = false; - } - - if (PhaseTwo) - { - if (Charge_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_CHARGE); - DoResetThreat(); - AttackStart(target); - } - - Charge_Timer = urand(15000, 22000); - } else Charge_Timer -= diff; - - if (Frenzy_Timer <= diff) - { - DoCast(me, SPELL_FRENZY); - Frenzy_Timer = 30000; - } else Frenzy_Timer -= diff; - - if (ForcePunch_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SILENCE); - ForcePunch_Timer = urand(16000, 21000); - } else ForcePunch_Timer -= diff; - - if (SummonTigers_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SUMMONTIGERS); - SummonTigers_Timer = urand(10000, 14000); - } else SummonTigers_Timer -= diff; - - if (HealthBelowPct(11) && !Enraged) - { - DoCast(me, SPELL_ENRAGE); - Enraged = true; - } - } - - DoMeleeAttackIfReady(); - - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_thekalAI(creature); - } -}; - -//Zealot Lor'Khan -class mob_zealot_lorkhan : public CreatureScript -{ - public: - - mob_zealot_lorkhan() - : CreatureScript("mob_zealot_lorkhan") - { - } - - struct mob_zealot_lorkhanAI : public ScriptedAI - { - mob_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 Shield_Timer; - uint32 BloodLust_Timer; - uint32 GreaterHeal_Timer; - uint32 Disarm_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - - void Reset() - { - Shield_Timer = 1000; - BloodLust_Timer = 16000; - GreaterHeal_Timer = 32000; - Disarm_Timer = 6000; - Check_Timer = 10000; - - FakeDeath = false; - - if (instance) - instance->SetData(DATA_LORKHAN, NOT_STARTED); - - me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - if (!UpdateVictim()) - return; - - //Shield_Timer - if (Shield_Timer <= diff) - { - DoCast(me, SPELL_SHIELD); - Shield_Timer = 61000; - } else Shield_Timer -= diff; - - //BloodLust_Timer - if (BloodLust_Timer <= diff) - { - DoCast(me, SPELL_BLOODLUST); - BloodLust_Timer = 20000+rand()%8000; - } else BloodLust_Timer -= diff; - - //Casting Greaterheal to Thekal or Zath if they are in meele range. - if (GreaterHeal_Timer <= diff) - { - if (instance) - { - Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)); - Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); - - if (!pThekal || !pZath) - return; - - switch (urand(0, 1)) - { - case 0: - if (me->IsWithinMeleeRange(pThekal)) - DoCast(pThekal, SPELL_GREATERHEAL); - break; - case 1: - if (me->IsWithinMeleeRange(pZath)) - DoCast(pZath, SPELL_GREATERHEAL); - break; - } - } - - GreaterHeal_Timer = 15000+rand()%5000; - } else GreaterHeal_Timer -= diff; - - //Disarm_Timer - if (Disarm_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_DISARM); - Disarm_Timer = 15000+rand()%10000; - } else Disarm_Timer -= diff; - - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_THEKAL) == SPECIAL) - { - //Resurrect Thekal - if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) - { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->setFaction(14); - pThekal->SetFullHealth(); - } - } - - if (instance->GetData(DATA_ZATH) == SPECIAL) - { - //Resurrect Zath - if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH))) - { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->setFaction(14); - pZath->SetFullHealth(); - } - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->setFaction(35); - me->AttackStop(); - - if (instance) - instance->SetData(DATA_LORKHAN, SPECIAL); - - FakeDeath = true; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_zealot_lorkhanAI(creature); - } -}; - -//Zealot Zath -class mob_zealot_zath : public CreatureScript -{ - public: - - mob_zealot_zath() - : CreatureScript("mob_zealot_zath") - { - } - - struct mob_zealot_zathAI : public ScriptedAI - { - mob_zealot_zathAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 SweepingStrikes_Timer; - uint32 SinisterStrike_Timer; - uint32 Gouge_Timer; - uint32 Kick_Timer; - uint32 Blind_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - - void Reset() - { - SweepingStrikes_Timer = 13000; - SinisterStrike_Timer = 8000; - Gouge_Timer = 25000; - Kick_Timer = 18000; - Blind_Timer = 5000; - Check_Timer = 10000; - - FakeDeath = false; - - if (instance) - instance->SetData(DATA_ZATH, NOT_STARTED); - - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI (const uint32 diff) - { - if (!UpdateVictim()) - return; - - //SweepingStrikes_Timer - if (SweepingStrikes_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SWEEPINGSTRIKES); - SweepingStrikes_Timer = 22000+rand()%4000; - } else SweepingStrikes_Timer -= diff; - - //SinisterStrike_Timer - if (SinisterStrike_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_SINISTERSTRIKE); - SinisterStrike_Timer = 8000+rand()%8000; - } else SinisterStrike_Timer -= diff; - - //Gouge_Timer - if (Gouge_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_GOUGE); - - if (DoGetThreat(me->getVictim())) - DoModifyThreatPercent(me->getVictim(), -100); - - Gouge_Timer = 17000+rand()%10000; - } else Gouge_Timer -= diff; - - //Kick_Timer - if (Kick_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_KICK); - Kick_Timer = 15000+rand()%10000; - } else Kick_Timer -= diff; - - //Blind_Timer - if (Blind_Timer <= diff) - { - DoCast(me->getVictim(), SPELL_BLIND); - Blind_Timer = 10000+rand()%10000; - } else Blind_Timer -= diff; - - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) - { - if (instance) - { - if (instance->GetData(DATA_LORKHAN) == SPECIAL) - { - //Resurrect LorKhan - if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) - { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->setFaction(14); - pLorKhan->SetFullHealth(); - } - } - - if (instance->GetData(DATA_THEKAL) == SPECIAL) - { - //Resurrect Thekal - if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL))) - { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->setFaction(14); - pThekal->SetFullHealth(); - } - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->setFaction(35); - me->AttackStop(); - - if (instance) - instance->SetData(DATA_ZATH, SPECIAL); - - FakeDeath = true; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new mob_zealot_zathAI(creature); - } -}; - -void AddSC_boss_thekal() -{ - new boss_thekal(); - new mob_zealot_lorkhan(); - new mob_zealot_zath(); -} - -- cgit v1.2.3 From accc83a76dd1fae8174146abaf099e36023d58cf Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 24 Dec 2012 17:18:43 +0100 Subject: Core/Scripts: Fix typo --- .../scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp index 204db428bf0..4677ce52e1c 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -81,7 +81,7 @@ class boss_jindo_the_godbreaker : public CreatureScript CreatureAI* GetAI(Creature* creature) const { - return new boss_jindo_the_godbreakerAI(creature); + return GetZulGurubAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp index 17c73ae96bd..a60eeb0c715 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp @@ -82,7 +82,7 @@ class boss_kilnara : public CreatureScript CreatureAI* GetAI(Creature* creature) const { - return new boss_kilnaraAI(creature); + return GetZulGurubAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 55f257e5ecc..3619f0d0bc9 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -84,7 +84,7 @@ class boss_mandokir : public CreatureScript CreatureAI* GetAI(Creature* creature) const { - return new boss_mandokirAI(creature); + return GetZulGurubAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 83815d17d2e..8980d766400 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -87,7 +87,7 @@ class boss_venoxis : public CreatureScript CreatureAI* GetAI(Creature* creature) const { - return new boss_venoxisAI(creature); + return GetZulGurubAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp index 2d5fae00550..7466d8e47d3 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp @@ -81,7 +81,7 @@ class boss_zanzil : public CreatureScript CreatureAI* GetAI(Creature* creature) const { - return new boss_zanzilAI(creature); + return GetZulGurubAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 0deeb1c974d..dc4db4be5c4 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -54,7 +54,7 @@ enum CreatureIds }; template -CreatureAI* GetZulGurubCitadelAI(Creature* creature) +CreatureAI* GetZulGurubAI(Creature* creature) { if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) if (instance->GetInstanceScript()) -- cgit v1.2.3 From 7b534774b63537f300d22f21c38e8b46794b6a2f Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 24 Dec 2012 17:21:07 +0100 Subject: Core/Spells: Remove spell script "spell_gen_damage_reduction_aura" --- .../2012_12_24_00_world_spell_script_names_434.sql | 1 + src/server/scripts/Spells/spell_generic.cpp | 56 ---------------------- 2 files changed, 1 insertion(+), 56 deletions(-) create mode 100644 sql/updates/world/2012_12_24_00_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_24_00_world_spell_script_names_434.sql b/sql/updates/world/2012_12_24_00_world_spell_script_names_434.sql new file mode 100644 index 00000000000..d95da8f3239 --- /dev/null +++ b/sql/updates/world/2012_12_24_00_world_spell_script_names_434.sql @@ -0,0 +1 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_damage_reduction_aura'; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index c8f3236a008..e0c35a96426 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1322,61 +1322,6 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader } }; -enum DamageReductionAura -{ - SPELL_BLESSING_OF_SANCTUARY = 20911, - SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, - SPELL_RENEWED_HOPE = 63944, - SPELL_VIGILANCE = 50720, - SPELL_DAMAGE_REDUCTION_AURA = 68066, -}; - -class spell_gen_damage_reduction_aura : public SpellScriptLoader -{ - public: - spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } - - class spell_gen_damage_reduction_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_damage_reduction_AuraScript); - - bool Validate(SpellInfo const* /*SpellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) - return false; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_RENEWED_HOPE) || - target->HasAura(SPELL_VIGILANCE))) - target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_damage_reduction_AuraScript(); - } -}; - class spell_gen_luck_of_the_draw : public SpellScriptLoader { public: @@ -3247,7 +3192,6 @@ void AddSC_generic_spell_scripts() new spell_gen_launch(); new spell_gen_vehicle_scaling(); new spell_gen_oracle_wolvar_reputation(); - new spell_gen_damage_reduction_aura(); new spell_gen_luck_of_the_draw(); new spell_gen_dummy_trigger(); new spell_gen_spirit_healer_res(); -- cgit v1.2.3 From b4996c90ffc59045c2999da909e77a3ddd666f02 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 24 Dec 2012 17:26:42 +0100 Subject: Core: Fix some codestyle --- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 6 +++--- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Spells/SpellInfo.cpp | 2 +- src/server/scripts/Northrend/dragonblight.cpp | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9615513a181..52002fd39bd 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3113,7 +3113,7 @@ void Player::GiveLevel(uint8 level) if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up UpdateSkillsToMaxSkillsForLevel(); - _ApplyAllLevelScaleItemMods(true); // Moved to above SetFullHealth so player will have full health from Heirlooms + _ApplyAllLevelScaleItemMods(true); // Moved to above SetFullHealth so player will have full health from Heirlooms // set current level health and mana/energy to maximum after applying all mods. SetFullHealth(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f3111fab39c..de1044271c9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16669,10 +16669,10 @@ void Unit::NearTeleportTo(float x, float y, float z, float orientation, bool cas void Unit::SendTeleportPacket(Position& pos) { Position oldPos = {GetPositionX(), GetPositionY(), GetPositionZMinusOffset(), GetOrientation()}; - + if (GetTypeId() == TYPEID_UNIT) Relocate(&pos); - + ObjectGuid guid = GetGUID(); ObjectGuid transGuid = GetTransGUID(); @@ -16731,7 +16731,7 @@ void Unit::SendTeleportPacket(Position& pos) Relocate(&pos); else Relocate(&oldPos); - + SendMessageToSet(&data, true); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5b086747442..053876d0532 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1579,7 +1579,7 @@ class Unit : public WorldObject void SendSpellDamageImmune(Unit* target, uint32 spellId); void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false); - void SendTeleportPacket(Position& oldPos); + void SendTeleportPacket(Position& pos); virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport = false); // returns true if unit's position really changed bool UpdatePosition(const Position &pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index e8d0cb6feeb..70932fc6821 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1680,7 +1680,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta if (unitTarget->HasUnitState(UNIT_STATE_IN_FLIGHT)) return SPELL_FAILED_BAD_TARGETS; - /* TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to + /* TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to not allow passengers to be implicitly hit by spells, however this target type should be an exception, if this is left it kills spells that award kill credit from vehicle to master (few spells), the use of these 2 covers passenger target check, logically, if vehicle cast this to master it should always hit diff --git a/src/server/scripts/Northrend/dragonblight.cpp b/src/server/scripts/Northrend/dragonblight.cpp index 698daba99e3..695a942721d 100644 --- a/src/server/scripts/Northrend/dragonblight.cpp +++ b/src/server/scripts/Northrend/dragonblight.cpp @@ -182,12 +182,12 @@ enum WyrmDefenderEnum // Quest data QUEST_DEFENDING_WYRMREST_TEMPLE = 12372, GOSSIP_TEXTID_DEF1 = 12899, - + // Gossip data GOSSIP_TEXTID_DEF2 = 12900, // Spells data - SPELL_CHARACTER_SCRIPT = 49213, + SPELL_CHARACTER_SCRIPT = 49213, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE = 52421, // ID - 52421 Wyrmrest Defender: On Low Health Boss Emote to Controller - Random /self/ SPELL_RENEW = 49263, // casted to heal drakes SPELL_WYRMREST_DEFENDER_MOUNT = 49256, @@ -258,7 +258,7 @@ class npc_wyrmrest_defender : public CreatureScript me->CastSpell(me, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE); hpWarningReady = false; } - + if (renewRecoveryCanCheck) { if (RenewRecoveryChecker <= diff) -- cgit v1.2.3 From d3d9dfd7346b46eb0994ab89ac97a09d5dbde2fb Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 24 Dec 2012 21:35:34 +0100 Subject: Core/Script: Add some talks for Zul'Gurub --- .../ZulGurub/boss_jindo_the_godbreaker.cpp | 23 ++++- .../EasternKingdoms/ZulGurub/boss_kilnara.cpp | 21 +++- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 21 +++- .../EasternKingdoms/ZulGurub/boss_venoxis.cpp | 23 ++++- .../EasternKingdoms/ZulGurub/boss_zanzil.cpp | 24 ++++- .../EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 107 +++++++++++---------- .../scripts/EasternKingdoms/ZulGurub/zulgurub.h | 8 ++ 7 files changed, 160 insertions(+), 67 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp index 4677ce52e1c..bcf742fcf32 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -22,6 +22,22 @@ enum Yells { + // Jin'do the Godbreaker + SAY_INTRO = 0, + SAY_AGGRO = 1, + EMOTE_SHADOWS_OF_HAKKAR = 2, // ID - 97172 Shadows of Hakkar + SAY_JINDO_SPIRIT_PHASE = 3, + //SAY_PLAYER_KILL = 4, // missing data + + // Spirit of Hakkar + SAY_SPIRIT_SPIRIT_PHASE = 0, + SAY_SPIRIT_DEFEATED = 1, + + // Jin'do the Godbreaker - Trigger + SAY_JINDO_DEFEATED = 0, + + // Shadow of Hakkar + SAY_SHADOW_DEFEATED = 0, }; enum Spells @@ -39,16 +55,17 @@ class boss_jindo_the_godbreaker : public CreatureScript struct boss_jindo_the_godbreakerAI : public BossAI { - boss_jindo_the_godbreakerAI(Creature* creature) : BossAI(creature, DATA_JINDO) - { - } + boss_jindo_the_godbreakerAI(Creature* creature) : BossAI(creature, DATA_JINDO) { } void Reset() { + _Reset(); } void EnterCombat(Unit* /*who*/) { + _EnterCombat(); + Talk(SAY_AGGRO); } void JustDied(Unit* /*killer*/) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp index a60eeb0c715..f582edd54db 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp @@ -23,6 +23,12 @@ enum Yells { + SAY_AGGRO = 0, + SAY_WAVE_OF_AGONY = 1, // ID - 96457 Wave of Agony + SAY_TRANSFROM_1 = 2, + SAY_TRANSFROM_2 = 3, + SAY_PLAYER_KILL = 4, + SAY_DEATH = 5 }; enum Spells @@ -40,20 +46,29 @@ class boss_kilnara : public CreatureScript struct boss_kilnaraAI : public BossAI { - boss_kilnaraAI(Creature* creature) : BossAI(creature, DATA_KILNARA) - { - } + boss_kilnaraAI(Creature* creature) : BossAI(creature, DATA_KILNARA) { } void Reset() { + _Reset(); } void EnterCombat(Unit* /*who*/) { + _EnterCombat(); + Talk(SAY_AGGRO); } void JustDied(Unit* /*killer*/) { + _JustDied(); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_PLAYER_KILL); } void UpdateAI(uint32 const diff) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 3619f0d0bc9..fde47a2ccb5 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -22,6 +22,14 @@ enum Yells { + SAY_AGGRO = 0, + SAY_PLAYER_KILL = 1, + SAY_DISMOUNT_OHGAN = 2, + EMOTE_DEVASTATING_SLAM = 3, // ID - 96739 Devastating Slam + SAY_REANIMATE_OHGAN = 4, // ID - 96724 Reanimate Ohgan + EMOTE_FRENZY = 5, // ID - 96800 Frenzy + SAY_FRENZY = 6, // ID - 96800 Frenzy + SAY_DEATH = 7 }; enum Spells @@ -44,18 +52,25 @@ class boss_mandokir : public CreatureScript void Reset() { + _Reset(); } - void KilledUnit(Unit* /*victim*/) + void EnterCombat(Unit* /*who*/) { + _EnterCombat(); + Talk(SAY_AGGRO); } - void EnterCombat(Unit* /*who*/) + void JustDied(Unit* /*killer*/) { + _JustDied(); + Talk(SAY_DEATH); } - void JustDied(Unit* /*killer*/) + void KilledUnit(Unit* victim) { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_PLAYER_KILL); } void UpdateAI(uint32 const diff) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 8980d766400..a0ca0cff73d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -24,6 +24,14 @@ enum Yells { + SAY_AGGRO = 0, + SAY_BLOODVENOM = 1, // ID - 96842 Venomous Effusion + SAY_TRANSFROM = 2, // ID - 97354 Blessing of the Snake God + SAY_WORD_OF_HETHISS = 3, // ID - 96560 Word of Hethiss + EMOTE_BLOODVENOM = 4, // ID - 96842 Bloodvenom + EMOTE_VENOM_WITHDRAWAL = 5, // ID - 96653 Venom Withdrawal + SAY_PLAYER_KILL = 6, + SAY_DEATH = 7 }; enum Spells @@ -41,24 +49,29 @@ class boss_venoxis : public CreatureScript struct boss_venoxisAI : public BossAI { - boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) - { - } + boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { } void Reset() { + _Reset(); } void EnterCombat(Unit* /*who*/) { + _EnterCombat(); + Talk(SAY_AGGRO); } - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) + void JustDied(Unit* /*killer*/) { + _JustDied(); + Talk(SAY_DEATH); } - void JustDied(Unit* /*killer*/) + void KilledUnit(Unit* victim) { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_PLAYER_KILL); } void UpdateAI(uint32 const diff) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp index 7466d8e47d3..00b8c8747f6 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp @@ -22,6 +22,15 @@ enum Yells { + SAY_AGGRO = 0, + EMOTE_ZANZIL_ZOMBIES = 1, // ID - 96319 Zanzil's Resurrection Elixir + SAY_ZANZIL_ZOMBIES = 2, // ID - 96319 Zanzil's Resurrection Elixir + EMOTE_ZANZIL_GRAVEYARD_GAS = 3, // ID - 96338 Zanzil's Graveyard Gas + SAY_ZANZIL_GRAVEYARD_GAS = 4, // ID - 96338 Zanzil's Graveyard Gas + EMOTE_ZANZIL_BERSEKER = 5, // ID - 96316 Zanzil's Resurrection Elixir + SAY_ZANZIL_BERSEKER = 6, // ID - 96316 Zanzil's Resurrection Elixir + SAY_PLAYER_KILL = 7, + SAY_DEATH = 8 }; enum Spells @@ -39,20 +48,29 @@ class boss_zanzil : public CreatureScript struct boss_zanzilAI : public BossAI { - boss_zanzilAI(Creature* creature) : BossAI(creature, DATA_ZANZIL) - { - } + boss_zanzilAI(Creature* creature) : BossAI(creature, DATA_ZANZIL) { } void Reset() { + _Reset(); } void EnterCombat(Unit* /*who*/) { + _EnterCombat(); + Talk(SAY_AGGRO); } void JustDied(Unit* /*killer*/) { + _JustDied(); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_PLAYER_KILL); } void UpdateAI(uint32 const diff) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index b887755e25a..953d9f392bd 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -30,50 +30,54 @@ class instance_zulgurub : public InstanceMapScript instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) { SetBossNumber(EncounterCount); - venoxisGUID = 0; - mandokirGUID = 0; - kilnaraGUID = 0; - zanzilGUID = 0; - jindoGUID = 0; - hazzarahGUID = 0; - renatakiGUID = 0; - wushoolayGUID = 0; - grilekGUID = 0; + venoxisGUID = 0; + mandokirGUID = 0; + kilnaraGUID = 0; + zanzilGUID = 0; + jindoGUID = 0; + hazzarahGUID = 0; + renatakiGUID = 0; + wushoolayGUID = 0; + grilekGUID = 0; + jindoTiggerGUID = 0; } void OnCreatureCreate(Creature* creature) { switch (creature->GetEntry()) { - case NPC_VENOXIS: - venoxisGUID = creature->GetGUID(); - break; - case NPC_MANDOKIR: - mandokirGUID = creature->GetGUID(); - break; - case NPC_KILNARA: - kilnaraGUID = creature->GetGUID(); - break; - case NPC_ZANZIL: - zanzilGUID = creature->GetGUID(); - break; - case NPC_JINDO: - jindoGUID = creature->GetGUID(); - break; - case NPC_HAZZARAH: - hazzarahGUID = creature->GetGUID(); - break; - case NPC_RENATAKI: - renatakiGUID = creature->GetGUID(); - break; - case NPC_WUSHOOLAY: - wushoolayGUID = creature->GetGUID(); - break; - case NPC_GRILEK: - grilekGUID = creature->GetGUID(); - break; - default: - break; + case NPC_VENOXIS: + venoxisGUID = creature->GetGUID(); + break; + case NPC_MANDOKIR: + mandokirGUID = creature->GetGUID(); + break; + case NPC_KILNARA: + kilnaraGUID = creature->GetGUID(); + break; + case NPC_ZANZIL: + zanzilGUID = creature->GetGUID(); + break; + case NPC_JINDO: + jindoGUID = creature->GetGUID(); + break; + case NPC_HAZZARAH: + hazzarahGUID = creature->GetGUID(); + break; + case NPC_RENATAKI: + renatakiGUID = creature->GetGUID(); + break; + case NPC_WUSHOOLAY: + wushoolayGUID = creature->GetGUID(); + break; + case NPC_GRILEK: + grilekGUID = creature->GetGUID(); + break; + case NPC_JINDO_TRIGGER: + jindoTiggerGUID = creature->GetGUID(); + break; + default: + break; } } @@ -84,18 +88,18 @@ class instance_zulgurub : public InstanceMapScript switch (type) { - case DATA_VENOXIS: - case DATA_MANDOKIR: - case DATA_KILNARA: - case DATA_ZANZIL: - case DATA_JINDO: - case DATA_HAZZARAH: - case DATA_RENATAKI: - case DATA_WUSHOOLAY: - case DATA_GRILEK: - break; - default: - break; + case DATA_VENOXIS: + case DATA_MANDOKIR: + case DATA_KILNARA: + case DATA_ZANZIL: + case DATA_JINDO: + case DATA_HAZZARAH: + case DATA_RENATAKI: + case DATA_WUSHOOLAY: + case DATA_GRILEK: + break; + default: + break; } return true; @@ -141,6 +145,8 @@ class instance_zulgurub : public InstanceMapScript return wushoolayGUID; case DATA_GRILEK: return grilekGUID; + case DATA_JINDOR_TRIGGER: + return jindoTiggerGUID; default: break; } @@ -202,6 +208,7 @@ class instance_zulgurub : public InstanceMapScript uint64 renatakiGUID; uint64 wushoolayGUID; uint64 grilekGUID; + uint64 jindoTiggerGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index dc4db4be5c4..cdf4724dc35 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -36,6 +36,9 @@ enum DataTypes DATA_RENATAKI = 6, DATA_WUSHOOLAY = 7, DATA_GRILEK = 8, + + // Jin'do the Godbreaker + DATA_JINDOR_TRIGGER, }; enum CreatureIds @@ -51,6 +54,11 @@ enum CreatureIds NPC_RENATAKI = 52269, NPC_WUSHOOLAY = 52286, NPC_GRILEK = 52258, + + // Jin'do the Godbreaker + NPC_JINDO_TRIGGER = 52150, + NPC_SPIRIT_OF_HAKKAR = 52222, + NPC_SHADOW_OF_HAKKAR = 52650 }; template -- cgit v1.2.3 From f9e592e9c7b758d8d61d43e7f2c6b09cc0c1dd7f Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 24 Dec 2012 18:24:30 -0500 Subject: Scripts/HallsOfOrigination: Some work on Halls of Origination. Temple Guardian Anhuur's script added. ToDo: Make the triggers invisible. Merry Christmas folks! --- ...012_12_24_09_world_halls_of_origination_434.sql | 50 +++ src/server/game/Grids/Notifiers/GridNotifiers.h | 19 + src/server/game/Scripting/ScriptLoader.cpp | 5 + src/server/game/Spells/SpellMgr.cpp | 7 + src/server/scripts/Kalimdor/CMakeLists.txt | 3 + .../boss_temple_guardian_anhuur.cpp | 402 +++++++++++++++++++++ .../HallsOfOrigination/halls_of_origination.h | 70 ++++ .../instance_halls_of_origination.cpp | 167 +++++++++ .../IcecrownCitadel/boss_the_lich_king.cpp | 23 +- 9 files changed, 725 insertions(+), 21 deletions(-) create mode 100644 sql/updates/world/2012_12_24_09_world_halls_of_origination_434.sql create mode 100644 src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp create mode 100644 src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h create mode 100644 src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_24_09_world_halls_of_origination_434.sql b/sql/updates/world/2012_12_24_09_world_halls_of_origination_434.sql new file mode 100644 index 00000000000..940f3407f23 --- /dev/null +++ b/sql/updates/world/2012_12_24_09_world_halls_of_origination_434.sql @@ -0,0 +1,50 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=76599; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 76599, 0, 0, 31, 0, 5, 207218, 0, 0, 0, 0, '', 'Activate Beacons - Beacon of Light'), +(13, 1, 76599, 0, 1, 31, 0, 5, 207219, 0, 0, 0, 0, '', 'Activate Beacons - Beacon of Light'), +(13, 1, 76599, 0, 2, 31, 0, 5, 203133, 0, 0, 0, 0, '', 'Activate Beacons - Beacon of Light'), +(13, 1, 76599, 0, 3, 31, 0, 5, 203136, 0, 0, 0, 0, '', 'Activate Beacons - Beacon of Light'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=75194; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 75194, 0, 0, 31, 0, 3, 40283, 0, 0, 0, 0, '', 'Burning Light - Searing Light'); + +UPDATE `creature_template` SET `ScriptName`='boss_temple_guardian_anhuur' WHERE `entry`=39425; +UPDATE `creature_template` SET `ScriptName`='',`unit_flags`=`unit_flags`|0x00000040|0x00008000 WHERE `entry`=40183; + +DELETE FROM `spell_target_position` WHERE `id`=74969; +INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES +(74969, 644, -640.437, 335.306, 77.7573, 1.52073); + +UPDATE `instance_template` SET `script`='instance_halls_of_origination' WHERE `map`=644; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (76573,74930); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 2, 74930, 0, 0, 31, 0, 3, 40183, 0, 0, 0, 0, '', 'Shield of Light - Cave In Stalker'), +(13, 2, 76573, 0, 0, 31, 0, 3, 40183, 0, 0, 0, 0, '', 'Shield of Light - Cave In Stalker'); + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (74930,76573,76599,76606,76608); +INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) VALUES +(74930, 'spell_anhuur_shield_of_light'), +(76573, 'spell_anhuur_shield_of_light'), +(76599, 'spell_anhuur_activate_beacons'), +(76606, 'spell_anhuur_disable_beacon_beams'), +(76608, 'spell_anhuur_disable_beacon_beams'), +(75592, 'spell_anhuur_divine_reckoning'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (76606,76608); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,76606,0,0,31,0,3,40183,0,0,0,'','Disable Beacon Beams L - Cave In Stalker'), +(13,1,76608,0,0,31,0,3,40183,0,0,0,'','Disable Beacon Beams R - Cave In Stalker'); + +DELETE FROM `creature_text` WHERE `entry`=39425; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(39425, 0, 0, 'Turn back, intruders! These halls must not be disturbed!', 14, 0, 100, 0, 0, 18580, 'Temple Guardian Anhuur - SAY_AGGRO'), +(39425, 1, 0, 'Beacons of light, bestow upon me your aegis!', 14, 0, 100, 0, 0, 18581, 'Temple Guardian Anhuur - SAY_SHIELD'), +(39425, 2, 0, '%s becomes protected by his defense beacons! Disable them by pulling the levers below!', 41, 0, 100, 0, 0, 0, 'Temple Guardian Anhuur - EMOTE_SHIELD'), +(39425, 3, 0, '%s is no longer protected by the beacons!', 41, 0, 100, 0, 0, 0, 'Temple Guardian Anhuur'), +(39425, 4, 0, 'I regret nothing.', 14, 0, 100, 0, 0, 18582, 'Temple Guardian Anhuur'), +(39425, 5, 0, 'What... have you... done?', 14, 0, 100, 0, 0, 18579, 'Temple Guardian Anhuur - SAY_DEATH'); + +-- Template updates for creature 40283 (Searing Light) +UPDATE `creature_template` SET `faction_A`=14,`faction_H`=14,`minlevel`=80,`maxlevel`=80,`baseattacktime`=2000,`unit_flags`=`unit_flags`|33555008 WHERE `entry`=40283; -- Searing Light diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 1dbf1ba0be8..73dd5aa7247 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1375,6 +1375,25 @@ namespace Trinity uint64 _GUID; }; + class HeightDifferenceCheck + { + public: + HeightDifferenceCheck(WorldObject* go, float diff, bool reverse) + : _baseObject(go), _difference(diff), _reverse(reverse) + { + } + + bool operator()(WorldObject* unit) const + { + return (unit->GetPositionZ() - _baseObject->GetPositionZ() > _difference) != _reverse; + } + + private: + WorldObject* _baseObject; + float _difference; + bool _reverse; + }; + class UnitAuraCheck { public: diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 97ad1d5f651..5faae2bf719 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -328,6 +328,8 @@ void AddSC_wailing_caverns(); //Wailing caverns void AddSC_instance_wailing_caverns(); void AddSC_zulfarrak(); //Zul'Farrak generic void AddSC_instance_zulfarrak(); //Zul'Farrak instance script +void AddSC_instance_halls_of_origination(); +void AddSC_boss_temple_guardian_anhuur(); void AddSC_ashenvale(); void AddSC_azshara(); @@ -979,6 +981,9 @@ void AddKalimdorScripts() AddSC_thunder_bluff(); AddSC_ungoro_crater(); AddSC_winterspring(); + + AddSC_instance_halls_of_origination(); + AddSC_boss_temple_guardian_anhuur(); #endif } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index b86d67ff1ca..295aeceee8c 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3661,6 +3661,13 @@ void SpellMgr::LoadSpellInfoCorrections() case 49345: // Call Emerald Drake spellInfo->Effects[EFFECT_1].Effect = 0; break; + // Halls Of Origination spells + // Temple Guardian Anhuur + case 76606: // Disable Beacon Beams L + case 76608: // Disable Beacon Beams R + // Little hack, Increase the radius so it can hit the Cave In Stalkers in the platform. + spellInfo->Effects[EFFECT_0].MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_45_YARDS); + break; default: break; } diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index f54c23afb3c..37e2f86e787 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -110,6 +110,9 @@ set(scripts_STAT_SRCS Kalimdor/OnyxiasLair/boss_onyxia.cpp Kalimdor/OnyxiasLair/onyxias_lair.h Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp + Kalimdor/HallsOfOrigination/halls_of_origination.h + Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp + Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp ) message(" -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp new file mode 100644 index 00000000000..0df55f5f276 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -0,0 +1,402 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuras.h" +#include "halls_of_origination.h" +#include "Player.h" + +enum Texts +{ + SAY_AGGRO = 0, + SAY_SHIELD = 1, + EMOTE_SHIELD = 2, + EMOTE_UNSHIELD = 3, + SAY_KILL = 4, + SAY_DEATH = 5 +}; + +enum Events +{ + EVENT_DIVINE_RECKONING = 1, + EVENT_BURNING_LIGHT = 2, + EVENT_SEAR = 3, +}; + +enum Spells +{ + SPELL_DIVINE_RECKONING = 75592, + SPELL_BURNING_LIGHT = 75115, + SPELL_REVERBERATING_HYMN = 75322, + SPELL_SHIELD_OF_LIGHT = 74938, + + SPELL_ACTIVATE_BEACONS = 76599, + SPELL_TELEPORT = 74969, + + SPELL_SHIELD_VISUAL_RIGHT = 83698, + SPELL_BEAM_OF_LIGHT_RIGHT = 76573, + + SPELL_SHIELD_VISUAL_LEFT = 83697, + SPELL_BEAM_OF_LIGHT_LEFT = 74930, + + SPELL_SEARING_LIGHT = 75194, +}; + +enum Phases +{ + PHASE_SHIELDED = 0, + PHASE_FIRST_SHIELD = 1, // Ready to be shielded for the first time + PHASE_SECOND_SHIELD = 2, // First shield already happened, ready to be shielded a second time + PHASE_FINAL = 3 // Already shielded twice, ready to finish the encounter normally. +}; + +enum Actions +{ + ACTION_DISABLE_BEACON, +}; + +class boss_temple_guardian_anhuur : public CreatureScript +{ +public: + boss_temple_guardian_anhuur() : CreatureScript("boss_temple_guardian_anhuur") { } + + struct boss_temple_guardian_anhuurAI : public BossAI + { + boss_temple_guardian_anhuurAI(Creature* creature) : BossAI(creature, DATA_TEMPLE_GUARDIAN_ANHUUR) { } + + void CleanStalkers() + { + std::list stalkers; + GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) + { + (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_RIGHT); + (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_LEFT); + } + } + + void Reset() + { + _phase = PHASE_FIRST_SHIELD; + _oldPhase = PHASE_FIRST_SHIELD; + _beacons = 0; + _Reset(); + CleanStalkers(); + me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); + events.ScheduleEvent(EVENT_DIVINE_RECKONING, urand(10000, 12000)); + events.ScheduleEvent(EVENT_BURNING_LIGHT, 12000); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) + { + if ((me->HealthBelowPctDamaged(66, damage) && _phase == PHASE_FIRST_SHIELD) || + (me->HealthBelowPctDamaged(33, damage) && _phase == PHASE_SECOND_SHIELD)) + { + _beacons = 2; + _phase++; // Increase the phase + _oldPhase = _phase; + + _phase = PHASE_SHIELDED; + + me->InterruptNonMeleeSpells(true); + me->AttackStop(); + DoCast(me, SPELL_TELEPORT); + + DoCast(me, SPELL_SHIELD_OF_LIGHT); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31); + + DoCastAOE(SPELL_ACTIVATE_BEACONS); + + std::list stalkers; + GameObject* door = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR)); + GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); + + stalkers.remove_if(Trinity::HeightDifferenceCheck(door, 0.0f, false)); // Target only the bottom ones + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) + { + if ((*itr)->GetPositionX() > door->GetPositionX()) + { + (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_LEFT, true); + (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_LEFT, true); + } + else + { + (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_RIGHT, true); + (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_RIGHT, true); + } + } + + DoCast(me, SPELL_REVERBERATING_HYMN); + + Talk(EMOTE_SHIELD); + Talk(SAY_SHIELD); + } + } + + void DoAction(int32 const action) + { + if (action == ACTION_DISABLE_BEACON) + { + --_beacons; + if (!_beacons) + { + me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); + Talk(EMOTE_UNSHIELD); + _phase = _oldPhase; + } + } + } + + void EnterCombat(Unit* /*who*/) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + Talk(SAY_AGGRO); + _EnterCombat(); + } + + void JustDied(Unit* /*killer*/) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + Talk(SAY_DEATH); + _JustDied(); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustReachedHome() + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _JustReachedHome(); + instance->SetBossState(DATA_TEMPLE_GUARDIAN_ANHUUR, FAIL); + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim() || !CheckInRoom() || me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) || _phase == PHASE_SHIELDED) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DIVINE_RECKONING: + DoCastVictim(SPELL_DIVINE_RECKONING); + events.ScheduleEvent(EVENT_DIVINE_RECKONING, urand(10000, 12000)); + break; + case EVENT_BURNING_LIGHT: + { + Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)); + if (!unit) + unit = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); + DoCast(unit, SPELL_BURNING_LIGHT); + events.ScheduleEvent(EVENT_SEAR, 2000); + events.ScheduleEvent(EVENT_BURNING_LIGHT, 12000); + break; + } + case EVENT_SEAR: + { + Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f); + if (!target) + break; + + std::list stalkers; + GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); + stalkers.remove_if(Trinity::HeightDifferenceCheck(ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR)), 5.0f, true)); + + if (stalkers.empty()) + break; + + stalkers.sort(Trinity::ObjectDistanceOrderPred(target)); + + // Get the closest statue face (any of its eyes) + Creature* eye1 = stalkers.front(); + stalkers.remove(eye1); // Remove the eye. + stalkers.sort(Trinity::ObjectDistanceOrderPred(eye1)); // Find the second eye. + Creature* eye2 = stalkers.front(); + + eye1->CastSpell(eye1, SPELL_SEARING_LIGHT, true); + eye2->CastSpell(eye2, SPELL_SEARING_LIGHT, true); + break; + } + } + } + + DoMeleeAttackIfReady(); + } + + private: + uint8 _phase; + uint8 _oldPhase; + uint8 _beacons; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetHallsOfOriginationAI(creature); + } +}; + +class spell_anhuur_shield_of_light : public SpellScriptLoader +{ + public: + spell_anhuur_shield_of_light() : SpellScriptLoader("spell_anhuur_shield_of_light") { } + + class spell_anhuur_shield_of_light_SpellScript : public SpellScript + { + PrepareSpellScript(spell_anhuur_shield_of_light_SpellScript); + + void FilterTargets(std::list& targets) + { + if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) + { + if (InstanceScript* const script = instance->GetInstanceScript()) + { + if (GameObject* go = ObjectAccessor::GetGameObject(*GetCaster(), script->GetData64(DATA_ANHUUR_DOOR))) + { + targets.remove_if(Trinity::HeightDifferenceCheck(go, 5.0f, false)); + targets.remove(GetCaster()); + targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster())); + targets.resize(2); + } + } + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anhuur_shield_of_light_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_anhuur_shield_of_light_SpellScript(); + } +}; + +class spell_anhuur_disable_beacon_beams : public SpellScriptLoader +{ + public: + spell_anhuur_disable_beacon_beams() : SpellScriptLoader("spell_anhuur_disable_beacon_beams") { } + + class spell_anhuur_disable_beacon_beams_SpellScript : public SpellScript + { + PrepareSpellScript(spell_anhuur_disable_beacon_beams_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(GetEffectValue()); + } + + void Notify(SpellEffIndex /*index*/) + { + if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) + if (InstanceScript* const script = instance->GetInstanceScript()) + if (Creature* anhuur = instance->GetCreature(script->GetData64(DATA_ANHUUR_GUID))) + anhuur->AI()->DoAction(ACTION_DISABLE_BEACON); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHit += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::Notify, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_anhuur_disable_beacon_beams_SpellScript(); + } +}; + +class spell_anhuur_activate_beacons : public SpellScriptLoader +{ + public: + spell_anhuur_activate_beacons() : SpellScriptLoader("spell_anhuur_activate_beacons") { } + + class spell_anhuur_activate_beacons_SpellScript : public SpellScript + { + PrepareSpellScript(spell_anhuur_activate_beacons_SpellScript); + + void Activate(SpellEffIndex index) + { + PreventHitDefaultEffect(index); + GetHitGObj()->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_anhuur_activate_beacons_SpellScript::Activate, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_anhuur_activate_beacons_SpellScript(); + } +}; + +class spell_anhuur_divine_reckoning : public SpellScriptLoader +{ +public: + spell_anhuur_divine_reckoning() : SpellScriptLoader("spell_anhuur_divine_reckoning") { } + + class spell_anhuur_divine_reckoning_AuraScript : public AuraScript + { + PrepareAuraScript(spell_anhuur_divine_reckoning_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + if (Unit* caster = GetCaster()) + { + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); + caster->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, values, GetTarget()); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_anhuur_divine_reckoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_anhuur_divine_reckoning_AuraScript(); + } +}; + +void AddSC_boss_temple_guardian_anhuur() +{ + new boss_temple_guardian_anhuur(); + new spell_anhuur_shield_of_light(); + new spell_anhuur_disable_beacon_beams(); + new spell_anhuur_activate_beacons(); + new spell_anhuur_divine_reckoning(); +} \ No newline at end of file diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h new file mode 100644 index 00000000000..d25272c92ac --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef HALLS_OF_ORIGINATION_H +#define HALLS_OF_ORIGINATION_H + +#define HoOScriptName "instance_halls_of_origination" + +uint32 const EncounterCount = 7; + +enum Data +{ + // Bosses + DATA_TEMPLE_GUARDIAN_ANHUUR, + DATA_EARTHRAGER_PTAH, + DATA_ANRAPHET, + DATA_ISISET, + DATA_AMMUNAE, + DATA_SETESH, + DATA_RAJH, + + // Temple Guardian Anhuur + DATA_ANHUUR_GUID, + DATA_ANHUUR_LEFT_BEACON, + DATA_ANHUUR_RIGHT_BEACON, + DATA_ANHUUR_BRIDGE, + DATA_ANHUUR_DOOR, +}; + +enum Creatures +{ + BOSS_TEMPLE_GUARDIAN_ANHUUR = 39425, + NPC_CAVE_IN_STALKER = 40183, + NPC_SEARING_LIGHT = 40283, +}; + +enum GameObjects +{ + GO_ANHUURS_BRIDGE = 206506, + GO_DOODAD_ULDUM_ELEVATOR_COL01 = 207725, + GO_ANHUURS_DOOR = 202307, + GO_ANHUURS_RIGHT_BEACON = 203136, + GO_ANHUURS_LEFT_BEACON = 203133, +}; + +template +CreatureAI* GetHallsOfOriginationAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(HoOScriptName)) + return new AI(creature); + return NULL; +} + +#endif // HALLS_OF_ORIGINATION_H \ No newline at end of file diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp new file mode 100644 index 00000000000..f879f7b3202 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "InstanceScript.h" +#include "ScriptedCreature.h" +#include "Map.h" +#include "PoolMgr.h" +#include "AccountMgr.h" +#include "halls_of_origination.h" +#include "Player.h" +#include "WorldPacket.h" +#include "WorldSession.h" + +DoorData const doorData[] = +{ + {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } +}; + +class instance_halls_of_origination : public InstanceMapScript +{ + public: + instance_halls_of_origination() : InstanceMapScript(HoOScriptName, 644) { } + + struct instance_halls_of_origination_InstanceMapScript : public InstanceScript + { + instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + TempleGuardianAnhuurGUID = 0; + AnhuursBridgeGUID = 0; + AnhuursDoorGUID = 0; + AnhuurRightBeaconGUID = 0; + AnhuurLeftBeaconGUID = 0; + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_ANHUURS_BRIDGE: + AnhuursBridgeGUID = go->GetGUID(); + case GO_DOODAD_ULDUM_ELEVATOR_COL01: + AddDoor(go, true); + break; + case GO_ANHUURS_DOOR: + AnhuursDoorGUID = go->GetGUID(); + AddDoor(go, true); + break; + case GO_ANHUURS_RIGHT_BEACON: + AnhuurRightBeaconGUID = go->GetGUID(); + break; + case GO_ANHUURS_LEFT_BEACON: + AnhuurLeftBeaconGUID = go->GetGUID(); + break; + } + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case BOSS_TEMPLE_GUARDIAN_ANHUUR: + TempleGuardianAnhuurGUID = creature->GetGUID(); + break; + } + } + + uint64 GetData64(uint32 index) const + { + switch (index) + { + case DATA_ANHUUR_BRIDGE: + return AnhuursBridgeGUID; + case DATA_ANHUUR_DOOR: + return AnhuursDoorGUID; + case DATA_ANHUUR_LEFT_BEACON: + return AnhuurLeftBeaconGUID; + case DATA_ANHUUR_RIGHT_BEACON: + return AnhuurRightBeaconGUID; + case DATA_ANHUUR_GUID: + return TempleGuardianAnhuurGUID; + } + + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "H O " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* str) + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'H' && dataHead2 == 'O') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + protected: + uint64 TempleGuardianAnhuurGUID; + uint64 AnhuursBridgeGUID; + uint64 AnhuursDoorGUID; + uint64 AnhuurRightBeaconGUID; + uint64 AnhuurLeftBeaconGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_halls_of_origination_InstanceMapScript(map); + } +}; + +void AddSC_instance_halls_of_origination() +{ + new instance_halls_of_origination(); +} diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index ec5172aeb83..a2663074de8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -383,25 +383,6 @@ class NecroticPlagueTargetCheck : public std::unary_function uint32 _notAura2; }; -class HeightDifferenceCheck -{ - public: - HeightDifferenceCheck(GameObject* go, float diff, bool reverse) - : _baseObject(go), _difference(diff), _reverse(reverse) - { - } - - bool operator()(WorldObject* unit) const - { - return (unit->GetPositionZ() - _baseObject->GetPositionZ() > _difference) != _reverse; - } - - private: - GameObject* _baseObject; - float _difference; - bool _reverse; -}; - class FrozenThroneResetWorker { public: @@ -1535,7 +1516,7 @@ class npc_valkyr_shadowguard : public CreatureScript { std::list triggers; GetCreatureListWithEntryInGrid(triggers, me, NPC_WORLD_TRIGGER, 150.0f); - triggers.remove_if(HeightDifferenceCheck(platform, 5.0f, true)); + triggers.remove_if(Trinity::HeightDifferenceCheck(platform, 5.0f, true)); if (triggers.empty()) return; @@ -2325,7 +2306,7 @@ class spell_the_lich_king_quake : public SpellScriptLoader void FilterTargets(std::list& targets) { if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetData64(DATA_ARTHAS_PLATFORM))) - targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false)); + targets.remove_if(Trinity::HeightDifferenceCheck(platform, 5.0f, false)); } void HandleSendEvent(SpellEffIndex /*effIndex*/) -- cgit v1.2.3 From 587710feb5f4de21204900d57c7a34320aadb85e Mon Sep 17 00:00:00 2001 From: Subv Date: Tue, 25 Dec 2012 19:35:13 -0500 Subject: Scripts/HallsOfOrigination: Added script for Earthrager Ptah. ToDo: Fix spell Sand Vortex on Heroic difficulty. Note: Feedback needed. --- ...012_12_25_01_world_halls_of_origination_434.sql | 54 ++++ src/server/game/Scripting/ScriptLoader.cpp | 2 + src/server/game/Spells/SpellMgr.cpp | 5 + src/server/scripts/Kalimdor/CMakeLists.txt | 3 +- .../HallsOfOrigination/boss_earthrager_ptah.cpp | 350 +++++++++++++++++++++ .../HallsOfOrigination/halls_of_origination.h | 6 + .../instance_halls_of_origination.cpp | 12 + 7 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql create mode 100644 src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql b/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql new file mode 100644 index 00000000000..2e6c1b0e5f0 --- /dev/null +++ b/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql @@ -0,0 +1,54 @@ +DELETE FROM `creature_text` WHERE `entry`=39428; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(39428, 0, 0, 'More carrion for the swarm...', 14, 0, 100, 0, 0, 18906, 'Earthrager Ptah - SAY_AGGRO'), +(39428, 1, 0, 'Ptah... is... no more...', 14, 0, 100, 0, 0, 18905, 'Earthrager Ptah - SAY_DEATH'); + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (75540,94974,75519); +INSERT INTO `spell_script_names` VALUES +(75540,'spell_earthrager_ptah_flame_bolt'), +(75519 ,'spell_earthrager_ptah_explosion'), +(94974,'spell_earthrager_ptah_earth_spike'); + +UPDATE `creature_template` SET `ScriptName`='boss_earthrager_ptah' WHERE `Entry`=39428; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=89398; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 6, 89398, 0, 0, 31, 0, 3, 39443, 0, 0, 0, 0, '', 'Earth Spike - Camel'); + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=39443; +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(39443,89397,1,0); + +-- Jeweled Scarab SAI +SET @ENTRY := 40458; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,54,0,100,0,0,0,0,0,91,9,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Jeweled Scarab - On just summoned - Remove field byte for submerged'), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,11,65982,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Jeweled Scarab - Linked - Cast emerge'), +(@ENTRY,0,2,0,1,0,100,1,2500,2500,2500,2500,49,0,0,0,0,0,0,21,100,0,0,0,0,0,0, 'Jeweled Scarab - OOC (one time) - Attack player in 100 yards'), +(@ENTRY,0,3,4,6,0,100,0,0,0,0,0,45,0,1,0,0,0,0,11,39428,100,0,0,0,0,0, 'Jeweled Scarab - On death - Set data 0 - 1'), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,90,9,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Jeweled Scarab - Linked - Add again byte for submerged'); + +-- Dustbone Horror SAI +SET @ENTRY := 40450; +SET @SPELL := 75453; -- Smash +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,91,9,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dustbone Horror - On just summoned - Remove field byte 1 for submerged'), +(@ENTRY,0,1,0,1,0,100,1,2500,2500,2500,2500,49,0,0,0,0,0,0,21,100,0,0,0,0,0,0, 'Dustbone Horror - OOC (one time) - Attack player in 100 yards'), +(@ENTRY,0,2,0,0,0,100,0,10000,12000,10000,12000,11,@SPELL,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Dustbone Horror - Combat - Cast Smash'), +(@ENTRY,0,3,4,6,0,100,0,0,0,0,0,45,0,1,0,0,0,0,11,39428,100,0,0,0,0,0, 'Dustbone Horror - On death - Set data 0 - 1'), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,90,9,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dustbone Horror - Linked - Add again byte for submerged'); + +-- Add creature_addon data +DELETE FROM `creature_template_addon` WHERE `entry` IN (40458,40450); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(40458,0,0,9,1,0,NULL), +(40450,0,0,9,1,0,NULL); + +SET @QUICKSAND := 75548; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@QUICKSAND; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@QUICKSAND,0,0,0,54,0,100,0,0,0,0,0,11,40503,0,0,0,0,0,1,0,0,0,0,0,0,0,'Quicksand - On summoned (spawned) - Cast spell'); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 5faae2bf719..a025f856d79 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -330,6 +330,7 @@ void AddSC_zulfarrak(); //Zul'Farrak generic void AddSC_instance_zulfarrak(); //Zul'Farrak instance script void AddSC_instance_halls_of_origination(); void AddSC_boss_temple_guardian_anhuur(); +void AddSC_boss_earthrager_ptah(); void AddSC_ashenvale(); void AddSC_azshara(); @@ -984,6 +985,7 @@ void AddKalimdorScripts() AddSC_instance_halls_of_origination(); AddSC_boss_temple_guardian_anhuur(); + AddSC_boss_earthrager_ptah(); #endif } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index faca4956d28..d1ec90c2ff3 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3672,6 +3672,11 @@ void SpellMgr::LoadSpellInfoCorrections() // Aura is refreshed at 3 seconds, and the tick should happen at the fourth. spellInfo->AttributesEx8 |= SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER; break; + // Earthrager Ptah + case 94974: + // Hacked as a timed event until SPELL_EFFECT_TRIGGER_MISSILE is correctly fixed. + spellInfo->Effects[EFFECT_0].TriggerSpell = 0; + break; default: break; } diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index 37e2f86e787..49415506565 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -111,8 +111,9 @@ set(scripts_STAT_SRCS Kalimdor/OnyxiasLair/onyxias_lair.h Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp Kalimdor/HallsOfOrigination/halls_of_origination.h - Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp + Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp + Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp ) message(" -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp new file mode 100644 index 00000000000..1d5b473f09f --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -0,0 +1,350 @@ +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuras.h" +#include "halls_of_origination.h" +#include "Player.h" + +enum Texts +{ + SAY_AGGRO = 0, + SAY_DEATH = 1, +}; + +enum Events +{ + EVENT_RAGING_SMASH = 1, + EVENT_FLAME_BOLT = 2, + EVENT_EARTH_SPIKE = 3, + EVENT_PTAH_EXPLODE = 4, + EVENT_QUICKSAND = 5, +}; + +enum Spells +{ + SPELL_RAGING_SMASH = 83650, + SPELL_FLAME_BOLT = 77370, + SPELL_EARTH_SPIKE_WARN = 94974, + SPELL_EARTH_SPIKE_ERUPT = 75339, + + SPELL_PTAH_EXPLOSION = 75519, + SPELL_SANDSTORM = 75491, + + SPELL_SUMMON_QUICKSAND = 75550, // Spell not in DBC, no SMSG_SPELL_START/GO for it + + SPELL_BEETLE_BURROW = 75463, + + SPELL_SUMMON_JEWELED_SCARAB = 75462, + SPELL_SUMMON_DUSTBONE_HORROR = 75521, +}; + +enum Phases +{ + PHASE_NORMAL = 1, + PHASE_DISPERSE = 2, + + PHASE_MASK_DISPERSE = (1 << PHASE_DISPERSE), + PHASE_MASK_NORMAL = (1 << PHASE_NORMAL), +}; + +enum PtahData +{ + DATA_SUMMON_DEATHS = 0 +}; + +class SummonScarab : public BasicEvent +{ +public: + SummonScarab(Unit* owner, InstanceScript* instance) : _owner(owner), _instance(instance) { } + + bool Execute(uint64 execTime, uint32 /*diff*/) + { + if (!_instance || _instance->GetBossState(DATA_EARTHRAGER_PTAH) != IN_PROGRESS) + return true; // delete event + + _owner->CastSpell(_owner, SPELL_SUMMON_JEWELED_SCARAB); + _owner->RemoveAurasDueToSpell(SPELL_BEETLE_BURROW); + return true; + } +protected: + InstanceScript* _instance; + Unit* _owner; +}; + +class EruptEarthSpike : public BasicEvent +{ +public: + EruptEarthSpike(Unit* caster, WorldLocation const target) : _caster(caster), _target(target) { } + + bool Execute(uint64 execTime, uint32 /*diff*/) + { + _caster->CastSpell(_target.GetPositionX(), _target.GetPositionY(), _target.GetPositionZ(), SPELL_EARTH_SPIKE_ERUPT, true); + return true; + } + +protected: + Unit* _caster; + WorldLocation const _target; +}; + +class boss_earthrager_ptah : public CreatureScript +{ +public: + boss_earthrager_ptah() : CreatureScript("boss_earthrager_ptah") { } + + struct boss_earthrager_ptahAI : public BossAI + { + boss_earthrager_ptahAI(Creature* creature) : BossAI(creature, DATA_EARTHRAGER_PTAH), _summonDeaths(0), _hasDispersed(false) { } + + void Cleanup() + { + std::list units; + + GetCreatureListWithEntryInGrid(units, me, NPC_DUSTBONE_HORROR, 100.0f); + for (std::list::iterator itr = units.begin(); itr != units.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + + GetCreatureListWithEntryInGrid(units, me, NPC_JEWELED_SCARAB, 100.0f); + for (std::list::iterator itr = units.begin(); itr != units.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + } + + void Reset() + { + _summonDeaths = 0; + _hasDispersed = false; + Cleanup(); + _Reset(); + events.SetPhase(PHASE_NORMAL); + events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) + { + if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_MASK_NORMAL) && !_hasDispersed) + { + events.SetPhase(PHASE_DISPERSE); + _hasDispersed = true; + + me->AttackStop(); + DoCast(me, SPELL_SANDSTORM); + events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6000, 0, PHASE_DISPERSE); + events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); + + std::list stalkers; + GetCreatureListWithEntryInGrid(stalkers, me, NPC_BEETLE_STALKER, 100.0f); + std::list beetlers = stalkers; + + Trinity::Containers::RandomResizeList(beetlers, 9); // Holds the summoners of Jeweled Scarab + + for (std::list::iterator itr = beetlers.begin(); itr != beetlers.end(); ++itr) + { + stalkers.remove((*itr)); // Remove it to prevent a single trigger from spawning multiple npcs. + (*itr)->CastSpell((*itr), SPELL_BEETLE_BURROW); // Cast visual + // Summon after 5 seconds. + (*itr)->m_Events.AddEvent(new SummonScarab((*itr), instance), (*itr)->m_Events.CalculateTime(5000)); + } + + Trinity::Containers::RandomResizeList(stalkers, 2); // Holds the summoners of Dustbone Horror + + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) + (*itr)->CastSpell((*itr), SPELL_SUMMON_DUSTBONE_HORROR); + } + } + + void SetData(uint32 index, uint32 value) + { + if (index == DATA_SUMMON_DEATHS) + { + ++_summonDeaths; + if (_summonDeaths == 11) // All summons died + { + me->RemoveAurasDueToSpell(SPELL_PTAH_EXPLOSION); + events.SetPhase(PHASE_NORMAL); + events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); + } + } + } + + void EnterCombat(Unit* /*who*/) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + Talk(SAY_AGGRO); + _EnterCombat(); + } + + void JustDied(Unit* /*killer*/) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + Talk(SAY_DEATH); + _JustDied(); + Cleanup(); + } + + void JustReachedHome() + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _JustReachedHome(); + instance->SetBossState(DATA_EARTHRAGER_PTAH, FAIL); + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RAGING_SMASH: + DoCastVictim(SPELL_RAGING_SMASH); + events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); + break; + case EVENT_FLAME_BOLT: + DoCast(me, SPELL_FLAME_BOLT); + events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); + break; + case EVENT_EARTH_SPIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_EARTH_SPIKE_WARN); + events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); + break; + case EVENT_PTAH_EXPLODE: + DoCast(me, SPELL_PTAH_EXPLOSION); + break; + case EVENT_QUICKSAND: + // Spell not in DBC, it is not cast either, according to sniffs + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + if (Creature* quicksand = me->SummonCreature(NPC_QUICKSAND, *target)) + quicksand->SetUInt32Value(UNIT_CREATED_BY_SPELL, SPELL_SUMMON_QUICKSAND); + events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); + break; + } + } + + if (events.GetPhaseMask() & PHASE_MASK_NORMAL) // Do not melee in the disperse phase + DoMeleeAttackIfReady(); + } + + protected: + bool _hasDispersed; + uint8 _summonDeaths; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetHallsOfOriginationAI(creature); + } +}; + +class spell_earthrager_ptah_flame_bolt : public SpellScriptLoader +{ + public: + spell_earthrager_ptah_flame_bolt() : SpellScriptLoader("spell_earthrager_ptah_flame_bolt") { } + + class spell_earthrager_ptah_flame_bolt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_earthrager_ptah_flame_bolt_SpellScript); + + void FilterTargets(std::list& targets) + { + Trinity::Containers::RandomResizeList(targets, GetCaster()->GetMap()->IsHeroic() ? 3 : 2); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_earthrager_ptah_flame_bolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_earthrager_ptah_flame_bolt_SpellScript(); + } +}; + +class spell_earthrager_ptah_earth_spike : public SpellScriptLoader +{ +public: + spell_earthrager_ptah_earth_spike() : SpellScriptLoader("spell_earthrager_ptah_earth_spike") { } + + class spell_earthrager_ptah_earth_spike_SpellScript : public SpellScript + { + PrepareSpellScript(spell_earthrager_ptah_earth_spike_SpellScript); + + void Launch(SpellEffIndex index) + { + PreventHitDefaultEffect(index); + // Erupt the spike in 4 seconds. + GetCaster()->m_Events.AddEvent(new EruptEarthSpike(GetCaster(), *GetExplTargetDest()), GetCaster()->m_Events.CalculateTime(4000)); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_earthrager_ptah_earth_spike_SpellScript::Launch, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_earthrager_ptah_earth_spike_SpellScript(); + } +}; + +class spell_earthrager_ptah_explosion : public SpellScriptLoader +{ +public: + spell_earthrager_ptah_explosion() : SpellScriptLoader("spell_earthrager_ptah_explosion") { } + + class spell_earthrager_ptah_explosion_AuraScript : public AuraScript + { + PrepareAuraScript(spell_earthrager_ptah_explosion_AuraScript); + + void SetFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* ptah = GetCaster()) + { + ptah->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31); + ptah->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + } + } + + void RemoveFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* ptah = GetCaster()) + { + ptah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31); + ptah->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_earthrager_ptah_explosion_AuraScript::SetFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_earthrager_ptah_explosion_AuraScript::RemoveFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_earthrager_ptah_explosion_AuraScript(); + } +}; + +void AddSC_boss_earthrager_ptah() +{ + new boss_earthrager_ptah(); + new spell_earthrager_ptah_flame_bolt(); + new spell_earthrager_ptah_earth_spike(); + new spell_earthrager_ptah_explosion(); +} \ No newline at end of file diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index d25272c92ac..1f11b594353 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -46,6 +46,12 @@ enum Creatures BOSS_TEMPLE_GUARDIAN_ANHUUR = 39425, NPC_CAVE_IN_STALKER = 40183, NPC_SEARING_LIGHT = 40283, + + BOSS_EARTHRAGER_PTAH = 39428, + NPC_BEETLE_STALKER = 40459, // Summons both Jeweled Scarab and Dustbone Horror + NPC_JEWELED_SCARAB = 40458, + NPC_DUSTBONE_HORROR = 40450, + NPC_QUICKSAND = 40503, // Summoned by a spell not in dbc (75550) }; enum GameObjects diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index f879f7b3202..726ecbacd2e 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -75,6 +75,18 @@ class instance_halls_of_origination : public InstanceMapScript } } + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_ANHUURS_BRIDGE: + case GO_DOODAD_ULDUM_ELEVATOR_COL01: + case GO_ANHUURS_DOOR: + AddDoor(go, false); + break; + } + } + void OnCreatureCreate(Creature* creature) { switch (creature->GetEntry()) -- cgit v1.2.3 From 3742205866e76ff1e5078da5fd20de2a7bab6f83 Mon Sep 17 00:00:00 2001 From: Subv Date: Tue, 25 Dec 2012 19:40:57 -0500 Subject: Copyright: Added missing license information. --- .../HallsOfOrigination/boss_earthrager_ptah.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index 1d5b473f09f..3cb89f75c25 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + #include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -- cgit v1.2.3 From e65da39f23ed4dfad38585ccf09ddcfc3138bbb7 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Wed, 26 Dec 2012 02:50:19 +0100 Subject: Core: Fix non pch build --- .../world/2012_12_25_01_world_halls_of_origination_434.sql | 2 +- .../scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp | 7 ++++--- .../Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp | 8 +++++--- .../scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql b/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql index 84588cf76d9..7b2cd1a7245 100644 --- a/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql +++ b/sql/updates/world/2012_12_25_01_world_halls_of_origination_434.sql @@ -3,7 +3,7 @@ INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language (39428, 0, 0, 'More carrion for the swarm...', 14, 0, 100, 0, 0, 18906, 'Earthrager Ptah - SAY_AGGRO'), (39428, 1, 0, 'Ptah... is... no more...', 14, 0, 100, 0, 0, 18905, 'Earthrager Ptah - SAY_DEATH'); -DELETE FROM `spell_script_names` WHERE `spell_id` IN (75540,94974,75519); +DELETE FROM `spell_script_names` WHERE `spell_id` IN (75540,89881,94974,75519); INSERT INTO `spell_script_names` VALUES (75540,'spell_earthrager_ptah_flame_bolt'), (89881,'spell_earthrager_ptah_flame_bolt'), diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index 3cb89f75c25..19c27d49a79 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -18,9 +18,10 @@ #include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "SpellAuras.h" -#include "halls_of_origination.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "Player.h" +#include "halls_of_origination.h" enum Texts { @@ -364,4 +365,4 @@ void AddSC_boss_earthrager_ptah() new spell_earthrager_ptah_flame_bolt(); new spell_earthrager_ptah_earth_spike(); new spell_earthrager_ptah_explosion(); -} \ No newline at end of file +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index 0df55f5f276..d4f9593df03 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -18,9 +18,11 @@ #include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "SpellAuras.h" -#include "halls_of_origination.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "GridNotifiers.h" #include "Player.h" +#include "halls_of_origination.h" enum Texts { @@ -399,4 +401,4 @@ void AddSC_boss_temple_guardian_anhuur() new spell_anhuur_disable_beacon_beams(); new spell_anhuur_activate_beacons(); new spell_anhuur_divine_reckoning(); -} \ No newline at end of file +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 1f11b594353..f1316c5db3c 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -73,4 +73,4 @@ CreatureAI* GetHallsOfOriginationAI(Creature* creature) return NULL; } -#endif // HALLS_OF_ORIGINATION_H \ No newline at end of file +#endif // HALLS_OF_ORIGINATION_H -- cgit v1.2.3 From 0622cf8b64b9b77e583ae99baf42c01237ca7fb5 Mon Sep 17 00:00:00 2001 From: huri Date: Wed, 26 Dec 2012 18:03:41 +0100 Subject: Scripts/Spells: Fixed Mage's Improved Flamestrike, Ice Shards, Shatter, Shattered Barrier, Incanter's Absorption, Improved Mana Gem, Improved Freeze --- .../2012_12_26_00_world_spell_script_names_434.sql | 39 ++ src/server/game/Entities/Unit/Unit.cpp | 8 +- src/server/game/Spells/Auras/SpellAuras.cpp | 10 - src/server/scripts/Spells/spell_mage.cpp | 411 +++++++++++++++++---- 4 files changed, 374 insertions(+), 94 deletions(-) create mode 100644 sql/updates/world/2012_12_26_00_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_26_00_world_spell_script_names_434.sql b/sql/updates/world/2012_12_26_00_world_spell_script_names_434.sql new file mode 100644 index 00000000000..c1c7a8db271 --- /dev/null +++ b/sql/updates/world/2012_12_26_00_world_spell_script_names_434.sql @@ -0,0 +1,39 @@ +-- Blast Wave +DELETE FROM `spell_script_names` WHERE `spell_id`=11113 OR `ScriptName`='spell_mage_blast_wave'; +INSERT INTO `spell_script_names` VALUES +(11113,'spell_mage_blast_wave'); + +-- Blizzard +DELETE FROM `spell_script_names` WHERE `spell_id`=42208 OR `ScriptName`='spell_mage_blizzard'; +INSERT INTO `spell_script_names` VALUES +(42208,'spell_mage_blizzard'); + +-- Frostbolt +DELETE FROM `spell_script_names` WHERE `spell_id`=116 OR `ScriptName`='spell_mage_frostbolt'; +INSERT INTO `spell_script_names` VALUES +(116,'spell_mage_frostbolt'); + +-- Ice Barrier +DELETE FROM `spell_script_names` WHERE `spell_id`=11426 OR `ScriptName`='spell_mage_ice_barrier'; +INSERT INTO `spell_script_names` VALUES +(11426,'spell_mage_ice_barrier'); + +-- Mana Shield +DELETE FROM `spell_script_names` WHERE `spell_id`=1463 OR `ScriptName`='spell_mage_mana_shield' OR `ScriptName`='spell_mage_incanters_absorbtion_manashield'; +INSERT INTO `spell_script_names` VALUES +(1463,'spell_mage_mana_shield'); + +-- Mage Ward +DELETE FROM `spell_script_names` WHERE `spell_id`=543 OR `ScriptName`='spell_mage_mage_ward' OR `ScriptName`='spell_mage_incanters_absorbtion_absorb'; +INSERT INTO `spell_script_names` VALUES +(543,'spell_mage_mage_ward'); + +-- Replenish Mana (Mana Gem) +DELETE FROM `spell_script_names` WHERE `spell_id`=5405 OR `ScriptName`='spell_mage_replenish_mana'; +INSERT INTO `spell_script_names` VALUES +(5405,'spell_mage_replenish_mana'); + +-- Water Elemental's Freeze +DELETE FROM `spell_script_names` WHERE `spell_id`=33395 OR `ScriptName`='spell_mage_water_elemental_freeze'; +INSERT INTO `spell_script_names` VALUES +(33395,'spell_mage_water_elemental_freeze'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a78ce6be4f0..80032533954 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9750,13 +9750,11 @@ bool Unit::isSpellCrit(Unit* victim, SpellInfo const* spellProto, SpellSchoolMas int32 modChance = 0; switch ((*i)->GetMiscValue()) { - // Shatter - case 911: modChance+= 16; - case 910: modChance+= 17; - case 849: modChance+= 17; + // Shatter + case 911: if (!victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this)) break; - crit_chance+=modChance; + AddPct(crit_chance, (*i)->GetAmount()*20); break; case 7917: // Glyph of Shadowburn if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this)) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 190c2fcdb8c..78e4844831a 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1286,16 +1286,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b default: break; } - if (!caster) - break; - // Ice barrier - dispel/absorb remove - if (removeMode == AURA_REMOVE_BY_ENEMY_SPELL && GetSpellInfo()->SpellFamilyFlags[1] & 0x1) - { - // Shattered Barrier - if (AuraEffect * dummy = caster->GetDummyAuraEffect(SPELLFAMILY_MAGE, 3260, 0)) - if (roll_chance_i(dummy->GetSpellInfo()->ProcChance)) - caster->CastSpell(target, 55080, true, NULL, GetEffect(0)); - } break; case SPELLFAMILY_WARLOCK: if (!caster) diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 78217cfd7cd..354cbcbd4d6 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -40,6 +40,26 @@ enum MageSpells SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907, SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126, SPELL_MAGE_CONJURE_REFRESHMENT = 42955, + SPELL_MAGE_FLAMESTRIKE = 2120, + SPELL_MAGE_CHILLED_R1 = 12484, + SPELL_MAGE_CHILLED_R2 = 12485, + SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED = 44413, + SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK = 86261, + SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED = 83098, + SPELL_MAGE_SHATTERED_BARRIER_R1 = 44745, + SPELL_MAGE_SHATTERED_BARRIER_R2 = 54787, + SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1 = 55080, + SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2 = 83073, + SPELL_MAGE_FINGERS_OF_FROST = 44544, +}; + +enum MageIcons +{ + ICON_MAGE_SHATTER = 976, + ICON_MAGE_IMPROVED_FLAMESTRIKE = 37, + ICON_MAGE_IMPROVED_FREEZE = 94, + ICON_MAGE_INCANTER_S_ABSORPTION = 2941, + ICON_MAGE_IMPROVED_MANA_GEM = 1036, }; class spell_mage_blast_wave : public SpellScriptLoader @@ -53,21 +73,40 @@ class spell_mage_blast_wave : public SpellScriptLoader bool Validate(SpellInfo const* /*spellEntry*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FLAMESTRIKE)) return false; return true; } - void HandleKnockBack(SpellEffIndex effIndex) + void CountTargets(std::list& targetList) + { + _targetCount = targetList.size(); + } + + void HandleImprovedFlamestrike() { - if (GetCaster()->HasAura(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) - PreventHitDefaultEffect(effIndex); + if (_targetCount >= 2) + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_FLAMESTRIKE, EFFECT_0)) + if (roll_chance_i(aurEff->GetAmount())) + { + float x, y, z; + WorldLocation const* loc = GetExplTargetDest(); + if (!loc) + return; + + loc->GetPosition(x, y, z); + GetCaster()->CastSpell(x, y, z, SPELL_MAGE_FLAMESTRIKE, true); + } } void Register() { - OnEffectHitTarget += SpellEffectFn(spell_mage_blast_wave_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_blast_wave_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + AfterCast += SpellCastFn(spell_mage_blast_wave_SpellScript::HandleImprovedFlamestrike); } + + private: + uint32 _targetCount; }; SpellScript* GetSpellScript() const @@ -272,77 +311,6 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader } }; -class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript -{ - public: - enum Spells - { - SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413, - SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394, - }; - - bool Validate(SpellInfo const* /*spellEntry*/) - { - return sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED) - && sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1); - } - - void Trigger(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) - { - Unit* target = GetTarget(); - - if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) - { - int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); - target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); - } - } -}; - -// Incanter's Absorption -class spell_mage_incanters_absorbtion_absorb : public SpellScriptLoader -{ -public: - spell_mage_incanters_absorbtion_absorb() : SpellScriptLoader("spell_mage_incanters_absorbtion_absorb") { } - - class spell_mage_incanters_absorbtion_absorb_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript - { - PrepareAuraScript(spell_mage_incanters_absorbtion_absorb_AuraScript); - - void Register() - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_incanters_absorbtion_absorb_AuraScript::Trigger, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_incanters_absorbtion_absorb_AuraScript(); - } -}; - -// Incanter's Absorption -class spell_mage_incanters_absorbtion_manashield : public SpellScriptLoader -{ -public: - spell_mage_incanters_absorbtion_manashield() : SpellScriptLoader("spell_mage_incanters_absorbtion_manashield") { } - - class spell_mage_incanters_absorbtion_manashield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript - { - PrepareAuraScript(spell_mage_incanters_absorbtion_manashield_AuraScript); - - void Register() - { - AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_incanters_absorbtion_manashield_AuraScript::Trigger, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_incanters_absorbtion_manashield_AuraScript(); - } -}; - class spell_mage_living_bomb : public SpellScriptLoader { public: @@ -424,6 +392,8 @@ public: } }; +// 42955 Conjure Refreshment +/// Updated 4.3.4 struct ConjureRefreshmentData { uint32 minLevel; @@ -480,7 +450,6 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader } } - void Register() { OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); @@ -493,6 +462,285 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader } }; +// 42208 Blizzard +/// Updated 4.3.4 +class spell_mage_blizzard : public SpellScriptLoader +{ + public: + spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } + + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2)) + return false; + return true; + } + + class spell_mage_blizzard_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_blizzard_SpellScript); + + void AddChillEffect() + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + if (caster->IsScriptOverriden(GetSpellInfo(), 836)) + caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R1, true); + else if (caster->IsScriptOverriden(GetSpellInfo(), 988)) + caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R2, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_blizzard_SpellScript::AddChillEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript *GetSpellScript() const + { + return new spell_mage_blizzard_SpellScript(); + } +}; + +// 116 Frostbolt +/// Updated 4.3.4 +class spell_mage_frostbolt : public SpellScriptLoader +{ + public: + spell_mage_frostbolt() : SpellScriptLoader("spell_mage_frostbolt") { } + + class spell_mage_frostbolt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_frostbolt_SpellScript); + + void RecalculateDamage() + { + if (GetHitUnit() && GetHitUnit()->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), GetCaster())) + { + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_SHATTER, EFFECT_1)) + { + int32 damage = GetHitDamage(); + AddPct(damage, aurEff->GetAmount()); + SetHitDamage(damage); + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_frostbolt_SpellScript::RecalculateDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript *GetSpellScript() const + { + return new spell_mage_frostbolt_SpellScript(); + } +}; + +// 11426 Ice Barrier +/// Updated 4.3.4 +class spell_mage_ice_barrier : public SpellScriptLoader +{ + public: + spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } + + class spell_mage_ice_barrier_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_ice_barrier_AuraScript); + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) + return; + + if (GetTarget()->HasAura(SPELL_MAGE_SHATTERED_BARRIER_R1)) + GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1, true); + else if (GetTarget()->HasAura(SPELL_MAGE_SHATTERED_BARRIER_R2)) + GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2, true); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ice_barrier_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_ice_barrier_AuraScript(); + } +}; + +// 1463 Mana Shield +/// Updated 4.3.4 +class spell_mage_mana_shield : public SpellScriptLoader +{ + public: + spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } + + class spell_mage_mana_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_mana_shield_AuraScript); + + void HandleAbsorb(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) + { + if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) + { + int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount()); + GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true); + } + } + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) + GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK, true); + } + + void Register() + { + AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::HandleAbsorb, EFFECT_0); + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_mana_shield_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MANA_SHIELD, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_mana_shield_AuraScript(); + } +}; + +// 543 Mage Ward +/// Updated 4.3.4 +class spell_mage_mage_ward : public SpellScriptLoader +{ + public: + spell_mage_mage_ward() : SpellScriptLoader("spell_mage_mage_ward") { } + + class spell_mage_mage_ward_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_mage_ward_AuraScript); + + void HandleAbsorb(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) + { + if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) + { + int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount()); + GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true); + } + } + + void Register() + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_mage_ward_AuraScript(); + } +}; + +// 5405 Replenish Mana (Mana Gem) +/// Updated 4.3.4 +class spell_mage_replenish_mana : public SpellScriptLoader +{ + public: + spell_mage_replenish_mana() : SpellScriptLoader("spell_mage_replenish_mana") { } + + class spell_mage_replenish_mana_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_replenish_mana_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED)) + return false; + return true; + } + + void HandleImprovedManaGem() + { + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_MANA_GEM, EFFECT_0)) + { + int32 bp = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), aurEff->GetAmount()); + GetCaster()->CastCustomSpell(GetCaster(), SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED, &bp, &bp, NULL, true); + } + } + + void Register() + { + AfterCast += SpellCastFn(spell_mage_replenish_mana_SpellScript::HandleImprovedManaGem); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_replenish_mana_SpellScript(); + } +}; + +// 33395 Water Elemental's Freeze +/// Updated 4.3.4 +class spell_mage_water_elemental_freeze : public SpellScriptLoader +{ + public: + spell_mage_water_elemental_freeze() : SpellScriptLoader("spell_mage_water_elemental_freeze") { } + + class spell_mage_water_elemental_freeze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_water_elemental_freeze_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FINGERS_OF_FROST)) + return false; + return true; + } + + void CountTargets(std::list& targetList) + { + _didHit = !targetList.empty(); + } + + void HandleImprovedFreeze() + { + if (!_didHit) + return; + + Unit* owner = GetCaster()->GetOwner(); + if (!owner) + return; + + if (AuraEffect* aurEff = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_FREEZE, EFFECT_0)) + { + if (roll_chance_i(aurEff->GetAmount())) + owner->CastCustomSpell(SPELL_MAGE_FINGERS_OF_FROST, SPELLVALUE_AURA_STACK, 2, owner, true); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_water_elemental_freeze_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + AfterCast += SpellCastFn(spell_mage_water_elemental_freeze_SpellScript::HandleImprovedFreeze); + } + + private: + bool _didHit; + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_water_elemental_freeze_SpellScript(); + } +}; + void AddSC_mage_spell_scripts() { new spell_mage_blast_wave(); @@ -500,9 +748,14 @@ void AddSC_mage_spell_scripts() new spell_mage_cone_of_cold(); new spell_mage_conjure_refreshment(); new spell_mage_frost_warding_trigger(); - new spell_mage_incanters_absorbtion_absorb(); - new spell_mage_incanters_absorbtion_manashield(); new spell_mage_polymorph_cast_visual(); new spell_mage_summon_water_elemental(); new spell_mage_living_bomb(); + new spell_mage_blizzard(); + new spell_mage_frostbolt(); + new spell_mage_ice_barrier(); + new spell_mage_mana_shield(); + new spell_mage_mage_ward(); + new spell_mage_replenish_mana(); + new spell_mage_water_elemental_freeze(); } -- cgit v1.2.3 From e873a22a379547c52c0e759ed333f134062164b9 Mon Sep 17 00:00:00 2001 From: Tuxity Date: Wed, 26 Dec 2012 18:30:37 +0100 Subject: Core: fix build and typo after 0622cf8b64b9b77e583ae99baf42c01237ca7fb5 --- src/server/scripts/Spells/spell_mage.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 354cbcbd4d6..2e6729e591f 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -469,20 +469,20 @@ class spell_mage_blizzard : public SpellScriptLoader public: spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2)) - return false; - return true; - } - class spell_mage_blizzard_SpellScript : public SpellScript { PrepareSpellScript(spell_mage_blizzard_SpellScript); - void AddChillEffect() + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2)) + return false; + return true; + } + + void AddChillEffect(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); if (Unit* unitTarget = GetHitUnit()) @@ -517,7 +517,7 @@ class spell_mage_frostbolt : public SpellScriptLoader { PrepareSpellScript(spell_mage_frostbolt_SpellScript); - void RecalculateDamage() + void RecalculateDamage(SpellEffIndex /*effIndex*/) { if (GetHitUnit() && GetHitUnit()->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), GetCaster())) { -- cgit v1.2.3 From 05a7b3aaea1b6299cb8af0d4fb51028e56742ffe Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 26 Dec 2012 12:46:34 -0500 Subject: Scripts/HoO: Implemented the weather effect while on Earthrager Ptah's sandstorm. --- src/server/game/Weather/Weather.h | 1 + .../HallsOfOrigination/boss_earthrager_ptah.cpp | 23 ++++++++++++++++++++++ .../HallsOfOrigination/halls_of_origination.h | 5 +++++ 3 files changed, 29 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/game/Weather/Weather.h b/src/server/game/Weather/Weather.h index 59bff95d7ea..be3aa1f58a7 100644 --- a/src/server/game/Weather/Weather.h +++ b/src/server/game/Weather/Weather.h @@ -46,6 +46,7 @@ struct WeatherData enum WeatherState { WEATHER_STATE_FINE = 0, + WEATHER_STATE_UNK = 1, // Used in some instance encounters. WEATHER_STATE_LIGHT_RAIN = 3, WEATHER_STATE_MEDIUM_RAIN = 4, WEATHER_STATE_HEAVY_RAIN = 5, diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index 19c27d49a79..63ee95cb3de 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -21,6 +21,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "Player.h" +#include "Weather.h" #include "halls_of_origination.h" enum Texts @@ -127,6 +128,26 @@ public: (*itr)->DespawnOrUnsummon(); } + void SendWeather(WeatherState weather, float grade) const + { + WorldPacket data(SMSG_WEATHER, 9); + data << uint32(weather); + data << float(grade); + data << uint8(0); + SendPacketToPlayers(&data); + } + + // Send packet to all players in Tomb of the Earthrager + void SendPacketToPlayers(WorldPacket const* data) const + { + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->getSource()) + if (player->GetAreaId() == AREA_TOMB_OF_THE_EARTHRAGER) + player->GetSession()->SendPacket(data); + } + void Reset() { _summonDeaths = 0; @@ -148,6 +169,7 @@ public: me->AttackStop(); DoCast(me, SPELL_SANDSTORM); + SendWeather(WEATHER_STATE_LIGHT_SANDSTORM, 1.0f); events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6000, 0, PHASE_DISPERSE); events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); @@ -179,6 +201,7 @@ public: ++_summonDeaths; if (_summonDeaths == 11) // All summons died { + SendWeather(WEATHER_STATE_UNK, 0.0f); me->RemoveAurasDueToSpell(SPELL_PTAH_EXPLOSION); events.SetPhase(PHASE_NORMAL); events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index f1316c5db3c..8bdd4a16c9e 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -63,6 +63,11 @@ enum GameObjects GO_ANHUURS_LEFT_BEACON = 203133, }; +enum AreaIds +{ + AREA_TOMB_OF_THE_EARTHRAGER = 5610, +}; + template CreatureAI* GetHallsOfOriginationAI(Creature* creature) { -- cgit v1.2.3 From c93559c02da0f949175c932c4b366a09f9b5c113 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Thu, 27 Dec 2012 19:50:16 +0100 Subject: Core: Fix build --- src/server/scripts/Commands/cs_reload.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 852bc176040..2e797ad32cd 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -1004,9 +1004,6 @@ public: return true; } - return true; - } - static bool HandleReloadSpellScriptsCommand(ChatHandler* handler, const char* args) { if (sScriptMgr->IsScriptScheduled()) -- cgit v1.2.3 From 9281eb42da936aee2daab039237f0e52732c55fa Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Fri, 28 Dec 2012 19:11:55 +0100 Subject: Core: Fix build --- src/server/scripts/Commands/cs_lookup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index c7119ec1fc0..36772164b20 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -877,7 +877,7 @@ public: if (spellInfo) { int locale = handler->GetSessionDbcLocale(); - std::string name = spellInfo->SpellName[locale]; + std::string name = spellInfo->SpellName; if (name.empty()) { handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); -- cgit v1.2.3 From 834f98f6bb766524ae0009407dd004a2f41e5b86 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Sun, 30 Dec 2012 03:01:12 +0100 Subject: Core/ZulGurub: Added script for Bloodlord Mandokir ToDo: Remove hack :P --- .../world/2012_12_30_00_world_zul_gurub.sql | 26 + .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 698 ++++++++++++++++++++- .../EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 44 +- .../scripts/EasternKingdoms/ZulGurub/zulgurub.h | 76 ++- 4 files changed, 806 insertions(+), 38 deletions(-) create mode 100644 sql/updates/world/2012_12_30_00_world_zul_gurub.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_30_00_world_zul_gurub.sql b/sql/updates/world/2012_12_30_00_world_zul_gurub.sql new file mode 100644 index 00000000000..5b4e31636db --- /dev/null +++ b/sql/updates/world/2012_12_30_00_world_zul_gurub.sql @@ -0,0 +1,26 @@ +UPDATE `creature_template` SET `ScriptName`='npc_chained_spirit' WHERE `entry`=52156; +UPDATE `creature_template` SET `ScriptName`='npc_ohgan' WHERE `entry`=52157; + +DELETE FROM `creature` WHERE `id`=52156; + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (96682,96776,96761,96821,96721,96722,96724,96740,28471); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(96682,'spell_mandokir_decapitate'), +(96776,'spell_mandokir_bloodletting'), +(96761,'spell_mandokir_devastating_slam'), +(96821,'spell_mandokir_spirit_vengeance_cancel'), +(96721,'spell_mandokir_ohgan_orders'), +(96722,'spell_mandokir_ohgan_orders_trigger'), +(96724,'spell_mandokir_reanimate_ohgan'), +(96740,'spell_mandokir_devastating_slam_damage'), +(28471,'spell_clear_all'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`IN (96724,96721); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 3, 96724, 0, 0, 31, 0, 3, 52157, 0, 0, 0, 0, '', 'Earth Spike - Ohgan'), +(13, 1, 96721, 0, 0, 31, 0, 3, 52156, 0, 0, 0, 0, '', 'Ohgan''s Orders - Chained Spirit'); + +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=16848; +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(16848,11,0,0,'achievement_ohganot_so_fast'), +(16848,12,1,0,''); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index fde47a2ccb5..8d9ccd7bdfc 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -18,26 +17,92 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "Player.h" #include "zulgurub.h" enum Yells { - SAY_AGGRO = 0, - SAY_PLAYER_KILL = 1, - SAY_DISMOUNT_OHGAN = 2, - EMOTE_DEVASTATING_SLAM = 3, // ID - 96739 Devastating Slam - SAY_REANIMATE_OHGAN = 4, // ID - 96724 Reanimate Ohgan - EMOTE_FRENZY = 5, // ID - 96800 Frenzy - SAY_FRENZY = 6, // ID - 96800 Frenzy - SAY_DEATH = 7 + SAY_AGGRO = 0, + SAY_PLAYER_KILL = 1, + SAY_DISMOUNT_OHGAN = 2, + EMOTE_DEVASTATING_SLAM = 3, + SAY_REANIMATE_OHGAN = 4, + EMOTE_FRENZY = 5, + SAY_FRENZY = 6, + SAY_DEATH = 7 }; enum Spells { + // Bloodlord Mandokir + SPELL_BLOODLORD_AURA = 96480, + SPELL_SUMMON_OHGAN = 96717, + SPELL_REANIMATE_OHGAN = 96724, + SPELL_DECAPITATE = 96682, + SPELL_BLOODLETTING = 96776, + SPELL_BLOODLETTING_DAMAGE = 96777, + SPELL_BLOODLETTING_HEAL = 96778, + SPELL_FRENZY = 96800, + SPELL_LEVEL_UP = 96662, + SPELL_DEVASTATING_SLAM = 96740, + SPELL_DEVASTATING_SLAM_TRIGGER = 96761, + SPELL_DEVASTATING_SLAM_DAMAGE = 97385, + SPELL_SPIRIT_VENGEANCE_CANCEL = 96821, + + // Chained Spirit + SPELL_REVIVE = 96484, + + // Ohgan + SPELL_OHGAN_HEART_VISUAL = 96727, + SPELL_PERMANENT_FEIGN_DEATH = 96733, + SPELL_CLEAR_ALL = 28471, + SPELL_OHGAN_ORDERS = 96721, + SPELL_OHGAN_ORDERS_TRIGGER = 96722 }; enum Events { + // Bloodlord Mandokir + EVENT_SUMMON_OHGAN = 1, + EVENT_DECAPITATE = 2, + EVENT_BLOODLETTING = 3, + EVENT_REANIMATE_OHGAN = 4, + EVENT_REANIMATE_OHGAN_COOLDOWN = 5, + EVENT_DEVASTATING_SLAM = 6 +}; + +enum Action +{ + // Bloodlord Mandokir + ACTION_OHGAN_IS_DEATH = 1, + ACTION_START_REVIVE = 2, + + // Chained Spirit + ACTION_REVIVE = 1 +}; + +enum Misc +{ + POINT_START_REVIVE = 1, + + DATA_OHGANOT_SO_FAST = 5762, + + FACTION_NONE = 1665 +}; + +// ToDo: Need better respawn support +Position const ChainedSpiritsSpawnPos[8] = +{ + { -12330.34f, -1878.406f, 127.3196f, 3.892084f }, + { -12351.94f, -1861.51f, 127.4807f, 4.677482f }, + { -12326.71f, -1904.328f, 127.4111f, 2.75762f }, + { -12347.41f, -1917.535f, 127.3196f, 1.553343f }, + { -12378.57f, -1861.222f, 127.5416f, 5.340707f }, + { -12397.79f, -1887.731f, 127.5453f, 0.03490658f }, + { -12372.36f, -1918.844f, 127.343f, 1.151917f }, + { -12391.23f, -1905.273f, 127.3196f, 0.6108652f } }; class boss_mandokir : public CreatureScript @@ -52,17 +117,44 @@ class boss_mandokir : public CreatureScript void Reset() { + DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); + _Reset(); + + for (uint8 i = 0; i < 8; ++i) + me->SummonCreature(NPC_CHAINED_SPIRIT, ChainedSpiritsSpawnPos[i]); + + _ohganotSoFast = true; + _reanimateOhganCooldown = false; + _reviveGUID = 0; } void EnterCombat(Unit* /*who*/) { _EnterCombat(); Talk(SAY_AGGRO); + + DoCastAOE(SPELL_BLOODLORD_AURA); + + if (!summons.empty()) + { + for (std::list::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + { + if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, *itr)) + if (chainedSpirit->GetEntry() == NPC_CHAINED_SPIRIT && chainedSpirit->AI()) + chainedSpirit->setFaction(FACTION_NONE); + } + } + + events.ScheduleEvent(EVENT_DECAPITATE, 10000); + events.ScheduleEvent(EVENT_BLOODLETTING, 15000); + events.ScheduleEvent(EVENT_SUMMON_OHGAN, 20000); + events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 25000); } void JustDied(Unit* /*killer*/) { + DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); _JustDied(); Talk(SAY_DEATH); } @@ -70,7 +162,70 @@ class boss_mandokir : public CreatureScript void KilledUnit(Unit* victim) { if (victim->GetTypeId() == TYPEID_PLAYER) + { Talk(SAY_PLAYER_KILL); + DoCast(SPELL_LEVEL_UP); + _reviveGUID = victim->GetGUID(); + DoAction(ACTION_START_REVIVE); + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) + { + if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY)) + { + DoCast(me, SPELL_FRENZY, true); + Talk(SAY_FRENZY); + Talk(EMOTE_FRENZY); + } + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_OHGAN_IS_DEATH: + events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 4000); + _ohganotSoFast = false; + break; + case ACTION_START_REVIVE: + { + std::list creatures; + GetCreatureListWithEntryInGrid(creatures, me, NPC_CHAINED_SPIRIT, 200.0f); + creatures.remove_if(Trinity::AnyDeadUnitCheck()); + creatures.remove_if(Trinity::UnitAuraCheck(true, SPELL_OHGAN_ORDERS_TRIGGER)); + Trinity::Containers::RandomResizeList(creatures, 1); + if (creatures.empty()) + return; + + for (std::list::iterator itr = creatures.begin(); itr != creatures.end(); ++itr) + { + if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, (*itr)->GetGUID())) + { + chainedSpirit->AI()->SetGUID(_reviveGUID); + chainedSpirit->AI()->DoAction(ACTION_REVIVE); + _reviveGUID = 0; + } + } + break; + } + default: + break; + + } + } + + uint32 GetData(uint32 type) const + { + if (type == DATA_OHGANOT_SO_FAST) + return _ohganotSoFast; + + return 0; + } + + void SetGUID(uint64 guid, int32 type/* = 0 */) + { + _reviveGUID = guid; } void UpdateAI(uint32 const diff) @@ -82,19 +237,58 @@ class boss_mandokir : public CreatureScript if (me->HasUnitState(UNIT_STATE_CASTING)) return; - /* + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { + case EVENT_SUMMON_OHGAN: + me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); + DoCast(me, SPELL_SUMMON_OHGAN, true); + break; + case EVENT_DECAPITATE: + DoCastAOE(SPELL_DECAPITATE); + events.ScheduleEvent(EVENT_DECAPITATE, me->HasAura(SPELL_FRENZY) ? 17500 : 35000); + break; + case EVENT_BLOODLETTING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + { + DoCast(target, SPELL_BLOODLETTING, true); + me->ClearUnitState(UNIT_STATE_CASTING); + } + events.ScheduleEvent(EVENT_BLOODLETTING, 25000); + break; + case EVENT_REANIMATE_OHGAN: + if (_reanimateOhganCooldown) + events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 1000); + else + { + DoCastAOE(SPELL_REANIMATE_OHGAN); + Talk(SAY_REANIMATE_OHGAN); + // Cooldown + _reanimateOhganCooldown = true; + events.ScheduleEvent(EVENT_REANIMATE_OHGAN_COOLDOWN, 20000); + } + break; + case EVENT_REANIMATE_OHGAN_COOLDOWN: + _reanimateOhganCooldown = false; + break; + case EVENT_DEVASTATING_SLAM: + DoCastAOE(SPELL_DEVASTATING_SLAM_TRIGGER); + events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 30000); + break; default: break; } } - */ DoMeleeAttackIfReady(); } + + private: + bool _ohganotSoFast; + bool _reanimateOhganCooldown; + uint64 _reviveGUID; }; CreatureAI* GetAI(Creature* creature) const @@ -103,7 +297,489 @@ class boss_mandokir : public CreatureScript } }; +class npc_ohgan : public CreatureScript +{ + public: + npc_ohgan() : CreatureScript("npc_ohgan") { } + + struct npc_ohganAI : public ScriptedAI + { + npc_ohganAI(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + } + + void EnterCombat(Unit* /*who*/) + { + DoCastAOE(SPELL_OHGAN_ORDERS, true); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) + { + if (damage >= me->GetHealth()) + { + damage = 0; + me->AttackStop(); + me->SetHealth(0); + me->SetTarget(0); + DoCast(me, SPELL_CLEAR_ALL, true); + DoCast(me, SPELL_PERMANENT_FEIGN_DEATH); + + if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR))) + mandokir->AI()->DoAction(ACTION_OHGAN_IS_DEATH); + } + } + + void KilledUnit(Unit* victim) + { + if (Creature* creature = victim->ToCreature()) + { + if (creature->GetEntry() == NPC_CHAINED_SPIRIT) + DoCastAOE(SPELL_OHGAN_ORDERS, true); + } + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } +}; + +class npc_chained_spirit : public CreatureScript +{ + public: + npc_chained_spirit() : CreatureScript("npc_chained_spirit") { } + + struct npc_chained_spiritAI : public ScriptedAI + { + npc_chained_spiritAI(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + me->AddUnitMovementFlag(MOVEMENTFLAG_HOVER); + me->SetReactState(REACT_PASSIVE); // correct? + } + + void Reset() + { + _revivePlayerGUID = 0; + } + + void SetGUID(uint64 guid, int32 type/* = 0 */) + { + _revivePlayerGUID = guid; + } + + void DoAction(int32 const action) + { + if (action == ACTION_REVIVE) + { + Position pos; + if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) + { + target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 5.0f, target->GetAngle(me)); + me->GetMotionMaster()->MovePoint(POINT_START_REVIVE, pos); + } + } + } + + void MovementInform(uint32 type, uint32 pointId) + { + if (type != POINT_MOTION_TYPE || !_revivePlayerGUID) + return; + + if (pointId == POINT_START_REVIVE) + { + if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) + DoCast(target, SPELL_REVIVE); + + me->DespawnOrUnsummon(2000); + } + } + + void JustDied(Unit* /*killer*/) + { + Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID); + if (!target || target->isAlive()) + return; + + if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR))) + { + mandokir->GetAI()->SetGUID(target->GetGUID()); + mandokir->GetAI()->DoAction(ACTION_START_REVIVE); + } + + me->DespawnOrUnsummon(); + } + + void UpdateAI(uint32 const /*diff*/) { } + + private: + InstanceScript* _instance; + uint64 _revivePlayerGUID; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } +}; + +class spell_mandokir_decapitate : public SpellScriptLoader +{ + public: + spell_mandokir_decapitate() : SpellScriptLoader("spell_mandokir_decapitate") { } + + class spell_mandokir_decapitate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mandokir_decapitate_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Player* target = GetHitPlayer()) + caster->CastSpell(target, uint32(GetEffectValue()), true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_decapitate_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_decapitate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mandokir_decapitate_SpellScript(); + } +}; + +class spell_mandokir_bloodletting : public SpellScriptLoader +{ + public: + spell_mandokir_bloodletting() : SpellScriptLoader("spell_mandokir_bloodletting") { } + + class spell_mandokir_bloodletting_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mandokir_bloodletting_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_DAMAGE)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_HEAL)) + return false; + return true; + } + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + Unit* target = GetTarget(); + Unit* caster = GetCaster(); + if (!caster) + return; + + int32 damage = std::max(7500, target->CountPctFromCurHealth(aurEff->GetAmount())); + + caster->CastCustomSpell(target, SPELL_BLOODLETTING_DAMAGE, &damage, 0, 0, true); + target->CastCustomSpell(caster, SPELL_BLOODLETTING_HEAL, &damage, 0, 0, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mandokir_bloodletting_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mandokir_bloodletting_AuraScript(); + } +}; + +class spell_mandokir_spirit_vengeance_cancel : public SpellScriptLoader +{ + public: + spell_mandokir_spirit_vengeance_cancel() : SpellScriptLoader("spell_mandokir_spirit_vengeance_cancel") { } + + class spell_mandokir_spirit_vengeance_cancel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mandokir_spirit_vengeance_cancel_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* target = GetHitPlayer()) + target->RemoveAura(uint32(GetEffectValue())); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mandokir_spirit_vengeance_cancel_SpellScript(); + } +}; + +class DevastatingSlamTargetSelector : public std::unary_function +{ + public: + DevastatingSlamTargetSelector(Creature* me, const Unit* victim) : _me(me), _victim(victim) {} + + bool operator() (WorldObject* target) + { + if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) + return true; + + if (target->GetTypeId() != TYPEID_PLAYER) + return true; + + return false; + } + + Creature* _me; + Unit const* _victim; +}; + +class spell_mandokir_devastating_slam : public SpellScriptLoader +{ + public: + spell_mandokir_devastating_slam() : SpellScriptLoader("spell_mandokir_devastating_slam") { } + + class spell_mandokir_devastating_slam_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mandokir_devastating_slam_SpellScript); + + void FilterTargets(std::list& targets) + { + targets.remove_if(DevastatingSlamTargetSelector(GetCaster()->ToCreature(), GetCaster()->getVictim())); + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + float angle = 0.0f; + float x, y, z; + + if (Player* target = GetHitPlayer()) + { + caster->AttackStop(); + caster->SetOrientation(caster->GetAngle(target)); + caster->SetFacingTo(caster->GetAngle(target)); + + caster->CastSpell(caster, SPELL_DEVASTATING_SLAM, false); + + // HACK: Need better way for pos calculation + for (uint8 i = 0; i <= 50; ++i) + { + angle = float(rand_norm()) * static_cast(M_PI * 35.0f / 180.0f) - static_cast(M_PI * 17.5f / 180.0f); + caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle); + + caster->CastSpell(x, y, z, SPELL_DEVASTATING_SLAM_DAMAGE, true); + } + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_devastating_slam_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_devastating_slam_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mandokir_devastating_slam_SpellScript(); + } +}; + +class spell_mandokir_ohgan_orders : public SpellScriptLoader +{ + public: + spell_mandokir_ohgan_orders() : SpellScriptLoader("spell_mandokir_ohgan_orders") { } + + class spell_mandokir_ohgan_orders_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mandokir_ohgan_orders_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + caster->CastSpell(target, uint32(GetEffectValue()), true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_ohgan_orders_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_ohgan_orders_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mandokir_ohgan_orders_SpellScript(); + } +}; + +class spell_mandokir_ohgan_orders_trigger : public SpellScriptLoader +{ + public: + spell_mandokir_ohgan_orders_trigger() : SpellScriptLoader("spell_mandokir_ohgan_orders_trigger") { } + + class spell_mandokir_ohgan_orders_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mandokir_ohgan_orders_trigger_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) + { + // HACK: research better way + caster->ClearUnitState(UNIT_STATE_CASTING); + caster->GetMotionMaster()->Clear(); + caster->DeleteThreatList(); + caster->AddThreat(target, 50000000.0f); + caster->TauntApply(target); + } + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_mandokir_ohgan_orders_trigger_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mandokir_ohgan_orders_trigger_AuraScript(); + } +}; + +class spell_mandokir_reanimate_ohgan : public SpellScriptLoader +{ + public: + spell_mandokir_reanimate_ohgan() : SpellScriptLoader("spell_mandokir_reanimate_ohgan") { } + + class spell_mandokir_reanimate_ohgan_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mandokir_reanimate_ohgan_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + target->RemoveAura(SPELL_PERMANENT_FEIGN_DEATH); + target->CastSpell(target, SPELL_OHGAN_HEART_VISUAL, true); + target->CastSpell((Unit*)NULL, SPELL_OHGAN_ORDERS, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mandokir_reanimate_ohgan_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mandokir_reanimate_ohgan_SpellScript(); + } +}; + +class spell_clear_all : public SpellScriptLoader +{ + public: + spell_clear_all() : SpellScriptLoader("spell_clear_all") { } + + class spell_clear_all_SpellScript : public SpellScript + { + PrepareSpellScript(spell_clear_all_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->RemoveAllAurasOnDeath(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_clear_all_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_clear_all_SpellScript(); + } +}; + +class achievement_ohganot_so_fast : public AchievementCriteriaScript +{ + public: + achievement_ohganot_so_fast() : AchievementCriteriaScript("achievement_ohganot_so_fast") { } + + bool OnCheck(Player* /*player*/, Unit* target) + { + return target && target->GetAI()->GetData(DATA_OHGANOT_SO_FAST); + } +}; + void AddSC_boss_mandokir() { new boss_mandokir(); + new npc_ohgan(); + new npc_chained_spirit(); + new spell_mandokir_decapitate(); + new spell_mandokir_bloodletting(); + new spell_mandokir_spirit_vengeance_cancel(); + new spell_mandokir_devastating_slam(); + new spell_mandokir_ohgan_orders(); + new spell_mandokir_ohgan_orders_trigger(); + new spell_mandokir_reanimate_ohgan(); + new spell_clear_all(); + new achievement_ohganot_so_fast(); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 953d9f392bd..f1c1444be8c 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -20,6 +19,16 @@ #include "InstanceScript.h" #include "zulgurub.h" +DoorData const doorData[] = +{ + { GO_VENOXIS_COIL, DATA_VENOXIS, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_ARENA_DOOR_1, DATA_MANDOKIR, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_FORCEFIELD, DATA_KILNARA, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_ZANZIL_DOOR, DATA_ZANZIL, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + //{ GO_THE_CACHE_OF_MADNESS_DOOR, DATA_xxxxxxx, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } +}; + class instance_zulgurub : public InstanceMapScript { public: @@ -30,6 +39,7 @@ class instance_zulgurub : public InstanceMapScript instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) { SetBossNumber(EncounterCount); + LoadDoorData(doorData); venoxisGUID = 0; mandokirGUID = 0; kilnaraGUID = 0; @@ -81,6 +91,38 @@ class instance_zulgurub : public InstanceMapScript } } + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_VENOXIS_COIL: + case GO_ARENA_DOOR_1: + case GO_FORCEFIELD: + case GO_ZANZIL_DOOR: + case GO_THE_CACHE_OF_MADNESS_DOOR: + AddDoor(go, true); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_VENOXIS_COIL: + case GO_ARENA_DOOR_1: + case GO_FORCEFIELD: + case GO_ZANZIL_DOOR: + case GO_THE_CACHE_OF_MADNESS_DOOR: + AddDoor(go, false); + break; + default: + break; + } + } + bool SetBossState(uint32 type, EncounterState state) { if (!InstanceScript::SetBossState(type, state)) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index cdf4724dc35..e4d2d2e3902 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2012 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -25,40 +24,66 @@ uint32 const EncounterCount = 5; enum DataTypes { - DATA_VENOXIS = 0, - DATA_MANDOKIR = 1, - DATA_KILNARA = 2, - DATA_ZANZIL = 3, - DATA_JINDO = 4, + DATA_VENOXIS = 0, + DATA_MANDOKIR = 1, + DATA_KILNARA = 2, + DATA_ZANZIL = 3, + DATA_JINDO = 4, // Cache of Madness - DATA_HAZZARAH = 5, - DATA_RENATAKI = 6, - DATA_WUSHOOLAY = 7, - DATA_GRILEK = 8, + DATA_HAZZARAH = 5, + DATA_RENATAKI = 6, + DATA_WUSHOOLAY = 7, + DATA_GRILEK = 8, - // Jin'do the Godbreaker + // Jin'do the Godbreaker DATA_JINDOR_TRIGGER, }; enum CreatureIds { - NPC_VENOXIS = 52155, - NPC_MANDOKIR = 52151, - NPC_KILNARA = 52059, - NPC_ZANZIL = 52053, - NPC_JINDO = 52148, + NPC_VENOXIS = 52155, + NPC_MANDOKIR = 52151, + NPC_KILNARA = 52059, + NPC_ZANZIL = 52053, + NPC_JINDO = 52148, // Cache of Madness - NPC_HAZZARAH = 52271, - NPC_RENATAKI = 52269, - NPC_WUSHOOLAY = 52286, - NPC_GRILEK = 52258, - - // Jin'do the Godbreaker - NPC_JINDO_TRIGGER = 52150, - NPC_SPIRIT_OF_HAKKAR = 52222, - NPC_SHADOW_OF_HAKKAR = 52650 + NPC_HAZZARAH = 52271, + NPC_RENATAKI = 52269, + NPC_WUSHOOLAY = 52286, + NPC_GRILEK = 52258, + + // Bloodlord Mandokir + NPC_CHAINED_SPIRIT = 52156, + NPC_OHGAN = 52157, + + // Jin'do the Godbreaker + NPC_JINDO_TRIGGER = 52150, + NPC_SPIRIT_OF_HAKKAR = 52222, + NPC_SHADOW_OF_HAKKAR = 52650 +}; + +enum GameObjectIds +{ + // High Priest Venoxis + GO_VENOXIS_COIL = 208844, + + // Bloodlord Mandokir + GO_ARENA_DOOR_1 = 208845, + GO_ARENA_DOOR_2 = 208847, + GO_ARENA_DOOR_3 = 208848, + GO_ARENA_DOOR_4 = 208846, + GO_ARENA_DOOR_5 = 208849, + + // High Priestess Kilnara + GO_FORCEFIELD = 180497, + + // Zanzil + GO_ZANZIL_DOOR = 208850, + + // Cache of Madness + GO_THE_CACHE_OF_MADNESS_DOOR = 208843 }; template @@ -72,4 +97,3 @@ CreatureAI* GetZulGurubAI(Creature* creature) } #endif - -- cgit v1.2.3 From ee9b7dfef8059f05ab404c48dd34929283d48963 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Sun, 30 Dec 2012 17:09:55 +0100 Subject: Core/Command: Add command for near creature finding --- .../world/2012_12_30_01_world_trinity_string.sql | 3 ++ src/server/game/Miscellaneous/Language.h | 2 +- src/server/scripts/Commands/cs_npc.cpp | 47 ++++++++++++++++++++++ .../Database/Implementation/WorldDatabase.cpp | 1 + .../shared/Database/Implementation/WorldDatabase.h | 1 + 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/2012_12_30_01_world_trinity_string.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_30_01_world_trinity_string.sql b/sql/updates/world/2012_12_30_01_world_trinity_string.sql new file mode 100644 index 00000000000..ce0578168f4 --- /dev/null +++ b/sql/updates/world/2012_12_30_01_world_trinity_string.sql @@ -0,0 +1,3 @@ +DELETE FROM `trinity_string` WHERE `entry`=556; +INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES +(556, 'Found near creatures (distance %f): %u ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 6576b470a7f..b60a2de0ab6 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -539,7 +539,7 @@ enum TrinityStrings LANG_NPC_SETDATA = 555, //! Old ones now free: - // LANG_HOVER_DISABLED = 556, + LANG_COMMAND_NEAR_NPC_MESSAGE = 556, LANG_YOURS_LEVEL_UP = 557, LANG_YOURS_LEVEL_DOWN = 558, diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 115737e0dfe..b44b01d916f 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -87,6 +87,7 @@ public: static ChatCommand npcCommandTable[] = { { "info", SEC_ADMINISTRATOR, false, &HandleNpcInfoCommand, "", NULL }, + { "near", SEC_GAMEMASTER, false, &HandleNpcNearCommand, "", NULL }, { "move", SEC_GAMEMASTER, false, &HandleNpcMoveCommand, "", NULL }, { "playemote", SEC_ADMINISTRATOR, false, &HandleNpcPlayEmoteCommand, "", NULL }, { "say", SEC_MODERATOR, false, &HandleNpcSayCommand, "", NULL }, @@ -631,6 +632,52 @@ public: return true; } + static bool HandleNpcNearCommand(ChatHandler* handler, char const* args) + { + float distance = (!*args) ? 10.0f : float((atof(args))); + uint32 count = 0; + + Player* player = handler->GetSession()->GetPlayer(); + + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_NEAREST); + stmt->setFloat(0, player->GetPositionX()); + stmt->setFloat(1, player->GetPositionY()); + stmt->setFloat(2, player->GetPositionZ()); + stmt->setUInt32(3, player->GetMapId()); + stmt->setFloat(4, player->GetPositionX()); + stmt->setFloat(5, player->GetPositionY()); + stmt->setFloat(6, player->GetPositionZ()); + stmt->setFloat(7, distance * distance); + PreparedQueryResult result = WorldDatabase.Query(stmt); + + if (result) + { + do + { + Field* fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); + float x = fields[2].GetFloat(); + float y = fields[3].GetFloat(); + float z = fields[4].GetFloat(); + uint16 mapId = fields[5].GetUInt16(); + + CreatureTemplate const* creatureTemplate = sObjectMgr->GetCreatureTemplate(entry); + if (!creatureTemplate) + continue; + + handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, creatureTemplate->Name.c_str(), x, y, z, mapId); + + ++count; + } + while (result->NextRow()); + } + + handler->PSendSysMessage(LANG_COMMAND_NEAR_NPC_MESSAGE, distance, count); + + return true; + } + //move selected creature static bool HandleNpcMoveCommand(ChatHandler* handler, char const* args) { diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index 95c888249cd..0fc2dcfd55a 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -84,6 +84,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH); + PREPARE_STATEMENT(WORLD_SEL_CREATURE_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH); PREPARE_STATEMENT(WORLD_INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnMask, phaseMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(WORLD_DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h index 31da84c5151..64269edf7e1 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.h +++ b/src/server/shared/Database/Implementation/WorldDatabase.h @@ -104,6 +104,7 @@ enum WorldDatabaseStatements WORLD_SEL_ITEM_TEMPLATE_BY_NAME, WORLD_SEL_CREATURE_BY_ID, WORLD_SEL_GAMEOBJECT_NEAREST, + WORLD_SEL_CREATURE_NEAREST, WORLD_SEL_GAMEOBJECT_TARGET, WORLD_INS_CREATURE, WORLD_DEL_GAME_EVENT_CREATURE, -- cgit v1.2.3 From 4232658c62b367f6d486ea3b842775854ddece98 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 31 Dec 2012 12:57:35 +0100 Subject: Core:/ZulGurub: Fix mandokir decapitate targets --- src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 8d9ccd7bdfc..d23c2386db5 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -447,6 +447,7 @@ class spell_mandokir_decapitate : public SpellScriptLoader void FilterTargets(std::list& targets) { + targets.remove(GetCaster()->getVictim()); if (targets.empty()) return; -- cgit v1.2.3 From 8431be6bc6416e4d952e3fb8f42c2400ec76b2d1 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 31 Dec 2012 14:15:24 +0100 Subject: SQL: rename sql for 4.3.4 Core/ZulGurub: revert my logic fail in 4232658c62b367f6d486ea3b842775854ddece98 --- .../world/2012_12_30_00_world_zul_gurub.sql | 26 ---------------------- .../world/2012_12_30_00_world_zul_gurub_434.sql | 26 ++++++++++++++++++++++ .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 1 - 3 files changed, 26 insertions(+), 27 deletions(-) delete mode 100644 sql/updates/world/2012_12_30_00_world_zul_gurub.sql create mode 100644 sql/updates/world/2012_12_30_00_world_zul_gurub_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2012_12_30_00_world_zul_gurub.sql b/sql/updates/world/2012_12_30_00_world_zul_gurub.sql deleted file mode 100644 index 5b4e31636db..00000000000 --- a/sql/updates/world/2012_12_30_00_world_zul_gurub.sql +++ /dev/null @@ -1,26 +0,0 @@ -UPDATE `creature_template` SET `ScriptName`='npc_chained_spirit' WHERE `entry`=52156; -UPDATE `creature_template` SET `ScriptName`='npc_ohgan' WHERE `entry`=52157; - -DELETE FROM `creature` WHERE `id`=52156; - -DELETE FROM `spell_script_names` WHERE `spell_id` IN (96682,96776,96761,96821,96721,96722,96724,96740,28471); -INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES -(96682,'spell_mandokir_decapitate'), -(96776,'spell_mandokir_bloodletting'), -(96761,'spell_mandokir_devastating_slam'), -(96821,'spell_mandokir_spirit_vengeance_cancel'), -(96721,'spell_mandokir_ohgan_orders'), -(96722,'spell_mandokir_ohgan_orders_trigger'), -(96724,'spell_mandokir_reanimate_ohgan'), -(96740,'spell_mandokir_devastating_slam_damage'), -(28471,'spell_clear_all'); - -DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`IN (96724,96721); -INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES -(13, 3, 96724, 0, 0, 31, 0, 3, 52157, 0, 0, 0, 0, '', 'Earth Spike - Ohgan'), -(13, 1, 96721, 0, 0, 31, 0, 3, 52156, 0, 0, 0, 0, '', 'Ohgan''s Orders - Chained Spirit'); - -DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=16848; -INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES -(16848,11,0,0,'achievement_ohganot_so_fast'), -(16848,12,1,0,''); diff --git a/sql/updates/world/2012_12_30_00_world_zul_gurub_434.sql b/sql/updates/world/2012_12_30_00_world_zul_gurub_434.sql new file mode 100644 index 00000000000..5b4e31636db --- /dev/null +++ b/sql/updates/world/2012_12_30_00_world_zul_gurub_434.sql @@ -0,0 +1,26 @@ +UPDATE `creature_template` SET `ScriptName`='npc_chained_spirit' WHERE `entry`=52156; +UPDATE `creature_template` SET `ScriptName`='npc_ohgan' WHERE `entry`=52157; + +DELETE FROM `creature` WHERE `id`=52156; + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (96682,96776,96761,96821,96721,96722,96724,96740,28471); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(96682,'spell_mandokir_decapitate'), +(96776,'spell_mandokir_bloodletting'), +(96761,'spell_mandokir_devastating_slam'), +(96821,'spell_mandokir_spirit_vengeance_cancel'), +(96721,'spell_mandokir_ohgan_orders'), +(96722,'spell_mandokir_ohgan_orders_trigger'), +(96724,'spell_mandokir_reanimate_ohgan'), +(96740,'spell_mandokir_devastating_slam_damage'), +(28471,'spell_clear_all'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`IN (96724,96721); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 3, 96724, 0, 0, 31, 0, 3, 52157, 0, 0, 0, 0, '', 'Earth Spike - Ohgan'), +(13, 1, 96721, 0, 0, 31, 0, 3, 52156, 0, 0, 0, 0, '', 'Ohgan''s Orders - Chained Spirit'); + +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=16848; +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(16848,11,0,0,'achievement_ohganot_so_fast'), +(16848,12,1,0,''); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index d23c2386db5..8d9ccd7bdfc 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -447,7 +447,6 @@ class spell_mandokir_decapitate : public SpellScriptLoader void FilterTargets(std::list& targets) { - targets.remove(GetCaster()->getVictim()); if (targets.empty()) return; -- cgit v1.2.3 From 312e8509dddf910a5ab199d646c5a4d237d5fda9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 1 Jan 2013 21:57:31 +0100 Subject: Core/Spells: Implemented SPELL_EFFECT_RESURRECT_WITH_AURA (effect number 172) --- src/server/game/Entities/Player/Player.cpp | 34 +++++++++------ src/server/game/Entities/Player/Player.h | 49 +++++++++++++++------- src/server/game/Handlers/MiscHandler.cpp | 4 +- src/server/game/Miscellaneous/SharedDefines.h | 2 +- src/server/game/Spells/Spell.h | 1 + src/server/game/Spells/SpellEffects.cpp | 44 ++++++++++++++++--- .../ScarletEnclave/the_scarlet_enclave.cpp | 2 +- 7 files changed, 99 insertions(+), 37 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bfe86337b4d..e1030766704 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -693,7 +693,7 @@ Player::Player(WorldSession* session): Unit(true), phaseMgr(this) m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); - clearResurrectRequestData(); + _resurrectionData = NULL; memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT); @@ -905,6 +905,8 @@ Player::~Player() for (uint8 i = 0; i < MAX_CUF_PROFILES; ++i) delete _CUFProfiles[i]; + ClearResurrectRequestData(); + sWorld->DecreasePlayerCount(); } @@ -1842,7 +1844,7 @@ void Player::setDeathState(DeathState s) // lost combo points at any target (targeted combo points clear in Unit::setDeathState) ClearComboPoints(); - clearResurrectRequestData(); + ClearResurrectRequestData(); //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD) RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true); @@ -2348,13 +2350,13 @@ void Player::ProcessDelayedOperations() { ResurrectPlayer(0.0f, false); - if (GetMaxHealth() > m_resurrectHealth) - SetHealth(m_resurrectHealth); + if (GetMaxHealth() > _resurrectionData->Health) + SetHealth(_resurrectionData->Health); else SetFullHealth(); - if (uint32(GetMaxPower(POWER_MANA)) > m_resurrectMana) - SetPower(POWER_MANA, m_resurrectMana); + if (uint32(GetMaxPower(POWER_MANA)) > _resurrectionData->Mana) + SetPower(POWER_MANA, _resurrectionData->Mana); else SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); @@ -2362,6 +2364,9 @@ void Player::ProcessDelayedOperations() SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); SetPower(POWER_ECLIPSE, 0); + if (uint32 aura = _resurrectionData->Aura) + CastSpell(this, aura, true, NULL, NULL, _resurrectionData->GUID); + SpawnCorpseBones(); } @@ -7505,7 +7510,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo } } -void Player::SetCurrency(uint32 id, uint32 count, bool printLog /*= true*/) +void Player::SetCurrency(uint32 id, uint32 count, bool /*printLog*/ /*= true*/) { PlayerCurrenciesMap::iterator itr = _currencyStorage.find(id); if (itr == _currencyStorage.end()) @@ -23557,7 +23562,9 @@ bool Player::IsAtRecruitAFriendDistance(WorldObject const* pOther) const void Player::ResurectUsingRequestData() { /// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse - TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation()); + float x, y, z, o; + _resurrectionData->Location.GetPosition(x, y, z, o); + TeleportTo(_resurrectionData->Location.GetMapId(), x, y, z, o); if (IsBeingTeleported()) { @@ -23567,13 +23574,13 @@ void Player::ResurectUsingRequestData() ResurrectPlayer(0.0f, false); - if (GetMaxHealth() > m_resurrectHealth) - SetHealth(m_resurrectHealth); + if (GetMaxHealth() > _resurrectionData->Health) + SetHealth(_resurrectionData->Health); else SetFullHealth(); - if (uint32(GetMaxPower(POWER_MANA)) > m_resurrectMana) - SetPower(POWER_MANA, m_resurrectMana); + if (uint32(GetMaxPower(POWER_MANA)) > _resurrectionData->Mana) + SetPower(POWER_MANA, _resurrectionData->Mana); else SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); @@ -23582,6 +23589,9 @@ void Player::ResurectUsingRequestData() SetPower(POWER_FOCUS, GetMaxPower(POWER_FOCUS)); SetPower(POWER_ECLIPSE, 0); + if (uint32 aura = _resurrectionData->Aura) + CastSpell(this, aura, true, NULL, NULL, _resurrectionData->GUID); + SpawnCorpseBones(); } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 12674552666..c3bdfd5bd7f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1163,6 +1163,15 @@ class TradeData uint64 m_items[TRADE_SLOT_COUNT]; // traded items from m_player side including non-traded slot }; +struct ResurrectionData +{ + uint64 GUID; + WorldLocation Location; + uint32 Health; + uint32 Mana; + uint32 Aura; +}; + class KillRewarder { public: @@ -1974,19 +1983,32 @@ class Player : public Unit, public GridObject void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; } void UpdatePotionCooldown(Spell* spell = NULL); - void setResurrectRequestData(uint64 guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana) + void SetResurrectRequestData(Unit* caster, uint32 health, uint32 mana, uint32 appliedAura) + { + ASSERT(!IsRessurectRequested()); + _resurrectionData = new ResurrectionData(); + _resurrectionData->GUID = caster->GetGUID(); + _resurrectionData->Location.WorldRelocate(*caster); + _resurrectionData->Health = health; + _resurrectionData->Mana = mana; + _resurrectionData->Aura = appliedAura; + } + + void ClearResurrectRequestData() { - m_resurrectGUID = guid; - m_resurrectMap = mapId; - m_resurrectX = X; - m_resurrectY = Y; - m_resurrectZ = Z; - m_resurrectHealth = health; - m_resurrectMana = mana; + delete _resurrectionData; + _resurrectionData = NULL; } - void clearResurrectRequestData() { setResurrectRequestData(0, 0, 0.0f, 0.0f, 0.0f, 0, 0); } - bool isRessurectRequestedBy(uint64 guid) const { return m_resurrectGUID == guid; } - bool isRessurectRequested() const { return m_resurrectGUID != 0; } + + bool IsRessurectRequestedBy(uint64 guid) const + { + if (!IsRessurectRequested()) + return false; + + return _resurrectionData->GUID == guid; + } + + bool IsRessurectRequested() const { return _resurrectionData != NULL; } void ResurectUsingRequestData(); uint8 getCinematic() @@ -2963,10 +2985,7 @@ class Player : public Unit, public GridObject void ResetTimeSync(); void SendTimeSync(); - uint64 m_resurrectGUID; - uint32 m_resurrectMap; - float m_resurrectX, m_resurrectY, m_resurrectZ; - uint32 m_resurrectHealth, m_resurrectMana; + ResurrectionData* _resurrectionData; WorldSession* m_session; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 29af54f195f..ff319fdbfe9 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -783,11 +783,11 @@ void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData) if (status == 0) { - GetPlayer()->clearResurrectRequestData(); // reject + GetPlayer()->ClearResurrectRequestData(); // reject return; } - if (!GetPlayer()->isRessurectRequestedBy(guid)) + if (!GetPlayer()->IsRessurectRequestedBy(guid)) return; GetPlayer()->ResurectUsingRequestData(); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index f59e10ba846..c855f7e2af2 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -952,7 +952,7 @@ enum SpellEffects SPELL_EFFECT_DESTROY_ITEM = 169, SPELL_EFFECT_170 = 170, SPELL_EFFECT_171 = 171, // Summons gamebject - SPELL_EFFECT_172 = 172, // Aoe ressurection + SPELL_EFFECT_RESURRECT_WITH_AURA = 172, SPELL_EFFECT_UNLOCK_GUILD_VAULT_TAB = 173, // Guild tab unlocked (guild perk) SPELL_EFFECT_174 = 174, SPELL_EFFECT_175 = 175, // Unused (4.3.4) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 2a976d74f30..b009bc6e2d7 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -339,6 +339,7 @@ class Spell void EffectCastButtons(SpellEffIndex effIndex); void EffectRechargeManaGem(SpellEffIndex effIndex); void EffectGiveCurrency(SpellEffIndex effIndex); + void EffectResurrectWithAura(SpellEffIndex effIndex); typedef std::set UsedSpellMods; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 3e6994176cc..f76b696dfc3 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -241,7 +241,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //169 SPELL_EFFECT_DESTROY_ITEM &Spell::EffectNULL, //170 SPELL_EFFECT_170 &Spell::EffectNULL, //171 SPELL_EFFECT_171 - &Spell::EffectNULL, //172 SPELL_EFFECT_172 + &Spell::EffectResurrectWithAura, //172 SPELL_EFFECT_RESURRECT_WITH_AURA &Spell::EffectNULL, //173 SPELL_EFFECT_UNLOCK_GUILD_VAULT_TAB &Spell::EffectNULL, //174 SPELL_EFFECT_174 &Spell::EffectUnused, //175 SPELL_EFFECT_175 unused @@ -280,13 +280,13 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) Player* target = unitTarget->ToPlayer(); - if (target->isRessurectRequested()) // already have one active request + if (target->IsRessurectRequested()) // already have one active request return; uint32 health = damage; uint32 mana = m_spellInfo->Effects[effIndex].MiscValue; ExecuteLogEffectResurrect(effIndex, target); - target->setResurrectRequestData(m_caster->GetGUID(), m_caster->GetMapId(), m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ(), health, mana); + target->SetResurrectRequestData(m_caster, health, mana, 0); SendResurrectRequest(target); } @@ -4622,7 +4622,7 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) Player* target = unitTarget->ToPlayer(); - if (target->isRessurectRequested()) // already have one active request + if (target->IsRessurectRequested()) // already have one active request return; uint32 health = target->CountPctFromMaxHealth(damage); @@ -4630,7 +4630,7 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) ExecuteLogEffectResurrect(effIndex, target); - target->setResurrectRequestData(m_caster->GetGUID(), m_caster->GetMapId(), m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ(), health, mana); + target->SetResurrectRequestData(m_caster, health, mana, 0); SendResurrectRequest(target); } @@ -5896,7 +5896,7 @@ void Spell::EffectRemoveAura(SpellEffIndex effIndex) unitTarget->RemoveAurasDueToSpell(m_spellInfo->Effects[effIndex].TriggerSpell); } -void Spell::EffectDamageFromMaxHealthPCT(SpellEffIndex effIndex) +void Spell::EffectDamageFromMaxHealthPCT(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -6046,3 +6046,35 @@ void Spell::EffectSummonRaFFriend(SpellEffIndex effIndex) m_caster->CastSpell(unitTarget, m_spellInfo->Effects[effIndex].TriggerSpell, true); } + +void Spell::EffectResurrectWithAura(SpellEffIndex effIndex) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget || !unitTarget->IsInWorld()) + return; + + Player* target = unitTarget->ToPlayer(); + if (!target) + return; + + if (unitTarget->isAlive()) + return; + + if (target->IsRessurectRequested()) // already have one active request + return; + + uint32 health = target->CountPctFromMaxHealth(damage); + uint32 mana = CalculatePct(target->GetMaxPower(POWER_MANA), damage); + uint32 resurrectAura = 0; + if (sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[effIndex].TriggerSpell)) + resurrectAura = GetSpellInfo()->Effects[effIndex].TriggerSpell; + + if (resurrectAura && target->HasAura(resurrectAura)) + return; + + ExecuteLogEffectResurrect(effIndex, target); + target->SetResurrectRequestData(m_caster, health, mana, resurrectAura); + SendResurrectRequest(target); +} diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp index 6e7f7e103c5..8f10bad2095 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp @@ -92,7 +92,7 @@ public: FlyBackTimer = 4500; break; case 2: - if (!player->isRessurectRequested()) + if (!player->IsRessurectRequested()) { me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01); DoCast(player, SPELL_REVIVE, true); -- cgit v1.2.3 From 6b668c8337d2efe306ad4c5a1d0ade6e34b5d66d Mon Sep 17 00:00:00 2001 From: Spp Date: Wed, 2 Jan 2013 13:31:19 +0100 Subject: Core/Misc: Update headers to 2013 --- src/server/game/Battlegrounds/Zones/BattlegroundBFG.cpp | 2 +- src/server/game/Battlegrounds/Zones/BattlegroundBFG.h | 2 +- src/server/game/Battlegrounds/Zones/BattlegroundTP.cpp | 2 +- src/server/game/Battlegrounds/Zones/BattlegroundTP.h | 2 +- src/server/game/Guilds/GuildFinderMgr.cpp | 2 +- src/server/game/Guilds/GuildFinderMgr.h | 2 +- src/server/game/Handlers/GuildFinderHandler.cpp | 2 +- src/server/game/Handlers/VoidStorageHandler.cpp | 2 +- src/server/game/Maps/PhaseMgr.cpp | 2 +- src/server/game/Maps/PhaseMgr.h | 2 +- src/server/game/Movement/MovementStructures.h | 2 +- src/server/game/Movement/Spline/MovementPacketBuilder.cpp | 2 +- src/server/game/Movement/Spline/MovementPacketBuilder.h | 2 +- src/server/game/Server/WorldPacket.cpp | 2 +- .../scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp | 2 +- src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp | 2 +- src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp | 2 +- .../scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp | 2 +- src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h | 2 +- .../Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.cpp index 52af3e23e11..d067967e682 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h index 35c9bef8b17..088fe3bc142 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundTP.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundTP.cpp index 5a19dff589f..05fbc723cac 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundTP.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundTP.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundTP.h b/src/server/game/Battlegrounds/Zones/BattlegroundTP.h index 45be413e5cf..c5706fd7ccc 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundTP.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundTP.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp index 461c3093cd4..1f9030b94ae 100644 --- a/src/server/game/Guilds/GuildFinderMgr.cpp +++ b/src/server/game/Guilds/GuildFinderMgr.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h index 691132512d1..d101c91e97c 100644 --- a/src/server/game/Guilds/GuildFinderMgr.h +++ b/src/server/game/Guilds/GuildFinderMgr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp index d43c4eb86ca..c374aa635ab 100644 --- a/src/server/game/Handlers/GuildFinderHandler.cpp +++ b/src/server/game/Handlers/GuildFinderHandler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index 1310a65d179..52fbaaf43e2 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Maps/PhaseMgr.cpp b/src/server/game/Maps/PhaseMgr.cpp index 9949ee5bdd4..2bb4ed0fb8c 100644 --- a/src/server/game/Maps/PhaseMgr.cpp +++ b/src/server/game/Maps/PhaseMgr.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Maps/PhaseMgr.h b/src/server/game/Maps/PhaseMgr.h index 2fdf8eb5e7f..bf3da7b4cb7 100644 --- a/src/server/game/Maps/PhaseMgr.h +++ b/src/server/game/Maps/PhaseMgr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 29b7fb5dfe6..9a92e9747f1 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2008-2012 TrinityCore +* Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp index d840302365f..f2dc8897532 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h index 24b355924c8..fb6d0f435a0 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.h +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify diff --git a/src/server/game/Server/WorldPacket.cpp b/src/server/game/Server/WorldPacket.cpp index 81203edba05..af8e6bd5f1a 100644 --- a/src/server/game/Server/WorldPacket.cpp +++ b/src/server/game/Server/WorldPacket.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp index bcf742fcf32..f4083337f56 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp index f582edd54db..36689c89f06 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp index 00b8c8747f6..6b6aa727848 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index 63ee95cb3de..659350caa6d 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index d4f9593df03..aec5f7416c6 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 8bdd4a16c9e..3258df45a0b 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index 726ecbacd2e..e5ef556003f 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the -- cgit v1.2.3 From a28d2d22f3899208554332882d64543abdd1e1dc Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Thu, 3 Jan 2013 23:40:12 +0100 Subject: Core: Fix non pch build --- src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp | 1 + src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp | 1 + 2 files changed, 2 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 74ded63d692..db34d22ff4e 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -21,6 +21,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "Player.h" +#include "GridNotifiers.h" #include "zulgurub.h" enum Yells diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index 659350caa6d..cba0ea0b61c 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -22,6 +22,7 @@ #include "SpellAuraEffects.h" #include "Player.h" #include "Weather.h" +#include "WorldSession.h" #include "halls_of_origination.h" enum Texts -- cgit v1.2.3 From 0f71fd8e23b158df64c9cc871ee5d32647c06f34 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Thu, 3 Jan 2013 23:48:50 +0100 Subject: Core: Fix build --- src/server/scripts/Commands/cs_reload.cpp | 8 -------- 1 file changed, 8 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 16fe5991461..f5f998bbf0d 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -929,14 +929,6 @@ public: return true; } - static bool HandleReloadItemSetNamesCommand(ChatHandler* handler, const char* /*args*/) - { - sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Item set names..."); - sObjectMgr->LoadItemSetNames(); - handler->SendGlobalGMSysMessage("DB table `item_set_names` reloaded."); - return true; - } - static bool HandleReloadEventScriptsCommand(ChatHandler* handler, const char* args) { if (sScriptMgr->IsScriptScheduled()) -- cgit v1.2.3 From bb1c955c8b63399e8a62154152cfa1d4bcb6d24a Mon Sep 17 00:00:00 2001 From: Subv Date: Fri, 4 Jan 2013 18:06:55 -0500 Subject: Scripts/HallsOfOrigination: Added script for Anraphet and the Vault of Lights. Some bugs might still remain. Crumbling Ruin spell has a problem with radius handling. --- ...013_01_04_00_world_halls_of_origination_434.sql | 51 ++ src/server/game/Scripting/ScriptLoader.cpp | 2 + src/server/game/Spells/SpellMgr.cpp | 5 - src/server/scripts/Kalimdor/CMakeLists.txt | 1 + .../Kalimdor/HallsOfOrigination/boss_anraphet.cpp | 571 +++++++++++++++++++++ .../HallsOfOrigination/boss_earthrager_ptah.cpp | 46 -- .../HallsOfOrigination/halls_of_origination.h | 49 +- .../instance_halls_of_origination.cpp | 113 +++- 8 files changed, 780 insertions(+), 58 deletions(-) create mode 100644 sql/updates/world/2013_01_04_00_world_halls_of_origination_434.sql create mode 100644 src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_04_00_world_halls_of_origination_434.sql b/sql/updates/world/2013_01_04_00_world_halls_of_origination_434.sql new file mode 100644 index 00000000000..36df0da72ca --- /dev/null +++ b/sql/updates/world/2013_01_04_00_world_halls_of_origination_434.sql @@ -0,0 +1,51 @@ +UPDATE `creature_template` SET `ScriptName`="npc_brann_bronzebeard_anraphet" WHERE `entry`=39908; +DELETE FROM `creature_text` WHERE `entry`=39908; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(39908, 0, 0, 'Right, let''s go! Just need to input the final entry sequence into the door mechanism... and...', 12, 0, 100, 5, 0, 20897, 'Brann Bronzebeard'), +(39908, 1, 0, 'That did the trick! The control room should be right behind this... oh... wow...', 12, 0, 100, 5, 0, 20898, 'Brann Bronzebeard'), +(39908, 2, 0, 'What? This isn''t the control room! There''s another entire defense mechanism in place, and the blasted Rock Troggs broke into here somehow. Troggs. Why did it have to be Troggs!', 12, 0, 100, 5, 0, 20899, 'Brann Bronzebeard'), +(39908, 3, 0, 'Ok, let me think a moment.', 12, 0, 100, 1, 0, 20900, 'Brann Bronzebeard'), +(39908, 4, 0, 'Mirrors pointing all over the place.', 12, 0, 100, 25, 0, 20902, 'Brann Bronzebeard'), +(39908, 5, 0, 'Four platforms with huge elementals.', 12, 0, 100, 25, 0, 20901, 'Brann Bronzebeard'), +(39908, 6, 0, 'I got it! I saw a tablet that mentioned this chamber. This is the Vault of Lights! Ok, simple enough. I need you adventurers to take out each of the four elementals to trigger the opening sequence for the far door!', 12, 0, 100, 5, 0, 20903, 'Brann Bronzebeard'), +(39908, 7, 0, 'One down!', 14, 0, 100, 5, 0, 20904, 'Brann Bronzebeard'), +(39908, 8, 0, 'Another one down! Just look at those light beams! They seem to be connecting to the far door!', 14, 0, 100, 5, 0, 20905, 'Brann Bronzebeard'), +(39908, 9, 0, 'One more elemental to go! The door is almost open!', 14, 0, 100, 5, 0, 20906, 'Brann Bronzebeard'), +(39908, 10, 0, 'That''s it, you''ve done it! The vault door is opening! Now we can... oh, no!', 14, 0, 100, 5, 0, 20907, 'Brann Bronzebeard'), +(39908, 11, 0, 'We''ve done it! The control room is breached!', 14, 0, 100, 5, 0, 23709, 'Brann Bronzebeard'), +(39908, 12, 0, 'Here we go! Now this should only take a moment...', 14, 0, 100, 5, 0, 23710, 'Brann Bronzebeard'); + +UPDATE `creature_template` SET `ScriptName`="boss_anraphet" WHERE `entry`=39788; +DELETE FROM `creature_text` WHERE `entry`=39788; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(39788, 0, 0, 'This unit has been activated outside normal operating protocols. Downloading new operational parameters. Download complete. Full unit self defense routines are now active. Destruction of foreign units in the system shall now commence.', 14, 0, 100, 0, 0, 20857, 'Anraphet - SAY_INTRO'), +(39788, 1, 0, 'Purge of unauthorized entities commencing.', 14, 0, 100, 0, 0, 20862, 'Anraphet - SAY_AGGRO'), +(39788, 2, 0, 'Omega Stance activated. Annihilation of foreign unit is now imminent.', 14, 0, 100, 0, 0, 20861, 'Anraphet - SAY_OMEGA_STANCE'), +(39788, 3, 0, 'Purge Complete.', 14, 0, 100, 0, 0, 20859, 'Anraphet - SAY_PLAYER_KILL'), +(39788, 3, 1, 'Target Annihilated.', 14, 0, 100, 0, 0, 20858, 'Anraphet - SAY_PLAYER_KILL'), +(39788, 4, 0, 'Anraphet unit shutting down...', 14, 0, 100, 0, 0, 20856, 'Anraphet - SAY_DEATH'); + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (76904,77106,77127); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(76904,'spell_anraphet_alpha_beams'), +(77106,'spell_anraphet_omega_stance_summon'), +(77127,'spell_omega_stance_spider_effect'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup` IN (11339,11348,12512); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=11339; +INSERT INTO `conditions`(`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14, 11339, 15794, 0, 0, 13, 1, 2, 3, 2, 1, 0, 0, '', 'Brann Bronzebeard gossip menu - Show only if DATA_VAULT_OF_LIGHTS is not done'), +(14, 11348, 15815, 0, 0, 13, 1, 18, 4, 0, 1, 0, 0, '', 'Brann Bronzebeard gossip menu - Show only if DATA_DEAD_ELEMENTALS is less than 4'), +(14, 12512, 17600, 0, 0, 13, 1, 18, 4, 0, 0, 0, 0, '', 'Brann Bronzebeard gossip menu - Show only if DATA_DEAD_ELEMENTALS is 4'), +(15, 11339, 0, 0, 0, 13, 1, 2, 3, 2, 1, 0, 0, '', 'Brann Bronzebeard gossip menu option - Show only if DATA_VAULT_OF_LIGHTS is not done'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=77437; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 6, 77437, 0, 0, 31, 0, 3, 39804, 0, 0, 0, 0, '', 'Destruction Protocol - Stone Trogg Pillager'), +(13, 6, 77437, 0, 1, 31, 0, 3, 40252, 0, 0, 0, 0, '', 'Destruction Protocol - Stone Trogg Rock Flinger'), +(13, 6, 77437, 0, 2, 31, 0, 3, 40251, 0, 0, 0, 0, '', 'Destruction Protocol - Stone Trogg Brute'); + +UPDATE `creature_template` SET `ScriptName`='npc_alpha_beam' WHERE `entry`=41144; +UPDATE `creature_template` SET `ScriptName`='npc_omega_stance' WHERE `entry`=41194; + +DELETE FROM `spell_script_names` WHERE `spell_id`=94974; diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 33fd43a86d5..570fe23478f 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -331,6 +331,7 @@ void AddSC_instance_zulfarrak(); //Zul'Farrak instance script void AddSC_instance_halls_of_origination(); void AddSC_boss_temple_guardian_anhuur(); void AddSC_boss_earthrager_ptah(); +void AddSC_boss_anraphet(); void AddSC_ashenvale(); void AddSC_azshara(); @@ -989,6 +990,7 @@ void AddKalimdorScripts() AddSC_instance_halls_of_origination(); AddSC_boss_temple_guardian_anhuur(); AddSC_boss_earthrager_ptah(); + AddSC_boss_anraphet(); #endif } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index d05fb243fa2..69270c1ed4b 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3624,11 +3624,6 @@ void SpellMgr::LoadSpellInfoCorrections() // Aura is refreshed at 3 seconds, and the tick should happen at the fourth. spellInfo->AttributesEx8 |= SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER; break; - // Earthrager Ptah - case 94974: - // Hacked as a timed event until SPELL_EFFECT_TRIGGER_MISSILE is correctly fixed. - spellInfo->Effects[EFFECT_0].TriggerSpell = 0; - break; default: break; } diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index 4c22cdd080b..fc75444bda6 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -115,6 +115,7 @@ set(scripts_STAT_SRCS Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp + Kalimdor/HallsOfOrigination/boss_anraphet.cpp ) message(" -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp new file mode 100644 index 00000000000..490c0a77494 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -0,0 +1,571 @@ +/* + * Copyright (C) 2008-2012 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "GridNotifiers.h" +#include "Player.h" +#include "ObjectAccessor.h" +#include "halls_of_origination.h" + +enum Texts +{ + ANRAPHET_SAY_INTRO = 0, + ANRAPHET_SAY_AGGRO = 1, + ANRAPHET_SAY_OMEGA_STANCE = 2, + ANRAPHET_SAY_KILL = 3, + ANRAPHET_SAY_DEATH = 4, + + BRANN_SAY_DOOR_INTRO = 0, // Right, let's go! Just need to input the final entry sequence into the door mechanism... and... + BRANN_SAY_UNLOCK_DOOR = 1, // That did the trick! The control room should be right behind this... oh... wow... + BRANN_SAY_TROGGS = 2, // What? This isn't the control room! There's another entire defense mechanism in place, and the blasted Rock Troggs broke into here somehow. Troggs. Why did it have to be Troggs! + BRANN_SAY_THINK = 3, // Ok, let me think a moment. + BRANN_SAY_MIRRORS = 4, // Mirrors pointing all over the place. + BRANN_SAY_ELEMENTALS = 5, // Four platforms with huge elementals. + BRANN_SAY_GET_IT = 6, // I got it! I saw a tablet that mentioned this chamber. This is the Vault of Lights! Ok, simple enough. I need you adventurers to take out each of the four elementals to trigger the opening sequence for the far door! + BRANN_1_ELEMENTAL_DEAD = 7, // One down! + BRANN_2_ELEMENTAL_DEAD = 8, // Another one down! Just look at those light beams! They seem to be connecting to the far door! + BRANN_3_ELEMENTAL_DEAD = 9, // One more elemental to go! The door is almost open! + BRANN_4_ELEMENTAL_DEAD = 10, // That''s it, you''ve done it! The vault door is opening! Now we can... oh, no! + BRANN_SAY_ANRAPHET_DIED = 11, // We''ve done it! The control room is breached! + BRANN_SAY_MOMENT = 12 // Here we go! Now this should only take a moment... +}; + +enum Events +{ + EVENT_BRANN_MOVE_INTRO = 1, + EVENT_BRANN_UNLOCK_DOOR = 2, + EVENT_BRANN_THINK = 3, + EVENT_BRANN_SET_ORIENTATION_1 = 4, + EVENT_BRANN_SET_ORIENTATION_2 = 5, + EVENT_BRANN_SET_ORIENTATION_3 = 6, + EVENT_BRANN_SAY_ELEMENTALS = 7, + EVENT_BRANN_SAY_GET_IT = 8, + EVENT_BRANN_SET_ORIENTATION_4 = 9, + + EVENT_ANRAPHET_APPEAR = 10, + EVENT_ANRAPHET_ACTIVATE = 11, + EVENT_ANRAPHET_DESTROY = 12, + EVENT_ANRAPHET_READY = 13, + EVENT_ANRAPHET_NEMESIS_STRIKE = 14, + EVENT_ANRAPHET_ALPHA_BEAMS = 15, + EVENT_ANRAPHET_OMEGA_STANCE = 16, + EVENT_ANRAPHET_CRUMBLING_RUIN = 17, + EVENT_ANRAPHET_ACTIVATE_OMEGA = 18 +}; + +enum Spells +{ + SPELL_DESTRUCTION_PROTOCOL = 77437, + + SPELL_ALPHA_BEAMS = 76184, + SPELL_ALPHA_BEAMS_BACK_CAST = 76912, + + SPELL_CRUMBLING_RUIN = 75609, + + + SPELL_NEMESIS_STRIKE = 75604, + + SPELL_OMEGA_STANCE_SUMMON = 77106, + SPELL_OMEGA_STANCE = 75622, + SPELL_OMEGA_STANCE_SPIDER_TRIGGER = 77121, +}; + +enum Phases +{ + PHASE_INTRO = 1, + PHASE_COMBAT = 2, + + PHASE_MASK_COMBAT = (1 << PHASE_COMBAT), +}; + +enum Points +{ + POINT_ANRAPHET_ACTIVATE = 0, + MAX_BRANN_WAYPOINTS_INTRO = 17 +}; + +Position const AnraphetActivatePos = {-193.656f, 366.689f, 75.91001f, 3.138207f}; + +Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO] = +{ + {-429.583f, 367.019f, 89.79282f, 0.0f}, + {-409.9531f, 367.0469f, 89.81111f, 0.0f}, + {-397.8246f, 366.967f, 86.37722f, 0.0f}, + {-383.7813f, 366.8229f, 82.07919f, 0.0f}, + {-368.2604f, 366.7448f, 77.0984f, 0.0f}, + {-353.6458f, 366.4896f, 75.92504f, 0.0f}, + {-309.0608f, 366.7205f, 75.91345f, 0.0f}, + {-276.3303f, 367.0f, 75.92413f, 0.0f}, + {-246.5104f, 366.6389f, 75.87791f, 0.0f}, + {-202.0417f, 366.7517f, 75.92508f, 0.0f}, + {-187.6024f, 366.7656f, 76.23077f, 0.0f}, + {-155.0938f, 366.783f, 86.45834f, 0.0f}, + {-143.5694f, 366.8177f, 89.73354f, 0.0f}, + {-128.5608f, 366.8629f, 89.74199f, 0.0f}, + {-103.559f, 366.5938f, 89.79725f, 0.0f}, + {-71.58507f, 367.0278f, 89.77069f, 0.0f}, + {-35.04861f, 366.6563f, 89.77447f, 0.0f}, +}; + +class boss_anraphet : public CreatureScript +{ +public: + boss_anraphet() : CreatureScript("boss_anraphet") { } + + struct boss_anraphetAI : public BossAI + { + boss_anraphetAI(Creature* creature) : BossAI(creature, DATA_ANRAPHET) { } + + void ScheduleCombatEvents() + { + events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 8000, 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, 10000, 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, 35000, 0, PHASE_COMBAT); + } + + void Reset() + { + _Reset(); + me->SetWalk(false); + events.SetPhase(PHASE_INTRO); + if (instance->GetData(DATA_DEAD_ELEMENTALS) == 4) + { + // Set to combat automatically, Brann's event won't repeat + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + events.SetPhase(PHASE_COMBAT); + ScheduleCombatEvents(); + me->SetHomePosition(AnraphetActivatePos); + } + } + + void EnterCombat(Unit* /*who*/) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + Talk(ANRAPHET_SAY_AGGRO); + _EnterCombat(); + } + + void JustDied(Unit* /*killer*/) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + Talk(ANRAPHET_SAY_DEATH); + + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRANN_0_GUID))) + brann->AI()->DoAction(ACTION_ANRAPHET_DIED); + + _JustDied(); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(ANRAPHET_SAY_KILL); + } + + void JustReachedHome() + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _JustReachedHome(); + instance->SetBossState(DATA_ANRAPHET, FAIL); + } + + void DoAction(int32 const action) + { + if (action == ACTION_ANRAPHET_INTRO) + events.ScheduleEvent(EVENT_ANRAPHET_APPEAR, 6000, 0, PHASE_INTRO); + } + + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE) + return; + + if (point == POINT_ANRAPHET_ACTIVATE) + { + events.ScheduleEvent(EVENT_ANRAPHET_ACTIVATE, 1500, 0, PHASE_INTRO); + me->SetHomePosition(AnraphetActivatePos); + } + } + + void UpdateAI(uint32 const diff) + { + if ((events.GetPhaseMask() & PHASE_MASK_COMBAT) && (!UpdateVictim() || !CheckInRoom())) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ANRAPHET_APPEAR: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_ANRAPHET_ACTIVATE, AnraphetActivatePos); + break; + case EVENT_ANRAPHET_ACTIVATE: + me->SetWalk(false); + Talk(ANRAPHET_SAY_INTRO); + events.ScheduleEvent(EVENT_ANRAPHET_DESTROY, 17500, 0, PHASE_INTRO); + return; + case EVENT_ANRAPHET_DESTROY: + DoCastAOE(SPELL_DESTRUCTION_PROTOCOL); + events.ScheduleEvent(EVENT_ANRAPHET_READY, 6000, 0, PHASE_INTRO); + break; + case EVENT_ANRAPHET_READY: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + events.SetPhase(PHASE_COMBAT); + ScheduleCombatEvents(); + break; + case EVENT_ANRAPHET_NEMESIS_STRIKE: + DoCastVictim(SPELL_NEMESIS_STRIKE); + events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 21500, 0, PHASE_COMBAT); + break; + case EVENT_ANRAPHET_ALPHA_BEAMS: + DoCast(me, SPELL_ALPHA_BEAMS); + events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 12500, 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, urand(40000, 45000), 0, PHASE_COMBAT); + break; + case EVENT_ANRAPHET_OMEGA_STANCE: + DoCast(me, SPELL_OMEGA_STANCE_SUMMON); + DoCast(me, SPELL_OMEGA_STANCE); + Talk(ANRAPHET_SAY_OMEGA_STANCE); + events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, urand(45000, 50000), 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 13000, 0, PHASE_COMBAT); + break; + case EVENT_ANRAPHET_CRUMBLING_RUIN: + DoCast(me, SPELL_CRUMBLING_RUIN); + break; + } + } + + if (events.GetPhaseMask() & PHASE_MASK_COMBAT) + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetHallsOfOriginationAI(creature); + } +}; + +class npc_omega_stance : public CreatureScript +{ + public: + npc_omega_stance() : CreatureScript("npc_omega_stance") { } + + struct npc_omega_stanceAI : public ScriptedAI + { + npc_omega_stanceAI(Creature* creature) : ScriptedAI(creature) { } + + void IsSummonedBy(Unit* /*who*/) + { + DoCast(me, SPELL_OMEGA_STANCE_SPIDER_TRIGGER, true); + } + + void EnterEvadeMode() { } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_omega_stanceAI(creature); + } +}; + +class npc_alpha_beam : public CreatureScript +{ + public: + npc_alpha_beam() : CreatureScript("npc_alpha_beam") { } + + struct npc_alpha_beamAI : public ScriptedAI + { + npc_alpha_beamAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* summoner) + { + if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID))) + anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST); + } + + void EnterEvadeMode() { } // Never evade + + private: + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetHallsOfOriginationAI(creature); + } +}; + +class npc_brann_bronzebeard_anraphet : public CreatureScript +{ + public: + npc_brann_bronzebeard_anraphet() : CreatureScript("npc_brann_bronzebeard_anraphet") { } + + struct npc_brann_bronzebeard_anraphetAI : public CreatureAI + { + npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { } + + void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) + { + if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE) + return; + + if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) + { + _instance->SetBossState(DATA_VAULT_OF_LIGHTS, IN_PROGRESS); + _currentPoint = 0; + events.Reset(); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetWalk(true); + Talk(BRANN_SAY_DOOR_INTRO); + events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500); + } + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_ELEMENTAL_DIED: + { + uint32 dead = _instance->GetData(DATA_DEAD_ELEMENTALS); + Talk(BRANN_1_ELEMENTAL_DEAD + dead - 1); + if (dead == 4) + { + _instance->DoCastSpellOnPlayers(SPELL_VAULT_OF_LIGHTS_CREDIT); + if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID))) + anraphet->AI()->DoAction(ACTION_ANRAPHET_INTRO); + } + break; + } + case ACTION_ANRAPHET_DIED: + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1000); + break; + } + } + + void UpdateAI(uint32 const diff) + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BRANN_MOVE_INTRO: + if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO) + me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]); + break; + case EVENT_BRANN_UNLOCK_DOOR: + Talk(BRANN_SAY_UNLOCK_DOOR); + _instance->SetBossState(DATA_VAULT_OF_LIGHTS, DONE); + _instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_VAULT_OF_LIGHTS_EVENT); + events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 3500); + break; + case EVENT_BRANN_THINK: + Talk(BRANN_SAY_THINK); + events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_1, 6000); + break; + case EVENT_BRANN_SET_ORIENTATION_1: + me->SetFacingTo(5.445427f); + Talk(BRANN_SAY_MIRRORS); + events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_2, 1000); + break; + case EVENT_BRANN_SET_ORIENTATION_2: + me->SetFacingTo(0.6283185f); + events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_3, 2500); + break; + case EVENT_BRANN_SET_ORIENTATION_3: + me->SetFacingTo(0.01745329f); + events.ScheduleEvent(EVENT_BRANN_SAY_ELEMENTALS, 200); + break; + case EVENT_BRANN_SAY_ELEMENTALS: + Talk(BRANN_SAY_ELEMENTALS); + events.ScheduleEvent(EVENT_BRANN_SAY_GET_IT, 3500); + break; + case EVENT_BRANN_SAY_GET_IT: + Talk(BRANN_SAY_GET_IT); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + break; + case EVENT_BRANN_SET_ORIENTATION_4: + me->SetFacingTo(3.141593f); + break; + } + } + } + + void MovementInform(uint32 movementType, uint32 pointId) + { + if (movementType != POINT_MOTION_TYPE) + return; + + _currentPoint = pointId + 1; + uint32 delay = 1; + + switch (pointId) + { + case 0: + Talk(BRANN_SAY_TROGGS); + events.ScheduleEvent(EVENT_BRANN_THINK, 15000); + return; + case 1: + Talk(BRANN_SAY_ANRAPHET_DIED); + delay = 1000; + break; + case 14: + Talk(BRANN_SAY_MOMENT); + delay = 2200; + break; + case 16: + events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_4, 6000); + return; + default: + break; + } + + events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay); + } + + protected: + EventMap events; + uint32 _currentPoint; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetHallsOfOriginationAI(creature); + } +}; + +class spell_anraphet_alpha_beams : public SpellScriptLoader +{ +public: + spell_anraphet_alpha_beams() : SpellScriptLoader("spell_anraphet_alpha_beams") { } + + class spell_anraphet_alpha_beams_SpellScript : public SpellScript + { + PrepareSpellScript(spell_anraphet_alpha_beams_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anraphet_alpha_beams_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_anraphet_alpha_beams_SpellScript(); + } +}; + +class spell_anraphet_omega_stance_summon : public SpellScriptLoader +{ +public: + spell_anraphet_omega_stance_summon() : SpellScriptLoader("spell_anraphet_omega_stance_summon") { } + + class spell_anraphet_omega_stance_summon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_anraphet_omega_stance_summon_SpellScript); + + void ModDestHeight(SpellEffIndex /*effIndex*/) + { + Position offset = {0.0f, 0.0f, 30.0f, 0.0f}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); + GetHitDest()->RelocateOffset(offset); + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_anraphet_omega_stance_summon_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_anraphet_omega_stance_summon_SpellScript(); + } +}; + +class spell_omega_stance_spider_effect : public SpellScriptLoader +{ +public: + spell_omega_stance_spider_effect() : SpellScriptLoader("spell_omega_stance_spider_effect") { } + + class spell_omega_stance_spider_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_omega_stance_spider_effect_SpellScript); + + void SetDestPosition(SpellEffIndex effIndex) + { + // Do our own calculations for the destination position. + /// TODO: Remove this once we find a general rule for WorldObject::MovePosition (this spell shouldn't take the Z change into consideration) + Unit* caster = GetCaster(); + float angle = float(rand_norm()) * static_cast(2 * M_PI); + uint32 dist = caster->GetObjectSize() + GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()) * (float)rand_norm(); + + float x = caster->GetPositionX() + dist * std::cos(angle); + float y = caster->GetPositionY() + dist * std::sin(angle); + float z = caster->GetMap()->GetHeight(x, y, caster->GetPositionZ()); + + const_cast(GetExplTargetDest())->Relocate(x, y, z); + GetHitDest()->Relocate(x, y, z); + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_omega_stance_spider_effect_SpellScript::SetDestPosition, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_omega_stance_spider_effect_SpellScript(); + } +}; + +void AddSC_boss_anraphet() +{ + new boss_anraphet(); + new spell_anraphet_alpha_beams(); + new npc_brann_bronzebeard_anraphet(); + new npc_alpha_beam(); + new spell_anraphet_omega_stance_summon(); + new spell_omega_stance_spider_effect(); + new npc_omega_stance(); +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index cba0ea0b61c..e20ad0ccf82 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -45,7 +45,6 @@ enum Spells SPELL_RAGING_SMASH = 83650, SPELL_FLAME_BOLT = 77370, SPELL_EARTH_SPIKE_WARN = 94974, - SPELL_EARTH_SPIKE_ERUPT = 75339, SPELL_PTAH_EXPLOSION = 75519, SPELL_SANDSTORM = 75491, @@ -91,22 +90,6 @@ protected: Unit* _owner; }; -class EruptEarthSpike : public BasicEvent -{ -public: - EruptEarthSpike(Unit* caster, WorldLocation const target) : _caster(caster), _target(target) { } - - bool Execute(uint64 execTime, uint32 /*diff*/) - { - _caster->CastSpell(_target.GetPositionX(), _target.GetPositionY(), _target.GetPositionZ(), SPELL_EARTH_SPIKE_ERUPT, true); - return true; - } - -protected: - Unit* _caster; - WorldLocation const _target; -}; - class boss_earthrager_ptah : public CreatureScript { public: @@ -315,34 +298,6 @@ class spell_earthrager_ptah_flame_bolt : public SpellScriptLoader } }; -class spell_earthrager_ptah_earth_spike : public SpellScriptLoader -{ -public: - spell_earthrager_ptah_earth_spike() : SpellScriptLoader("spell_earthrager_ptah_earth_spike") { } - - class spell_earthrager_ptah_earth_spike_SpellScript : public SpellScript - { - PrepareSpellScript(spell_earthrager_ptah_earth_spike_SpellScript); - - void Launch(SpellEffIndex index) - { - PreventHitDefaultEffect(index); - // Erupt the spike in 4 seconds. - GetCaster()->m_Events.AddEvent(new EruptEarthSpike(GetCaster(), *GetExplTargetDest()), GetCaster()->m_Events.CalculateTime(4000)); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_earthrager_ptah_earth_spike_SpellScript::Launch, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_earthrager_ptah_earth_spike_SpellScript(); - } -}; - class spell_earthrager_ptah_explosion : public SpellScriptLoader { public: @@ -387,6 +342,5 @@ void AddSC_boss_earthrager_ptah() { new boss_earthrager_ptah(); new spell_earthrager_ptah_flame_bolt(); - new spell_earthrager_ptah_earth_spike(); new spell_earthrager_ptah_explosion(); } diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 3258df45a0b..54ecdfb331d 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -20,13 +20,18 @@ #define HoOScriptName "instance_halls_of_origination" -uint32 const EncounterCount = 7; +uint32 const EncounterCount = 12; enum Data { // Bosses DATA_TEMPLE_GUARDIAN_ANHUUR, DATA_EARTHRAGER_PTAH, + DATA_VAULT_OF_LIGHTS, + DATA_FIRE_WARDEN, + DATA_EARTH_WARDEN, + DATA_WATER_WARDEN, + DATA_AIR_WARDEN, DATA_ANRAPHET, DATA_ISISET, DATA_AMMUNAE, @@ -39,6 +44,11 @@ enum Data DATA_ANHUUR_RIGHT_BEACON, DATA_ANHUUR_BRIDGE, DATA_ANHUUR_DOOR, + + // Anraphet + DATA_BRANN_0_GUID, + DATA_DEAD_ELEMENTALS, + DATA_ANRAPHET_GUID, }; enum Creatures @@ -52,6 +62,17 @@ enum Creatures NPC_JEWELED_SCARAB = 40458, NPC_DUSTBONE_HORROR = 40450, NPC_QUICKSAND = 40503, // Summoned by a spell not in dbc (75550) + + BOSS_ANRAPHET = 39788, + NPC_FIRE_WARDEN = 39800, + NPC_EARTH_WARDEN = 39801, + NPC_WATER_WARDEN = 39802, + NPC_AIR_WARDEN = 39803, + + WARDEN_ENTRY_DATA_DELTA = NPC_FIRE_WARDEN - DATA_FIRE_WARDEN, + + NPC_BRANN_BRONZEBEARD_0 = 39908, + NPC_OMEGA_STANCE = 41194, }; enum GameObjects @@ -61,11 +82,35 @@ enum GameObjects GO_ANHUURS_DOOR = 202307, GO_ANHUURS_RIGHT_BEACON = 203136, GO_ANHUURS_LEFT_BEACON = 203133, + + GO_VAULT_OF_LIGHTS_DOOR = 202313, + GO_SUN_MIRROR = 207726, + GO_ANRAPHET_DOOR = 202314, + + GO_DOODAD_ULDUM_LIGHTMACHINE_01 = 207375, + GO_DOODAD_ULDUM_LIGHTMACHINE_02 = 207374, + GO_DOODAD_ULDUM_LIGHTMACHINE_03 = 207377, + GO_DOODAD_ULDUM_LIGHTMACHINE_04 = 207376, + + GO_DOODAD_ULDUM_LASERBEAMS01 = 207662, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_02 + GO_DOODAD_ULDUM_LASERBEAMS_01 = 207663, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_01 + GO_DOODAD_ULDUM_LASERBEAMS_02 = 207664, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_04 + GO_DOODAD_ULDUM_LASERBEAMS_03 = 207665, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_03 }; -enum AreaIds +enum Misc { AREA_TOMB_OF_THE_EARTHRAGER = 5610, + ACHIEV_VAULT_OF_LIGHTS_EVENT = 24212, // Faster Than The Speed Of Light + SPELL_VAULT_OF_LIGHTS_CREDIT = 94067, // Not in DBC +}; + +enum GlobalActions +{ + ACTION_ANRAPHET_INTRO, + ACTION_ELEMENTAL_DIED, + ACTION_ANRAPHET_DIED, + ACTION_OMEGA_TRIGGER, }; template diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index e5ef556003f..0cb21aeeba1 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -29,10 +29,19 @@ DoorData const doorData[] = { - {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, - {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, - {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, - {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } + {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_VAULT_OF_LIGHTS_DOOR, DATA_VAULT_OF_LIGHTS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LIGHTMACHINE_02, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LASERBEAMS01, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LIGHTMACHINE_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LASERBEAMS_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LIGHTMACHINE_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LASERBEAMS_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LIGHTMACHINE_04, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {GO_DOODAD_ULDUM_LASERBEAMS_02, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } }; class instance_halls_of_origination : public InstanceMapScript @@ -51,6 +60,11 @@ class instance_halls_of_origination : public InstanceMapScript AnhuursDoorGUID = 0; AnhuurRightBeaconGUID = 0; AnhuurLeftBeaconGUID = 0; + BrannBronzebeardGUID = 0; + AnraphetGUID = 0; + AnraphetDoorGUID = 0; + SunMirrorGUID = 0; + _deadElementals = 0; } void OnGameObjectCreate(GameObject* go) @@ -60,6 +74,15 @@ class instance_halls_of_origination : public InstanceMapScript case GO_ANHUURS_BRIDGE: AnhuursBridgeGUID = go->GetGUID(); case GO_DOODAD_ULDUM_ELEVATOR_COL01: + case GO_VAULT_OF_LIGHTS_DOOR: + case GO_DOODAD_ULDUM_LIGHTMACHINE_01: + case GO_DOODAD_ULDUM_LIGHTMACHINE_02: + case GO_DOODAD_ULDUM_LIGHTMACHINE_03: + case GO_DOODAD_ULDUM_LIGHTMACHINE_04: + case GO_DOODAD_ULDUM_LASERBEAMS01: + case GO_DOODAD_ULDUM_LASERBEAMS_01: + case GO_DOODAD_ULDUM_LASERBEAMS_02: + case GO_DOODAD_ULDUM_LASERBEAMS_03: AddDoor(go, true); break; case GO_ANHUURS_DOOR: @@ -72,6 +95,12 @@ class instance_halls_of_origination : public InstanceMapScript case GO_ANHUURS_LEFT_BEACON: AnhuurLeftBeaconGUID = go->GetGUID(); break; + case GO_SUN_MIRROR: + SunMirrorGUID = go->GetGUID(); + break; + case GO_ANRAPHET_DOOR: + AnraphetDoorGUID = go->GetGUID(); + break; } } @@ -82,6 +111,15 @@ class instance_halls_of_origination : public InstanceMapScript case GO_ANHUURS_BRIDGE: case GO_DOODAD_ULDUM_ELEVATOR_COL01: case GO_ANHUURS_DOOR: + case GO_VAULT_OF_LIGHTS_DOOR: + case GO_DOODAD_ULDUM_LIGHTMACHINE_01: + case GO_DOODAD_ULDUM_LIGHTMACHINE_02: + case GO_DOODAD_ULDUM_LIGHTMACHINE_03: + case GO_DOODAD_ULDUM_LIGHTMACHINE_04: + case GO_DOODAD_ULDUM_LASERBEAMS01: + case GO_DOODAD_ULDUM_LASERBEAMS_01: + case GO_DOODAD_ULDUM_LASERBEAMS_02: + case GO_DOODAD_ULDUM_LASERBEAMS_03: AddDoor(go, false); break; } @@ -94,9 +132,28 @@ class instance_halls_of_origination : public InstanceMapScript case BOSS_TEMPLE_GUARDIAN_ANHUUR: TempleGuardianAnhuurGUID = creature->GetGUID(); break; + case NPC_BRANN_BRONZEBEARD_0: + BrannBronzebeardGUID = creature->GetGUID(); + break; + case BOSS_ANRAPHET: + AnraphetGUID = creature->GetGUID(); + break; } } + uint32 GetData(uint32 data) const + { + switch (data) + { + case DATA_DEAD_ELEMENTALS: + return _deadElementals; + default: + break; + } + + return 0; + } + uint64 GetData64(uint32 index) const { switch (index) @@ -111,17 +168,55 @@ class instance_halls_of_origination : public InstanceMapScript return AnhuurRightBeaconGUID; case DATA_ANHUUR_GUID: return TempleGuardianAnhuurGUID; + case DATA_BRANN_0_GUID: + return BrannBronzebeardGUID; + case DATA_ANRAPHET_GUID: + return AnraphetGUID; } return 0; } + void IncreaseDeadElementals(uint32 inc) + { + _deadElementals += inc; + if (_deadElementals == 4) + { + if (GameObject* mirror = instance->GetGameObject(SunMirrorGUID)) + mirror->SetGoState(GO_STATE_ACTIVE); + if (GameObject* door = instance->GetGameObject(AnraphetDoorGUID)) + door->SetGoState(GO_STATE_ACTIVE); + } + } + + void OnUnitDeath(Unit* unit) + { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + + switch (creature->GetEntry()) + { + case NPC_FIRE_WARDEN: + case NPC_EARTH_WARDEN: + case NPC_WATER_WARDEN: + case NPC_AIR_WARDEN: + uint32 data = creature->GetEntry() - WARDEN_ENTRY_DATA_DELTA; + SetBossState(data, IN_PROGRESS); // Needs to be set to IN_PROGRESS or else the gameobjects state won't be updated + SetBossState(data, DONE); + IncreaseDeadElementals(1); + if (Creature* brann = instance->GetCreature(BrannBronzebeardGUID)) + brann->AI()->DoAction(ACTION_ELEMENTAL_DIED); + break; + } + } + std::string GetSaveData() { OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "H O " << GetBossSaveData(); + saveStream << "H O " << GetBossSaveData() << _deadElementals; OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -152,6 +247,9 @@ class instance_halls_of_origination : public InstanceMapScript tmpState = NOT_STARTED; SetBossState(i, EncounterState(tmpState)); } + uint32 tmp; + loadStream >> tmp; + IncreaseDeadElementals(tmp); } else OUT_LOAD_INST_DATA_FAIL; @@ -165,6 +263,11 @@ class instance_halls_of_origination : public InstanceMapScript uint64 AnhuursDoorGUID; uint64 AnhuurRightBeaconGUID; uint64 AnhuurLeftBeaconGUID; + uint64 BrannBronzebeardGUID; + uint64 AnraphetGUID; + uint64 AnraphetDoorGUID; + uint64 SunMirrorGUID; + uint32 _deadElementals; }; InstanceScript* GetInstanceScript(InstanceMap* map) const -- cgit v1.2.3 From 7e29e0d2b268ca6722311e2bf4d2e78404e7d51e Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 5 Jan 2013 00:59:33 +0100 Subject: Scripts/Firelands: Implemented Alysrazor's trash event --- .../world/2013_01_05_00_world_firelands.sql | 113 ++++ src/server/game/Scripting/ScriptLoader.cpp | 5 + src/server/scripts/Kalimdor/CMakeLists.txt | 3 + .../scripts/Kalimdor/Firelands/boss_alysrazor.cpp | 703 +++++++++++++++++++++ src/server/scripts/Kalimdor/Firelands/firelands.h | 74 +++ .../Kalimdor/Firelands/instance_firelands.cpp | 59 ++ 6 files changed, 957 insertions(+) create mode 100644 sql/updates/world/2013_01_05_00_world_firelands.sql create mode 100644 src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp create mode 100644 src/server/scripts/Kalimdor/Firelands/firelands.h create mode 100644 src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_05_00_world_firelands.sql b/sql/updates/world/2013_01_05_00_world_firelands.sql new file mode 100644 index 00000000000..fa20d425209 --- /dev/null +++ b/sql/updates/world/2013_01_05_00_world_firelands.sql @@ -0,0 +1,113 @@ +DELETE FROM `creature` WHERE `id` IN (53520,53375,53698,53693,53487,53691,52530,53369,53680,53734,53896,53900) AND `map`=720; +DELETE FROM `gameobject` WHERE `id` IN (209036,208966,201722,209035) AND `map`=720; + +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|0x80 WHERE `entry` IN (53723,53154,53789,53792,53787,53788); + +UPDATE `creature_template` SET `minlevel`=88,`maxlevel`=88,`exp`=3,`faction_A`=16,`faction_H`=16,`speed_walk`=3.2,`speed_run`=2,`baseattacktime`=2000,`rangeattacktime`=2000,`unit_class`=2,`unit_flags`=0x2008140,`unit_flags2`=0x8000800,`VehicleId`=1673,`HoverHeight`=14,`mana_mod_extra`=1.72414 WHERE `entry` IN (52530,54044,54045,54046); +UPDATE `creature_template` SET `minlevel`=87,`maxlevel`=87,`exp`=3,`faction_A`=16,`faction_H`=16,`speed_walk`=3.2,`speed_run`=2,`baseattacktime`=2000,`rangeattacktime`=2000,`unit_flags`=0x8000,`unit_flags2`=0x800,`VehicleId`=1695 WHERE `entry` IN (54056,54057); -- Blazing Monstrosity +UPDATE `creature_template` SET `minlevel`=87,`maxlevel`=87,`exp`=3,`faction_A`=16,`faction_H`=16,`speed_walk`=1,`speed_run`=1,`baseattacktime`=2000,`rangeattacktime`=2000,`unit_flags`=0x8000,`unit_flags2`=0x8800 WHERE `entry` IN (53795,54059); -- Egg Pile +UPDATE `creature_template` SET `spell1`=100076,`spell2`=100080,`spell3`=100078,`spell4`=100082 WHERE `entry`=53789; +UPDATE `creature_template` SET `spell1`=100090,`spell2`=100089,`spell3`=100091,`spell4`=100092 WHERE `entry`=53792; +UPDATE `creature_template` SET `minlevel`=85,`maxlevel`=85,`exp`=3,`faction_A`=14,`faction_H`=14,`speed_walk`=1.2,`speed_run`=0.428571,`unit_flags`=0x2000000,`unit_flags2`=0x2000800 WHERE `entry` IN (53787,53788); -- Molten Barrage +UPDATE `creature_template` SET `minlevel`=85,`maxlevel`=85,`exp`=3,`faction_A`=16,`faction_H`=16,`speed_walk`=3.2,`speed_run`=2,`unit_flags`=0x8000,`unit_flags2`=0x800,`baseattacktime`=2000,`rangeattacktime`=2000 WHERE `entry` IN (53794,54058); -- Smouldering Hatchling +UPDATE `creature_template` SET `minlevel`=86,`maxlevel`=86,`exp`=3,`faction_A`=16,`faction_H`=16,`speed_walk`=1,`speed_run`=1.14286,`unit_flags`=0,`unit_flags2`=0x800,`baseattacktime`=2000,`rangeattacktime`=2000,`unit_class`=8,`dynamicflags`=0 WHERE `entry` IN (53793,53973); -- Harbinger of Flame + +UPDATE `creature_template` SET `difficulty_entry_1`=54044,`difficulty_entry_2`=54045,`difficulty_entry_3`=54046 WHERE `entry`=52530; -- Alysrazor +UPDATE `creature_template` SET `difficulty_entry_1`=54056 WHERE `entry`=53786; -- Blazing Monstrosity +UPDATE `creature_template` SET `difficulty_entry_1`=54057 WHERE `entry`=53791; -- Blazing Monstrosity +UPDATE `creature_template` SET `difficulty_entry_1`=54059 WHERE `entry`=53795; -- Egg Pile +UPDATE `creature_template` SET `difficulty_entry_1`=54058 WHERE `entry`=53794; -- Smouldering Hatchling +UPDATE `creature_template` SET `difficulty_entry_1`=53973 WHERE `entry`=53793; -- Harbinger of Flame + +DELETE FROM `creature_template_addon` WHERE `entry` IN (53786,53791,54056,54057,53794,54058,54276,54019,53224,53102,52530,54044,54045,54046,53900,53680,53520,53693,53698); +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(53786, 0, 0x0, 0x1, '100712 99480'), -- Blazing Monstrosity - Fire Hawk Smoke Cosmetic, Sleep (Ultra-High Priority) +(53791, 0, 0x0, 0x1, '100712 99480'), -- Blazing Monstrosity - Fire Hawk Smoke Cosmetic, Sleep (Ultra-High Priority) +(54056, 0, 0x0, 0x1, '100712 99480'), -- Blazing Monstrosity - Fire Hawk Smoke Cosmetic, Sleep (Ultra-High Priority) +(54057, 0, 0x0, 0x1, '100712 99480'), -- Blazing Monstrosity - Fire Hawk Smoke Cosmetic, Sleep (Ultra-High Priority) +(53794, 0, 0x0, 0x1, '100712'), -- Smouldering Hatchling - Fire Hawk Smoke Cosmetic +(54058, 0, 0x0, 0x1, '100712'), -- Smouldering Hatchling - Fire Hawk Smoke Cosmetic +(54276, 0, 0x0, 0x1, '101112'), -- Cinderslither Snake - Cinderslither Aura +(54019, 0, 0x0, 0x1, '100556'), -- Captive Druid of the Talon - Smouldering Roots +(53224, 0, 0x0, 0x1, '100743'), -- Flamewaker Taskmaster - Aura of Indomitability +(53102, 0, 0x3000000, 0x1, '100712'), -- Inferno Hawk - Fire Hawk Smoke Cosmetic +(52530, 0, 0x0, 0x1, '100712'), -- Alysrazor - Fire Hawk Smoke Cosmetic +(54044, 0, 0x0, 0x1, '100712'), -- Alysrazor - Fire Hawk Smoke Cosmetic +(54045, 0, 0x0, 0x1, '100712'), -- Alysrazor - Fire Hawk Smoke Cosmetic +(54046, 0, 0x0, 0x1, '100712'), -- Alysrazor - Fire Hawk Smoke Cosmetic +(53900, 0, 0x3000000, 0x1, '100712'), -- Blazing Broodmother - Fire Hawk Smoke Cosmetic +(53680, 0, 0x3000000, 0x1, '100712'), -- Blazing Broodmother - Fire Hawk Smoke Cosmetic +(53520, 0, 0x0, 0x1, '99327'), -- Plump Lava Worm - Fire Worm Cosmetic +(53693, 0, 0x0, 0x1, '99793'), -- Fiery Vortex - Fiery Vortex +(53698, 0, 0x0, 0x1, '99817'); -- Fiery Tornado - Fiery Tornado + +DELETE FROM `vehicle_template_accessory` WHERE `entry` IN (53786,53791); +INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `minion`, `description`, `summontype`, `summontimer`) VALUES +(53786,53789,1,'Blazing Monstrosity',5,0), +(53791,53792,1,'Blazing Monstrosity',5,0); + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` IN (53786,53791,53789,53792); +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`) VALUES +(53786,98509,1), +(53791,98509,1), +(53789,93970,1), +(53792,93970,1); + +DELETE FROM `creature_text` WHERE `entry`=53795; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(53795, 0, 0, 'The Molten Eggs begin to crack and splinter!', 41, 0, 100, 0, 0, 0, 'Molten Egg - EMOTE_CRACKING_EGGS'); + +-- ScriptNames and conditions +UPDATE `instance_template` SET `script`='instance_firelands' WHERE `map`=720; +UPDATE `creature_template` SET `ScriptName`='npc_harbinger_of_flame' WHERE `entry`=53793; +UPDATE `creature_template` SET `ScriptName`='npc_blazing_monstrosity' WHERE `entry` IN (53786,53791); +UPDATE `creature_template` SET `ScriptName`='npc_molten_barrage' WHERE `entry` IN (53787,53788); +UPDATE `creature_template` SET `ScriptName`='npc_egg_pile' WHERE `entry`=53795; + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_alysrazor_cosmetic_egg_xplosion'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_alysrazor_turn_monstrosity'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_alysrazor_aggro_closest'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_alysrazor_fieroblast'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(100099,'spell_alysrazor_cosmetic_egg_xplosion'), +(100076,'spell_alysrazor_turn_monstrosity'), +(100078,'spell_alysrazor_turn_monstrosity'), +(100080,'spell_alysrazor_turn_monstrosity'), +(100082,'spell_alysrazor_turn_monstrosity'), +(100089,'spell_alysrazor_turn_monstrosity'), +(100090,'spell_alysrazor_turn_monstrosity'), +(100091,'spell_alysrazor_turn_monstrosity'), +(100092,'spell_alysrazor_turn_monstrosity'), +(100462,'spell_alysrazor_aggro_closest'), +(100094,'spell_alysrazor_fieroblast'), +(101223,'spell_alysrazor_fieroblast'), +(101294,'spell_alysrazor_fieroblast'), +(101295,'spell_alysrazor_fieroblast'), +(101296,'spell_alysrazor_fieroblast'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (100558,100071,100074,100070,100076,100078,100080,100082,100089,100090,100091,100092); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,3,100558,0,0,31,0,3,54019,0,0,0,0,'','Sacrifice to the Flame - Captive Druid of the Talon'), +(13,1,100071,0,0,31,0,3,53787,0,0,0,0,'','Molten Barrage'), +(13,1,100074,0,0,31,0,3,53788,0,0,0,0,'','Molten Barrage'), +(13,2,100070,0,0,31,0,3,53786,0,0,0,0,'','Molten Barrage - Blazing Monstrosity'), +(13,2,100070,0,1,31,0,3,53791,0,0,0,0,'','Molten Barrage - Blazing Monstrosity'), +(13,2,100070,0,2,31,0,3,53793,0,0,0,0,'','Molten Barrage - Harbinger of Flame'), +(13,2,100070,0,3,31,0,3,53795,0,0,0,0,'','Molten Barrage - Egg Pile'), +(13,2,100070,0,4,31,0,3,53794,0,0,0,0,'','Molten Barrage - Smouldering Hatchling'), +(13,1,100076,0,0,31,0,3,53787,0,0,0,0,'','Left-Side Smack - Molten Barrage'), +(13,2,100076,0,1,31,0,3,53786,0,0,0,0,'','Left-Side Smack - Blazing Monstrosity'), +(13,1,100078,0,0,31,0,3,53787,0,0,0,0,'','Right-Side Smack - Molten Barrage'), +(13,2,100078,0,1,31,0,3,53786,0,0,0,0,'','Right-Side Smack - Blazing Monstrosity'), +(13,1,100080,0,0,31,0,3,53787,0,0,0,0,'','Head Bonk - Molten Barrage'), +(13,2,100080,0,1,31,0,3,53786,0,0,0,0,'','Head Bonk - Blazing Monstrosity'), +(13,1,100082,0,0,31,0,3,53787,0,0,0,0,'','Tickle - Molten Barrage'), +(13,2,100082,0,1,31,0,3,53786,0,0,0,0,'','Tickle - Blazing Monstrosity'), +(13,1,100089,0,0,31,0,3,53788,0,0,0,0,'','Head Bonk - Molten Barrage'), +(13,2,100089,0,1,31,0,3,53791,0,0,0,0,'','Head Bonk - Blazing Monstrosity'), +(13,1,100090,0,0,31,0,3,53788,0,0,0,0,'','Left-Side Smack - Molten Barrage'), +(13,2,100090,0,1,31,0,3,53791,0,0,0,0,'','Left-Side Smack - Blazing Monstrosity'), +(13,1,100091,0,0,31,0,3,53788,0,0,0,0,'','Right-Side Smack - Molten Barrage'), +(13,2,100091,0,1,31,0,3,53791,0,0,0,0,'','Right-Side Smack - Blazing Monstrosity'), +(13,1,100092,0,0,31,0,3,53788,0,0,0,0,'','Tickle - Molten Barrage'), +(13,2,100092,0,1,31,0,3,53791,0,0,0,0,'','Tickle - Blazing Monstrosity'); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 570fe23478f..f8e58220a3e 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -332,6 +332,8 @@ void AddSC_instance_halls_of_origination(); void AddSC_boss_temple_guardian_anhuur(); void AddSC_boss_earthrager_ptah(); void AddSC_boss_anraphet(); +void AddSC_instance_firelands(); +void AddSC_boss_alysrazor(); void AddSC_ashenvale(); void AddSC_azshara(); @@ -991,6 +993,9 @@ void AddKalimdorScripts() AddSC_boss_temple_guardian_anhuur(); AddSC_boss_earthrager_ptah(); AddSC_boss_anraphet(); + + AddSC_instance_firelands(); + AddSC_boss_alysrazor(); #endif } diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index fc75444bda6..44f48a1c35e 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -116,6 +116,9 @@ set(scripts_STAT_SRCS Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp Kalimdor/HallsOfOrigination/boss_anraphet.cpp + Kalimdor/Firelands/instance_firelands.cpp + Kalimdor/Firelands/firelands.h + Kalimdor/Firelands/boss_alysrazor.cpp ) message(" -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp new file mode 100644 index 00000000000..e4ab2265027 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -0,0 +1,703 @@ +/* + * Copyright (C) 2008-2013 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "MoveSplineInit.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "firelands.h" + +enum Texts +{ + // Egg Pile + EMOTE_CRACKING_EGGS = 0, // The Molten Eggs begin to crack and splinter! +}; + +enum Spells +{ + // Harbinger of Flame + SPELL_FIRE_IT_UP = 100093, + SPELL_FIEROBLAST_TRASH = 100094, + SPELL_FIEROCLAST_BARRAGE = 100095, + SPELL_FIRE_CHANNELING = 100109, + + // Blazing Monstrosity + SPELL_RIDE_MONSTROSITY = 93970, + SPELL_SHARE_HEALTH_LEFT = 101502, + SPELL_SHARE_HEALTH_RIGHT = 101503, + SPELL_SLEEP_ULTRA_HIGH_PRIORITY = 99480, + SPELL_GENERIC_DUMMY_CAST = 100088, + SPELL_LEFT_SIDE_SMACK_L = 100076, + SPELL_RIGHT_SIDE_SMACK_L = 100078, + SPELL_HEAD_BONK_L = 100080, + SPELL_TICKLE_L = 100082, + SPELL_KNOCKBACK_RIGHT = 100084, + SPELL_KNOCKBACK_LEFT = 100085, + SPELL_KNOCKBACK_FORWARD = 100086, + SPELL_KNOCKBACK_BACK = 100087, + SPELL_HEAD_BONK_R = 100089, + SPELL_LEFT_SIDE_SMACK_R = 100090, + SPELL_RIGHT_SIDE_SMACK_R = 100091, + SPELL_TICKLE_R = 100092, + SPELL_MOLTEN_BARRAGE_EFFECT_L = 100071, + SPELL_MOLTEN_BARRAGE_LEFT = 100072, + SPELL_MOLTEN_BARRAGE_RIGHT = 100073, + SPELL_MOLTEN_BARRAGE_EFFECT_R = 100074, + SPELL_MOLTEN_BARRAGE_VISUAL = 100075, + SPELL_AGGRO_CLOSEST = 100462, + SPELL_INVISIBILITY_AND_STEALTH_DETECTION = 18950, + + // Egg Pile + SPELL_SUMMON_SMOULDERING_HATCHLING = 100096, + SPELL_MOLTEN_EGG_TRASH_CALL_L = 100097, + SPELL_MOLTEN_EGG_TRASH_CALL_R = 100098, + SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION = 100099, +}; + +#define SPELL_SHARE_HEALTH (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_SHARE_HEALTH_LEFT : SPELL_SHARE_HEALTH_RIGHT) +#define SPELL_MOLTEN_BARRAGE (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_LEFT : SPELL_MOLTEN_BARRAGE_RIGHT) +#define SPELL_MOLTEN_BARRAGE_EFFECT (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_EFFECT_L : SPELL_MOLTEN_BARRAGE_EFFECT_R) + +enum Events +{ + // Blazing Monstrosity + EVENT_START_SPITTING = 1, + EVENT_CONTINUE_SPITTING = 2, + + // Harbinger of Flame + EVENT_FIEROBLAST = 1, + EVENT_FIEROCLAST_BARRAGE = 2, + + // Egg Pile + EVENT_SUMMON_SMOULDERING_HATCHLING = 1, +}; + +enum MiscData +{ + MODEL_INVISIBLE_STALKER = 11686, + ANIM_KIT_BIRD_WAKE = 1469, + ANIM_KIT_BIRD_TURN = 1473, +}; + +class RespawnEggEvent : public BasicEvent +{ + public: + explicit RespawnEggEvent(Creature* egg) : _egg(egg) { } + + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _egg->RestoreDisplayId(); + return true; + } + + private: + Creature* _egg; +}; + +class MoltenEggCheck +{ + public: + explicit MoltenEggCheck(Creature* pile) : _eggPile(pile) { } + + bool operator()(Unit* object) const + { + if (object->GetEntry() != NPC_MOLTEN_EGG_TRASH) + return false; + + if (object->GetDisplayId() != object->GetNativeDisplayId()) + return false; + + if (_eggPile->GetDistance2d(object) > 20.0f) + return false; + + return true; + } + + private: + Creature* _eggPile; +}; + +class TrashRespawnWorker +{ + public: + void operator()(Creature* creature) const + { + switch (creature->GetEntry()) + { + case NPC_BLAZING_MONSTROSITY_LEFT: + case NPC_BLAZING_MONSTROSITY_RIGHT: + case NPC_EGG_PILE: + case NPC_HARBINGER_OF_FLAME: + case NPC_MOLTEN_EGG_TRASH: + if (!creature->isAlive()) + creature->Respawn(true); + break; + case NPC_SMOULDERING_HATCHLING: + creature->DespawnOrUnsummon(); + break; + } + } +}; + +static void AlysrazorTrashEvaded(Creature* creature) +{ + TrashRespawnWorker check; + Trinity::CreatureWorker worker(creature, check); + creature->VisitNearbyGridObject(SIZE_OF_GRIDS, worker); +} + +class npc_harbinger_of_flame : public CreatureScript +{ + public: + npc_harbinger_of_flame() : CreatureScript("npc_harbinger_of_flame") { } + + struct npc_harbinger_of_flameAI : public ScriptedAI + { + npc_harbinger_of_flameAI(Creature* creature) : ScriptedAI(creature) + { + } + + void EnterCombat(Unit* /*target*/) + { + if (Creature* bird = ObjectAccessor::GetCreature(*me, me->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT))) + DoZoneInCombat(bird, 200.0f); + + me->InterruptSpell(CURRENT_CHANNELED_SPELL); + _events.Reset(); + _events.ScheduleEvent(EVENT_FIEROBLAST, 1); + _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, 6000); + } + + void JustReachedHome() + { + AlysrazorTrashEvaded(me); + } + + void MoveInLineOfSight(Unit* unit) + { + if (me->isInCombat()) + return; + + if (!unit->isCharmedOwnedByPlayerOrPlayer()) + return; + + ScriptedAI::MoveInLineOfSight(unit); + } + + void UpdateAI(uint32 const diff) + { + if (!me->isInCombat()) + if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + if (Creature* fireBird = me->FindNearestCreature((me->GetHomePosition().GetPositionY() > -275.0f ? NPC_BLAZING_MONSTROSITY_LEFT : NPC_BLAZING_MONSTROSITY_RIGHT), 100.0f)) + DoCast(fireBird, SPELL_FIRE_CHANNELING); + + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FIEROBLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, -SPELL_RIDE_MONSTROSITY)) + DoCast(target, SPELL_FIEROBLAST_TRASH); + _events.RescheduleEvent(EVENT_FIEROBLAST, 500); // cast time is longer, but thanks to UNIT_STATE_CASTING check it won't trigger more often (need this because this creature gets a stacking haste aura) + break; + case EVENT_FIEROCLAST_BARRAGE: + DoCastAOE(SPELL_FIEROCLAST_BARRAGE); + _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, urand(9000, 12000)); + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_harbinger_of_flameAI(creature); + } +}; + +class npc_blazing_monstrosity : public CreatureScript +{ + public: + npc_blazing_monstrosity() : CreatureScript("npc_blazing_monstrosity") { } + + struct npc_blazing_monstrosityAI : public PassiveAI + { + npc_blazing_monstrosityAI(Creature* creature) : PassiveAI(creature), _summons(creature) + { + } + + void EnterEvadeMode() + { + _summons.DespawnAll(); + _events.Reset(); + PassiveAI::EnterEvadeMode(); + } + + void JustDied(Unit* /*killer*/) + { + _summons.DespawnAll(); + _events.Reset(); + } + + void JustReachedHome() + { + AlysrazorTrashEvaded(me); + } + + void EnterCombat(Unit* /*target*/) + { + DoZoneInCombat(); + me->RemoveAurasDueToSpell(SPELL_SLEEP_ULTRA_HIGH_PRIORITY); + me->PlayOneShotAnimKit(ANIM_KIT_BIRD_WAKE); + _events.Reset(); + _events.ScheduleEvent(EVENT_START_SPITTING, 6000); + _events.ScheduleEvent(EVENT_CONTINUE_SPITTING, 9000); + } + + void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply) + { + if (!apply) + return; + + // Our passenger is another vehicle (boardable by players) + DoCast(passenger, SPELL_SHARE_HEALTH, true); + passenger->setFaction(35); + passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + // Hack to relocate vehicle on vehicle so exiting players are not moved under map + Movement::MoveSplineInit init(*passenger); + init.DisableTransportPathTransformations(); + init.MoveTo(0.6654003f, 0.0f, 1.9815f); + init.SetFacing(0.0f); + init.Launch(); + } + + void JustSummoned(Creature* summon) + { + _summons.Summon(summon); + } + + void SummonedCreatureDespawn(Creature* summon) + { + _summons.Despawn(summon); + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_SPITTING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, -SPELL_RIDE_MONSTROSITY)) + DoCast(target, SPELL_MOLTEN_BARRAGE); + break; + case EVENT_CONTINUE_SPITTING: + DoCastAOE(SPELL_MOLTEN_BARRAGE_EFFECT); + if (Creature* egg = me->FindNearestCreature(NPC_EGG_PILE, 100.0f)) + egg->AI()->DoAction(me->GetEntry()); + break; + } + } + } + + private: + SummonList _summons; + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_blazing_monstrosityAI(creature); + } +}; + +class npc_molten_barrage : public CreatureScript +{ + public: + npc_molten_barrage() : CreatureScript("npc_molten_barrage") { } + + struct npc_molten_barrageAI : public NullCreatureAI + { + npc_molten_barrageAI(Creature* creature) : NullCreatureAI(creature) + { + } + + void AttackStart(Unit* target) + { + if (target) + me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_IDLE); + } + + void IsSummonedBy(Unit* /*summoner*/) + { + DoCastAOE(SPELL_AGGRO_CLOSEST, true); + DoCast(me, SPELL_MOLTEN_BARRAGE_VISUAL); + DoCast(me, SPELL_INVISIBILITY_AND_STEALTH_DETECTION, true); + } + + void MovementInform(uint32 movementType, uint32 /*pointId*/) + { + if (movementType != EFFECT_MOTION_TYPE) + return; + + DoCastAOE(SPELL_AGGRO_CLOSEST); + me->ClearUnitState(UNIT_STATE_CANNOT_TURN); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_molten_barrageAI(creature); + } +}; + +class npc_egg_pile : public CreatureScript +{ + public: + npc_egg_pile() : CreatureScript("npc_egg_pile") { } + + struct npc_egg_pileAI : public CreatureAI + { + npc_egg_pileAI(Creature* creature) : CreatureAI(creature) + { + } + + void AttackStart(Unit* /*target*/) { } + + void Reset() + { + me->SetReactState(REACT_PASSIVE); + _events.Reset(); + _callHatchlingSpell = 0; + } + + void JustDied(Unit* /*killer*/) + { + _events.Reset(); + std::list eggs; + GetCreatureListWithEntryInGrid(eggs, me, NPC_MOLTEN_EGG_TRASH, 20.0f); + for (std::list::const_iterator itr = eggs.begin(); itr != eggs.end(); ++itr) + (*itr)->CastSpell(*itr, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, TRIGGERED_FULL_MASK); + + DoCast(me, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, true); + } + + void JustReachedHome() + { + AlysrazorTrashEvaded(me); + } + + void DoAction(int32 const action) + { + if (action != NPC_BLAZING_MONSTROSITY_LEFT && + action != NPC_BLAZING_MONSTROSITY_RIGHT) + return; + + if (action == NPC_BLAZING_MONSTROSITY_LEFT) + Talk(EMOTE_CRACKING_EGGS); + + _callHatchlingSpell = (action == NPC_BLAZING_MONSTROSITY_LEFT) ? SPELL_MOLTEN_EGG_TRASH_CALL_L : SPELL_MOLTEN_EGG_TRASH_CALL_R; + DoZoneInCombat(); + _events.Reset(); + _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, 1); + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUMMON_SMOULDERING_HATCHLING: + { + std::list eggs; + MoltenEggCheck check(me); + Trinity::CreatureListSearcher searcher(me, eggs, check); + me->VisitNearbyGridObject(20.0f, searcher); + if (!eggs.empty()) + { + Creature* egg = Trinity::Containers::SelectRandomContainerElement(eggs); + egg->CastSpell(egg, SPELL_SUMMON_SMOULDERING_HATCHLING, TRIGGERED_FULL_MASK); + egg->SetDisplayId(MODEL_INVISIBLE_STALKER); + egg->m_Events.AddEvent(new RespawnEggEvent(egg), egg->m_Events.CalculateTime(5000)); + } + + if (_callHatchlingSpell) + DoCastAOE(_callHatchlingSpell, true); + _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, urand(6000, 10000)); + break; + } + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + uint32 _callHatchlingSpell; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_egg_pileAI(creature); + } +}; + +class spell_alysrazor_cosmetic_egg_xplosion : public SpellScriptLoader +{ + public: + spell_alysrazor_cosmetic_egg_xplosion() : SpellScriptLoader("spell_alysrazor_cosmetic_egg_xplosion") { } + + class spell_alysrazor_cosmetic_egg_xplosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_alysrazor_cosmetic_egg_xplosion_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sCreatureDisplayInfoStore.LookupEntry(MODEL_INVISIBLE_STALKER)) + return false; + return true; + } + + void HandleExplosion(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->SetDisplayId(MODEL_INVISIBLE_STALKER); + if (Creature* creature = GetHitCreature()) + creature->DespawnOrUnsummon(4000); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_alysrazor_cosmetic_egg_xplosion_SpellScript::HandleExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_alysrazor_cosmetic_egg_xplosion_SpellScript(); + } +}; + +class spell_alysrazor_turn_monstrosity : public SpellScriptLoader +{ + public: + spell_alysrazor_turn_monstrosity() : SpellScriptLoader("spell_alysrazor_turn_monstrosity") { } + + class spell_alysrazor_turn_monstrosity_SpellScript : public SpellScript + { + PrepareSpellScript(spell_alysrazor_turn_monstrosity_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_GENERIC_DUMMY_CAST)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_RIGHT)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_LEFT)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_FORWARD)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_BACK)) + return false; + return true; + } + + void KnockBarrage(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->GetMotionMaster()->MoveIdle(); + if (TempSummon* summ = GetHitUnit()->ToTempSummon()) + if (Unit* summoner = summ->GetSummoner()) + GetHitUnit()->CastSpell(summoner, SPELL_GENERIC_DUMMY_CAST, TRIGGERED_FULL_MASK); + + float angle = 0.0f; + if (Unit* bird = GetCaster()->GetVehicleBase()) + { + bird->SetInFront(GetHitUnit()); + angle = bird->GetOrientation(); + } + + uint32 spellId = 0; + switch (GetSpellInfo()->Id) + { + case SPELL_RIGHT_SIDE_SMACK_R: + case SPELL_RIGHT_SIDE_SMACK_L: + spellId = SPELL_KNOCKBACK_RIGHT; + angle -= M_PI * 0.5f; + break; + case SPELL_LEFT_SIDE_SMACK_R: + case SPELL_LEFT_SIDE_SMACK_L: + spellId = SPELL_KNOCKBACK_LEFT; + angle += M_PI * 0.5f; + break; + case SPELL_HEAD_BONK_R: + case SPELL_HEAD_BONK_L: + spellId = SPELL_KNOCKBACK_FORWARD; + break; + case SPELL_TICKLE_R: + case SPELL_TICKLE_L: + spellId = SPELL_KNOCKBACK_BACK; + angle -= M_PI; + break; + } + + // Cannot wait for object update to process facing spline, it's needed in next spell cast + GetHitUnit()->SetOrientation(angle); + GetHitUnit()->SetFacingTo(angle); + GetHitUnit()->AddUnitState(UNIT_STATE_CANNOT_TURN); + GetHitUnit()->CastSpell(GetHitUnit(), spellId, TRIGGERED_FULL_MASK); + } + + void TurnBird(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->PlayOneShotAnimKit(ANIM_KIT_BIRD_TURN); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::KnockBarrage, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::TurnBird, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_alysrazor_turn_monstrosity_SpellScript(); + } +}; + +class spell_alysrazor_aggro_closest : public SpellScriptLoader +{ + public: + spell_alysrazor_aggro_closest() : SpellScriptLoader("spell_alysrazor_aggro_closest") { } + + class spell_alysrazor_aggro_closest_SpellScript : public SpellScript + { + PrepareSpellScript(spell_alysrazor_aggro_closest_SpellScript); + + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void HandleEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + float curThreat = GetCaster()->getThreatManager().getThreat(GetHitUnit(), true); + GetCaster()->getThreatManager().addThreat(GetHitUnit(), -curThreat + 50000.0f / std::min(1.0f, GetCaster()->GetDistance(GetHitUnit()))); + } + + void UpdateThreat() + { + GetCaster()->ClearUnitState(UNIT_STATE_CASTING); + GetCaster()->GetAI()->AttackStart(GetCaster()->ToCreature()->SelectVictim()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_alysrazor_aggro_closest_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_alysrazor_aggro_closest_SpellScript::UpdateThreat); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_alysrazor_aggro_closest_SpellScript(); + } +}; + +class spell_alysrazor_fieroblast : public SpellScriptLoader +{ + public: + spell_alysrazor_fieroblast() : SpellScriptLoader("spell_alysrazor_fieroblast") { } + + class spell_alysrazor_fieroblast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_alysrazor_fieroblast_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_FIRE_IT_UP)) + return false; + return true; + } + + void FireItUp() + { + GetCaster()->CastSpell(GetCaster(), SPELL_FIRE_IT_UP, TRIGGERED_FULL_MASK); + } + + void Register() + { + AfterCast += SpellCastFn(spell_alysrazor_fieroblast_SpellScript::FireItUp); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_alysrazor_fieroblast_SpellScript(); + } +}; + +void AddSC_boss_alysrazor() +{ + new npc_harbinger_of_flame(); + new npc_blazing_monstrosity(); + new npc_molten_barrage(); + new npc_egg_pile(); + new spell_alysrazor_cosmetic_egg_xplosion(); + new spell_alysrazor_turn_monstrosity(); + new spell_alysrazor_aggro_closest(); + new spell_alysrazor_fieroblast(); +} diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h new file mode 100644 index 00000000000..f58b6e33c7c --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/firelands.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2008-2013 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef FIRELANDS_H_ +#define FIRELANDS_H_ + +#include "Map.h" +#include "Creature.h" + +#define FirelandsScriptName "instance_firelands" + +uint32 const EncounterCount = 7; + +enum DataTypes +{ + DATA_BETH_TILAC = 0, + DATA_LORD_RHYOLITH = 1, + DATA_SHANNOX = 2, + DATA_ALYSRAZOR = 3, + DATA_BALEROC = 4, + DATA_MAJORDOMO_STAGHELM = 5, + DATA_RAGNAROS = 6, +}; + +enum CreatureIds +{ + NPC_BLAZING_MONSTROSITY_LEFT = 53786, + NPC_BLAZING_MONSTROSITY_RIGHT = 53791, + NPC_EGG_PILE = 53795, + NPC_HARBINGER_OF_FLAME = 53793, + NPC_MOLTEN_EGG_TRASH = 53914, + NPC_SMOULDERING_HATCHLING = 53794, +}; + +class DelayedAttackStartEvent : public BasicEvent +{ + public: + DelayedAttackStartEvent(Creature* owner) : _owner(owner) { } + + bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) + { + _owner->AI()->DoZoneInCombat(_owner, 200.0f); + return true; + } + + private: + Creature* _owner; +}; + +template +CreatureAI* GetFirelandsAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(FirelandsScriptName)) + return new AI(creature); + return NULL; +} + +#endif // FIRELANDS_H_ \ No newline at end of file diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp new file mode 100644 index 00000000000..dd8b2a76093 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008-2013 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ScriptMgr.h" +#include "InstanceScript.h" +#include "firelands.h" + +class instance_firelands : public InstanceMapScript +{ + public: + instance_firelands() : InstanceMapScript(FirelandsScriptName, 720) { } + + struct instance_firelands_InstanceScript : public InstanceScript + { + instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map) + { + } + + void Initialize() + { + SetBossNumber(EncounterCount); + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_SMOULDERING_HATCHLING: + // Cannot directly start attacking here as the creature is not yet on map + creature->m_Events.AddEvent(new DelayedAttackStartEvent(creature), creature->m_Events.CalculateTime(500)); + break; + } + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_firelands_InstanceScript(map); + } +}; + +void AddSC_instance_firelands() +{ + new instance_firelands(); +} -- cgit v1.2.3 From f6b6558814b4f5da7b6928e156ae84f4d6a94bb6 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 5 Jan 2013 13:14:44 +0100 Subject: Scripts/Firelands: Fixed a *major* mistake in previous commit --- src/server/scripts/Kalimdor/Firelands/firelands.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h index f58b6e33c7c..330158d6c94 100644 --- a/src/server/scripts/Kalimdor/Firelands/firelands.h +++ b/src/server/scripts/Kalimdor/Firelands/firelands.h @@ -71,4 +71,4 @@ CreatureAI* GetFirelandsAI(Creature* creature) return NULL; } -#endif // FIRELANDS_H_ \ No newline at end of file +#endif // FIRELANDS_H_ -- cgit v1.2.3 From 0d5cb6af755199f716a2de3207e6df91787f98b5 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 14 Jan 2013 11:12:58 +0100 Subject: Core/Misc: Apply codestyle to multiple files (II) --- src/server/game/Achievements/AchievementMgr.cpp | 12 +- src/server/game/Achievements/AchievementMgr.h | 4 +- src/server/game/Battlegrounds/Battleground.cpp | 2 +- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 +- src/server/game/Chat/ChatLink.cpp | 2 +- src/server/game/DataStores/DB2Stores.cpp | 6 +- src/server/game/DataStores/DBCStores.cpp | 10 +- src/server/game/Entities/Player/Player.cpp | 16 +-- src/server/game/Entities/Player/Player.h | 4 +- src/server/game/Entities/Unit/StatSystem.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 16 +-- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Globals/ObjectMgr.cpp | 6 +- src/server/game/Guilds/GuildFinderMgr.cpp | 6 +- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/GuildHandler.cpp | 2 +- src/server/game/Handlers/MailHandler.cpp | 2 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- .../MovementGenerators/RandomMovementGenerator.cpp | 2 +- .../TargetedMovementGenerator.cpp | 2 +- src/server/game/Movement/MovementStructures.h | 2 +- src/server/game/Movement/Spline/MovementUtil.cpp | 130 ++++++++++----------- src/server/game/Movement/Spline/Spline.h | 10 +- src/server/game/Server/WorldSocket.cpp | 2 +- src/server/game/Spells/Spell.cpp | 4 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- .../scripts/EasternKingdoms/ZulAman/zulaman.cpp | 2 +- .../ZulGurub/boss_jindo_the_godbreaker.cpp | 2 +- .../Kalimdor/HallsOfOrigination/boss_anraphet.cpp | 14 +-- .../HallsOfOrigination/boss_earthrager_ptah.cpp | 28 ++--- .../boss_temple_guardian_anhuur.cpp | 30 ++--- .../HallsOfOrigination/halls_of_origination.h | 4 +- .../instance_halls_of_origination.cpp | 12 +- .../AzjolNerub/Ahnkahet/boss_elder_nadox.cpp | 4 +- .../ChamberOfAspects/RubySanctum/boss_halion.cpp | 2 +- .../UtgardeKeep/UtgardePinnacle/boss_svala.cpp | 2 +- src/server/scripts/Spells/spell_druid.cpp | 16 +-- src/server/scripts/Spells/spell_mage.cpp | 8 +- src/server/shared/DataStores/DB2FileLoader.cpp | 12 +- src/server/shared/Packets/ByteBuffer.h | 2 +- 40 files changed, 195 insertions(+), 195 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 48eb6114cb4..b82aa86f3be 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2302,7 +2302,7 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criter } template -bool AchievementMgr::ConditionsSatisfied(AchievementCriteriaEntry const *criteria, Player* referencePlayer) const +bool AchievementMgr::ConditionsSatisfied(AchievementCriteriaEntry const* criteria, Player* referencePlayer) const { for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i) { @@ -2328,7 +2328,7 @@ bool AchievementMgr::ConditionsSatisfied(AchievementCriteriaEntry const *crit } template -bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const *achievementCriteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const *unit, Player* referencePlayer) const +bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achievementCriteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const { switch (AchievementCriteriaTypes(achievementCriteria->type)) { @@ -2685,7 +2685,7 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const *ac } template -bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry const *criteria, uint64 miscValue1, uint64 /*miscValue2*/, Unit const* unit, Player* referencePlayer) const +bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry const* criteria, uint64 miscValue1, uint64 /*miscValue2*/, Unit const* unit, Player* referencePlayer) const { for (uint8 i = 0; i < MAX_ADDITIONAL_CRITERIA_CONDITIONS; ++i) { @@ -2724,7 +2724,7 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN: // 14 { // miscValue1 is itemid - ItemTemplate const * const item = sObjectMgr->GetItemTemplate(uint32(miscValue1)); + ItemTemplate const* const item = sObjectMgr->GetItemTemplate(uint32(miscValue1)); if (!item || item->Quality < reqValue) return false; break; @@ -2732,7 +2732,7 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_EQUALS: // 15 { // miscValue1 is itemid - ItemTemplate const * const item = sObjectMgr->GetItemTemplate(uint32(miscValue1)); + ItemTemplate const* const item = sObjectMgr->GetItemTemplate(uint32(miscValue1)); if (!item || item->Quality != reqValue) return false; break; @@ -2783,7 +2783,7 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry { if (!unit) return false; - Creature const * const creature = unit->ToCreature(); + Creature const* const creature = unit->ToCreature(); if (!creature || creature->GetCreatureType() != reqValue) return false; break; diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 42a1d2427d9..ad97af3ec6e 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -264,8 +264,8 @@ class AchievementMgr bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer); void SendPacket(WorldPacket* data) const; - bool ConditionsSatisfied(AchievementCriteriaEntry const *criteria, Player* referencePlayer) const; - bool RequirementsSatisfied(AchievementCriteriaEntry const *criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const; + bool ConditionsSatisfied(AchievementCriteriaEntry const* criteria, Player* referencePlayer) const; + bool RequirementsSatisfied(AchievementCriteriaEntry const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const; bool AdditionalRequirementsSatisfied(AchievementCriteriaEntry const* criteria, uint64 miscValue1, uint64 miscValue2, Unit const* unit, Player* referencePlayer) const; T* _owner; diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 07112c957af..3dd8e01ad72 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1246,7 +1246,7 @@ void Battleground::AddPlayer(Player* player) if (GetStatus() == STATUS_WAIT_JOIN) // not started yet { player->CastSpell(player, SPELL_PREPARATION, true); // reduces all mana cost of spells. - + int32 countdownMaxForBGType = isArena() ? ARENA_COUNTDOWN_MAX : BATTLEGROUND_COUNTDOWN_MAX; WorldPacket data(SMSG_START_TIMER, 4+4+4); data << uint32(0); // unk diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 7fc344c759a..c370b3a26ce 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -148,7 +148,7 @@ void BattlegroundMgr::Update(uint32 diff) } } -void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battleground *bg, Player * player, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype) +void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype) { ObjectGuid playerGuid = player->GetGUID(); ObjectGuid bgGuid; diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 63e3f3161e1..7f517d99b2c 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -167,7 +167,7 @@ bool ItemChatLink::Initialize(std::istringstream& iss) return true; } -inline std::string ItemChatLink::FormatName(uint8 index, ItemLocale const *locale, char* suffixStrings) const +inline std::string ItemChatLink::FormatName(uint8 index, ItemLocale const* locale, char* suffixStrings) const { std::stringstream ss; if (locale == NULL || index >= locale->Name.size()) diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 2e1c25ced39..dadcce42950 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -32,7 +32,7 @@ typedef std::list StoreProblemList1; uint32 DB2FilesCount = 0; -static bool LoadDB2_assert_print(uint32 fsize,uint32 rsize, const std::string& filename) +static bool LoadDB2_assert_print(uint32 fsize, uint32 rsize, const std::string& filename) { sLog->outError(LOG_FILTER_GENERAL, "Size of '%s' setted by format string (%u) not equal size of C++ structure (%u).", filename.c_str(), fsize, rsize); @@ -62,7 +62,7 @@ inline void LoadDB2(StoreProblemList1& errlist, DB2Storage& storage, const st if (!storage.Load(db2_filename.c_str())) { // sort problematic db2 to (1) non compatible and (2) nonexistent - if (FILE * f = fopen(db2_filename.c_str(), "rb")) + if (FILE* f = fopen(db2_filename.c_str(), "rb")) { char buf[100]; snprintf(buf, 100,"(exist, but have %d fields instead " SIZEFMTD ") Wrong client version DBC file?", storage.GetFieldCount(), strlen(storage.GetFormat())); @@ -96,7 +96,7 @@ void LoadDB2Stores(const std::string& dataPath) for (std::list::iterator i = bad_db2_files.begin(); i != bad_db2_files.end(); ++i) str += *i + "\n"; - sLog->outError(LOG_FILTER_GENERAL, "\nSome required *.db2 files (%u from %d) not found or not compatible:\n%s", (uint32)bad_db2_files.size(), DB2FilesCount,str.c_str()); + sLog->outError(LOG_FILTER_GENERAL, "\nSome required *.db2 files (%u from %d) not found or not compatible:\n%s", (uint32)bad_db2_files.size(), DB2FilesCount, str.c_str()); exit(1); } diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 9ee43f8f206..17135291664 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -435,11 +435,11 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sItemArmorTotalStore, dbcPath, "ItemArmorTotal.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageAmmoStore, dbcPath, "ItemDamageAmmo.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageOneHandStore, dbcPath, "ItemDamageOneHand.dbc");//14545 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageOneHandCasterStore,dbcPath, "ItemDamageOneHandCaster.dbc");//14545 + LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageOneHandCasterStore, dbcPath, "ItemDamageOneHandCaster.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageRangedStore, dbcPath, "ItemDamageRanged.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageThrownStore, dbcPath, "ItemDamageThrown.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageTwoHandStore, dbcPath, "ItemDamageTwoHand.dbc");//14545 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageTwoHandCasterStore,dbcPath, "ItemDamageTwoHandCaster.dbc");//14545 + LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageTwoHandCasterStore, dbcPath, "ItemDamageTwoHandCaster.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageWandStore, dbcPath, "ItemDamageWand.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sItemDisenchantLootStore, dbcPath, "ItemDisenchantLoot.dbc"); @@ -500,7 +500,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sSpellReagentsStore, dbcPath,"SpellReagents.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellScalingStore, dbcPath,"SpellScaling.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellTotemsStore, dbcPath,"SpellTotems.dbc");//14545 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellTargetRestrictionsStore,dbcPath,"SpellTargetRestrictions.dbc");//14545 + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellTargetRestrictionsStore, dbcPath,"SpellTargetRestrictions.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellPowerStore, dbcPath,"SpellPower.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellLevelsStore, dbcPath,"SpellLevels.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellInterruptsStore, dbcPath,"SpellInterrupts.dbc");//14545 @@ -529,7 +529,7 @@ void LoadDBCStores(const std::string& dataPath) // Must be done when sSkillLineAbilityStore, sSpellStore, sSpellLevelsStore and sCreatureFamilyStore are all loaded for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) { - SkillLineAbilityEntry const *skillLine = sSkillLineAbilityStore.LookupEntry(j); + SkillLineAbilityEntry const* skillLine = sSkillLineAbilityStore.LookupEntry(j); if (!skillLine) continue; @@ -763,7 +763,7 @@ void LoadDBCStores(const std::string& dataPath) const std::string* GetRandomCharacterName(uint8 race, uint8 gender) { uint32 size = sGenNameVectoArraysMap[race].stringVectorArray[gender].size(); - uint32 randPos = urand(0,size-1); + uint32 randPos = urand(0, size-1); return &sGenNameVectoArraysMap[race].stringVectorArray[gender][randPos]; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 18c33457c23..c7567aaa13f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1974,7 +1974,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* dataBuffer, B continue; } - SpellItemEnchantmentEntry const *enchant = NULL; + SpellItemEnchantmentEntry const* enchant = NULL; uint32 enchants = GetUInt32ValueFromArray(equipment, visualbase + 1); for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot) { @@ -7228,7 +7228,7 @@ void Player::_SaveCurrency(SQLTransaction& trans) if (!entry) // should never happen continue; - switch(itr->second.state) + switch (itr->second.state) { case PLAYERCURRENCY_NEW: stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_PLAYER_CURRENCY); @@ -7469,7 +7469,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo if (currency->Category == CURRENCY_CATEGORY_META_CONQUEST) { //original conquest cap is highest of bg/arena conquest cap. - if(weekCap > _ConquestCurrencyTotalWeekCap) + if (weekCap > _ConquestCurrencyTotalWeekCap) _ConquestCurrencyTotalWeekCap = weekCap; // count was changed to week limit, now we can modify original points. ModifyCurrency(CURRENCY_TYPE_CONQUEST_POINTS, count, printLog ); @@ -7477,7 +7477,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo } // on new case just set init. - if(itr->second.state == PLAYERCURRENCY_NEW) + if (itr->second.state == PLAYERCURRENCY_NEW) { SendNewCurrency(id); return; @@ -7521,7 +7521,7 @@ uint32 Player::GetCurrencyWeekCap(uint32 id, bool usePrecision) const return 0; uint32 cap = _GetCurrencyWeekCap(entry); - if(usePrecision && entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) + if (usePrecision && entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) cap /= 100; return cap; @@ -11497,7 +11497,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest return EQUIP_ERR_NOT_OWNER; // Currency Tokenizer are not supposed to be swapped out of their hidden bag - if(pItem->IsCurrencyToken()) + if (pItem->IsCurrencyToken()) { sLog->outError(LOG_FILTER_PLAYER, "Possible hacking attempt: Player %s [guid: %u] tried to move token [guid: %u, entry: %u] out of the currency bag!", GetName().c_str(), GetGUIDLow(), pItem->GetGUIDLow(), pProto->ItemId); @@ -21326,7 +21326,7 @@ void Player::InitDisplayIds() } } -inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const* crItem, bool bStore) +inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore) { ItemPosCountVec vDest; uint16 uiDest = 0; @@ -23450,7 +23450,7 @@ uint32 Player::GetResurrectionSpellId() } // Used in triggers for check "Only to targets that grant experience or honor" req -bool Player::isHonorOrXPTarget(Unit const *victim) +bool Player::isHonorOrXPTarget(Unit const* victim) { uint8 v_level = victim->getLevel(); uint8 k_grey = Trinity::XP::GetGrayLevel(getLevel()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 497aa98e043..b27d66a7654 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2267,7 +2267,7 @@ class Player : public Unit, public GridObject bool IsAtRecruitAFriendDistance(WorldObject const* pOther) const; void RewardPlayerAndGroupAtKill(Unit* victim, bool isBattleGround); void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource); - bool isHonorOrXPTarget(Unit const *victim); + bool isHonorOrXPTarget(Unit const* victim); bool GetsRecruitAFriendBonus(bool forXP); uint8 GetGrantableLevels() { return m_grantableLevels; } @@ -2938,7 +2938,7 @@ class Player : public Unit, public GridObject /* * @name _GetCurrencyTotalCap * @brief return total cap for selected currency - + * @param currency CurrencyTypesEntry witch should get week cap */ uint32 _GetCurrencyTotalCap(const CurrencyTypesEntry* currency) const; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 292b888e552..542fde39a3a 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -668,7 +668,7 @@ void Player::UpdateManaRegen() // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen spirit_regen *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA); - // SpiritRegen(SPI,INT,LEVEL) = (0.001 + (SPI x sqrt(INT) x BASE_REGEN[LEVEL])) x 5 + // SpiritRegen(SPI, INT, LEVEL) = (0.001 + (SPI x sqrt(INT) x BASE_REGEN[LEVEL])) x 5 if (GetStat(STAT_INTELLECT) > 0.0f) spirit_regen *= sqrt(GetStat(STAT_INTELLECT)); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6d79c401b6a..c1bd43fe853 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4876,7 +4876,7 @@ bool Unit::HandleSpellCritChanceAuraProc(Unit* victim, uint32 /*damage*/, AuraEf return true; } -bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 /*procEx*/, uint32 cooldown) +bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 /*procEx*/, uint32 cooldown) { // Get triggered aura spell info SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo(); @@ -4944,7 +4944,7 @@ bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffe uint32 solarEclipseMarker = 67483; uint32 lunarEclipseMarker = 67484; - switch(effIndex) + switch (effIndex) { case 0: { @@ -4955,7 +4955,7 @@ bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffe if (HasAura(solarEclipseMarker)) { RemoveAurasDueToSpell(solarEclipseMarker); - CastSpell(this,lunarEclipseMarker,true); + CastSpell(this, lunarEclipseMarker, true); } break; } @@ -4968,7 +4968,7 @@ bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffe if (HasAura(lunarEclipseMarker)) { RemoveAurasDueToSpell(lunarEclipseMarker); - CastSpell(this,solarEclipseMarker,true); + CastSpell(this, solarEclipseMarker, true); } break; @@ -16977,7 +16977,7 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) if (GetTransport()) GetTransport()->UpdatePosition(mi); - //! Anti-cheat checks. Please keep them in seperate if() blocks to maintain a clear overview. + //! Anti-cheat checks. Please keep them in seperate if () blocks to maintain a clear overview. //! Might be subject to latency, so just remove improper flags. #ifdef TRINITY_DEBUG #define REMOVE_VIOLATING_FLAGS(check, maskToRemove) \ @@ -17077,7 +17077,7 @@ void Unit::WriteMovementInfo(WorldPacket& data) ObjectGuid guid = mover->GetGUID(); ObjectGuid tguid = hasTransportData ? GetTransport()->GetGUID() : 0; - for(uint32 i = 0; i < MSE_COUNT; ++i) + for (uint32 i = 0; i < MSE_COUNT; ++i) { MovementStatusElements element = sequence[i]; if (element == MSEEnd) @@ -17323,10 +17323,10 @@ void Unit::SendTeleportPacket(Position& pos) // Relocate the player/creature to its old position, so we can broadcast to nearby players correctly if (GetTypeId() == TYPEID_PLAYER) - Relocate(&pos); + Relocate(&pos); else Relocate(&oldPos); - + // Broadcast the packet to everyone except self. SendMessageToSet(&data, false); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2a82b520d32..40918dbb611 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2296,7 +2296,7 @@ class Unit : public WorldObject void DisableSpline(); private: bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent); - bool HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); + bool HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleHasteAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleSpellCritChanceAuraProc(Unit* victim, uint32 damage, AuraEffect* triggredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 394d85a919f..1916dd17c89 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2088,7 +2088,7 @@ void FillItemDamageFields(float* minDamage, float* maxDamage, float* dps, uint32 *dps = damageInfo->DPS[quality]; float avgDamage = *dps * delay * 0.001f; *minDamage = (statScalingFactor * -0.5f + 1.0f) * avgDamage; - *maxDamage = floor(float(avgDamage * (statScalingFactor * 0.5f + 1.0f) + 0.5f)); + *maxDamage = floor(float(avgDamage* (statScalingFactor * 0.5f + 1.0f) + 0.5f)); } uint32 FillItemArmor(uint32 itemlevel, uint32 itemClass, uint32 itemSubclass, uint32 quality, uint32 inventoryType) @@ -8697,7 +8697,7 @@ void ObjectMgr::LoadPhaseDefinitions() do { - Field *fields = result->Fetch(); + Field* fields = result->Fetch(); PhaseDefinition PhaseDefinition; @@ -8742,7 +8742,7 @@ void ObjectMgr::LoadSpellPhaseInfo() uint32 count = 0; do { - Field *fields = result->Fetch(); + Field* fields = result->Fetch(); SpellPhaseInfo spellPhaseInfo; spellPhaseInfo.spellId = fields[0].GetUInt32(); diff --git a/src/server/game/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp index 0e041af402a..f0b6e0a4495 100644 --- a/src/server/game/Guilds/GuildFinderMgr.cpp +++ b/src/server/game/Guilds/GuildFinderMgr.cpp @@ -142,7 +142,7 @@ void GuildFinderMgr::RemoveAllMembershipRequestsFromPlayer(uint32 playerId) for (MembershipRequestStore::iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) { std::vector::iterator itr2 = itr->second.begin(); - for(; itr2 != itr->second.end(); ++itr2) + for (; itr2 != itr->second.end(); ++itr2) if (itr2->GetPlayerGUID() == playerId) break; @@ -167,7 +167,7 @@ void GuildFinderMgr::RemoveAllMembershipRequestsFromPlayer(uint32 playerId) void GuildFinderMgr::RemoveMembershipRequest(uint32 playerId, uint32 guildId) { std::vector::iterator itr = _membershipRequests[guildId].begin(); - for(; itr != _membershipRequests[guildId].end(); ++itr) + for (; itr != _membershipRequests[guildId].end(); ++itr) if (itr->GetPlayerGUID() == playerId) break; @@ -306,7 +306,7 @@ void GuildFinderMgr::DeleteGuild(uint32 guildId) // Notify the applicant his submition has been removed if (Player* player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(applicant, 0, HIGHGUID_PLAYER))) SendMembershipRequestListUpdate(*player); - + ++itr; } diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 780f70e8be2..89dbe03703a 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -45,7 +45,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) uint32 type = 0; uint32 lang; - switch(recvData.GetOpcode()) + switch (recvData.GetOpcode()) { case CMSG_MESSAGECHAT_SAY: type = CHAT_MSG_SAY; diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 8c570bc1937..4c3360122f2 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -400,7 +400,7 @@ void WorldSession::HandleGuildBankerActivate(WorldPacket& recvPacket) sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANKER_ACTIVATE [%s]: Go: [" UI64FMTD "] AllSlots: %u" , GetPlayerInfo().c_str(), guid, sendAllSlots); - GameObject const * const go = GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK); + GameObject const* const go = GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK); if (!go) return; diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 4d09a9b4468..c21d16d3600 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -436,7 +436,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket& recvData) { for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2) { - if (Item * const item = player->GetMItem(itr2->item_guid)) + if (Item* const item = player->GetMItem(itr2->item_guid)) draft.AddItem(item); player->RemoveMItem(itr2->item_guid); } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 6cd6112efbc..78800f77098 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -330,7 +330,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) case TYPEID_PLAYER: { //For AutoSubmition was added plr case there as it almost same exclute AI script cases. - Creature *creatureQGiver = object->ToCreature(); + Creature* creatureQGiver = object->ToCreature(); if (!creatureQGiver || !(sScriptMgr->OnQuestReward(_player, creatureQGiver, quest, reward))) { // Send next quest diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 06521fadb3a..94819e87213 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -165,7 +165,7 @@ bool RandomMovementGenerator::GetResetPosition(Creature &creature, flo creature.GetRespawnPosition(x, y, z, NULL, &radius); // use current if in range - if (creature.IsWithinDist2d(x, y,radius)) + if (creature.IsWithinDist2d(x, y, radius)) creature.GetPosition(x, y, z); return true; diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index a1ac4ccb679..d111725a760 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -99,7 +99,7 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T &owner) //We don't update Mob Movement, if the difference between New destination and last destination is < BothObjectSize float bothObjectSize = i_target->GetObjectBoundingRadius() + owner.GetObjectBoundingRadius() + CONTACT_DISTANCE; - if ( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x, y,z) < bothObjectSize ) + if ( i_destinationHolder.HasDestination() && i_destinationHolder.GetDestinationDiff(x, y, z) < bothObjectSize ) return; */ diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 9a92e9747f1..774a25d0e5b 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -2173,7 +2173,7 @@ MovementStatusElements MoveUpdateTeleport[] = MSEGuidByte4, MSETimestamp, MSEGuidByte0, - + MSEEnd, }; diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp index 88b838ef5d9..7a380478ee2 100644 --- a/src/server/game/Movement/Spline/MovementUtil.cpp +++ b/src/server/game/Movement/Spline/MovementUtil.cpp @@ -104,39 +104,39 @@ namespace Movement char const* g_MovementFlag_names[] = { - STR(Forward ),// 0x00000001, - STR(Backward ),// 0x00000002, - STR(Strafe_Left ),// 0x00000004, - STR(Strafe_Right ),// 0x00000008, - STR(Turn_Left ),// 0x00000010, - STR(Turn_Right ),// 0x00000020, - STR(Pitch_Up ),// 0x00000040, - STR(Pitch_Down ),// 0x00000080, - - STR(Walk ),// 0x00000100, // Walking - STR(Levitation ),// 0x00000200, - STR(Root ),// 0x00000400, - STR(Falling ),// 0x00000800, - STR(Fallingfar ),// 0x00001000, - STR(Pendingstop ),// 0x00002000, - STR(PendingSTRafestop ),// 0x00004000, - STR(Pendingforward ),// 0x00008000, - STR(Pendingbackward ),// 0x00010000, - STR(PendingSTRafeleft ),// 0x00020000, - STR(PendingSTRaferight ),// 0x00040000, - STR(Pendingroot ),// 0x00080000, - STR(Swimming ),// 0x00100000, // Appears With Fly Flag Also - STR(Ascending ),// 0x00200000, // Swim Up Also - STR(Descending ),// 0x00400000, // Swim Down Also - STR(Can_Fly ),// 0x00800000, // Can Fly In 3.3? - STR(Flying ),// 0x01000000, // Actual Flying Mode - STR(Spline_Elevation ),// 0x02000000, // Used For Flight Paths - STR(Waterwalking ),// 0x04000000, // Prevent Unit From Falling Through Water - STR(Safe_Fall ),// 0x08000000, // Active Rogue Safe Fall Spell (Passive) - STR(Hover ),// 0x10000000 - STR(Local_Dirty ),// 0x20000000 - STR(None31 ),// 0x40000000 - STR(None32 ),// 0x80000000 + STR(Forward ), // 0x00000001, + STR(Backward ), // 0x00000002, + STR(Strafe_Left ), // 0x00000004, + STR(Strafe_Right ), // 0x00000008, + STR(Turn_Left ), // 0x00000010, + STR(Turn_Right ), // 0x00000020, + STR(Pitch_Up ), // 0x00000040, + STR(Pitch_Down ), // 0x00000080, + + STR(Walk ), // 0x00000100, // Walking + STR(Levitation ), // 0x00000200, + STR(Root ), // 0x00000400, + STR(Falling ), // 0x00000800, + STR(Fallingfar ), // 0x00001000, + STR(Pendingstop ), // 0x00002000, + STR(PendingSTRafestop ), // 0x00004000, + STR(Pendingforward ), // 0x00008000, + STR(Pendingbackward ), // 0x00010000, + STR(PendingSTRafeleft ), // 0x00020000, + STR(PendingSTRaferight ), // 0x00040000, + STR(Pendingroot ), // 0x00080000, + STR(Swimming ), // 0x00100000, // Appears With Fly Flag Also + STR(Ascending ), // 0x00200000, // Swim Up Also + STR(Descending ), // 0x00400000, // Swim Down Also + STR(Can_Fly ), // 0x00800000, // Can Fly In 3.3? + STR(Flying ), // 0x01000000, // Actual Flying Mode + STR(Spline_Elevation ), // 0x02000000, // Used For Flight Paths + STR(Waterwalking ), // 0x04000000, // Prevent Unit From Falling Through Water + STR(Safe_Fall ), // 0x08000000, // Active Rogue Safe Fall Spell (Passive) + STR(Hover ), // 0x10000000 + STR(Local_Dirty ), // 0x20000000 + STR(None31 ), // 0x40000000 + STR(None32 ), // 0x80000000 STR(Unk1 ), STR(Unk2 ), STR(Unk3 ), @@ -157,38 +157,38 @@ namespace Movement char const* g_SplineFlag_names[32] = { - STR(AnimBit1 ),// 0x00000001, - STR(AnimBit2 ),// 0x00000002, - STR(AnimBit3 ),// 0x00000004, - STR(Unknown0 ),// 0x00000008, - STR(FallingSlow ),// 0x00000010, - STR(Done ),// 0x00000020, - STR(Falling ),// 0x00000040, // Not Compartible With Trajectory Movement - STR(No_Spline ),// 0x00000080, - STR(Unknown2 ),// 0x00000100, - STR(Flying ),// 0x00000200, // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation - STR(OrientationFixed ),// 0x00000400, // Model Orientation Fixed - STR(Catmullrom ),// 0x00000800, // Used Catmullrom Interpolation Mode - STR(Cyclic ),// 0x00001000, // Movement By Cycled Spline - STR(Enter_Cycle ),// 0x00002000, // Everytime Appears With Cyclic Flag In Monster Move Packet - STR(Frozen ),// 0x00004000, - STR(TransportEnter ),// 0x00008000 - STR(TransportExit ),// 0x00010000 - STR(Unknown3 ),// 0x00020000, - STR(Unknown4 ),// 0x00040000, - STR(OrientationInversed),// 0x00080000, // Appears With Runmode Flag, Nodes ),// 1, Handles Orientation - STR(SmoothGroundPath ),// 0x00100000, - STR(Walkmode ),// 0x00200000, - STR(UncompressedPath ),// 0x00400000, - STR(Unknown6 ),// 0x00800000, - STR(Animation ),// 0x01000000, // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement - STR(Parabolic ),// 0x02000000, // Not Compartible With Fall Movement - STR(Final_Point ),// 0x04000000, - STR(Final_Target ),// 0x08000000, - STR(Final_Angle ),// 0x10000000, - STR(Unknown7 ),// 0x20000000, - STR(Unknown8 ),// 0x40000000, - STR(Unknown9 ),// 0x80000000, + STR(AnimBit1 ), // 0x00000001, + STR(AnimBit2 ), // 0x00000002, + STR(AnimBit3 ), // 0x00000004, + STR(Unknown0 ), // 0x00000008, + STR(FallingSlow ), // 0x00000010, + STR(Done ), // 0x00000020, + STR(Falling ), // 0x00000040, // Not Compartible With Trajectory Movement + STR(No_Spline ), // 0x00000080, + STR(Unknown2 ), // 0x00000100, + STR(Flying ), // 0x00000200, // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation + STR(OrientationFixed ), // 0x00000400, // Model Orientation Fixed + STR(Catmullrom ), // 0x00000800, // Used Catmullrom Interpolation Mode + STR(Cyclic ), // 0x00001000, // Movement By Cycled Spline + STR(Enter_Cycle ), // 0x00002000, // Everytime Appears With Cyclic Flag In Monster Move Packet + STR(Frozen ), // 0x00004000, + STR(TransportEnter ), // 0x00008000 + STR(TransportExit ), // 0x00010000 + STR(Unknown3 ), // 0x00020000, + STR(Unknown4 ), // 0x00040000, + STR(OrientationInversed), // 0x00080000, // Appears With Runmode Flag, Nodes ), // 1, Handles Orientation + STR(SmoothGroundPath ), // 0x00100000, + STR(Walkmode ), // 0x00200000, + STR(UncompressedPath ), // 0x00400000, + STR(Unknown6 ), // 0x00800000, + STR(Animation ), // 0x01000000, // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement + STR(Parabolic ), // 0x02000000, // Not Compartible With Fall Movement + STR(Final_Point ), // 0x04000000, + STR(Final_Target ), // 0x08000000, + STR(Final_Angle ), // 0x10000000, + STR(Unknown7 ), // 0x20000000, + STR(Unknown8 ), // 0x40000000, + STR(Unknown9 ), // 0x80000000, }; template diff --git a/src/server/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h index 2a2f3fa8f43..42090cae71b 100644 --- a/src/server/game/Movement/Spline/Spline.h +++ b/src/server/game/Movement/Spline/Spline.h @@ -91,13 +91,13 @@ public: @param t - percent of segment length, assumes that t in range [0, 1] @param Idx - spline segment index, should be in range [first, last) */ - void evaluate_percent(index_type Idx, float u, Vector3& c) const {(this->*evaluators[m_mode])(Idx, u,c);} + void evaluate_percent(index_type Idx, float u, Vector3& c) const {(this->*evaluators[m_mode])(Idx, u, c);} /** Caclulates derivation in index Idx, and percent of segment length t @param Idx - spline segment index, should be in range [first, last) @param t - percent of spline segment length, assumes that t in range [0, 1] */ - void evaluate_derivative(index_type Idx, float u, Vector3& hermite) const {(this->*derivative_evaluators[m_mode])(Idx, u,hermite);} + void evaluate_derivative(index_type Idx, float u, Vector3& hermite) const {(this->*derivative_evaluators[m_mode])(Idx, u, hermite);} /** Bounds for spline indexes. All indexes should be in range [first, last). */ index_type first() const { return index_lo;} @@ -156,12 +156,12 @@ public: /** Calculates the position for given segment Idx, and percent of segment length t @param t = partial_segment_length / whole_segment_length @param Idx - spline segment index, should be in range [first, last). */ - void evaluate_percent(index_type Idx, float u, Vector3& c) const { SplineBase::evaluate_percent(Idx, u,c);} + void evaluate_percent(index_type Idx, float u, Vector3& c) const { SplineBase::evaluate_percent(Idx, u, c);} /** Caclulates derivation for index Idx, and percent of segment length t @param Idx - spline segment index, should be in range [first, last) @param t - percent of spline segment length, assumes that t in range [0, 1]. */ - void evaluate_derivative(index_type Idx, float u, Vector3& c) const { SplineBase::evaluate_derivative(Idx, u,c);} + void evaluate_derivative(index_type Idx, float u, Vector3& c) const { SplineBase::evaluate_derivative(Idx, u, c);} // Assumes that t in range [0, 1] index_type computeIndexInBounds(float t) const; @@ -169,7 +169,7 @@ public: /** Initializes spline. Don't call other methods while spline not initialized. */ void init_spline(const Vector3 * controls, index_type count, EvaluationMode m) { SplineBase::init_spline(controls, count, m);} - void init_cyclic_spline(const Vector3 * controls, index_type count, EvaluationMode m, index_type cyclic_point) { SplineBase::init_cyclic_spline(controls, count, m,cyclic_point);} + void init_cyclic_spline(const Vector3 * controls, index_type count, EvaluationMode m, index_type cyclic_point) { SplineBase::init_cyclic_spline(controls, count, m, cyclic_point);} /** Initializes lengths with SplineBase::SegLength method. */ void initLengths(); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 6fc2452a83c..3299c104697 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -871,7 +871,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) if (expansion > world_expansion) expansion = world_expansion; - sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: (s,v) check s: %s v: %s", + sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: (s, v) check s: %s v: %s", fields[5].GetCString(), fields[4].GetCString()); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 14d8b7e9ce6..c0ab92d36c5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1734,7 +1734,7 @@ void Spell::SelectImplicitTrajTargets() m_targets.ModDst(trajDst); } - if (Vehicle * veh = m_caster->GetVehicleKit()) + if (Vehicle* veh = m_caster->GetVehicleKit()) veh->SetLastShootPos(*m_targets.GetDstPos()); } @@ -4981,7 +4981,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_ONLY_BATTLEGROUNDS; // do not allow spells to be cast in arenas or rated battlegrounds - if (Player * player = m_caster->ToPlayer()) + if (Player* player = m_caster->ToPlayer()) if (player->InArena()/* || player->InRatedBattleGround() NYI*/) { SpellCastResult castResult = CheckArenaAndRatedBattlegroundCastRules(); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index d3a86180f50..56b8d251de6 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1352,7 +1352,7 @@ public: { Unit* unit = handler->getSelectedUnit(); Player* player = handler->GetSession()->GetPlayer(); - if(unit && unit->GetTypeId() == TYPEID_PLAYER) + if (unit && unit->GetTypeId() == TYPEID_PLAYER) player = unit->ToPlayer(); player->GetPhaseMgr().SendDebugReportToPlayer(handler->GetSession()->GetPlayer()); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 44fa0f87177..d0eefd67392 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -314,7 +314,7 @@ class npc_harrison_jones : public CreatureScript me->SetEntry(NPC_HARRISON_JONES_2); me->SetDisplayId(MODEL_HARRISON_JONES_2); me->SetTarget(0); - me->SetByteValue(UNIT_FIELD_BYTES_1, 0,UNIT_STAND_STATE_DEAD); + me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_DEAD); me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); if (instance) instance->SetData(DATA_GONGEVENT, DONE); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp index f4083337f56..bc712ab3a31 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -22,7 +22,7 @@ enum Yells { - // Jin'do the Godbreaker + // Jin'do the Godbreaker SAY_INTRO = 0, SAY_AGGRO = 1, EMOTE_SHADOWS_OF_HAKKAR = 2, // ID - 97172 Shadows of Hakkar diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp index 490c0a77494..9742aea194b 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -150,7 +150,7 @@ public: { // Set to combat automatically, Brann's event won't repeat me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - events.SetPhase(PHASE_COMBAT); + events.SetPhase(PHASE_COMBAT); ScheduleCombatEvents(); me->SetHomePosition(AnraphetActivatePos); } @@ -167,7 +167,7 @@ public: { instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); Talk(ANRAPHET_SAY_DEATH); - + if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRANN_0_GUID))) brann->AI()->DoAction(ACTION_ANRAPHET_DIED); @@ -209,12 +209,12 @@ public: { if ((events.GetPhaseMask() & PHASE_MASK_COMBAT) && (!UpdateVictim() || !CheckInRoom())) return; - + events.Update(diff); - + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) @@ -313,7 +313,7 @@ class npc_alpha_beam : public CreatureScript private: InstanceScript* _instance; }; - + CreatureAI* GetAI(Creature* creature) const { return GetHallsOfOriginationAI(creature); @@ -538,7 +538,7 @@ public: Unit* caster = GetCaster(); float angle = float(rand_norm()) * static_cast(2 * M_PI); uint32 dist = caster->GetObjectSize() + GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()) * (float)rand_norm(); - + float x = caster->GetPositionX() + dist * std::cos(angle); float y = caster->GetPositionY() + dist * std::sin(angle); float z = caster->GetMap()->GetHeight(x, y, caster->GetPositionZ()); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index e20ad0ccf82..47bab21e215 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -45,14 +45,14 @@ enum Spells SPELL_RAGING_SMASH = 83650, SPELL_FLAME_BOLT = 77370, SPELL_EARTH_SPIKE_WARN = 94974, - + SPELL_PTAH_EXPLOSION = 75519, SPELL_SANDSTORM = 75491, - + SPELL_SUMMON_QUICKSAND = 75550, // Spell not in DBC, no SMSG_SPELL_START/GO for it SPELL_BEETLE_BURROW = 75463, - + SPELL_SUMMON_JEWELED_SCARAB = 75462, SPELL_SUMMON_DUSTBONE_HORROR = 75521, }; @@ -150,19 +150,19 @@ public: { events.SetPhase(PHASE_DISPERSE); _hasDispersed = true; - + me->AttackStop(); DoCast(me, SPELL_SANDSTORM); SendWeather(WEATHER_STATE_LIGHT_SANDSTORM, 1.0f); events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6000, 0, PHASE_DISPERSE); events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); - + std::list stalkers; GetCreatureListWithEntryInGrid(stalkers, me, NPC_BEETLE_STALKER, 100.0f); std::list beetlers = stalkers; - + Trinity::Containers::RandomResizeList(beetlers, 9); // Holds the summoners of Jeweled Scarab - + for (std::list::iterator itr = beetlers.begin(); itr != beetlers.end(); ++itr) { stalkers.remove((*itr)); // Remove it to prevent a single trigger from spawning multiple npcs. @@ -172,7 +172,7 @@ public: } Trinity::Containers::RandomResizeList(stalkers, 2); // Holds the summoners of Dustbone Horror - + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) (*itr)->CastSpell((*itr), SPELL_SUMMON_DUSTBONE_HORROR); } @@ -194,7 +194,7 @@ public: } } } - + void EnterCombat(Unit* /*who*/) { instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); @@ -221,12 +221,12 @@ public: { if (!UpdateVictim() || !CheckInRoom()) return; - + events.Update(diff); - + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) @@ -256,11 +256,11 @@ public: break; } } - + if (events.GetPhaseMask() & PHASE_MASK_NORMAL) // Do not melee in the disperse phase DoMeleeAttackIfReady(); } - + protected: bool _hasDispersed; uint8 _summonDeaths; diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index aec5f7416c6..9261575bc82 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -53,7 +53,7 @@ enum Spells SPELL_SHIELD_VISUAL_RIGHT = 83698, SPELL_BEAM_OF_LIGHT_RIGHT = 76573, - + SPELL_SHIELD_VISUAL_LEFT = 83697, SPELL_BEAM_OF_LIGHT_LEFT = 74930, @@ -196,12 +196,12 @@ public: { if (!UpdateVictim() || !CheckInRoom() || me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) || _phase == PHASE_SHIELDED) return; - + events.Update(diff); - + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) @@ -225,22 +225,22 @@ public: Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f); if (!target) break; - + std::list stalkers; GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); stalkers.remove_if(Trinity::HeightDifferenceCheck(ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR)), 5.0f, true)); - + if (stalkers.empty()) break; stalkers.sort(Trinity::ObjectDistanceOrderPred(target)); - + // Get the closest statue face (any of its eyes) Creature* eye1 = stalkers.front(); stalkers.remove(eye1); // Remove the eye. stalkers.sort(Trinity::ObjectDistanceOrderPred(eye1)); // Find the second eye. Creature* eye2 = stalkers.front(); - + eye1->CastSpell(eye1, SPELL_SEARING_LIGHT, true); eye2->CastSpell(eye2, SPELL_SEARING_LIGHT, true); break; @@ -267,11 +267,11 @@ class spell_anhuur_shield_of_light : public SpellScriptLoader { public: spell_anhuur_shield_of_light() : SpellScriptLoader("spell_anhuur_shield_of_light") { } - + class spell_anhuur_shield_of_light_SpellScript : public SpellScript { PrepareSpellScript(spell_anhuur_shield_of_light_SpellScript); - + void FilterTargets(std::list& targets) { if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) @@ -288,13 +288,13 @@ class spell_anhuur_shield_of_light : public SpellScriptLoader } } } - + void Register() { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anhuur_shield_of_light_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); } }; - + SpellScript* GetSpellScript() const { return new spell_anhuur_shield_of_light_SpellScript(); @@ -305,11 +305,11 @@ class spell_anhuur_disable_beacon_beams : public SpellScriptLoader { public: spell_anhuur_disable_beacon_beams() : SpellScriptLoader("spell_anhuur_disable_beacon_beams") { } - + class spell_anhuur_disable_beacon_beams_SpellScript : public SpellScript { PrepareSpellScript(spell_anhuur_disable_beacon_beams_SpellScript); - + void HandleScript(SpellEffIndex /*effIndex*/) { GetHitUnit()->RemoveAurasDueToSpell(GetEffectValue()); @@ -329,7 +329,7 @@ class spell_anhuur_disable_beacon_beams : public SpellScriptLoader OnEffectHit += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::Notify, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; - + SpellScript* GetSpellScript() const { return new spell_anhuur_disable_beacon_beams_SpellScript(); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 54ecdfb331d..5cc83e4af9c 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -37,7 +37,7 @@ enum Data DATA_AMMUNAE, DATA_SETESH, DATA_RAJH, - + // Temple Guardian Anhuur DATA_ANHUUR_GUID, DATA_ANHUUR_LEFT_BEACON, @@ -56,7 +56,7 @@ enum Creatures BOSS_TEMPLE_GUARDIAN_ANHUUR = 39425, NPC_CAVE_IN_STALKER = 40183, NPC_SEARING_LIGHT = 40283, - + BOSS_EARTHRAGER_PTAH = 39428, NPC_BEETLE_STALKER = 40459, // Summons both Jeweled Scarab and Dustbone Horror NPC_JEWELED_SCARAB = 40458, diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index 0cb21aeeba1..8c160bdc6f7 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -27,7 +27,7 @@ #include "WorldPacket.h" #include "WorldSession.h" -DoorData const doorData[] = +DoorData const doorData[] = { {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, @@ -51,7 +51,7 @@ class instance_halls_of_origination : public InstanceMapScript struct instance_halls_of_origination_InstanceMapScript : public InstanceScript { - instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { SetBossNumber(EncounterCount); LoadDoorData(doorData); @@ -66,7 +66,7 @@ class instance_halls_of_origination : public InstanceMapScript SunMirrorGUID = 0; _deadElementals = 0; } - + void OnGameObjectCreate(GameObject* go) { switch (go->GetEntry()) @@ -150,7 +150,7 @@ class instance_halls_of_origination : public InstanceMapScript default: break; } - + return 0; } @@ -173,7 +173,7 @@ class instance_halls_of_origination : public InstanceMapScript case DATA_ANRAPHET_GUID: return AnraphetGUID; } - + return 0; } @@ -269,7 +269,7 @@ class instance_halls_of_origination : public InstanceMapScript uint64 SunMirrorGUID; uint32 _deadElementals; }; - + InstanceScript* GetInstanceScript(InstanceMap* map) const { return new instance_halls_of_origination_InstanceMapScript(map); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp index ac668c33874..7893fb7c984 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp @@ -176,7 +176,7 @@ class boss_elder_nadox : public CreatureScript } } - if (me->HealthBelowPct(100 - AmountHealthModifier * 25)) + if (me->HealthBelowPct(100 - AmountHealthModifier* 25)) { Talk(EMOTE_HATCHES, me->GetGUID()); DoCast(me, SPELL_SUMMON_SWARM_GUARD); @@ -298,7 +298,7 @@ public: void FilterTargets(std::list& targets) { - targets.remove_if(GuardianCheck()); + targets.remove_if (GuardianCheck()); } void Register() diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 1ac073ae881..13e4e5b51d5 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -358,7 +358,7 @@ class boss_halion : public CreatureScript if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TWILIGHT_HALION))) if (twilightHalion->isAlive()) twilightHalion->Kill(twilightHalion); - + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER))) if (controller->isAlive()) controller->Kill(controller); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index dffdadc5b9c..5a38d163da3 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -554,7 +554,7 @@ class spell_paralyze_pinnacle : public SpellScriptLoader void FilterTargets(std::list& unitList) { - unitList.remove_if(RitualTargetCheck(GetCaster())); + unitList.remove_if (RitualTargetCheck(GetCaster())); } void Register() diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index d6b89e6b8c8..37278b2e59d 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -196,7 +196,7 @@ public: if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) return; - switch(GetSpellInfo()->Id) + switch (GetSpellInfo()->Id) { case SPELL_DRUID_WRATH: { @@ -205,10 +205,10 @@ public: if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { - caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); + caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - caster->CastSpell(caster,SPELL_DRUID_LUNAR_ECLIPSE_MARKER,true); + caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the solar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) @@ -222,10 +222,10 @@ public: if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { - caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); + caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); + caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) @@ -239,16 +239,16 @@ public: || caster->GetPower(POWER_ECLIPSE) == 0) { energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 - caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); + caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) { energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 - caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index bd27151c1c4..a338f6f6336 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -465,7 +465,7 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader class spell_mage_blizzard : public SpellScriptLoader { public: - spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } + spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } class spell_mage_blizzard_SpellScript : public SpellScript { @@ -498,7 +498,7 @@ class spell_mage_blizzard : public SpellScriptLoader } }; - SpellScript *GetSpellScript() const + SpellScript* GetSpellScript() const { return new spell_mage_blizzard_SpellScript(); } @@ -509,7 +509,7 @@ class spell_mage_blizzard : public SpellScriptLoader class spell_mage_frostbolt : public SpellScriptLoader { public: - spell_mage_frostbolt() : SpellScriptLoader("spell_mage_frostbolt") { } + spell_mage_frostbolt() : SpellScriptLoader("spell_mage_frostbolt") { } class spell_mage_frostbolt_SpellScript : public SpellScript { @@ -534,7 +534,7 @@ class spell_mage_frostbolt : public SpellScriptLoader } }; - SpellScript *GetSpellScript() const + SpellScript* GetSpellScript() const { return new spell_mage_frostbolt_SpellScript(); } diff --git a/src/server/shared/DataStores/DB2FileLoader.cpp b/src/server/shared/DataStores/DB2FileLoader.cpp index 14170845211..0de3b94b5d4 100644 --- a/src/server/shared/DataStores/DB2FileLoader.cpp +++ b/src/server/shared/DataStores/DB2FileLoader.cpp @@ -37,7 +37,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) data=NULL; } - FILE * f = fopen(filename, "rb"); + FILE* f = fopen(filename, "rb"); if (!f) return false; @@ -193,7 +193,7 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) int32 i = -1; for (uint32 x=0; format[x]; ++x) { - switch(format[x]) + switch (format[x]) { case FT_FLOAT: case FT_INT: @@ -279,7 +279,7 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** for (uint32 x = 0; x < fieldCount; x++) { - switch(format[x]) + switch (format[x]) { case FT_FLOAT: *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x); @@ -332,8 +332,8 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da { uint32 stringFieldNum = 0; - for(uint32 x = 0; x < fieldCount; x++) - switch(format[x]) + for (uint32 x = 0; x < fieldCount; x++) + switch (format[x]) { case FT_FLOAT: case FT_IND: @@ -378,7 +378,7 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable) for (uint32 y =0; y < recordCount; y++) { for (uint32 x = 0; x < fieldCount; x++) - switch(format[x]) + switch (format[x]) { case FT_FLOAT: case FT_IND: diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 4b840e24953..68d86406faa 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -54,7 +54,7 @@ class ByteBufferPositionException : public ByteBufferException { ACE_Stack_Trace trace; - sLog->outError(LOG_FILTER_NETWORKIO, "Attempted to %s value with size: " SIZEFMTD " in ByteBuffer (pos: " SIZEFMTD " size: "SIZEFMTD")\n[Stack trace: %s]" , + sLog->outError(LOG_FILTER_NETWORKIO, "Attempted to %s value with size: " SIZEFMTD " in ByteBuffer (pos: " SIZEFMTD " size: "SIZEFMTD")\n[Stack trace: %s]", (_add ? "put" : "get"), ValueSize, Pos, Size, trace.c_str()); } -- cgit v1.2.3 From 9007ef905ff3f82307256f845662a6bfe61c1ebd Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 14 Jan 2013 15:05:30 +0100 Subject: Core: Fixed some compile warnings --- src/server/game/Entities/Item/Item.cpp | 57 ++++++++++------------ src/server/game/Guilds/Guild.h | 2 +- src/server/game/Handlers/BattleGroundHandler.cpp | 2 +- src/server/game/Maps/PhaseMgr.cpp | 2 +- .../Kalimdor/HallsOfOrigination/boss_anraphet.cpp | 2 +- .../HallsOfOrigination/boss_earthrager_ptah.cpp | 8 +-- .../boss_temple_guardian_anhuur.cpp | 2 +- 7 files changed, 35 insertions(+), 40 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 93c16104c44..7da910f1841 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1327,7 +1327,7 @@ uint32 Item::GetSellPrice(ItemTemplate const* proto, bool& normalSellPrice) inventoryType = INVTYPE_CHEST; float typeFactor = 0.0f; - uint8 wepType = -1; + int8 weapType = -1; switch (inventoryType) { @@ -1349,29 +1349,19 @@ uint32 Item::GetSellPrice(ItemTemplate const* proto, bool& normalSellPrice) { case ITEM_SUBCLASS_ARMOR_MISCELLANEOUS: case ITEM_SUBCLASS_ARMOR_CLOTH: - { typeFactor = armorPrice->ClothFactor; break; - } case ITEM_SUBCLASS_ARMOR_LEATHER: - { - typeFactor = armorPrice->ClothFactor; + typeFactor = armorPrice->LeatherFactor; break; - } case ITEM_SUBCLASS_ARMOR_MAIL: - { - typeFactor = armorPrice->ClothFactor; + typeFactor = armorPrice->MailFactor; break; - } case ITEM_SUBCLASS_ARMOR_PLATE: - { - typeFactor = armorPrice->ClothFactor; + typeFactor = armorPrice->PlateFactor; break; - } default: - { return 0; - } } break; @@ -1386,32 +1376,37 @@ uint32 Item::GetSellPrice(ItemTemplate const* proto, bool& normalSellPrice) break; } case INVTYPE_WEAPONMAINHAND: - wepType = 0; // unk enum, fall back + weapType = 0; + break; case INVTYPE_WEAPONOFFHAND: - wepType = 1; // unk enum, fall back + weapType = 1; + break; case INVTYPE_WEAPON: - wepType = 2; // unk enum, fall back + weapType = 2; + break; case INVTYPE_2HWEAPON: - wepType = 3; // unk enum, fall back + weapType = 3; + break; case INVTYPE_RANGED: case INVTYPE_RANGEDRIGHT: case INVTYPE_RELIC: - { - wepType = 4; // unk enum - - ImportPriceWeaponEntry const* weaponPrice = sImportPriceWeaponStore.LookupEntry(wepType + 1); - if (!weaponPrice) - return 0; - - typeFactor = weaponPrice->Factor; + weapType = 4; break; - } default: return proto->BuyPrice; } + if (weapType != -1) + { + ImportPriceWeaponEntry const* weaponPrice = sImportPriceWeaponStore.LookupEntry(weapType + 1); + if (!weaponPrice) + return 0; + + typeFactor = weaponPrice->Factor; + } + normalSellPrice = false; - return (uint32)(qualityFactor * proto->Unk430_2 * proto->Unk430_1 * typeFactor * baseFactor); + return uint32(qualityFactor * proto->Unk430_2 * proto->Unk430_1 * typeFactor * baseFactor); } } @@ -1453,7 +1448,7 @@ int32 Item::GetReforgableStat(ItemModType statType) const { ItemTemplate const* proto = GetTemplate(); for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - if (proto->ItemStat[i].ItemStatType == statType) + if (ItemModType(proto->ItemStat[i].ItemStatType) == statType) return proto->ItemStat[i].ItemStatValue; int32 randomPropId = GetItemRandomPropertyId(); @@ -1469,7 +1464,7 @@ int32 Item::GetReforgableStat(ItemModType statType) const for (uint32 e = PROP_ENCHANTMENT_SLOT_0; e <= PROP_ENCHANTMENT_SLOT_4; ++e) if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(GetEnchantmentId(EnchantmentSlot(e)))) for (uint32 f = 0; f < MAX_ITEM_ENCHANTMENT_EFFECTS; ++f) - if (enchant->type[f] == ITEM_ENCHANTMENT_TYPE_STAT && enchant->spellid[f] == statType) + if (enchant->type[f] == ITEM_ENCHANTMENT_TYPE_STAT && ItemModType(enchant->spellid[f]) == statType) for (int k = 0; k < 5; ++k) if (randomSuffix->enchant_id[k] == enchant->ID) return int32((randomSuffix->prefix[k] * GetItemSuffixFactor()) / 10000); @@ -1483,7 +1478,7 @@ int32 Item::GetReforgableStat(ItemModType statType) const for (uint32 e = PROP_ENCHANTMENT_SLOT_0; e <= PROP_ENCHANTMENT_SLOT_4; ++e) if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(GetEnchantmentId(EnchantmentSlot(e)))) for (uint32 f = 0; f < MAX_ITEM_ENCHANTMENT_EFFECTS; ++f) - if (enchant->type[f] == ITEM_ENCHANTMENT_TYPE_STAT && enchant->spellid[f] == statType) + if (enchant->type[f] == ITEM_ENCHANTMENT_TYPE_STAT && ItemModType(enchant->spellid[f]) == statType) for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k) if (randomProp->enchant_id[k] == enchant->ID) return int32(enchant->amount[k]); diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index e89be2e8952..0c41cc68a60 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -548,7 +548,7 @@ private: class LogHolder { public: - LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(GUILD_EVENT_LOG_GUID_UNDEFINED) { } + LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } ~LogHolder(); uint8 GetSize() const { return uint8(m_log.size()); } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 08635071ce9..7dfc8b94090 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -727,7 +727,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); uint32 avgTime = 0; - GroupQueueInfo* ginfo; + GroupQueueInfo* ginfo = NULL; err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot); if (!err) diff --git a/src/server/game/Maps/PhaseMgr.cpp b/src/server/game/Maps/PhaseMgr.cpp index 2bb4ed0fb8c..99eee8d7c08 100644 --- a/src/server/game/Maps/PhaseMgr.cpp +++ b/src/server/game/Maps/PhaseMgr.cpp @@ -218,7 +218,7 @@ void PhaseMgr::SetCustomPhase(uint32 const phaseMask) uint32 PhaseData::GetCurrentPhasemask() const { if (player->isGameMaster()) - return PHASEMASK_ANYWHERE; + return uint32(PHASEMASK_ANYWHERE); if (_CustomPhasemask) return _CustomPhasemask; diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp index 9742aea194b..be024208596 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -302,7 +302,7 @@ class npc_alpha_beam : public CreatureScript { npc_alpha_beamAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } - void IsSummonedBy(Unit* summoner) + void IsSummonedBy(Unit* /*summoner*/) { if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID))) anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp index 47bab21e215..1ea0ee0a343 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -76,7 +76,7 @@ class SummonScarab : public BasicEvent public: SummonScarab(Unit* owner, InstanceScript* instance) : _owner(owner), _instance(instance) { } - bool Execute(uint64 execTime, uint32 /*diff*/) + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) { if (!_instance || _instance->GetBossState(DATA_EARTHRAGER_PTAH) != IN_PROGRESS) return true; // delete event @@ -178,7 +178,7 @@ public: } } - void SetData(uint32 index, uint32 value) + void SetData(uint32 index, uint32 /*value*/) { if (index == DATA_SUMMON_DEATHS) { @@ -311,7 +311,7 @@ public: { if (Unit* ptah = GetCaster()) { - ptah->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31); + ptah->SetFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31)); ptah->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); } } @@ -320,7 +320,7 @@ public: { if (Unit* ptah = GetCaster()) { - ptah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31); + ptah->RemoveFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31)); ptah->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); } } diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index 9261575bc82..9a66caf510c 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -121,7 +121,7 @@ public: DoCast(me, SPELL_TELEPORT); DoCast(me, SPELL_SHIELD_OF_LIGHT); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31); + me->SetFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_UNK_31)); DoCastAOE(SPELL_ACTIVATE_BEACONS); -- cgit v1.2.3 From 6f8aa6a78257e7a288c5731944798cc0f2f4e654 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 14 Jan 2013 20:28:32 +0100 Subject: Core/Spells: Reorder more scripts in some script files and some cosmetic stuff --- src/server/scripts/Spells/spell_dk.cpp | 4 +- src/server/scripts/Spells/spell_druid.cpp | 249 ++++++------- src/server/scripts/Spells/spell_mage.cpp | 559 ++++++++++++++-------------- src/server/scripts/Spells/spell_paladin.cpp | 3 +- src/server/scripts/Spells/spell_rogue.cpp | 30 -- src/server/scripts/Spells/spell_shaman.cpp | 15 +- src/server/scripts/Spells/spell_warlock.cpp | 37 +- src/server/scripts/Spells/spell_warrior.cpp | 4 +- 8 files changed, 442 insertions(+), 459 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 060db02d53c..5b43a46cb1f 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -46,12 +46,12 @@ enum DeathKnightSpells SPELL_DK_UNHOLY_PRESENCE = 48265, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622, SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962, - SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736, + SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736 }; enum DeathKnightSpellIcons { - DK_ICON_ID_IMPROVED_DEATH_STRIKE = 2751, + DK_ICON_ID_IMPROVED_DEATH_STRIKE = 2751 }; // 50462 - Anti-Magic Shell (on raid member) diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 37278b2e59d..b5b4937a14c 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -29,6 +29,15 @@ enum DruidSpells { + SPELL_DRUID_WRATH = 5176, + SPELL_DRUID_STARFIRE = 2912, + SPELL_DRUID_STARSURGE = 78674, + SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE = 89265, + SPELL_DRUID_STARSURGE_ENERGIZE = 86605, + SPELL_DRUID_LUNAR_ECLIPSE_MARKER = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar) + SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) + SPELL_DRUID_SOLAR_ECLIPSE = 48517, + SPELL_DRUID_LUNAR_ECLIPSE = 48518, SPELL_DRUID_ENRAGE_MOD_DAMAGE = 51185, SPELL_DRUID_INCREASED_MOONFIRE_DURATION = 38414, SPELL_DRUID_KING_OF_THE_JUNGLE = 48492, @@ -38,7 +47,117 @@ enum DruidSpells SPELL_DRUID_SURVIVAL_INSTINCTS = 50322, SPELL_DRUID_SAVAGE_ROAR = 62071, SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178, - SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950, + SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950 +}; + +// 2912, 5176, 78674 - Starfire, Wrath, and Starsurge +class spell_dru_eclipse_energize : public SpellScriptLoader +{ + public: + spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { } + + class spell_dru_eclipse_energize_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); + + int32 energizeAmount; + + bool Load() + { + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + return false; + + if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) + return false; + + energizeAmount = 0; + + return true; + } + + void HandleEnergize(SpellEffIndex effIndex) + { + Player* caster = GetCaster()->ToPlayer(); + + // No boomy, no deal. + if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) + return; + + switch (GetSpellInfo()->Id) + { + case SPELL_DRUID_WRATH: + { + energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 + // If we are set to fill the lunar side or we've just logged in with 0 power.. + if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); + } + // The energizing effect brought us out of the solar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); + break; + } + case SPELL_DRUID_STARFIRE: + { + energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 + // If we are set to fill the solar side or we've just logged in with 0 power.. + if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); + } + // The energizing effect brought us out of the lunar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); + break; + } + case SPELL_DRUID_STARSURGE: + { + // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) + if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 + caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); + + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); + } + else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + { + energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 + caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); + } + // The energizing effect brought us out of the lunar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); + // The energizing effect brought us out of the solar eclipse, remove the aura + else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); + break; + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_eclipse_energize_SpellScript; + } }; // -5229 - Enrage @@ -150,129 +269,7 @@ class spell_dru_insect_swarm : public SpellScriptLoader } }; -enum EclipseSpells -{ - SPELL_DRUID_WRATH = 5176, - SPELL_DRUID_STARFIRE = 2912, - SPELL_DRUID_STARSURGE = 78674, - SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE = 89265, - SPELL_DRUID_STARSURGE_ENERGIZE = 86605, - SPELL_DRUID_LUNAR_ECLIPSE_MARKER = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar) - SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) - SPELL_DRUID_SOLAR_ECLIPSE = 48517, - SPELL_DRUID_LUNAR_ECLIPSE = 48518, -}; - -// Wrath, Starfire, and Starsurge -class spell_dru_eclipse_energize : public SpellScriptLoader -{ -public: - spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { } - - class spell_dru_eclipse_energize_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); - - int32 energizeAmount; - - bool Load() - { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) - return false; - - if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) - return false; - - energizeAmount = 0; - - return true; - } - - void HandleEnergize(SpellEffIndex effIndex) - { - Player* caster = GetCaster()->ToPlayer(); - - // No boomy, no deal. - if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) - return; - - switch (GetSpellInfo()->Id) - { - case SPELL_DRUID_WRATH: - { - energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 - // If we are set to fill the lunar side or we've just logged in with 0 power.. - if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) - { - caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); - // If the energize was due to 0 power, cast the eclipse marker aura - if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); - } - // The energizing effect brought us out of the solar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) - caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); - break; - } - case SPELL_DRUID_STARFIRE: - { - energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 - // If we are set to fill the solar side or we've just logged in with 0 power.. - if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) - { - caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); - // If the energize was due to 0 power, cast the eclipse marker aura - if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); - } - // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) - caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); - break; - } - case SPELL_DRUID_STARSURGE: - { - // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) - if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) - { - energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 - caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); - - // If the energize was due to 0 power, cast the eclipse marker aura - if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); - } - else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - { - energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 - caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); - } - // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) - caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); - // The energizing effect brought us out of the solar eclipse, remove the aura - else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) - caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); - break; - } - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_eclipse_energize_SpellScript; - } -}; - +// -33763 - Lifebloom class spell_dru_lifebloom : public SpellScriptLoader { public: @@ -543,7 +540,7 @@ class spell_dru_savage_roar : public SpellScriptLoader { PrepareAuraScript(spell_dru_savage_roar_AuraScript); - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SAVAGE_ROAR)) return false; @@ -837,6 +834,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader void AddSC_druid_spell_scripts() { + new spell_dru_eclipse_energize(); new spell_dru_enrage(); new spell_dru_glyph_of_starfire(); new spell_dru_insect_swarm(); @@ -852,5 +850,4 @@ void AddSC_druid_spell_scripts() new spell_dru_swift_flight_passive(); new spell_dru_tiger_s_fury(); new spell_dru_t10_restoration_4p_bonus(); - new spell_dru_eclipse_energize(); } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index a338f6f6336..8c33117bb96 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -28,40 +28,55 @@ enum MageSpells { + SPELL_MAGE_FLAMESTRIKE = 2120, + + SPELL_MAGE_CHILLED_R1 = 12484, + SPELL_MAGE_CHILLED_R2 = 12485, + SPELL_MAGE_COLD_SNAP = 11958, + + SPELL_MAGE_CONE_OF_COLD_AURA_R1 = 11190, + SPELL_MAGE_CONE_OF_COLD_AURA_R2 = 12489, + SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1 = 83301, + SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2 = 83302, + + SPELL_MAGE_FROST_WARDING_R1 = 28332, + SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776, + + SPELL_MAGE_SHATTERED_BARRIER_R1 = 44745, + SPELL_MAGE_SHATTERED_BARRIER_R2 = 54787, + SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1 = 55080, + SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2 = 83073, + + SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED = 44413, + SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK = 86261, + SPELL_MAGE_SQUIRREL_FORM = 32813, SPELL_MAGE_GIRAFFE_FORM = 32816, SPELL_MAGE_SERPENT_FORM = 32817, SPELL_MAGE_DRAGONHAWK_FORM = 32818, SPELL_MAGE_WORGEN_FORM = 32819, SPELL_MAGE_SHEEP_FORM = 32820, + + SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED = 83098, + SPELL_MAGE_GLYPH_OF_ETERNAL_WATER = 70937, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907, - SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126, - SPELL_MAGE_CONJURE_REFRESHMENT = 42955, - SPELL_MAGE_FLAMESTRIKE = 2120, - SPELL_MAGE_CHILLED_R1 = 12484, - SPELL_MAGE_CHILLED_R2 = 12485, - SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED = 44413, - SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK = 86261, - SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED = 83098, - SPELL_MAGE_SHATTERED_BARRIER_R1 = 44745, - SPELL_MAGE_SHATTERED_BARRIER_R2 = 54787, - SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1 = 55080, - SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2 = 83073, - SPELL_MAGE_FINGERS_OF_FROST = 44544, + + SPELL_MAGE_FINGERS_OF_FROST = 44544 }; enum MageIcons { - ICON_MAGE_SHATTER = 976, - ICON_MAGE_IMPROVED_FLAMESTRIKE = 37, - ICON_MAGE_IMPROVED_FREEZE = 94, - ICON_MAGE_INCANTER_S_ABSORPTION = 2941, - ICON_MAGE_IMPROVED_MANA_GEM = 1036, + ICON_MAGE_SHATTER = 976, + ICON_MAGE_IMPROVED_FLAMESTRIKE = 37, + ICON_MAGE_IMPROVED_FREEZE = 94, + ICON_MAGE_INCANTER_S_ABSORPTION = 2941, + ICON_MAGE_IMPROVED_MANA_GEM = 1036 }; +// 11113 - Blast Wave class spell_mage_blast_wave : public SpellScriptLoader { public: @@ -115,6 +130,51 @@ class spell_mage_blast_wave : public SpellScriptLoader } }; +// 42208 - Blizzard +/// Updated 4.3.4 +class spell_mage_blizzard : public SpellScriptLoader +{ + public: + spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } + + class spell_mage_blizzard_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_blizzard_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2)) + return false; + return true; + } + + void AddChillEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + if (caster->IsScriptOverriden(GetSpellInfo(), 836)) + caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R1, true); + else if (caster->IsScriptOverriden(GetSpellInfo(), 988)) + caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R2, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_blizzard_SpellScript::AddChillEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_blizzard_SpellScript(); + } +}; + +// 11958 - Cold Snap class spell_mage_cold_snap : public SpellScriptLoader { public: @@ -161,233 +221,39 @@ class spell_mage_cold_snap : public SpellScriptLoader } }; -enum SilvermoonPolymorph -{ - NPC_AUROSALIA = 18744, -}; - -// TODO: move out of here and rename - not a mage spell -class spell_mage_polymorph_cast_visual : public SpellScriptLoader -{ - public: - spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { } - - class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript); - - static const uint32 PolymorhForms[6]; - - bool Validate(SpellInfo const* /*spellEntry*/) - { - // check if spell ids exist in dbc - for (uint32 i = 0; i < 6; i++) - if (!sSpellMgr->GetSpellInfo(PolymorhForms[i])) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) - if (target->GetTypeId() == TYPEID_UNIT) - target->CastSpell(target, PolymorhForms[urand(0, 5)], true); - } - - void Register() - { - // add dummy effect spell handler to Polymorph visual - OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_polymorph_cast_visual_SpellScript(); - } -}; - -const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] = -{ - SPELL_MAGE_SQUIRREL_FORM, - SPELL_MAGE_GIRAFFE_FORM, - SPELL_MAGE_SERPENT_FORM, - SPELL_MAGE_DRAGONHAWK_FORM, - SPELL_MAGE_WORGEN_FORM, - SPELL_MAGE_SHEEP_FORM -}; - -class spell_mage_summon_water_elemental : public SpellScriptLoader +// 120 - Cone of Cold +/// Updated 4.3.4 +class spell_mage_cone_of_cold : public SpellScriptLoader { public: - spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { } + spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { } - class spell_mage_summon_water_elemental_SpellScript : public SpellScript + class spell_mage_cone_of_cold_SpellScript : public SpellScript { - PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)) - return false; - return true; - } + PrepareSpellScript(spell_mage_cone_of_cold_SpellScript); - void HandleDummy(SpellEffIndex /*effIndex*/) + void HandleConeOfColdScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - // Glyph of Eternal Water - if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) - caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true); - else - caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY, true); - } - - void Register() - { - // add dummy effect spell handler to Summon Water Elemental - OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_summon_water_elemental_SpellScript(); - } -}; - -// Frost Warding -class spell_mage_frost_warding_trigger : public SpellScriptLoader -{ - public: - spell_mage_frost_warding_trigger() : SpellScriptLoader("spell_mage_frost_warding_trigger") { } - - class spell_mage_frost_warding_trigger_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_frost_warding_trigger_AuraScript); - - enum Spells - { - SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776, - SPELL_MAGE_FROST_WARDING_R1 = 28332, - }; - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1)) - return false; - return true; - } - - void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - Unit* target = GetTarget(); - if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0)) + if (Unit* unitTarget = GetHitUnit()) { - int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - - if (roll_chance_i(chance)) - { - int32 bp = dmgInfo.GetDamage(); - dmgInfo.AbsorbDamage(bp); - target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); - absorbAmount = 0; - PreventDefaultAction(); - } + if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1 + unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1, true); + else if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2 + unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2, true); } } void Register() { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_frost_warding_trigger_AuraScript::Absorb, EFFECT_0); + OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); } }; - AuraScript* GetAuraScript() const - { - return new spell_mage_frost_warding_trigger_AuraScript(); - } -}; - -class spell_mage_living_bomb : public SpellScriptLoader -{ - public: - spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } - - class spell_mage_living_bomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_living_bomb_AuraScript); - - bool Validate(SpellInfo const* spell) - { - if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue()))) - return false; - return true; - } - - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); - if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE) - return; - - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_living_bomb_AuraScript(); - } -}; - -enum ConeOfColdSpells -{ - SPELL_CONE_OF_COLD_AURA_R1 = 11190, // Improved Cone of Cold Rank 1 aura - SPELL_CONE_OF_COLD_AURA_R2 = 12489, // Improved Cone of Cold Rank 2 aura - SPELL_CONE_OF_COLD_TRIGGER_R1 = 83301, // Improved Cone of Cold Rank 1 Trigger - SPELL_CONE_OF_COLD_TRIGGER_R2 = 83302, // Improved Cone of Cold Rank 2 Trigger -}; - -// 120 Cone of Cold -/// Updated 4.3.4 -class spell_mage_cone_of_cold : public SpellScriptLoader -{ -public: - spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { } - - class spell_mage_cone_of_cold_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_cone_of_cold_SpellScript); - - void HandleConeOfColdScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - if (caster->HasAura(SPELL_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1 - unitTarget->CastSpell(unitTarget, SPELL_CONE_OF_COLD_TRIGGER_R1, true); - else if (caster->HasAura(SPELL_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2 - unitTarget->CastSpell(unitTarget, SPELL_CONE_OF_COLD_TRIGGER_R2, true); - } - } - - void Register() + SpellScript* GetSpellScript() const { - OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + return new spell_mage_cone_of_cold_SpellScript(); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_cone_of_cold_SpellScript(); - } }; // 42955 Conjure Refreshment @@ -400,7 +266,7 @@ struct ConjureRefreshmentData }; uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 7; -const ConjureRefreshmentData _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] = +ConjureRefreshmentData const _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] = { { 33, 43, 92739 }, { 44, 53, 92799 }, @@ -411,6 +277,7 @@ const ConjureRefreshmentData _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] = { 85, 85, 92727 } }; +// 42955 - Conjure Refreshment class spell_mage_conjure_refreshment : public SpellScriptLoader { public: @@ -420,7 +287,7 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader { PrepareSpellScript(spell_mage_conjure_refreshment_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) + bool Validate(SpellInfo const* /*spellInfo*/) { for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i) if (!sSpellMgr->GetSpellInfo(_conjureData[i].spellId)) @@ -460,51 +327,54 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader } }; -// 42208 Blizzard -/// Updated 4.3.4 -class spell_mage_blizzard : public SpellScriptLoader +// -6143, -543 - Frost Warding +class spell_mage_frost_warding_trigger : public SpellScriptLoader { - public: - spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } + public: + spell_mage_frost_warding_trigger() : SpellScriptLoader("spell_mage_frost_warding_trigger") { } - class spell_mage_blizzard_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_blizzard_SpellScript); + class spell_mage_frost_warding_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_frost_warding_trigger_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2)) - return false; - return true; - } + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1)) + return false; + return true; + } - void AddChillEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - if (caster->IsScriptOverriden(GetSpellInfo(), 836)) - caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R1, true); - else if (caster->IsScriptOverriden(GetSpellInfo(), 988)) - caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R2, true); - } - } + void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount) + { + Unit* target = GetTarget(); + if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0)) + { + int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_mage_blizzard_SpellScript::AddChillEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; + if (roll_chance_i(chance)) + { + int32 bp = dmgInfo.GetDamage(); + dmgInfo.AbsorbDamage(bp); + target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); + absorbAmount = 0; + PreventDefaultAction(); + } + } + } - SpellScript* GetSpellScript() const - { - return new spell_mage_blizzard_SpellScript(); - } + void Register() + { + OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_frost_warding_trigger_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_frost_warding_trigger_AuraScript(); + } }; -// 116 Frostbolt +// 116 - Frostbolt /// Updated 4.3.4 class spell_mage_frostbolt : public SpellScriptLoader { @@ -540,7 +410,46 @@ class spell_mage_frostbolt : public SpellScriptLoader } }; -// 11426 Ice Barrier +// -44457 - Living Bomb +class spell_mage_living_bomb : public SpellScriptLoader +{ + public: + spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } + + class spell_mage_living_bomb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_living_bomb_AuraScript); + + bool Validate(SpellInfo const* spellInfo) + { + if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->Effects[EFFECT_1].CalcValue()))) + return false; + return true; + } + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); + if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE) + return; + + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_living_bomb_AuraScript(); + } +}; + +// 11426 - Ice Barrier /// Updated 4.3.4 class spell_mage_ice_barrier : public SpellScriptLoader { @@ -574,11 +483,11 @@ class spell_mage_ice_barrier : public SpellScriptLoader } }; -// 1463 Mana Shield +// 1463 - Mana Shield /// Updated 4.3.4 class spell_mage_mana_shield : public SpellScriptLoader { - public: + public: spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } class spell_mage_mana_shield_AuraScript : public AuraScript @@ -613,7 +522,7 @@ class spell_mage_mana_shield : public SpellScriptLoader } }; -// 543 Mage Ward +// 543 - Mage Ward /// Updated 4.3.4 class spell_mage_mage_ward : public SpellScriptLoader { @@ -645,7 +554,63 @@ class spell_mage_mage_ward : public SpellScriptLoader } }; -// 5405 Replenish Mana (Mana Gem) +enum SilvermoonPolymorph +{ + NPC_AUROSALIA = 18744 +}; + +// TODO: move out of here and rename - not a mage spell +class spell_mage_polymorph_cast_visual : public SpellScriptLoader +{ + public: + spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { } + + class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript); + + static const uint32 PolymorhForms[6]; + + bool Validate(SpellInfo const* /*spellInfo*/) + { + // check if spell ids exist in dbc + for (uint32 i = 0; i < 6; i++) + if (!sSpellMgr->GetSpellInfo(PolymorhForms[i])) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) + if (target->GetTypeId() == TYPEID_UNIT) + target->CastSpell(target, PolymorhForms[urand(0, 5)], true); + } + + void Register() + { + // add dummy effect spell handler to Polymorph visual + OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_polymorph_cast_visual_SpellScript(); + } +}; + +uint32 const spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] = +{ + SPELL_MAGE_SQUIRREL_FORM, + SPELL_MAGE_GIRAFFE_FORM, + SPELL_MAGE_SERPENT_FORM, + SPELL_MAGE_DRAGONHAWK_FORM, + SPELL_MAGE_WORGEN_FORM, + SPELL_MAGE_SHEEP_FORM +}; + +// 5405 - Replenish Mana (Mana Gem) /// Updated 4.3.4 class spell_mage_replenish_mana : public SpellScriptLoader { @@ -656,7 +621,7 @@ class spell_mage_replenish_mana : public SpellScriptLoader { PrepareSpellScript(spell_mage_replenish_mana_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED)) return false; @@ -684,6 +649,46 @@ class spell_mage_replenish_mana : public SpellScriptLoader } }; +// 31687 - Summon Water Elemental +class spell_mage_summon_water_elemental : public SpellScriptLoader +{ + public: + spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { } + + class spell_mage_summon_water_elemental_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + // Glyph of Eternal Water + if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) + caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true); + else + caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY, true); + } + + void Register() + { + // add dummy effect spell handler to Summon Water Elemental + OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_summon_water_elemental_SpellScript(); + } +}; + // 33395 Water Elemental's Freeze /// Updated 4.3.4 class spell_mage_water_elemental_freeze : public SpellScriptLoader @@ -695,7 +700,7 @@ class spell_mage_water_elemental_freeze : public SpellScriptLoader { PrepareSpellScript(spell_mage_water_elemental_freeze_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FINGERS_OF_FROST)) return false; @@ -742,18 +747,18 @@ class spell_mage_water_elemental_freeze : public SpellScriptLoader void AddSC_mage_spell_scripts() { new spell_mage_blast_wave(); + new spell_mage_blizzard(); new spell_mage_cold_snap(); new spell_mage_cone_of_cold(); new spell_mage_conjure_refreshment(); new spell_mage_frost_warding_trigger(); - new spell_mage_polymorph_cast_visual(); - new spell_mage_summon_water_elemental(); - new spell_mage_living_bomb(); - new spell_mage_blizzard(); new spell_mage_frostbolt(); + new spell_mage_living_bomb(); new spell_mage_ice_barrier(); new spell_mage_mana_shield(); new spell_mage_mage_ward(); + new spell_mage_polymorph_cast_visual(); new spell_mage_replenish_mana(); + new spell_mage_summon_water_elemental(); new spell_mage_water_elemental_freeze(); } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 96d053b4611..47592630a11 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -50,7 +50,7 @@ enum PaladinSpells SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988, SPELL_PALADIN_HAND_OF_SACRIFICE = 6940, - SPELL_PALADIN_DIVINE_SACRIFICE = 64205, + SPELL_PALADIN_DIVINE_SACRIFICE = 64205 }; // 31850 - Ardent Defender @@ -685,6 +685,7 @@ class spell_pal_righteous_defense : public SpellScriptLoader } }; +// 85285 - Sacred Shield class spell_pal_sacred_shield : public SpellScriptLoader { public: diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 43ee6572bf7..14d1c1a2f98 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -404,35 +404,6 @@ class spell_rog_recuperate : public SpellScriptLoader } }; -// 36554 - Shadowstep -class spell_rog_shadowstep : public SpellScriptLoader -{ - public: - spell_rog_shadowstep() : SpellScriptLoader("spell_rog_shadowstep") { } - - class spell_rog_shadowstep_SpellScript : public SpellScript - { - PrepareSpellScript(spell_rog_shadowstep_SpellScript); - - SpellCastResult CheckCast() - { - if (GetCaster()->HasUnitState(UNIT_STATE_ROOT)) - return SPELL_FAILED_ROOTED; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_rog_shadowstep_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rog_shadowstep_SpellScript(); - } -}; - // 5938 - Shiv class spell_rog_shiv : public SpellScriptLoader { @@ -482,6 +453,5 @@ void AddSC_rogue_spell_scripts() new spell_rog_preparation(); new spell_rog_prey_on_the_weak(); new spell_rog_recuperate(); - new spell_rog_shadowstep(); new spell_rog_shiv(); } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index c84b9236db7..e2e3f5a52e7 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -49,10 +49,11 @@ enum ShamanSpells enum ShamanSpellIcons { - SHAMAN_ICON_ID_SOOTHING_RAIN = 2011, - SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087 + SHAMAN_ICON_ID_SOOTHING_RAIN = 2011, + SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087 }; +// 52759 - Ancestral Awakening /// Updated 4.3.4 class spell_sha_ancestral_awakening_proc : public SpellScriptLoader { @@ -89,6 +90,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader } }; +// 2825 - Bloodlust /// Updated 4.3.4 class spell_sha_bloodlust : public SpellScriptLoader { @@ -134,7 +136,7 @@ class spell_sha_bloodlust : public SpellScriptLoader } }; -// 1064 Chain Heal +// 1064 - Chain Heal /// Updated 4.3.4 class spell_sha_chain_heal : public SpellScriptLoader { @@ -264,6 +266,7 @@ class EarthenPowerTargetSelector } }; +// 59566 - Earthen Power class spell_sha_earthen_power : public SpellScriptLoader { public: @@ -326,6 +329,7 @@ class spell_sha_fire_nova : public SpellScriptLoader } }; +// 8050 -Flame Shock /// Updated 4.3.4 class spell_sha_flame_shock : public SpellScriptLoader { @@ -373,6 +377,7 @@ class spell_sha_flame_shock : public SpellScriptLoader } }; +// 52041 - Healing Stream Totem /// Updated 4.3.4 class spell_sha_healing_stream_totem : public SpellScriptLoader { @@ -422,6 +427,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader } }; +// 32182 - Heroism /// Updated 4.3.4 class spell_sha_heroism : public SpellScriptLoader { @@ -467,6 +473,7 @@ class spell_sha_heroism : public SpellScriptLoader } }; +// 60103 - Lava Lash /// Updated 4.3.4 class spell_sha_lava_lash : public SpellScriptLoader { @@ -511,7 +518,7 @@ class spell_sha_lava_lash : public SpellScriptLoader } }; -// 16191 Mana Tide +// 16191 - Mana Tide /// Updated 4.3.4 class spell_sha_mana_tide_totem : public SpellScriptLoader { diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 655d1695029..21dea0b726b 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -57,6 +57,7 @@ enum WarlockSpellIcons WARLOCK_ICON_ID_MANA_FEED = 1982 }; +// 710 - Banish /// Updated 4.3.4 class spell_warl_banish : public SpellScriptLoader { @@ -111,7 +112,7 @@ class spell_warl_banish : public SpellScriptLoader } }; -// 6201 Create Healthstone +// 6201 - Create Healthstone class spell_warl_create_healthstone : public SpellScriptLoader { public: @@ -183,7 +184,8 @@ class spell_warl_create_healthstone : public SpellScriptLoader } }; -uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellScript::iTypes[8][3] = { +uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellScript::iTypes[8][3] = +{ { 5512, 19004, 19005}, // Minor Healthstone { 5511, 19006, 19007}, // Lesser Healthstone { 5509, 19008, 19009}, // Healthstone @@ -194,7 +196,7 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS {36892, 36893, 36894} // Fel Healthstone }; -// 603 Bane of Doom +// 603 - Bane of Doom /// Updated 4.3.4 class spell_warl_bane_of_doom : public SpellScriptLoader { @@ -205,7 +207,7 @@ class spell_warl_bane_of_doom : public SpellScriptLoader { PrepareAuraScript(spell_warl_curse_of_doom_AuraScript); - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_BANE_OF_DOOM_EFFECT)) return false; @@ -242,7 +244,7 @@ class spell_warl_bane_of_doom : public SpellScriptLoader } }; -// 48018 Demonic Circle: Summon +// 48018 - Demonic Circle: Summon /// Updated 4.3.4 class spell_warl_demonic_circle_summon : public SpellScriptLoader { @@ -295,7 +297,7 @@ class spell_warl_demonic_circle_summon : public SpellScriptLoader } }; -// 48020 Demonic Circle: Teleport +// 48020 - Demonic Circle: Teleport /// Updated 4.3.4 class spell_warl_demonic_circle_teleport : public SpellScriptLoader { @@ -330,7 +332,7 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader } }; -// 47193 Demonic Empowerment +// 47193 - Demonic Empowerment /// Updated 4.3.4 class spell_warl_demonic_empowerment : public SpellScriptLoader { @@ -393,7 +395,7 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader } }; -// 47422 Everlasting Affliction +// 47422 - Everlasting Affliction /// Updated 4.3.4 class spell_warl_everlasting_affliction : public SpellScriptLoader { @@ -424,7 +426,7 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader } }; -// 48181 Haunt +// 48181 - Haunt /// Updated 4.3.4 class spell_warl_haunt : public SpellScriptLoader { @@ -452,7 +454,7 @@ class spell_warl_haunt : public SpellScriptLoader { PrepareAuraScript(spell_warl_haunt_AuraScript); - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_HAUNT_HEAL)) return false; @@ -485,7 +487,7 @@ class spell_warl_haunt : public SpellScriptLoader } }; -// 755 Health Funnel +// 755 - Health Funnel /// Updated 4.3.4 class spell_warl_health_funnel : public SpellScriptLoader { @@ -529,7 +531,7 @@ class spell_warl_health_funnel : public SpellScriptLoader } }; -// 1454 Life Tap +// 1454 - Life Tap /// Updated 4.3.4 class spell_warl_life_tap : public SpellScriptLoader { @@ -545,7 +547,7 @@ class spell_warl_life_tap : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2)) return false; @@ -599,7 +601,7 @@ class spell_warl_life_tap : public SpellScriptLoader } }; -// 27285 Seed of Corruption +// 27285 - Seed of Corruption /// Updated 4.3.4 class spell_warl_seed_of_corruption : public SpellScriptLoader { @@ -628,7 +630,7 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader } }; -// 29858 Soulshatter +// 29858 - Soulshatter /// Updated 4.3.4 class spell_warl_soulshatter : public SpellScriptLoader { @@ -639,7 +641,7 @@ class spell_warl_soulshatter : public SpellScriptLoader { PrepareSpellScript(spell_warl_soulshatter_SpellScript); - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOULSHATTER)) return false; @@ -666,6 +668,7 @@ class spell_warl_soulshatter : public SpellScriptLoader } }; +// 30108, 34438, 34439, 35183 - Unstable Affliction /// Updated 4.3.4 class spell_warl_unstable_affliction : public SpellScriptLoader { @@ -676,7 +679,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader { PrepareAuraScript(spell_warl_unstable_affliction_AuraScript); - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL)) return false; diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 6b0ef00464b..909e90beaad 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -43,7 +43,7 @@ enum WarriorSpells enum WarriorSpellIcons { - WARRIOR_ICON_ID_SUDDEN_DEATH = 1989, + WARRIOR_ICON_ID_SUDDEN_DEATH = 1989, }; /// Updated 4.3.4 @@ -296,7 +296,7 @@ class spell_warr_last_stand : public SpellScriptLoader { PrepareSpellScript(spell_warr_last_stand_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) + bool Validate(SpellInfo const* /*spellInfo*/) { if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_LAST_STAND_TRIGGERED)) return false; -- cgit v1.2.3 From 7d6634e3636c6090139c1415d164329ff03bb95f Mon Sep 17 00:00:00 2001 From: Spp Date: Thu, 17 Jan 2013 08:48:04 +0100 Subject: Fix merge problem --- src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 50d16c44930..90f9c98497c 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -23,8 +23,6 @@ uint32 const EncounterCount = 5; -#define ZGScriptName "instance_zulgurub" - enum DataTypes { DATA_VENOXIS = 0, -- cgit v1.2.3 From 504ca4105adf0c35dd96576c25487b34cbca9891 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 19 Jan 2013 13:05:20 +0100 Subject: Scripts/Firelands: Fixed compile without PCH --- src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp index e4ab2265027..1dc70c5e505 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -18,6 +18,7 @@ #include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "PassiveAI.h" #include "SpellScript.h" #include "MoveSplineInit.h" #include "Cell.h" -- cgit v1.2.3 From 93c7f975b12641f2b36230c6c1eb711c1661b861 Mon Sep 17 00:00:00 2001 From: Northstrider Date: Mon, 21 Jan 2013 23:47:17 +0100 Subject: Scripts: implement Alizabal the misstress of hate Todo: use the rest of the texts and add the missing ones --- sql/updates/world/2013_01_21_00_world_misc.sql | 22 ++ src/server/game/Scripting/ScriptLoader.cpp | 4 + .../EasternKingdoms/BaradinHold/baradin_hold.h | 47 ++++ .../EasternKingdoms/BaradinHold/boss_alizabal.cpp | 268 +++++++++++++++++++++ .../BaradinHold/instance_baradin_hold.cpp | 169 +++++++++++++ src/server/scripts/EasternKingdoms/CMakeLists.txt | 2 + 6 files changed, 512 insertions(+) create mode 100644 sql/updates/world/2013_01_21_00_world_misc.sql create mode 100644 src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h create mode 100644 src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp create mode 100644 src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_21_00_world_misc.sql b/sql/updates/world/2013_01_21_00_world_misc.sql new file mode 100644 index 00000000000..e71a93d936a --- /dev/null +++ b/sql/updates/world/2013_01_21_00_world_misc.sql @@ -0,0 +1,22 @@ +-- Intro Areatrigger +DELETE FROM `areatrigger_scripts` WHERE `entry` = 7246; +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(7246, 'at_alizabal_intro'); + +UPDATE `creature_template` SET `scriptname` = 'boss_alizabal' WHERE `entry` = 55869; + +-- Todo: Find the Rest of the Texts and their meanings +DELETE FROM `creature_text` WHERE `entry` = 55869; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES +(55869, 1, 0, 'How I hate this place. My captors may be long dead.. but don\'t think I won\'t take it out on you, miserable treasure hunters!', 14, 0, 100, 0, 0, 25779, 'Alizabal - Intro'), +(55869, 2, 0, 'I hate adventurers.', 14, 0, 100, 0, 0, 25777, 'Alizabal - Aggro'), +(55869, 3, 0, 'I hate martyrs!', 14, 0, 100, 0, 0, 25786, 'Alizabal - Seething Hate'), +(55869, 4, 0, 'I hate armor!', 14, 0, 100, 0, 0, 25785, 'Alizabal - Skewer'), +(55869, 5, 0, 'Alizabal nailed $N firmly on the ground.', 41, 0, 100, 0, 0, 0, 'Alizabal - Skewer Announce'), +(55869, 6, 0, 'I hate standing still!', 14, 0, 100, 0, 0, 25791, 'Alizabal - Blade Dance'), +(55869, 7, 0, 'Feel my hatred!', 14, 0, 100, 0, 0, 25787, 'Alizabal - ???'), +(55869, 8, 0, 'My hate will consume you!', 14, 0, 100, 0, 0, 25789, 'Alizabal - ???'), +(55869, 9, 0, 'I hate you all!', 14, 0, 100, 0, 0, 25790, 'Alizabal - ???'), +(55869, 10, 0, 'I hate mercy.', 14, 0, 100, 0, 0, 25783, 'Alizabal - Slay 1'), +(55869, 11, 0, 'My hatred burns!', 14, 0, 100, 0, 0, 25788, 'Alizabal - ???'), +(55869, 12, 0, 'I hate... every.. one of you!', 14, 0, 100, 0, 0, 25778, 'Alizabal - Death'); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 633e17ff014..8cbc4b62424 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -97,6 +97,8 @@ void AddSC_boss_balinda(); void AddSC_boss_drekthar(); void AddSC_boss_galvangar(); void AddSC_boss_vanndar(); +void AddSC_boss_alizabal(); //Baradin Hold +void AddSC_instance_baradin_hold(); void AddSC_blackrock_depths(); //Blackrock Depths void AddSC_boss_ambassador_flamelash(); void AddSC_boss_anubshiah(); @@ -731,6 +733,8 @@ void AddEasternKingdomsScripts() AddSC_boss_drekthar(); AddSC_boss_galvangar(); AddSC_boss_vanndar(); + AddSC_boss_alizabal(); //Baradin Hold + AddSC_instance_baradin_hold(); AddSC_blackrock_depths(); //Blackrock Depths AddSC_boss_ambassador_flamelash(); AddSC_boss_anubshiah(); diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h new file mode 100644 index 00000000000..77554d29d15 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h @@ -0,0 +1,47 @@ +/* +* Copyright (C) 2008-2013 TrinityCore +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 3 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +*/ + +#ifndef DEF_BARADIN_HOLD_H_ +#define DEF_BARADIN_HOLD_H_ + +#define MAX_ENCOUNTERS 3 + +enum Creatures +{ + BOSS_ARGALOTH = 47120, + BOSS_OCCUTHAR = 52363, + BOSS_ALIZABAL = 55869, + + NPC_EYE_OF_OCCUTHAR = 52389, + NPC_FOCUS_FIRE_DUMMY = 52369, + NPC_OCCUTHAR_EYE = 52368, +}; + +enum Objects +{ + GO_ARGALOTH_DOOR = 207619, + GO_OCCUTHAR_DOOR = 208953, +}; + +enum Data +{ + DATA_ARGALOTH = 1, + DATA_OCCUTHAR = 2, + DATA_ALIZABAL = 3, +}; + +#endif diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp new file mode 100644 index 00000000000..ae1c5c03bd6 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -0,0 +1,268 @@ +/* +* Copyright (C) 2008-2013 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "baradin_hold.h" + +enum Texts +{ + SAY_INTRO = 1, + SAY_AGGRO = 2, + SAY_HATE = 3, + SAY_SKEWER = 4, + SAY_SKEWER_ANNOUNCE = 5, + SAY_BLADE_STORM = 6, + SAY_SLAY = 10, + SAY_DEATH = 12, +}; + +enum Spells +{ + SPELL_BLADE_DANCE = 105784, + SPELL_BLADE_DANCE_DUMMY = 105828, + SPELL_SEETHING_HATE = 105067, + SPELL_SKEWER = 104936, + SPELL_BERSERK = 47008, +}; + +enum Actions +{ + ACTION_INTRO = 1, +}; + +enum Points +{ + POINT_STORM = 1, +}; + +enum Events +{ + EVENT_RANDOM_CAST = 1, + EVENT_STOP_STORM = 2, + EVENT_MOVE_STORM = 3, + EVENT_CAST_STORM = 4, +}; + +class at_alizabal_intro : public AreaTriggerScript +{ + public: + at_alizabal_intro() : AreaTriggerScript("at_alizabal_intro") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* Alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) + Alizabal->AI()->DoAction(ACTION_INTRO); + return true; + } +}; + +class boss_alizabal : public CreatureScript +{ + public: + boss_alizabal() : CreatureScript("boss_alizabal") { } + + struct boss_alizabalAI : public BossAI + { + boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) + { + instance = creature->GetInstanceScript(); + Intro = false; + Hate = false; + Skewer = false; + } + + InstanceScript* instance; + bool Intro; + bool Hate; + bool Skewer; + + void Reset() + { + _Reset(); + Hate = false; + Skewer = false; + } + + void EnterCombat(Unit* who) + { + _EnterCombat(); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_RANDOM_CAST, 10000); + } + + void JustDied(Unit* killer) + { + _JustDied(); + Talk(SAY_DEATH); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void KilledUnit(Unit * who) + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void EnterEvadeMode() + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->GetMotionMaster()->MoveTargetedHome(); + _DespawnAtEvade(); + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_INTRO: + if (!Intro) + { + Talk(SAY_INTRO); + Intro = true; + } + break; + } + } + + void MovementInform(uint32 type, uint32 pointId) + { + switch (pointId) + { + case POINT_STORM: + events.ScheduleEvent(EVENT_CAST_STORM, 1); + break; + } + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RANDOM_CAST: + switch (urand(0, 1)) + { + case 0: + if (!Skewer) + { + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + { + DoCast(target, SPELL_SKEWER, true); + Talk(SAY_SKEWER); + Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); + } + Skewer = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (!Hate) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + { + DoCast(target, SPELL_SEETHING_HATE, true); + Talk(SAY_HATE); + } + Hate = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (Hate && Skewer) + { + Talk(SAY_BLADE_STORM); + DoCastAOE(SPELL_BLADE_DANCE_DUMMY); + DoCastAOE(SPELL_BLADE_DANCE); + events.ScheduleEvent(EVENT_RANDOM_CAST, 21000); + events.ScheduleEvent(EVENT_MOVE_STORM, 4050); + events.ScheduleEvent(EVENT_STOP_STORM, 13000); + } + break; + case 1: + if (!Hate) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + { + DoCast(target, SPELL_SEETHING_HATE, true); + Talk(SAY_HATE); + } + Hate = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (!Skewer) + { + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + { + DoCast(target, SPELL_SKEWER, true); + Talk(SAY_SKEWER); + Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); + } + Skewer = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (Hate && Skewer) + { + Talk(SAY_BLADE_STORM); + DoCastAOE(SPELL_BLADE_DANCE_DUMMY); + DoCastAOE(SPELL_BLADE_DANCE); + events.ScheduleEvent(EVENT_RANDOM_CAST, 21000); + events.ScheduleEvent(EVENT_MOVE_STORM, 4050); + events.ScheduleEvent(EVENT_STOP_STORM, 13000); + } + break; + } + break; + case EVENT_MOVE_STORM: + me->SetSpeed(MOVE_RUN, 4.0f); + me->SetSpeed(MOVE_WALK, 4.0f); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + me->GetMotionMaster()->MovePoint(POINT_STORM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); + events.ScheduleEvent(EVENT_MOVE_STORM, 4050); + break; + case EVENT_STOP_STORM: + me->RemoveAura(SPELL_BLADE_DANCE); + me->RemoveAura(SPELL_BLADE_DANCE_DUMMY); + me->SetSpeed(MOVE_WALK, 1.0f); + me->SetSpeed(MOVE_RUN, 1.14f); + me->GetMotionMaster()->MoveChase(me->getVictim()); + Hate = false; + Skewer = false; + break; + case EVENT_CAST_STORM: + DoCastAOE(SPELL_BLADE_DANCE); + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_alizabalAI(creature); + } +}; + +void AddSC_boss_alizabal() +{ + new boss_alizabal(); + new at_alizabal_intro(); +} diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp new file mode 100644 index 00000000000..6cc11504f2f --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -0,0 +1,169 @@ +/* +* Copyright (C) 2008-2013 TrinityCore +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 3 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +*/ + +#include"ScriptPCH.h" +#include"baradin_hold.h" + +DoorData const doorData[] = +{ + {GO_ARGALOTH_DOOR, DATA_ARGALOTH, DOOR_TYPE_ROOM, BOUNDARY_NONE}, + {GO_OCCUTHAR_DOOR, DATA_OCCUTHAR, DOOR_TYPE_ROOM, BOUNDARY_NONE}, +}; + +class instance_baradin_hold: public InstanceMapScript +{ +public: + instance_baradin_hold() : InstanceMapScript("instance_baradin_hold", 757) { } + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_baradin_hold_InstanceMapScript(map); + } + + struct instance_baradin_hold_InstanceMapScript: public InstanceScript + { + instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + { + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); + ArgalothGUID = 0; + OccutharGUID = 0; + AlizabalGUID = 0; + ArgalothDoor = 0; + OccutharDoor = 0; + } + + void Initialize() + { + } + + void OnCreatureCreate(Creature* creature) + { + switch(creature->GetEntry()) + { + case BOSS_ARGALOTH: + ArgalothGUID = creature->GetGUID(); + break; + case BOSS_OCCUTHAR: + OccutharGUID = creature->GetGUID(); + break; + case BOSS_ALIZABAL: + AlizabalGUID = creature->GetGUID(); + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch(go->GetEntry()) + { + case GO_ARGALOTH_DOOR: + ArgalothDoor = go->GetGUID(); + AddDoor(go, true); + break; + case GO_OCCUTHAR_DOOR: + OccutharDoor = go->GetGUID(); + AddDoor(go, true); + break; + } + } + + uint64 GetData64(uint32 data) const + { + switch (data) + { + case DATA_ARGALOTH: + return ArgalothGUID; + case DATA_OCCUTHAR: + return OccutharGUID; + case DATA_ALIZABAL: + return AlizabalGUID; + default: + break; + } + return NULL; + } + + void OnGameObjectRemove(GameObject* go) + { + switch(go->GetEntry()) + { + case GO_ARGALOTH_DOOR: + AddDoor(go, false); + break; + case GO_OCCUTHAR_DOOR: + AddDoor(go, false); + break; + } + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "B H " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(in); + + char dataHead1, dataHead2; + + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'B' && dataHead2 == 'H') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } + + } else OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + private: + uint64 ArgalothGUID; + uint64 OccutharGUID; + uint64 AlizabalGUID; + uint64 ArgalothDoor; + uint64 OccutharDoor; + }; +}; + +void AddSC_instance_baradin_hold() +{ + new instance_baradin_hold(); +} diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 15ead9b00f8..e782711bde2 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -17,6 +17,8 @@ set(scripts_STAT_SRCS EasternKingdoms/AlteracValley/boss_drekthar.cpp EasternKingdoms/AlteracValley/boss_vanndar.cpp EasternKingdoms/AlteracValley/alterac_valley.cpp + EasternKingdoms/BaradinHold/boss_alizabal.cpp + EasternKingdoms/BaradinHold/instance_baradin_hold.cpp EasternKingdoms/Scholomance/boss_the_ravenian.cpp EasternKingdoms/Scholomance/boss_instructor_malicia.cpp EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp -- cgit v1.2.3 From 8c64ceda796565bac68a433385de531e2f14dd66 Mon Sep 17 00:00:00 2001 From: Northstrider Date: Mon, 21 Jan 2013 23:49:23 +0100 Subject: Scripts: removed a unneeded header --- src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp index 6cc11504f2f..0e4907a3f82 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -15,7 +15,6 @@ * with this program. If not, see . */ -#include"ScriptPCH.h" #include"baradin_hold.h" DoorData const doorData[] = -- cgit v1.2.3 From 3bf7fcef55f1ce5d89798197c2e30b9a0ef929f2 Mon Sep 17 00:00:00 2001 From: Northstrider Date: Tue, 22 Jan 2013 00:02:08 +0100 Subject: Scripts: apply some TC codestyle to instance script --- .../BaradinHold/instance_baradin_hold.cpp | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp index 0e4907a3f82..9bbfebecf2c 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -39,11 +39,11 @@ public: { SetBossNumber(MAX_ENCOUNTERS); LoadDoorData(doorData); - ArgalothGUID = 0; - OccutharGUID = 0; - AlizabalGUID = 0; - ArgalothDoor = 0; - OccutharDoor = 0; + _argalothGUID = 0; + _occutharGUID = 0; + _alizabalGUID = 0; + _argalothDoor = 0; + _occutharDoor = 0; } void Initialize() @@ -55,13 +55,13 @@ public: switch(creature->GetEntry()) { case BOSS_ARGALOTH: - ArgalothGUID = creature->GetGUID(); + _argalothGUID = creature->GetGUID(); break; case BOSS_OCCUTHAR: - OccutharGUID = creature->GetGUID(); + _occutharGUID = creature->GetGUID(); break; case BOSS_ALIZABAL: - AlizabalGUID = creature->GetGUID(); + _alizabalGUID = creature->GetGUID(); break; } } @@ -71,11 +71,11 @@ public: switch(go->GetEntry()) { case GO_ARGALOTH_DOOR: - ArgalothDoor = go->GetGUID(); + _argalothDoor = go->GetGUID(); AddDoor(go, true); break; case GO_OCCUTHAR_DOOR: - OccutharDoor = go->GetGUID(); + _occutharDoor = go->GetGUID(); AddDoor(go, true); break; } @@ -86,11 +86,11 @@ public: switch (data) { case DATA_ARGALOTH: - return ArgalothGUID; + return _argalothGUID; case DATA_OCCUTHAR: - return OccutharGUID; + return _occutharGUID; case DATA_ALIZABAL: - return AlizabalGUID; + return _alizabalGUID; default: break; } @@ -154,11 +154,11 @@ public: } private: - uint64 ArgalothGUID; - uint64 OccutharGUID; - uint64 AlizabalGUID; - uint64 ArgalothDoor; - uint64 OccutharDoor; + uint64 _argalothGUID; + uint64 _occutharGUID; + uint64 _alizabalGUID; + uint64 _argalothDoor; + uint64 _occutharDoor; }; }; -- cgit v1.2.3 From da060b194895655370a44be6ce80406d19339eac Mon Sep 17 00:00:00 2001 From: Northstrider Date: Tue, 22 Jan 2013 00:07:36 +0100 Subject: Scripts: apply more TC codestyle --- .../scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp index ae1c5c03bd6..d7441d6311b 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -64,8 +64,8 @@ class at_alizabal_intro : public AreaTriggerScript bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) { if (InstanceScript* instance = player->GetInstanceScript()) - if (Creature* Alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) - Alizabal->AI()->DoAction(ACTION_INTRO); + if (Creature* alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) + alizabal->AI()->DoAction(ACTION_INTRO); return true; } }; @@ -79,13 +79,11 @@ class boss_alizabal : public CreatureScript { boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) { - instance = creature->GetInstanceScript(); Intro = false; Hate = false; Skewer = false; } - InstanceScript* instance; bool Intro; bool Hate; bool Skewer; @@ -97,7 +95,7 @@ class boss_alizabal : public CreatureScript Skewer = false; } - void EnterCombat(Unit* who) + void EnterCombat(Unit* /*who*/) { _EnterCombat(); Talk(SAY_AGGRO); @@ -105,14 +103,14 @@ class boss_alizabal : public CreatureScript events.ScheduleEvent(EVENT_RANDOM_CAST, 10000); } - void JustDied(Unit* killer) + void JustDied(Unit* /*killer*/) { _JustDied(); Talk(SAY_DEATH); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } - void KilledUnit(Unit * who) + void KilledUnit(Unit* who) { if (who->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); -- cgit v1.2.3 From d0d3d0f3c461d666305a646912b27c3516febc6d Mon Sep 17 00:00:00 2001 From: Xanvial Date: Wed, 23 Jan 2013 01:20:31 +0700 Subject: Scripts/Creature: Hira Snowdawn no longer sells Tome of Cold Weather Flight --- sql/updates/world/2013_01_21_01_world_misc_434.sql | 4 ++ src/server/scripts/Northrend/zone_dalaran.cpp | 45 ---------------------- 2 files changed, 4 insertions(+), 45 deletions(-) create mode 100644 sql/updates/world/2013_01_21_01_world_misc_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_21_01_world_misc_434.sql b/sql/updates/world/2013_01_21_01_world_misc_434.sql new file mode 100644 index 00000000000..dcf058b44e0 --- /dev/null +++ b/sql/updates/world/2013_01_21_01_world_misc_434.sql @@ -0,0 +1,4 @@ +-- NPC Hira Snowdawn no longer sells Tome of Cold Weather Flight +UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=31238; +DELETE FROM `gossip_menu_option` WHERE `menu_id`=10723 AND `id`=1; +DELETE FROM `npc_vendor` WHERE `entry`=31238 AND `item`=49177; diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index d16b6fe4588..6a104e28a1f 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -126,52 +126,7 @@ public: } }; -/*###### -## npc_hira_snowdawn -######*/ - -enum eHiraSnowdawn -{ - SPELL_COLD_WEATHER_FLYING = 54197 -}; - -#define GOSSIP_TEXT_TRAIN_HIRA "I seek training to ride a steed." - -class npc_hira_snowdawn : public CreatureScript -{ -public: - npc_hira_snowdawn() : CreatureScript("npc_hira_snowdawn") { } - - bool OnGossipHello(Player* player, Creature* creature) - { - if (!creature->isVendor() || !creature->isTrainer()) - return false; - - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_TRAIN_HIRA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - if (player->getLevel() >= 80 && player->HasSpell(SPELL_COLD_WEATHER_FLYING)) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_TRAIN) - player->GetSession()->SendTrainerList(creature->GetGUID()); - - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } -}; - void AddSC_dalaran() { new npc_mageguard_dalaran; - new npc_hira_snowdawn; } -- cgit v1.2.3 From e360f8747002e858c0a85945ff1b1c1e3cba1fc3 Mon Sep 17 00:00:00 2001 From: Xanvial Date: Wed, 23 Jan 2013 05:26:51 +0700 Subject: Scripts/Paladin: Templar's Verdict --- .../2013_01_22_01_world_spell_script_names_434.sql | 4 ++ src/server/scripts/Spells/spell_paladin.cpp | 73 +++++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/2013_01_22_01_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_22_01_world_spell_script_names_434.sql b/sql/updates/world/2013_01_22_01_world_spell_script_names_434.sql new file mode 100644 index 00000000000..cc74d504e94 --- /dev/null +++ b/sql/updates/world/2013_01_22_01_world_spell_script_names_434.sql @@ -0,0 +1,4 @@ +-- 85256 - Templar's Verdict +DELETE FROM `spell_script_names` WHERE `spell_id`=85256; +INSERT INTO `spell_script_names` VALUES +(85256,'spell_pal_templar_s_verdict'); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 47592630a11..7625ed548ac 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -50,7 +50,9 @@ enum PaladinSpells SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988, SPELL_PALADIN_HAND_OF_SACRIFICE = 6940, - SPELL_PALADIN_DIVINE_SACRIFICE = 64205 + SPELL_PALADIN_DIVINE_SACRIFICE = 64205, + + SPELL_PALADIN_DIVINE_PURPOSE_PROC = 90174 }; // 31850 - Ardent Defender @@ -719,6 +721,74 @@ class spell_pal_sacred_shield : public SpellScriptLoader } }; +// 85256 - Templar's Verdict +/// Updated 4.3.4 +class spell_pal_templar_s_verdict : public SpellScriptLoader +{ + public: + spell_pal_templar_s_verdict() : SpellScriptLoader("spell_pal_templar_s_verdict") { } + + class spell_pal_templar_s_verdict_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_templar_s_verdict_SpellScript); + + bool Validate (SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PURPOSE_PROC)) + return false; + + return true; + } + + bool Load() + { + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + return false; + + if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN) + return false; + + return true; + } + + void ChangeDamage(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + int32 damage = GetHitDamage(); + + if (caster->HasAura(SPELL_PALADIN_DIVINE_PURPOSE_PROC)) + damage *= 7.5; // 7.5*30% = 225% + else + { + switch (caster->GetPower(POWER_HOLY_POWER)) + { + case 0: // 1 Holy Power + damage = damage; + break; + case 1: // 2 Holy Power + damage *= 3; // 3*30 = 90% + break; + case 2: // 3 Holy Power + damage *= 7.5; // 7.5*30% = 225% + break; + } + } + + SetHitDamage(damage); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict_SpellScript::ChangeDamage, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_templar_s_verdict_SpellScript(); + } +}; + void AddSC_paladin_spell_scripts() { //new spell_pal_ardent_defender(); @@ -733,4 +803,5 @@ void AddSC_paladin_spell_scripts() new spell_pal_lay_on_hands(); new spell_pal_righteous_defense(); new spell_pal_sacred_shield(); + new spell_pal_templar_s_verdict(); } -- cgit v1.2.3 From a3d07b5e6ac45c23ec4116028c4bccae9307083b Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 26 Jan 2013 13:25:06 +0100 Subject: Core/Spells: Fixed Darkflight, Two Forms and Running Wild for worgens. Closes #8905 --- .../2013_01_26_00_world_spell_script_names_434.sql | 7 + src/server/game/Spells/Auras/SpellAuraEffects.cpp | 34 ++--- src/server/scripts/Spells/spell_generic.cpp | 157 +++++++++++++++++++++ 3 files changed, 181 insertions(+), 17 deletions(-) create mode 100644 sql/updates/world/2013_01_26_00_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_26_00_world_spell_script_names_434.sql b/sql/updates/world/2013_01_26_00_world_spell_script_names_434.sql new file mode 100644 index 00000000000..d0c4a61c422 --- /dev/null +++ b/sql/updates/world/2013_01_26_00_world_spell_script_names_434.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_running_wild'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_two_forms'; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_darkflight'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(87840,'spell_gen_running_wild'), +(68996,'spell_gen_two_forms'), +(68992,'spell_gen_darkflight'); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 186cdb8c552..18128660436 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2774,6 +2774,8 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo if (apply) { uint32 creatureEntry = GetMiscValue(); + uint32 displayId = 0; + uint32 vehicleId = 0; // Festive Holiday Mount if (target->HasAura(62061)) @@ -2784,30 +2786,28 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo creatureEntry = 15665; } - CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(creatureEntry); - if (!ci) + if (CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(creatureEntry)) { - sLog->outError(LOG_FILTER_SQL, "AuraMounted: `creature_template`='%u' not found in database (only need its modelid)", GetMiscValue()); - return; - } + uint32 team = 0; + if (target->GetTypeId() == TYPEID_PLAYER) + team = target->ToPlayer()->GetTeam(); - uint32 team = 0; - if (target->GetTypeId() == TYPEID_PLAYER) - team = target->ToPlayer()->GetTeam(); + displayId = ObjectMgr::ChooseDisplayId(team, ci); + sObjectMgr->GetCreatureModelRandomGender(&displayId); - uint32 displayID = ObjectMgr::ChooseDisplayId(team, ci); - sObjectMgr->GetCreatureModelRandomGender(&displayID); + vehicleId = ci->VehicleId; - //some spell has one aura of mount and one of vehicle - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (GetSpellInfo()->Effects[i].Effect == SPELL_EFFECT_SUMMON - && GetSpellInfo()->Effects[i].MiscValue == GetMiscValue()) - displayID = 0; + //some spell has one aura of mount and one of vehicle + for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + if (GetSpellInfo()->Effects[i].Effect == SPELL_EFFECT_SUMMON + && GetSpellInfo()->Effects[i].MiscValue == GetMiscValue()) + displayId = 0; + } - target->Mount(displayID, ci->VehicleId, GetMiscValue()); + target->Mount(displayId, vehicleId, creatureEntry); // cast speed aura - if (MountCapabilityEntry const* mountCapability = target->GetMountCapability(uint32(GetMiscValueB()))) + if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(GetAmount())) target->CastSpell(target, mountCapability->SpeedModSpell, true); } else diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 54cb346a033..d1d4f660172 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3163,6 +3163,160 @@ class spell_gen_replenishment : public SpellScriptLoader } }; +enum RunningWildMountIds +{ + RUNNING_WILD_MODEL_MALE = 29422, + RUNNING_WILD_MODEL_FEMALE = 29423, + SPELL_ALTERED_FORM = 97709, +}; + +class spell_gen_running_wild : public SpellScriptLoader +{ + public: + spell_gen_running_wild() : SpellScriptLoader("spell_gen_running_wild") { } + + class spell_gen_running_wild_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_running_wild_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_MALE)) + return false; + if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_FEMALE)) + return false; + return true; + } + + void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + PreventDefaultAction(); + + target->Mount(target->getGender() == GENDER_FEMALE ? RUNNING_WILD_MODEL_FEMALE : RUNNING_WILD_MODEL_MALE, 0, 0); + + // cast speed aura + if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount())) + target->CastSpell(target, mountCapability->SpeedModSpell, TRIGGERED_FULL_MASK); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_AuraScript::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL); + } + }; + + class spell_gen_running_wild_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_running_wild_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_ALTERED_FORM)) + return false; + return true; + } + + bool Load() + { + // Definitely not a good thing, but currently the only way to do something at cast start + // Should be replaced as soon as possible with a new hook: BeforeCastStart + GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK); + return false; + } + + void Register() + { + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_running_wild_AuraScript(); + } + + SpellScript* GetSpellScript() const + { + return new spell_gen_running_wild_SpellScript(); + } +}; + +class spell_gen_two_forms : public SpellScriptLoader +{ + public: + spell_gen_two_forms() : SpellScriptLoader("spell_gen_two_forms") { } + + class spell_gen_two_forms_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_two_forms_SpellScript); + + SpellCastResult CheckCast() + { + if (GetCaster()->isInCombat()) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM); + return SPELL_FAILED_CUSTOM_ERROR; + } + + // Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight) + if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM); + return SPELL_FAILED_CUSTOM_ERROR; + } + + return SPELL_CAST_OK; + } + + void HandleTransform(SpellEffIndex effIndex) + { + Unit* target = GetHitUnit(); + PreventHitDefaultEffect(effIndex); + if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM)) + target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM); + else // Basepoints 1 for this aura control whether to trigger transform transition animation or not. + target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_two_forms_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms_SpellScript::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_two_forms_SpellScript(); + } +}; + +class spell_gen_darkflight : public SpellScriptLoader +{ + public: + spell_gen_darkflight() : SpellScriptLoader("spell_gen_darkflight") { } + + class spell_gen_darkflight_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_darkflight_SpellScript); + + void TriggerTransform() + { + GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK); + } + + void Register() + { + AfterCast += SpellCastFn(spell_gen_darkflight_SpellScript::TriggerTransform); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_darkflight_SpellScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -3243,4 +3397,7 @@ void AddSC_generic_spell_scripts() new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance"); new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance"); new spell_gen_replenishment(); + new spell_gen_running_wild(); + new spell_gen_two_forms(); + new spell_gen_darkflight(); } -- cgit v1.2.3 From 98f01c2b12e6a2aeef8b2f9810e5a3cce9d5e475 Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 28 Jan 2013 02:54:27 +0000 Subject: Core/Misc: Fix compile errors introduced in previous merge There are probably other merge issues that got through, please report them --- src/server/game/Battlegrounds/Battleground.cpp | 6 ++- src/server/game/Handlers/BattleGroundHandler.cpp | 4 +- .../MovementGenerators/RandomMovementGenerator.cpp | 2 +- src/server/game/Movement/Spline/MoveSplineInit.cpp | 57 +++++++++++----------- .../scripts/Kalimdor/Firelands/boss_alysrazor.cpp | 2 +- src/server/scripts/Spells/spell_mage.cpp | 6 +-- src/server/scripts/Spells/spell_priest.cpp | 3 +- src/server/scripts/Spells/spell_warlock.cpp | 46 +++++++++++++---- src/server/scripts/Spells/spell_warrior.cpp | 41 ---------------- src/tools/CMakeLists.txt | 2 +- src/tools/map_extractor/System.cpp | 2 +- 11 files changed, 81 insertions(+), 90 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index e2ae9f50452..445d1295629 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -973,7 +973,7 @@ void Battleground::EndBattleground(uint32 winner) player->GetSession()->SendPacket(&pvpLogData); WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, player->GetBattlegroundQueueJoinTime(GetTypeID()), GetElapsedTime(), GetArenaType()); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(GetTypeID()), GetElapsedTime(), GetArenaType()); player->GetSession()->SendPacket(&data); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1); @@ -1204,9 +1204,13 @@ void Battleground::AddPlayer(Player* player) sBattlegroundMgr->BuildPlayerJoinedBattlegroundPacket(&data, player->GetGUID()); SendPacketToTeam(team, &data, player, false); + // BG Status packet + BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType()); + uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, queueSlot, STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(m_TypeID), GetElapsedTime(), GetArenaType()); player->GetSession()->SendPacket(&data); + player->RemoveAurasByType(SPELL_AURA_MOUNTED); // add arena specific auras diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index d28b67106c4..9955879d37a 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -538,7 +538,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) _player->CleanupAfterTaxiFlight(); } - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType(), ginfo.Team); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, _player, queueSlot, STATUS_IN_PROGRESS, _player->GetBattlegroundQueueJoinTime(bgTypeId), bg->GetElapsedTime(), bg->GetArenaType()); _player->GetSession()->SendPacket(&data); // remove battleground queue status from BGmgr @@ -622,7 +622,7 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/) { // this line is checked, i only don't know if GetElapsedTime() is changing itself after bg end! // send status in Battleground - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, i, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), arenaType, _player->GetBGTeam()); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, GetPlayer(), i, STATUS_IN_PROGRESS, _player->GetBattlegroundQueueJoinTime(bgTypeId), bg->GetElapsedTime(), arenaType); SendPacket(&data); continue; } diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 67136792fa6..723b0748494 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -165,7 +165,7 @@ bool RandomMovementGenerator::GetResetPos(Creature* creature, float& x creature->GetRespawnPosition(x, y, z, NULL, &radius); // use current if in range - if (creature.IsWithinDist2d(x, y, radius)) + if (creature->IsWithinDist2d(x, y, radius)) creature->GetPosition(x, y, z); return true; diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index a8ae40926b8..f7d876d7aa3 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -60,23 +60,22 @@ namespace Movement int32 MoveSplineInit::Launch() { - MoveSpline& move_spline = *unit.movespline; + MoveSpline& move_spline = *unit->movespline; - Location real_position(unit.GetPositionX(), unit.GetPositionY(), unit.GetPositionZMinusOffset(), unit.GetOrientation()); + Location real_position(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZMinusOffset(), unit->GetOrientation()); // Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes - if (unit->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && unit.GetTransGUID()) + if (unit->GetTransGUID()) { - transport = true; - real_position.x = unit.GetTransOffsetX(); - real_position.y = unit.GetTransOffsetY(); - real_position.z = unit.GetTransOffsetZ(); - real_position.orientation = unit.GetTransOffsetO(); + real_position.x = unit->GetTransOffsetX(); + real_position.y = unit->GetTransOffsetY(); + real_position.z = unit->GetTransOffsetZ(); + real_position.orientation = unit->GetTransOffsetO(); } // there is a big chance that current position is unknown if current state is not finalized, need compute it - // this also allows CalculatePath spline position and update map position in much greater intervals + // this also allows calculate spline position and update map position in much greater intervals // Don't compute for transport movement if the unit is in a motion between two transports - if (!move_spline.Finalized() && move_spline.onTransport == (unit.GetTransGUID() != 0)) + if (!move_spline.Finalized() && move_spline.onTransport == (unit->GetTransGUID() != 0)) real_position = move_spline.ComputePosition(); // should i do the things that user should do? - no. @@ -86,7 +85,7 @@ namespace Movement // correct first vertex args.path[0] = real_position; args.initialOrientation = real_position.orientation; - move_spline.onTransport = (unit.GetTransGUID() != 0); + move_spline.onTransport = (unit->GetTransGUID() != 0); uint32 moveFlags = unit->m_movementInfo.GetMovementFlags(); if (args.flags.walkmode) @@ -105,27 +104,27 @@ namespace Movement if (moveFlags & MOVEMENTFLAG_ROOT) moveFlags &= ~MOVEMENTFLAG_MASK_MOVING; - unit.m_movementInfo.SetMovementFlags(moveFlags); + unit->m_movementInfo.SetMovementFlags(moveFlags); move_spline.Initialize(args); WorldPacket data(SMSG_MONSTER_MOVE, 64); data.append(unit->GetPackGUID()); - if (unit.GetTransGUID()) + if (unit->GetTransGUID()) { data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT); - data.appendPackGUID(unit.GetTransGUID()); - data << int8(unit.GetTransSeat()); + data.appendPackGUID(unit->GetTransGUID()); + data << int8(unit->GetTransSeat()); } PacketBuilder::WriteMonsterMove(move_spline, data); - unit->SendMessageToSet(&data,true); - + unit->SendMessageToSet(&data, true); + return move_spline.Duration(); } void MoveSplineInit::Stop() { - MoveSpline& move_spline = *unit.movespline; + MoveSpline& move_spline = *unit->movespline; // No need to stop if we are not moving if (move_spline.Finalized()) @@ -133,30 +132,30 @@ namespace Movement Location loc = move_spline.ComputePosition(); args.flags = MoveSplineFlag::Done; - unit.m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); + unit->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); move_spline.Initialize(args); WorldPacket data(SMSG_MONSTER_MOVE, 64); - data.append(unit.GetPackGUID()); - if (unit.GetTransGUID()) + data.append(unit->GetPackGUID()); + if (unit->GetTransGUID()) { data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT); - data.appendPackGUID(unit.GetTransGUID()); - data << int8(unit.GetTransSeat()); + data.appendPackGUID(unit->GetTransGUID()); + data << int8(unit->GetTransSeat()); } PacketBuilder::WriteStopMovement(loc, args.splineId, data); - unit.SendMessageToSet(&data, true); + unit->SendMessageToSet(&data, true); } - MoveSplineInit::MoveSplineInit(Unit& m) : unit(m) + MoveSplineInit::MoveSplineInit(Unit* m) : unit(m) { args.splineId = splineIdGen.NewId(); // Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes - args.TransformForTransport = unit.HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && unit->GetTransGUID(); + args.TransformForTransport = unit->GetTransGUID(); // mix existing state into new - args.flags.walkmode = unit.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); - args.flags.flying = unit.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY); + args.flags.walkmode = unit->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); + args.flags.flying = unit->m_movementInfo.HasMovementFlag(MovementFlags(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY)); args.flags.smoothGroundPath = true; // enabled by default, CatmullRom mode or client config "pathSmoothing" will disable this } @@ -202,7 +201,7 @@ namespace Movement void MoveSplineInit::SetFall() { args.flags.EnableFalling(); - args.flags.fallingSlow = unit.HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); + args.flags.fallingSlow = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); } Vector3 TransportPathTransform::operator()(Vector3 input) diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp index 1dc70c5e505..b7816242afc 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -298,7 +298,7 @@ class npc_blazing_monstrosity : public CreatureScript passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // Hack to relocate vehicle on vehicle so exiting players are not moved under map - Movement::MoveSplineInit init(*passenger); + Movement::MoveSplineInit init(passenger); init.DisableTransportPathTransformations(); init.MoveTo(0.6654003f, 0.0f, 1.9815f); init.SetFacing(0.0f); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index e14327b0f36..7bd1753116b 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -688,7 +688,7 @@ class spell_mage_mage_ward : public SpellScriptLoader if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) { int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount()); - GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true); + GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true); } } @@ -720,14 +720,14 @@ class spell_mage_mana_shield : public SpellScriptLoader if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) { int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount()); - GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true); + GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true); } } void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) - GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK, true); + GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_R1, true); } void Register() diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 94b12818626..c2bfc913893 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -54,8 +54,9 @@ enum PriestSpells enum PriestSpellIcons { + PRIEST_ICON_ID_BORROWED_TIME = 2899, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021, - PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874 + PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874, }; // -47509 - Divine Aegis diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 31833524861..df415a7bb08 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -29,28 +29,29 @@ enum WarlockSpells { SPELL_WARLOCK_BANE_OF_DOOM_EFFECT = 18662, + SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662, + SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388, SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018, SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020, - SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388, - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435, - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444, + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435, + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443, SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181, SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106, + SPELL_WARLOCK_HAUNT = 48181, + SPELL_WARLOCK_HAUNT_HEAL = 48210, SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692, SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693, - SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703, - SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956, - SPELL_WARLOCK_HAUNT = 48181, - SPELL_WARLOCK_HAUNT_HEAL = 48210, + SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703, + SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704, SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553, - SPELL_WARLOCK_SOULSHATTER = 32835, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, + SPELL_WARLOCK_SOULSHATTER = 32835, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117 }; @@ -647,6 +648,34 @@ class spell_warl_life_tap : public SpellScriptLoader } }; +// 18541 - Ritual of Doom Effect +class spell_warl_ritual_of_doom_effect : public SpellScriptLoader +{ + public: + spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } + + class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, GetEffectValue(), true); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_ritual_of_doom_effect_SpellScript(); + } +}; + // 27285 - Seed of Corruption /// Updated 4.3.4 class spell_warl_seed_of_corruption : public SpellScriptLoader @@ -846,7 +875,6 @@ void AddSC_warlock_spell_scripts() new spell_warl_bane_of_doom(); new spell_warl_banish(); new spell_warl_create_healthstone(); - new spell_warl_curse_of_doom(); new spell_warl_demonic_circle_summon(); new spell_warl_demonic_circle_teleport(); new spell_warl_demonic_empowerment(); diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index c155c39ffdb..9e2cb8aad71 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -31,7 +31,6 @@ enum WarriorSpells SPELL_WARRIOR_BLOODTHIRST = 23885, SPELL_WARRIOR_BLOODTHIRST_DAMAGE = 23881, SPELL_WARRIOR_CHARGE = 34846, - SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE = 59653, SPELL_WARRIOR_DEEP_WOUNDS_RANK_1 = 12162, SPELL_WARRIOR_DEEP_WOUNDS_RANK_2 = 12850, SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 = 12868, @@ -43,7 +42,6 @@ enum WarriorSpells SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976, SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976, SPELL_WARRIOR_SLAM = 50782, - SPELL_WARRIOR_SLAM = 50783, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654, SPELL_WARRIOR_TAUNT = 355, SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859, @@ -201,44 +199,6 @@ class spell_warr_concussion_blow : public SpellScriptLoader } }; -// -58872 - Damage Shield -class spell_warr_damage_shield : public SpellScriptLoader -{ - public: - spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { } - - class spell_warr_damage_shield_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warr_damage_shield_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE)) - return false; - return true; - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - // % of amount blocked - int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_damage_shield_AuraScript(); - } -}; - /// Updated 4.3.4 class spell_warr_deep_wounds : public SpellScriptLoader { @@ -770,7 +730,6 @@ void AddSC_warrior_spell_scripts() new spell_warr_bloodthirst_heal(); new spell_warr_charge(); new spell_warr_concussion_blow(); - new spell_warr_damage_shield(); new spell_warr_deep_wounds(); new spell_warr_execute(); new spell_warr_improved_spell_reflection(); diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 49c17913c64..671de25dfd3 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -12,4 +12,4 @@ add_subdirectory(map_extractor) add_subdirectory(vmap4_assembler) add_subdirectory(vmap4_extractor) add_subdirectory(mmaps_generator) -add_subdirectory(mesh_extractor) +# add_subdirectory(mesh_extractor) diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 800328810a7..7b591ddfc85 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -901,7 +901,7 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/, { for (int j = 0; j < ADT_CELLS_PER_GRID; ++j) { - adt_MCNK * cell = cells->getMCNK(i,j); + adt_MCNK * cell = adt.cells[i][j]; if (!cell) continue; holes[i][j] = cell->holes; -- cgit v1.2.3 From 1b180e683e99078322a6f7a604a637cd6afe5b81 Mon Sep 17 00:00:00 2001 From: Nay Date: Tue, 29 Jan 2013 02:25:24 +0000 Subject: Core&DB/Trainers: Remove `trainer_spell` from `creature_template` since it is not longer necessary on Cata --- .../2013_01_29_00_world_creature_template_434.sql | 1 + src/server/game/Entities/Creature/Creature.cpp | 10 +-- src/server/game/Entities/Creature/Creature.h | 1 - src/server/game/Globals/ObjectMgr.cpp | 87 ++++++++++----------- src/server/scripts/Commands/cs_reload.cpp | 91 +++++++++++----------- .../Database/Implementation/WorldDatabase.cpp | 2 +- 6 files changed, 88 insertions(+), 104 deletions(-) create mode 100644 sql/updates/world/2013_01_29_00_world_creature_template_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_29_00_world_creature_template_434.sql b/sql/updates/world/2013_01_29_00_world_creature_template_434.sql new file mode 100644 index 00000000000..52954b2b9f5 --- /dev/null +++ b/sql/updates/world/2013_01_29_00_world_creature_template_434.sql @@ -0,0 +1 @@ +ALTER TABLE `creature_template` DROP `trainer_spell`; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index a2bed013640..0157cdf9130 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -925,15 +925,7 @@ bool Creature::isCanTrainingOf(Player* player, bool msg) const } break; case TRAINER_TYPE_TRADESKILLS: - if (GetCreatureTemplate()->trainer_spell && !player->HasSpell(GetCreatureTemplate()->trainer_spell)) - { - if (msg) - { - player->PlayerTalkClass->ClearMenus(); - player->PlayerTalkClass->SendGossipMenu(11031, GetGUID()); - } - return false; - } + // There's no Blacksmith specialization on Cataclysm, conditions are not required for tradeskills break; default: return false; // checked and error output at creature_template loading diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 9ac5deb56f5..255014a7bbf 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -109,7 +109,6 @@ struct CreatureTemplate uint32 dynamicflags; uint32 family; // enum CreatureFamily values (optional) uint32 trainer_type; - uint32 trainer_spell; uint32 trainer_class; uint32 trainer_race; float minrangedmg; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 05d986e3f92..c4721f3cc09 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -390,15 +390,15 @@ void ObjectMgr::LoadCreatureTemplates() "modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction_A, faction_H, npcflag, speed_walk, " // 22 23 24 25 26 27 28 29 30 31 32 33 34 "speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, " - // 35 36 37 38 39 40 41 42 43 44 - "dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, " - // 45 46 47 48 49 50 51 52 53 54 55 + // 35 36 37 38 39 40 41 42 43 + "dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, " + // 44 45 46 47 48 49 50 51 52 53 54 "type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, " - // 56 57 58 59 60 61 62 63 64 65 66 67 68 69 + // 55 56 59 60 61 62 63 64 65 66 67 68 69 70 "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " - // 70 71 72 73 74 75 76 77 78 79 80 81 + // 71 72 73 74 75 76 77 78 79 80 81 82 "InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, " - // 82 83 84 85 86 87 88 + // 83 84 85 86 87 88 89 " questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); @@ -459,48 +459,47 @@ void ObjectMgr::LoadCreatureTemplates() creatureTemplate.dynamicflags = fields[35].GetUInt32(); creatureTemplate.family = uint32(fields[36].GetUInt8()); creatureTemplate.trainer_type = uint32(fields[37].GetUInt8()); - creatureTemplate.trainer_spell = fields[38].GetUInt32(); - creatureTemplate.trainer_class = uint32(fields[39].GetUInt8()); - creatureTemplate.trainer_race = uint32(fields[40].GetUInt8()); - creatureTemplate.minrangedmg = fields[41].GetFloat(); - creatureTemplate.maxrangedmg = fields[42].GetFloat(); - creatureTemplate.rangedattackpower = uint32(fields[43].GetUInt16()); - creatureTemplate.type = uint32(fields[44].GetUInt8()); - creatureTemplate.type_flags = fields[45].GetUInt32(); - creatureTemplate.type_flags2 = fields[46].GetUInt32(); - creatureTemplate.lootid = fields[47].GetUInt32(); - creatureTemplate.pickpocketLootId = fields[48].GetUInt32(); - creatureTemplate.SkinLootId = fields[49].GetUInt32(); + creatureTemplate.trainer_class = uint32(fields[38].GetUInt8()); + creatureTemplate.trainer_race = uint32(fields[39].GetUInt8()); + creatureTemplate.minrangedmg = fields[40].GetFloat(); + creatureTemplate.maxrangedmg = fields[41].GetFloat(); + creatureTemplate.rangedattackpower = uint32(fields[42].GetUInt16()); + creatureTemplate.type = uint32(fields[43].GetUInt8()); + creatureTemplate.type_flags = fields[44].GetUInt32(); + creatureTemplate.type_flags2 = fields[45].GetUInt32(); + creatureTemplate.lootid = fields[46].GetUInt32(); + creatureTemplate.pickpocketLootId = fields[47].GetUInt32(); + creatureTemplate.SkinLootId = fields[48].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - creatureTemplate.resistance[i] = fields[50 + i - 1].GetInt16(); + creatureTemplate.resistance[i] = fields[49 + i - 1].GetInt16(); for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) - creatureTemplate.spells[i] = fields[56 + i].GetUInt32(); - - creatureTemplate.PetSpellDataId = fields[64].GetUInt32(); - creatureTemplate.VehicleId = fields[65].GetUInt32(); - creatureTemplate.mingold = fields[66].GetUInt32(); - creatureTemplate.maxgold = fields[67].GetUInt32(); - creatureTemplate.AIName = fields[68].GetString(); - creatureTemplate.MovementType = uint32(fields[69].GetUInt8()); - creatureTemplate.InhabitType = uint32(fields[70].GetUInt8()); - creatureTemplate.HoverHeight = fields[71].GetFloat(); - creatureTemplate.ModHealth = fields[72].GetFloat(); - creatureTemplate.ModMana = fields[73].GetFloat(); - creatureTemplate.ModManaExtra = fields[74].GetFloat(); - creatureTemplate.ModArmor = fields[75].GetFloat(); - creatureTemplate.RacialLeader = fields[76].GetBool(); + creatureTemplate.spells[i] = fields[55 + i].GetUInt32(); + + creatureTemplate.PetSpellDataId = fields[63].GetUInt32(); + creatureTemplate.VehicleId = fields[64].GetUInt32(); + creatureTemplate.mingold = fields[65].GetUInt32(); + creatureTemplate.maxgold = fields[66].GetUInt32(); + creatureTemplate.AIName = fields[67].GetString(); + creatureTemplate.MovementType = uint32(fields[68].GetUInt8()); + creatureTemplate.InhabitType = uint32(fields[69].GetUInt8()); + creatureTemplate.HoverHeight = fields[70].GetFloat(); + creatureTemplate.ModHealth = fields[71].GetFloat(); + creatureTemplate.ModMana = fields[72].GetFloat(); + creatureTemplate.ModManaExtra = fields[73].GetFloat(); + creatureTemplate.ModArmor = fields[74].GetFloat(); + creatureTemplate.RacialLeader = fields[75].GetBool(); for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - creatureTemplate.questItems[i] = fields[77 + i].GetUInt32(); + creatureTemplate.questItems[i] = fields[76 + i].GetUInt32(); - creatureTemplate.movementId = fields[83].GetUInt32(); - creatureTemplate.RegenHealth = fields[84].GetBool(); - creatureTemplate.equipmentId = fields[85].GetUInt32(); - creatureTemplate.MechanicImmuneMask = fields[86].GetUInt32(); - creatureTemplate.flags_extra = fields[87].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[88].GetCString()); + creatureTemplate.movementId = fields[82].GetUInt32(); + creatureTemplate.RegenHealth = fields[83].GetBool(); + creatureTemplate.equipmentId = fields[84].GetUInt32(); + creatureTemplate.MechanicImmuneMask = fields[85].GetUInt32(); + creatureTemplate.flags_extra = fields[86].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[87].GetCString()); ++count; } @@ -662,12 +661,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) continue; } - if (cInfo->trainer_spell != difficultyInfo->trainer_spell) - { - sLog->outError(LOG_FILTER_SQL, "Creature (Entry: %u) has different `trainer_spell` in difficulty %u mode (Entry: %u).", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]); - continue; - } - if (!difficultyInfo->AIName.empty()) { sLog->outError(LOG_FILTER_SQL, "Creature (Entry: %u) lists difficulty %u mode entry %u with `AIName` filled in. `AIName` of difficulty 0 mode creature is always used instead.", diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index f5f998bbf0d..52721f9866d 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -452,54 +452,53 @@ public: cInfo->dynamicflags = fields[33].GetUInt32(); cInfo->family = fields[34].GetUInt8(); cInfo->trainer_type = fields[35].GetUInt8(); - cInfo->trainer_spell = fields[36].GetUInt32(); - cInfo->trainer_class = fields[37].GetUInt8(); - cInfo->trainer_race = fields[38].GetUInt8(); - cInfo->minrangedmg = fields[39].GetFloat(); - cInfo->maxrangedmg = fields[40].GetFloat(); - cInfo->rangedattackpower = fields[41].GetUInt16(); - cInfo->type = fields[42].GetUInt8(); - cInfo->type_flags = fields[43].GetUInt32(); - cInfo->lootid = fields[44].GetUInt32(); - cInfo->pickpocketLootId = fields[45].GetUInt32(); - cInfo->SkinLootId = fields[46].GetUInt32(); + cInfo->trainer_class = fields[36].GetUInt8(); + cInfo->trainer_race = fields[37].GetUInt8(); + cInfo->minrangedmg = fields[38].GetFloat(); + cInfo->maxrangedmg = fields[39].GetFloat(); + cInfo->rangedattackpower = fields[40].GetUInt16(); + cInfo->type = fields[41].GetUInt8(); + cInfo->type_flags = fields[42].GetUInt32(); + cInfo->lootid = fields[43].GetUInt32(); + cInfo->pickpocketLootId = fields[44].GetUInt32(); + cInfo->SkinLootId = fields[45].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - cInfo->resistance[i] = fields[47 + i -1].GetUInt16(); - - cInfo->spells[0] = fields[53].GetUInt32(); - cInfo->spells[1] = fields[54].GetUInt32(); - cInfo->spells[2] = fields[55].GetUInt32(); - cInfo->spells[3] = fields[56].GetUInt32(); - cInfo->spells[4] = fields[57].GetUInt32(); - cInfo->spells[5] = fields[58].GetUInt32(); - cInfo->spells[6] = fields[59].GetUInt32(); - cInfo->spells[7] = fields[60].GetUInt32(); - cInfo->PetSpellDataId = fields[61].GetUInt32(); - cInfo->VehicleId = fields[62].GetUInt32(); - cInfo->mingold = fields[63].GetUInt32(); - cInfo->maxgold = fields[64].GetUInt32(); - cInfo->AIName = fields[65].GetString(); - cInfo->MovementType = fields[66].GetUInt8(); - cInfo->InhabitType = fields[67].GetUInt8(); - cInfo->HoverHeight = fields[68].GetFloat(); - cInfo->ModHealth = fields[69].GetFloat(); - cInfo->ModMana = fields[70].GetFloat(); - cInfo->ModManaExtra = fields[71].GetFloat(); - cInfo->ModArmor = fields[72].GetFloat(); - cInfo->RacialLeader = fields[73].GetBool(); - cInfo->questItems[0] = fields[74].GetUInt32(); - cInfo->questItems[1] = fields[75].GetUInt32(); - cInfo->questItems[2] = fields[76].GetUInt32(); - cInfo->questItems[3] = fields[77].GetUInt32(); - cInfo->questItems[4] = fields[78].GetUInt32(); - cInfo->questItems[5] = fields[79].GetUInt32(); - cInfo->movementId = fields[80].GetUInt32(); - cInfo->RegenHealth = fields[81].GetBool(); - cInfo->equipmentId = fields[82].GetUInt32(); - cInfo->MechanicImmuneMask = fields[83].GetUInt32(); - cInfo->flags_extra = fields[84].GetUInt32(); - cInfo->ScriptID = sObjectMgr->GetScriptId(fields[85].GetCString()); + cInfo->resistance[i] = fields[46 + i -1].GetUInt16(); + + cInfo->spells[0] = fields[52].GetUInt32(); + cInfo->spells[1] = fields[53].GetUInt32(); + cInfo->spells[2] = fields[54].GetUInt32(); + cInfo->spells[3] = fields[55].GetUInt32(); + cInfo->spells[4] = fields[56].GetUInt32(); + cInfo->spells[5] = fields[57].GetUInt32(); + cInfo->spells[6] = fields[58].GetUInt32(); + cInfo->spells[7] = fields[59].GetUInt32(); + cInfo->PetSpellDataId = fields[60].GetUInt32(); + cInfo->VehicleId = fields[61].GetUInt32(); + cInfo->mingold = fields[62].GetUInt32(); + cInfo->maxgold = fields[63].GetUInt32(); + cInfo->AIName = fields[64].GetString(); + cInfo->MovementType = fields[65].GetUInt8(); + cInfo->InhabitType = fields[66].GetUInt8(); + cInfo->HoverHeight = fields[67].GetFloat(); + cInfo->ModHealth = fields[68].GetFloat(); + cInfo->ModMana = fields[69].GetFloat(); + cInfo->ModManaExtra = fields[70].GetFloat(); + cInfo->ModArmor = fields[71].GetFloat(); + cInfo->RacialLeader = fields[72].GetBool(); + cInfo->questItems[0] = fields[73].GetUInt32(); + cInfo->questItems[1] = fields[74].GetUInt32(); + cInfo->questItems[2] = fields[75].GetUInt32(); + cInfo->questItems[3] = fields[76].GetUInt32(); + cInfo->questItems[4] = fields[77].GetUInt32(); + cInfo->questItems[5] = fields[78].GetUInt32(); + cInfo->movementId = fields[79].GetUInt32(); + cInfo->RegenHealth = fields[80].GetBool(); + cInfo->equipmentId = fields[81].GetUInt32(); + cInfo->MechanicImmuneMask = fields[82].GetUInt32(); + cInfo->flags_extra = fields[83].GetUInt32(); + cInfo->ScriptID = sObjectMgr->GetScriptId(fields[84].GetCString()); sObjectMgr->CheckCreatureTemplate(cInfo); } diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index 899ed51da0d..185ac647e33 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -78,7 +78,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); -- cgit v1.2.3 From d92347bc22fb213e19dcd0739e85970c1e74d319 Mon Sep 17 00:00:00 2001 From: Souler Date: Tue, 29 Jan 2013 15:10:47 +0000 Subject: Scripts/Mage: Unsummon current mage's Water Elemental before summoning a new one Closes #8433 --- src/server/scripts/Spells/spell_mage.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 7bd1753116b..ddd65b26496 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -25,6 +25,7 @@ #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "Pet.h" enum MageSpells { @@ -904,6 +905,14 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); + + if (Player* player = caster->ToPlayer()) + if (Guardian* elemental = player->GetGuardianPet()) + // Check if the pet we are going to unsummon is the mage's water elemental + if (elemental->GetEntry() == sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)->Effects[EFFECT_0].MiscValue || + elemental->GetEntry() == sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)->Effects[EFFECT_0].MiscValue) + elemental->UnSummon(); + // Glyph of Eternal Water if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true); -- cgit v1.2.3 From a4b1f1c45fc8a1e28b76ffbbd0e73e6452c0785b Mon Sep 17 00:00:00 2001 From: Warpten Date: Thu, 31 Jan 2013 00:20:54 +0100 Subject: Spells/Warlock: Fixed Conflagrate, Demon Soul and Immolate. --- .../2013_01_31_00_world_spell_script_names_434.sql | 6 + src/server/scripts/Spells/spell_warlock.cpp | 150 +++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 sql/updates/world/2013_01_31_00_world_spell_script_names_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_01_31_00_world_spell_script_names_434.sql b/sql/updates/world/2013_01_31_00_world_spell_script_names_434.sql new file mode 100644 index 00000000000..14bf9f1832a --- /dev/null +++ b/sql/updates/world/2013_01_31_00_world_spell_script_names_434.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_warl_demon_soul', 'spell_warl_conflagrate', 'spell_warl_fel_flame'); +DELETE FROM `spell_script_names` WHERE `spell_id`=77799 OR ScriptName="spell_warlock_fel_flame"; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(17962, 'spell_warl_conflagrate'); +(77799, 'spell_warl_fel_flame'); +(77801, 'spell_warl_demon_soul'); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index df415a7bb08..92d8e940a22 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -25,6 +25,7 @@ #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "SpellAuras.h" enum WarlockSpells { @@ -38,10 +39,16 @@ enum WarlockSpells SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443, + SPELL_WARLOCK_DEMON_SOUL_IMP = 79459, + SPELL_WARLOCK_DEMON_SOUL_FELHUNTER = 79460, + SPELL_WARLOCK_DEMON_SOUL_FELGUARD = 79452, + SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS = 79453, + SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER = 79454, SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181, SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106, SPELL_WARLOCK_HAUNT = 48181, SPELL_WARLOCK_HAUNT_HEAL = 48210, + SPELL_WARLOCK_IMMOLATE = 348, SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692, SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955, @@ -52,6 +59,7 @@ enum WarlockSpells SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, SPELL_WARLOCK_SOULSHATTER = 32835, + SPELL_WARLOCK_UNSTABLE_AFFLICTION = 30108, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117 }; @@ -116,6 +124,41 @@ class spell_warl_banish : public SpellScriptLoader } }; +// 17962 - Conflagrate - Updated to 4.3.4 +class spell_warl_conflagrate : public SpellScriptLoader +{ + public: + spell_warl_conflagrate() : SpellScriptLoader("spell_warl_conflagrate") { } + + class spell_warl_conflagrate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_conflagrate_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMMOLATE)) + return false; + return true; + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID())) + SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()))); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_conflagrate_SpellScript(); + } +}; + // 6201 - Create Healthstone class spell_warl_create_healthstone : public SpellScriptLoader { @@ -336,6 +379,73 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader } }; +// 77801 - Demon Soul - Updated to 4.3.4 +class spell_warl_demon_soul : public SpellScriptLoader +{ + public: + spell_warl_demon_soul() : SpellScriptLoader("spell_warl_demon_soul") { } + + class spell_warl_demon_soul_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_demon_soul_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_IMP)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELHUNTER)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELGUARD)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER)) + return false; + return true; + } + + void OnHitTarget(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Creature* targetCreature = GetHitCreature()) + { + if (targetCreature->isPet()) + { + CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); + switch (ci->family) + { + case CREATURE_FAMILY_SUCCUBUS: + caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS); + break; + case CREATURE_FAMILY_VOIDWALKER: + caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER); + break; + case CREATURE_FAMILY_FELGUARD: + caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELGUARD); + break; + case CREATURE_FAMILY_FELHUNTER: + caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELHUNTER); + break; + case CREATURE_FAMILY_IMP: + caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_IMP); + break; + } + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_demon_soul_SpellScript::OnHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_demon_soul_SpellScript; + } +}; + // 47193 - Demonic Empowerment /// Updated 4.3.4 class spell_warl_demonic_empowerment : public SpellScriptLoader @@ -430,6 +540,43 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader } }; +// 77799 - Fel Flame - Updated to 4.3.4 +class spell_warl_fel_flame : public SpellScriptLoader +{ + public: + spell_warl_fel_flame() : SpellScriptLoader("spell_warl_fel_flame") { } + + class spell_warl_fel_flame_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_fel_flame_SpellScript); + + void OnHitTarget(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + Aura* aura = target->GetAura(SPELL_WARLOCK_UNSTABLE_AFFLICTION, caster->GetGUID()); + if (!aura) + aura = target->GetAura(SPELL_WARLOCK_IMMOLATE, caster->GetGUID()); + + if (!aura) + return; + + int32 newDuration = aura->GetDuration() + GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 1000; + aura->SetDuration(std::min(newDuration, aura->GetMaxDuration())); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_fel_flame_SpellScript::OnHitTarget, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_fel_flame_SpellScript; + } +}; + // -47230 - Fel Synergy class spell_warl_fel_synergy : public SpellScriptLoader { @@ -874,11 +1021,14 @@ void AddSC_warlock_spell_scripts() { new spell_warl_bane_of_doom(); new spell_warl_banish(); + new spell_warl_conflagrate(); new spell_warl_create_healthstone(); new spell_warl_demonic_circle_summon(); new spell_warl_demonic_circle_teleport(); new spell_warl_demonic_empowerment(); + new spell_warl_demon_soul(); new spell_warl_everlasting_affliction(); + new spell_warl_fel_flame(); new spell_warl_fel_synergy(); new spell_warl_haunt(); new spell_warl_health_funnel(); -- cgit v1.2.3 From 9a0525757adc6ddf59d7e942cddfdd0185a896d8 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Thu, 31 Jan 2013 00:35:33 +0100 Subject: Core: Fix some warnings --- src/server/game/Guilds/Guild.cpp | 2 +- src/server/game/Handlers/ChatHandler.cpp | 6 +++--- src/server/game/Spells/SpellInfo.cpp | 2 +- src/server/scripts/Spells/spell_mage.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index cef21863b60..04169bb7b7d 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2520,7 +2520,7 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std:: if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK)) { WorldPacket data; - ChatHandler::FillMessageData(&data, session, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, CHAT_MSG_ADDON, NULL, 0, msg.c_str(), NULL, prefix.c_str()); + ChatHandler::FillMessageData(&data, session, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, uint32(CHAT_MSG_ADDON), NULL, 0, msg.c_str(), NULL, prefix.c_str()); for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if (Player* player = itr->second->FindPlayer()) if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 1105886813a..eef049fdb66 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -600,7 +600,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) return; // Weird way to log stuff... - sScriptMgr->OnPlayerChat(sender, CHAT_MSG_ADDON, LANG_ADDON, message); + sScriptMgr->OnPlayerChat(sender, uint32(CHAT_MSG_ADDON), uint32(LANG_ADDON), message); } // Disabled addon channel? @@ -616,7 +616,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) return; WorldPacket data; - ChatHandler::FillMessageData(&data, this, type, LANG_ADDON, "", 0, message.c_str(), NULL); + ChatHandler::FillMessageData(&data, this, type, uint32(LANG_ADDON), "", 0, message.c_str(), NULL); group->BroadcastAddonMessagePacket(&data, prefix, false); break; } @@ -649,7 +649,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) break; WorldPacket data; - ChatHandler::FillMessageData(&data, this, type, LANG_ADDON, "", 0, message.c_str(), NULL, prefix.c_str()); + ChatHandler::FillMessageData(&data, this, type, uint32(LANG_ADDON), "", 0, message.c_str(), NULL, prefix.c_str()); group->BroadcastAddonMessagePacket(&data, prefix, true, -1, group->GetMemberGroup(sender->GetGUID())); break; } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index e85d0e2bfe6..c5c8156d38b 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -386,7 +386,7 @@ bool SpellEffectInfo::IsAura() const bool SpellEffectInfo::IsAura(AuraType aura) const { - return IsAura() && AuraType(ApplyAuraName) == uint32(aura); + return IsAura() && ApplyAuraName == uint32(aura); } bool SpellEffectInfo::IsTargetingArea() const diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index ddd65b26496..cd3673c17de 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -909,8 +909,8 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader if (Player* player = caster->ToPlayer()) if (Guardian* elemental = player->GetGuardianPet()) // Check if the pet we are going to unsummon is the mage's water elemental - if (elemental->GetEntry() == sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)->Effects[EFFECT_0].MiscValue || - elemental->GetEntry() == sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)->Effects[EFFECT_0].MiscValue) + if (elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)->Effects[EFFECT_0].MiscValue) || + elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)->Effects[EFFECT_0].MiscValue)) elemental->UnSummon(); // Glyph of Eternal Water -- cgit v1.2.3 From 943c866da97871d382db2f52e965ed38558695b0 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Thu, 7 Feb 2013 00:02:22 +0100 Subject: Core: Whitespace cleanup --- src/server/game/Accounts/RBAC.h | 38 +++++++++++----------- src/server/game/Globals/ObjectMgr.cpp | 14 ++++---- src/server/game/Globals/ObjectMgr.h | 10 +++--- src/server/game/Movement/Spline/MoveSplineInit.cpp | 2 +- src/server/game/World/World.cpp | 2 +- src/server/scripts/Commands/cs_rbac.cpp | 6 ++-- .../EasternKingdoms/BaradinHold/boss_alizabal.cpp | 6 ++-- .../EasternKingdoms/zone_western_plaguelands.cpp | 2 +- .../ChamberOfAspects/RubySanctum/boss_halion.cpp | 2 +- src/server/scripts/Northrend/zone_icecrown.cpp | 2 +- .../scripts/Outland/BlackTemple/boss_supremus.cpp | 2 +- .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 2 +- src/server/scripts/Spells/spell_paladin.cpp | 4 +-- src/server/shared/Logging/AppenderFile.cpp | 2 +- src/server/worldserver/worldserver.conf.dist | 2 +- 15 files changed, 48 insertions(+), 48 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 5420df29d17..d2c76b71801 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -161,10 +161,10 @@ class RBACData: public RBACObject * @name HasPermission * @brief Checks if certain action is allowed * - * Checks if certain action can be performed. + * Checks if certain action can be performed. * * @return grant or deny action - * + * * Example Usage: * @code * bool Player::CanJoinArena(Battleground* bg) @@ -175,7 +175,7 @@ class RBACData: public RBACObject */ bool HasPermission(uint32 permission) { return _globalPerms.test(permission); } - // Functions enabled to be used by command system + // Functions enabled to be used by command system /// Returns all the granted permissions (after computation) RBACPermissionContainer const& GetPermissions() const { return _globalPerms; } /// Returns all the granted permissions @@ -197,12 +197,12 @@ class RBACData: public RBACObject * No save to db action will be performed. * * Fails if group Id does not exists or group already present - * + * * @param groupId group to be added * @param realmId realm affected * * @return Success or failure (with reason) to add the group - * + * * Example Usage: * @code * // previously defined "RBACData* rbac" with proper initialization @@ -222,12 +222,12 @@ class RBACData: public RBACObject * "all realms (-1)" in addition to the realm specified * * Fails if group not present - * + * * @param groupId group to be removed * @param realmId realm affected * * @return Success or failure (with reason) to remove the group - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 groupId = 2; @@ -245,12 +245,12 @@ class RBACData: public RBACObject * No save to db action will be performed. * * Fails if role Id does not exists or role already granted or denied - * + * * @param roleId role to be granted * @param realmId realm affected * * @return Success or failure (with reason) to grant the role - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 roleId = 2; @@ -268,12 +268,12 @@ class RBACData: public RBACObject * No save to db action will be performed. * * Fails if role Id does not exists or role already granted or denied - * + * * @param roleId role to be denied * @param realmId realm affected * * @return Success or failure (with reason) to deny the role - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 roleId = 2; @@ -292,12 +292,12 @@ class RBACData: public RBACObject * "all realms (-1)" in addition to the realm specified * * Fails if role not present - * + * * @param roleId role to be removed * @param realmId realm affected * * @return Success or failure (with reason) to remove the role - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 roleId = 2; @@ -315,12 +315,12 @@ class RBACData: public RBACObject * No save to db action will be performed. * * Fails if permission Id does not exists or permission already granted or denied - * + * * @param permissionId permission to be granted * @param realmId realm affected * * @return Success or failure (with reason) to grant the permission - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 permissionId = 2; @@ -338,12 +338,12 @@ class RBACData: public RBACObject * No save to db action will be performed. * * Fails if permission Id does not exists or permission already granted or denied - * + * * @param permissionId permission to be denied * @param realmId realm affected * * @return Success or failure (with reason) to deny the permission - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 permissionId = 2; @@ -362,12 +362,12 @@ class RBACData: public RBACObject * "all realms (-1)" in addition to the realm specified * * Fails if permission not present - * + * * @param permissionId permission to be removed * @param realmId realm affected * * @return Success or failure (with reason) to remove the permission - * + * * Example Usage: * // previously defined "RBACData* rbac" with proper initialization * uint32 permissionId = 2; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 043afdf4687..8597b6098a9 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -292,18 +292,18 @@ void ObjectMgr::AddLocaleString(std::string const& s, LocaleConstant locale, Str void ObjectMgr::LoadGraveyardOrientations() { uint32 oldMSTime = getMSTime(); - + _graveyardOrientations.clear(); - + QueryResult result = WorldDatabase.Query("SELECT id, orientation FROM graveyard_orientation"); - + if (!result) return; - + do { Field* fields = result->Fetch(); - + uint32 id = fields[0].GetUInt32(); if (!sWorldSafeLocsStore.LookupEntry(id)) { @@ -311,9 +311,9 @@ void ObjectMgr::LoadGraveyardOrientations() continue; } _graveyardOrientations[id] = fields[1].GetFloat(); - + } while (result->NextRow()); - + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %lu graveyard orientations in %u ms", (unsigned long)_graveyardOrientations.size(), GetMSTimeDiffToNow(oldMSTime)); } diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 563b218c55c..8c14f902c1f 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1118,16 +1118,16 @@ class ObjectMgr return &iter->second; } - + float const* GetGraveyardOrientation(uint32 id) const { GraveyardOrientationContainer::const_iterator iter = _graveyardOrientations.find(id); if (iter != _graveyardOrientations.end()) return &iter->second; - + return NULL; } - + void AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, uint8 type, bool persist = true); // for event bool RemoveVendorItem(uint32 entry, uint32 item, uint8 type, bool persist = true); // for event bool IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 ptime, uint32 ExtendedCost, uint8 type, Player* player = NULL, std::set* skip_vendors = NULL, uint32 ORnpcflag = 0) const; @@ -1163,7 +1163,7 @@ class ObjectMgr // for wintergrasp only GraveYardContainer GraveYardStore; - + static void AddLocaleString(std::string const& s, LocaleConstant locale, StringVector& data); static inline void GetLocaleString(const StringVector& data, int loc_idx, std::string& value) { @@ -1325,7 +1325,7 @@ class ObjectMgr CacheVendorItemContainer _cacheVendorItemStore; CacheTrainerSpellContainer _cacheTrainerSpellStore; - + GraveyardOrientationContainer _graveyardOrientations; std::set _difficultyEntries[MAX_DIFFICULTY - 1]; // already loaded difficulty 1 value in creatures, used in CheckCreatureTemplate diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index f7d876d7aa3..249f25a6353 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -118,7 +118,7 @@ namespace Movement PacketBuilder::WriteMonsterMove(move_spline, data); unit->SendMessageToSet(&data, true); - + return move_spline.Duration(); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index ef0c9b64475..4a1d1566af1 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1548,7 +1548,7 @@ void World::SetInitialWorldSettings() sObjectMgr->LoadGraveyardZones(); sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Graveyard Orientations..."); - sObjectMgr->LoadGraveyardOrientations(); + sObjectMgr->LoadGraveyardOrientations(); sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading spell pet auras..."); sSpellMgr->LoadSpellPetAuras(); diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp index fb21def4c02..092aabb0045 100644 --- a/src/server/scripts/Commands/cs_rbac.cpp +++ b/src/server/scripts/Commands/cs_rbac.cpp @@ -674,7 +674,7 @@ public: handler->SetSentErrorMessage(true); return false; } - + handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_GROUPS_HEADER)); handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str()); handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER)); @@ -719,7 +719,7 @@ public: handler->SetSentErrorMessage(true); return false; } - + handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER)); handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str()); handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER)); @@ -765,7 +765,7 @@ public: handler->SetSentErrorMessage(true); return false; } - + handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER)); handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str()); } diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp index fe7f3f47161..3c6369003ec 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it @@ -79,7 +79,7 @@ class boss_alizabal : public CreatureScript { public: boss_alizabal() : CreatureScript("boss_alizabal") { } - + struct boss_alizabalAI : public BossAI { boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) @@ -253,7 +253,7 @@ class boss_alizabal : public CreatureScript break; } } - + DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 6fa3401bcc9..c8bc82be245 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -256,7 +256,7 @@ public: struct npc_andorhal_towerAI : public ScriptedAI { - npc_andorhal_towerAI(Creature* creature) : ScriptedAI(creature) + npc_andorhal_towerAI(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index a9bf8c6ea8f..d84091e3cc7 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -976,7 +976,7 @@ class npc_meteor_strike_initial : public CreatureScript { npc_meteor_strike_initialAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { + { SetCombatMovement(false); } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 47fb7a86d32..70210844394 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -266,7 +266,7 @@ public: struct npc_guardian_pavilionAI : public ScriptedAI { - npc_guardian_pavilionAI(Creature* creature) : ScriptedAI(creature) + npc_guardian_pavilionAI(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index 90b265e2a65..2fac33760e2 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -274,7 +274,7 @@ public: struct npc_volcanoAI : public ScriptedAI { - npc_volcanoAI(Creature* creature) : ScriptedAI(creature) + npc_volcanoAI(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 8d66e0824b9..c4111f59d65 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -1406,7 +1406,7 @@ class mob_kael_flamestrike : public CreatureScript } struct mob_kael_flamestrikeAI : public ScriptedAI { - mob_kael_flamestrikeAI(Creature* creature) : ScriptedAI(creature) + mob_kael_flamestrikeAI(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index a581a6ee351..ac9b861f584 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -56,7 +56,7 @@ enum PaladinSpells SPELL_PALADIN_DIVINE_SACRIFICE = 64205, SPELL_PALADIN_DIVINE_PURPOSE_PROC = 90174, - + SPELL_PALADIN_GLYPH_OF_SALVATION = 63225, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790, @@ -874,7 +874,7 @@ class spell_pal_templar_s_verdict : public SpellScriptLoader } void ChangeDamage(SpellEffIndex /*effIndex*/) - { + { Unit* caster = GetCaster(); int32 damage = GetHitDamage(); diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp index e29459299f7..93d53bcc30d 100644 --- a/src/server/shared/Logging/AppenderFile.cpp +++ b/src/server/shared/Logging/AppenderFile.cpp @@ -48,7 +48,7 @@ void AppenderFile::_write(LogMessage const& message) snprintf(namebuf, TRINITY_PATH_MAX, filename.c_str(), message.param1.c_str()); logfile = OpenFile(namebuf, mode, backup || exceedMaxSize); } - else if (exceedMaxSize) + else if (exceedMaxSize) logfile = OpenFile(filename, "w", true); if (!logfile) diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 0fc26eae9cd..35d37d97f79 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2674,7 +2674,7 @@ UI.ShowQuestLevelsInDialogs = 0 # Maximum value is 4294967295 (4 gb). Leave blank for no limit. # NOTE: Does not work with dynamic filenames. # Example: 536870912 (512 mb) -# +# Appender.Console=1,3,0 Appender.Server=2,2,0,Server.log,w -- cgit v1.2.3 From 052e47780ef9852665287fe76edd51a5911674b0 Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Wed, 27 Feb 2013 18:22:12 +0100 Subject: Core/ZulGurub: Move mondokir hardcoded spawn in db --- .../2013_02_27_00_world_creature_summon_groups_434.sql | 10 ++++++++++ .../scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp | 16 +++------------- 2 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 sql/updates/world/2013_02_27_00_world_creature_summon_groups_434.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/2013_02_27_00_world_creature_summon_groups_434.sql b/sql/updates/world/2013_02_27_00_world_creature_summon_groups_434.sql new file mode 100644 index 00000000000..4cdd26a83e8 --- /dev/null +++ b/sql/updates/world/2013_02_27_00_world_creature_summon_groups_434.sql @@ -0,0 +1,10 @@ +DELETE FROM `creature_summon_groups` WHERE `summonerId`=52151 AND `groupId`=0; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`) VALUES +(52151, 0, 0, 52156, -12330.3, -1878.41, 127.32, 3.89208, 8, 0), +(52151, 0, 0, 52156, -12351.94, -1861.51, 127.4807, 4.677482, 8, 0), +(52151, 0, 0, 52156, -12326.71, -1904.328, 127.4111, 2.75762, 8, 0), +(52151, 0, 0, 52156, -12347.41, -1917.535, 127.3196, 1.553343, 8, 0), +(52151, 0, 0, 52156, -12378.57, -1861.222, 127.5416, 5.340707, 8, 0), +(52151, 0, 0, 52156, -12397.79, -1887.731, 127.5453, 0.03490658, 8, 0), +(52151, 0, 0, 52156, -12372.36, -1918.844, 127.343, 1.151917, 8, 0), +(52151, 0, 0, 52156, -12391.23, -1905.273, 127.3196, 0.6108652, 8, 0); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 3cc4cf77cb7..116fd18e458 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -94,17 +94,9 @@ enum Misc FACTION_NONE = 1665 }; -// ToDo: Need better respawn support -Position const ChainedSpiritsSpawnPos[8] = +enum SummonGroups { - { -12330.34f, -1878.406f, 127.3196f, 3.892084f }, - { -12351.94f, -1861.51f, 127.4807f, 4.677482f }, - { -12326.71f, -1904.328f, 127.4111f, 2.75762f }, - { -12347.41f, -1917.535f, 127.3196f, 1.553343f }, - { -12378.57f, -1861.222f, 127.5416f, 5.340707f }, - { -12397.79f, -1887.731f, 127.5453f, 0.03490658f }, - { -12372.36f, -1918.844f, 127.343f, 1.151917f }, - { -12391.23f, -1905.273f, 127.3196f, 0.6108652f } + SUMMON_GROUP_CHAINED_SPIRIT = 0 }; class boss_mandokir : public CreatureScript @@ -123,9 +115,7 @@ class boss_mandokir : public CreatureScript _Reset(); - for (uint8 i = 0; i < 8; ++i) - me->SummonCreature(NPC_CHAINED_SPIRIT, ChainedSpiritsSpawnPos[i]); - + me->SummonCreatureGroup(SUMMON_GROUP_CHAINED_SPIRIT); _ohganotSoFast = true; _reanimateOhganCooldown = false; _reviveGUID = 0; -- cgit v1.2.3 From 943610cbca1d18db348a35749863648a814bdfc0 Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 2 Mar 2013 16:41:04 +0000 Subject: Core/Loading: Fix CreatureLoadTemplates and add missing fields to WORLD_SEL_CREATURE_TEMPLATE --- src/server/game/Globals/ObjectMgr.cpp | 44 +++---- src/server/scripts/Commands/cs_reload.cpp | 134 ++++++++++----------- .../Database/Implementation/WorldDatabase.cpp | 2 +- 3 files changed, 88 insertions(+), 92 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 4a59967234f..9a28de30104 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -423,11 +423,11 @@ void ObjectMgr::LoadCreatureTemplates() "dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, " // 44 45 46 47 48 49 50 51 52 53 54 "type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, " - // 55 56 59 60 61 62 63 64 65 66 67 68 69 70 + // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " - // 71 72 73 74 75 76 77 78 79 80 81 82 + // 69 70 71 72 73 74 75 76 77 78 79 80 "InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, " - // 83 84 85 86 87 88 + // 81 82 83 84 85 86 " questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); @@ -506,28 +506,28 @@ void ObjectMgr::LoadCreatureTemplates() for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) creatureTemplate.spells[i] = fields[55 + i].GetUInt32(); - creatureTemplate.PetSpellDataId = fields[65].GetUInt32(); - creatureTemplate.VehicleId = fields[66].GetUInt32(); - creatureTemplate.mingold = fields[67].GetUInt32(); - creatureTemplate.maxgold = fields[68].GetUInt32(); - creatureTemplate.AIName = fields[69].GetString(); - creatureTemplate.MovementType = uint32(fields[70].GetUInt8()); - creatureTemplate.InhabitType = uint32(fields[71].GetUInt8()); - creatureTemplate.HoverHeight = fields[72].GetFloat(); - creatureTemplate.ModHealth = fields[73].GetFloat(); - creatureTemplate.ModMana = fields[74].GetFloat(); - creatureTemplate.ModManaExtra = fields[75].GetFloat(); - creatureTemplate.ModArmor = fields[76].GetFloat(); - creatureTemplate.RacialLeader = fields[77].GetBool(); + creatureTemplate.PetSpellDataId = fields[63].GetUInt32(); + creatureTemplate.VehicleId = fields[64].GetUInt32(); + creatureTemplate.mingold = fields[65].GetUInt32(); + creatureTemplate.maxgold = fields[66].GetUInt32(); + creatureTemplate.AIName = fields[67].GetString(); + creatureTemplate.MovementType = uint32(fields[68].GetUInt8()); + creatureTemplate.InhabitType = uint32(fields[69].GetUInt8()); + creatureTemplate.HoverHeight = fields[70].GetFloat(); + creatureTemplate.ModHealth = fields[71].GetFloat(); + creatureTemplate.ModMana = fields[72].GetFloat(); + creatureTemplate.ModManaExtra = fields[73].GetFloat(); + creatureTemplate.ModArmor = fields[74].GetFloat(); + creatureTemplate.RacialLeader = fields[75].GetBool(); for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - creatureTemplate.questItems[i] = fields[78 + i].GetUInt32(); + creatureTemplate.questItems[i] = fields[76 + i].GetUInt32(); - creatureTemplate.movementId = fields[84].GetUInt32(); - creatureTemplate.RegenHealth = fields[85].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[86].GetUInt32(); - creatureTemplate.flags_extra = fields[87].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[88].GetCString()); + creatureTemplate.movementId = fields[82].GetUInt32(); + creatureTemplate.RegenHealth = fields[83].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[84].GetUInt32(); + creatureTemplate.flags_extra = fields[85].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[86].GetCString()); ++count; } diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 76045a249be..5211568b096 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -429,11 +429,12 @@ public: Field* fields = result->Fetch(); - cInfo->DifficultyEntry[0] = fields[0].GetUInt32(); - cInfo->DifficultyEntry[1] = fields[1].GetUInt32(); - cInfo->DifficultyEntry[2] = fields[2].GetUInt32(); - cInfo->KillCredit[0] = fields[3].GetUInt32(); - cInfo->KillCredit[1] = fields[4].GetUInt32(); + for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i) + cInfo.DifficultyEntry[i] = fields[0 + i].GetUInt32(); + + for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i) + cInfo.KillCredit[i] = fields[3 + i].GetUInt32(); + cInfo->Modelid1 = fields[5].GetUInt32(); cInfo->Modelid2 = fields[6].GetUInt32(); cInfo->Modelid3 = fields[7].GetUInt32(); @@ -445,72 +446,67 @@ public: cInfo->minlevel = fields[13].GetUInt8(); cInfo->maxlevel = fields[14].GetUInt8(); cInfo->expansion = fields[15].GetUInt16(); - cInfo->faction_A = fields[16].GetUInt16(); - cInfo->faction_H = fields[17].GetUInt16(); - cInfo->npcflag = fields[18].GetUInt32(); - cInfo->speed_walk = fields[19].GetFloat(); - cInfo->speed_run = fields[20].GetFloat(); - cInfo->scale = fields[21].GetFloat(); - cInfo->rank = fields[22].GetUInt8(); - cInfo->mindmg = fields[23].GetFloat(); - cInfo->maxdmg = fields[24].GetFloat(); - cInfo->dmgschool = fields[25].GetUInt8(); - cInfo->attackpower = fields[26].GetUInt32(); - cInfo->dmg_multiplier = fields[27].GetFloat(); - cInfo->baseattacktime = fields[28].GetUInt32(); - cInfo->rangeattacktime = fields[29].GetUInt32(); - cInfo->unit_class = fields[30].GetUInt8(); - cInfo->unit_flags = fields[31].GetUInt32(); - cInfo->unit_flags2 = fields[32].GetUInt32(); - cInfo->dynamicflags = fields[33].GetUInt32(); - cInfo->family = fields[34].GetUInt8(); - cInfo->trainer_type = fields[35].GetUInt8(); - cInfo->trainer_class = fields[36].GetUInt8(); - cInfo->trainer_race = fields[37].GetUInt8(); - cInfo->minrangedmg = fields[38].GetFloat(); - cInfo->maxrangedmg = fields[39].GetFloat(); - cInfo->rangedattackpower = fields[40].GetUInt16(); - cInfo->type = fields[41].GetUInt8(); - cInfo->type_flags = fields[42].GetUInt32(); - cInfo->lootid = fields[43].GetUInt32(); - cInfo->pickpocketLootId = fields[44].GetUInt32(); - cInfo->SkinLootId = fields[45].GetUInt32(); + cInfo->expansionUnknown = fields[16].GetUInt16(); + cInfo->faction_A = fields[17].GetUInt16(); + cInfo->faction_H = fields[18].GetUInt16(); + cInfo->npcflag = fields[19].GetUInt32(); + cInfo->speed_walk = fields[20].GetFloat(); + cInfo->speed_run = fields[21].GetFloat(); + cInfo->scale = fields[22].GetFloat(); + cInfo->rank = fields[23].GetUInt8(); + cInfo->mindmg = fields[24].GetFloat(); + cInfo->maxdmg = fields[25].GetFloat(); + cInfo->dmgschool = fields[26].GetUInt8(); + cInfo->attackpower = fields[27].GetUInt32(); + cInfo->dmg_multiplier = fields[28].GetFloat(); + cInfo->baseattacktime = fields[29].GetUInt32(); + cInfo->rangeattacktime = fields[30].GetUInt32(); + cInfo->unit_class = fields[31].GetUInt8(); + cInfo->unit_flags = fields[32].GetUInt32(); + cInfo->unit_flags2 = fields[33].GetUInt32(); + cInfo->dynamicflags = fields[34].GetUInt32(); + cInfo->family = fields[35].GetUInt8(); + cInfo->trainer_type = fields[36].GetUInt8(); + cInfo->trainer_class = fields[37].GetUInt8(); + cInfo->trainer_race = fields[38].GetUInt8(); + cInfo->minrangedmg = fields[39].GetFloat(); + cInfo->maxrangedmg = fields[40].GetFloat(); + cInfo->rangedattackpower = fields[41].GetUInt16(); + cInfo->type = fields[42].GetUInt8(); + cInfo->type_flags = fields[43].GetUInt32(); + cInfo->type_flags2 = fields[44].GetUInt32(); + cInfo->lootid = fields[45].GetUInt32(); + cInfo->pickpocketLootId = fields[46].GetUInt32(); + cInfo->SkinLootId = fields[47].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - cInfo->resistance[i] = fields[46 + i -1].GetUInt16(); - - cInfo->spells[0] = fields[52].GetUInt32(); - cInfo->spells[1] = fields[53].GetUInt32(); - cInfo->spells[2] = fields[54].GetUInt32(); - cInfo->spells[3] = fields[55].GetUInt32(); - cInfo->spells[4] = fields[56].GetUInt32(); - cInfo->spells[5] = fields[57].GetUInt32(); - cInfo->spells[6] = fields[58].GetUInt32(); - cInfo->spells[7] = fields[59].GetUInt32(); - cInfo->PetSpellDataId = fields[60].GetUInt32(); - cInfo->VehicleId = fields[61].GetUInt32(); - cInfo->mingold = fields[62].GetUInt32(); - cInfo->maxgold = fields[63].GetUInt32(); - cInfo->AIName = fields[64].GetString(); - cInfo->MovementType = fields[65].GetUInt8(); - cInfo->InhabitType = fields[66].GetUInt8(); - cInfo->HoverHeight = fields[67].GetFloat(); - cInfo->ModHealth = fields[68].GetFloat(); - cInfo->ModMana = fields[69].GetFloat(); - cInfo->ModManaExtra = fields[70].GetFloat(); - cInfo->ModArmor = fields[71].GetFloat(); - cInfo->RacialLeader = fields[72].GetBool(); - cInfo->questItems[0] = fields[73].GetUInt32(); - cInfo->questItems[1] = fields[74].GetUInt32(); - cInfo->questItems[2] = fields[75].GetUInt32(); - cInfo->questItems[3] = fields[76].GetUInt32(); - cInfo->questItems[4] = fields[77].GetUInt32(); - cInfo->questItems[5] = fields[78].GetUInt32(); - cInfo->movementId = fields[79].GetUInt32(); - cInfo->RegenHealth = fields[80].GetBool(); - cInfo->MechanicImmuneMask = fields[81].GetUInt32(); - cInfo->flags_extra = fields[82].GetUInt32(); - cInfo->ScriptID = sObjectMgr->GetScriptId(fields[83].GetCString()); + cInfo->resistance[i] = fields[48 + i -1].GetUInt16(); + + for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) + cInfo.spells[i] = fields[54 + i].GetUInt32(); + + cInfo->PetSpellDataId = fields[62].GetUInt32(); + cInfo->VehicleId = fields[63].GetUInt32(); + cInfo->mingold = fields[64].GetUInt32(); + cInfo->maxgold = fields[65].GetUInt32(); + cInfo->AIName = fields[66].GetString(); + cInfo->MovementType = fields[67].GetUInt8(); + cInfo->InhabitType = fields[68].GetUInt8(); + cInfo->HoverHeight = fields[69].GetFloat(); + cInfo->ModHealth = fields[70].GetFloat(); + cInfo->ModMana = fields[71].GetFloat(); + cInfo->ModManaExtra = fields[72].GetFloat(); + cInfo->ModArmor = fields[73].GetFloat(); + cInfo->RacialLeader = fields[74].GetBool(); + + for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) + cInfo.questItems[i] = fields[75 + i].GetUInt32(); + + cInfo->movementId = fields[81].GetUInt32(); + cInfo->RegenHealth = fields[82].GetBool(); + cInfo->MechanicImmuneMask = fields[83].GetUInt32(); + cInfo->flags_extra = fields[84].GetUInt32(); + cInfo->ScriptID = sObjectMgr->GetScriptId(fields[85].GetCString()); sObjectMgr->CheckCreatureTemplate(cInfo); } diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index 8466e75bad2..94c01dd6569 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -78,7 +78,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); -- cgit v1.2.3 From 37101c82d3b06431726d15d33439744c756c4664 Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 2 Mar 2013 16:54:19 +0000 Subject: Fix typo introduced in previous commit --- src/server/scripts/Commands/cs_reload.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 5211568b096..cd01711980e 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -430,10 +430,10 @@ public: Field* fields = result->Fetch(); for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i) - cInfo.DifficultyEntry[i] = fields[0 + i].GetUInt32(); + cInfo->DifficultyEntry[i] = fields[0 + i].GetUInt32(); for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i) - cInfo.KillCredit[i] = fields[3 + i].GetUInt32(); + cInfo->KillCredit[i] = fields[3 + i].GetUInt32(); cInfo->Modelid1 = fields[5].GetUInt32(); cInfo->Modelid2 = fields[6].GetUInt32(); @@ -483,7 +483,7 @@ public: cInfo->resistance[i] = fields[48 + i -1].GetUInt16(); for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) - cInfo.spells[i] = fields[54 + i].GetUInt32(); + cInfo->spells[i] = fields[54 + i].GetUInt32(); cInfo->PetSpellDataId = fields[62].GetUInt32(); cInfo->VehicleId = fields[63].GetUInt32(); @@ -500,7 +500,7 @@ public: cInfo->RacialLeader = fields[74].GetBool(); for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - cInfo.questItems[i] = fields[75 + i].GetUInt32(); + cInfo->questItems[i] = fields[75 + i].GetUInt32(); cInfo->movementId = fields[81].GetUInt32(); cInfo->RegenHealth = fields[82].GetBool(); -- cgit v1.2.3 From 5ed840139279fcff2a70a30068766836716bce4c Mon Sep 17 00:00:00 2001 From: Warpten Date: Sun, 3 Mar 2013 09:37:37 +0100 Subject: Spells/Warlock: Fixed Unstable Affliction's backfire damage. --- src/server/scripts/Spells/spell_warlock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 92d8e940a22..e682322f37b 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -997,7 +997,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader void HandleDispel(DispelInfo* dispelInfo) { if (Unit* caster = GetCaster()) - if (AuraEffect const* aurEff = GetEffect(EFFECT_0)) + if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) { int32 damage = aurEff->GetAmount() * 9; // backfire damage and silence -- cgit v1.2.3